1 | var gsub = require('./utils').gsub,
|
2 | yaml = require('js-yaml'),
|
3 | _ = require('underscore');
|
4 |
|
5 |
|
6 |
|
7 |
|
8 | exports.underscores = function (doc) {
|
9 |
|
10 | doc.markdown = gsub(doc.markdown,
|
11 | /(^(?! {4}|\t)\w+_\w+_\w[\w_]*)/, function (match) {
|
12 | var count = 0;
|
13 | for (var i = 0; i < match.length; i++) {
|
14 | if (match[i] == '_') count++;
|
15 | }
|
16 | if (count === 2) {
|
17 | return match.replace(/_/g, '\\_');
|
18 | }
|
19 | return match;
|
20 | }
|
21 | );
|
22 | return doc;
|
23 | };
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 | exports.metadata = function (doc) {
|
35 | var key;
|
36 | var lines = doc.markdown.split('\n');
|
37 | doc.metadata = {};
|
38 |
|
39 | while (lines.length) {
|
40 | var match = /^(\S+):\s+(.*)$/.exec(lines[0]);
|
41 | if (match) {
|
42 | var key = match[1];
|
43 | doc.metadata[key] = match[2];
|
44 | lines.shift();
|
45 | }
|
46 | else {
|
47 | var continued_value = /^\s+(.+)$/.exec(lines[0]);
|
48 |
|
49 | if (/^\s*$/.exec(lines[0])) {
|
50 | lines.shift();
|
51 | }
|
52 | else if (continued_value && key) {
|
53 | doc.metadata[key] += '\n' + continued_value[1];
|
54 | lines.shift();
|
55 | }
|
56 | else break;
|
57 | }
|
58 | }
|
59 | doc.markdown = lines.join('\n');
|
60 | return doc;
|
61 | };
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 |
|
68 | exports.yamlFrontMatter = function (doc) {
|
69 | var m = /^---\n([\s\S]*)---\n*/.exec(doc.markdown);
|
70 | if (m) {
|
71 | doc.metadata = {};
|
72 | doc.metadata = _.extend(doc.metadata, yaml.load(m[1]));
|
73 | doc.markdown = doc.markdown.substr(m[0].length);
|
74 | }
|
75 | return doc;
|
76 | };
|
77 |
|
78 |
|
79 |
|
80 |
|
81 |
|
82 | function escapeHtml(s) {
|
83 | s = ('' + s);
|
84 | s = s.replace(/&/g, '&');
|
85 | s = s.replace(/</g, '<');
|
86 | s = s.replace(/>/g, '>');
|
87 | s = s.replace(/"/g, '"');
|
88 | s = s.replace(/'/g, ''');
|
89 | return s;
|
90 | };
|
91 |
|
92 |
|
93 |
|
94 |
|
95 |
|
96 | exports.fencedCodeBlocks = function (doc) {
|
97 | var re1 = /```([A-Za-z]+)\s*([\s\S]+?)```/;
|
98 | var re2 = /```\s*([\s\S]+?)```/;
|
99 | var block;
|
100 | while (block = re1.exec(doc.markdown) || re2.exec(doc.markdown)) {
|
101 | var pre;
|
102 | if (block.length === 3) {
|
103 |
|
104 | pre = '<pre><code class="' + escapeHtml(block[1]) + '">' +
|
105 | escapeHtml(block[2]) + '</code></pre>';
|
106 | }
|
107 | else {
|
108 |
|
109 | pre = '<pre><code class="no-highlight">' +
|
110 | escapeHtml(block[1]) + '</code></pre>';
|
111 | }
|
112 | doc.markdown = doc.markdown.substr(0, block.index) +
|
113 | pre + doc.markdown.substr(block.index + block[0].length);
|
114 | }
|
115 | return doc;
|
116 | };
|