Add autocompletion for language keywords

Conflicts:

	lib/ace/edit_session.js
This commit is contained in:
Garen Torikian 2012-12-27 01:51:11 -08:00 • committed by nightwing
commit 69e41521e6
33 changed files with 182 additions and 90 deletions

View file

@ -243,7 +243,7 @@ var Autocomplete = function() {
editor.on("changeSelection", this.$changeListener); editor.on("changeSelection", this.$changeListener);
editor.on("blur", this.$blurListener); editor.on("blur", this.$blurListener);
worker.attachToDocument(editor.session.getDocument(), {cursor: editor.getCursorPosition()}, true); worker.attachToDocument(editor.session.getDocument(), {cursor: editor.getCursorPosition(), keywords: editor.session.getMode().$keywordList}, true);
worker.on("complete", function(data) { worker.on("complete", function(data) {
var matches = data.data.matches; var matches = data.data.matches;

View file

@ -74,14 +74,14 @@ oop.inherits(AutocompleteWorker, Mirror);
var doc = this.doc.getValue(); var doc = this.doc.getValue();
var pos = this.data.cursor; var pos = this.data.cursor;
var part = SyntaxDetector.getContextSyntaxPart(this.doc, this.data.cursor, "javascript"); var part = SyntaxDetector.getContextSyntaxPart(this.doc, this.data.cursor);
var language = part.language; var language = part.language;
var currentPos = { line: pos.row, col: pos.column }; var currentPos = { line: pos.row, col: pos.column };
var currentNode = null; var currentNode = null;
var matches = [], ast = null; var matches = [], ast = null;
completer.complete(_self.doc, ast, this.data.cursor, currentNode, function(identifier, completions) { completer.complete(_self.doc, ast, this.data.cursor, this.data.keywords, currentNode, function(identifier, completions) {
if (completions) if (completions)
matches = matches.concat(completions); matches = matches.concat(completions);
removeDuplicateMatches(matches); removeDuplicateMatches(matches);

View file

@ -1,6 +1,7 @@
define(function(require, exports, module) { define(function(require, exports, module) {
var completeUtil = require("./complete_util"); var completeUtil = require("./complete_util");
var SPLIT_REGEX = /[^a-zA-Z_0-9\$]+/; var SPLIT_REGEX = /[^a-zA-Z_0-9\$]+/;
var MAX_SCORE = 1000000;
var completer = module.exports; var completer = module.exports;
@ -9,7 +10,7 @@ define(function(require, exports, module) {
}; };
// For the current document, gives scores to identifiers not on frequency, but on distance from the current prefix // For the current document, gives scores to identifiers not on frequency, but on distance from the current prefix
function wordDistanceAnalyzer(doc, pos, prefix) { function wordDistanceAnalyzer(doc, pos, prefix, keywords) {
var text = doc.getValue().trim(); var text = doc.getValue().trim();
// Determine cursor's word index // Determine cursor's word index
@ -32,24 +33,28 @@ define(function(require, exports, module) {
var distance = Math.max(prefixPosition, i) - Math.min(prefixPosition, i); var distance = Math.max(prefixPosition, i) - Math.min(prefixPosition, i);
// Score substracted from 100000 to force descending ordering // Score substracted from 100000 to force descending ordering
if (Object.prototype.hasOwnProperty.call(identDict, ident)) if (Object.prototype.hasOwnProperty.call(identDict, ident))
identDict[ident] = Math.max(1000000-distance, identDict[ident]); identDict[ident] = Math.max(MAX_SCORE-distance, identDict[ident]);
else else
identDict[ident] = 1000000-distance; identDict[ident] = MAX_SCORE-distance;
} }
for (var k = 0, l = keywords.length; k < l; k++) {
identDict[keywords[k]] = MAX_SCORE;
}
return identDict; return identDict;
} }
function analyze(doc, pos) { function analyze(doc, pos, keywords) {
var line = doc.getLine(pos.row); var line = doc.getLine(pos.row);
var identifier = completeUtil.retrievePrecedingIdentifier(line, pos.column); var identifier = completeUtil.retrievePrecedingIdentifier(line, pos.column);
var analysisCache = wordDistanceAnalyzer(doc, pos, identifier); var analysisCache = wordDistanceAnalyzer(doc, pos, identifier, keywords);
return analysisCache; return analysisCache;
} }
completer.complete = function(doc, fullAst, pos, currentNode, callback) { completer.complete = function(doc, fullAst, pos, keywords, currentNode, callback) {
var identDict = analyze(doc, pos); var identDict = analyze(doc, pos, keywords);
var line = doc.getLine(pos.row); var line = doc.getLine(pos.row);
var identifier = completeUtil.retrievePrecedingIdentifier(line, pos.column); var identifier = completeUtil.retrievePrecedingIdentifier(line, pos.column);

View file

@ -39,7 +39,9 @@ var TextMode = require("./text").Mode;
var oop = require("../lib/oop"); var oop = require("../lib/oop");
function Mode() { function Mode() {
this.$tokenizer = new Tokenizer(new Rules().getRules()); var highlighter = new Rules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = new Rules(rules.$keywordList);
this.foldingRules = new FoldMode(); this.foldingRules = new FoldMode();
} }

View file

@ -41,9 +41,13 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode; var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new c_cppHighlightRules().getRules()); var highlighter = new c_cppHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new MatchingBraceOutdent(); this.$outdent = new MatchingBraceOutdent();
this.$behaviour = new CstyleBehaviour(); this.$behaviour = new CstyleBehaviour();
this.$keywordList = highlighter.$keywordList;
this.foldingRules = new CStyleFoldMode(); this.foldingRules = new CStyleFoldMode();
}; };
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);

View file

@ -39,7 +39,9 @@ var MatchingParensOutdent = require("./matching_parens_outdent").MatchingParensO
var Range = require("../range").Range; var Range = require("../range").Range;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new ClojureHighlightRules().getRules()); var highlighter = new ClojureHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = new Rules(rules.$keywordList);
this.$outdent = new MatchingParensOutdent(); this.$outdent = new MatchingParensOutdent();
}; };
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);

View file

@ -41,8 +41,10 @@ var WorkerClient = require("../worker/worker_client").WorkerClient;
var oop = require("../lib/oop"); var oop = require("../lib/oop");
function Mode() { function Mode() {
this.$tokenizer = new Tokenizer(new Rules().getRules()); var highlighter = new Rules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new Outdent(); this.$outdent = new Outdent();
this.$keywordList = new Rules(rules.$keywordList);
this.foldingRules = new FoldMode(); this.foldingRules = new FoldMode();
} }

View file

@ -10,9 +10,11 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode; var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new CSharpHighlightRules().getRules()); var highlighter = new CSharpHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new MatchingBraceOutdent(); this.$outdent = new MatchingBraceOutdent();
this.$behaviour = new CstyleBehaviour(); this.$behaviour = new CstyleBehaviour();
this.$keywordList = highlighter.$keywordList;
this.foldingRules = new CStyleFoldMode(); this.foldingRules = new CStyleFoldMode();
}; };
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);

View file

@ -41,9 +41,11 @@ var CssBehaviour = require("./behaviour/css").CssBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode; var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules()); var highlighter = new CssHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new MatchingBraceOutdent(); this.$outdent = new MatchingBraceOutdent();
this.$behaviour = new CssBehaviour(); this.$behaviour = new CssBehaviour();
this.$keywordList = highlighter.$keywordList;
this.foldingRules = new CStyleFoldMode(); this.foldingRules = new CStyleFoldMode();
}; };
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);

