From 9ddf039cf6b3a60d2895e5f639e30fbba10d699f Mon Sep 17 00:00:00 2001 From: nightwing Date: Thu, 7 Feb 2013 22:24:41 +0400 Subject: [PATCH 01/16] fix typos --- lib/ace/mode/livescript.js | 2 +- lib/ace/mode/ruby_highlight_rules.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/ace/mode/livescript.js b/lib/ace/mode/livescript.js index fcbb7400..4efd5480 100644 --- a/lib/ace/mode/livescript.js +++ b/lib/ace/mode/livescript.js @@ -1,4 +1,4 @@ -define('ace/mode/ls', function(require, exports, module){ +define(function(require, exports, module){ var identifier, LiveScriptMode, keywordend, stringfill; identifier = '(?![\\d\\s])[$\\w\\xAA-\\uFFDC](?:(?!\\s)[$\\w\\xAA-\\uFFDC]|-[A-Za-z])*'; exports.Mode = LiveScriptMode = (function(superclass){ diff --git a/lib/ace/mode/ruby_highlight_rules.js b/lib/ace/mode/ruby_highlight_rules.js index 373f1636..2fd64a85 100644 --- a/lib/ace/mode/ruby_highlight_rules.js +++ b/lib/ace/mode/ruby_highlight_rules.js @@ -174,11 +174,11 @@ var RubyHighlightRules = function() { }, { stateName: "heredoc", token : function(value, currentState, stack) { - var next = value[3] == '-' ? "heredoc" : "indentedHeredoc"; + var next = value[2] == '-' ? "indentedHeredoc" : "heredoc"; var tokens = value.split(this.splitRegex); stack.push(next, tokens[3]); return [ - {type:"constant", value: "<<"}, + {type:"constant", value: tokens[1]}, {type:"string", value: tokens[2]}, {type:"support.class", value: tokens[3]}, {type:"string", value: tokens[4]} From 94a6dac5a7a8a04d12979753b8d803f93bba6606 Mon Sep 17 00:00:00 2001 From: nightwing Date: Tue, 15 Jan 2013 12:04:45 +0400 Subject: [PATCH 02/16] fix highlighting of regular expressions at the beginning of document --- lib/ace/mode/javascript_highlight_rules.js | 40 ++++++++++++---------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/lib/ace/mode/javascript_highlight_rules.js b/lib/ace/mode/javascript_highlight_rules.js index 24cee3ba..277f9744 100644 --- a/lib/ace/mode/javascript_highlight_rules.js +++ b/lib/ace/mode/javascript_highlight_rules.js @@ -83,7 +83,7 @@ var JavaScriptHighlightRules = function() { // regexps are ordered -> the first match is used this.$rules = { - "start" : [ + "no_regex" : [ { token : "comment", regex : /\/\/.*$/ @@ -165,7 +165,7 @@ var JavaScriptHighlightRules = function() { }, { token : "keyword", regex : "(?:" + kwBeforeRe + ")\\b", - next : "regex_allowed" + next : "start" }, { token : ["punctuation.operator", "support.function"], regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ @@ -184,22 +184,22 @@ var JavaScriptHighlightRules = function() { }, { token : "keyword.operator", regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, - next : "regex_allowed" + next : "start" }, { token : "punctuation.operator", regex : /\?|\:|\,|\;|\./, - next : "regex_allowed" + next : "start" }, { token : "paren.lparen", regex : /[\[({]/, - next : "regex_allowed" + next : "start" }, { token : "paren.rparen", regex : /[\])}]/ }, { token : "keyword.operator", regex : /\/=?/, - next : "regex_allowed" + next : "start" }, { token: "comment", regex: /^#!.*$/ @@ -207,7 +207,7 @@ var JavaScriptHighlightRules = function() { ], // regular expressions are only allowed after certain tokens. This // makes sure we don't mix up regexps with the divison operator - "regex_allowed": [ + "start": [ DocCommentHighlightRules.getStartRule("doc-start"), { token : "comment", // multi line comment @@ -215,20 +215,22 @@ var JavaScriptHighlightRules = function() { next : "comment_regex_allowed" }, { token : "comment", - regex : "\\/\\/.*$" + regex : "\\/\\/.*$", + next : "start" }, { token: "string.regexp", regex: "\\/", next: "regex", }, { token : "text", - regex : "\\s+" + regex : "\\s+|^$", + next : "start" }, { // immediately return to the start mode without matching // anything token: "empty", regex: "", - next: "start" + next: "no_regex" } ], "regex": [ @@ -240,7 +242,7 @@ var JavaScriptHighlightRules = function() { // flag token: "string.regexp", regex: "/\\w*", - next: "start", + next: "no_regex", }, { // invalid operators token : "invalid", @@ -259,7 +261,7 @@ var JavaScriptHighlightRules = function() { }, { token: "empty", regex: "$", - next: "start" + next: "no_regex" }, { defaultToken: "string.regexp" } @@ -278,7 +280,7 @@ var JavaScriptHighlightRules = function() { }, { token: "empty", regex: "$", - next: "start" + next: "no_regex" }, { defaultToken: "string.regexp.charachterclass" } @@ -296,15 +298,15 @@ var JavaScriptHighlightRules = function() { }, { token: "empty", regex: "", - next: "start" + next: "no_regex" } ], "comment_regex_allowed" : [ - {token : "comment", regex : "\\*\\/", next : "regex_allowed"}, + {token : "comment", regex : "\\*\\/", next : "start"}, {defaultToken : "comment"} ], "comment" : [ - {token : "comment", regex : "\\*\\/", next : "start"}, + {token : "comment", regex : "\\*\\/", next : "no_regex"}, {defaultToken : "comment"} ], "qqstring" : [ @@ -318,7 +320,7 @@ var JavaScriptHighlightRules = function() { }, { token : "string", regex : '"|$', - next : "start", + next : "no_regex", }, { defaultToken: "string" } @@ -334,7 +336,7 @@ var JavaScriptHighlightRules = function() { }, { token : "string", regex : "'|$", - next : "start", + next : "no_regex", }, { defaultToken: "string" } @@ -342,7 +344,7 @@ var JavaScriptHighlightRules = function() { }; this.embedRules(DocCommentHighlightRules, "doc-", - [ DocCommentHighlightRules.getEndRule("start") ]); + [ DocCommentHighlightRules.getEndRule("no_regex") ]); }; oop.inherits(JavaScriptHighlightRules, TextHighlightRules); From e084dc1303b3b4e9c33c3b9c7123933df82bb0d8 Mon Sep 17 00:00:00 2001 From: nightwing Date: Thu, 7 Feb 2013 22:29:37 +0400 Subject: [PATCH 03/16] move line length checking to tokenizer to not break long data uri's in css --- lib/ace/background_tokenizer.js | 10 ---------- lib/ace/tokenizer.js | 8 ++++++++ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/ace/background_tokenizer.js b/lib/ace/background_tokenizer.js index c1bd8047..8f936d1a 100644 --- a/lib/ace/background_tokenizer.js +++ b/lib/ace/background_tokenizer.js @@ -34,8 +34,6 @@ define(function(require, exports, module) { var oop = require("./lib/oop"); var EventEmitter = require("./lib/event_emitter").EventEmitter; -// tokenizing lines longer than this makes editor very slow -var MAX_LINE_LENGTH = 5000; /** * @@ -226,15 +224,7 @@ var BackgroundTokenizer = function(tokenizer, editor) { var line = this.doc.getLine(row); var state = this.states[row - 1]; - if (line.length > MAX_LINE_LENGTH) { - var overflow = {value: line.substr(MAX_LINE_LENGTH), type: "text"}; - line = line.slice(0, MAX_LINE_LENGTH); - } var data = this.tokenizer.getLineTokens(line, state, row); - if (overflow) { - data.tokens.push(overflow); - data.state = "start"; - } if (this.states[row] + "" !== data.state + "") { this.states[row] = data.state; diff --git a/lib/ace/tokenizer.js b/lib/ace/tokenizer.js index c7d6bee9..628b3a29 100644 --- a/lib/ace/tokenizer.js +++ b/lib/ace/tokenizer.js @@ -31,6 +31,8 @@ define(function(require, exports, module) { "use strict"; +// tokenizing lines longer than this makes editor very slow +var MAX_TOKEN_COUNT = 1000; /** * * @@ -230,6 +232,12 @@ var Tokenizer = function(rules, flag) { break; lastIndex = index; + + if (tokens.length > MAX_TOKEN_COUNT) { + token.value += line.substr(lastIndex); + currentState = "start" + break; + } } if (token.type) From 382eb6ab5544c9e129ab2607d90c38bff2732ba0 Mon Sep 17 00:00:00 2001 From: nightwing Date: Thu, 7 Feb 2013 23:13:11 +0400 Subject: [PATCH 04/16] remove flag parameter from tokenizer --- lib/ace/mode/abap.js | 2 +- lib/ace/mode/abap_highlight_rules.js | 7 ++++--- lib/ace/mode/c9search.js | 2 +- lib/ace/mode/css.js | 2 +- lib/ace/mode/css_highlight_rules.js | 6 ++++++ lib/ace/mode/diff.js | 4 ++-- lib/ace/mode/diff_highlight_rules.js | 3 ++- lib/ace/mode/less.js | 2 +- lib/ace/mode/less_highlight_rules.js | 2 ++ lib/ace/mode/scss.js | 2 +- lib/ace/mode/scss_highlight_rules.js | 2 ++ lib/ace/tokenizer.js | 15 +++++++-------- 12 files changed, 30 insertions(+), 19 deletions(-) diff --git a/lib/ace/mode/abap.js b/lib/ace/mode/abap.js index aff86781..b2ba82c4 100644 --- a/lib/ace/mode/abap.js +++ b/lib/ace/mode/abap.js @@ -39,7 +39,7 @@ var TextMode = require("./text").Mode; var oop = require("../lib/oop"); function Mode() { - this.$tokenizer = new Tokenizer(new Rules().getRules(), "i"); + this.$tokenizer = new Tokenizer(new Rules().getRules()); this.foldingRules = new FoldMode(); } diff --git a/lib/ace/mode/abap_highlight_rules.js b/lib/ace/mode/abap_highlight_rules.js index 8cc50c07..6b232c90 100644 --- a/lib/ace/mode/abap_highlight_rules.js +++ b/lib/ace/mode/abap_highlight_rules.js @@ -113,17 +113,18 @@ var AbapHighlightRules = function() { {token : "variable.parameter", regex : /sy|pa?\d\d\d\d\|t\d\d\d\.|innnn/}, {token : "keyword", regex : compoundKeywords}, {token : "variable.parameter", regex : /\w+-\w+(?:-\w+)*/}, - {token : keywordMapper, regex : "\\b\\w+\\b"}, + {token : keywordMapper, regex : "\\b\\w+\\b"}, + {caseInsensitive: true} ], "qstring" : [ {token : "constant.language.escape", regex : "''"}, {token : "string", regex : "'", next : "start"}, - {token : "string", regex : ".|\w+"} + {defaultToken : "string"} ], "string" : [ {token : "constant.language.escape", regex : "``"}, {token : "string", regex : "`", next : "start"}, - {token : "string", regex : ".|\w+"} + {defaultToken : "string"} ] } }; diff --git a/lib/ace/mode/c9search.js b/lib/ace/mode/c9search.js index 42342d28..66b26145 100644 --- a/lib/ace/mode/c9search.js +++ b/lib/ace/mode/c9search.js @@ -39,7 +39,7 @@ var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutd var C9StyleFoldMode = require("./folding/c9search").FoldMode; var Mode = function() { - this.$tokenizer = new Tokenizer(new C9SearchHighlightRules().getRules(), "i"); + this.$tokenizer = new Tokenizer(new C9SearchHighlightRules().getRules()); this.$outdent = new MatchingBraceOutdent(); this.foldingRules = new C9StyleFoldMode(); }; diff --git a/lib/ace/mode/css.js b/lib/ace/mode/css.js index 50b214c6..6fc63863 100644 --- a/lib/ace/mode/css.js +++ b/lib/ace/mode/css.js @@ -41,7 +41,7 @@ var CssBehaviour = require("./behaviour/css").CssBehaviour; var CStyleFoldMode = require("./folding/cstyle").FoldMode; var Mode = function() { - this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules(), "i"); + this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules()); this.$outdent = new MatchingBraceOutdent(); this.$behaviour = new CssBehaviour(); this.foldingRules = new CStyleFoldMode(); diff --git a/lib/ace/mode/css_highlight_rules.js b/lib/ace/mode/css_highlight_rules.js index ea61338b..b7086e5f 100644 --- a/lib/ace/mode/css_highlight_rules.js +++ b/lib/ace/mode/css_highlight_rules.js @@ -92,6 +92,8 @@ var CssHighlightRules = function() { }, { token : keywordMapper, regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true } ]; @@ -160,6 +162,8 @@ var CssHighlightRules = function() { },{ token: "constant", regex: "[a-z0-9-_]+" + },{ + caseInsensitive: true }], "media" : [ { @@ -186,6 +190,8 @@ var CssHighlightRules = function() { },{ token: "constant", regex: "[a-z0-9-_]+" + },{ + caseInsensitive: true }], "comment" : comment, diff --git a/lib/ace/mode/diff.js b/lib/ace/mode/diff.js index 743b4e2d..9021a5ff 100644 --- a/lib/ace/mode/diff.js +++ b/lib/ace/mode/diff.js @@ -38,8 +38,8 @@ var HighlightRules = require("./diff_highlight_rules").DiffHighlightRules; var FoldMode = require("./folding/diff").FoldMode; var Mode = function() { - this.$tokenizer = new Tokenizer(new HighlightRules().getRules(), "i"); - this.foldingRules = new FoldMode(["diff", "index", "\\+{3}", "@@|\\*{5}"], "i"); + this.$tokenizer = new Tokenizer(new HighlightRules().getRules()); + this.foldingRules = new FoldMode(["diff", "index", "\\+{3}", "@@|\\*{5}"], "i"); }; oop.inherits(Mode, TextMode); diff --git a/lib/ace/mode/diff_highlight_rules.js b/lib/ace/mode/diff_highlight_rules.js index b91fb867..609d4f0f 100644 --- a/lib/ace/mode/diff_highlight_rules.js +++ b/lib/ace/mode/diff_highlight_rules.js @@ -92,7 +92,8 @@ var DiffHighlightRules = function() { regex: "\\s*$", token: "invalid" }, { - defaultToken: "invisible" + defaultToken: "invisible", + caseInsensitive: true } ] }; diff --git a/lib/ace/mode/less.js b/lib/ace/mode/less.js index 3a2ce733..ee07747c 100644 --- a/lib/ace/mode/less.js +++ b/lib/ace/mode/less.js @@ -40,7 +40,7 @@ var CssBehaviour = require("./behaviour/css").CssBehaviour; var CStyleFoldMode = require("./folding/cstyle").FoldMode; var Mode = function() { - this.$tokenizer = new Tokenizer(new LessHighlightRules().getRules(), "i"); + this.$tokenizer = new Tokenizer(new LessHighlightRules().getRules()); this.$outdent = new MatchingBraceOutdent(); this.$behaviour = new CssBehaviour(); this.foldingRules = new CStyleFoldMode(); diff --git a/lib/ace/mode/less_highlight_rules.js b/lib/ace/mode/less_highlight_rules.js index ce494514..d39bdeae 100644 --- a/lib/ace/mode/less_highlight_rules.js +++ b/lib/ace/mode/less_highlight_rules.js @@ -247,6 +247,8 @@ var LessHighlightRules = function() { }, { token : "text", regex : "\\s+" + }, { + caseInsensitive: true } ], "comment" : [ diff --git a/lib/ace/mode/scss.js b/lib/ace/mode/scss.js index a0f4826f..48d892ae 100644 --- a/lib/ace/mode/scss.js +++ b/lib/ace/mode/scss.js @@ -40,7 +40,7 @@ var CssBehaviour = require("./behaviour/css").CssBehaviour; var CStyleFoldMode = require("./folding/cstyle").FoldMode; var Mode = function() { - this.$tokenizer = new Tokenizer(new ScssHighlightRules().getRules(), "i"); + this.$tokenizer = new Tokenizer(new ScssHighlightRules().getRules()); this.$outdent = new MatchingBraceOutdent(); this.$behaviour = new CssBehaviour(); this.foldingRules = new CStyleFoldMode(); diff --git a/lib/ace/mode/scss_highlight_rules.js b/lib/ace/mode/scss_highlight_rules.js index 264416f6..e7ab950d 100644 --- a/lib/ace/mode/scss_highlight_rules.js +++ b/lib/ace/mode/scss_highlight_rules.js @@ -249,6 +249,8 @@ var ScssHighlightRules = function() { }, { token : "text", regex : "\\s+" + }, { + caseInsensitive: true } ], "comment" : [ diff --git a/lib/ace/tokenizer.js b/lib/ace/tokenizer.js index 628b3a29..b94b53fe 100644 --- a/lib/ace/tokenizer.js +++ b/lib/ace/tokenizer.js @@ -43,15 +43,10 @@ var MAX_TOKEN_COUNT = 1000; /** * Constructs a new tokenizer based on the given rules and flags. * @param {Object} rules The highlighting rules - * @param {String} flag Any additional regular expression flags to pass (like "i" for case insensitive) - * - * - * * * @constructor **/ -var Tokenizer = function(rules, flag) { - flag = flag ? "g" + flag : "g"; +var Tokenizer = function(rules) { this.states = rules; this.regExps = {}; @@ -61,13 +56,17 @@ var Tokenizer = function(rules, flag) { var ruleRegExps = []; var matchTotal = 0; var mapping = this.matchMappings[key] = {defaultToken: "text"}; + var flag = "g"; for (var i = 0; i < state.length; i++) { var rule = state[i]; - if (rule.defaultToken) { + if (rule.defaultToken) mapping.defaultToken = rule.defaultToken; + if (rule.caseInsensitive) + flag = "gi"; + if (rule.regex == null) continue; - } + if (rule.regex instanceof RegExp) rule.regex = rule.regex.toString().slice(1, -1); From 0f71bb2f0099dfcd5614988f9a6516b02e95ec1f Mon Sep 17 00:00:00 2001 From: nightwing Date: Sat, 9 Feb 2013 14:14:36 +0400 Subject: [PATCH 05/16] fix highlighting of c# strings --- lib/ace/mode/csharp_highlight_rules.js | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/ace/mode/csharp_highlight_rules.js b/lib/ace/mode/csharp_highlight_rules.js index bdc6a393..c18be8ea 100644 --- a/lib/ace/mode/csharp_highlight_rules.js +++ b/lib/ace/mode/csharp_highlight_rules.js @@ -30,11 +30,17 @@ var CSharpHighlightRules = function() { token : "string.regexp", regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" }, { - token : "string", // single line - regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + token : "string", // character + regex : /'(?:.|\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n]))'/ }, { - token : "string", // single line - regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + token : "string", start : '"', end : '"|$', next: [ + {token: "constant.language.escape", regex: /\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n])/}, + {token: "invalid", regex: /\\./} + ] + }, { + token : "string", start : '@"', end : '"', next:[ + {token: "constant.language.escape", regex: '""'} + ] }, { token : "constant.numeric", // hex regex : "0[xX][0-9a-fA-F]+\\b" @@ -46,8 +52,6 @@ var CSharpHighlightRules = function() { regex : "(?:true|false)\\b" }, { token : keywordMapper, - // TODO: Unicode escape sequences - // TODO: Unicode identifiers regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" }, { token : "keyword.operator", @@ -80,6 +84,7 @@ var CSharpHighlightRules = function() { this.embedRules(DocCommentHighlightRules, "doc-", [ DocCommentHighlightRules.getEndRule("start") ]); + this.normalizeRules(); }; oop.inherits(CSharpHighlightRules, TextHighlightRules); From 0c318fa8c0f820f980eedaef410c5ad78fc6082e Mon Sep 17 00:00:00 2001 From: nightwing Date: Sat, 9 Feb 2013 19:14:22 +0400 Subject: [PATCH 06/16] tweak mode_creator --- demo/kitchen-sink/util.js | 8 ++++-- lib/ace/tokenizer_dev.js | 20 ++++++++++--- tool/mode_creator.html | 39 +++++++++++++++++++++++-- tool/mode_creator.js | 60 +++++++++++++++++++++++++++++++++++++-- 4 files changed, 116 insertions(+), 11 deletions(-) diff --git a/demo/kitchen-sink/util.js b/demo/kitchen-sink/util.js index 13460257..28525e1a 100644 --- a/demo/kitchen-sink/util.js +++ b/demo/kitchen-sink/util.js @@ -40,6 +40,10 @@ var Renderer = require("ace/virtual_renderer").VirtualRenderer; var Editor = require("ace/editor").Editor; var MultiSelect = require("ace/multi_select").MultiSelect; +exports.createEditor = function(el) { + return new Editor(new Renderer(el)); +} + exports.createSplitEditor = function(el) { if (typeof(el) == "string") el = document.getElementById(el); @@ -54,8 +58,8 @@ exports.createSplitEditor = function(el) { el.style.position = "relative"; var split = {$container: el}; - split.editor0 = split[0] = new Editor(new Renderer(e0, require("ace/theme/textmate"))); - split.editor1 = split[1] = new Editor(new Renderer(e1, require("ace/theme/textmate"))); + split.editor0 = split[0] = new Editor(new Renderer(e0)); + split.editor1 = split[1] = new Editor(new Renderer(e1)); split.splitter = s; MultiSelect(split.editor0); diff --git a/lib/ace/tokenizer_dev.js b/lib/ace/tokenizer_dev.js index 2ec56692..5b5fa9de 100644 --- a/lib/ace/tokenizer_dev.js +++ b/lib/ace/tokenizer_dev.js @@ -30,13 +30,15 @@ define(function(require, exports, module) { +// tokenizing lines longer than this makes editor very slow +var MAX_TOKEN_COUNT = 1000; /* * version of Tokenizer with additional logging * and infinite loop checks * can be used for developing/testing new modes **/ -var Tokenizer = function(rules, flag) { - flag = flag ? "g" + flag : "g"; + +var Tokenizer = function(rules) { this.states = rules; this.regExps = {}; @@ -46,13 +48,17 @@ var Tokenizer = function(rules, flag) { var ruleRegExps = []; var matchTotal = 0; var mapping = this.matchMappings[key] = {defaultToken: "default.text"}; + var flag = "g"; for (var i = 0; i < state.length; i++) { var rule = state[i]; - if (rule.defaultToken) { + if (rule.defaultToken) mapping.defaultToken = rule.defaultToken; + if (rule.caseInsensitive) + flag = "gi"; + if (rule.regex == null) continue; - } + if (rule.regex instanceof RegExp) rule.regex = rule.regex.toString().slice(1, -1); @@ -241,6 +247,12 @@ var Tokenizer = function(rules, flag) { break; lastIndex = index; + + if (tokens.length > MAX_TOKEN_COUNT) { + token.value += line.substr(lastIndex); + currentState = "start" + break; + } } if (token.type) diff --git a/tool/mode_creator.html b/tool/mode_creator.html index de459d66..e2db56af 100644 --- a/tool/mode_creator.html +++ b/tool/mode_creator.html @@ -19,7 +19,35 @@ border-bottom: solid 1px; } .separator-h { - padding: 0 20px; + padding: 0 20px; + } + #closeBtn { + background: rgba(245, 146, 146, 0.5); + border: 1px solid #F48A8A; + border-radius: 50%; + padding: 7px; + position: absolute; + right: -8px; + top: -8px; + z-index: 1000; + } + #closeBtn:hover { + background: rgba(245, 146, 146, 0.9); + } + #console{ + /border: 1px solid lightblue; + bottom: 0; + height: 80px; + margin: 0 4%; + position: absolute; + width: 92%; + z-index: 1000; + box-shadow: 0 0 1px 2px gray + } + #consoleEditor{ + height: 100%; + position: relative; + width: 100%; } @@ -29,14 +57,17 @@
+