Merge pull request #1117 from jjallaire/r_highlighting
Add R highlighting from RStudio (plus other dependencies)
This commit is contained in:
commit
220bea7fa0
14 changed files with 865 additions and 0 deletions
135
lib/ace/mode/r.js
Normal file
135
lib/ace/mode/r.js
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
/*
|
||||
* r.js
|
||||
*
|
||||
* Copyright (C) 2009-11 by RStudio, Inc.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Ajax.org B.V.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2010
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* This program is licensed to you under the terms of version 3 of the
|
||||
* GNU Affero General Public License. This program is distributed WITHOUT
|
||||
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
|
||||
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
|
||||
*
|
||||
*/
|
||||
define(function(require, exports, module) {
|
||||
"use strict";
|
||||
|
||||
var Editor = require("ace/editor").Editor;
|
||||
var EditSession = require("ace/edit_session").EditSession;
|
||||
var Range = require("ace/range").Range;
|
||||
var oop = require("ace/lib/oop");
|
||||
var TextMode = require("ace/mode/text").Mode;
|
||||
var Tokenizer = require("ace/tokenizer").Tokenizer;
|
||||
var TextHighlightRules = require("ace/mode/text_highlight_rules")
|
||||
.TextHighlightRules;
|
||||
var RHighlightRules = require("./r_highlight_rules").RHighlightRules;
|
||||
var MatchingBraceOutdent = require("ace/mode/matching_brace_outdent").MatchingBraceOutdent;
|
||||
var unicode = require("ace/unicode");
|
||||
|
||||
var Mode = function()
|
||||
{
|
||||
this.$tokenizer = new Tokenizer(new RHighlightRules().getRules());
|
||||
this.$outdent = new MatchingBraceOutdent();
|
||||
};
|
||||
oop.inherits(Mode, TextMode);
|
||||
|
||||
(function()
|
||||
{
|
||||
this.tokenRe = new RegExp("^["
|
||||
+ unicode.packages.L
|
||||
+ unicode.packages.Mn + unicode.packages.Mc
|
||||
+ unicode.packages.Nd
|
||||
+ unicode.packages.Pc + "._]+", "g"
|
||||
);
|
||||
|
||||
this.nonTokenRe = new RegExp("^(?:[^"
|
||||
+ unicode.packages.L
|
||||
+ unicode.packages.Mn + unicode.packages.Mc
|
||||
+ unicode.packages.Nd
|
||||
+ unicode.packages.Pc + "._]|\s])+", "g"
|
||||
);
|
||||
|
||||
this.$complements = {
|
||||
"(": ")",
|
||||
"[": "]",
|
||||
'"': '"',
|
||||
"'": "'",
|
||||
"{": "}"
|
||||
};
|
||||
this.$reOpen = /^[(["'{]$/;
|
||||
this.$reClose = /^[)\]"'}]$/;
|
||||
|
||||
this.getNextLineIndent = function(state, line, tab, tabSize, row)
|
||||
{
|
||||
return this.codeModel.getNextLineIndent(row, line, state, tab, tabSize);
|
||||
};
|
||||
|
||||
this.allowAutoInsert = this.smartAllowAutoInsert;
|
||||
|
||||
this.checkOutdent = function(state, line, input) {
|
||||
if (! /^\s+$/.test(line))
|
||||
return false;
|
||||
|
||||
return /^\s*[\{\}\)]/.test(input);
|
||||
};
|
||||
|
||||
this.getIndentForOpenBrace = function(openBracePos)
|
||||
{
|
||||
return this.codeModel.getIndentForOpenBrace(openBracePos);
|
||||
};
|
||||
|
||||
this.autoOutdent = function(state, doc, row) {
|
||||
if (row == 0)
|
||||
return 0;
|
||||
|
||||
var line = doc.getLine(row);
|
||||
|
||||
var match = line.match(/^(\s*[\}\)])/);
|
||||
if (match)
|
||||
{
|
||||
var column = match[1].length;
|
||||
var openBracePos = doc.findMatchingBracket({row: row, column: column});
|
||||
|
||||
if (!openBracePos || openBracePos.row == row) return 0;
|
||||
|
||||
var indent = this.codeModel.getIndentForOpenBrace(openBracePos);
|
||||
doc.replace(new Range(row, 0, row, column-1), indent);
|
||||
}
|
||||
|
||||
match = line.match(/^(\s*\{)/);
|
||||
if (match)
|
||||
{
|
||||
var column = match[1].length;
|
||||
var indent = this.codeModel.getBraceIndent(row-1);
|
||||
doc.replace(new Range(row, 0, row, column-1), indent);
|
||||
}
|
||||
};
|
||||
|
||||
this.$getIndent = function(line) {
|
||||
var match = line.match(/^(\s+)/);
|
||||
if (match) {
|
||||
return match[1];
|
||||
}
|
||||
|
||||
return "";
|
||||
};
|
||||
|
||||
this.transformAction = function(state, action, editor, session, text) {
|
||||
if (action === 'insertion' && text === "\n") {
|
||||
|
||||
// If newline in a doxygen comment, continue the comment
|
||||
var pos = editor.getSelectionRange().start;
|
||||
var match = /^((\s*#+')\s*)/.exec(session.doc.getLine(pos.row));
|
||||
if (match && editor.getSelectionRange().start.column >= match[2].length) {
|
||||
return {text: "\n" + match[1]};
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
}).call(Mode.prototype);
|
||||
exports.Mode = Mode;
|
||||
});
|
||||
190
lib/ace/mode/r_highlight_rules.js
Normal file
190
lib/ace/mode/r_highlight_rules.js
Normal file
|
|
@ -0,0 +1,190 @@
|
|||
/*
|
||||
* r_highlight_rules.js
|
||||
*
|
||||
* Copyright (C) 2009-11 by RStudio, Inc.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Ajax.org B.V.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2010
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* This program is licensed to you under the terms of version 3 of the
|
||||
* GNU Affero General Public License. This program is distributed WITHOUT
|
||||
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
|
||||
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
|
||||
*
|
||||
*/
|
||||
define(function(require, exports, module)
|
||||
{
|
||||
|
||||
var oop = require("ace/lib/oop");
|
||||
var lang = require("ace/lib/lang");
|
||||
var TextHighlightRules = require("ace/mode/text_highlight_rules")
|
||||
.TextHighlightRules;
|
||||
var TexHighlightRules = require("./tex_highlight_rules").TexHighlightRules;
|
||||
|
||||
var RHighlightRules = function()
|
||||
{
|
||||
|
||||
var keywords = lang.arrayToMap(
|
||||
("function|if|in|break|next|repeat|else|for|return|switch|while|try|tryCatch|stop|warning|require|library|attach|detach|source|setMethod|setGeneric|setGroupGeneric|setClass")
|
||||
.split("|")
|
||||
);
|
||||
|
||||
var buildinConstants = lang.arrayToMap(
|
||||
("NULL|NA|TRUE|FALSE|T|F|Inf|NaN|NA_integer_|NA_real_|NA_character_|" +
|
||||
"NA_complex_").split("|")
|
||||
);
|
||||
|
||||
// regexp must not have capturing parentheses. Use (?:) instead.
|
||||
// regexps are ordered -> the first match is used
|
||||
|
||||
this.$rules = {
|
||||
"start" : [
|
||||
{
|
||||
// Roxygen
|
||||
token : "comment.sectionhead",
|
||||
regex : "#+(?!').*(?:----|====|####)\\s*$"
|
||||
},
|
||||
{
|
||||
// Roxygen
|
||||
token : "comment",
|
||||
regex : "#+'",
|
||||
next : "rd-start"
|
||||
},
|
||||
{
|
||||
token : "comment",
|
||||
regex : "#.*$"
|
||||
},
|
||||
{
|
||||
token : "string", // multi line string start
|
||||
regex : '["]',
|
||||
next : "qqstring"
|
||||
},
|
||||
{
|
||||
token : "string", // multi line string start
|
||||
regex : "[']",
|
||||
next : "qstring"
|
||||
},
|
||||
{
|
||||
token : "constant.numeric", // hex
|
||||
regex : "0[xX][0-9a-fA-F]+[Li]?\\b"
|
||||
},
|
||||
{
|
||||
token : "constant.numeric", // explicit integer
|
||||
regex : "\\d+L\\b"
|
||||
},
|
||||
{
|
||||
token : "constant.numeric", // number
|
||||
regex : "\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b"
|
||||
},
|
||||
{
|
||||
token : "constant.numeric", // number with leading decimal
|
||||
regex : "\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b"
|
||||
},
|
||||
{
|
||||
token : "constant.language.boolean",
|
||||
regex : "(?:TRUE|FALSE|T|F)\\b"
|
||||
},
|
||||
{
|
||||
token : "identifier",
|
||||
regex : "`.*?`"
|
||||
},
|
||||
{
|
||||
token : function(value)
|
||||
{
|
||||
if (keywords[value])
|
||||
return "keyword";
|
||||
else if (buildinConstants[value])
|
||||
return "constant.language";
|
||||
else if (value == '...' || value.match(/^\.\.\d+$/))
|
||||
return "variable.language";
|
||||
else
|
||||
return "identifier";
|
||||
},
|
||||
regex : "[a-zA-Z.][a-zA-Z0-9._]*\\b"
|
||||
},
|
||||
{
|
||||
token : "keyword.operator",
|
||||
regex : "%%|>=|<=|==|!=|\\->|<\\-|\\|\\||&&|=|\\+|\\-|\\*|/|\\^|>|<|!|&|\\||~|\\$|:"
|
||||
},
|
||||
{
|
||||
token : "keyword.operator", // infix operators
|
||||
regex : "%.*?%"
|
||||
},
|
||||
{
|
||||
// Obviously these are neither keywords nor operators, but
|
||||
// labelling them as such was the easiest way to get them
|
||||
// to be colored distinctly from regular text
|
||||
token : "paren.keyword.operator",
|
||||
regex : "[[({]"
|
||||
},
|
||||
{
|
||||
// Obviously these are neither keywords nor operators, but
|
||||
// labelling them as such was the easiest way to get them
|
||||
// to be colored distinctly from regular text
|
||||
token : "paren.keyword.operator",
|
||||
regex : "[\\])}]"
|
||||
},
|
||||
{
|
||||
token : "text",
|
||||
regex : "\\s+"
|
||||
}
|
||||
],
|
||||
"qqstring" : [
|
||||
{
|
||||
token : "string",
|
||||
regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"',
|
||||
next : "start"
|
||||
},
|
||||
{
|
||||
token : "string",
|
||||
regex : '.+'
|
||||
}
|
||||
],
|
||||
"qstring" : [
|
||||
{
|
||||
token : "string",
|
||||
regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'",
|
||||
next : "start"
|
||||
},
|
||||
{
|
||||
token : "string",
|
||||
regex : '.+'
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
var rdRules = new TexHighlightRules("comment").getRules();
|
||||
|
||||
// Make all embedded TeX virtual-comment so they don't interfere with
|
||||
// auto-indent.
|
||||
for (var i = 0; i < rdRules["start"].length; i++) {
|
||||
rdRules["start"][i].token += ".virtual-comment";
|
||||
}
|
||||
|
||||
this.addRules(rdRules, "rd-");
|
||||
this.$rules["rd-start"].unshift({
|
||||
token: "text",
|
||||
regex: "^",
|
||||
next: "start"
|
||||
});
|
||||
this.$rules["rd-start"].unshift({
|
||||
token : "keyword",
|
||||
regex : "@(?!@)[^ ]*"
|
||||
});
|
||||
this.$rules["rd-start"].unshift({
|
||||
token : "comment",
|
||||
regex : "@@"
|
||||
});
|
||||
this.$rules["rd-start"].push({
|
||||
token : "comment",
|
||||
regex : "[^%\\\\[({\\])}]+"
|
||||
});
|
||||
};
|
||||
|
||||
oop.inherits(RHighlightRules, TextHighlightRules);
|
||||
|
||||
exports.RHighlightRules = RHighlightRules;
|
||||
});
|
||||
36
lib/ace/mode/rdoc.js
Normal file
36
lib/ace/mode/rdoc.js
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* rdoc.js
|
||||
*
|
||||
* Copyright (C) 2009-11 by RStudio, Inc.
|
||||
*
|
||||
* This program is licensed to you under the terms of version 3 of the
|
||||
* GNU Affero General Public License. This program is distributed WITHOUT
|
||||
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
|
||||
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
|
||||
*
|
||||
*/
|
||||
define(function(require, exports, module) {
|
||||
"use strict";
|
||||
|
||||
var oop = require("ace/lib/oop");
|
||||
var TextMode = require("ace/mode/text").Mode;
|
||||
var Tokenizer = require("ace/tokenizer").Tokenizer;
|
||||
var TextHighlightRules = require("ace/mode/text_highlight_rules").TextHighlightRules;
|
||||
var RDocHighlightRules = require("./rdoc_highlight_rules").RDocHighlightRules;
|
||||
var MatchingBraceOutdent = require("ace/mode/matching_brace_outdent").MatchingBraceOutdent;
|
||||
|
||||
var Mode = function(suppressHighlighting) {
|
||||
this.$tokenizer = new Tokenizer(new RDocHighlightRules().getRules());
|
||||
this.$outdent = new MatchingBraceOutdent();
|
||||
};
|
||||
oop.inherits(Mode, TextMode);
|
||||
|
||||
(function() {
|
||||
this.getNextLineIndent = function(state, line, tab) {
|
||||
return this.$getIndent(line);
|
||||
};
|
||||
}).call(Mode.prototype);
|
||||
|
||||
exports.Mode = Mode;
|
||||
});
|
||||
99
lib/ace/mode/rdoc_highlight_rules.js
Normal file
99
lib/ace/mode/rdoc_highlight_rules.js
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
/*
|
||||
* rdoc_highlight_rules.js
|
||||
*
|
||||
* Copyright (C) 2009-11 by RStudio, Inc.
|
||||
*
|
||||
* This program is licensed to you under the terms of version 3 of the
|
||||
* GNU Affero General Public License. This program is distributed WITHOUT
|
||||
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
|
||||
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
|
||||
*
|
||||
*/
|
||||
define(function(require, exports, module) {
|
||||
"use strict";
|
||||
|
||||
var oop = require("ace/lib/oop");
|
||||
var lang = require("ace/lib/lang");
|
||||
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||
var LaTeXHighlightRules = require("./latex_highlight_rules");
|
||||
|
||||
var RDocHighlightRules = function() {
|
||||
|
||||
// regexp must not have capturing parentheses. Use (?:) instead.
|
||||
// regexps are ordered -> the first match is used
|
||||
|
||||
this.$rules = {
|
||||
"start" : [
|
||||
{
|
||||
token : "comment",
|
||||
regex : "%.*$"
|
||||
}, {
|
||||
token : "text", // non-command
|
||||
regex : "\\\\[$&%#\\{\\}]"
|
||||
}, {
|
||||
token : "keyword", // command
|
||||
regex : "\\\\(?:name|alias|method|S3method|S4method|item|code|preformatted|kbd|pkg|var|env|option|command|author|email|url|source|cite|acronym|href|code|preformatted|link|eqn|deqn|keyword|usage|examples|dontrun|dontshow|figure|if|ifelse|Sexpr|RdOpts|inputencoding|usepackage)\\b",
|
||||
next : "nospell"
|
||||
}, {
|
||||
token : "keyword", // command
|
||||
regex : "\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])"
|
||||
}, {
|
||||
// Obviously these are neither keywords nor operators, but
|
||||
// labelling them as such was the easiest way to get them
|
||||
// to be colored distinctly from regular text
|
||||
token : "paren.keyword.operator",
|
||||
regex : "[[({]"
|
||||
}, {
|
||||
// Obviously these are neither keywords nor operators, but
|
||||
// labelling them as such was the easiest way to get them
|
||||
// to be colored distinctly from regular text
|
||||
token : "paren.keyword.operator",
|
||||
regex : "[\\])}]"
|
||||
}, {
|
||||
token : "text",
|
||||
regex : "\\s+"
|
||||
}
|
||||
],
|
||||
// This mode is necessary to prevent spell checking, but to keep the
|
||||
// same syntax highlighting behavior.
|
||||
"nospell" : [
|
||||
{
|
||||
token : "comment",
|
||||
regex : "%.*$",
|
||||
next : "start"
|
||||
}, {
|
||||
token : "nospell.text", // non-command
|
||||
regex : "\\\\[$&%#\\{\\}]"
|
||||
}, {
|
||||
token : "keyword", // command
|
||||
regex : "\\\\(?:name|alias|method|S3method|S4method|item|code|preformatted|kbd|pkg|var|env|option|command|author|email|url|source|cite|acronym|href|code|preformatted|link|eqn|deqn|keyword|usage|examples|dontrun|dontshow|figure|if|ifelse|Sexpr|RdOpts|inputencoding|usepackage)\\b"
|
||||
}, {
|
||||
token : "keyword", // command
|
||||
regex : "\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])",
|
||||
next : "start"
|
||||
}, {
|
||||
token : "paren.keyword.operator",
|
||||
regex : "[[({]"
|
||||
}, {
|
||||
token : "paren.keyword.operator",
|
||||
regex : "[\\])]"
|
||||
}, {
|
||||
token : "paren.keyword.operator",
|
||||
regex : "}",
|
||||
next : "start"
|
||||
}, {
|
||||
token : "nospell.text",
|
||||
regex : "\\s+"
|
||||
}, {
|
||||
token : "nospell.text",
|
||||
regex : "\\w+"
|
||||
}
|
||||
]
|
||||
};
|
||||
};
|
||||
|
||||
oop.inherits(RDocHighlightRules, TextHighlightRules);
|
||||
|
||||
exports.RDocHighlightRules = RDocHighlightRules;
|
||||
});
|
||||
67
lib/ace/mode/rhtml.js
Normal file
67
lib/ace/mode/rhtml.js
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
/*
|
||||
* rhtml.js
|
||||
*
|
||||
* Copyright (C) 2009-11 by RStudio, Inc.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Ajax.org B.V.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2010
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* This program is licensed to you under the terms of version 3 of the
|
||||
* GNU Affero General Public License. This program is distributed WITHOUT
|
||||
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
|
||||
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
define(function(require, exports, module) {
|
||||
"use strict";
|
||||
|
||||
var oop = require("ace/lib/oop");
|
||||
var HtmlMode = require("ace/mode/html").Mode;
|
||||
var Tokenizer = require("ace/tokenizer").Tokenizer;
|
||||
|
||||
var RHtmlHighlightRules = require("./rhtml_highlight_rules").RHtmlHighlightRules;
|
||||
/* Make life easier, don't do these right now
|
||||
var SweaveBackgroundHighlighter = require("mode/sweave_background_highlighter").SweaveBackgroundHighlighter;
|
||||
var RCodeModel = require("mode/r_code_model").RCodeModel;
|
||||
*/
|
||||
|
||||
var Mode = function(doc, session) {
|
||||
this.$session = session;
|
||||
this.$tokenizer = new Tokenizer(new RHtmlHighlightRules().getRules());
|
||||
|
||||
/* Or these.
|
||||
this.codeModel = new RCodeModel(doc, this.$tokenizer, /^r-/,
|
||||
/^<!--\s*begin.rcode\s*(.*)/);
|
||||
this.foldingRules = this.codeModel;
|
||||
this.$sweaveBackgroundHighlighter = new SweaveBackgroundHighlighter(
|
||||
session,
|
||||
/^<!--\s*begin.rcode\s*(?:.*)/,
|
||||
/^\s*end.rcode\s*-->/,
|
||||
true); */
|
||||
};
|
||||
oop.inherits(Mode, HtmlMode);
|
||||
|
||||
(function() {
|
||||
this.insertChunkInfo = {
|
||||
value: "<!--begin.rcode\n\nend.rcode-->\n",
|
||||
position: {row: 0, column: 15}
|
||||
};
|
||||
|
||||
this.getLanguageMode = function(position)
|
||||
{
|
||||
return this.$session.getState(position.row).match(/^r-/) ? 'R' : 'HTML';
|
||||
};
|
||||
|
||||
this.getNextLineIndent = function(state, line, tab, tabSize, row)
|
||||
{
|
||||
return this.codeModel.getNextLineIndent(row, line, state, tab, tabSize);
|
||||
};
|
||||
|
||||
}).call(Mode.prototype);
|
||||
|
||||
exports.Mode = Mode;
|
||||
});
|
||||
49
lib/ace/mode/rhtml_highlight_rules.js
Normal file
49
lib/ace/mode/rhtml_highlight_rules.js
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* rhtml_highlight_rules.js
|
||||
*
|
||||
* Copyright (C) 2009-11 by RStudio, Inc.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Ajax.org B.V.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2010
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* This program is licensed to you under the terms of version 3 of the
|
||||
* GNU Affero General Public License. This program is distributed WITHOUT
|
||||
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
|
||||
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
|
||||
*
|
||||
*/
|
||||
define(function(require, exports, module) {
|
||||
"use strict";
|
||||
|
||||
var oop = require("ace/lib/oop");
|
||||
var RHighlightRules = require("./r_highlight_rules").RHighlightRules;
|
||||
var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;
|
||||
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||
|
||||
var RHtmlHighlightRules = function() {
|
||||
|
||||
// regexp must not have capturing parentheses
|
||||
// regexps are ordered -> the first match is used
|
||||
|
||||
this.$rules = new HtmlHighlightRules().getRules();
|
||||
this.$rules["start"].unshift({
|
||||
token: "support.function.codebegin",
|
||||
regex: "^<" + "!--\\s*begin.rcode\\s*(?:.*)",
|
||||
next: "r-start"
|
||||
});
|
||||
|
||||
var rRules = new RHighlightRules().getRules();
|
||||
this.addRules(rRules, "r-");
|
||||
this.$rules["r-start"].unshift({
|
||||
token: "support.function.codeend",
|
||||
regex: "^\\s*end.rcode\\s*-->",
|
||||
next: "start"
|
||||
});
|
||||
};
|
||||
oop.inherits(RHtmlHighlightRules, TextHighlightRules);
|
||||
|
||||
exports.RHtmlHighlightRules = RHtmlHighlightRules;
|
||||
});
|
||||
48
lib/ace/mode/tex.js
Normal file
48
lib/ace/mode/tex.js
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* tex.js
|
||||
*
|
||||
* Copyright (C) 2009-11 by RStudio, Inc.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Ajax.org B.V.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2010
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* This program is licensed to you under the terms of version 3 of the
|
||||
* GNU Affero General Public License. This program is distributed WITHOUT
|
||||
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
|
||||
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
|
||||
*
|
||||
*/
|
||||
define(function(require, exports, module) {
|
||||
"use strict";
|
||||
|
||||
var oop = require("ace/lib/oop");
|
||||
var TextMode = require("ace/mode/text").Mode;
|
||||
var Tokenizer = require("ace/tokenizer").Tokenizer;
|
||||
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||
var TexHighlightRules = require("./tex_highlight_rules").TexHighlightRules;
|
||||
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
|
||||
|
||||
var Mode = function(suppressHighlighting) {
|
||||
if (suppressHighlighting)
|
||||
this.$tokenizer = new Tokenizer(new TextHighlightRules().getRules());
|
||||
else
|
||||
this.$tokenizer = new Tokenizer(new TexHighlightRules().getRules());
|
||||
this.$outdent = new MatchingBraceOutdent();
|
||||
};
|
||||
oop.inherits(Mode, TextMode);
|
||||
|
||||
(function() {
|
||||
this.getNextLineIndent = function(state, line, tab) {
|
||||
return this.$getIndent(line);
|
||||
};
|
||||
|
||||
this.allowAutoInsert = function() {
|
||||
return false;
|
||||
};
|
||||
}).call(Mode.prototype);
|
||||
|
||||
exports.Mode = Mode;
|
||||
});
|
||||
107
lib/ace/mode/tex_highlight_rules.js
Normal file
107
lib/ace/mode/tex_highlight_rules.js
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
/*
|
||||
* tex_highlight_rules.js
|
||||
*
|
||||
* Copyright (C) 2009-11 by RStudio, Inc.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Ajax.org B.V.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2010
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* This program is licensed to you under the terms of version 3 of the
|
||||
* GNU Affero General Public License. This program is distributed WITHOUT
|
||||
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
|
||||
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
|
||||
*
|
||||
*/
|
||||
define(function(require, exports, module) {
|
||||
"use strict";
|
||||
|
||||
var oop = require("ace/lib/oop");
|
||||
var lang = require("ace/lib/lang");
|
||||
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||
|
||||
var TexHighlightRules = function(textClass) {
|
||||
|
||||
if (!textClass)
|
||||
textClass = "text";
|
||||
|
||||
// regexp must not have capturing parentheses. Use (?:) instead.
|
||||
// regexps are ordered -> the first match is used
|
||||
|
||||
this.$rules = {
|
||||
"start" : [
|
||||
{
|
||||
token : "comment",
|
||||
regex : "%.*$"
|
||||
}, {
|
||||
token : textClass, // non-command
|
||||
regex : "\\\\[$&%#\\{\\}]"
|
||||
}, {
|
||||
token : "keyword", // command
|
||||
regex : "\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\b",
|
||||
next : "nospell"
|
||||
}, {
|
||||
token : "keyword", // command
|
||||
regex : "\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])"
|
||||
}, {
|
||||
// Obviously these are neither keywords nor operators, but
|
||||
// labelling them as such was the easiest way to get them
|
||||
// to be colored distinctly from regular text
|
||||
token : "paren.keyword.operator",
|
||||
regex : "[[({]"
|
||||
}, {
|
||||
// Obviously these are neither keywords nor operators, but
|
||||
// labelling them as such was the easiest way to get them
|
||||
// to be colored distinctly from regular text
|
||||
token : "paren.keyword.operator",
|
||||
regex : "[\\])}]"
|
||||
}, {
|
||||
token : textClass,
|
||||
regex : "\\s+"
|
||||
}
|
||||
],
|
||||
// This mode is necessary to prevent spell checking, but to keep the
|
||||
// same syntax highlighting behavior. The list of commands comes from
|
||||
// Texlipse.
|
||||
"nospell" : [
|
||||
{
|
||||
token : "comment",
|
||||
regex : "%.*$",
|
||||
next : "start"
|
||||
}, {
|
||||
token : "nospell." + textClass, // non-command
|
||||
regex : "\\\\[$&%#\\{\\}]"
|
||||
}, {
|
||||
token : "keyword", // command
|
||||
regex : "\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\b"
|
||||
}, {
|
||||
token : "keyword", // command
|
||||
regex : "\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])",
|
||||
next : "start"
|
||||
}, {
|
||||
token : "paren.keyword.operator",
|
||||
regex : "[[({]"
|
||||
}, {
|
||||
token : "paren.keyword.operator",
|
||||
regex : "[\\])]"
|
||||
}, {
|
||||
token : "paren.keyword.operator",
|
||||
regex : "}",
|
||||
next : "start"
|
||||
}, {
|
||||
token : "nospell." + textClass,
|
||||
regex : "\\s+"
|
||||
}, {
|
||||
token : "nospell." + textClass,
|
||||
regex : "\\w+"
|
||||
}
|
||||
]
|
||||
};
|
||||
};
|
||||
|
||||
oop.inherits(TexHighlightRules, TextHighlightRules);
|
||||
|
||||
exports.TexHighlightRules = TexHighlightRules;
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue