diff --git a/resources/template.html b/resources/template.html index 2e169414..3f496cb4 100644 --- a/resources/template.html +++ b/resources/template.html @@ -12,9 +12,101 @@ 'use strict'; var placeholder = document.getElementById('placeholder'); + var renderer = new marked.Renderer(); + var toc = []; // Table of contents as a list + + renderer.heading = function (text, level) { + var escapedText = text.toLowerCase().replace(/[^\w]+/g, '-'); + toc.push({ + level: level, + anchor: escapedText, + title: text + }); + return '' + + text + ''; + }; + + var markdownToHtml = function (markdown) { + return marked(markdown, { renderer: renderer }); + } + + var toPerfectToc = function (toc) { + var i; + var curLevel = 1; + var perfToc = []; + for (i in toc) { + var item = toc[i]; + while (item.level > curLevel + 1) { + curLevel += 1; + var tmp = { level: curLevel, + anchor: item.anchor, + title: '[EMPTY]' + }; + perfToc.push(tmp); + } + perfToc.push(item); + curLevel = item.level; + } + return perfToc; + } + + var itemToHtml = function (item) { + return '' + item.title + ''; + } + + var tocToTree = function (toc) { + var i; + var front = '
  • '; + var ending = ['
  • ']; + var curLevel = 1; + for (i in toc) { + var item = toc[i]; + if (item.level == curLevel) { + front += ''; + front += '
  • '; + front += itemToHtml(item); + } else if (item.level > curLevel) { + // assert(item.level - curLevel == 1) + front += ''); + front += '
  • '; + front += itemToHtml(item); + ending.push('
  • '); + curLevel = item.level; + } else { + while (item.level < curLevel) { + var ele = ending.pop(); + front += ele; + if (ele == '') { + curLevel--; + } + } + front += ''; + front += '
  • '; + front += itemToHtml(item); + } + } + while (ending.length > 0) { + front += ending.pop(); + } + front = front.replace("
  • ", ""); + front = ''; + return front; + } + + var addToc = function(html) { + var tocTree = tocToTree(toPerfectToc(toc)); + html = html.replace(/

    \[TOC\]<\/p>/ig, tocTree); + return html; + } var updateText = function(text) { - placeholder.innerHTML = marked(text); + var html = markdownToHtml(text); + placeholder.innerHTML = addToc(html); } new QWebChannel(qt.webChannelTransport,