View file

@ -52,6 +52,7 @@ var Mode = function() {
this.foldingRules = new CStyleFoldMode(); this.foldingRules = new CStyleFoldMode();
this.$tokenizer = new Tokenizer(highlighter.getRules()); this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
}; };
oop.inherits(Mode, CMode); oop.inherits(Mode, CMode);

View file

@ -41,9 +41,12 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode; var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new glslHighlightRules().getRules()); var highlighter = new glslHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new MatchingBraceOutdent(); this.$outdent = new MatchingBraceOutdent();
this.$behaviour = new CstyleBehaviour(); this.$behaviour = new CstyleBehaviour();
this.$keywordList = highlighter.$keywordList;
this.foldingRules = new CStyleFoldMode(); this.foldingRules = new CStyleFoldMode();
}; };
oop.inherits(Mode, CMode); oop.inherits(Mode, CMode);

View file

@ -1,21 +1,24 @@
define(function(require, exports, module) { define(function(require, exports, module) {
var oop = require("../lib/oop"); var oop = require("../lib/oop");
var TextMode = require("./text").Mode; var TextMode = require("./text").Mode;
var Tokenizer = require("../tokenizer").Tokenizer; var Tokenizer = require("../tokenizer").Tokenizer;
var GolangHighlightRules = require("./golang_highlight_rules").GolangHighlightRules; var GolangHighlightRules = require("./golang_highlight_rules").GolangHighlightRules;
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode; var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new GolangHighlightRules().getRules()); var highlighter = new GolangHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
this.$outdent = new MatchingBraceOutdent(); this.$outdent = new MatchingBraceOutdent();
this.foldingRules = new CStyleFoldMode(); this.foldingRules = new CStyleFoldMode();
}; };
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);
(function() { (function() {
this.lineCommentStart = "//"; this.lineCommentStart = "//";
this.blockComment = {start: "/*", end: "*/"}; this.blockComment = {start: "/*", end: "*/"};
@ -49,7 +52,7 @@ oop.inherits(Mode, TextMode);
this.$outdent.autoOutdent(doc, row); this.$outdent.autoOutdent(doc, row);
}; };
}).call(Mode.prototype); }).call(Mode.prototype);
exports.Mode = Mode; exports.Mode = Mode;
}); });

