summaryrefslogtreecommitdiff
path: root/help3/xhpeditor/cm/mode/eiffel/eiffel.js
diff options
context:
space:
mode:
authorOlivier Hallot <olivier.hallot@libreoffice.org>2020-02-11 15:49:05 -0300
committerOlivier Hallot <olivier.hallot@libreoffice.org>2020-02-11 19:52:21 +0100
commit9b13d491adb09073913c2f4a18e1834b54c44b29 (patch)
treeed0153450d11a5f97efebe1dad691b012d454ffc /help3/xhpeditor/cm/mode/eiffel/eiffel.js
parent96b7217971b02de9789b70e988aa8d03846b6c90 (diff)
xhpeditor: refactor to make CM as component
Move codemirror to a folder to ease maintenance/update Change-Id: Id1ec9451cc49bd305f53406dcfff8978bd639016 Reviewed-on: https://gerrit.libreoffice.org/c/dev-tools/+/88472 Tested-by: Olivier Hallot <olivier.hallot@libreoffice.org> Reviewed-by: Olivier Hallot <olivier.hallot@libreoffice.org>
Diffstat (limited to 'help3/xhpeditor/cm/mode/eiffel/eiffel.js')
-rw-r--r--help3/xhpeditor/cm/mode/eiffel/eiffel.js160
1 files changed, 160 insertions, 0 deletions
diff --git a/help3/xhpeditor/cm/mode/eiffel/eiffel.js b/help3/xhpeditor/cm/mode/eiffel/eiffel.js
new file mode 100644
index 00000000..f6f3f458
--- /dev/null
+++ b/help3/xhpeditor/cm/mode/eiffel/eiffel.js
@@ -0,0 +1,160 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+(function(mod) {
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
+ mod(require("../../lib/codemirror"));
+ else if (typeof define == "function" && define.amd) // AMD
+ define(["../../lib/codemirror"], mod);
+ else // Plain browser env
+ mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+CodeMirror.defineMode("eiffel", function() {
+ function wordObj(words) {
+ var o = {};
+ for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true;
+ return o;
+ }
+ var keywords = wordObj([
+ 'note',
+ 'across',
+ 'when',
+ 'variant',
+ 'until',
+ 'unique',
+ 'undefine',
+ 'then',
+ 'strip',
+ 'select',
+ 'retry',
+ 'rescue',
+ 'require',
+ 'rename',
+ 'reference',
+ 'redefine',
+ 'prefix',
+ 'once',
+ 'old',
+ 'obsolete',
+ 'loop',
+ 'local',
+ 'like',
+ 'is',
+ 'inspect',
+ 'infix',
+ 'include',
+ 'if',
+ 'frozen',
+ 'from',
+ 'external',
+ 'export',
+ 'ensure',
+ 'end',
+ 'elseif',
+ 'else',
+ 'do',
+ 'creation',
+ 'create',
+ 'check',
+ 'alias',
+ 'agent',
+ 'separate',
+ 'invariant',
+ 'inherit',
+ 'indexing',
+ 'feature',
+ 'expanded',
+ 'deferred',
+ 'class',
+ 'Void',
+ 'True',
+ 'Result',
+ 'Precursor',
+ 'False',
+ 'Current',
+ 'create',
+ 'attached',
+ 'detachable',
+ 'as',
+ 'and',
+ 'implies',
+ 'not',
+ 'or'
+ ]);
+ var operators = wordObj([":=", "and then","and", "or","<<",">>"]);
+
+ function chain(newtok, stream, state) {
+ state.tokenize.push(newtok);
+ return newtok(stream, state);
+ }
+
+ function tokenBase(stream, state) {
+ if (stream.eatSpace()) return null;
+ var ch = stream.next();
+ if (ch == '"'||ch == "'") {
+ return chain(readQuoted(ch, "string"), stream, state);
+ } else if (ch == "-"&&stream.eat("-")) {
+ stream.skipToEnd();
+ return "comment";
+ } else if (ch == ":"&&stream.eat("=")) {
+ return "operator";
+ } else if (/[0-9]/.test(ch)) {
+ stream.eatWhile(/[xXbBCc0-9\.]/);
+ stream.eat(/[\?\!]/);
+ return "ident";
+ } else if (/[a-zA-Z_0-9]/.test(ch)) {
+ stream.eatWhile(/[a-zA-Z_0-9]/);
+ stream.eat(/[\?\!]/);
+ return "ident";
+ } else if (/[=+\-\/*^%<>~]/.test(ch)) {
+ stream.eatWhile(/[=+\-\/*^%<>~]/);
+ return "operator";
+ } else {
+ return null;
+ }
+ }
+
+ function readQuoted(quote, style, unescaped) {
+ return function(stream, state) {
+ var escaped = false, ch;
+ while ((ch = stream.next()) != null) {
+ if (ch == quote && (unescaped || !escaped)) {
+ state.tokenize.pop();
+ break;
+ }
+ escaped = !escaped && ch == "%";
+ }
+ return style;
+ };
+ }
+
+ return {
+ startState: function() {
+ return {tokenize: [tokenBase]};
+ },
+
+ token: function(stream, state) {
+ var style = state.tokenize[state.tokenize.length-1](stream, state);
+ if (style == "ident") {
+ var word = stream.current();
+ style = keywords.propertyIsEnumerable(stream.current()) ? "keyword"
+ : operators.propertyIsEnumerable(stream.current()) ? "operator"
+ : /^[A-Z][A-Z_0-9]*$/g.test(word) ? "tag"
+ : /^0[bB][0-1]+$/g.test(word) ? "number"
+ : /^0[cC][0-7]+$/g.test(word) ? "number"
+ : /^0[xX][a-fA-F0-9]+$/g.test(word) ? "number"
+ : /^([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+)$/g.test(word) ? "number"
+ : /^[0-9]+$/g.test(word) ? "number"
+ : "variable";
+ }
+ return style;
+ },
+ lineComment: "--"
+ };
+});
+
+CodeMirror.defineMIME("text/x-eiffel", "eiffel");
+
+});