summaryrefslogtreecommitdiffstats
path: root/packages/gitbook-markdown/lib/page.js
blob: 2cf09411bc1259cbec892f7bfee3242c3d9d8db8 (plain)
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
var _ = require('lodash');
var MarkupIt = require('markup-it');
var gitbookSyntax = require('markup-it/syntaxes/markdown');

var RAW_START = '{% raw %}';
var RAW_END   = '{% endraw %}';
var markdown  = new MarkupIt(gitbookSyntax);

/**
 * Escape a code block's content using raw blocks
 *
 * @param {String}
 * @return {String}
 */
function escape(str) {
    return RAW_START + str + RAW_END;
}


/**
 * Add templating "raw" to code blocks to
 * avoid nunjucks processing their content.
 *
 * @param {String} src
 * @return {String}
 */
function preparePage(src) {
    var levelRaw = 0;
    var content  = markdown.toContent(src, {
        math:     true,
        template: true
    });

    var textMarkdown = markdown.toText(content, {
        annotate: function(state, raw, token) {
            var tokenType = token.getType();

            if (tokenType === MarkupIt.ENTITIES.TEMPLATE) {
                var type = token.getData().get('type');
                var expr = token.getAsPlainText();

                if (type === 'expr') {
                    if (expr === 'raw') {
                        levelRaw = levelRaw + 1;
                    } else if (expr == 'endraw') {
                        levelRaw = 0;
                    }
                }
            }

            if (
                (tokenType === MarkupIt.BLOCKS.CODE || tokenType === MarkupIt.STYLES.CODE)
                && levelRaw === 0
            ) {
                return escape(raw);
            }

            return raw;
        }
    });

    return textMarkdown;
}

module.exports = {
    prepare: preparePage
};