View file

@ -8,7 +8,9 @@ var GroovyHighlightRules = require("./groovy_highlight_rules").GroovyHighlightRu
var Mode = function() { var Mode = function() {
JavaScriptMode.call(this); JavaScriptMode.call(this);
this.$tokenizer = new Tokenizer(new GroovyHighlightRules().getRules()); var highlighter = new GroovyHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
}; };
oop.inherits(Mode, JavaScriptMode); oop.inherits(Mode, JavaScriptMode);

View file

@ -10,9 +10,12 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode; var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new HaxeHighlightRules().getRules()); var highlighter = new HaxeHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new MatchingBraceOutdent(); this.$outdent = new MatchingBraceOutdent();
this.$behaviour = new CstyleBehaviour(); this.$behaviour = new CstyleBehaviour();
this.$keywordList = highlighter.$keywordList;
this.foldingRules = new CStyleFoldMode(); this.foldingRules = new CStyleFoldMode();
}; };
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);

View file

@ -8,8 +8,10 @@ var JavaHighlightRules = require("./java_highlight_rules").JavaHighlightRules;
var Mode = function() { var Mode = function() {
JavaScriptMode.call(this); JavaScriptMode.call(this);
var highlighter = new JavaHighlightRules();
this.$tokenizer = new Tokenizer(new JavaHighlightRules().getRules()); this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
}; };
oop.inherits(Mode, JavaScriptMode); oop.inherits(Mode, JavaScriptMode);

View file

@ -42,9 +42,12 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode; var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules()); var highlighter = new JavaScriptHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new MatchingBraceOutdent(); this.$outdent = new MatchingBraceOutdent();
this.$behaviour = new CstyleBehaviour(); this.$behaviour = new CstyleBehaviour();
this.$keywordList = highlighter.$keywordList;
this.foldingRules = new CStyleFoldMode(); this.foldingRules = new CStyleFoldMode();
}; };
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);

View file

