aboutsummaryrefslogtreecommitdiff
path: root/imports/codemirror/mode/css
diff options
context:
space:
mode:
authorValerio Virgillito2012-02-15 17:04:39 -0800
committerValerio Virgillito2012-02-15 17:04:39 -0800
commitfe71cb9aa1700199c0089166ad54fc56eb760644 (patch)
treeb0c7c24b1f45a079e1c09312ca716e3d35aecad4 /imports/codemirror/mode/css
parent747616980cad14f0b65fbcc7f497ed9680a39d29 (diff)
parentd366c0bd1af6471511217ed574083e15059519b5 (diff)
downloadninja-fe71cb9aa1700199c0089166ad54fc56eb760644.tar.gz
Merge branch 'refs/heads/master' into components
Diffstat (limited to 'imports/codemirror/mode/css')
-rwxr-xr-ximports/codemirror/mode/css/css.js124
-rwxr-xr-ximports/codemirror/mode/css/index.html55
2 files changed, 179 insertions, 0 deletions
diff --git a/imports/codemirror/mode/css/css.js b/imports/codemirror/mode/css/css.js
new file mode 100755
index 00000000..45170a3d
--- /dev/null
+++ b/imports/codemirror/mode/css/css.js
@@ -0,0 +1,124 @@
1CodeMirror.defineMode("css", function(config) {
2 var indentUnit = config.indentUnit, type;
3 function ret(style, tp) {type = tp; return style;}
4
5 function tokenBase(stream, state) {
6 var ch = stream.next();
7 if (ch == "@") {stream.eatWhile(/[\w\\\-]/); return ret("meta", stream.current());}
8 else if (ch == "/" && stream.eat("*")) {
9 state.tokenize = tokenCComment;
10 return tokenCComment(stream, state);
11 }
12 else if (ch == "<" && stream.eat("!")) {
13 state.tokenize = tokenSGMLComment;
14 return tokenSGMLComment(stream, state);
15 }
16 else if (ch == "=") ret(null, "compare");
17 else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare");
18 else if (ch == "\"" || ch == "'") {
19 state.tokenize = tokenString(ch);
20 return state.tokenize(stream, state);
21 }
22 else if (ch == "#") {
23 stream.eatWhile(/[\w\\\-]/);
24 return ret("atom", "hash");
25 }
26 else if (ch == "!") {
27 stream.match(/^\s*\w*/);
28 return ret("keyword", "important");
29 }
30 else if (/\d/.test(ch)) {
31 stream.eatWhile(/[\w.%]/);
32 return ret("number", "unit");
33 }
34 else if (/[,.+>*\/]/.test(ch)) {
35 return ret(null, "select-op");
36 }
37 else if (/[;{}:\[\]]/.test(ch)) {
38 return ret(null, ch);
39 }
40 else {
41 stream.eatWhile(/[\w\\\-]/);
42 return ret("variable", "variable");
43 }
44 }
45
46 function tokenCComment(stream, state) {
47 var maybeEnd = false, ch;
48 while ((ch = stream.next()) != null) {
49 if (maybeEnd && ch == "/") {
50 state.tokenize = tokenBase;
51 break;
52 }
53 maybeEnd = (ch == "*");
54 }
55 return ret("comment", "comment");
56 }
57
58 function tokenSGMLComment(stream, state) {
59 var dashes = 0, ch;
60 while ((ch = stream.next()) != null) {
61 if (dashes >= 2 && ch == ">") {
62 state.tokenize = tokenBase;
63 break;
64 }
65 dashes = (ch == "-") ? dashes + 1 : 0;
66 }
67 return ret("comment", "comment");
68 }
69
70 function tokenString(quote) {
71 return function(stream, state) {
72 var escaped = false, ch;
73 while ((ch = stream.next()) != null) {
74 if (ch == quote && !escaped)
75 break;
76 escaped = !escaped && ch == "\\";
77 }
78 if (!escaped) state.tokenize = tokenBase;
79 return ret("string", "string");
80 };
81 }
82
83 return {
84 startState: function(base) {
85 return {tokenize: tokenBase,
86 baseIndent: base || 0,
87 stack: []};
88 },
89
90 token: function(stream, state) {
91 if (stream.eatSpace()) return null;
92 var style = state.tokenize(stream, state);
93
94 var context = state.stack[state.stack.length-1];
95 if (type == "hash" && context == "rule") style = "atom";
96 else if (style == "variable") {
97 if (context == "rule") style = "number";
98 else if (!context || context == "@media{") style = "tag";
99 }
100
101 if (context == "rule" && /^[\{\};]$/.test(type))
102 state.stack.pop();
103 if (type == "{") {
104 if (context == "@media") state.stack[state.stack.length-1] = "@media{";
105 else state.stack.push("{");
106 }
107 else if (type == "}") state.stack.pop();
108 else if (type == "@media") state.stack.push("@media");
109 else if (context == "{" && type != "comment") state.stack.push("rule");
110 return style;
111 },
112
113 indent: function(state, textAfter) {
114 var n = state.stack.length;
115 if (/^\}/.test(textAfter))
116 n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1;
117 return state.baseIndent + n * indentUnit;
118 },
119
120 electricChars: "}"
121 };
122});
123
124CodeMirror.defineMIME("text/css", "css");
diff --git a/imports/codemirror/mode/css/index.html b/imports/codemirror/mode/css/index.html
new file mode 100755
index 00000000..49934346
--- /dev/null
+++ b/imports/codemirror/mode/css/index.html
@@ -0,0 +1,55 @@
1<!doctype html>
2<html>
3 <head>
4 <title>CodeMirror: CSS mode</title>
5 <link rel="stylesheet" href="../../lib/codemirror.css">
6 <script src="../../lib/codemirror.js"></script>
7 <script src="css.js"></script>
8 <style>.CodeMirror {background: #f8f8f8;}</style>
9 <link rel="stylesheet" href="../../doc/docs.css">
10 </head>
11 <body>
12 <h1>CodeMirror: CSS mode</h1>
13 <form><textarea id="code" name="code">
14/* Some example CSS */
15
16@import url("something.css");
17
18body {
19 margin: 0;
20 padding: 3em 6em;
21 font-family: tahoma, arial, sans-serif;
22 color: #000;
23}
24
25#navigation a {
26 font-weight: bold;
27 text-decoration: none !important;
28}
29
30h1 {
31 font-size: 2.5em;
32}
33
34h2 {
35 font-size: 1.7em;
36}
37
38h1:before, h2:before {
39 content: "::";
40}
41
42code {
43 font-family: courier, monospace;
44 font-size: 80%;
45 color: #418A8A;
46}
47</textarea></form>
48 <script>
49 var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
50 </script>
51
52 <p><strong>MIME types defined:</strong> <code>text/css</code>.</p>
53
54 </body>
55</html>