]> gitweb.factorcode.org Git - factor.git/blobdiff - basis/xml/writer/writer.factor
core, basis, extra: Remove DOS line endings from files.
[factor.git] / basis / xml / writer / writer.factor
index 0243edec6fa6604a1b110d04d2062aa52f53b22e..06c0fcf87d09365812361a38375c4d0114525608 100644 (file)
-! Copyright (C) 2005, 2009 Daniel Ehrenberg\r
-! See http://factorcode.org/license.txt for BSD license.\r
-USING: hashtables kernel math namespaces sequences strings\r
-assocs combinators io io.streams.string accessors\r
-xml.data wrap.strings xml.entities unicode.categories fry ;\r
-IN: xml.writer\r
-\r
-SYMBOL: sensitive-tags\r
-SYMBOL: indenter\r
-"  " indenter set-global\r
-\r
-<PRIVATE\r
-\r
-SYMBOL: xml-pprint?\r
-SYMBOL: indentation\r
-\r
-: sensitive? ( tag -- ? )\r
-    sensitive-tags get swap '[ _ names-match? ] any? ;\r
-\r
-: indent-string ( -- string )\r
-    xml-pprint? get\r
-    [ indentation get indenter get <repetition> "" concat-as ]\r
-    [ "" ] if ;\r
-\r
-: ?indent ( -- )\r
-    xml-pprint? get [ nl indent-string write ] when ;\r
-\r
-: indent ( -- )\r
-    xml-pprint? get [ 1 indentation +@ ] when ;\r
-\r
-: unindent ( -- )\r
-    xml-pprint? get [ -1 indentation +@ ] when ;\r
-\r
-: ?filter-children ( children -- no-whitespace )\r
-    xml-pprint? get [\r
-        [ dup string? [ [ blank? ] trim ] when ] map\r
-        [ "" = ] reject\r
-    ] when ;\r
-\r
-PRIVATE>\r
-\r
-: name>string ( name -- string )\r
-    [ main>> ] [ space>> ] bi [ ":" rot 3append ] unless-empty ;\r
-\r
-: print-name ( name -- )\r
-    name>string write ;\r
-\r
-<PRIVATE\r
-\r
-: write-quoted ( string -- )\r
-    CHAR: " write1 write CHAR: " write1 ;\r
-\r
-: print-attrs ( assoc -- )\r
-    [\r
-        [ bl print-name "=" write ]\r
-        [ escape-quoted-string write-quoted ] bi*\r
-    ] assoc-each ;\r
-\r
-PRIVATE>\r
-\r
-GENERIC: write-xml ( xml -- )\r
-\r
-<PRIVATE\r
-\r
-M: string write-xml\r
-    escape-string xml-pprint? get [\r
-        dup [ blank? ] all?\r
-        [ drop "" ]\r
-        [ nl 80 indent-string wrap-indented-string ] if\r
-    ] when write ;\r
-\r
-: write-tag ( tag -- )\r
-    ?indent CHAR: < write1\r
-    dup print-name attrs>> print-attrs ;\r
-\r
-: write-start-tag ( tag -- )\r
-    write-tag ">" write ;\r
-\r
-M: contained-tag write-xml\r
-    write-tag "/>" write ;\r
-\r
-: write-children ( tag -- )\r
-    indent children>> ?filter-children\r
-    [ write-xml ] each unindent ;\r
-\r
-: write-end-tag ( tag -- )\r
-    ?indent "</" write print-name CHAR: > write1 ;\r
-\r
-M: open-tag write-xml\r
-    xml-pprint? get [\r
-        {\r
-            [ write-start-tag ]\r
-            [ sensitive? not xml-pprint? get and xml-pprint? set ]\r
-            [ write-children ]\r
-            [ write-end-tag ]\r
-        } cleave\r
-    ] dip xml-pprint? set ;\r
-\r
-M: unescaped write-xml\r
-    string>> write ;\r
-\r
-M: comment write-xml\r
-    "<!--" write text>> write "-->" write ;\r
-\r
-: write-decl ( decl name quot: ( decl -- slot ) -- )\r
-    "<!" write swap write bl\r
-    [ name>> write bl ]\r
-    swap '[ @ write ">" write ] bi ; inline\r
-\r
-M: element-decl write-xml\r
-    "ELEMENT" [ content-spec>> ] write-decl ;\r
-\r
-M: attlist-decl write-xml\r
-    "ATTLIST" [ att-defs>> ] write-decl ;\r
-\r
-M: notation-decl write-xml\r
-    "NOTATION" [ id>> ] write-decl ;\r
-\r
-M: entity-decl write-xml\r
-    "<!ENTITY " write\r
-    [ pe?>> [ " % " write ] when ]\r
-    [ name>> write " \"" write ] [\r
-        def>> f xml-pprint?\r
-        [ write-xml ] with-variable\r
-        "\">" write\r
-    ] tri ;\r
-\r
-M: system-id write-xml\r
-    "SYSTEM" write bl system-literal>> write-quoted ;\r
-\r
-M: public-id write-xml\r
-    "PUBLIC" write bl\r
-    [ pubid-literal>> write-quoted bl ]\r
-    [ system-literal>> write-quoted ] bi ;\r
-\r
-: write-internal-subset ( dtd -- )\r
-    [\r
-        "[" write indent\r
-        directives>> [ ?indent write-xml ] each\r
-        unindent ?indent "]" write\r
-    ] when* ;\r
-\r
-M: doctype-decl write-xml\r
-    ?indent "<!DOCTYPE " write\r
-    [ name>> write bl ]\r
-    [ external-id>> [ write-xml bl ] when* ]\r
-    [ internal-subset>> write-internal-subset ">" write ] tri ;\r
-\r
-M: directive write-xml\r
-    "<!" write text>> write CHAR: > write1 nl ;\r
-\r
-M: instruction write-xml\r
-    "<?" write text>> write "?>" write ;\r
-\r
-M: number write-xml\r
-    "Numbers are not allowed in XML" throw ;\r
-\r
-M: sequence write-xml\r
-    [ write-xml ] each ;\r
-\r
-M: prolog write-xml\r
-    "<?xml version=" write\r
-    [ version>> write-quoted ]\r
-    [ drop " encoding=\"UTF-8\"" write ]\r
-    [ standalone>> [ " standalone=\"yes\"" write ] when ] tri\r
-    "?>" write ;\r
-\r
-M: xml write-xml\r
-    {\r
-        [ prolog>> write-xml ]\r
-        [ before>> write-xml ]\r
-        [ body>> write-xml ]\r
-        [ after>> write-xml ]\r
-    } cleave ;\r
-\r
-PRIVATE>\r
-\r
-: xml>string ( xml -- string )\r
-    [ write-xml ] with-string-writer ;\r
-\r
-: pprint-xml ( xml -- )\r
-    [\r
-        sensitive-tags [ [ assure-name ] map ] change\r
-        0 indentation set\r
-        xml-pprint? on\r
-        write-xml\r
-    ] with-scope ;\r
-\r
-: pprint-xml>string ( xml -- string )\r
-    [ pprint-xml ] with-string-writer ;\r
+! Copyright (C) 2005, 2009 Daniel Ehrenberg
+! See http://factorcode.org/license.txt for BSD license.
+USING: hashtables kernel math namespaces sequences strings
+assocs combinators io io.streams.string accessors
+xml.data wrap.strings xml.entities unicode.categories fry ;
+IN: xml.writer
+
+SYMBOL: sensitive-tags
+SYMBOL: indenter
+"  " indenter set-global
+
+<PRIVATE
+
+SYMBOL: xml-pprint?
+SYMBOL: indentation
+
+: sensitive? ( tag -- ? )
+    sensitive-tags get swap '[ _ names-match? ] any? ;
+
+: indent-string ( -- string )
+    xml-pprint? get
+    [ indentation get indenter get <repetition> "" concat-as ]
+    [ "" ] if ;
+
+: ?indent ( -- )
+    xml-pprint? get [ nl indent-string write ] when ;
+
+: indent ( -- )
+    xml-pprint? get [ 1 indentation +@ ] when ;
+
+: unindent ( -- )
+    xml-pprint? get [ -1 indentation +@ ] when ;
+
+: ?filter-children ( children -- no-whitespace )
+    xml-pprint? get [
+        [ dup string? [ [ blank? ] trim ] when ] map
+        [ "" = ] reject
+    ] when ;
+
+PRIVATE>
+
+: name>string ( name -- string )
+    [ main>> ] [ space>> ] bi [ ":" rot 3append ] unless-empty ;
+
+: print-name ( name -- )
+    name>string write ;
+
+<PRIVATE
+
+: write-quoted ( string -- )
+    CHAR: " write1 write CHAR: " write1 ;
+
+: print-attrs ( assoc -- )
+    [
+        [ bl print-name "=" write ]
+        [ escape-quoted-string write-quoted ] bi*
+    ] assoc-each ;
+
+PRIVATE>
+
+GENERIC: write-xml ( xml -- )
+
+<PRIVATE
+
+M: string write-xml
+    escape-string xml-pprint? get [
+        dup [ blank? ] all?
+        [ drop "" ]
+        [ nl 80 indent-string wrap-indented-string ] if
+    ] when write ;
+
+: write-tag ( tag -- )
+    ?indent CHAR: < write1
+    dup print-name attrs>> print-attrs ;
+
+: write-start-tag ( tag -- )
+    write-tag ">" write ;
+
+M: contained-tag write-xml
+    write-tag "/>" write ;
+
+: write-children ( tag -- )
+    indent children>> ?filter-children
+    [ write-xml ] each unindent ;
+
+: write-end-tag ( tag -- )
+    ?indent "</" write print-name CHAR: > write1 ;
+
+M: open-tag write-xml
+    xml-pprint? get [
+        {
+            [ write-start-tag ]
+            [ sensitive? not xml-pprint? get and xml-pprint? set ]
+            [ write-children ]
+            [ write-end-tag ]
+        } cleave
+    ] dip xml-pprint? set ;
+
+M: unescaped write-xml
+    string>> write ;
+
+M: comment write-xml
+    "<!--" write text>> write "-->" write ;
+
+: write-decl ( decl name quot: ( decl -- slot ) -- )
+    "<!" write swap write bl
+    [ name>> write bl ]
+    swap '[ @ write ">" write ] bi ; inline
+
+M: element-decl write-xml
+    "ELEMENT" [ content-spec>> ] write-decl ;
+
+M: attlist-decl write-xml
+    "ATTLIST" [ att-defs>> ] write-decl ;
+
+M: notation-decl write-xml
+    "NOTATION" [ id>> ] write-decl ;
+
+M: entity-decl write-xml
+    "<!ENTITY " write
+    [ pe?>> [ " % " write ] when ]
+    [ name>> write " \"" write ] [
+        def>> f xml-pprint?
+        [ write-xml ] with-variable
+        "\">" write
+    ] tri ;
+
+M: system-id write-xml
+    "SYSTEM" write bl system-literal>> write-quoted ;
+
+M: public-id write-xml
+    "PUBLIC" write bl
+    [ pubid-literal>> write-quoted bl ]
+    [ system-literal>> write-quoted ] bi ;
+
+: write-internal-subset ( dtd -- )
+    [
+        "[" write indent
+        directives>> [ ?indent write-xml ] each
+        unindent ?indent "]" write
+    ] when* ;
+
+M: doctype-decl write-xml
+    ?indent "<!DOCTYPE " write
+    [ name>> write bl ]
+    [ external-id>> [ write-xml bl ] when* ]
+    [ internal-subset>> write-internal-subset ">" write ] tri ;
+
+M: directive write-xml
+    "<!" write text>> write CHAR: > write1 nl ;
+
+M: instruction write-xml
+    "<?" write text>> write "?>" write ;
+
+M: number write-xml
+    "Numbers are not allowed in XML" throw ;
+
+M: sequence write-xml
+    [ write-xml ] each ;
+
+M: prolog write-xml
+    "<?xml version=" write
+    [ version>> write-quoted ]
+    [ drop " encoding=\"UTF-8\"" write ]
+    [ standalone>> [ " standalone=\"yes\"" write ] when ] tri
+    "?>" write ;
+
+M: xml write-xml
+    {
+        [ prolog>> write-xml ]
+        [ before>> write-xml ]
+        [ body>> write-xml ]
+        [ after>> write-xml ]
+    } cleave ;
+
+PRIVATE>
+
+: xml>string ( xml -- string )
+    [ write-xml ] with-string-writer ;
+
+: pprint-xml ( xml -- )
+    [
+        sensitive-tags [ [ assure-name ] map ] change
+        0 indentation set
+        xml-pprint? on
+        write-xml
+    ] with-scope ;
+
+: pprint-xml>string ( xml -- string )
+    [ pprint-xml ] with-string-writer ;