-
Notifications
You must be signed in to change notification settings - Fork 0
/
format.js
92 lines (83 loc) · 2.76 KB
/
format.js
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
var fs = require("fs"),
path = require("path"),
sprintf = require("sprintf-js"),
marked = require("marked");
// Config options
var config = JSON.parse(fs.readFileSync("config.json"));
exports.camelCase = /\b((?:[A-Z][a-z]+){2,})(?![^()\[\]]*[)\]])\b/g;
exports.discreteCamelCase = /^((?:[A-Z][a-z]+){2,})(?![^()\[\]]*[)\]])$/g;
// override the link function to provide a class for non-existant pages
var renderer = new marked.Renderer();
renderer.link = function (href, title, text) {
if (marked.options.sanitize) {
try {
var prot = decodeURIComponent(unescape(href))
.replace(/[^\w:]/g, '')
.toLowerCase();
} catch (e) {
return '';
}
if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0) {
return '';
}
}
var out = '<a href="' + href + '"';
if (title) {
out += ' title="' + title + '"';
}
// this statement is the new clause from the marked built-in
if (href.match(exports.discreteCamelCase) && !fs.existsSync(path.join(config.wikiDir, href))) {
out += ' class="redlink"';
}
out += '>' + text + '</a>';
return out;
};
marked.setOptions({
sanitize: true,
gfm: true,
renderer: renderer
});
function makeLinks (match, offset, whole) {
var final = match;
final = sprintf.sprintf("[%s](%s)", final, match);
return final;
}
exports.parsePage = function (content) {
var lexicon = marked.lexer(content);
lexicon.map(function (element) {
if (element.type == "paragraph") {
element.text = element.text.replace(exports.camelCase, makeLinks);
}
});
return this.makeToc(lexicon, config.tocTreshold) + marked.parser(lexicon);
}
exports.getMtime = function(fileName) {
return fs.statSync(fileName).mtime;
}
exports.makeToc = function (lex, treshold) {
var depth = 0;
var initDepth = 0;
var amount = 0;
var html = "<ul id=\"toc\">";
lex.forEach(function (element, index, array) {
if (element.type == "heading") {
if (depth == 0) {
depth = element.depth;
initDepth = element.depth;
}
if (depth > element.depth) {
html += "</ul>";
}
if (depth < element.depth) {
html += "<ul>";
}
depth = element.depth;
amount++;
html += sprintf.sprintf("<li><a href=\"#%s\">%s</a></li>",
element.text.toLowerCase().replace(/[^\w]+/g, '-'), element.text);
}
});
if (depth > initDepth) html += "</ul>";
html += "</ul>";
return amount > treshold ? html : "";
}