
Previously, we were at an ACE editor published between 1.1.8 and 1.1.9. This caused multiple issues and was especially a problem for the upcoming pair programming feature. Further, updating ace is a long-time priority, see https://github.com/openHPI/codeocean/issues/250. Now, we are not yet updating to the latest version, but rather to the next minor version. This already contains breaking changes, and we are currently interested to keep the number of changes as low as possible. Further updating ACE might be still a future task. The new ACE version 1.2.0 is taken from this tag: https://github.com/ajaxorg/ace-builds/releases/tag/v1.2.0. We are using the src build (not minified, not in the noconflict version), since the same was used before as well. Further, we need to change our migration for storing editor events. Since the table is not yet used (in production), we also update the enum.
343 lines
14 KiB
JavaScript
343 lines
14 KiB
JavaScript
define("ace/mode/asciidoc_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) {
|
|
"use strict";
|
|
|
|
var oop = require("../lib/oop");
|
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
|
|
|
var AsciidocHighlightRules = function() {
|
|
var identifierRe = "[a-zA-Z\u00a1-\uffff]+\\b";
|
|
|
|
this.$rules = {
|
|
"start": [
|
|
{token: "empty", regex: /$/},
|
|
{token: "literal", regex: /^\.{4,}\s*$/, next: "listingBlock"},
|
|
{token: "literal", regex: /^-{4,}\s*$/, next: "literalBlock"},
|
|
{token: "string", regex: /^\+{4,}\s*$/, next: "passthroughBlock"},
|
|
{token: "keyword", regex: /^={4,}\s*$/},
|
|
{token: "text", regex: /^\s*$/},
|
|
{token: "empty", regex: "", next: "dissallowDelimitedBlock"}
|
|
],
|
|
|
|
"dissallowDelimitedBlock": [
|
|
{include: "paragraphEnd"},
|
|
{token: "comment", regex: '^//.+$'},
|
|
{token: "keyword", regex: "^(?:NOTE|TIP|IMPORTANT|WARNING|CAUTION):"},
|
|
|
|
{include: "listStart"},
|
|
{token: "literal", regex: /^\s+.+$/, next: "indentedBlock"},
|
|
{token: "empty", regex: "", next: "text"}
|
|
],
|
|
|
|
"paragraphEnd": [
|
|
{token: "doc.comment", regex: /^\/{4,}\s*$/, next: "commentBlock"},
|
|
{token: "tableBlock", regex: /^\s*[|!]=+\s*$/, next: "tableBlock"},
|
|
{token: "keyword", regex: /^(?:--|''')\s*$/, next: "start"},
|
|
{token: "option", regex: /^\[.*\]\s*$/, next: "start"},
|
|
{token: "pageBreak", regex: /^>{3,}$/, next: "start"},
|
|
{token: "literal", regex: /^\.{4,}\s*$/, next: "listingBlock"},
|
|
{token: "titleUnderline", regex: /^(?:={2,}|-{2,}|~{2,}|\^{2,}|\+{2,})\s*$/, next: "start"},
|
|
{token: "singleLineTitle", regex: /^={1,5}\s+\S.*$/, next: "start"},
|
|
|
|
{token: "otherBlock", regex: /^(?:\*{2,}|_{2,})\s*$/, next: "start"},
|
|
{token: "optionalTitle", regex: /^\.[^.\s].+$/, next: "start"}
|
|
],
|
|
|
|
"listStart": [
|
|
{token: "keyword", regex: /^\s*(?:\d+\.|[a-zA-Z]\.|[ixvmIXVM]+\)|\*{1,5}|-|\.{1,5})\s/, next: "listText"},
|
|
{token: "meta.tag", regex: /^.+(?::{2,4}|;;)(?: |$)/, next: "listText"},
|
|
{token: "support.function.list.callout", regex: /^(?:<\d+>|\d+>|>) /, next: "text"},
|
|
{token: "keyword", regex: /^\+\s*$/, next: "start"}
|
|
],
|
|
|
|
"text": [
|
|
{token: ["link", "variable.language"], regex: /((?:https?:\/\/|ftp:\/\/|file:\/\/|mailto:|callto:)[^\s\[]+)(\[.*?\])/},
|
|
{token: "link", regex: /(?:https?:\/\/|ftp:\/\/|file:\/\/|mailto:|callto:)[^\s\[]+/},
|
|
{token: "link", regex: /\b[\w\.\/\-]+@[\w\.\/\-]+\b/},
|
|
{include: "macros"},
|
|
{include: "paragraphEnd"},
|
|
{token: "literal", regex:/\+{3,}/, next:"smallPassthrough"},
|
|
{token: "escape", regex: /\((?:C|TM|R)\)|\.{3}|->|<-|=>|<=|&#(?:\d+|x[a-fA-F\d]+);|(?: |^)--(?=\s+\S)/},
|
|
{token: "escape", regex: /\\[_*'`+#]|\\{2}[_*'`+#]{2}/},
|
|
{token: "keyword", regex: /\s\+$/},
|
|
{token: "text", regex: identifierRe},
|
|
{token: ["keyword", "string", "keyword"],
|
|
regex: /(<<[\w\d\-$]+,)(.*?)(>>|$)/},
|
|
{token: "keyword", regex: /<<[\w\d\-$]+,?|>>/},
|
|
{token: "constant.character", regex: /\({2,3}.*?\){2,3}/},
|
|
{token: "keyword", regex: /\[\[.+?\]\]/},
|
|
{token: "support", regex: /^\[{3}[\w\d =\-]+\]{3}/},
|
|
|
|
{include: "quotes"},
|
|
{token: "empty", regex: /^\s*$/, next: "start"}
|
|
],
|
|
|
|
"listText": [
|
|
{include: "listStart"},
|
|
{include: "text"}
|
|
],
|
|
|
|
"indentedBlock": [
|
|
{token: "literal", regex: /^[\s\w].+$/, next: "indentedBlock"},
|
|
{token: "literal", regex: "", next: "start"}
|
|
],
|
|
|
|
"listingBlock": [
|
|
{token: "literal", regex: /^\.{4,}\s*$/, next: "dissallowDelimitedBlock"},
|
|
{token: "constant.numeric", regex: '<\\d+>'},
|
|
{token: "literal", regex: '[^<]+'},
|
|
{token: "literal", regex: '<'}
|
|
],
|
|
"literalBlock": [
|
|
{token: "literal", regex: /^-{4,}\s*$/, next: "dissallowDelimitedBlock"},
|
|
{token: "constant.numeric", regex: '<\\d+>'},
|
|
{token: "literal", regex: '[^<]+'},
|
|
{token: "literal", regex: '<'}
|
|
],
|
|
"passthroughBlock": [
|
|
{token: "literal", regex: /^\+{4,}\s*$/, next: "dissallowDelimitedBlock"},
|
|
{token: "literal", regex: identifierRe + "|\\d+"},
|
|
{include: "macros"},
|
|
{token: "literal", regex: "."}
|
|
],
|
|
|
|
"smallPassthrough": [
|
|
{token: "literal", regex: /[+]{3,}/, next: "dissallowDelimitedBlock"},
|
|
{token: "literal", regex: /^\s*$/, next: "dissallowDelimitedBlock"},
|
|
{token: "literal", regex: identifierRe + "|\\d+"},
|
|
{include: "macros"}
|
|
],
|
|
|
|
"commentBlock": [
|
|
{token: "doc.comment", regex: /^\/{4,}\s*$/, next: "dissallowDelimitedBlock"},
|
|
{token: "doc.comment", regex: '^.*$'}
|
|
],
|
|
"tableBlock": [
|
|
{token: "tableBlock", regex: /^\s*\|={3,}\s*$/, next: "dissallowDelimitedBlock"},
|
|
{token: "tableBlock", regex: /^\s*!={3,}\s*$/, next: "innerTableBlock"},
|
|
{token: "tableBlock", regex: /\|/},
|
|
{include: "text", noEscape: true}
|
|
],
|
|
"innerTableBlock": [
|
|
{token: "tableBlock", regex: /^\s*!={3,}\s*$/, next: "tableBlock"},
|
|
{token: "tableBlock", regex: /^\s*|={3,}\s*$/, next: "dissallowDelimitedBlock"},
|
|
{token: "tableBlock", regex: /\!/}
|
|
],
|
|
"macros": [
|
|
{token: "macro", regex: /{[\w\-$]+}/},
|
|
{token: ["text", "string", "text", "constant.character", "text"], regex: /({)([\w\-$]+)(:)?(.+)?(})/},
|
|
{token: ["text", "markup.list.macro", "keyword", "string"], regex: /(\w+)(footnote(?:ref)?::?)([^\s\[]+)?(\[.*?\])?/},
|
|
{token: ["markup.list.macro", "keyword", "string"], regex: /([a-zA-Z\-][\w\.\/\-]*::?)([^\s\[]+)(\[.*?\])?/},
|
|
{token: ["markup.list.macro", "keyword"], regex: /([a-zA-Z\-][\w\.\/\-]+::?)(\[.*?\])/},
|
|
{token: "keyword", regex: /^:.+?:(?= |$)/}
|
|
],
|
|
|
|
"quotes": [
|
|
{token: "string.italic", regex: /__[^_\s].*?__/},
|
|
{token: "string.italic", regex: quoteRule("_")},
|
|
|
|
{token: "keyword.bold", regex: /\*\*[^*\s].*?\*\*/},
|
|
{token: "keyword.bold", regex: quoteRule("\\*")},
|
|
|
|
{token: "literal", regex: quoteRule("\\+")},
|
|
{token: "literal", regex: /\+\+[^+\s].*?\+\+/},
|
|
{token: "literal", regex: /\$\$.+?\$\$/},
|
|
{token: "literal", regex: quoteRule("`")},
|
|
|
|
{token: "keyword", regex: quoteRule("^")},
|
|
{token: "keyword", regex: quoteRule("~")},
|
|
{token: "keyword", regex: /##?/},
|
|
{token: "keyword", regex: /(?:\B|^)``|\b''/}
|
|
]
|
|
|
|
};
|
|
|
|
function quoteRule(ch) {
|
|
var prefix = /\w/.test(ch) ? "\\b" : "(?:\\B|^)";
|
|
return prefix + ch + "[^" + ch + "].*?" + ch + "(?![\\w*])";
|
|
}
|
|
|
|
var tokenMap = {
|
|
macro: "constant.character",
|
|
tableBlock: "doc.comment",
|
|
titleUnderline: "markup.heading",
|
|
singleLineTitle: "markup.heading",
|
|
pageBreak: "string",
|
|
option: "string.regexp",
|
|
otherBlock: "markup.list",
|
|
literal: "support.function",
|
|
optionalTitle: "constant.numeric",
|
|
escape: "constant.language.escape",
|
|
link: "markup.underline.list"
|
|
};
|
|
|
|
for (var state in this.$rules) {
|
|
var stateRules = this.$rules[state];
|
|
for (var i = stateRules.length; i--; ) {
|
|
var rule = stateRules[i];
|
|
if (rule.include || typeof rule == "string") {
|
|
var args = [i, 1].concat(this.$rules[rule.include || rule]);
|
|
if (rule.noEscape) {
|
|
args = args.filter(function(x) {
|
|
return !x.next;
|
|
});
|
|
}
|
|
stateRules.splice.apply(stateRules, args);
|
|
} else if (rule.token in tokenMap) {
|
|
rule.token = tokenMap[rule.token];
|
|
}
|
|
}
|
|
}
|
|
};
|
|
oop.inherits(AsciidocHighlightRules, TextHighlightRules);
|
|
|
|
exports.AsciidocHighlightRules = AsciidocHighlightRules;
|
|
});
|
|
|
|
define("ace/mode/folding/asciidoc",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) {
|
|
"use strict";
|
|
|
|
var oop = require("../../lib/oop");
|
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
|
var Range = require("../../range").Range;
|
|
|
|
var FoldMode = exports.FoldMode = function() {};
|
|
oop.inherits(FoldMode, BaseFoldMode);
|
|
|
|
(function() {
|
|
this.foldingStartMarker = /^(?:\|={10,}|[\.\/=\-~^+]{4,}\s*$|={1,5} )/;
|
|
this.singleLineHeadingRe = /^={1,5}(?=\s+\S)/;
|
|
|
|
this.getFoldWidget = function(session, foldStyle, row) {
|
|
var line = session.getLine(row);
|
|
if (!this.foldingStartMarker.test(line))
|
|
return ""
|
|
|
|
if (line[0] == "=") {
|
|
if (this.singleLineHeadingRe.test(line))
|
|
return "start";
|
|
if (session.getLine(row - 1).length != session.getLine(row).length)
|
|
return "";
|
|
return "start";
|
|
}
|
|
if (session.bgTokenizer.getState(row) == "dissallowDelimitedBlock")
|
|
return "end";
|
|
return "start";
|
|
};
|
|
|
|
this.getFoldWidgetRange = function(session, foldStyle, row) {
|
|
var line = session.getLine(row);
|
|
var startColumn = line.length;
|
|
var maxRow = session.getLength();
|
|
var startRow = row;
|
|
var endRow = row;
|
|
if (!line.match(this.foldingStartMarker))
|
|
return;
|
|
|
|
var token;
|
|
function getTokenType(row) {
|
|
token = session.getTokens(row)[0];
|
|
return token && token.type;
|
|
}
|
|
|
|
var levels = ["=","-","~","^","+"];
|
|
var heading = "markup.heading";
|
|
var singleLineHeadingRe = this.singleLineHeadingRe;
|
|
function getLevel() {
|
|
var match = token.value.match(singleLineHeadingRe);
|
|
if (match)
|
|
return match[0].length;
|
|
var level = levels.indexOf(token.value[0]) + 1;
|
|
if (level == 1) {
|
|
if (session.getLine(row - 1).length != session.getLine(row).length)
|
|
return Infinity;
|
|
}
|
|
return level;
|
|
}
|
|
|
|
if (getTokenType(row) == heading) {
|
|
var startHeadingLevel = getLevel();
|
|
while (++row < maxRow) {
|
|
if (getTokenType(row) != heading)
|
|
continue;
|
|
var level = getLevel();
|
|
if (level <= startHeadingLevel)
|
|
break;
|
|
}
|
|
|
|
var isSingleLineHeading = token && token.value.match(this.singleLineHeadingRe);
|
|
endRow = isSingleLineHeading ? row - 1 : row - 2;
|
|
|
|
if (endRow > startRow) {
|
|
while (endRow > startRow && (!getTokenType(endRow) || token.value[0] == "["))
|
|
endRow--;
|
|
}
|
|
|
|
if (endRow > startRow) {
|
|
var endColumn = session.getLine(endRow).length;
|
|
return new Range(startRow, startColumn, endRow, endColumn);
|
|
}
|
|
} else {
|
|
var state = session.bgTokenizer.getState(row);
|
|
if (state == "dissallowDelimitedBlock") {
|
|
while (row -- > 0) {
|
|
if (session.bgTokenizer.getState(row).lastIndexOf("Block") == -1)
|
|
break;
|
|
}
|
|
endRow = row + 1;
|
|
if (endRow < startRow) {
|
|
var endColumn = session.getLine(row).length;
|
|
return new Range(endRow, 5, startRow, startColumn - 5);
|
|
}
|
|
} else {
|
|
while (++row < maxRow) {
|
|
if (session.bgTokenizer.getState(row) == "dissallowDelimitedBlock")
|
|
break;
|
|
}
|
|
endRow = row;
|
|
if (endRow > startRow) {
|
|
var endColumn = session.getLine(row).length;
|
|
return new Range(startRow, 5, endRow, endColumn - 5);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
}).call(FoldMode.prototype);
|
|
|
|
});
|
|
|
|
define("ace/mode/asciidoc",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/asciidoc_highlight_rules","ace/mode/folding/asciidoc"], function(require, exports, module) {
|
|
"use strict";
|
|
|
|
var oop = require("../lib/oop");
|
|
var TextMode = require("./text").Mode;
|
|
var AsciidocHighlightRules = require("./asciidoc_highlight_rules").AsciidocHighlightRules;
|
|
var AsciidocFoldMode = require("./folding/asciidoc").FoldMode;
|
|
|
|
var Mode = function() {
|
|
this.HighlightRules = AsciidocHighlightRules;
|
|
|
|
this.foldingRules = new AsciidocFoldMode();
|
|
};
|
|
oop.inherits(Mode, TextMode);
|
|
|
|
(function() {
|
|
this.type = "text";
|
|
this.getNextLineIndent = function(state, line, tab) {
|
|
if (state == "listblock") {
|
|
var match = /^((?:.+)?)([-+*][ ]+)/.exec(line);
|
|
if (match) {
|
|
return new Array(match[1].length + 1).join(" ") + match[2];
|
|
} else {
|
|
return "";
|
|
}
|
|
} else {
|
|
return this.$getIndent(line);
|
|
}
|
|
};
|
|
this.$id = "ace/mode/asciidoc";
|
|
}).call(Mode.prototype);
|
|
|
|
exports.Mode = Mode;
|
|
});
|