Fix some bugs in xml.utilities and add new unit tests
parent
55bbbd0ff0
commit
1194ce38aa
|
@ -1,6 +1,6 @@
|
|||
! Copyright (C) 2005, 2009 Daniel Ehrenberg
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: xml xml.utilities tools.test xml.data ;
|
||||
USING: xml xml.utilities tools.test xml.data sequences ;
|
||||
IN: xml.utilities.tests
|
||||
|
||||
[ "bar" ] [ "<foo>bar</foo>" string>xml children>string ] unit-test
|
||||
|
@ -12,3 +12,11 @@ IN: xml.utilities.tests
|
|||
XML-NS: foo http://blah.com
|
||||
|
||||
[ T{ name { main "bling" } { url "http://blah.com" } } ] [ "bling" foo ] unit-test
|
||||
|
||||
[ "blah" ] [ "<foo attr='blah'/>" string>xml-chunk "foo" deep-tag-named "attr" attr ] unit-test
|
||||
|
||||
[ { "blah" } ] [ "<foo attr='blah'/>" string>xml-chunk "foo" deep-tags-named [ "attr" attr ] map ] unit-test
|
||||
|
||||
[ "blah" ] [ "<foo attr='blah'/>" string>xml "foo" deep-tag-named "attr" attr ] unit-test
|
||||
|
||||
[ { "blah" } ] [ "<foo attr='blah'/>" string>xml "foo" deep-tags-named [ "attr" attr ] map ] unit-test
|
|
@ -8,8 +8,10 @@ IN: xml.utilities
|
|||
: children>string ( tag -- string )
|
||||
children>> {
|
||||
{ [ dup empty? ] [ drop "" ] }
|
||||
{ [ dup [ string? not ] any? ]
|
||||
[ "XML tag unexpectedly contains non-text children" throw ] }
|
||||
{
|
||||
[ dup [ string? not ] any? ]
|
||||
[ "XML tag unexpectedly contains non-text children" throw ]
|
||||
}
|
||||
[ concat ]
|
||||
} cond ;
|
||||
|
||||
|
@ -22,20 +24,24 @@ IN: xml.utilities
|
|||
: tag-named? ( name elem -- ? )
|
||||
dup tag? [ names-match? ] [ 2drop f ] if ;
|
||||
|
||||
: tags@ ( tag name -- children name )
|
||||
[ { } like ] dip assure-name ;
|
||||
|
||||
: deep-tag-named ( tag name/string -- matching-tag )
|
||||
assure-name '[ _ swap tag-named? ] deep-find ;
|
||||
|
||||
: deep-tags-named ( tag name/string -- tags-seq )
|
||||
tags@ '[ _ swap tag-named? ] deep-filter ;
|
||||
|
||||
: tag-named ( tag name/string -- matching-tag )
|
||||
assure-name swap [ tag-named? ] with find nip ;
|
||||
assure-name '[ _ swap tag-named? ] find nip ;
|
||||
|
||||
: tags-named ( tag name/string -- tags-seq )
|
||||
tags@ swap [ tag-named? ] with filter ;
|
||||
assure-name '[ _ swap tag-named? ] filter { } like ;
|
||||
|
||||
<PRIVATE
|
||||
|
||||
: prepare-deep ( xml name/string -- tag name/string )
|
||||
[ dup xml? [ body>> ] when ] [ assure-name ] bi* ;
|
||||
|
||||
PRIVATE>
|
||||
|
||||
: deep-tag-named ( tag name/string -- matching-tag )
|
||||
prepare-deep '[ _ swap tag-named? ] deep-find ;
|
||||
|
||||
: deep-tags-named ( tag name/string -- tags-seq )
|
||||
prepare-deep '[ _ swap tag-named? ] deep-filter { } like ;
|
||||
|
||||
: tag-with-attr? ( elem attr-value attr-name -- ? )
|
||||
rot dup tag? [ swap attr = ] [ 3drop f ] if ;
|
||||
|
@ -44,13 +50,13 @@ IN: xml.utilities
|
|||
assure-name '[ _ _ tag-with-attr? ] find nip ;
|
||||
|
||||
: tags-with-attr ( tag attr-value attr-name -- tags-seq )
|
||||
tags@ '[ _ _ tag-with-attr? ] filter children>> ;
|
||||
assure-name '[ _ _ tag-with-attr? ] filter children>> ;
|
||||
|
||||
: deep-tag-with-attr ( tag attr-value attr-name -- matching-tag )
|
||||
assure-name '[ _ _ tag-with-attr? ] deep-find ;
|
||||
|
||||
: deep-tags-with-attr ( tag attr-value attr-name -- tags-seq )
|
||||
tags@ '[ _ _ tag-with-attr? ] deep-filter ;
|
||||
assure-name '[ _ _ tag-with-attr? ] deep-filter ;
|
||||
|
||||
: get-id ( tag id -- elem )
|
||||
"id" deep-tag-with-attr ;
|
||||
|
|
Loading…
Reference in New Issue