aboutsummaryrefslogtreecommitdiff
path: root/js/codemirror/mode/yaml
diff options
context:
space:
mode:
authorPierre Frisch2011-12-22 07:25:50 -0800
committerValerio Virgillito2012-01-27 11:18:17 -0800
commitb89a7ee8b956c96a1dcee995ea840feddc5d4b27 (patch)
tree0f3136ab0ecdbbbed6a83576581af0a53124d6f1 /js/codemirror/mode/yaml
parent2401f05d1f4b94d45e4568b81fc73e67b969d980 (diff)
downloadninja-b89a7ee8b956c96a1dcee995ea840feddc5d4b27.tar.gz
First commit of Ninja to ninja-internal
Signed-off-by: Valerio Virgillito <rmwh84@motorola.com>
Diffstat (limited to 'js/codemirror/mode/yaml')
-rw-r--r--js/codemirror/mode/yaml/index.html68
-rw-r--r--js/codemirror/mode/yaml/yaml.js95
2 files changed, 163 insertions, 0 deletions
diff --git a/js/codemirror/mode/yaml/index.html b/js/codemirror/mode/yaml/index.html
new file mode 100644
index 00000000..e8d04d18
--- /dev/null
+++ b/js/codemirror/mode/yaml/index.html
@@ -0,0 +1,68 @@
1<!doctype html>
2<html>
3 <head>
4 <title>CodeMirror 2: YAML mode</title>
5 <link rel="stylesheet" href="../../lib/codemirror.css">
6 <script src="../../lib/codemirror.js"></script>
7 <script src="yaml.js"></script>
8 <link rel="stylesheet" href="../../theme/default.css">
9 <style>.CodeMirror { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; }</style>
10 <link rel="stylesheet" href="../../css/docs.css">
11 </head>
12 <body>
13 <h1>CodeMirror 2: YAML mode</h1>
14 <form><textarea id="code" name="code">
15--- # Favorite movies
16- Casablanca
17- North by Northwest
18- The Man Who Wasn't There
19--- # Shopping list
20[milk, pumpkin pie, eggs, juice]
21--- # Indented Blocks, common in YAML data files, use indentation and new lines to separate the key: value pairs
22 name: John Smith
23 age: 33
24--- # Inline Blocks, common in YAML data streams, use commas to separate the key: value pairs between braces
25{name: John Smith, age: 33}
26---
27receipt: Oz-Ware Purchase Invoice
28date: 2007-08-06
29customer:
30 given: Dorothy
31 family: Gale
32
33items:
34 - part_no: A4786
35 descrip: Water Bucket (Filled)
36 price: 1.47
37 quantity: 4
38
39 - part_no: E1628
40 descrip: High Heeled "Ruby" Slippers
41 size: 8
42 price: 100.27
43 quantity: 1
44
45bill-to: &id001
46 street: |
47 123 Tornado Alley
48 Suite 16
49 city: East Centerville
50 state: KS
51
52ship-to: *id001
53
54specialDelivery: >
55 Follow the Yellow Brick
56 Road to the Emerald City.
57 Pay no attention to the
58 man behind the curtain.
59...
60</textarea></form>
61 <script>
62 var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
63 </script>
64
65 <p><strong>MIME types defined:</strong> <code>text/x-yaml</code>.</p>
66
67 </body>
68</html>
diff --git a/js/codemirror/mode/yaml/yaml.js b/js/codemirror/mode/yaml/yaml.js
new file mode 100644
index 00000000..59e2641a
--- /dev/null
+++ b/js/codemirror/mode/yaml/yaml.js
@@ -0,0 +1,95 @@
1CodeMirror.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
95CodeMirror.defineMIME("text/x-yaml", "yaml");