+
+// contents are not html encoded
+var plaintext_elements = {
+ style: 1,
+ script: 1,
+ xmp: 1,
+ iframe: 1,
+ noembed: 1,
+ noframes: 1,
+ plaintext: 1,
+ noscript: 1
+}
+
+// parser deletes a starting newline inside:
+var newline_eating_elements = {
+ pre: 1,
+ textarea: 1,
+ listing: 1
+}
+
+// this does not pretty-print
+function nodes_to_html (tree) {
+ var attr_keys, i, k, n, ret
+ ret = ''
+ for (i = 0; i < tree.length; ++i) {
+ n = tree[i]
+ switch (n.type) {
+ case 'tag':
+ ret += '<' + n.name
+ attr_keys = []
+ for (k in n.attrs) {
+ ret += " " + k
+ if (n.attrs[k].length > 0) {
+ ret += "=\"" + (enc_attr(n.attrs[k])) + "\""
+ }
+ }
+ ret += '>'
+ if (void_elements[n.name] == null) {
+ if (n.children.length) {
+ ret += nodes_to_html(n.children)
+ }
+ ret += "</" + n.name + ">"
+ }
+ break
+ case 'text':
+ if (n.parent != null ? plaintext_elements[n.parent.name] : false) {
+ ret += n.text
+ } else if (n.parent != null ? newline_eating_elements[n.parent.name] && n.text.charAt(0) === "\n" : false) {
+ ret += enc_text("\n" + n.text)
+ } else {
+ ret += enc_text(n.text)
+ }
+ break
+ case 'comment':
+ ret += "<!--" + n.text + "-->" // TODO encode?
+ break
+ case 'doctype':
+ ret += "<!DOCTYPE " + n.name
+ if ((n.public_identifier != null) && n.public_identifier.length > 0) {
+ ret += " \"" + n.public_identifier + "\""
+ }
+ if ((n.system_identifier != null) && n.system_identifier.length > 0) {
+ ret += " \"" + n.system_identifier + "\""
+ }
+ ret += ">"
+ }
+ }
+ return ret
+}
+