diff --git a/src/resources/hoedown.js b/src/resources/hoedown.js new file mode 100644 index 00000000..2e1ddd2e --- /dev/null +++ b/src/resources/hoedown.js @@ -0,0 +1,41 @@ +var placeholder = document.getElementById('placeholder'); + +var scrollToAnchor = function(anchor) { + var anc = document.getElementById(anchor); + if (anc != null) { + anc.scrollIntoView(); + } +}; + +var updateHtml = function(html) { + placeholder.innerHTML = html; + var codes = document.getElementsByTagName('code'); + for (var i = 0; i < codes.length; ++i) { + if (codes[i].parentElement.tagName.toLowerCase() == 'pre') { + hljs.highlightBlock(codes[i]); + } + } +} + +var onWindowScroll = function() { + var scrollTop = document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset; + var eles = document.querySelectorAll("h1, h2, h3, h4, h5, h6"); + + if (eles.length == 0) { + return; + } + var curIdx = 0; + var biaScrollTop = scrollTop + 50; + for (var i = 0; i < eles.length; ++i) { + if (biaScrollTop >= eles[i].offsetTop) { + curIdx = i; + } else { + break; + } + } + + var curHeader = eles[curIdx].getAttribute("id"); + if (curHeader != null) { + content.setHeader(curHeader); + } +} diff --git a/src/resources/markdown_template.html b/src/resources/markdown_template.html new file mode 100644 index 00000000..f88c7b6b --- /dev/null +++ b/src/resources/markdown_template.html @@ -0,0 +1,19 @@ + + + +
+ + + + + + + + + + + + + diff --git a/src/resources/markdown_template.js b/src/resources/markdown_template.js new file mode 100644 index 00000000..a3a05700 --- /dev/null +++ b/src/resources/markdown_template.js @@ -0,0 +1,96 @@ +var content; +var keyState = 0; + +new QWebChannel(qt.webChannelTransport, + function(channel) { + content = channel.objects.content; + if (typeof updateHtml == "function") { + updateHtml(content.html); + content.htmlChanged.connect(updateHtml); + } + if (typeof updateText == "function") { + content.textChanged.connect(updateText); + content.updateText(); + } + content.requestScrollToAnchor.connect(scrollToAnchor); + }); + +window.onscroll = onWindowScroll; + +document.onkeydown = function(e) { + e = e || window.event; + var key; + var shift; + var ctrl; + if (e.which) { + key = e.which; + } else { + key = e.keyCode; + } + shift = !!e.shiftKey; + ctrl = !!e.ctrlKey; + switch (key) { + case 74: // J + window.scrollBy(0, 100); + keyState = 0; + break; + + case 75: // K + window.scrollBy(0, -100); + keyState = 0; + break; + + case 72: // H + window.scrollBy(-100, 0); + keyState = 0; + break; + + case 76: // L + window.scrollBy(100, 0); + keyState = 0; + break; + + case 71: // G + if (shift) { + var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft || window.pageXOffset; + var scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight; + window.scrollTo(scrollLeft, scrollHeight); + keyState = 0; + break; + } else { + if (keyState == 0) { + keyState = 1; + } else if (keyState == 1) { + keyState = 0; + var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft || window.pageXOffset; + window.scrollTo(scrollLeft, 0); + } + break; + } + return; + + case 85: // U + keyState = 0; + if (ctrl) { + var clientHeight = document.documentElement.clientHeight; + window.scrollBy(0, -clientHeight); + break; + } + return; + + case 68: // D + keyState = 0; + if (ctrl) { + var clientHeight = document.documentElement.clientHeight; + window.scrollBy(0, clientHeight); + break; + } + return; + + default: + content.keyPressEvent(key); + keyState = 0; + return; + } + e.preventDefault(); +} diff --git a/src/resources/marked.js b/src/resources/marked.js new file mode 100644 index 00000000..7a01aa82 --- /dev/null +++ b/src/resources/marked.js @@ -0,0 +1,154 @@ +var placeholder = document.getElementById('placeholder'); +var renderer = new marked.Renderer(); +var toc = []; // Table of contents as a list +var nameCounter = 0; + +renderer.heading = function(text, level) { + // Use number to avoid issues with Chinese + var escapedText = 'toc_' + nameCounter++; + toc.push({ + level: level, + anchor: escapedText, + title: text + }); + return '\[TOC\]<\/p>/ig, '
'); + } else { + return html; + } +}; + +// Handle wrong title levels, such as '#' followed by '###' +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 + ''; +}; + +// Turn a perfect toc to a tree using