]> gitweb.factorcode.org Git - factor.git/commitdiff
xml.tokenize: fix cdata parsing problem.
authorJohn Benediktsson <mrjbq7@gmail.com>
Fri, 7 Feb 2014 05:12:57 +0000 (21:12 -0800)
committerJohn Benediktsson <mrjbq7@gmail.com>
Fri, 7 Feb 2014 05:12:57 +0000 (21:12 -0800)
basis/xml/tests/cdata.factor [new file with mode: 0644]
basis/xml/tokenize/tokenize.factor

diff --git a/basis/xml/tests/cdata.factor b/basis/xml/tests/cdata.factor
new file mode 100644 (file)
index 0000000..ab79679
--- /dev/null
@@ -0,0 +1,22 @@
+USING: xml xml.writer tools.test ;
+IN: xml.tests
+
+{
+"""<?xml version="1.0" encoding="UTF-8"?>
+<rss version="2.0">
+  <channel>
+    <item>
+      <description>Python has a n class property in [&amp;#8230;]</description>
+    </item>
+  </channel>
+</rss>"""
+} [
+"""<?xml version="1.0" encoding="UTF-8"?>
+<rss version="2.0">
+  <channel>
+    <item>
+      <description><![CDATA[Python has a n class property in [&#8230;]]]></description>
+    </item>
+  </channel>
+</rss>""" string>xml xml>string
+] unit-test
index a85c48a022731267eea84d001a226ac400f47220..660cbeaf36934c42b66f3dae4293d307613feb64 100644 (file)
@@ -92,10 +92,18 @@ HINTS: next* { spot } ;
 : string-matcher ( str -- quot: ( pos char -- pos ? ) )
     dup length 1 - '[ _ next-matching dup _ > ] ; inline
 
+:: (take-string) ( match spot -- sbuf matched? )
+    10 <sbuf> f [
+        spot char>> [
+            nip over push
+            spot next*
+            dup match tail? dup not
+        ] [ f ] if*
+    ] loop ; inline
+
 : take-string ( match -- string )
-    [ 0 swap string-matcher take-until nip ] keep
-    dupd [ length ] bi@ 1 - - head
-    get-char [ missing-close ] unless next ;
+    [ spot get (take-string) [ missing-close ] unless ]
+    [ dupd [ length ] bi@ - over shorten "" like ] bi ;
 
 : expect ( string -- )
     dup length spot get '[ _ [ char>> ] keep next* ] "" replicate-as