Merge branch 'master' of git://factorcode.org/git/factor
						commit
						a26fb62831
					
				| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
unportable
 | 
			
		||||
| 
						 | 
				
			
			@ -1,2 +1,2 @@
 | 
			
		|||
Doug Coleman
 | 
			
		||||
Slava Pestov
 | 
			
		||||
Daniel Ehrenberg
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -83,14 +83,15 @@ ERROR: bmp-not-supported n ;
 | 
			
		|||
 | 
			
		||||
:: fixup-color-index ( loading-bitmap -- loading-bitmap )
 | 
			
		||||
    loading-bitmap width>> :> width
 | 
			
		||||
    width 3 * :> width*3
 | 
			
		||||
    loading-bitmap height>> abs :> height
 | 
			
		||||
    loading-bitmap color-index>> length :> color-index-length
 | 
			
		||||
    height 3 * :> height*3
 | 
			
		||||
    color-index-length width height*3 * - height*3 /i :> misaligned
 | 
			
		||||
    misaligned 0 > [
 | 
			
		||||
    color-index-length height /i :> stride
 | 
			
		||||
    color-index-length width*3 height * - height /i :> padding
 | 
			
		||||
    padding 0 > [
 | 
			
		||||
        loading-bitmap [
 | 
			
		||||
            loading-bitmap width>> misaligned + 3 * <sliced-groups>
 | 
			
		||||
            [ 3 misaligned * head* ] map concat
 | 
			
		||||
            stride <sliced-groups>
 | 
			
		||||
            [ width*3 head-slice ] map concat
 | 
			
		||||
        ] change-color-index
 | 
			
		||||
    ] [
 | 
			
		||||
        loading-bitmap
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 4.7 KiB  | 
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 4.9 KiB  | 
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 5.1 KiB  | 
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 5.2 KiB  | 
										
											Binary file not shown.
										
									
								
							| 
						 | 
				
			
			@ -477,26 +477,24 @@ ERROR: unknown-component-order ifd ;
 | 
			
		|||
        [ unknown-component-order ]
 | 
			
		||||
    } case ;
 | 
			
		||||
 | 
			
		||||
: normalize-alpha-data ( seq -- byte-array )
 | 
			
		||||
    ! [ normalize-alpha-data ] change-bitmap
 | 
			
		||||
    B{ } like dup
 | 
			
		||||
    byte-array>float-array
 | 
			
		||||
    4 <sliced-groups>
 | 
			
		||||
    [
 | 
			
		||||
        dup fourth dup 0 = [
 | 
			
		||||
            2drop
 | 
			
		||||
        ] [
 | 
			
		||||
            [ 3 head-slice ] dip '[ _ / ] change-each
 | 
			
		||||
        ] if
 | 
			
		||||
    ] each ;
 | 
			
		||||
 | 
			
		||||
: handle-alpha-data ( ifd -- ifd )
 | 
			
		||||
    dup extra-samples find-tag {
 | 
			
		||||
        { extra-samples-associated-alpha-data [
 | 
			
		||||
            [
 | 
			
		||||
                B{ } like dup
 | 
			
		||||
                byte-array>float-array
 | 
			
		||||
                4 <sliced-groups>
 | 
			
		||||
                [
 | 
			
		||||
                    dup fourth dup 0 = [
 | 
			
		||||
                        2drop
 | 
			
		||||
                    ] [
 | 
			
		||||
                        [ 3 head-slice ] dip '[ _ / ] change-each
 | 
			
		||||
                    ] if
 | 
			
		||||
                ] each
 | 
			
		||||
            ] change-bitmap
 | 
			
		||||
        ] }
 | 
			
		||||
        { extra-samples-unspecified-alpha-data [
 | 
			
		||||
        ] }
 | 
			
		||||
        { extra-samples-unassociated-alpha-data [
 | 
			
		||||
        ] }
 | 
			
		||||
        { extra-samples-associated-alpha-data [ ] }
 | 
			
		||||
        { extra-samples-unspecified-alpha-data [ ] }
 | 
			
		||||
        { extra-samples-unassociated-alpha-data [ ] }
 | 
			
		||||
        [ bad-extra-samples ]
 | 
			
		||||
    } case ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -530,7 +530,7 @@ M: ebnf-non-terminal (transform) ( ast -- parser )
 | 
			
		|||
 | 
			
		||||
: EBNF: 
 | 
			
		||||
  reset-tokenizer CREATE-WORD dup ";EBNF" parse-multiline-string  
 | 
			
		||||
  ebnf>quot swapd 1 1 <effect> define-declared "ebnf-parser" set-word-prop 
 | 
			
		||||
  ebnf>quot swapd (( input -- ast )) define-declared "ebnf-parser" set-word-prop 
 | 
			
		||||
  reset-tokenizer ; parsing
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -107,13 +107,11 @@ C: <box> box
 | 
			
		|||
    transitions>quot ;
 | 
			
		||||
 | 
			
		||||
: states>code ( words dfa -- )
 | 
			
		||||
    [
 | 
			
		||||
        '[
 | 
			
		||||
            dup _ word>quot
 | 
			
		||||
            (( last-match index string -- ? ))
 | 
			
		||||
            define-declared
 | 
			
		||||
        ] each
 | 
			
		||||
    ] with-compilation-unit ;
 | 
			
		||||
    '[
 | 
			
		||||
        dup _ word>quot
 | 
			
		||||
        (( last-match index string -- ? ))
 | 
			
		||||
        define-declared
 | 
			
		||||
    ] each ;
 | 
			
		||||
 | 
			
		||||
