mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 13:59:52 +08:00
188 lines
5.0 KiB
JavaScript
188 lines
5.0 KiB
JavaScript
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);
|
|
});
|
|
|
|
var VMermaidDivClass = 'mermaid-diagram';
|
|
if (typeof VEnableMermaid == 'undefined') {
|
|
VEnableMermaid = false;
|
|
} else if (VEnableMermaid) {
|
|
mermaidAPI.initialize({
|
|
startOnLoad: false
|
|
});
|
|
}
|
|
|
|
if (typeof VEnableMathjax == 'undefined') {
|
|
VEnableMathjax = false;
|
|
}
|
|
|
|
var scrollToAnchor = function(anchor) {
|
|
var anc = document.getElementById(anchor);
|
|
if (anc != null) {
|
|
anc.scrollIntoView();
|
|
}
|
|
};
|
|
|
|
window.onscroll = 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);
|
|
}
|
|
};
|
|
|
|
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();
|
|
};
|
|
|
|
var mermaidParserErr = false;
|
|
var mermaidIdx = 0;
|
|
|
|
mermaidAPI.parseError = function(err, hash) {
|
|
content.setLog("err: " + err);
|
|
mermaidParserErr = true;
|
|
|
|
// Clean the container element, or mermaidAPI won't render the graph with
|
|
// the same id.
|
|
var errGraph = document.getElementById('mermaid-diagram-' + mermaidIdx);
|
|
var parentNode = errGraph.parentElement;
|
|
parentNode.outerHTML = '';
|
|
delete parentNode;
|
|
};
|
|
|
|
// @className, the class name of the mermaid code block, such as 'lang-mermaid'.
|
|
var renderMermaid = function(className) {
|
|
if (!VEnableMermaid) {
|
|
return;
|
|
}
|
|
var codes = document.getElementsByTagName('code');
|
|
mermaidIdx = 0;
|
|
for (var i = 0; i < codes.length; ++i) {
|
|
var code = codes[i];
|
|
if (code.classList.contains(className)) {
|
|
// Mermaid code block.
|
|
mermaidParserErr = false;
|
|
mermaidIdx++;
|
|
try {
|
|
// Do not increment mermaidIdx here.
|
|
var graph = mermaidAPI.render('mermaid-diagram-' + mermaidIdx, code.innerText, function(){});
|
|
} catch (err) {
|
|
content.setLog("err: " + err);
|
|
continue;
|
|
}
|
|
if (mermaidParserErr || typeof graph == "undefined") {
|
|
continue;
|
|
}
|
|
var graphDiv = document.createElement('div');
|
|
graphDiv.classList.add(VMermaidDivClass);
|
|
graphDiv.innerHTML = graph;
|
|
var preNode = code.parentNode;
|
|
preNode.classList.add(VMermaidDivClass);
|
|
preNode.replaceChild(graphDiv, code);
|
|
// replaceChild() will decrease codes.length.
|
|
--i;
|
|
}
|
|
}
|
|
};
|