From c33dd1105b8e652cff1f6a32a8a569da21065613 Mon Sep 17 00:00:00 2001 From: Daniel Ehrenberg Date: Sun, 25 Jan 2009 23:52:25 -0600 Subject: [PATCH] XML fry --- basis/xml/elements/elements.factor | 8 +-- .../xml/interpolate/interpolate-tests.factor | 23 +++++++-- basis/xml/interpolate/interpolate.factor | 49 +++++++++++++------ 3 files changed, 58 insertions(+), 22 deletions(-) diff --git a/basis/xml/elements/elements.factor b/basis/xml/elements/elements.factor index 40ca0fd32e..b2280bacb4 100644 --- a/basis/xml/elements/elements.factor +++ b/basis/xml/elements/elements.factor @@ -8,9 +8,11 @@ IN: xml.elements : take-interpolated ( quot -- interpolated ) interpolating? get [ - drop pass-blank - " \t\r\n-" take-to - pass-blank "->" expect + drop get-char CHAR: > = + [ next f ] [ + pass-blank " \t\r\n-" take-to + pass-blank "->" expect + ] if ] [ call ] if ; inline : interpolate-quote ( -- interpolated ) diff --git a/basis/xml/interpolate/interpolate-tests.factor b/basis/xml/interpolate/interpolate-tests.factor index 6db97268b9..48f76b8746 100644 --- a/basis/xml/interpolate/interpolate-tests.factor +++ b/basis/xml/interpolate/interpolate-tests.factor @@ -2,11 +2,11 @@ ! See http://factorcode.org/license.txt for BSD license. USING: tools.test xml.interpolate multiline kernel assocs sequences accessors xml.writer xml.interpolate.private -locals ; +locals splitting ; IN: xml.interpolate.tests -[ "a" "c" { "a" "c" } ] [ - "<-a->/>" +[ "a" "c" { "a" "c" f } ] [ + "<-a->/><->" interpolated-doc [ second var>> ] [ fourth "val" swap at var>> ] @@ -27,3 +27,20 @@ IN: xml.interpolate.tests XML> pprint-xml>string ] ] unit-test + +[ {" + + + one + + + two + + + three + +"} ] [ + "one two three" " " split + [ [XML <-> XML] ] map + <-> XML> pprint-xml>string +] unit-test diff --git a/basis/xml/interpolate/interpolate.factor b/basis/xml/interpolate/interpolate.factor index cc5233f829..7b041ec53d 100644 --- a/basis/xml/interpolate/interpolate.factor +++ b/basis/xml/interpolate/interpolate.factor @@ -2,7 +2,8 @@ ! See http://factorcode.org/license.txt for BSD license. USING: xml xml.state kernel sequences fry assocs xml.data accessors strings make multiline parser namespaces macros -sequences.deep ; +sequences.deep generalizations locals words combinators +math ; IN: xml.interpolate > values + [ interpolated? ] filter + swap each ; +M: object (each-interpolated) 2drop ; + +: each-interpolated ( xml quot -- ) + '[ _ (each-interpolated) ] deep-each ; inline + +:: number<-> ( doc -- doc ) + 0 :> n! doc [ + dup var>> [ n >>var n 1+ n! ] unless drop + ] each-interpolated doc ; + MACRO: interpolate-xml ( string -- doc ) - interpolated-doc '[ _ interpolate-xml-doc ] ; + interpolated-doc number<-> '[ _ interpolate-xml-doc ] ; MACRO: interpolate-chunk ( string -- chunk ) - interpolated-chunk '[ _ interpolate-sequence ] ; + interpolated-chunk number<-> '[ _ interpolate-sequence ] ; : >search-hash ( seq -- hash ) [ dup search ] H{ } map>assoc ; -GENERIC: extract-item ( item -- ) -M: interpolated extract-item var>> , ; -M: tag extract-item - attrs>> values - [ interpolated? ] filter - [ var>> , ] each ; -M: object extract-item drop ; - : extract-variables ( xml -- seq ) - [ [ extract-item ] deep-each ] { } make ; + [ [ var>> , ] each-interpolated ] { } make ; + +: collect ( accum seq -- accum ) + { + { [ dup [ ] all? ] [ >search-hash parsed ] } ! locals + { [ dup [ not ] all? ] [ ! fry + length parsed \ narray parsed \ parsed + ] } + [ drop "XML interpolation contains both fry and locals" throw ] ! mixed + } cond ; : parse-def ( accum delimiter word -- accum ) [ - parse-multiline-string [ - interpolated-chunk extract-variables - >search-hash parsed - ] keep parsed + parse-multiline-string + [ interpolated-chunk extract-variables collect ] keep + parsed ] dip parsed ; PRIVATE>