: states>words ( dfa -- words dfa )
 | 
			
		||||
    dup transitions>> keys [ gensym ] H{ } map>assoc
 | 
			
		||||
| 
						 | 
				
			
			@ -126,12 +124,9 @@ C: <box> box
 | 
			
		|||
 | 
			
		||||
PRIVATE>
 | 
			
		||||
 | 
			
		||||
: simple-define-temp ( quot effect -- word )
 | 
			
		||||
    [ define-temp ] with-compilation-unit ;
 | 
			
		||||
 | 
			
		||||
: dfa>word ( dfa -- quot )
 | 
			
		||||
    dfa>main-word execution-quot '[ drop [ f ] 2dip @ ]
 | 
			
		||||
    (( start-index string regexp -- i/f )) simple-define-temp ;
 | 
			
		||||
    (( start-index string regexp -- i/f )) define-temp ;
 | 
			
		||||
 | 
			
		||||
: dfa>shortest-word ( dfa -- word )
 | 
			
		||||
    t shortest? [ dfa>word ] with-variable ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,7 @@ USING: accessors combinators kernel kernel.private math sequences
 | 
			
		|||
sequences.private strings sets assocs prettyprint.backend
 | 
			
		||||
prettyprint.custom make lexer namespaces parser arrays fry locals
 | 
			
		||||
regexp.parser splitting sorting regexp.ast regexp.negation
 | 
			
		||||
regexp.compiler words call call.private math.ranges ;
 | 
			
		||||
regexp.compiler compiler.units words call call.private math.ranges ;
 | 
			
		||||
IN: regexp
 | 
			
		||||
 | 
			
		||||
TUPLE: regexp
 | 
			
		||||
| 
						 | 
				
			
			@ -35,7 +35,7 @@ M: lookbehind question>quot ! Returns ( index string -- ? )
 | 
			
		|||
: match-index-from ( i string regexp -- index/f )
 | 
			
		||||
    ! This word is unsafe. It assumes that i is a fixnum
 | 
			
		||||
    ! and that string is a string.
 | 
			
		||||
    dup dfa>> execute-unsafe( index string regexp -- i/f ) ;
 | 
			
		||||
    dup dfa>> execute-unsafe( index string regexp -- i/f ) ; inline
 | 
			
		||||
 | 
			
		||||
