aboutsummaryrefslogtreecommitdiff
path: root/imports/codemirror/mode/xml/xml.js
diff options
context:
space:
mode:
Diffstat (limited to 'imports/codemirror/mode/xml/xml.js')
-rw-r--r--[-rwxr-xr-x]imports/codemirror/mode/xml/xml.js35
1 files changed, 25 insertions, 10 deletions
diff --git a/imports/codemirror/mode/xml/xml.js b/imports/codemirror/mode/xml/xml.js
index 71e0e2b0..f467bddc 100755..100644
--- a/imports/codemirror/mode/xml/xml.js
+++ b/imports/codemirror/mode/xml/xml.js
@@ -4,8 +4,9 @@ CodeMirror.defineMode("xml", function(config, parserConfig) {
4 autoSelfClosers: {"br": true, "img": true, "hr": true, "link": true, "input": true, 4 autoSelfClosers: {"br": true, "img": true, "hr": true, "link": true, "input": true,
5 "meta": true, "col": true, "frame": true, "base": true, "area": true}, 5 "meta": true, "col": true, "frame": true, "base": true, "area": true},
6 doNotIndent: {"pre": true}, 6 doNotIndent: {"pre": true},
7 allowUnquoted: true 7 allowUnquoted: true,
8 } : {autoSelfClosers: {}, doNotIndent: {}, allowUnquoted: false}; 8 allowMissing: false
9 } : {autoSelfClosers: {}, doNotIndent: {}, allowUnquoted: false, allowMissing: false};
9 var alignCDATA = parserConfig.alignCDATA; 10 var alignCDATA = parserConfig.alignCDATA;
10 11
11 // Return variables for tokenizers 12 // Return variables for tokenizers
@@ -47,9 +48,17 @@ CodeMirror.defineMode("xml", function(config, parserConfig) {
47 } 48 }
48 } 49 }
49 else if (ch == "&") { 50 else if (ch == "&") {
50 stream.eatWhile(/[^;]/); 51 var ok;
51 stream.eat(";"); 52 if (stream.eat("#")) {
52 return "atom"; 53 if (stream.eat("x")) {
54 ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";");
55 } else {
56 ok = stream.eatWhile(/[\d]/) && stream.eat(";");
57 }
58 } else {
59 ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";");
60 }
61 return ok ? "atom" : "error";
53 } 62 }
54 else { 63 else {
55 stream.eatWhile(/[^&<]/); 64 stream.eatWhile(/[^&<]/);
@@ -181,15 +190,21 @@ CodeMirror.defineMode("xml", function(config, parserConfig) {
181 } 190 }
182 191
183 function attributes(type) { 192 function attributes(type) {
184 if (type == "word") {setStyle = "attribute"; return cont(attributes);} 193 if (type == "word") {setStyle = "attribute"; return cont(attribute, attributes);}
194 if (type == "endTag" || type == "selfcloseTag") return pass();
195 setStyle = "error";
196 return cont(attributes);
197 }
198 function attribute(type) {
185 if (type == "equals") return cont(attvalue, attributes); 199 if (type == "equals") return cont(attvalue, attributes);
186 if (type == "string") {setStyle = "error"; return cont(attributes);} 200 if (!Kludges.allowMissing) setStyle = "error";
187 return pass(); 201 return (type == "endTag" || type == "selfcloseTag") ? pass() : cont();
188 } 202 }
189 function attvalue(type) { 203 function attvalue(type) {
190 if (type == "word" && Kludges.allowUnquoted) {setStyle = "string"; return cont();}
191 if (type == "string") return cont(attvaluemaybe); 204 if (type == "string") return cont(attvaluemaybe);
192 return pass(); 205 if (type == "word" && Kludges.allowUnquoted) {setStyle = "string"; return cont();}
206 setStyle = "error";
207 return (type == "endTag" || type == "selfCloseTag") ? pass() : cont();
193 } 208 }
194 function attvaluemaybe(type) { 209 function attvaluemaybe(type) {
195 if (type == "string") return cont(attvaluemaybe); 210 if (type == "string") return cont(attvaluemaybe);