summaryrefslogtreecommitdiffstats
path: root/packages/gitbook-markdown/lib/annotate_engine.js
blob: 1feea47bcd3b05827977207ba67ca79b01d3e2cb (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
function annotateEngine(src, rules, ruleTypes, ruleMap) {
    var tokens = [];

    while(src) {
        // Pick rule
        var rule = ruleTypes.filter(function(ruleName, idx) {
            var regex = rules[ruleName];
            return regex.exec(src);
        })[0];

        // No matching rules
        if(!rule) {
            throw new Error('No rule found for: ' + src);
        }

        // Use rule to extract block
        var ruleRegex = rules[rule];
        var block = ruleRegex.exec(src);

        // Get rule type
        var type = ruleMap[rule] || rule;

        // Get raw text
        var raw = block[0];

        // Break out here to avoid infinite loops
        if(raw.length === 0) {
            break;
        }

        tokens.push({
            type: ruleMap[rule] || rule,
            raw: raw,
        });

        // Update source
        src = src.substring(raw.length);
    }

    return tokens
}

module.exports = annotateEngine;