GENERIC: end/start ( string regexp -- end start )
 | 
			
		||||
M: regexp end/start drop length 0 ;
 | 
			
		||||
| 
						 | 
				
			
			@ -129,31 +129,28 @@ PRIVATE>
 | 
			
		|||
GENERIC: compile-regexp ( regex -- regexp )
 | 
			
		||||
 | 
			
		||||
: regexp-initial-word ( i string regexp -- i/f )
 | 
			
		||||
    compile-regexp match-index-from ;
 | 
			
		||||
    [ compile-regexp ] with-compilation-unit match-index-from ;
 | 
			
		||||
 | 
			
		||||
: do-compile-regexp ( regexp -- regexp )
 | 
			
		||||
M: regexp compile-regexp ( regexp -- regexp )
 | 
			
		||||
    dup '[
 | 
			
		||||
        dup \ regexp-initial-word =
 | 
			
		||||
        [ drop _ get-ast ast>dfa dfa>word ] when
 | 
			
		||||
    ] change-dfa ;
 | 
			
		||||
 | 
			
		||||
M: regexp compile-regexp ( regexp -- regexp )
 | 
			
		||||
    do-compile-regexp ;
 | 
			
		||||
 | 
			
		||||
M: reverse-regexp compile-regexp ( regexp -- regexp )
 | 
			
		||||
    t backwards? [ do-compile-regexp ] with-variable ;
 | 
			
		||||
    t backwards? [ call-next-method ] with-variable ;
 | 
			
		||||
 | 
			
		||||
DEFER: compile-next-match
 | 
			
		||||
 | 
			
		||||
: next-initial-word ( i string regexp -- i start end string )
 | 
			
		||||
    compile-next-match do-next-match ;
 | 
			
		||||
    [ compile-next-match ] with-compilation-unit do-next-match ;
 | 
			
		||||
 | 
			
		||||
: compile-next-match ( regexp -- regexp )
 | 
			
		||||
    dup '[
 | 
			
		||||
        dup \ next-initial-word = [
 | 
			
		||||
            drop _ [ compile-regexp dfa>> def>> ] [ reverse-regexp? ] bi
 | 
			
		||||
            '[ { array-capacity string regexp } declare _ _ next-match ]
 | 
			
		||||
            (( i string regexp -- i start end string )) simple-define-temp
 | 
			
		||||
            (( i string regexp -- i start end string )) define-temp
 | 
			
		||||
        ] when
 | 
			
		||||
    ] change-next-match ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,7 +8,7 @@ ui.backend ui.clipboards ui.gadgets ui.gadgets.worlds
 | 
			
		|||
ui.backend.cocoa.views core-foundation core-foundation.run-loop
 | 
			
		||||
core-graphics.types threads math.rectangles fry libc
 | 
			
		||||
generalizations alien.c-types cocoa.views
 | 
			
		||||
combinators io.thread locals ;
 | 
			
		||||
combinators io.thread locals call ;
 | 
			
		||||
IN: ui.backend.cocoa
 | 
			
		||||
 | 
			
		||||
TUPLE: handle ;
 | 
			
		||||
