vendor/assets/javascripts/codemirror/modes/xml.js in codemirror-rails-0.3.2 vs vendor/assets/javascripts/codemirror/modes/xml.js in codemirror-rails-2.2

- old
+ new

@@ -1,13 +1,13 @@ CodeMirror.defineMode("xml", function(config, parserConfig) { var indentUnit = config.indentUnit; var Kludges = parserConfig.htmlMode ? { autoSelfClosers: {"br": true, "img": true, "hr": true, "link": true, "input": true, "meta": true, "col": true, "frame": true, "base": true, "area": true}, - doNotIndent: {"pre": true, "!cdata": true}, + doNotIndent: {"pre": true}, allowUnquoted: true - } : {autoSelfClosers: {}, doNotIndent: {"!cdata": true}, allowUnquoted: false}; + } : {autoSelfClosers: {}, doNotIndent: {}, allowUnquoted: false}; var alignCDATA = parserConfig.alignCDATA; // Return variables for tokenizers var tagName, type; @@ -25,11 +25,11 @@ else return null; } else if (stream.match("--")) return chain(inBlock("comment", "-->")); else if (stream.match("DOCTYPE", true, true)) { stream.eatWhile(/[\w\._\-]/); - return chain(inBlock("meta", ">")); + return chain(doctype(1)); } else return null; } else if (stream.eat("?")) { stream.eatWhile(/[\w\._\-]/); @@ -100,10 +100,30 @@ stream.next(); } return style; }; } + function doctype(depth) { + return function(stream, state) { + var ch; + while ((ch = stream.next()) != null) { + if (ch == "<") { + state.tokenize = doctype(depth + 1); + return state.tokenize(stream, state); + } else if (ch == ">") { + if (depth == 1) { + state.tokenize = inText; + break; + } else { + state.tokenize = doctype(depth - 1); + return state.tokenize(stream, state); + } + } + } + return "meta"; + }; + } var curState, setStyle; function pass() { for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]); } @@ -125,27 +145,24 @@ function popContext() { if (curState.context) curState.context = curState.context.prev; } function element(type) { - if (type == "openTag") {curState.tagName = tagName; return cont(attributes, endtag(curState.startOfLine));} - else if (type == "closeTag") { + if (type == "openTag") { + curState.tagName = tagName; + return cont(attributes, endtag(curState.startOfLine)); + } else if (type == "closeTag") { var err = false; if (curState.context) { err = curState.context.tagName != tagName; } else { err = true; } if (err) setStyle = "error"; return cont(endclosetag(err)); } - else if (type == "string") { - if (!curState.context || curState.context.name != "!cdata") pushContext("!cdata"); - if (curState.tokenize == inText) popContext(); - return cont(); - } - else return cont(); + return cont(); } function endtag(startOfLine) { return function(type) { if (type == "selfcloseTag" || (type == "endTag" && Kludges.autoSelfClosers.hasOwnProperty(curState.tagName.toLowerCase()))) @@ -203,12 +220,14 @@ } state.startOfLine = false; return setStyle || style; }, - indent: function(state, textAfter) { + indent: function(state, textAfter, fullLine) { var context = state.context; - if (context && context.noIndent) return 0; + if ((state.tokenize != inTag && state.tokenize != inText) || + context && context.noIndent) + return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0; if (alignCDATA && /<!\[CDATA\[/.test(textAfter)) return 0; if (context && /^<\//.test(textAfter)) context = context.prev; while (context && !context.startOfLine) context = context.prev;