diff options
Diffstat (limited to 'js/lib/xml.js')
-rw-r--r-- | js/lib/xml.js | 167 |
1 files changed, 19 insertions, 148 deletions
diff --git a/js/lib/xml.js b/js/lib/xml.js index 7168ffa..e7c71b0 100644 --- a/js/lib/xml.js +++ b/js/lib/xml.js @@ -34,6 +34,10 @@ var renderNodes = function(block) { var indentLevel = 0; var indent = ' '; var grandparent; + var unescapedContents; + var container; + var selfClosing; + var out = function(s) { if (disableTags > 0) { buffer += s.replace(reXMLTag, ''); @@ -60,6 +64,11 @@ var renderNodes = function(block) { while ((event = walker.next())) { entering = event.entering; node = event.node; + container = node.isContainer(); + selfClosing = node.t === 'HorizontalRule' || node.t === 'Hardbreak' || + node.t === 'Softbreak' || node.t === 'Image'; + unescapedContents = node.t === 'Html' || node.t === 'HtmlInline'; + tagname = node.t.toLowerCase(); attrs = []; if (options.sourcepos) { @@ -71,162 +80,24 @@ var renderNodes = function(block) { } } - switch (node.t) { - case 'Text': - out(esc(node.literal)); - break; - - case 'Softbreak': - out(this.softbreak); - break; - - case 'Hardbreak': - out(tag('br', [], true)); + if (entering) { cr(); - break; - - case 'Emph': - out(tag(entering ? 'em' : '/em')); - break; - - case 'Strong': - out(tag(entering ? 'strong' : '/strong')); - break; - - case 'XML': - out(node.literal); - break; - - case 'Link': - if (entering) { - attrs.push(['href', esc(node.destination, true)]); - if (node.title) { - attrs.push(['title', esc(node.title, true)]); - } - out(tag('a', attrs)); - } else { - out(tag('/a')); - } - break; - - case 'Image': - if (entering) { - if (disableTags === 0) { - out('<img src="' + esc(node.destination, true) + - '" alt="'); - } - disableTags += 1; - } else { - disableTags -= 1; - if (disableTags === 0) { - if (node.title) { - out('" title="' + esc(node.title, true)); - } - out('" />'); - } - } - break; - - case 'Code': - out(tag('code') + esc(node.literal) + tag('/code')); - break; - - case 'Document': - if (!entering) { - cr(); - } - break; - - case 'Paragraph': - grandparent = node.parent.parent; - if (grandparent !== null && - grandparent.t === 'List') { - if (grandparent.list_data.tight) { - break; - } - } - if (entering) { - cr(); - out(tag('p', attrs)); - } else { - out(tag('/p')); - } - break; - - case 'BlockQuote': - if (entering) { - cr(); - out(tag('blockquote', attrs)); + out(tag(tagname, attrs, selfClosing)); + if (container) { indentLevel += 1; - } else { - indentLevel -= 1; - cr(); - out(tag('/blockquote')); - } - break; - - case 'ListItem': - if (entering) { - cr(); - out(tag('li', attrs)); - } else { - out(tag('/li')); - } - break; - - case 'List': - tagname = node.list_data.type === 'Bullet' ? 'ul' : 'ol'; - if (entering) { - if (node.list_data.start && node.list_data.start > 1) { - attrs.push(['start', node.list_data.start.toString()]); + } else if (!container && !selfClosing) { + if (node.literal) { + out(unescapedContents ? node.literal : esc(node.literal)); } - cr(); - out(tag(tagname, attrs)); - } else { - cr(); - out(tag('/' + tagname)); - } - break; - - case 'Header': - tagname = 'h' + node.level; - if (entering) { - cr(); - out(tag(tagname, attrs)); - } else { out(tag('/' + tagname)); } - break; - - case 'CodeBlock': - info_words = node.info ? node.info.split(/ +/) : []; - if (info_words.length > 0 && info_words[0].length > 0) { - attrs.push(['class', 'language-' + esc(info_words[0], true)]); - } - cr(); - out(tag('pre') + tag('code', attrs)); - out(esc(node.literal)); - out(tag('/code') + tag('/pre')); - break; - - case 'XMLBlock': - cr(); - out(node.literal); - break; - - case 'HorizontalRule': + } else { + indentLevel -= 1; cr(); - out(tag('hr', attrs, true)); - break; - - - case 'ReferenceDef': - break; - - default: - throw("Unknown node type " + node.t); + out(tag('/' + tagname)); } + } if (options.time) { console.timeEnd("rendering"); } return buffer; |