vendor/assets/javascripts/codemirror/modes/pascal.js in codemirror-rails-2.3 vs vendor/assets/javascripts/codemirror/modes/pascal.js in codemirror-rails-2.21

- old
+ new

@@ -5,13 +5,15 @@ return obj; } var keywords = words("and array begin case const div do downto else end file for forward integer " + "boolean char function goto if in label mod nil not of or packed procedure " + "program record repeat set string then to type until var while with"); + var blockKeywords = words("case do else for if switch while struct then of"); var atoms = {"null": true}; var isOperatorChar = /[+\-*&%=<>!?|\/]/; + var curPunc; function tokenBase(stream, state) { var ch = stream.next(); if (ch == "#" && state.startOfLine) { stream.skipToEnd(); @@ -24,10 +26,11 @@ if (ch == "(" && stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + curPunc = ch; return null } if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return "number"; @@ -42,11 +45,14 @@ stream.eatWhile(isOperatorChar); return "operator"; } stream.eatWhile(/[\w\$_]/); var cur = stream.current(); - if (keywords.propertyIsEnumerable(cur)) return "keyword"; + if (keywords.propertyIsEnumerable(cur)) { + if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; + return "keyword"; + } if (atoms.propertyIsEnumerable(cur)) return "atom"; return "word"; } function tokenString(quote) { @@ -71,20 +77,58 @@ maybeEnd = (ch == "*"); } return "comment"; } + function Context(indented, column, type, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.align = align; + this.prev = prev; + } + function pushContext(state, col, type) { + return state.context = new Context(state.indented, col, type, null, state.context); + } + function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" ) + state.indented = state.context.indented; + return state.context = state.context.prev; + } + // Interface return { startState: function(basecolumn) { - return {tokenize: null}; + return { + tokenize: null, + context: new Context((basecolumn || 0) - config.indentUnit, 0, "top", false), + indented: 0, + startOfLine: true + }; }, token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } if (stream.eatSpace()) return null; + curPunc = null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment" || style == "meta") return style; + if (ctx.align == null) ctx.align = true; + + if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == ctx.type) popContext(state); + else if ( ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement")) + pushContext(state, stream.column(), "statement"); + state.startOfLine = false; return style; }, electricChars: "{}" };