| 
						 | 
				
			
			@ -152,7 +152,7 @@ M: cocoa-ui-backend (with-ui)
 | 
			
		|||
    "UI" assert.app [
 | 
			
		||||
        [
 | 
			
		||||
            init-clipboard
 | 
			
		||||
            cocoa-init-hook get call
 | 
			
		||||
            cocoa-init-hook get call( -- )
 | 
			
		||||
            start-ui
 | 
			
		||||
            f io-thread-running? set-global
 | 
			
		||||
            init-thread-timer
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -153,7 +153,7 @@ PRIVATE>
 | 
			
		|||
    "UI update" spawn drop ;
 | 
			
		||||
 | 
			
		||||
: start-ui ( quot -- )
 | 
			
		||||
    call notify-ui-thread start-ui-thread ;
 | 
			
		||||
    call( -- ) notify-ui-thread start-ui-thread ;
 | 
			
		||||
 | 
			
		||||
: restore-windows ( -- )
 | 
			
		||||
    [
 | 
			
		||||
| 
						 | 
				
			
			@ -193,6 +193,6 @@ M: object close-window
 | 
			
		|||
] "ui" add-init-hook
 | 
			
		||||
 | 
			
		||||
: with-ui ( quot -- )
 | 
			
		||||
    ui-running? [ call ] [ '[ init-ui @ ] (with-ui) ] if ;
 | 
			
		||||
    ui-running? [ call( -- ) ] [ '[ init-ui @ ] (with-ui) ] if ;
 | 
			
		||||
 | 
			
		||||
HOOK: beep ui-backend ( -- )
 | 
			
		||||
| 
						 | 
				
			
			@ -1,17 +1,18 @@
 | 
			
		|||
USING: accessors arrays cocoa.dialogs combinators continuations
 | 
			
		||||
fry grouping io.encodings.utf8 io.files io.styles kernel math
 | 
			
		||||
math.parser models models.filter models.history namespaces random
 | 
			
		||||
math.parser models models.arrow models.history namespaces random
 | 
			
		||||
sequences splitting ui ui.gadgets.alerts ui.gadgets.book-extras
 | 
			
		||||
ui.gadgets.books ui.gadgets.buttons ui.gadgets.frames
 | 
			
		||||
ui.gadgets.grids ui.gadgets.labels ui.gadgets.tracks ui.gestures ;
 | 
			
		||||
ui.gadgets.grids ui.gadgets.labels ui.gadgets.tracks ui.gestures
 | 
			
		||||
ui.gadgets.corners ;
 | 
			
		||||
 | 
			
		||||
IN: drills
 | 
			
		||||
SYMBOLS: it startLength ;
 | 
			
		||||
: big ( gadget -- gadget ) { "sans-serif" plain 30 } >>font ;
 | 
			
		||||
: card ( model quot -- button ) <filter> <label-control> big [ next ] <book-btn> ;
 | 
			
		||||
: card ( model quot -- button ) <arrow> <label-control> big [ next ] <book-btn> ;
 | 
			
		||||
: op ( quot str -- gadget ) <label> big swap <book-bevel-btn> ;
 | 
			
		||||
 | 
			
		||||
: show ( model -- gadget ) dup it set-global [ random ] <filter>
 | 
			
		||||
: show ( model -- gadget ) dup it set-global [ random ] <arrow>
 | 
			
		||||
   { [ [ first ] card ]
 | 
			
		||||
   [ [ [ second ] [ drop [ "malformed input" throw ] "Malformed Input" alert ] recover ] card ]
 | 
			
		||||
   [ '[ |<< [ it get [
 | 
			
		||||
| 
						 | 
				
			
			@ -20,8 +21,8 @@ SYMBOLS: it startLength ;
 | 
			
		|||
   ] change-model ] with-return ] "Yes" op ]
 | 
			
		||||
   [ '[ |<< it get _ model-changed ] "No" op ] } cleave
 | 
			
		||||
2array { 1 0 } <track> swap [ 0.5 track-add ] each
 | 
			
		||||
3array <book*> <frame> { 450 175 } >>pref-dim swap @center grid-add
 | 
			
		||||
it get [ length startLength get swap - number>string "/" startLength get number>string 3append ] <filter> <label-control> @bottom grid-add ;
 | 
			
		||||
3array <book*> 3 3 <frame> { 450 175 } >>pref-dim swap @center grid-add
 | 
			
		||||
it get [ length startLength get swap - number>string "/" startLength get number>string 3append ] <arrow> <label-control> @bottom grid-add ;
 | 
			
		||||
 | 
			
		||||
: drill ( -- ) [ 
 | 
			
		||||
   open-panel [
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
unportable
 | 
			
		||||
| 
						 | 
				
			
			@ -1,14 +1,14 @@
 | 
			
		|||
USING: peg.ebnf help.syntax help.markup strings ;
 | 
			
		||||
IN: peg-lexer
 | 
			
		||||
ABOUT: "peg-lexer"
 | 
			
		||||
 | 
			
		||||
HELP: ON-BNF:
 | 
			
		||||
{ $syntax "ON-BNF: word ... ;ON-BNF" }
 | 
			
		||||
{ $description "Creates a parsing word using a parser for lexer control, adding the resulting ast to the stack.  Parser syntax is as in " { $link POSTPONE: EBNF: } } ;
 | 
			
		||||
 | 
			
		||||
HELP: create-bnf
 | 
			
		||||
{ $values { "word" string } { "parser" parser } }
 | 
			
		||||
{ $values { "name" string } { "parser" parser } }
 | 
			
		||||
{ $description "Runtime equivalent of " { $link POSTPONE: ON-BNF: } " also useful with manually constructed parsers." } ;
 | 
			
		||||
 | 
			
		||||
HELP: factor
 | 
			
		||||
{ $values { "input" string } { "ast" "a sequence of tokens" } }
 | 
			
		||||
{ $description "Tokenizer that acts like standard factor lexer, separating tokens by whitespace." } ;
 | 
			
		||||
| 
						 | 
				
			
			@ -1,9 +1,9 @@
 | 
			
		|||
! Copyright (C) 2007, 2008 Slava Pestov.
 | 
			
		||||
! Copyright (C) 2007, 2009 Slava Pestov.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: arrays hashtables help.markup help.stylesheet io
 | 
			
		||||
io.styles kernel math models namespaces sequences ui ui.gadgets
 | 
			
		||||
ui.gadgets.books ui.gadgets.panes ui.gestures ui.pens.gradient
 | 
			
		||||
parser accessors colors ;
 | 
			
		||||
parser accessors colors fry ;
 | 
			
		||||
IN: slides
 | 
			
		||||
 | 
			
		||||
CONSTANT: stylesheet
 | 
			
		||||
| 
						 | 
				
			
			@ -104,4 +104,4 @@ TUPLE: slides < book ;
 | 
			
		|||
} set-gestures
 | 
			
		||||
 | 
			
		||||
: slides-window ( slides -- )
 | 
			
		||||
    [ <slides> "Slides" open-window ] with-ui ;
 | 
			
		||||
    '[ _ <slides> "Slides" open-window ] with-ui ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
USING: accessors ui ui.gadgets ui.gadgets.labels ui.gadgets.buttons ui.gadgets.packs locals sequences io.styles ;
 | 
			
		||||
IN: ui.gadgets.alerts
 | 
			
		||||
:: alert ( quot string -- ) <pile> { 10 10 } >>gap 1 >>align string <label> { "sans-serif" plain 18 } >>font { 200 100 } >>pref-dim add-gadget 
 | 
			
		||||
   "okay" [ close-window ] quot append <bevel-button> add-gadget "" open-window ;
 | 
			
		||||
   "okay" [ close-window ] quot append <border-button> add-gadget "" open-window ;
 | 
			
		||||
| 
						 | 
				
			
			@ -6,6 +6,6 @@ IN: ui.gadgets.book-extras
 | 
			
		|||
: prev ( book -- ) model>> [ 1 - ] change-model ;
 | 
			
		||||
: (book-t) ( quot -- quot ) '[ : owner ( gadget -- book ) parent>> dup book? [ owner ] unless ; owner @ ] ;
 | 
			
		||||
: <book-btn> ( label quot -- button ) (book-t) <button> ;
 | 
			
		||||
: <book-bevel-btn> ( label quot -- button ) (book-t) <bevel-button> ;
 | 
			
		||||
: <book-bevel-btn> ( label quot -- button ) (book-t) <border-button> ;
 | 
			
		||||
: >>> ( label -- button ) [ next ] <book-btn> ;
 | 
			
		||||
: <<< ( label -- button ) [ prev ] <book-btn> ;
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
USING: accessors sequences namespaces ui.render opengl fry ;
 | 
			
		||||
USING: accessors sequences namespaces ui.render opengl fry kernel ;
 | 
			
		||||
IN: ui.utils
 | 
			
		||||
SYMBOLS: width height ;
 | 
			
		||||
: store-dim ( gadget -- ) dim>> [ first width set ] [ second height set ] bi ;
 | 
			
		||||
: with-dim ( gadget quot -- ) '[ _ store-dim @ ] with-scope ;
 | 
			
		||||
: with-w/h ( gadget quot -- ) '[ origin get _ with-translation ] with-dim ;
 | 
			
		||||
: with-dim ( gadget quot -- ) '[ _ store-dim @ ] with-scope ; inline
 | 
			
		||||
: with-w/h ( gadget quot -- ) '[ origin get _ with-translation ] with-dim ; inline
 | 
			
		||||
| 
						 | 
				
			
			@ -5,7 +5,7 @@
 | 
			
		|||
	<t:title><t:label t:name="title" /></t:title>
 | 
			
		||||
 | 
			
		||||
	<div class="description">
 | 
			
		||||
		<t:farkup t:name="parsed" t:parsed="true" />
 | 
			
		||||
		<t:farkup t:name="content" />
 | 
			
		||||
	</div>
 | 
			
		||||
 | 
			
		||||
	<p>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,7 +47,7 @@ article "ARTICLES" {
 | 
			
		|||
 | 
			
		||||
: <article> ( title -- article ) article new swap >>title ;
 | 
			
		||||
 | 
			
		||||
TUPLE: revision id title author date content parsed description ;
 | 
			
		||||
TUPLE: revision id title author date content description ;
 | 
			
		||||
 | 
			
		||||
revision "REVISIONS" {
 | 
			
		||||
    { "id" "ID" INTEGER +db-assigned-id+ }
 | 
			
		||||
| 
						 | 
				
			
			@ -55,7 +55,6 @@ revision "REVISIONS" {
 | 
			
		|||
    { "author" "AUTHOR" { VARCHAR 256 } +not-null+ } ! uid
 | 
			
		||||
    { "date" "DATE" TIMESTAMP +not-null+ }
 | 
			
		||||
    { "content" "CONTENT" TEXT +not-null+ }
 | 
			
		||||
    { "parsed" "PARSED" FACTOR-BLOB +not-null+ } ! Farkup AST
 | 
			
		||||
    { "description" "DESCRIPTION" TEXT }
 | 
			
		||||
} define-persistent
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -72,9 +71,6 @@ M: revision feed-entry-url id>> revision-url ;
 | 
			
		|||
: <revision> ( id -- revision )
 | 
			
		||||
    revision new swap >>id ;
 | 
			
		||||
 | 
			
		||||
: compute-html ( revision -- )
 | 
			
		||||
    dup content>> parse-farkup >>parsed drop ;
 | 
			
		||||
 | 
			
		||||
: validate-title ( -- )
 | 
			
		||||
    { { "title" [ v-one-line ] } } validate-params ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -141,13 +137,12 @@ M: revision feed-entry-url id>> revision-url ;
 | 
			
		|||
    [ title>> ] [ id>> ] bi article boa insert-tuple ;
 | 
			
		||||
 | 
			
		||||
: add-revision ( revision -- )
 | 
			
		||||
    [ compute-html ]
 | 
			
		||||
    [ insert-tuple ]
 | 
			
		||||
    [
 | 
			
		||||
        dup title>> <article> select-tuple
 | 
			
		||||
        [ amend-article ] [ add-article ] if*
 | 
			
		||||
    ]
 | 
			
		||||
    tri ;
 | 
			
		||||
    bi ;
 | 
			
		||||
 | 
			
		||||
: <edit-article-action> ( -- action )
 | 
			
		||||
    <page-action>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue