don't escape < in attributes
authorDavid Lichteblau <david@lichteblau.com>
Sun, 23 Mar 2008 18:43:52 +0000 (23 19:43 +0100)
committerDavid Lichteblau <david@radon.(none)>
Sun, 23 Mar 2008 18:43:52 +0000 (23 19:43 +0100)
doc/index.xml
src/parse/unparse.lisp

index ca41e1c..1ed6410 100644 (file)
       </ul>
     </li>
     <li>
-      Fixed serialization of unknown elements.
+      Serialization fixes:
+      <ul>
+       <li>
+         Fixed serialization of unknown elements.
+       </li>
+       <li>
+         Implemented hax:unescaped on sinks.
+       </li>
+       <li>
+         Fixed contents of script and style to be written without
+         escaping by the sink.
+       </li>
+       <li>
+         Don't escape &lt; in attributes.
+       </li>
+      </ul>
     </li>
     <li>
       New argument documentp to serialize-pt.
index 73b3b8c..c8bbcc9 100644 (file)
@@ -89,7 +89,7 @@
        (unless (and att (listp values) (eq (car att) (car values)))
          (%write-rune #/= sink)
          (%write-rune #/\" sink)
-         (unparse-string (hax:attribute-value a) sink)
+         (unparse-attribute-string (hax:attribute-value a) sink)
          (%write-rune #/\" sink))))
     (%write-rune #/> sink)))
 
   (let ((y (sink-ystream sink)))
     (loop for rune across str do (unparse-datachar rune y))))
 
+(defun unparse-attribute-string (str sink)
+  (let ((y (sink-ystream sink)))
+    (loop for rune across str do (unparse-attribute-char rune y))))
+
 (defun unparse-datachar (c ystream)
   (cond ((rune= c #/&) (write-rod '#.(string-rod "&amp;") ystream))
         ((rune= c #/<) (write-rod '#.(string-rod "&lt;") ystream))
         (t
           (write-rune c ystream))))
 
+(defun unparse-attribute-char (c ystream)
+  (cond ((rune= c #/&) (write-rod '#.(string-rod "&amp;") ystream))
+        ((rune= c #/\") (write-rod '#.(string-rod "&quot;") ystream))
+        ((rune= c #/U+000A) (write-rod '#.(string-rod "&#10;") ystream))
+        ((rune= c #/U+000D) (write-rod '#.(string-rod "&#13;") ystream))
+        (t
+          (write-rune c ystream))))
+
 (defun unparse-dtd-string (str sink)
   (let ((y (sink-ystream sink)))
     (loop for rune across str do (unparse-dtd-char rune y))))