From e71fd4715316fb3dfaf87dae740980ebc938bd56 Mon Sep 17 00:00:00 2001 From: nightwing Date: Mon, 18 Feb 2013 12:02:19 +0400 Subject: [PATCH] use general toggleCommentLines for all modes --- lib/ace/mode/c_cpp.js | 29 +--- lib/ace/mode/clojure.js | 28 +-- lib/ace/mode/csharp.js | 3 + lib/ace/mode/css.js | 1 + lib/ace/mode/dart.js | 2 + lib/ace/mode/dot.js | 29 +--- lib/ace/mode/golang.js | 111 +++++------- lib/ace/mode/haml.js | 3 +- lib/ace/mode/haxe.js | 4 +- lib/ace/mode/html.js | 5 +- lib/ace/mode/jade.js | 1 + lib/ace/mode/javascript.js | 38 +---- lib/ace/mode/jsx.js | 45 ++--- lib/ace/mode/jsx_highlight_rules.js | 226 ++++++++++++------------- lib/ace/mode/latex.js | 36 +--- lib/ace/mode/less.js | 3 + lib/ace/mode/liquid.js | 29 +--- lib/ace/mode/lisp.js | 8 +- lib/ace/mode/lua.js | 4 + lib/ace/mode/makefile.js | 3 +- lib/ace/mode/markdown.js | 3 + lib/ace/mode/objectivec.js | 3 +- lib/ace/mode/pascal.js | 8 +- lib/ace/mode/pascal_highlight_rules.js | 6 +- lib/ace/mode/perl.js | 28 +-- lib/ace/mode/pgsql.js | 68 +++----- lib/ace/mode/php.js | 30 +--- lib/ace/mode/powershell.js | 3 + lib/ace/mode/python.js | 28 +-- lib/ace/mode/ruby.js | 29 +--- lib/ace/mode/sass.js | 4 +- lib/ace/mode/scad.js | 29 +--- lib/ace/mode/scheme.js | 4 +- lib/ace/mode/scss.js | 5 +- lib/ace/mode/sh.js | 29 +--- lib/ace/mode/sql.js | 29 +--- lib/ace/mode/tcl.js | 28 +-- lib/ace/mode/text.js | 42 ++++- lib/ace/mode/typescript.js | 5 - lib/ace/mode/vbscript.js | 4 +- lib/ace/mode/xml.js | 4 +- lib/ace/mode/yaml.js | 4 +- 42 files changed, 321 insertions(+), 680 deletions(-) diff --git a/lib/ace/mode/c_cpp.js b/lib/ace/mode/c_cpp.js index 0776ef97..c388dc0f 100644 --- a/lib/ace/mode/c_cpp.js +++ b/lib/ace/mode/c_cpp.js @@ -50,33 +50,8 @@ oop.inherits(Mode, TextMode); (function() { - this.toggleCommentLines = function(state, doc, startRow, endRow) { - var outdent = true; - var re = /^(\s*)\/\//; - - for (var i=startRow; i<= endRow; i++) { - if (!re.test(doc.getLine(i))) { - outdent = false; - break; - } - } - - if (outdent) { - var deleteRange = new Range(0, 0, 0, 0); - for (var i=startRow; i<= endRow; i++) - { - var line = doc.getLine(i); - var m = line.match(re); - deleteRange.start.row = i; - deleteRange.end.row = i; - deleteRange.end.column = m[0].length; - doc.replace(deleteRange, m[1]); - } - } - else { - doc.indentRows(startRow, endRow, "//"); - } - }; + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); diff --git a/lib/ace/mode/clojure.js b/lib/ace/mode/clojure.js index 581350b0..d1494e02 100644 --- a/lib/ace/mode/clojure.js +++ b/lib/ace/mode/clojure.js @@ -46,33 +46,7 @@ oop.inherits(Mode, TextMode); (function() { - this.toggleCommentLines = function(state, doc, startRow, endRow) { - var outdent = true; - var re = /^(\s*)#/; - - for (var i=startRow; i<= endRow; i++) { - if (!re.test(doc.getLine(i))) { - outdent = false; - break; - } - } - - if (outdent) { - var deleteRange = new Range(0, 0, 0, 0); - for (var i=startRow; i<= endRow; i++) - { - var line = doc.getLine(i); - var m = line.match(re); - deleteRange.start.row = i; - deleteRange.end.row = i; - deleteRange.end.column = m[0].length; - doc.replace(deleteRange, m[1]); - } - } - else { - doc.indentRows(startRow, endRow, ";"); - } - }; + this.lineCommentStart = ";"; this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); diff --git a/lib/ace/mode/csharp.js b/lib/ace/mode/csharp.js index 25586b80..2e536294 100644 --- a/lib/ace/mode/csharp.js +++ b/lib/ace/mode/csharp.js @@ -19,6 +19,9 @@ oop.inherits(Mode, TextMode); (function() { + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); diff --git a/lib/ace/mode/css.js b/lib/ace/mode/css.js index 6fc63863..2c5807c7 100644 --- a/lib/ace/mode/css.js +++ b/lib/ace/mode/css.js @@ -51,6 +51,7 @@ oop.inherits(Mode, TextMode); (function() { this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); diff --git a/lib/ace/mode/dart.js b/lib/ace/mode/dart.js index 043f9c1c..9fc58f3e 100644 --- a/lib/ace/mode/dart.js +++ b/lib/ace/mode/dart.js @@ -56,6 +56,8 @@ oop.inherits(Mode, TextMode); (function() { // Extra logic goes here. + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; }).call(Mode.prototype); exports.Mode = Mode; diff --git a/lib/ace/mode/dot.js b/lib/ace/mode/dot.js index 878ce56a..c128ccd6 100644 --- a/lib/ace/mode/dot.js +++ b/lib/ace/mode/dot.js @@ -18,33 +18,8 @@ oop.inherits(Mode, TextMode); (function() { - this.toggleCommentLines = function(state, doc, startRow, endRow) { - var outdent = true; - var re = /^(\s*)\/\//; - - for (var i=startRow; i<= endRow; i++) { - if (!re.test(doc.getLine(i))) { - outdent = false; - break; - } - } - - if (outdent) { - var deleteRange = new Range(0, 0, 0, 0); - for (var i=startRow; i<= endRow; i++) - { - var line = doc.getLine(i); - var m = line.match(re); - deleteRange.start.row = i; - deleteRange.end.row = i; - deleteRange.end.column = m[0].length; - doc.replace(deleteRange, m[1]); - } - } - else { - doc.indentRows(startRow, endRow, "//"); - } - }; + this.lineCommentStart = ["//", "#"]; + this.blockComment = {start: "/*", end: "*/"}; this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); diff --git a/lib/ace/mode/golang.js b/lib/ace/mode/golang.js index f5738873..f00ce9c7 100644 --- a/lib/ace/mode/golang.js +++ b/lib/ace/mode/golang.js @@ -1,80 +1,55 @@ define(function(require, exports, module) { - var oop = require("../lib/oop"); - var TextMode = require("./text").Mode; - var Tokenizer = require("../tokenizer").Tokenizer; - var GolangHighlightRules = require("./golang_highlight_rules").GolangHighlightRules; - var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; - var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; - var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var GolangHighlightRules = require("./golang_highlight_rules").GolangHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new GolangHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { - var Mode = function() { - this.$tokenizer = new Tokenizer(new GolangHighlightRules().getRules()); - this.$outdent = new MatchingBraceOutdent(); - this.foldingRules = new CStyleFoldMode(); - }; - oop.inherits(Mode, TextMode); - - (function() { - - this.toggleCommentLines = function(state, doc, startRow, endRow) { - var outdent = true; - var re = /^(\s*)\/\//; + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; - for (var i=startRow; i<= endRow; i++) { - if (!re.test(doc.getLine(i))) { - outdent = false; - break; - } - } + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); - if (outdent) { - var deleteRange = new Range(0, 0, 0, 0); - for (var i=startRow; i<= endRow; i++) - { - var line = doc.getLine(i); - var m = line.match(re); - deleteRange.start.row = i; - deleteRange.end.row = i; - deleteRange.end.column = m[0].length; - doc.replace(deleteRange, m[1]); - } - } - else { - doc.indentRows(startRow, endRow, "//"); - } - }; - - this.getNextLineIndent = function(state, line, tab) { - var indent = this.$getIndent(line); - - var tokenizedLine = this.$tokenizer.getLineTokens(line, state); - var tokens = tokenizedLine.tokens; - var endState = tokenizedLine.state; - - if (tokens.length && tokens[tokens.length-1].type == "comment") { - return indent; - } - - if (state == "start") { - var match = line.match(/^.*[\{\(\[]\s*$/); - if (match) { - indent += tab; - } - } + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + if (tokens.length && tokens[tokens.length-1].type == "comment") { return indent; - };//end getNextLineIndent + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } - this.checkOutdent = function(state, line, input) { - return this.$outdent.checkOutdent(line, input); - }; + return indent; + };//end getNextLineIndent - this.autoOutdent = function(state, doc, row) { - this.$outdent.autoOutdent(doc, row); - }; + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; - }).call(Mode.prototype); + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; - exports.Mode = Mode; +}).call(Mode.prototype); + +exports.Mode = Mode; }); diff --git a/lib/ace/mode/haml.js b/lib/ace/mode/haml.js index ee474f44..7970aff2 100644 --- a/lib/ace/mode/haml.js +++ b/lib/ace/mode/haml.js @@ -55,7 +55,8 @@ var Mode = function() { oop.inherits(Mode, TextMode); (function() { - // Extra logic goes here. + this.lineCommentStart = ["//", "#"]; + }).call(Mode.prototype); exports.Mode = Mode; diff --git a/lib/ace/mode/haxe.js b/lib/ace/mode/haxe.js index d88d03c0..edbfef6b 100644 --- a/lib/ace/mode/haxe.js +++ b/lib/ace/mode/haxe.js @@ -18,7 +18,9 @@ var Mode = function() { oop.inherits(Mode, TextMode); (function() { - + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); diff --git a/lib/ace/mode/html.js b/lib/ace/mode/html.js index c7f2e348..066c79e7 100644 --- a/lib/ace/mode/html.js +++ b/lib/ace/mode/html.js @@ -57,10 +57,7 @@ oop.inherits(Mode, TextMode); (function() { - - this.toggleCommentLines = function(state, doc, startRow, endRow) { - return 0; - }; + this.blockComment = {start: ""}; this.getNextLineIndent = function(state, line, tab) { return this.$getIndent(line); diff --git a/lib/ace/mode/jade.js b/lib/ace/mode/jade.js index 4432f96c..461b60b2 100644 --- a/lib/ace/mode/jade.js +++ b/lib/ace/mode/jade.js @@ -52,6 +52,7 @@ oop.inherits(Mode, TextMode); (function() { // Extra logic goes here. + this.lineCommentStart = "//"; }).call(Mode.prototype); exports.Mode = Mode; diff --git a/lib/ace/mode/javascript.js b/lib/ace/mode/javascript.js index 821cc9b9..a3e45bcc 100644 --- a/lib/ace/mode/javascript.js +++ b/lib/ace/mode/javascript.js @@ -32,7 +32,6 @@ define(function(require, exports, module) { "use strict"; var oop = require("../lib/oop"); -var lang = require("ace/lib/lang"); var TextMode = require("./text").Mode; var Tokenizer = require("../tokenizer").Tokenizer; var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; @@ -53,42 +52,7 @@ oop.inherits(Mode, TextMode); (function() { this.lineCommentStart = "//"; - this.toggleCommentLines = function(state, session, startRow, endRow) { - var doc = session.doc; - var str = this.lineCommentStart; - var regexpStart = new RegExp("^\\s*"+lang.escapeRegExp(str) + " ?"); - - function isCommented(str) { - return regexpStart.test(str); - } - - var removeComment = true; - var minSpace = Infinity; - var indentations = []; - - for (var i = startRow; i <= endRow; i++) { - var line = doc.getLine(i); - var indent = line.search(/\S|$/); - indentations[i] = indent; - if (indent < minSpace) - minSpace = indent; - if (removeComment && !isCommented(line)) - removeComment = false; - } - - if (removeComment) { - for (var i = startRow; i <= endRow; i++) { - var line = doc.getLine(i); - var m = line.match(regexpStart); - doc.removeInLine(i, indentations[i], m[0].length); - } - } else { - str += " "; - for (var i = startRow; i <= endRow; i++) { - doc.insertInLine({row: i, column: minSpace}, str); - } - } - }; + this.blockComment = {start: "/*", end: "*/"}; this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); diff --git a/lib/ace/mode/jsx.js b/lib/ace/mode/jsx.js index 1031e9dc..608b3385 100644 --- a/lib/ace/mode/jsx.js +++ b/lib/ace/mode/jsx.js @@ -19,33 +19,36 @@ oop.inherits(Mode, TextMode); (function() { - this.getNextLineIndent = function(state, line, tab) { - var indent = this.$getIndent(line); + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; - var tokenizedLine = this.$tokenizer.getLineTokens(line, state); - var tokens = tokenizedLine.tokens; + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); - if (tokens.length && tokens[tokens.length-1].type == "comment") { - return indent; - } + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; - if (state == "start") { - var match = line.match(/^.*[\{\(\[]\s*$/); - if (match) { - indent += tab; - } - } + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } - return indent; - }; + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } - this.checkOutdent = function(state, line, input) { - return this.$outdent.checkOutdent(line, input); - }; + return indent; + }; - this.autoOutdent = function(state, doc, row) { - this.$outdent.autoOutdent(doc, row); - }; + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; }).call(Mode.prototype); diff --git a/lib/ace/mode/jsx_highlight_rules.js b/lib/ace/mode/jsx_highlight_rules.js index 8e0c3eaa..5dcfbd6c 100644 --- a/lib/ace/mode/jsx_highlight_rules.js +++ b/lib/ace/mode/jsx_highlight_rules.js @@ -1,120 +1,120 @@ define(function(require, exports, module) { - var oop = require("../lib/oop"); - var lang = require("../lib/lang"); - var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; - var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JsxHighlightRules = function() { + var keywords = lang.arrayToMap( + ("break|do|instanceof|typeof|case|else|new|var|catch|finally|return|void|continue|for|switch|default|while|function|this|" + + "if|throw|" + + "delete|in|try|" + + "class|extends|super|import|from|into|implements|interface|static|mixin|override|abstract|final|" + + "number|int|string|boolean|variant|" + + "log|assert").split("|") + ); - var JsxHighlightRules = function() { - var keywords = lang.arrayToMap( - ("break|do|instanceof|typeof|case|else|new|var|catch|finally|return|void|continue|for|switch|default|while|function|this|" + - "if|throw|" + - "delete|in|try|" + - "class|extends|super|import|from|into|implements|interface|static|mixin|override|abstract|final|" + - "number|int|string|boolean|variant|" + - "log|assert").split("|") - ); - - var buildinConstants = lang.arrayToMap( - ("null|true|false|NaN|Infinity|__FILE__|__LINE__|undefined").split("|") - ); - - var reserved = lang.arrayToMap( - ("debugger|with|" + - "const|export|" + - "let|private|public|yield|protected|" + - "extern|native|as|operator|__fake__|__readonly__").split("|") - ); - - var identifierRe = "[a-zA-Z_][a-zA-Z0-9_]*\\b"; - - this.$rules = { - "start" : [ - { - token : "comment", - regex : "\\/\\/.*$" + var buildinConstants = lang.arrayToMap( + ("null|true|false|NaN|Infinity|__FILE__|__LINE__|undefined").split("|") + ); + + var reserved = lang.arrayToMap( + ("debugger|with|" + + "const|export|" + + "let|private|public|yield|protected|" + + "extern|native|as|operator|__fake__|__readonly__").split("|") + ); + + var identifierRe = "[a-zA-Z_][a-zA-Z0-9_]*\\b"; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : [ + "storage.type", + "text", + "entity.name.function" + ], + regex : "(function)(\\s+)(" + identifierRe + ")" + }, { + token : function(value) { + if (value == "this") + return "variable.language"; + else if (value == "function") + return "storage.type"; + else if (keywords.hasOwnProperty(value) || reserved.hasOwnProperty(value)) + return "keyword"; + else if (buildinConstants.hasOwnProperty(value)) + return "constant.language"; + else if (/^_?[A-Z][a-zA-Z0-9_]*$/.test(value)) + return "language.support.class"; + else + return "identifier"; }, - DocCommentHighlightRules.getStartRule("doc-start"), - { - token : "comment", // multi line comment - regex : "\\/\\*", - next : "comment" - }, { - token : "string.regexp", - regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" - }, { - token : "string", // single line - regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' - }, { - token : "string", // single line - regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" - }, { - token : "constant.numeric", // hex - regex : "0[xX][0-9a-fA-F]+\\b" - }, { - token : "constant.numeric", // float - regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" - }, { - token : "constant.language.boolean", - regex : "(?:true|false)\\b" - }, { - token : [ - "storage.type", - "text", - "entity.name.function" - ], - regex : "(function)(\\s+)(" + identifierRe + ")" - }, { - token : function(value) { - if (value == "this") - return "variable.language"; - else if (value == "function") - return "storage.type"; - else if (keywords.hasOwnProperty(value) || reserved.hasOwnProperty(value)) - return "keyword"; - else if (buildinConstants.hasOwnProperty(value)) - return "constant.language"; - else if (/^_?[A-Z][a-zA-Z0-9_]*$/.test(value)) - return "language.support.class"; - else - return "identifier"; - }, - // TODO: Unicode escape sequences - // TODO: Unicode identifiers - regex : identifierRe - }, { - token : "keyword.operator", - regex : "!|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" - }, { - token : "punctuation.operator", - regex : "\\?|\\:|\\,|\\;|\\." - }, { - token : "paren.lparen", - regex : "[[({<]" - }, { - token : "paren.rparen", - regex : "[\\])}>]" - }, { - token : "text", - regex : "\\s+" - } - ], - "comment" : [ - { - token : "comment", // closing comment - regex : ".*?\\*\\/", - next : "start" - }, { - token : "comment", // comment spanning whole line - regex : ".+" - } - ] - }; - - this.embedRules(DocCommentHighlightRules, "doc-", - [ DocCommentHighlightRules.getEndRule("start") ]); + // TODO: Unicode escape sequences + // TODO: Unicode identifiers + regex : identifierRe + }, { + token : "keyword.operator", + regex : "!|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({<]" + }, { + token : "paren.rparen", + regex : "[\\])}>]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ] }; - oop.inherits(JsxHighlightRules, TextHighlightRules); + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; - exports.JsxHighlightRules = JsxHighlightRules; +oop.inherits(JsxHighlightRules, TextHighlightRules); + +exports.JsxHighlightRules = JsxHighlightRules; }); \ No newline at end of file diff --git a/lib/ace/mode/latex.js b/lib/ace/mode/latex.js index 3403e608..f91d8f32 100644 --- a/lib/ace/mode/latex.js +++ b/lib/ace/mode/latex.js @@ -15,42 +15,8 @@ var Mode = function() { oop.inherits(Mode, TextMode); (function() { - this.toggleCommentLines = function(state, doc, startRow, endRow) { - // This code is adapted from ruby.js - var outdent = true; - - // LaTeX comments begin with % and go to the end of the line - var commentRegEx = /^(\s*)\%/; + this.lineCommentStart = "%"; - for (var i = startRow; i <= endRow; i++) { - if (!commentRegEx.test(doc.getLine(i))) { - outdent = false; - break; - } - } - - if (outdent) { - var deleteRange = new Range(0, 0, 0, 0); - for (var i = startRow; i <= endRow; i++) { - var line = doc.getLine(i); - var m = line.match(commentRegEx); - deleteRange.start.row = i; - deleteRange.end.row = i; - deleteRange.end.column = m[0].length; - doc.replace(deleteRange, m[1]); - } - } - else { - doc.indentRows(startRow, endRow, "%"); - } - }; - - // There is no universally accepted way of indenting a tex document - // so just maintain the indentation of the previous line - this.getNextLineIndent = function(state, line, tab) { - return this.$getIndent(line); - }; - }).call(Mode.prototype); exports.Mode = Mode; diff --git a/lib/ace/mode/less.js b/lib/ace/mode/less.js index ee07747c..4343e649 100644 --- a/lib/ace/mode/less.js +++ b/lib/ace/mode/less.js @@ -48,6 +48,9 @@ var Mode = function() { oop.inherits(Mode, TextMode); (function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); diff --git a/lib/ace/mode/liquid.js b/lib/ace/mode/liquid.js index b996bc52..8555e6c5 100644 --- a/lib/ace/mode/liquid.js +++ b/lib/ace/mode/liquid.js @@ -45,34 +45,7 @@ oop.inherits(Mode, TextMode); (function() { - this.toggleCommentLines = function(state, doc, startRow, endRow) { - var outdent = true; - var outentedRows = []; - var re = /^(\s*)#/; - - for (var i=startRow; i<= endRow; i++) { - if (!re.test(doc.getLine(i))) { - outdent = false; - break; - } - } - - if (outdent) { - var deleteRange = new Range(0, 0, 0, 0); - for (var i=startRow; i<= endRow; i++) - { - var line = doc.getLine(i); - var m = line.match(re); - deleteRange.start.row = i; - deleteRange.end.row = i; - deleteRange.end.column = m[0].length; - doc.replace(deleteRange, m[1]); - } - } - else { - doc.indentRows(startRow, endRow, "#"); - } - }; + this.blockComment = {start: ""}; this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); diff --git a/lib/ace/mode/lisp.js b/lib/ace/mode/lisp.js index 11728990..5bae6689 100644 --- a/lib/ace/mode/lisp.js +++ b/lib/ace/mode/lisp.js @@ -27,10 +27,6 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - * Contributor(s): - * - * - * * ***** END LICENSE BLOCK ***** */ /* @@ -53,7 +49,9 @@ var Mode = function() { oop.inherits(Mode, TextMode); (function() { - // Extra logic goes here. + + this.lineCommentStart = ";"; + }).call(Mode.prototype); exports.Mode = Mode; diff --git a/lib/ace/mode/lua.js b/lib/ace/mode/lua.js index 91d85de8..47325600 100644 --- a/lib/ace/mode/lua.js +++ b/lib/ace/mode/lua.js @@ -45,6 +45,10 @@ var Mode = function() { oop.inherits(Mode, TextMode); (function() { + + this.lineCommentStart = "--"; + this.blockComment = {start: "--[", end: "]--"}; + var indentKeywords = { "function": 1, "then": 1, diff --git a/lib/ace/mode/makefile.js b/lib/ace/mode/makefile.js index d0af9d79..7f8f726b 100644 --- a/lib/ace/mode/makefile.js +++ b/lib/ace/mode/makefile.js @@ -55,7 +55,8 @@ var Mode = function() { oop.inherits(Mode, TextMode); (function() { - // Extra logic goes here. + + this.lineCommentStart = "#"; }).call(Mode.prototype); exports.Mode = Mode; diff --git a/lib/ace/mode/markdown.js b/lib/ace/mode/markdown.js index 85cdff1e..8b3a96d7 100644 --- a/lib/ace/mode/markdown.js +++ b/lib/ace/mode/markdown.js @@ -56,6 +56,9 @@ var Mode = function() { oop.inherits(Mode, TextMode); (function() { + + this.lineCommentStart = ">"; + this.getNextLineIndent = function(state, line, tab) { if (state == "listblock") { var match = /^(\s*)(?:([-+*])|(\d+)\.)(\s+)/.exec(line); diff --git a/lib/ace/mode/objectivec.js b/lib/ace/mode/objectivec.js index 554c3bda..10286215 100644 --- a/lib/ace/mode/objectivec.js +++ b/lib/ace/mode/objectivec.js @@ -55,7 +55,8 @@ var Mode = function() { oop.inherits(Mode, TextMode); (function() { - // Extra logic goes here. (see below) + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; }).call(Mode.prototype); exports.Mode = Mode; diff --git a/lib/ace/mode/pascal.js b/lib/ace/mode/pascal.js index 4312f123..cd0739d1 100644 --- a/lib/ace/mode/pascal.js +++ b/lib/ace/mode/pascal.js @@ -55,7 +55,13 @@ var Mode = function() { oop.inherits(Mode, TextMode); (function() { - // Extra logic goes here. + + this.lineCommentStart = ["--", "//"]; + this.blockComment = [ + {start: "(*", end: "*)"}, + {start: "{", end: "}"} + ]; + }).call(Mode.prototype); exports.Mode = Mode; diff --git a/lib/ace/mode/pascal_highlight_rules.js b/lib/ace/mode/pascal_highlight_rules.js index d466c4be..527bc1a8 100644 --- a/lib/ace/mode/pascal_highlight_rules.js +++ b/lib/ace/mode/pascal_highlight_rules.js @@ -60,8 +60,6 @@ var PascalHighlightRules = function() { 'storage.type.prototype.pascal', 'entity.name.function.prototype.pascal' ], regex: '\\b(function|procedure)(\\s+)(\\w+)(\\.\\w+)?(?=(?:\\(.*?\\))?;\\s*(?:attribute|forward|external))' }, - { token: 'keyword.operator', - regex: '[+\\-;,/*%]|:=|=' }, { caseInsensitive: true, token: [ 'variable.pascal', "text", @@ -116,7 +114,9 @@ var PascalHighlightRules = function() { { token: 'punctuation.definition.string.end.pascal', regex: '\'', next: 'pop' }, - { defaultToken: 'string.quoted.single.pascal' } ] } ] } + { defaultToken: 'string.quoted.single.pascal' } ] }, + { token: 'keyword.operator', + regex: '[+\\-;,/*%]|:=|=' } ] } this.normalizeRules(); }; diff --git a/lib/ace/mode/perl.js b/lib/ace/mode/perl.js index cf14afbf..de0ed19f 100644 --- a/lib/ace/mode/perl.js +++ b/lib/ace/mode/perl.js @@ -48,33 +48,7 @@ oop.inherits(Mode, TextMode); (function() { - this.toggleCommentLines = function(state, doc, startRow, endRow) { - var outdent = true; - var re = /^(\s*)#/; - - for (var i=startRow; i<= endRow; i++) { - if (!re.test(doc.getLine(i))) { - outdent = false; - break; - } - } - - if (outdent) { - var deleteRange = new Range(0, 0, 0, 0); - for (var i=startRow; i<= endRow; i++) - { - var line = doc.getLine(i); - var m = line.match(re); - deleteRange.start.row = i; - deleteRange.end.row = i; - deleteRange.end.column = m[0].length; - doc.replace(deleteRange, m[1]); - } - } - else { - doc.indentRows(startRow, endRow, "#"); - } - }; + this.lineCommentStart = "#"; this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); diff --git a/lib/ace/mode/pgsql.js b/lib/ace/mode/pgsql.js index e319f2a1..29c30311 100755 --- a/lib/ace/mode/pgsql.js +++ b/lib/ace/mode/pgsql.js @@ -30,58 +30,30 @@ define(function(require, exports, module) { - var oop = require("../lib/oop"); - var TextMode = require("../mode/text").Mode; - var Tokenizer = require("../tokenizer").Tokenizer; - var PgsqlHighlightRules = require("./pgsql_highlight_rules").PgsqlHighlightRules; - var Range = require("../range").Range; +var oop = require("../lib/oop"); +var TextMode = require("../mode/text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var PgsqlHighlightRules = require("./pgsql_highlight_rules").PgsqlHighlightRules; +var Range = require("../range").Range; - var Mode = function() { - this.$tokenizer = new Tokenizer(new PgsqlHighlightRules().getRules()); - }; - oop.inherits(Mode, TextMode); +var Mode = function() { + this.$tokenizer = new Tokenizer(new PgsqlHighlightRules().getRules()); +}; +oop.inherits(Mode, TextMode); - (function() { +(function() { + this.lineCommentStart = "--"; + this.blockComment = {start: "/*", end: "*/"}; - this.toggleCommentLines = function(state, doc, startRow, endRow) { - var outdent = true; - // var outentedRows = []; - var re = /^(\s*)--/; - - for (var i=startRow; i<= endRow; i++) { - if (!re.test(doc.getLine(i))) { - outdent = false; - break; - } - } - - if (outdent) { - var deleteRange = new Range(0, 0, 0, 0); - for (var i=startRow; i<= endRow; i++) - { - var line = doc.getLine(i); - var m = line.match(re); - deleteRange.start.row = i; - deleteRange.end.row = i; - deleteRange.end.column = m[0].length; - doc.replace(deleteRange, m[1]); - } - } - else { - doc.indentRows(startRow, endRow, "--"); - } - }; - - - this.getNextLineIndent = function(state, line, tab) { - if (state == "start" || state == "keyword.statementEnd") { - return ""; - } else { - return this.$getIndent(line); // Keep whatever indent the previous line has - } + this.getNextLineIndent = function(state, line, tab) { + if (state == "start" || state == "keyword.statementEnd") { + return ""; + } else { + return this.$getIndent(line); // Keep whatever indent the previous line has } + } - }).call(Mode.prototype); +}).call(Mode.prototype); - exports.Mode = Mode; +exports.Mode = Mode; }); diff --git a/lib/ace/mode/php.js b/lib/ace/mode/php.js index f774aa13..87b70cbd 100644 --- a/lib/ace/mode/php.js +++ b/lib/ace/mode/php.js @@ -69,33 +69,9 @@ oop.inherits(Mode, TextMode); + unicode.packages.Pc + "\_]|\s])+", "g" ); - this.toggleCommentLines = function(state, doc, startRow, endRow) { - var outdent = true; - var re = /^(\s*)#/; - - for (var i=startRow; i<= endRow; i++) { - if (!re.test(doc.getLine(i))) { - outdent = false; - break; - } - } - - if (outdent) { - var deleteRange = new Range(0, 0, 0, 0); - for (var i=startRow; i<= endRow; i++) - { - var line = doc.getLine(i); - var m = line.match(re); - deleteRange.start.row = i; - deleteRange.end.row = i; - deleteRange.end.column = m[0].length; - doc.replace(deleteRange, m[1]); - } - } - else { - doc.indentRows(startRow, endRow, "#"); - } - }; + + this.lineCommentStart = ["#", "//"]; + this.blockComment = {start: "/*", end: "*/"}; this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); diff --git a/lib/ace/mode/powershell.js b/lib/ace/mode/powershell.js index 506b118e..db414c2e 100644 --- a/lib/ace/mode/powershell.js +++ b/lib/ace/mode/powershell.js @@ -19,6 +19,9 @@ oop.inherits(Mode, TextMode); (function() { + this.lineCommentStart = "#"; + this.blockComment = {start: "<#", end: "#>"}; + this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); diff --git a/lib/ace/mode/python.js b/lib/ace/mode/python.js index 2e8ec8e4..5a38f2c4 100644 --- a/lib/ace/mode/python.js +++ b/lib/ace/mode/python.js @@ -46,33 +46,7 @@ oop.inherits(Mode, TextMode); (function() { - this.toggleCommentLines = function(state, doc, startRow, endRow) { - var outdent = true; - var re = /^(\s*)#/; - - for (var i=startRow; i<= endRow; i++) { - if (!re.test(doc.getLine(i))) { - outdent = false; - break; - } - } - - if (outdent) { - var deleteRange = new Range(0, 0, 0, 0); - for (var i=startRow; i<= endRow; i++) - { - var line = doc.getLine(i); - var m = line.match(re); - deleteRange.start.row = i; - deleteRange.end.row = i; - deleteRange.end.column = m[0].length; - doc.replace(deleteRange, m[1]); - } - } - else { - doc.indentRows(startRow, endRow, "#"); - } - }; + this.lineCommentStart = "#"; this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); diff --git a/lib/ace/mode/ruby.js b/lib/ace/mode/ruby.js index 7d66179e..fc6f675b 100644 --- a/lib/ace/mode/ruby.js +++ b/lib/ace/mode/ruby.js @@ -48,33 +48,8 @@ oop.inherits(Mode, TextMode); (function() { - this.toggleCommentLines = function(state, doc, startRow, endRow) { - var outdent = true; - var re = /^(\s*)#/; - - for (var i=startRow; i<= endRow; i++) { - if (!re.test(doc.getLine(i))) { - outdent = false; - break; - } - } - - if (outdent) { - var deleteRange = new Range(0, 0, 0, 0); - for (var i=startRow; i<= endRow; i++) - { - var line = doc.getLine(i); - var m = line.match(re); - deleteRange.start.row = i; - deleteRange.end.row = i; - deleteRange.end.column = m[0].length; - doc.replace(deleteRange, m[1]); - } - } - else { - doc.indentRows(startRow, endRow, "#"); - } - }; + + this.lineCommentStart = "#"; this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); diff --git a/lib/ace/mode/sass.js b/lib/ace/mode/sass.js index 15590535..65f4753e 100644 --- a/lib/ace/mode/sass.js +++ b/lib/ace/mode/sass.js @@ -43,8 +43,8 @@ var Mode = function() { }; oop.inherits(Mode, TextMode); -(function() { - +(function() { + this.lineCommentStart = "//"; }).call(Mode.prototype); exports.Mode = Mode; diff --git a/lib/ace/mode/scad.js b/lib/ace/mode/scad.js index fd9c6ad9..c5c3e04b 100644 --- a/lib/ace/mode/scad.js +++ b/lib/ace/mode/scad.js @@ -50,33 +50,8 @@ oop.inherits(Mode, TextMode); (function() { - this.toggleCommentLines = function(state, doc, startRow, endRow) { - var outdent = true; - var re = /^(\s*)\/\//; - - for (var i=startRow; i<= endRow; i++) { - if (!re.test(doc.getLine(i))) { - outdent = false; - break; - } - } - - if (outdent) { - var deleteRange = new Range(0, 0, 0, 0); - for (var i=startRow; i<= endRow; i++) - { - var line = doc.getLine(i); - var m = line.match(re); - deleteRange.start.row = i; - deleteRange.end.row = i; - deleteRange.end.column = m[0].length; - doc.replace(deleteRange, m[1]); - } - } - else { - doc.indentRows(startRow, endRow, "//"); - } - }; + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); diff --git a/lib/ace/mode/scheme.js b/lib/ace/mode/scheme.js index fd37a576..42fb3caf 100644 --- a/lib/ace/mode/scheme.js +++ b/lib/ace/mode/scheme.js @@ -49,7 +49,9 @@ var Mode = function() { oop.inherits(Mode, TextMode); (function() { - // Extra logic goes here. + + this.lineCommentStart = ";"; + }).call(Mode.prototype); exports.Mode = Mode; diff --git a/lib/ace/mode/scss.js b/lib/ace/mode/scss.js index 48d892ae..8517ef82 100644 --- a/lib/ace/mode/scss.js +++ b/lib/ace/mode/scss.js @@ -48,7 +48,10 @@ var Mode = function() { oop.inherits(Mode, TextMode); (function() { - + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); diff --git a/lib/ace/mode/sh.js b/lib/ace/mode/sh.js index 3a7db3c5..d97b336a 100644 --- a/lib/ace/mode/sh.js +++ b/lib/ace/mode/sh.js @@ -44,33 +44,8 @@ oop.inherits(Mode, TextMode); (function() { - this.toggleCommentLines = function(state, doc, startRow, endRow) { - var outdent = true; - var re = /^(\s*)#/; - - for (var i=startRow; i<= endRow; i++) { - if (!re.test(doc.getLine(i))) { - outdent = false; - break; - } - } - - if (outdent) { - var deleteRange = new Range(0, 0, 0, 0); - for (var i=startRow; i<= endRow; i++) - { - var line = doc.getLine(i); - var m = line.match(re); - deleteRange.start.row = i; - deleteRange.end.row = i; - deleteRange.end.column = m[0].length; - doc.replace(deleteRange, m[1]); - } - } - else { - doc.indentRows(startRow, endRow, "#"); - } - }; + + this.lineCommentStart = "#"; this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); diff --git a/lib/ace/mode/sql.js b/lib/ace/mode/sql.js index a552349f..6d5c8372 100644 --- a/lib/ace/mode/sql.js +++ b/lib/ace/mode/sql.js @@ -44,34 +44,7 @@ oop.inherits(Mode, TextMode); (function() { - this.toggleCommentLines = function(state, doc, startRow, endRow) { - var outdent = true; - var outentedRows = []; - var re = /^(\s*)--/; - - for (var i=startRow; i<= endRow; i++) { - if (!re.test(doc.getLine(i))) { - outdent = false; - break; - } - } - - if (outdent) { - var deleteRange = new Range(0, 0, 0, 0); - for (var i=startRow; i<= endRow; i++) - { - var line = doc.getLine(i); - var m = line.match(re); - deleteRange.start.row = i; - deleteRange.end.row = i; - deleteRange.end.column = m[0].length; - doc.replace(deleteRange, m[1]); - } - } - else { - doc.indentRows(startRow, endRow, "--"); - } - }; + this.lineCommentStart = "--"; }).call(Mode.prototype); diff --git a/lib/ace/mode/tcl.js b/lib/ace/mode/tcl.js index 8de0a148..2efd0a3b 100644 --- a/lib/ace/mode/tcl.js +++ b/lib/ace/mode/tcl.js @@ -48,33 +48,7 @@ oop.inherits(Mode, TextMode); (function() { - this.toggleCommentLines = function(state, doc, startRow, endRow) { - var outdent = true; - var re = /^(\s*)#/; - - for (var i=startRow; i<= endRow; i++) { - if (!re.test(doc.getLine(i))) { - outdent = false; - break; - } - } - - if (outdent) { - var deleteRange = new Range(0, 0, 0, 0); - for (var i=startRow; i<= endRow; i++) - { - var line = doc.getLine(i); - var m = line.match(re); - deleteRange.start.row = i; - deleteRange.end.row = i; - deleteRange.end.column = m[0].length; - doc.replace(deleteRange, m[1]); - } - } - else { - doc.indentRows(startRow, endRow, "#"); - } - }; + this.lineCommentStart = "#"; this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); diff --git a/lib/ace/mode/text.js b/lib/ace/mode/text.js index c43ca5b6..edef0204 100644 --- a/lib/ace/mode/text.js +++ b/lib/ace/mode/text.js @@ -35,6 +35,7 @@ var Tokenizer = require("../tokenizer").Tokenizer; var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; var Behaviour = require("./behaviour").Behaviour; var unicode = require("../unicode"); +var lang = require("../lib/lang"); var Mode = function() { this.$tokenizer = new Tokenizer(new TextHighlightRules().getRules()); @@ -61,7 +62,46 @@ var Mode = function() { return this.$tokenizer; }; - this.toggleCommentLines = function(state, doc, startRow, endRow) { + this.toggleCommentLines = function(state, session, startRow, endRow) { + var doc = session.doc; + var regexpStart, lineCommentStart; + if (!this.lineCommentStart) { + return false + } else if (Array.isArray(this.lineCommentStart)) { + regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join("|"); + lineCommentStart = this.lineCommentStart[0]; + } else { + regexpStart = lang.escapeRegExp(this.lineCommentStart); + lineCommentStart = this.lineCommentStart; + } + regexpStart = new RegExp("^\\s*(?:" + regexpStart + ") ?"); + + var removeComment = true; + var minSpace = Infinity; + var indentations = []; + + for (var i = startRow; i <= endRow; i++) { + var line = doc.getLine(i); + var indent = line.search(/\S|$/); + indentations[i] = indent; + if (indent < minSpace) + minSpace = indent; + if (removeComment && !regexpStart.test(line)) + removeComment = false; + } + + if (removeComment) { + for (var i = startRow; i <= endRow; i++) { + var line = doc.getLine(i); + var m = line.match(regexpStart); + doc.removeInLine(i, indentations[i], m[0].length); + } + } else { + lineCommentStart += " "; + for (var i = startRow; i <= endRow; i++) { + doc.insertInLine({row: i, column: minSpace}, lineCommentStart); + } + } }; this.getNextLineIndent = function(state, line, tab) { diff --git a/lib/ace/mode/typescript.js b/lib/ace/mode/typescript.js index 67e40b35..a4978e10 100644 --- a/lib/ace/mode/typescript.js +++ b/lib/ace/mode/typescript.js @@ -26,11 +26,6 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * - * Contributor(s): - * - * - * * ***** END LICENSE BLOCK ***** */ /* diff --git a/lib/ace/mode/vbscript.js b/lib/ace/mode/vbscript.js index a2d52c44..79489139 100644 --- a/lib/ace/mode/vbscript.js +++ b/lib/ace/mode/vbscript.js @@ -53,7 +53,9 @@ var Mode = function() { oop.inherits(Mode, TextMode); (function() { - // Extra logic goes here. + + this.lineCommentStart = ["'", "REM"]; + }).call(Mode.prototype); exports.Mode = Mode; diff --git a/lib/ace/mode/xml.js b/lib/ace/mode/xml.js index e32954d7..24feef0c 100644 --- a/lib/ace/mode/xml.js +++ b/lib/ace/mode/xml.js @@ -48,9 +48,7 @@ oop.inherits(Mode, TextMode); (function() { - this.getNextLineIndent = function(state, line, tab) { - return this.$getIndent(line); - }; + this.blockComment = {start: ""}; }).call(Mode.prototype); diff --git a/lib/ace/mode/yaml.js b/lib/ace/mode/yaml.js index 9ed732a9..2035e390 100644 --- a/lib/ace/mode/yaml.js +++ b/lib/ace/mode/yaml.js @@ -47,7 +47,9 @@ oop.inherits(Mode, TextMode); (function() { - this.getNextLineIndent = function(state, line, tab) { + this.lineCommentStart = "#"; + + this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); if (state == "start") {