|
| 1 | +CodeMirror.defineMode("yaml", function() { |
| 2 | + |
| 3 | + var cons = ['true', 'false', 'on', 'off', 'yes', 'no']; |
| 4 | + var keywordRegex = new RegExp("\\b(("+cons.join(")|(")+"))$", 'i'); |
| 5 | + |
| 6 | + return { |
| 7 | + token: function(stream, state) { |
| 8 | + var ch = stream.peek(); |
| 9 | + var esc = state.escaped; |
| 10 | + state.escaped = false; |
| 11 | + /* comments */ |
| 12 | + if (ch == "#") { stream.skipToEnd(); return "comment"; } |
| 13 | + if (state.literal && stream.indentation() > state.keyCol) { |
| 14 | + stream.skipToEnd(); return "string"; |
| 15 | + } else if (state.literal) { state.literal = false; } |
| 16 | + if (stream.sol()) { |
| 17 | + state.keyCol = 0; |
| 18 | + state.pair = false; |
| 19 | + state.pairStart = false; |
| 20 | + /* document start */ |
| 21 | + if(stream.match(/---/)) { return "def"; } |
| 22 | + /* document end */ |
| 23 | + if (stream.match(/\.\.\./)) { return "def"; } |
| 24 | + /* array list item */ |
| 25 | + if (stream.match(/\s*-\s+/)) { return 'meta'; } |
| 26 | + } |
| 27 | + /* pairs (associative arrays) -> key */ |
| 28 | + if (!state.pair && stream.match(/^\s*([a-z0-9\._-])+(?=\s*:)/i)) { |
| 29 | + state.pair = true; |
| 30 | + state.keyCol = stream.indentation(); |
| 31 | + return "atom"; |
| 32 | + } |
| 33 | + if (state.pair && stream.match(/^:\s*/)) { state.pairStart = true; return 'meta'; } |
| 34 | + |
| 35 | + /* inline pairs/lists */ |
| 36 | + if (stream.match(/^(\{|\}|\[|\])/)) { |
| 37 | + if (ch == '{') |
| 38 | + state.inlinePairs++; |
| 39 | + else if (ch == '}') |
| 40 | + state.inlinePairs--; |
| 41 | + else if (ch == '[') |
| 42 | + state.inlineList++; |
| 43 | + else |
| 44 | + state.inlineList--; |
| 45 | + return 'meta'; |
| 46 | + } |
| 47 | + |
| 48 | + /* list seperator */ |
| 49 | + if (state.inlineList > 0 && !esc && ch == ',') { |
| 50 | + stream.next(); |
| 51 | + return 'meta'; |
| 52 | + } |
| 53 | + /* pairs seperator */ |
| 54 | + if (state.inlinePairs > 0 && !esc && ch == ',') { |
| 55 | + state.keyCol = 0; |
| 56 | + state.pair = false; |
| 57 | + state.pairStart = false; |
| 58 | + stream.next(); |
| 59 | + return 'meta'; |
| 60 | + } |
| 61 | + |
| 62 | + /* start of value of a pair */ |
| 63 | + if (state.pairStart) { |
| 64 | + /* block literals */ |
| 65 | + if (stream.match(/^\s*(\||\>)\s*/)) { state.literal = true; return 'meta'; }; |
| 66 | + /* references */ |
| 67 | + if (stream.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i)) { return 'variable-2'; } |
| 68 | + /* numbers */ |
| 69 | + if (state.inlinePairs == 0 && stream.match(/^\s*-?[0-9\.\,]+\s?$/)) { return 'number'; } |
| 70 | + if (state.inlinePairs > 0 && stream.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/)) { return 'number'; } |
| 71 | + /* keywords */ |
| 72 | + if (stream.match(keywordRegex)) { return 'keyword'; } |
| 73 | + } |
| 74 | + |
| 75 | + /* nothing found, continue */ |
| 76 | + state.pairStart = false; |
| 77 | + state.escaped = (ch == '\\'); |
| 78 | + stream.next(); |
| 79 | + return null; |
| 80 | + }, |
| 81 | + startState: function() { |
| 82 | + return { |
| 83 | + pair: false, |
| 84 | + pairStart: false, |
| 85 | + keyCol: 0, |
| 86 | + inlinePairs: 0, |
| 87 | + inlineList: 0, |
| 88 | + literal: false, |
| 89 | + escaped: false |
| 90 | + }; |
| 91 | + } |
| 92 | + }; |
| 93 | +}); |
| 94 | + |
| 95 | +CodeMirror.defineMIME("text/x-yaml", "yaml"); |
0 commit comments