db fixes
[scannr.git] / js / flotr2 / examples / lib / codemirror / mode / yaml / yaml.js
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
CodeMirror.defineMode("yaml", function() {
        
        var cons = ['true', 'false', 'on', 'off', 'yes', 'no'];
        var keywordRegex = new RegExp("\\b(("+cons.join(")|(")+"))$", 'i');
        
        return {
                token: function(stream, state) {
                        var ch = stream.peek();
                        var esc = state.escaped;
                        state.escaped = false;
                        /* comments */
                        if (ch == "#") { stream.skipToEnd(); return "comment"; }
                        if (state.literal && stream.indentation() > state.keyCol) {
                                stream.skipToEnd(); return "string";
                        } else if (state.literal) { state.literal = false; }
                        if (stream.sol()) {
                                state.keyCol = 0;
                                state.pair = false;
                                state.pairStart = false;
                                /* document start */
                                if(stream.match(/---/)) { return "def"; }
                                /* document end */
                                if (stream.match(/\.\.\./)) { return "def"; }
                                /* array list item */
                                if (stream.match(/\s*-\s+/)) { return 'meta'; }
                        }
                        /* pairs (associative arrays) -> key */
                        if (!state.pair && stream.match(/^\s*([a-z0-9\._-])+(?=\s*:)/i)) {
                                state.pair = true;
                                state.keyCol = stream.indentation();
                                return "atom";
                        }
                        if (state.pair && stream.match(/^:\s*/)) { state.pairStart = true; return 'meta'; }
                        
                        /* inline pairs/lists */
                        if (stream.match(/^(\{|\}|\[|\])/)) {
                                if (ch == '{')
                                        state.inlinePairs++;
                                else if (ch == '}')
                                        state.inlinePairs--;
                                else if (ch == '[')
                                        state.inlineList++;
                                else
                                        state.inlineList--;
                                return 'meta';
                        }
                        
                        /* list seperator */
                        if (state.inlineList > 0 && !esc && ch == ',') {
                                stream.next();
                                return 'meta';
                        }
                        /* pairs seperator */
                        if (state.inlinePairs > 0 && !esc && ch == ',') {
                                state.keyCol = 0;
                                state.pair = false;
                                state.pairStart = false;
                                stream.next();
                                return 'meta';
                        }
                        
                        /* start of value of a pair */
                        if (state.pairStart) {
                                /* block literals */
                                if (stream.match(/^\s*(\||\>)\s*/)) { state.literal = true; return 'meta'; };
                                /* references */
                                if (stream.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i)) { return 'variable-2'; }
                                /* numbers */
                                if (state.inlinePairs == 0 && stream.match(/^\s*-?[0-9\.\,]+\s?$/)) { return 'number'; }
                                if (state.inlinePairs > 0 && stream.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/)) { return 'number'; }
                                /* keywords */
                                if (stream.match(keywordRegex)) { return 'keyword'; }
                        }
 
                        /* nothing found, continue */
                        state.pairStart = false;
                        state.escaped = (ch == '\\');
                        stream.next();
                        return null;
                },
                startState: function() {
                        return {
                                pair: false,
                                pairStart: false,
                                keyCol: 0,
                                inlinePairs: 0,
                                inlineList: 0,
                                literal: false,
                                escaped: false
                        };
                }
        };
});
 
CodeMirror.defineMIME("text/x-yaml", "yaml");