Merge pull request #1117 from jjallaire/r_highlighting

Add R highlighting from RStudio (plus other dependencies)
This commit is contained in:
Harutyun Amirjanyan 2012-11-26 07:52:39 -08:00
commit 220bea7fa0
14 changed files with 865 additions and 0 deletions

View file

@ -103,6 +103,9 @@ var docs = {
"docs/plaintext.txt": {name: "Plain Text", prepare: makeHuge, wrapped: true},
"docs/powershell.ps1": "Powershell",
"docs/python.py": "Python",
"docs/r.r": "R",
"docs/rdoc.Rd": "RDoc",
"docs/rhtml.rhtml": "RHTML",
"docs/ruby.rb": "Ruby",
"docs/abap.abap": "SAP - ABAP",
"docs/scala.scala": "Scala",
@ -112,6 +115,7 @@ var docs = {
"docs/sql.sql": {name: "SQL", wrapped: true},
"docs/svg.svg": "SVG",
"docs/tcl.tcl": "Tcl",
"docs/tex.tex": "Tex",
"docs/textile.textile": {name: "Textile", wrapped: true},
"docs/typescript.ts": "Typescript",
"docs/xml.xml": "XML",

View file

@ -0,0 +1,20 @@
Call:
lm(formula = y ~ x)
Residuals:
1 2 3 4 5 6
3.3333 -0.6667 -2.6667 -2.6667 -0.6667 3.3333
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -9.3333 2.8441 -3.282 0.030453 *
x 7.0000 0.7303 9.585 0.000662 ***
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
Residual standard error: 3.055 on 4 degrees of freedom
Multiple R-squared: 0.9583, Adjusted R-squared: 0.9478
F-statistic: 91.88 on 1 and 4 DF, p-value: 0.000662
> par(mfrow=c(2, 2)) # Request 2x2 plot layout
> plot(lm_1) # Diagnostic plot of regression model

View file

@ -0,0 +1,64 @@
\name{picker}
\alias{picker}
\title{Create a picker control}
\description{
Create a picker control to enable manipulation of plot variables based on a set of fixed choices.
}
\usage{
picker(..., initial = NULL, label = NULL)
}
\arguments{
\item{\dots}{
Arguments containing objects to be presented as choices for the picker (or a list containing the choices). If an element is named then the name is used to display it within the picker. If an element is not named then it is displayed within the picker using \code{\link{as.character}}.
}
\item{initial}{
Initial value for picker. Value must be present in the list of choices specified. If not specified defaults to the first choice.
}
\item{label}{
Display label for picker. Defaults to the variable name if not specified.
}
}
\value{
An object of class "manipulator.picker" which can be passed to the \code{\link{manipulate}} function.
}
\seealso{
\code{\link{manipulate}}, \code{\link{slider}}, \code{\link{checkbox}}, \code{\link{button}}
}
\examples{
\dontrun{
## Filtering data with a picker
manipulate(
barplot(as.matrix(longley[,factor]),
beside = TRUE, main = factor),
factor = picker("GNP", "Unemployed", "Employed"))
## Create a picker with labels
manipulate(
plot(pressure, type = type),
type = picker("points" = "p", "line" = "l", "step" = "s"))
## Picker with groups
manipulate(
barplot(as.matrix(mtcars[group,"mpg"]), beside=TRUE),
group = picker("Group 1" = 1:11,
"Group 2" = 12:22,
"Group 3" = 23:32))
## Histogram w/ picker to select type
require(lattice)
require(stats)
manipulate(
histogram(~ height | voice.part,
data = singer, type = type),
type = picker("percent", "count", "density"))
}
}

View file

@ -0,0 +1,22 @@
<html>
<head>
<title>Title</title>
</head>
<body>
<p>This is an R HTML document. When you click the <b>Knit HTML</b> button a web page will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:</p>
<!--begin.rcode
summary(cars)
end.rcode-->
<p>You can also embed plots, for example:</p>
<!--begin.rcode fig.width=7, fig.height=6
plot(cars)
end.rcode-->
</body>
</html>

View file

@ -0,0 +1,20 @@
The quadratic formula is $$-b \pm \sqrt{b^2 - 4ac} \over 2a$$
\bye
\makeatletter
\newcommand{\be}{%
\begingroup
% \setlength{\arraycolsep}{2pt}
\eqnarray%
\@ifstar{\nonumber}{}%
}
\newcommand{\ee}{\endeqnarray\endgroup}
\makeatother
\begin{equation}
x=\left\{ \begin{array}{cl}
0 & \textrm{if }A=\ldots\\
1 & \textrm{if }B=\ldots\\
x & \textrm{this runs with as much text as you like, but without an raggeright text
.}\end{array}\right.
\end{equation}

View file

@ -74,6 +74,9 @@ var modesByName = {
php: ["PHP" , "php|phtml"],
powershell: ["Powershell" , "ps1"],
python: ["Python" , "py"],
r: ["R" , "r"],
rdoc: ["RDoc" , "Rd"],
rhtml: ["RHTML" , "Rhtml"],
ruby: ["Ruby" , "ru|gemspec|rake|rb"],
scad: ["OpenSCAD" , "scad"],
scala: ["Scala" , "scala"],
@ -83,6 +86,7 @@ var modesByName = {
stylus: ["Stylus" , "styl|stylus"],
svg: ["SVG" , "svg"],
tcl: ["Tcl" , "tcl"],
tex: ["Tex" , "tex"],
text: ["Text" , "txt"],
textile: ["Textile" , "textile"],
typescript: ["Typescript" , "typescript|ts|str"],

135
lib/ace/mode/r.js Normal file
View 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;
});

View 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
View 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;
});

View 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
View 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;
});

View 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
View 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;
});

View 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;
});