@@ -28,6 +28,32 @@ pub fn writeHTML(doc: *parser.Document, writer: anytype) !void {
2828 try writer .writeAll ("\n " );
2929}
3030
31+ // Spec: https://www.w3.org/TR/xml/#sec-prolog-dtd
32+ pub fn writeDocType (doc_type : * parser.DocumentType , writer : anytype ) ! void {
33+ try writer .writeAll ("<!DOCTYPE " );
34+ try writer .writeAll (try parser .documentTypeGetName (doc_type ));
35+
36+ const public_id = try parser .documentTypeGetPublicId (doc_type );
37+ const system_id = try parser .documentTypeGetSystemId (doc_type );
38+ if (public_id .len != 0 and system_id .len != 0 ) {
39+ try writer .writeAll (" PUBLIC \" " );
40+ try writeEscapedAttributeValue (writer , public_id );
41+ try writer .writeAll ("\" \" " );
42+ try writeEscapedAttributeValue (writer , system_id );
43+ try writer .writeAll ("\" " );
44+ } else if (public_id .len != 0 ) {
45+ try writer .writeAll (" PUBLIC \" " );
46+ try writeEscapedAttributeValue (writer , public_id );
47+ try writer .writeAll ("\" " );
48+ } else if (system_id .len != 0 ) {
49+ try writer .writeAll (" SYSTEM \" " );
50+ try writeEscapedAttributeValue (writer , system_id );
51+ try writer .writeAll ("\" " );
52+ }
53+ // Internal subset is not implemented
54+ try writer .writeAll (">" );
55+ }
56+
3157pub fn writeNode (node : * parser.Node , writer : anytype ) anyerror ! void {
3258 switch (try parser .nodeType (node )) {
3359 .element = > {
@@ -88,7 +114,7 @@ pub fn writeNode(node: *parser.Node, writer: anytype) anyerror!void {
88114 .document_fragment = > return ,
89115 // document will never be called, but required for completeness.
90116 .document = > return ,
91- // done globally instead, but required for completeness.
117+ // done globally instead, but required for completeness. Only the outer DOCTYPE should be written
92118 .document_type = > return ,
93119 // deprecated
94120 .attribute = > return ,
0 commit comments