@ -38,7 +38,10 @@ var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutd
var Range = require("../range").Range; var Range = require("../range").Range;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new LiquidHighlightRules().getRules()); var highlighter = new LiquidHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
this.$outdent = new MatchingBraceOutdent(); this.$outdent = new MatchingBraceOutdent();
}; };
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);

View file

@ -45,6 +45,7 @@ var Mode = function() {
var highlighter = new LispHighlightRules(); var highlighter = new LispHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules()); this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
}; };
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);

View file

@ -40,8 +40,11 @@ var Range = require("../range").Range;
var WorkerClient = require("../worker/worker_client").WorkerClient; var WorkerClient = require("../worker/worker_client").WorkerClient;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new LuaHighlightRules().getRules()); var highlighter = new LuaHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.foldingRules = new LuaFoldMode(); this.foldingRules = new LuaFoldMode();
this.$keywordList = highlighter.$keywordList;
}; };
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);

View file

@ -51,6 +51,7 @@ var Mode = function() {
this.foldingRules = new FoldMode(); this.foldingRules = new FoldMode();
this.$tokenizer = new Tokenizer(highlighter.getRules()); this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
}; };
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);

View file

@ -39,8 +39,11 @@ var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutd
var Range = require("../range").Range; var Range = require("../range").Range;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new OcamlHighlightRules().getRules()); var highlighter = new OcamlHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new MatchingBraceOutdent(); this.$outdent = new MatchingBraceOutdent();
this.$keywordList = highlighter.$keywordList;
}; };
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);

View file

@ -40,9 +40,12 @@ var Range = require("../range").Range;
var CStyleFoldMode = require("./folding/cstyle").FoldMode; var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new PerlHighlightRules().getRules()); var highlighter = new PerlHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new MatchingBraceOutdent(); this.$outdent = new MatchingBraceOutdent();
this.foldingRules = new CStyleFoldMode({start: "^=(begin|item)\\b", end: "^=(cut)\\b"}); this.foldingRules = new CStyleFoldMode({start: "^=(begin|item)\\b", end: "^=(cut)\\b"});
this.$keywordList = highlighter.$keywordList;
}; };
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);

View file

@ -30,18 +30,21 @@
define(function(require, exports, module) { define(function(require, exports, module) {
var oop = require("../lib/oop"); var oop = require("../lib/oop");
var TextMode = require("../mode/text").Mode; var TextMode = require("../mode/text").Mode;
var Tokenizer = require("../tokenizer").Tokenizer; var Tokenizer = require("../tokenizer").Tokenizer;
var PgsqlHighlightRules = require("./pgsql_highlight_rules").PgsqlHighlightRules; var PgsqlHighlightRules = require("./pgsql_highlight_rules").PgsqlHighlightRules;
var Range = require("../range").Range; var Range = require("../range").Range;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new PgsqlHighlightRules().getRules()); var highlighter = new PgsqlHighlightRules();
};
oop.inherits(Mode, TextMode);
(function() { this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
};
oop.inherits(Mode, TextMode);
(function() {
this.lineCommentStart = "--"; this.lineCommentStart = "--";
this.blockComment = {start: "/*", end: "*/"}; this.blockComment = {start: "/*", end: "*/"};
@ -53,7 +56,7 @@ oop.inherits(Mode, TextMode);
} }
} }
}).call(Mode.prototype); }).call(Mode.prototype);
exports.Mode = Mode; exports.Mode = Mode;
}); });

View file

@ -10,7 +10,10 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode; var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new PowershellHighlightRules().getRules()); var highlighter = new PowershellHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
this.$outdent = new MatchingBraceOutdent(); this.$outdent = new MatchingBraceOutdent();
this.$behaviour = new CstyleBehaviour(); this.$behaviour = new CstyleBehaviour();
this.foldingRules = new CStyleFoldMode({start: "^\\s*(<#)", end: "^[#\\s]>\\s*$"}); this.foldingRules = new CStyleFoldMode({start: "^\\s*(<#)", end: "^[#\\s]>\\s*$"});

