59 lines
1.3 KiB
Factor
59 lines
1.3 KiB
Factor
USING: kernel xml sequences assocs tools.test io arrays namespaces fry
|
|
accessors xml.data xml.traversal xml.writer generic sequences.deep multiline ;
|
|
IN: xml.tests
|
|
|
|
CONSTANT: sub-tag
|
|
T{ name f f "sub" "http://littledan.onigirihouse.com/namespaces/replace" }
|
|
|
|
SYMBOL: ref-table
|
|
|
|
GENERIC: (r-ref) ( xml -- )
|
|
M: tag (r-ref)
|
|
dup sub-tag attr [
|
|
ref-table get at
|
|
>>children drop
|
|
] [ drop ] if* ;
|
|
M: object (r-ref) drop ;
|
|
|
|
: template ( xml -- )
|
|
[ (r-ref) ] deep-each ;
|
|
|
|
! Example
|
|
|
|
STRING: sample-doc
|
|
<html xmlns:f='http://littledan.onigirihouse.com/namespaces/replace'>
|
|
<body>
|
|
<span f:sub='foo'/>
|
|
<div f:sub='bar'/>
|
|
<p f:sub='baz'>paragraph</p>
|
|
</body></html>
|
|
;
|
|
|
|
STRING: expected-result
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<html xmlns:f="http://littledan.onigirihouse.com/namespaces/replace">
|
|
<body>
|
|
<span f:sub="foo">
|
|
foo
|
|
</span>
|
|
<div f:sub="bar">
|
|
blah
|
|
<a/>
|
|
</div>
|
|
<p f:sub="baz"/>
|
|
</body>
|
|
</html>
|
|
;
|
|
|
|
: test-refs ( -- string )
|
|
[
|
|
H{
|
|
{ "foo" { "foo" } }
|
|
{ "bar" { "blah" T{ tag f T{ name f "" "a" "" } T{ attrs } f } } }
|
|
{ "baz" f }
|
|
} ref-table set
|
|
sample-doc string>xml dup template pprint-xml>string
|
|
] with-scope ;
|
|
|
|
expected-result '[ _ ] [ test-refs ] unit-test
|