arnaucube.com/blogo-input/js/drawdown.js
blogo-input/js/drawdown.jsRaw
1// Code from the repo: https://github.com/adamvleggett/drawdown
2//
3
4/**
5 * drawdown.js
6 * (c) Adam Leggett
7 */
8
9
10;function markdown(src) {
11
12 var rx_lt = /</g;
13 var rx_gt = />/g;
14 var rx_space = /\t|\r|\uf8ff/g;
15 var rx_escape = /\\([\\\|`*_{}\[\]()#+\-~])/g;
16 var rx_hr = /^([*\-=_] *){3,}$/gm;
17 var rx_blockquote = /\n *> *([^]*?)(?=(\n|$){2})/g;
18 var rx_list = /\n( *)(?:[*\-+]|((\d+)|([a-z])|[A-Z])[.)]) +([^]*?)(?=(\n|$){2})/g;
19 var rx_listjoin = /<\/(ol|ul)>\n\n<\1>/g;
20 var rx_highlight = /(^|[^A-Za-z\d\\])(([*_])|(~)|(\^)|(--)|(\+\+)|`)(\2?)([^<]*?)\2\8(?!\2)(?=\W|_|$)/g;
21 var rx_code = /\n((```|~~~).*\n?([^]*?)\n?\2|(( .*?\n)+))/g;
22 var rx_link = /((!?)\[(.*?)\]\((.*?)( ".*")?\)|\\([\\`*_{}\[\]()#+\-.!~]))/g;
23 var rx_table = /\n(( *\|.*?\| *\n)+)/g;
24 var rx_thead = /^.*\n( *\|( *\:?-+\:?-+\:? *\|)* *\n|)/;
25 var rx_row = /.*\n/g;
26 var rx_cell = /\||(.*?[^\\])\|/g;
27 var rx_heading = /(?=^|>|\n)([>\s]*?)(#{1,6}) (.*?)( #*)? *(?=\n|$)/g;
28 var rx_para = /(?=^|>|\n)\s*\n+([^<]+?)\n+\s*(?=\n|<|$)/g;
29 var rx_stash = /-\d+\uf8ff/g;
30
31 function replace(rex, fn) {
32 src = src.replace(rex, fn);
33 }
34
35 function element(tag, content) {
36 return '<' + tag + '>' + content + '</' + tag + '>';
37 }
38
39 function blockquote(src) {
40 return src.replace(rx_blockquote, function(all, content) {
41 return element('blockquote', blockquote(highlight(content.replace(/^ *> */gm, ''))));
42 });
43 }
44
45 function list(src) {
46 return src.replace(rx_list, function(all, ind, ol, num, low, content) {
47 var entry = element('li', highlight(content.split(
48 RegExp('\n ?' + ind + '(?:(?:\\d+|[a-zA-Z])[.)]|[*\\-+]) +', 'g')).map(list).join('</li><li>')));
49
50 return '\n' + (ol
51 ? '<ol start="' + (num
52 ? ol + '">'
53 : parseInt(ol,36) - 9 + '" style="list-style-type:' + (low ? 'low' : 'upp') + 'er-alpha">') + entry + '</ol>'
54 : element('ul', entry));
55 });
56 }
57
58 function highlight(src) {
59 return src.replace(rx_highlight, function(all, _, p1, emp, sub, sup, small, big, p2, content) {
60 return _ + element(
61 emp ? (p2 ? 'strong' : 'em')
62 : sub ? (p2 ? 's' : 'sub')
63 : sup ? 'sup'
64 : small ? 'small'
65 : big ? 'big'
66 : 'code',
67 highlight(content));
68 });
69 }
70
71 function unesc(str) {
72 return str.replace(rx_escape, '$1');
73 }
74
75 var stash = [];
76 var si = 0;
77
78 src = '\n' + src + '\n';
79
80 replace(rx_lt, '<');
81 replace(rx_gt, '>');
82 replace(rx_space, ' ');
83
84 // blockquote
85 src = blockquote(src);
86
87 // horizontal rule
88 replace(rx_hr, '<hr/>');
89
90 // list
91 src = list(src);
92 replace(rx_listjoin, '');
93
94 // code
95 replace(rx_code, function(all, p1, p2, p3, p4) {
96 stash[--si] = element('pre', element('code', p3||p4.replace(/^ /gm, '')));
97 return si + '\uf8ff';
98 });
99
100 // link or image
101 replace(rx_link, function(all, p1, p2, p3, p4, p5, p6) {
102 stash[--si] = p4
103 ? p2
104 ? '<img src="' + p4 + '" alt="' + p3 + '"/>'
105 : '<a href="' + p4 + '">' + unesc(highlight(p3)) + '</a>'
106 : p6;
107 return si + '\uf8ff';
108 });
109
110 // table
111 replace(rx_table, function(all, table) {
112 var sep = table.match(rx_thead)[1];
113 return '\n' + element('table',
114 table.replace(rx_row, function(row, ri) {
115 return row == sep ? '' : element('tr', row.replace(rx_cell, function(all, cell, ci) {
116 return ci ? element(sep && !ri ? 'th' : 'td', unesc(highlight(cell || ''))) : ''
117 }))
118 })
119 )
120 });
121
122 // heading
123 replace(rx_heading, function(all, _, p1, p2) { return _ + element('h' + p1.length, unesc(highlight(p2))) });
124
125 // paragraph
126 replace(rx_para, function(all, content) { return element('p', unesc(highlight(content))) });
127
128 // stash
129 replace(rx_stash, function(all) { return stash[parseInt(all)] });
130
131 return src.trim();
132};
133