View file

@ -39,7 +39,9 @@ var PythonFoldMode = require("./folding/pythonic").FoldMode;
var Range = require("../range").Range; var Range = require("../range").Range;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new PythonHighlightRules().getRules()); var highlighter = new PythonHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
this.foldingRules = new PythonFoldMode("\\:"); this.foldingRules = new PythonFoldMode("\\:");
}; };
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);

View file

@ -40,7 +40,10 @@ var Range = require("../range").Range;
var FoldMode = require("./folding/coffee").FoldMode; var FoldMode = require("./folding/coffee").FoldMode;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new RubyHighlightRules().getRules()); var highlighter = new RubyHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
this.$outdent = new MatchingBraceOutdent(); this.$outdent = new MatchingBraceOutdent();
this.foldingRules = new FoldMode(); this.foldingRules = new FoldMode();
}; };

View file

@ -41,7 +41,10 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode; var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new scadHighlightRules().getRules()); var highlighter = new scadHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
this.$outdent = new MatchingBraceOutdent(); this.$outdent = new MatchingBraceOutdent();
this.$behaviour = new CstyleBehaviour(); this.$behaviour = new CstyleBehaviour();
this.foldingRules = new CStyleFoldMode(); this.foldingRules = new CStyleFoldMode();

View file

@ -9,7 +9,9 @@ var ScalaHighlightRules = require("./scala_highlight_rules").ScalaHighlightRules
var Mode = function() { var Mode = function() {
JavaScriptMode.call(this); JavaScriptMode.call(this);
this.$tokenizer = new Tokenizer(new ScalaHighlightRules().getRules()); var highlighter = new ScalaHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
}; };
oop.inherits(Mode, JavaScriptMode); oop.inherits(Mode, JavaScriptMode);

View file

@ -38,7 +38,10 @@ var ShHighlightRules = require("./sh_highlight_rules").ShHighlightRules;
var Range = require("../range").Range; var Range = require("../range").Range;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new ShHighlightRules().getRules()); var highlighter = new ShHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
}; };
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);

View file

@ -38,7 +38,10 @@ var SqlHighlightRules = require("./sql_highlight_rules").SqlHighlightRules;
var Range = require("../range").Range; var Range = require("../range").Range;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new SqlHighlightRules().getRules()); var highlighter = new SqlHighlightRules();
this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
}; };
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);

View file

@ -51,6 +51,7 @@ var Mode = function() {
this.foldingRules = new FoldMode(); this.foldingRules = new FoldMode();
this.$tokenizer = new Tokenizer(highlighter.getRules()); this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$keywordList = highlighter.$keywordList;
}; };
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);

View file

@ -326,6 +326,24 @@ var Mode = function() {
} }
}; };
this.getKeywords = function() {
var rules = this.$tokenizer.rules;
var keywords = [];
for (var rule in rules) {
var ruleItr = rules[rule];
for (var r = 0, l = ruleItr.length; r < l; r++) {
if (typeof ruleItr[r].token === "string") {
if (/keyword/.test(ruleItr[r].token))
keywords.push(ruleItr[r].regex);
else if (/support/.test(ruleItr[r].token))
keywords.push(ruleItr[r].regex);
}
}
}
return keywords.concat(this.$keywordList || []);
};
}).call(Mode.prototype); }).call(Mode.prototype);
exports.Mode = Mode; exports.Mode = Mode;

View file

@ -204,6 +204,7 @@ var TextHighlightRules = function() {
for (var i = list.length; i--; ) for (var i = list.length; i--; )
keywords[list[i]] = className; keywords[list[i]] = className;
}); });
this.$keywordList = Object.keys(keywords);
map = null; map = null;
return ignoreCase return ignoreCase
? function(value) {return keywords[value.toLowerCase()] || defaultToken } ? function(value) {return keywords[value.toLowerCase()] || defaultToken }