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
|
|
@ -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",
|
||||
|
|
|
|||
20
demo/kitchen-sink/docs/r.r
Normal file
20
demo/kitchen-sink/docs/r.r
Normal 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
|
||||
64
demo/kitchen-sink/docs/rdoc.Rd
Normal file
64
demo/kitchen-sink/docs/rdoc.Rd
Normal 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"))
|
||||
|
||||
}
|
||||
}
|
||||
22
demo/kitchen-sink/docs/rhtml.Rhtml
Normal file
22
demo/kitchen-sink/docs/rhtml.Rhtml
Normal 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>
|
||||
20
demo/kitchen-sink/docs/tex.tex
Normal file
20
demo/kitchen-sink/docs/tex.tex
Normal 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}
|
||||
|
|
@ -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
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