Repository navigation
Expand file tree
/
Copy pathmarked.js
More file actions
122 lines (105 loc) · 5.23 KB
/
Copy pathmarked.js
File metadata and controls
122 lines (105 loc) · 5.23 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
110
111
112
113
114
115
116
117
118
119
120
121
122
.pragma library;
function md2html (arg) {
var tmp = ({});
// Make sure text begins and ends with a couple of newlines:
var ret = ('\n\n\n' + (arg || "") + '\n\n\n');
// NEWLINE NORMALIZATION
ret = ret.replace (/\r\n/gmi, '\n'); // replace WIN CRLF with LF
ret = ret.replace (/\r/gmi, '\n'); // replace MAC CR with LF
// isolate PRE tags to not touch their content
var listPre = ret.match (/```\n([^```]+)\n```/gmi);
if (listPre) {
for (var idxPre = 0; idxPre < listPre.length; idxPre++) {
var preKey = '![PRE ' + idxPre + ']';
var preMd = listPre [idxPre];
ret = ret.replace (preMd, preKey);
var preHtml = preMd;
preHtml = preHtml.replace (/&/gi, "&");
preHtml = preHtml.replace (/</gi, "<");
preHtml = preHtml.replace (/>/gi, ">");
preHtml = preHtml.replace (/\t/gmi, ' '); // tab = 4 spaces
preHtml = preHtml.replace (/```\n([^```]+)\n```/gmi, '<pre>$1</pre>'); // ```\ntext\n``` = <pre>text</pre>
tmp [preKey] = preHtml;
}
}
// isolate CODE tags to not touch their content
var listCode = ret.match (/`([^`\n]+)`/gi);
if (listCode) {
for (var idxCode = 0; idxCode < listCode.length; idxCode++) {
var codeKey = '![CODE ' + idxCode + ']';
var codeMd = listCode [idxCode];
ret = ret.replace (codeMd, codeKey);
var codeHtml = codeMd;
codeHtml = codeHtml.replace (/&/gi, "&");
codeHtml = codeHtml.replace (/</gi, "<");
codeHtml = codeHtml.replace (/>/gi, ">");
codeHtml = codeHtml.replace (/`([^`\n]+)`/gi, '<code>$1</code>'); // `text` = <code>text</code>
tmp [codeKey] = codeHtml;
}
}
// isolate AUTO-LINK tags to not ruin urls later
var listLink = ret.match (/<([^>]*)>/gi);
if (listLink) {
for (var idxLink = 0; idxLink < listLink.length; idxLink++) {
var linkKey = '![LINK ' + idxLink + ']';
var linkMd = listLink [idxLink];
ret = ret.replace (linkMd, linkKey);
var linkHtml = linkMd;
linkHtml = linkHtml.replace (/<([^>]*)>/gi, '<a href="$1" target="_new">$1</a>'); // <url> = <a href="url">url</a>
tmp [linkKey] = linkHtml;
}
}
//ret = ret.replace (/!\[LINK ([^\n]+)\]/gmi, '<a href="$1" target="_new">$1</a>'); // ![LINK url] = <a href="url">url</a>
// IMAGE
var listImg = ret.match (/!\[IMG ([^\n]+)\]/gi);
if (listImg) {
for (var idxImg = 0; idxImg < listImg.length; idxImg++) {
var imgKey = '![IMG ' + idxImg + ']';
var imgMd = listImg [idxImg];
ret = ret.replace (imgMd, imgKey);
var imgHtml = imgMd;
imgHtml = imgHtml.replace (/!\[IMG ([^\n]+)\]/gi, '<img src="$1" />'); // ![IMG url] = <img src="url" />
tmp [imgKey] = imgHtml;
}
}
// HTML ENTITY ESCAPING
ret = ret.replace (/&/gi, '&');
ret = ret.replace (/</gi, '<');
ret = ret.replace (/>/gi, '>');
// TODO MARKER
ret = ret.replace (/^!\[TODO\](.*)$/gmi, '<span class="todo">TODO $1</span>'); // ![TODO] XXXX = <span class="todo">TODO XXXXX</span>
// HEADERS
ret = ret.replace (/^######\s*(.+)\s*\n/gmi, '<h6 class="heading">$1</h6>\n');
ret = ret.replace (/^#####\s*(.+)\s*\n/gmi, '<h5 class="heading">$1</h5>\n');
ret = ret.replace (/^####\s*(.+)\s*\n/gmi, '<h4 class="heading">$1</h4>\n');
ret = ret.replace (/^###\s*(.+)\s*\n/gmi, '<h3 class="heading">$1</h3>\n');
ret = ret.replace (/^##\s*(.+)\s*\n/gmi, '<h2 class="heading">$1</h2>\n');
ret = ret.replace (/^#\s*(.+)\s*\n/gmi, '<h1 class="heading">$1</h1>\n');
ret = ret.replace (/^\s*(.+)\s*\n====*\s*\n/gmi, '<div class="title">$1</div>\n'); // text\n==== = TEXT
// EMPHASIS
ret = ret.replace (/([^\w]+)\*\*([^\*\*]+)\*\*([^\w]+)/gi, '$1<strong>$2</strong>$3'); // **text** = <strong>text</strong>
ret = ret.replace (/([^\w]+)__([^__]+)__([^\w]+)/gi, '$1<strong>$2</strong>$3'); // __text__ = <strong>text</strong>
ret = ret.replace (/([^\w]+)\*([^\*]+)\*([^\w]+)/gi, '$1<em>$2</em>$3'); // *text* = <em>text</em>
ret = ret.replace (/([^\w]+)_([^_]+)_([^\w]+)/gi, '$1<em>$2</em>$3'); // _text_ = <em>text</em>
// LIST
ret = ret.replace (/^\s*\*\s*([^\n]+)\n/gmi, '<ul><li>$1</li></ul>');
ret = ret.replace (/^\s*\+\s*([^\n]+)\n/gmi, '<ul><li>$1</li></ul>');
ret = ret.replace (/^\s*\-\s*([^\n]+)\n/gmi, '<ul><li>$1</li></ul>');
ret = ret.replace (/^\s*\d\.\s*([^\n]+)\n/gmi, '<ol><li>$1</li></ol>')
// remove extra consecutive list separators
ret = ret.replace (/<\/ul>\n*<ul>/gmi, '');
ret = ret.replace (/<\/ol>\n*<ol>/gmi, '');
// PARAGRAPH
ret = ret.trim ();
ret = ret.replace (/\n/gmi, '<br />'); // \n = <br />
ret = ret.replace (/\t/gmi, ' '); // tabs = 4 unbreakable spaces
//ret = ret.replace (/\s+/gmi, " "); // remove multiple spaces between words
// TOC PLACEHOLDER
ret = ret.replace (/!\[TOC\]/gmi, '<div id="TOC"></div>');
// put back verbatim contents
for (var key in tmp) {
ret = ret.replace (key, tmp [key]);
}
// RETURN HTML FRAGMENT
return ret;
}