arnaucube
arnaucube/arnaucube.comPublic Self-hosted repository
arnaucube.com/blog/js/drawdown.js
blog/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 *&gt; *([^]*?)(?=(\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(/^ *&gt; */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, '&lt;');
 81    replace(rx_gt, '&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