-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathstackeditRender.js
More file actions
109 lines (92 loc) · 3.28 KB
/
Copy pathstackeditRender.js
File metadata and controls
109 lines (92 loc) · 3.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// Mermaid initialization
var mermaidConfig = {
startOnLoad:true
};
mermaid.initialize(mermaidConfig);
var articleMarkdown = document.getElementById('articleMarkdown');
var articleHTML = document.getElementById('articleHTML');
var stackedit = new Stackedit();
var fileName = "randomfilename";
stackedit.openFile({
name: fileName,
content: {
text: "Type here...."
}
});
stackedit.on('fileChange', (file) => {
articleMarkdown.textContent = file.content.text;
articleHTML.innerHTML = file.content.html;
});
stackedit.on('close', () => {
mermaidRender();
katexRender();
});
// Find, parse and render Mermaid code
function mermaidRender(){
var mermaidElements = articleHTML.getElementsByClassName("language-mermaid");
var mermaidElementsArrLen = mermaidElements.length;
if (mermaidElementsArrLen > 0){
for(var i = mermaidElementsArrLen-1 ; i >= 0; i--){
var currElement = mermaidElements[i];
/* Using 'innerHTML' instead of 'textContent' will parse the
contents of an element as HTML and hence will include HTML escaping.
If Mermaid is invoked on HTML escaped string it will throw 'parseError'.
Therefore, use 'textContent' to get unescaped content. */
var graphDefinition = currElement.textContent;
try{
// Check if mermaid syntax is correct. If yes, then render.
if(mermaid.parse(graphDefinition) === undefined){
var insertSvg = function(svgCode, bindFunctions){
var preTag = currElement.parentElement;
preTag.insertAdjacentHTML('beforebegin', svgCode);
preTag.remove();
};
var graph = mermaid.render(randStrGenerator(5), graphDefinition, insertSvg);
}
}
catch(err){
// Catch mermaid 'parseError'
alert(err.str, '\n', err.hash);
}
}
}
}
// Find, parse and render KaTeX code
function katexRender(){
var katexElements = document.querySelectorAll('span[class^="katex--"]');
var katexElementsArrLen = katexElements.length;
if (katexElementsArrLen > 0){
for(var i = katexElementsArrLen-1 ; i >= 0; i--){
var currElement = katexElements[i];
var katexDefinition = currElement.textContent;
try{
var katexHTML = katex.renderToString(katexDefinition, {displayMode: currElement.className=="katex--display"});
currElement.insertAdjacentHTML('beforebegin', katexHTML);
currElement.remove();
}
catch(err){
// Catch mermaid 'parseError'
alert(err);
}
}
}
}
// Generate random string of certain length
function randStrGenerator(len){
var i;
var generatedStr = '';
for(i = 0; i < len; i++){
generateChar = String.fromCharCode(Math.floor(Math.random() * 26) + 97);
generatedStr += generateChar;
}
return generatedStr;
}
// Edit button event handler
var editArticle = function (){
stackedit.openFile({
name: fileName,
content: {
text: articleMarkdown.textContent
}
});
}