diff --git a/basis/state-parser/state-parser.factor b/basis/state-parser/state-parser.factor index 0aec1280de..2550c992b9 100644 --- a/basis/state-parser/state-parser.factor +++ b/basis/state-parser/state-parser.factor @@ -94,7 +94,7 @@ SYMBOL: prolog-data [ call ] keep swap [ drop ] [ next skip-until ] if - ] [ drop ] if ; inline + ] [ drop ] if ; inline recursive : take-until ( quot -- string ) #! Take the substring of a string starting at spot diff --git a/basis/xml/data/.data.factor.swo b/basis/xml/data/.data.factor.swo new file mode 100644 index 0000000000..223c74706e Binary files /dev/null and b/basis/xml/data/.data.factor.swo differ diff --git a/basis/xml/data/data.factor b/basis/xml/data/data.factor index da2e4ccb32..1bab8d0374 100755 --- a/basis/xml/data/data.factor +++ b/basis/xml/data/data.factor @@ -1,25 +1,26 @@ ! Copyright (C) 2005, 2006 Daniel Ehrenberg ! See http://factorcode.org/license.txt for BSD license. USING: kernel sequences sequences.private assocs arrays -delegate.protocols delegate vectors ; +delegate.protocols delegate vectors accessors multiline +macros words quotations combinators ; IN: xml.data -TUPLE: name space tag url ; +TUPLE: name space main url ; C: <name> name : ?= ( object/f object/f -- ? ) 2dup and [ = ] [ 2drop t ] if ; : names-match? ( name1 name2 -- ? ) - [ name-space swap name-space ?= ] 2keep - [ name-url swap name-url ?= ] 2keep - name-tag swap name-tag ?= and and ; + [ [ space>> ] bi@ ?= ] + [ [ url>> ] bi@ ?= ] + [ [ main>> ] bi@ ?= ] 2tri and and ; -: <name-tag> ( string -- name ) +: <simple-name> ( string -- name ) f swap f <name> ; : assure-name ( string/name -- name ) - dup name? [ <name-tag> ] unless ; + dup name? [ <simple-name> ] unless ; TUPLE: opener name attrs ; C: <opener> opener @@ -42,13 +43,11 @@ C: <instruction> instruction TUPLE: prolog version encoding standalone ; C: <prolog> prolog -TUPLE: tag attrs children ; - TUPLE: attrs alist ; C: <attrs> attrs : attr@ ( key alist -- index {key,value} ) - >r assure-name r> attrs-alist + >r assure-name r> alist>> [ first names-match? ] with find ; M: attrs at* @@ -58,12 +57,12 @@ M: attrs set-at 2nip set-second ] [ >r assure-name swap 2array r> - [ attrs-alist ?push ] keep set-attrs-alist + [ alist>> ?push ] keep (>>alist) ] if* ; -M: attrs assoc-size attrs-alist length ; +M: attrs assoc-size alist>> length ; M: attrs new-assoc drop V{ } new-sequence <attrs> ; -M: attrs >alist attrs-alist ; +M: attrs >alist alist>> ; : >attrs ( assoc -- attrs ) dup [ @@ -74,61 +73,71 @@ M: attrs assoc-like drop dup attrs? [ >attrs ] unless ; M: attrs clear-assoc - f swap set-attrs-alist ; + f >>alist drop ; M: attrs delete-at - tuck attr@ drop [ swap attrs-alist delete-nth ] [ drop ] if* ; + tuck attr@ drop [ swap alist>> delete-nth ] [ drop ] if* ; M: attrs clone - attrs-alist clone <attrs> ; + alist>> clone <attrs> ; INSTANCE: attrs assoc +TUPLE: tag name attrs children ; + : <tag> ( name attrs children -- tag ) - >r >r assure-name r> T{ attrs } assoc-like r> - { set-delegate set-tag-attrs set-tag-children } - tag construct ; + [ assure-name ] [ T{ attrs } assoc-like ] [ ] tri* + tag boa ; ! For convenience, tags follow the assoc protocol too (for attrs) CONSULT: assoc-protocol tag tag-attrs ; INSTANCE: tag assoc ! They also follow the sequence protocol (for children) -CONSULT: sequence-protocol tag tag-children ; +CONSULT: sequence-protocol tag children>> ; INSTANCE: tag sequence +CONSULT: name tag name>> ; + M: tag like over tag? [ drop ] [ - [ delegate ] keep tag-attrs + [ name>> ] keep tag-attrs rot dup [ V{ } like ] when <tag> ] if ; +MACRO: clone-slots ( class -- tuple ) + [ + "slots" word-prop + [ reader>> 1quotation [ clone ] compose ] map + [ cleave ] curry + ] [ [ boa ] curry ] bi compose ; + M: tag clone - [ delegate clone ] keep [ tag-attrs clone ] keep - tag-children clone - { set-delegate set-tag-attrs set-tag-children } tag construct ; + tag clone-slots ; -TUPLE: xml prolog before main after ; -: <xml> ( prolog before main after -- xml ) - { set-xml-prolog set-xml-before set-delegate set-xml-after } - xml construct ; +TUPLE: xml prolog before body after ; +C: <xml> xml -CONSULT: sequence-protocol xml delegate ; +CONSULT: sequence-protocol xml body>> ; INSTANCE: xml sequence -CONSULT: assoc-protocol xml delegate ; +CONSULT: assoc-protocol xml body>> ; INSTANCE: xml assoc +CONSULT: tag xml body>> ; + +CONSULT: name xml body>> ; + <PRIVATE : tag>xml ( xml tag -- newxml ) - swap [ dup xml-prolog swap xml-before rot ] keep xml-after <xml> ; + >r [ prolog>> ] [ before>> ] [ after>> ] tri r> + swap <xml> ; : seq>xml ( xml seq -- newxml ) - over delegate like tag>xml ; + over body>> like tag>xml ; PRIVATE> M: xml clone - [ xml-prolog clone ] keep [ xml-before clone ] keep - [ delegate clone ] keep xml-after clone <xml> ; + xml clone-slots ; M: xml like swap dup xml? [ nip ] [ @@ -139,5 +148,5 @@ M: xml like : <contained-tag> ( name attrs -- tag ) f <tag> ; -PREDICATE: contained-tag < tag tag-children not ; -PREDICATE: open-tag < tag tag-children ; +PREDICATE: contained-tag < tag children>> not ; +PREDICATE: open-tag < tag children>> ; diff --git a/basis/xml/tokenize/tokenize.factor b/basis/xml/tokenize/tokenize.factor index b4ff3a4ce9..284f53023d 100644 --- a/basis/xml/tokenize/tokenize.factor +++ b/basis/xml/tokenize/tokenize.factor @@ -2,7 +2,8 @@ ! See http://factorcode.org/license.txt for BSD license. USING: xml.errors xml.data xml.utilities xml.char-classes sets xml.entities kernel state-parser kernel namespaces strings math -math.parser sequences assocs arrays splitting combinators unicode.case ; +math.parser sequences assocs arrays splitting combinators unicode.case +accessors ; IN: xml.tokenize ! XML namespace processing: ns = namespace @@ -14,8 +15,8 @@ SYMBOL: ns-stack ! this should check to make sure URIs are valid [ [ - swap dup name-space "xmlns" = - [ name-tag set ] + swap dup space>> "xmlns" = + [ main>> set ] [ T{ name f "" "xmlns" f } names-match? [ "" set ] [ drop ] if @@ -24,8 +25,8 @@ SYMBOL: ns-stack ] { } make-assoc f like ; : add-ns ( name -- ) - dup name-space dup ns-stack get assoc-stack - [ nip ] [ <nonexist-ns> throw ] if* swap set-name-url ; + dup space>> dup ns-stack get assoc-stack + [ nip ] [ <nonexist-ns> throw ] if* >>url drop ; : push-ns ( hash -- ) ns-stack get push ; diff --git a/basis/xml/utilities/utilities.factor b/basis/xml/utilities/utilities.factor index 209c0b55e9..2acb353bb6 100755 --- a/basis/xml/utilities/utilities.factor +++ b/basis/xml/utilities/utilities.factor @@ -10,13 +10,13 @@ IN: xml.utilities TUPLE: process-missing process tag ; M: process-missing error. "Tag <" write - dup process-missing-tag print-name + dup tag>> print-name "> not implemented on process process " write - process-missing-process name>> print ; + name>> print ; : run-process ( tag word -- ) 2dup "xtable" word-prop - >r dup name-tag r> at* [ 2nip call ] [ + >r dup main>> r> at* [ 2nip call ] [ drop \ process-missing boa throw ] if ; @@ -48,17 +48,18 @@ M: process-missing error. standard-prolog { } rot { } <xml> ; : children>string ( tag -- string ) - tag-children { + children>> { { [ dup empty? ] [ drop "" ] } - { [ dup [ string? not ] contains? ] [ "XML tag unexpectedly contains non-text children" throw ] } + { [ dup [ string? not ] contains? ] + [ "XML tag unexpectedly contains non-text children" throw ] } [ concat ] } cond ; : children-tags ( tag -- sequence ) - tag-children [ tag? ] filter ; + children>> [ tag? ] filter ; : first-child-tag ( tag -- tag ) - tag-children [ tag? ] find nip ; + children>> [ tag? ] find nip ; ! * Accessing part of an XML document ! for tag- words, a start means that it searches all children @@ -91,7 +92,7 @@ M: process-missing error. assure-name [ tag-with-attr? ] 2curry find nip ; : tags-with-attr ( tag attr-value attr-name -- tags-seq ) - tags@ [ tag-with-attr? ] 2curry filter tag-children ; + tags@ [ tag-with-attr? ] 2curry filter children>> ; : deep-tag-with-attr ( tag attr-value attr-name -- matching-tag ) assure-name [ tag-with-attr? ] 2curry deep-find ; @@ -109,8 +110,8 @@ M: process-missing error. names-match? [ "Unexpected XML tag found" throw ] unless ; : insert-children ( children tag -- ) - dup tag-children [ push-all ] - [ >r V{ } like r> set-tag-children ] if ; + dup children>> [ push-all ] + [ swap V{ } like >>children drop ] if ; : insert-child ( child tag -- ) >r 1vector r> insert-children ; diff --git a/basis/xml/writer/writer.factor b/basis/xml/writer/writer.factor index 41e5422830..13f0be431c 100644 --- a/basis/xml/writer/writer.factor +++ b/basis/xml/writer/writer.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2005, 2006 Daniel Ehrenberg ! See http://factorcode.org/license.txt for BSD license. USING: hashtables kernel math namespaces sequences strings -assocs combinators io io.streams.string +assocs combinators io io.streams.string accessors xml.data wrap xml.entities unicode.categories ; IN: xml.writer @@ -38,9 +38,9 @@ SYMBOL: indenter ] when ; : print-name ( name -- ) - dup name-space f like + dup space>> f like [ write CHAR: : write1 ] when* - name-tag write ; + main>> write ; : print-attrs ( assoc -- ) [ @@ -59,7 +59,7 @@ M: string write-item : write-tag ( tag -- ) ?indent CHAR: < write1 - dup print-name tag-attrs print-attrs ; + dup print-name attrs>> print-attrs ; : write-start-tag ( tag -- ) write-tag ">" write ; @@ -68,7 +68,7 @@ M: contained-tag write-item write-tag "/>" write ; : write-children ( tag -- ) - indent tag-children ?filter-children + indent children>> ?filter-children [ write-item ] each unindent ; : write-end-tag ( tag -- ) @@ -85,18 +85,18 @@ M: open-tag write-item r> xml-pprint? set ; M: comment write-item - "<!--" write comment-text write "-->" write ; + "<!--" write text>> write "-->" write ; M: directive write-item - "<!" write directive-text write CHAR: > write1 ; + "<!" write text>> write CHAR: > write1 ; M: instruction write-item - "<?" write instruction-text write "?>" write ; + "<?" write text>> write "?>" write ; : write-prolog ( xml -- ) - "<?xml version=\"" write dup prolog-version write - "\" encoding=\"" write dup prolog-encoding write - prolog-standalone [ "\" standalone=\"yes" write ] when + "<?xml version=\"" write dup version>> write + "\" encoding=\"" write dup encoding>> write + standalone>> [ "\" standalone=\"yes" write ] when "\"?>" write ; : write-chunk ( seq -- ) @@ -104,10 +104,10 @@ M: instruction write-item : write-xml ( xml -- ) { - [ xml-prolog write-prolog ] - [ xml-before write-chunk ] - [ write-item ] - [ xml-after write-chunk ] + [ prolog>> write-prolog ] + [ before>> write-chunk ] + [ body>> write-item ] + [ after>> write-chunk ] } cleave ; : print-xml ( xml -- ) diff --git a/basis/xml/xml.factor b/basis/xml/xml.factor index 4e2ad7a672..6b64aff257 100644 --- a/basis/xml/xml.factor +++ b/basis/xml/xml.factor @@ -38,19 +38,19 @@ M: directive process add-child ; M: contained process - [ contained-name ] keep contained-attrs + [ name>> ] [ attrs>> ] bi <contained-tag> add-child ; M: opener process push-xml ; : check-closer ( name opener -- name opener ) dup [ <unopened> throw ] unless - 2dup opener-name = - [ opener-name swap <mismatched> throw ] unless ; + 2dup name>> = + [ name>> swap <mismatched> throw ] unless ; M: closer process - closer-name pop-xml first2 - >r check-closer opener-attrs r> + name>> pop-xml first2 + >r check-closer attrs>> r> <tag> add-child ; : init-xml-stack ( -- ) @@ -102,10 +102,10 @@ TUPLE: pull-xml scope ; init-parser reset-prolog init-ns-stack text-now? on ] H{ } make-assoc - { set-pull-xml-scope } pull-xml construct ; + pull-xml boa ; : pull-event ( pull -- xml-event/f ) - pull-xml-scope [ + scope>> [ text-now? get [ parse-text f ] [ get-char [ make-tag t ] [ f f ] if ] if text-now? set diff --git a/extra/sequences/lib/lib.factor b/extra/sequences/lib/lib.factor index 9a0b86dbe3..9e984857f6 100755 --- a/extra/sequences/lib/lib.factor +++ b/extra/sequences/lib/lib.factor @@ -193,7 +193,7 @@ USE: continuations [ iterate-step roll [ 3nip ] [ iterate-next (attempt-each-integer) ] if* - ] [ 3drop f ] if-iterate? ; inline + ] [ 3drop f ] if-iterate? ; inline recursive PRIVATE> : attempt-each ( seq quot -- result )