codemirror-rails 3.15 → 3.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/codemirror/rails/version.rb +2 -2
- data/vendor/assets/javascripts/codemirror.js +59 -29
- data/vendor/assets/javascripts/codemirror/addons/comment/continuecomment.js +44 -0
- data/vendor/assets/javascripts/codemirror/addons/display/fullscreen.js +30 -0
- data/vendor/assets/javascripts/codemirror/addons/edit/continuecomment.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/fold/brace-fold.js +3 -3
- data/vendor/assets/javascripts/codemirror/addons/fold/comment-fold.js +40 -0
- data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +7 -10
- data/vendor/assets/javascripts/codemirror/addons/scroll/scrollpastend.js +34 -0
- data/vendor/assets/javascripts/codemirror/addons/search/match-highlighter.js +4 -1
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +5 -0
- data/vendor/assets/javascripts/codemirror/modes/css.js +21 -19
- data/vendor/assets/javascripts/codemirror/modes/erlang.js +122 -102
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +3 -2
- data/vendor/assets/javascripts/codemirror/modes/python.js +12 -4
- data/vendor/assets/javascripts/codemirror/modes/rst.js +20 -21
- data/vendor/assets/javascripts/codemirror/modes/velocity.js +54 -12
- data/vendor/assets/javascripts/codemirror/modes/xml.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/xquery.js +5 -1
- data/vendor/assets/javascripts/codemirror/modes/yaml.js +8 -8
- data/vendor/assets/stylesheets/codemirror.css +1 -0
- data/vendor/assets/stylesheets/codemirror/addons/display/fullscreen.css +6 -0
- data/vendor/assets/stylesheets/codemirror/themes/3024-day.css +1 -0
- data/vendor/assets/stylesheets/codemirror/themes/3024-night.css +1 -0
- data/vendor/assets/stylesheets/codemirror/themes/ambiance.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/base16-dark.css +1 -0
- data/vendor/assets/stylesheets/codemirror/themes/base16-light.css +1 -0
- data/vendor/assets/stylesheets/codemirror/themes/blackboard.css +3 -0
- data/vendor/assets/stylesheets/codemirror/themes/cobalt.css +3 -0
- data/vendor/assets/stylesheets/codemirror/themes/eclipse.css +2 -4
- data/vendor/assets/stylesheets/codemirror/themes/elegant.css +3 -0
- data/vendor/assets/stylesheets/codemirror/themes/erlang-dark.css +11 -2
- data/vendor/assets/stylesheets/codemirror/themes/lesser-dark.css +3 -0
- data/vendor/assets/stylesheets/codemirror/themes/midnight.css +2 -2
- data/vendor/assets/stylesheets/codemirror/themes/monokai.css +1 -0
- data/vendor/assets/stylesheets/codemirror/themes/neat.css +3 -0
- data/vendor/assets/stylesheets/codemirror/themes/night.css +3 -0
- data/vendor/assets/stylesheets/codemirror/themes/paraiso-dark.css +34 -0
- data/vendor/assets/stylesheets/codemirror/themes/paraiso-light.css +34 -0
- data/vendor/assets/stylesheets/codemirror/themes/rubyblue.css +2 -0
- data/vendor/assets/stylesheets/codemirror/themes/solarized.css +2 -7
- data/vendor/assets/stylesheets/codemirror/themes/the-matrix.css +26 -0
- data/vendor/assets/stylesheets/codemirror/themes/tomorrow-night-eighties.css +1 -0
- data/vendor/assets/stylesheets/codemirror/themes/twilight.css +2 -0
- data/vendor/assets/stylesheets/codemirror/themes/vibrant-ink.css +3 -0
- data/vendor/assets/stylesheets/codemirror/themes/xq-dark.css +4 -1
- data/vendor/assets/stylesheets/codemirror/themes/xq-light.css +1 -1
- metadata +10 -2
@@ -0,0 +1,34 @@
|
|
1
|
+
(function() {
|
2
|
+
"use strict";
|
3
|
+
|
4
|
+
CodeMirror.defineOption("scrollPastEnd", false, function(cm, val, old) {
|
5
|
+
if (old && old != CodeMirror.Init) {
|
6
|
+
cm.off("change", onChange);
|
7
|
+
cm.display.lineSpace.parentNode.style.paddingBottom = "";
|
8
|
+
cm.state.scrollPastEndPadding = null;
|
9
|
+
}
|
10
|
+
if (val) {
|
11
|
+
cm.on("change", onChange);
|
12
|
+
updateBottomMargin(cm);
|
13
|
+
}
|
14
|
+
});
|
15
|
+
|
16
|
+
function onChange(cm, change) {
|
17
|
+
if (CodeMirror.changeEnd(change).line == cm.lastLine())
|
18
|
+
updateBottomMargin(cm);
|
19
|
+
}
|
20
|
+
|
21
|
+
function updateBottomMargin(cm) {
|
22
|
+
var padding = "";
|
23
|
+
if (cm.lineCount() > 1) {
|
24
|
+
var totalH = cm.display.scroller.clientHeight - 30,
|
25
|
+
lastLineH = cm.getLineHandle(cm.lastLine()).height;
|
26
|
+
padding = (totalH - lastLineH) + "px";
|
27
|
+
}
|
28
|
+
if (cm.state.scrollPastEndPadding != padding) {
|
29
|
+
cm.state.scrollPastEndPadding = padding;
|
30
|
+
cm.display.lineSpace.parentNode.style.paddingBottom = padding;
|
31
|
+
cm.setSize();
|
32
|
+
}
|
33
|
+
}
|
34
|
+
})();
|
@@ -15,15 +15,18 @@
|
|
15
15
|
(function() {
|
16
16
|
var DEFAULT_MIN_CHARS = 2;
|
17
17
|
var DEFAULT_TOKEN_STYLE = "matchhighlight";
|
18
|
+
var DEFAULT_DELAY = 100;
|
18
19
|
|
19
20
|
function State(options) {
|
20
21
|
if (typeof options == "object") {
|
21
22
|
this.minChars = options.minChars;
|
22
23
|
this.style = options.style;
|
23
24
|
this.showToken = options.showToken;
|
25
|
+
this.delay = options.delay;
|
24
26
|
}
|
25
27
|
if (this.style == null) this.style = DEFAULT_TOKEN_STYLE;
|
26
28
|
if (this.minChars == null) this.minChars = DEFAULT_MIN_CHARS;
|
29
|
+
if (this.delay == null) this.delay = DEFAULT_DELAY;
|
27
30
|
this.overlay = this.timeout = null;
|
28
31
|
}
|
29
32
|
|
@@ -45,7 +48,7 @@
|
|
45
48
|
function cursorActivity(cm) {
|
46
49
|
var state = cm.state.matchHighlighter;
|
47
50
|
clearTimeout(state.timeout);
|
48
|
-
state.timeout = setTimeout(function() {highlightMatches(cm);},
|
51
|
+
state.timeout = setTimeout(function() {highlightMatches(cm);}, state.delay);
|
49
52
|
}
|
50
53
|
|
51
54
|
function highlightMatches(cm) {
|
@@ -1104,6 +1104,11 @@
|
|
1104
1104
|
if (vim.visualLine) {
|
1105
1105
|
if (cursorIsBefore(selectionStart, selectionEnd)) {
|
1106
1106
|
selectionStart.ch = 0;
|
1107
|
+
|
1108
|
+
var lastLine = cm.lastLine();
|
1109
|
+
if (selectionEnd.line > lastLine) {
|
1110
|
+
selectionEnd.line = lastLine;
|
1111
|
+
}
|
1107
1112
|
selectionEnd.ch = lineLength(cm, selectionEnd.line);
|
1108
1113
|
} else {
|
1109
1114
|
selectionEnd.ch = 0;
|
@@ -366,8 +366,8 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
|
|
366
366
|
"drop-initial-before-align", "drop-initial-size", "drop-initial-value",
|
367
367
|
"elevation", "empty-cells", "fit", "fit-position", "flex", "flex-basis",
|
368
368
|
"flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap",
|
369
|
-
"float", "float-offset", "
|
370
|
-
"font-kerning", "font-language-override", "font-size", "font-size-adjust",
|
369
|
+
"float", "float-offset", "flow-from", "flow-into", "font", "font-feature-settings",
|
370
|
+
"font-family", "font-kerning", "font-language-override", "font-size", "font-size-adjust",
|
371
371
|
"font-stretch", "font-style", "font-synthesis", "font-variant",
|
372
372
|
"font-variant-alternates", "font-variant-caps", "font-variant-east-asian",
|
373
373
|
"font-variant-ligatures", "font-variant-numeric", "font-variant-position",
|
@@ -391,10 +391,12 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
|
|
391
391
|
"page", "page-break-after", "page-break-before", "page-break-inside",
|
392
392
|
"page-policy", "pause", "pause-after", "pause-before", "perspective",
|
393
393
|
"perspective-origin", "pitch", "pitch-range", "play-during", "position",
|
394
|
-
"presentation-level", "punctuation-trim", "quotes", "
|
395
|
-
"
|
396
|
-
"
|
397
|
-
"
|
394
|
+
"presentation-level", "punctuation-trim", "quotes", "region-break-after",
|
395
|
+
"region-break-before", "region-break-inside", "region-fragment",
|
396
|
+
"rendering-intent", "resize", "rest", "rest-after", "rest-before", "richness",
|
397
|
+
"right", "rotation", "rotation-point", "ruby-align", "ruby-overhang",
|
398
|
+
"ruby-position", "ruby-span", "shape-inside", "shape-outside", "size",
|
399
|
+
"speak", "speak-as", "speak-header",
|
398
400
|
"speak-numeral", "speak-punctuation", "speech-rate", "stress", "string-set",
|
399
401
|
"tab-size", "table-layout", "target", "target-name", "target-new",
|
400
402
|
"target-position", "text-align", "text-align-last", "text-decoration",
|
@@ -432,7 +434,7 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
|
|
432
434
|
"darkslateblue", "darkslategray", "darkturquoise", "darkviolet",
|
433
435
|
"deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick",
|
434
436
|
"floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite",
|
435
|
-
"gold", "goldenrod", "gray", "green", "greenyellow", "honeydew",
|
437
|
+
"gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew",
|
436
438
|
"hotpink", "indianred", "indigo", "ivory", "khaki", "lavender",
|
437
439
|
"lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral",
|
438
440
|
"lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink",
|
@@ -455,22 +457,22 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
|
|
455
457
|
"above", "absolute", "activeborder", "activecaption", "afar",
|
456
458
|
"after-white-space", "ahead", "alias", "all", "all-scroll", "alternate",
|
457
459
|
"always", "amharic", "amharic-abegede", "antialiased", "appworkspace",
|
458
|
-
"arabic-indic", "armenian", "asterisks", "auto", "avoid", "
|
459
|
-
"backwards", "baseline", "below", "bidi-override", "binary",
|
460
|
-
"blink", "block", "block-axis", "bold", "bolder", "border", "border-box",
|
461
|
-
"both", "bottom", "break-all", "break-word", "button", "button-bevel",
|
460
|
+
"arabic-indic", "armenian", "asterisks", "auto", "avoid", "avoid-column", "avoid-page",
|
461
|
+
"avoid-region", "background", "backwards", "baseline", "below", "bidi-override", "binary",
|
462
|
+
"bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box",
|
463
|
+
"both", "bottom", "break", "break-all", "break-word", "button", "button-bevel",
|
462
464
|
"buttonface", "buttonhighlight", "buttonshadow", "buttontext", "cambodian",
|
463
465
|
"capitalize", "caps-lock-indicator", "caption", "captiontext", "caret",
|
464
466
|
"cell", "center", "checkbox", "circle", "cjk-earthly-branch",
|
465
467
|
"cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote",
|
466
|
-
"col-resize", "collapse", "compact", "condensed", "contain", "content",
|
468
|
+
"col-resize", "collapse", "column", "compact", "condensed", "contain", "content",
|
467
469
|
"content-box", "context-menu", "continuous", "copy", "cover", "crop",
|
468
470
|
"cross", "crosshair", "currentcolor", "cursive", "dashed", "decimal",
|
469
471
|
"decimal-leading-zero", "default", "default-button", "destination-atop",
|
470
472
|
"destination-in", "destination-out", "destination-over", "devanagari",
|
471
473
|
"disc", "discard", "document", "dot-dash", "dot-dot-dash", "dotted",
|
472
474
|
"double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out",
|
473
|
-
"element", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede",
|
475
|
+
"element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede",
|
474
476
|
"ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er",
|
475
477
|
"ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er",
|
476
478
|
"ethiopic-halehame-aa-et", "ethiopic-halehame-am-et",
|
@@ -486,7 +488,7 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
|
|
486
488
|
"inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite",
|
487
489
|
"infobackground", "infotext", "inherit", "initial", "inline", "inline-axis",
|
488
490
|
"inline-block", "inline-table", "inset", "inside", "intrinsic", "invert",
|
489
|
-
"italic", "justify", "kannada", "katakana", "katakana-iroha", "khmer",
|
491
|
+
"italic", "justify", "kannada", "katakana", "katakana-iroha", "keep-all", "khmer",
|
490
492
|
"landscape", "lao", "large", "larger", "left", "level", "lighter",
|
491
493
|
"line-through", "linear", "lines", "list-item", "listbox", "listitem",
|
492
494
|
"local", "logical", "loud", "lower", "lower-alpha", "lower-armenian",
|
@@ -505,11 +507,11 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
|
|
505
507
|
"no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap",
|
506
508
|
"ns-resize", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote",
|
507
509
|
"optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset",
|
508
|
-
"outside", "overlay", "overline", "padding", "padding-box",
|
509
|
-
"paused", "persian", "plus-darker", "plus-lighter", "pointer",
|
510
|
-
"pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "push-button",
|
511
|
-
"radio", "read-only", "read-write", "read-write-plaintext-only", "
|
512
|
-
"repeat", "repeat-x", "repeat-y", "reset", "reverse", "rgb", "rgba",
|
510
|
+
"outside", "outside-shape", "overlay", "overline", "padding", "padding-box",
|
511
|
+
"painted", "page", "paused", "persian", "plus-darker", "plus-lighter", "pointer",
|
512
|
+
"polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "push-button",
|
513
|
+
"radio", "read-only", "read-write", "read-write-plaintext-only", "rectangle", "region",
|
514
|
+
"relative", "repeat", "repeat-x", "repeat-y", "reset", "reverse", "rgb", "rgba",
|
513
515
|
"ridge", "right", "round", "row-resize", "rtl", "run-in", "running",
|
514
516
|
"s-resize", "sans-serif", "scroll", "scrollbar", "se-resize", "searchfield",
|
515
517
|
"searchfield-cancel-button", "searchfield-decoration",
|
@@ -11,22 +11,15 @@ CodeMirror.defineMIME("text/x-erlang", "erlang");
|
|
11
11
|
|
12
12
|
CodeMirror.defineMode("erlang", function(cmCfg) {
|
13
13
|
|
14
|
-
function rval(state,
|
14
|
+
function rval(state,_stream,type) {
|
15
15
|
// distinguish between "." as terminator and record field operator
|
16
|
-
|
17
|
-
state.context = "record";
|
18
|
-
}else{
|
19
|
-
state.context = false;
|
20
|
-
}
|
16
|
+
state.in_record = (type == "record");
|
21
17
|
|
22
|
-
// remember last significant bit on last line for indenting
|
23
|
-
if (type != "whitespace" && type != "comment") {
|
24
|
-
state.lastToken = stream.current();
|
25
|
-
}
|
26
18
|
// erlang -> CodeMirror tag
|
27
19
|
switch (type) {
|
28
20
|
case "atom": return "atom";
|
29
21
|
case "attribute": return "attribute";
|
22
|
+
case "boolean": return "special";
|
30
23
|
case "builtin": return "builtin";
|
31
24
|
case "comment": return "comment";
|
32
25
|
case "fun": return "meta";
|
@@ -55,6 +48,7 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
|
|
55
48
|
"after","begin","catch","case","cond","end","fun","if",
|
56
49
|
"let","of","query","receive","try","when"];
|
57
50
|
|
51
|
+
var separatorRE = /[\->\.,:;]/;
|
58
52
|
var separatorWords = [
|
59
53
|
"->",";",":",".",","];
|
60
54
|
|
@@ -62,12 +56,15 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
|
|
62
56
|
"and","andalso","band","bnot","bor","bsl","bsr","bxor",
|
63
57
|
"div","not","or","orelse","rem","xor"];
|
64
58
|
|
59
|
+
var symbolRE = /[\+\-\*\/<>=\|:!]/;
|
65
60
|
var symbolWords = [
|
66
|
-
"+","-","*","/",">",">=","<","=<","=:=","==","=/=","/=","||","<-"];
|
61
|
+
"+","-","*","/",">",">=","<","=<","=:=","==","=/=","/=","||","<-","!"];
|
67
62
|
|
63
|
+
var openParenRE = /[<\(\[\{]/;
|
68
64
|
var openParenWords = [
|
69
65
|
"<<","(","[","{"];
|
70
66
|
|
67
|
+
var closeParenRE = /[>\)\]\}]/;
|
71
68
|
var closeParenWords = [
|
72
69
|
"}","]",")",">>"];
|
73
70
|
|
@@ -102,53 +99,39 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
|
|
102
99
|
"term_to_binary","time","throw","tl","trunc","tuple_size",
|
103
100
|
"tuple_to_list","unlink","unregister","whereis"];
|
104
101
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
102
|
+
// [Ø-Þ] [À-Ö]
|
103
|
+
// [ß-ö] [ø-ÿ]
|
104
|
+
var anumRE = /[\w@Ø-ÞÀ-Öß-öø-ÿ]/;
|
105
|
+
var escapesRE =
|
106
|
+
/[0-7]{1,3}|[bdefnrstv\\"']|\^[a-zA-Z]|x[0-9a-zA-Z]{2}|x{[0-9a-zA-Z]+}/;
|
109
107
|
|
110
|
-
|
111
|
-
var largeRE = /[A-Z_]/;
|
112
|
-
var digitRE = /[0-9]/;
|
113
|
-
var octitRE = /[0-7]/;
|
114
|
-
var anumRE = /[a-z_A-Z0-9]/;
|
115
|
-
var symbolRE = /[\+\-\*\/<>=\|:]/;
|
116
|
-
var openParenRE = /[<\(\[\{]/;
|
117
|
-
var closeParenRE = /[>\)\]\}]/;
|
118
|
-
var sepRE = /[\->\.,:;]/;
|
108
|
+
function tokenize(stream, state) {
|
119
109
|
|
120
|
-
|
121
|
-
|
122
|
-
|
110
|
+
// in multi-line string
|
111
|
+
if (state.in_string) {
|
112
|
+
state.in_string = (!doubleQuote(stream));
|
113
|
+
return rval(state,stream,"string");
|
114
|
+
}
|
123
115
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
var word = stream.string.slice(start-len,start);
|
129
|
-
return word == string;
|
130
|
-
}else{
|
131
|
-
return false;
|
116
|
+
// in multi-line atom
|
117
|
+
if (state.in_atom) {
|
118
|
+
state.in_atom = (!singleQuote(stream));
|
119
|
+
return rval(state,stream,"atom");
|
132
120
|
}
|
133
|
-
}
|
134
121
|
|
135
|
-
|
122
|
+
// whitespace
|
136
123
|
if (stream.eatSpace()) {
|
137
124
|
return rval(state,stream,"whitespace");
|
138
125
|
}
|
139
126
|
|
140
127
|
// attributes and type specs
|
141
|
-
if ((peekToken(state).token == ""
|
142
|
-
stream.
|
143
|
-
stream.
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
}else{
|
148
|
-
return rval(state,stream,"attribute");
|
149
|
-
}
|
128
|
+
if ((peekToken(state).token == "") &&
|
129
|
+
stream.match(/-\s*[a-zß-öø-ÿ][\wØ-ÞÀ-Öß-öø-ÿ]*/)) {
|
130
|
+
if (isMember(stream.current(),typeWords)) {
|
131
|
+
return rval(state,stream,"type");
|
132
|
+
}else{
|
133
|
+
return rval(state,stream,"attribute");
|
150
134
|
}
|
151
|
-
stream.backUp(1);
|
152
135
|
}
|
153
136
|
|
154
137
|
var ch = stream.next();
|
@@ -166,57 +149,54 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
|
|
166
149
|
}
|
167
150
|
|
168
151
|
// record
|
169
|
-
if (
|
152
|
+
if (ch == "#") {
|
170
153
|
stream.eatWhile(anumRE);
|
171
154
|
return rval(state,stream,"record");
|
172
155
|
}
|
173
156
|
|
174
|
-
//
|
175
|
-
if ( ch == "$") {
|
176
|
-
if (stream.next() == "\\") {
|
177
|
-
|
178
|
-
stream.next();
|
179
|
-
}
|
157
|
+
// dollar escape
|
158
|
+
if ( ch == "$" ) {
|
159
|
+
if (stream.next() == "\\" && !stream.match(escapesRE)) {
|
160
|
+
return rval(state,stream,"error");
|
180
161
|
}
|
181
|
-
return rval(state,stream,"
|
162
|
+
return rval(state,stream,"number");
|
182
163
|
}
|
183
164
|
|
184
165
|
// quoted atom
|
185
166
|
if (ch == '\'') {
|
186
|
-
if (singleQuote(stream)) {
|
187
|
-
|
188
|
-
|
189
|
-
|
167
|
+
if (!(state.in_atom = (!singleQuote(stream)))) {
|
168
|
+
if (stream.match(/\s*\/\s*[0-9]/,false)) {
|
169
|
+
stream.match(/\s*\/\s*[0-9]/,true);
|
170
|
+
popToken(state);
|
171
|
+
return rval(state,stream,"fun"); // 'f'/0 style fun
|
172
|
+
}
|
173
|
+
if (stream.match(/\s*\(/,false) || stream.match(/\s*:/,false)) {
|
174
|
+
return rval(state,stream,"function");
|
175
|
+
}
|
190
176
|
}
|
177
|
+
return rval(state,stream,"atom");
|
191
178
|
}
|
192
179
|
|
193
180
|
// string
|
194
181
|
if (ch == '"') {
|
195
|
-
|
196
|
-
|
197
|
-
}else{
|
198
|
-
return rval(state,stream,"error");
|
199
|
-
}
|
182
|
+
state.in_string = (!doubleQuote(stream));
|
183
|
+
return rval(state,stream,"string");
|
200
184
|
}
|
201
185
|
|
202
186
|
// variable
|
203
|
-
if (
|
187
|
+
if (/[A-Z_Ø-ÞÀ-Ö]/.test(ch)) {
|
204
188
|
stream.eatWhile(anumRE);
|
205
189
|
return rval(state,stream,"variable");
|
206
190
|
}
|
207
191
|
|
208
192
|
// atom/keyword/BIF/function
|
209
|
-
if (
|
193
|
+
if (/[a-z_ß-öø-ÿ]/.test(ch)) {
|
210
194
|
stream.eatWhile(anumRE);
|
211
195
|
|
212
|
-
if (stream.
|
213
|
-
stream.
|
214
|
-
|
215
|
-
|
216
|
-
}else{
|
217
|
-
stream.backUp(1);
|
218
|
-
return rval(state,stream,"atom");
|
219
|
-
}
|
196
|
+
if (stream.match(/\s*\/\s*[0-9]/,false)) {
|
197
|
+
stream.match(/\s*\/\s*[0-9]/,true);
|
198
|
+
popToken(state);
|
199
|
+
return rval(state,stream,"fun"); // f/0 style fun
|
220
200
|
}
|
221
201
|
|
222
202
|
var w = stream.current();
|
@@ -224,37 +204,38 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
|
|
224
204
|
if (isMember(w,keywordWords)) {
|
225
205
|
pushToken(state,stream);
|
226
206
|
return rval(state,stream,"keyword");
|
227
|
-
}
|
228
|
-
if (stream.peek() == "(") {
|
207
|
+
}else if (stream.match(/\s*\(/,false)) {
|
229
208
|
// 'put' and 'erlang:put' are bifs, 'foo:put' is not
|
230
209
|
if (isMember(w,bifWords) &&
|
231
210
|
(!isPrev(stream,":") || isPrev(stream,"erlang:"))) {
|
232
211
|
return rval(state,stream,"builtin");
|
212
|
+
}else if (isMember(w,guardWords)) {
|
213
|
+
return rval(state,stream,"guard");
|
233
214
|
}else{
|
234
215
|
return rval(state,stream,"function");
|
235
216
|
}
|
236
|
-
}
|
237
|
-
if (isMember(w,guardWords)) {
|
238
|
-
return rval(state,stream,"guard");
|
239
|
-
}
|
240
|
-
if (isMember(w,operatorWords)) {
|
217
|
+
}else if (isMember(w,operatorWords)) {
|
241
218
|
return rval(state,stream,"operator");
|
242
|
-
}
|
243
|
-
if (stream.peek() == ":") {
|
219
|
+
}else if (stream.match(/\s*:/,false)) {
|
244
220
|
if (w == "erlang") {
|
245
221
|
return rval(state,stream,"builtin");
|
246
222
|
} else {
|
247
223
|
return rval(state,stream,"function");
|
248
224
|
}
|
225
|
+
}else if (isMember(w,["true","false"])) {
|
226
|
+
return rval(state,stream,"boolean");
|
227
|
+
}else{
|
228
|
+
return rval(state,stream,"atom");
|
249
229
|
}
|
250
|
-
return rval(state,stream,"atom");
|
251
230
|
}
|
252
231
|
|
253
232
|
// number
|
233
|
+
var digitRE = /[0-9]/;
|
234
|
+
var radixRE = /[0-9a-zA-Z]/; // 36#zZ style int
|
254
235
|
if (digitRE.test(ch)) {
|
255
236
|
stream.eatWhile(digitRE);
|
256
237
|
if (stream.eat('#')) {
|
257
|
-
stream.eatWhile(
|
238
|
+
stream.eatWhile(radixRE); // 36#aZ style integer
|
258
239
|
} else {
|
259
240
|
if (stream.eat('.')) { // float
|
260
241
|
stream.eatWhile(digitRE);
|
@@ -280,9 +261,9 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
|
|
280
261
|
}
|
281
262
|
|
282
263
|
// separators
|
283
|
-
if (greedy(stream,
|
264
|
+
if (greedy(stream,separatorRE,separatorWords)) {
|
284
265
|
// distinguish between "." as terminator and record field operator
|
285
|
-
if (state.
|
266
|
+
if (!state.in_record) {
|
286
267
|
pushToken(state,stream);
|
287
268
|
}
|
288
269
|
return rval(state,stream,"separator");
|
@@ -296,6 +277,17 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
|
|
296
277
|
return rval(state,stream,null);
|
297
278
|
}
|
298
279
|
|
280
|
+
function isPrev(stream,string) {
|
281
|
+
var start = stream.start;
|
282
|
+
var len = string.length;
|
283
|
+
if (len <= start) {
|
284
|
+
var word = stream.string.slice(start-len,start);
|
285
|
+
return word == string;
|
286
|
+
}else{
|
287
|
+
return false;
|
288
|
+
}
|
289
|
+
}
|
290
|
+
|
299
291
|
function nongreedy(stream,re,words) {
|
300
292
|
if (stream.current().length == 1 && re.test(stream.current())) {
|
301
293
|
stream.backUp(1);
|
@@ -347,31 +339,37 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
|
|
347
339
|
return false;
|
348
340
|
}
|
349
341
|
|
350
|
-
function
|
351
|
-
|
352
|
-
this.column = stream ? stream.column() : 0;
|
353
|
-
this.indent = stream ? stream.indentation() : 0;
|
342
|
+
function isMember(element,list) {
|
343
|
+
return (-1 < list.indexOf(element));
|
354
344
|
}
|
355
345
|
|
346
|
+
/////////////////////////////////////////////////////////////////////////////
|
356
347
|
function myIndent(state,textAfter) {
|
357
348
|
var indent = cmCfg.indentUnit;
|
358
|
-
var outdentWords = ["after","catch"];
|
359
349
|
var token = (peekToken(state)).token;
|
360
350
|
var wordAfter = takewhile(textAfter,/[^a-z]/);
|
361
351
|
|
362
|
-
if (
|
363
|
-
return
|
364
|
-
}else if (token == "
|
352
|
+
if (state.in_string || state.in_atom) {
|
353
|
+
return CodeMirror.Pass;
|
354
|
+
}else if (token == "") {
|
365
355
|
return 0;
|
356
|
+
}else if (isMember(token,openParenWords)) {
|
357
|
+
return (peekToken(state)).column+token.length;
|
358
|
+
}else if (token == "when") {
|
359
|
+
return (peekToken(state)).column+token.length+1;
|
360
|
+
}else if (token == "fun" && wordAfter == "") {
|
361
|
+
return (peekToken(state)).column+token.length;
|
366
362
|
}else if (token == "->") {
|
367
|
-
if (wordAfter
|
363
|
+
if (isMember(wordAfter,["end","after","catch"])) {
|
368
364
|
return peekToken(state,2).column;
|
369
365
|
}else if (peekToken(state,2).token == "fun") {
|
370
366
|
return peekToken(state,2).column+indent;
|
367
|
+
}else if (peekToken(state,2).token == "") {
|
368
|
+
return indent;
|
371
369
|
}else{
|
372
370
|
return (peekToken(state)).indent+indent;
|
373
371
|
}
|
374
|
-
}else if (isMember(wordAfter,
|
372
|
+
}else if (isMember(wordAfter,["after","catch","of"])) {
|
375
373
|
return (peekToken(state)).indent;
|
376
374
|
}else{
|
377
375
|
return (peekToken(state)).column+indent;
|
@@ -383,6 +381,12 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
|
|
383
381
|
return m ? str.slice(0,m.index) : str;
|
384
382
|
}
|
385
383
|
|
384
|
+
function Token(stream) {
|
385
|
+
this.token = stream ? stream.current() : "";
|
386
|
+
this.column = stream ? stream.column() : 0;
|
387
|
+
this.indent = stream ? stream.indentation() : 0;
|
388
|
+
}
|
389
|
+
|
386
390
|
function popToken(state) {
|
387
391
|
return state.tokenStack.pop();
|
388
392
|
}
|
@@ -400,7 +404,13 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
|
|
400
404
|
function pushToken(state,stream) {
|
401
405
|
var token = stream.current();
|
402
406
|
var prev_token = peekToken(state).token;
|
403
|
-
|
407
|
+
|
408
|
+
if (token == ".") {
|
409
|
+
state.tokenStack = [];
|
410
|
+
return false;
|
411
|
+
}else if(isMember(token,[",", ":", "of", "cond", "let", "query"])) {
|
412
|
+
return false;
|
413
|
+
}else if (drop_last(prev_token,token)) {
|
404
414
|
return false;
|
405
415
|
}else if (drop_both(prev_token,token)) {
|
406
416
|
popToken(state);
|
@@ -408,18 +418,25 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
|
|
408
418
|
}else if (drop_first(prev_token,token)) {
|
409
419
|
popToken(state);
|
410
420
|
return pushToken(state,stream);
|
421
|
+
}else if (isMember(token,["after","catch"])) {
|
422
|
+
return false;
|
411
423
|
}else{
|
412
424
|
state.tokenStack.push(new Token(stream));
|
413
425
|
return true;
|
414
426
|
}
|
415
427
|
}
|
416
428
|
|
429
|
+
function drop_last(open, close) {
|
430
|
+
switch(open+" "+close) {
|
431
|
+
case "when ;": return true;
|
432
|
+
default: return false;
|
433
|
+
}
|
434
|
+
}
|
435
|
+
|
417
436
|
function drop_first(open, close) {
|
418
437
|
switch (open+" "+close) {
|
419
438
|
case "when ->": return true;
|
420
439
|
case "-> end": return true;
|
421
|
-
case "-> .": return true;
|
422
|
-
case ". .": return true;
|
423
440
|
default: return false;
|
424
441
|
}
|
425
442
|
}
|
@@ -436,6 +453,8 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
|
|
436
453
|
case "if end": return true;
|
437
454
|
case "receive end": return true;
|
438
455
|
case "try end": return true;
|
456
|
+
case "-> catch": return true;
|
457
|
+
case "-> after": return true;
|
439
458
|
case "-> ;": return true;
|
440
459
|
default: return false;
|
441
460
|
}
|
@@ -445,8 +464,9 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
|
|
445
464
|
startState:
|
446
465
|
function() {
|
447
466
|
return {tokenStack: [],
|
448
|
-
|
449
|
-
|
467
|
+
in_record: false,
|
468
|
+
in_string: false,
|
469
|
+
in_atom: false};
|
450
470
|
},
|
451
471
|
|
452
472
|
token:
|