codemirror-rails 2.2.1 → 2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +8 -0
- data/codemirror-rails.gemspec +1 -1
- data/lib/codemirror/rails/version.rb +2 -2
- data/vendor/assets/javascripts/codemirror.js +842 -422
- data/vendor/assets/javascripts/codemirror/keymaps/emacs.js +2 -2
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +722 -32
- data/vendor/assets/javascripts/codemirror/modes/clike.js +31 -9
- data/vendor/assets/javascripts/codemirror/modes/clojure.js +14 -14
- data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +59 -37
- data/vendor/assets/javascripts/codemirror/modes/css.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/diff.js +24 -5
- data/vendor/assets/javascripts/codemirror/modes/ecl.js +203 -0
- data/vendor/assets/javascripts/codemirror/modes/erlang.js +251 -0
- data/vendor/assets/javascripts/codemirror/modes/gfm.js +40 -4
- data/vendor/assets/javascripts/codemirror/modes/go.js +170 -0
- data/vendor/assets/javascripts/codemirror/modes/htmlembedded.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/htmlmixed.js +4 -2
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +10 -9
- data/vendor/assets/javascripts/codemirror/modes/less.js +232 -0
- data/vendor/assets/javascripts/codemirror/modes/markdown.js +52 -49
- data/vendor/assets/javascripts/codemirror/modes/mysql.js +188 -0
- data/vendor/assets/javascripts/codemirror/modes/pascal.js +2 -46
- data/vendor/assets/javascripts/codemirror/modes/perl.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/php.js +55 -25
- data/vendor/assets/javascripts/codemirror/modes/pig.js +172 -0
- data/vendor/assets/javascripts/codemirror/modes/properties.js +63 -0
- data/vendor/assets/javascripts/codemirror/modes/python.js +37 -32
- data/vendor/assets/javascripts/codemirror/modes/rpm-spec.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/rst.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/ruby.js +14 -14
- data/vendor/assets/javascripts/codemirror/modes/rust.js +36 -15
- data/vendor/assets/javascripts/codemirror/modes/scheme.js +74 -46
- data/vendor/assets/javascripts/codemirror/modes/shell.js +103 -0
- data/vendor/assets/javascripts/codemirror/modes/smalltalk.js +16 -16
- data/vendor/assets/javascripts/codemirror/modes/smarty.js +148 -0
- data/vendor/assets/javascripts/codemirror/modes/stex.js +21 -6
- data/vendor/assets/javascripts/codemirror/modes/tiddlywiki.js +55 -45
- data/vendor/assets/javascripts/codemirror/modes/tiki.js +316 -0
- data/vendor/assets/javascripts/codemirror/modes/vbscript.js +26 -0
- data/vendor/assets/javascripts/codemirror/modes/verilog.js +194 -0
- data/vendor/assets/javascripts/codemirror/modes/xml.js +89 -16
- data/vendor/assets/javascripts/codemirror/modes/xmlpure.js +5 -0
- data/vendor/assets/javascripts/codemirror/modes/xquery.js +448 -0
- data/vendor/assets/javascripts/codemirror/utils/closetag.js +146 -0
- data/vendor/assets/javascripts/codemirror/utils/dialog.js +63 -0
- data/vendor/assets/javascripts/codemirror/utils/foldcode.js +196 -0
- data/vendor/assets/javascripts/codemirror/utils/formatting.js +297 -0
- data/vendor/assets/javascripts/codemirror/utils/javascript-hint.js +134 -0
- data/vendor/assets/javascripts/codemirror/utils/loadmode.js +51 -0
- data/vendor/assets/javascripts/codemirror/utils/match-highlighter.js +44 -0
- data/vendor/assets/javascripts/codemirror/utils/multiplex.js +72 -0
- data/vendor/assets/javascripts/codemirror/{overlay.js → utils/overlay.js} +3 -2
- data/vendor/assets/javascripts/codemirror/utils/pig-hint.js +123 -0
- data/vendor/assets/javascripts/codemirror/utils/runmode.js +49 -0
- data/vendor/assets/javascripts/codemirror/utils/search.js +118 -0
- data/vendor/assets/javascripts/codemirror/utils/searchcursor.js +117 -0
- data/vendor/assets/javascripts/codemirror/utils/simple-hint.js +72 -0
- data/vendor/assets/stylesheets/codemirror.css +69 -5
- data/vendor/assets/stylesheets/codemirror/modes/tiddlywiki.css +14 -21
- data/vendor/assets/stylesheets/codemirror/modes/tiki.css +26 -0
- data/vendor/assets/stylesheets/codemirror/themes/ambiance.css +81 -0
- data/vendor/assets/stylesheets/codemirror/themes/blackboard.css +25 -0
- data/vendor/assets/stylesheets/codemirror/themes/cobalt.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/eclipse.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/elegant.css +2 -2
- data/vendor/assets/stylesheets/codemirror/themes/erlang-dark.css +21 -0
- data/vendor/assets/stylesheets/codemirror/themes/lesser-dark.css +44 -0
- data/vendor/assets/stylesheets/codemirror/themes/monokai.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/neat.css +3 -3
- data/vendor/assets/stylesheets/codemirror/themes/night.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/rubyblue.css +2 -2
- data/vendor/assets/stylesheets/codemirror/themes/vibrant-ink.css +27 -0
- data/vendor/assets/stylesheets/codemirror/themes/xq-dark.css +46 -0
- data/vendor/assets/stylesheets/codemirror/utils/dialog.css +23 -0
- data/vendor/assets/stylesheets/codemirror/utils/simple-hint.css +16 -0
- metadata +41 -10
- data/vendor/assets/javascripts/codemirror/runmode.js +0 -27
- data/vendor/assets/stylesheets/codemirror/modes/clike.css +0 -7
- data/vendor/assets/stylesheets/codemirror/modes/markdown.css +0 -10
- data/vendor/assets/stylesheets/codemirror/modes/rst.css +0 -75
- data/vendor/assets/stylesheets/codemirror/themes/default.css +0 -19
@@ -0,0 +1,103 @@
|
|
1
|
+
CodeMirror.defineMode('shell', function(config) {
|
2
|
+
|
3
|
+
var atoms = ['true','false'],
|
4
|
+
keywords = ['if','then','do','else','elif','while','until','for','in','esac','fi','fin','fil','done','exit','set','unset','export','function'],
|
5
|
+
commands = ['ab','awk','bash','beep','cat','cc','cd','chown','chmod','chroot','clear','cp','curl','cut','diff','echo','find','gawk','gcc','get','git','grep','kill','killall','ls','make','mkdir','openssl','mv','nc','node','npm','ping','ps','restart','rm','rmdir','sed','service','sh','shopt','shred','source','sort','sleep','ssh','start','stop','su','sudo','tee','telnet','top','touch','vi','vim','wall','wc','wget','who','write','yes','zsh'];
|
6
|
+
|
7
|
+
function tokenBase(stream, state) {
|
8
|
+
|
9
|
+
var sol = stream.sol();
|
10
|
+
var ch = stream.next();
|
11
|
+
|
12
|
+
if (ch === '\'' || ch === '"' || ch === '`') {
|
13
|
+
state.tokens.unshift(tokenString(ch));
|
14
|
+
return tokenize(stream, state);
|
15
|
+
}
|
16
|
+
if (ch === '#') {
|
17
|
+
if (sol && stream.eat('!')) {
|
18
|
+
stream.skipToEnd();
|
19
|
+
return 'meta'; // 'comment'?
|
20
|
+
}
|
21
|
+
stream.skipToEnd();
|
22
|
+
return 'comment';
|
23
|
+
}
|
24
|
+
if (ch === '$') {
|
25
|
+
state.tokens.unshift(tokenDollar);
|
26
|
+
return tokenize(stream, state);
|
27
|
+
}
|
28
|
+
if (ch === '+' || ch === '=') {
|
29
|
+
return 'operator';
|
30
|
+
}
|
31
|
+
if (ch === '-') {
|
32
|
+
stream.eat('-');
|
33
|
+
stream.eatWhile(/\w/);
|
34
|
+
return 'attribute';
|
35
|
+
}
|
36
|
+
if (/\d/.test(ch)) {
|
37
|
+
stream.eatWhile(/\d/);
|
38
|
+
if(!/\w/.test(stream.peek())) {
|
39
|
+
return 'number';
|
40
|
+
}
|
41
|
+
}
|
42
|
+
stream.eatWhile(/\w/);
|
43
|
+
var cur = stream.current();
|
44
|
+
if (stream.peek() === '=' && /\w+/.test(cur)) return 'def';
|
45
|
+
if (atoms.indexOf(cur) !== -1) return 'atom';
|
46
|
+
if (commands.indexOf(cur) !== -1) return 'builtin';
|
47
|
+
if (keywords.indexOf(cur) !== -1) return 'keyword';
|
48
|
+
return 'word';
|
49
|
+
}
|
50
|
+
|
51
|
+
function tokenString(quote) {
|
52
|
+
return function(stream, state) {
|
53
|
+
var next, end = false, escaped = false;
|
54
|
+
while ((next = stream.next()) != null) {
|
55
|
+
if (next === quote && !escaped) {
|
56
|
+
end = true;
|
57
|
+
break;
|
58
|
+
}
|
59
|
+
if (next === '$' && !escaped && quote !== '\'') {
|
60
|
+
escaped = true;
|
61
|
+
stream.backUp(1);
|
62
|
+
state.tokens.unshift(tokenDollar);
|
63
|
+
break;
|
64
|
+
}
|
65
|
+
escaped = !escaped && next === '\\';
|
66
|
+
}
|
67
|
+
if (end || !escaped) {
|
68
|
+
state.tokens.shift();
|
69
|
+
}
|
70
|
+
return (quote === '`' || quote === ')' ? 'quote' : 'string');
|
71
|
+
};
|
72
|
+
};
|
73
|
+
|
74
|
+
var tokenDollar = function(stream, state) {
|
75
|
+
if (state.tokens.length > 1) stream.eat('$');
|
76
|
+
var ch = stream.next(), hungry = /\w/;
|
77
|
+
if (ch === '{') hungry = /[^}]/;
|
78
|
+
if (ch === '(') {
|
79
|
+
state.tokens[0] = tokenString(')');
|
80
|
+
return tokenize(stream, state);
|
81
|
+
}
|
82
|
+
if (!/\d/.test(ch)) {
|
83
|
+
stream.eatWhile(hungry);
|
84
|
+
stream.eat('}');
|
85
|
+
}
|
86
|
+
state.tokens.shift();
|
87
|
+
return 'def';
|
88
|
+
};
|
89
|
+
|
90
|
+
function tokenize(stream, state) {
|
91
|
+
return (state.tokens[0] || tokenBase) (stream, state);
|
92
|
+
};
|
93
|
+
|
94
|
+
return {
|
95
|
+
startState: function() {return {tokens:[]}},
|
96
|
+
token: function(stream, state) {
|
97
|
+
if (stream.eatSpace()) return null;
|
98
|
+
return tokenize(stream, state);
|
99
|
+
}
|
100
|
+
};
|
101
|
+
});
|
102
|
+
|
103
|
+
CodeMirror.defineMIME('text/x-sh', 'shell');
|
@@ -27,45 +27,45 @@ CodeMirror.defineMode('smalltalk', function(config, modeConfig) {
|
|
27
27
|
|
28
28
|
var next = function(stream, context, state) {
|
29
29
|
var token = new Token(null, context, false);
|
30
|
-
var
|
30
|
+
var aChar = stream.next();
|
31
31
|
|
32
|
-
if (
|
32
|
+
if (aChar === '"') {
|
33
33
|
token = nextComment(stream, new Context(nextComment, context));
|
34
34
|
|
35
|
-
} else if (
|
35
|
+
} else if (aChar === '\'') {
|
36
36
|
token = nextString(stream, new Context(nextString, context));
|
37
37
|
|
38
|
-
} else if (
|
38
|
+
} else if (aChar === '#') {
|
39
39
|
stream.eatWhile(/[^ .]/);
|
40
40
|
token.name = 'string-2';
|
41
41
|
|
42
|
-
} else if (
|
42
|
+
} else if (aChar === '$') {
|
43
43
|
stream.eatWhile(/[^ ]/);
|
44
44
|
token.name = 'string-2';
|
45
45
|
|
46
|
-
} else if (
|
46
|
+
} else if (aChar === '|' && state.expectVariable) {
|
47
47
|
token.context = new Context(nextTemporaries, context);
|
48
48
|
|
49
|
-
} else if (/[\[\]{}()]/.test(
|
49
|
+
} else if (/[\[\]{}()]/.test(aChar)) {
|
50
50
|
token.name = 'bracket';
|
51
|
-
token.eos = /[\[{(]/.test(
|
51
|
+
token.eos = /[\[{(]/.test(aChar);
|
52
52
|
|
53
|
-
if (
|
53
|
+
if (aChar === '[') {
|
54
54
|
state.indentation++;
|
55
|
-
} else if (
|
55
|
+
} else if (aChar === ']') {
|
56
56
|
state.indentation = Math.max(0, state.indentation - 1);
|
57
57
|
}
|
58
58
|
|
59
|
-
} else if (specialChars.test(
|
59
|
+
} else if (specialChars.test(aChar)) {
|
60
60
|
stream.eatWhile(specialChars);
|
61
61
|
token.name = 'operator';
|
62
|
-
token.eos =
|
62
|
+
token.eos = aChar !== ';'; // ; cascaded message expression
|
63
63
|
|
64
|
-
} else if (/\d/.test(
|
64
|
+
} else if (/\d/.test(aChar)) {
|
65
65
|
stream.eatWhile(/[\w\d]/);
|
66
66
|
token.name = 'number'
|
67
67
|
|
68
|
-
} else if (/[\w_]/.test(
|
68
|
+
} else if (/[\w_]/.test(aChar)) {
|
69
69
|
stream.eatWhile(/[\w\d_]/);
|
70
70
|
token.name = state.expectVariable ? (keywords.test(stream.current()) ? 'keyword' : 'variable') : null;
|
71
71
|
|
@@ -88,9 +88,9 @@ CodeMirror.defineMode('smalltalk', function(config, modeConfig) {
|
|
88
88
|
|
89
89
|
var nextTemporaries = function(stream, context, state) {
|
90
90
|
var token = new Token(null, context, false);
|
91
|
-
var
|
91
|
+
var aChar = stream.next();
|
92
92
|
|
93
|
-
if (
|
93
|
+
if (aChar === '|') {
|
94
94
|
token.context = context.parent;
|
95
95
|
token.eos = true;
|
96
96
|
|
@@ -0,0 +1,148 @@
|
|
1
|
+
CodeMirror.defineMode("smarty", function(config, parserConfig) {
|
2
|
+
var keyFuncs = ["debug", "extends", "function", "include", "literal"];
|
3
|
+
var last;
|
4
|
+
var regs = {
|
5
|
+
operatorChars: /[+\-*&%=<>!?]/,
|
6
|
+
validIdentifier: /[a-zA-Z0-9\_]/,
|
7
|
+
stringChar: /[\'\"]/
|
8
|
+
}
|
9
|
+
var leftDelim = (typeof config.mode.leftDelimiter != 'undefined') ? config.mode.leftDelimiter : "{";
|
10
|
+
var rightDelim = (typeof config.mode.rightDelimiter != 'undefined') ? config.mode.rightDelimiter : "}";
|
11
|
+
function ret(style, lst) { last = lst; return style; }
|
12
|
+
|
13
|
+
|
14
|
+
function tokenizer(stream, state) {
|
15
|
+
function chain(parser) {
|
16
|
+
state.tokenize = parser;
|
17
|
+
return parser(stream, state);
|
18
|
+
}
|
19
|
+
|
20
|
+
if (stream.match(leftDelim, true)) {
|
21
|
+
if (stream.eat("*")) {
|
22
|
+
return chain(inBlock("comment", "*" + rightDelim));
|
23
|
+
}
|
24
|
+
else {
|
25
|
+
state.tokenize = inSmarty;
|
26
|
+
return "tag";
|
27
|
+
}
|
28
|
+
}
|
29
|
+
else {
|
30
|
+
// I'd like to do an eatWhile() here, but I can't get it to eat only up to the rightDelim string/char
|
31
|
+
stream.next();
|
32
|
+
return null;
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
36
|
+
function inSmarty(stream, state) {
|
37
|
+
if (stream.match(rightDelim, true)) {
|
38
|
+
state.tokenize = tokenizer;
|
39
|
+
return ret("tag", null);
|
40
|
+
}
|
41
|
+
|
42
|
+
var ch = stream.next();
|
43
|
+
if (ch == "$") {
|
44
|
+
stream.eatWhile(regs.validIdentifier);
|
45
|
+
return ret("variable-2", "variable");
|
46
|
+
}
|
47
|
+
else if (ch == ".") {
|
48
|
+
return ret("operator", "property");
|
49
|
+
}
|
50
|
+
else if (regs.stringChar.test(ch)) {
|
51
|
+
state.tokenize = inAttribute(ch);
|
52
|
+
return ret("string", "string");
|
53
|
+
}
|
54
|
+
else if (regs.operatorChars.test(ch)) {
|
55
|
+
stream.eatWhile(regs.operatorChars);
|
56
|
+
return ret("operator", "operator");
|
57
|
+
}
|
58
|
+
else if (ch == "[" || ch == "]") {
|
59
|
+
return ret("bracket", "bracket");
|
60
|
+
}
|
61
|
+
else if (/\d/.test(ch)) {
|
62
|
+
stream.eatWhile(/\d/);
|
63
|
+
return ret("number", "number");
|
64
|
+
}
|
65
|
+
else {
|
66
|
+
if (state.last == "variable") {
|
67
|
+
if (ch == "@") {
|
68
|
+
stream.eatWhile(regs.validIdentifier);
|
69
|
+
return ret("property", "property");
|
70
|
+
}
|
71
|
+
else if (ch == "|") {
|
72
|
+
stream.eatWhile(regs.validIdentifier);
|
73
|
+
return ret("qualifier", "modifier");
|
74
|
+
}
|
75
|
+
}
|
76
|
+
else if (state.last == "whitespace") {
|
77
|
+
stream.eatWhile(regs.validIdentifier);
|
78
|
+
return ret("attribute", "modifier");
|
79
|
+
}
|
80
|
+
else if (state.last == "property") {
|
81
|
+
stream.eatWhile(regs.validIdentifier);
|
82
|
+
return ret("property", null);
|
83
|
+
}
|
84
|
+
else if (/\s/.test(ch)) {
|
85
|
+
last = "whitespace";
|
86
|
+
return null;
|
87
|
+
}
|
88
|
+
|
89
|
+
var str = "";
|
90
|
+
if (ch != "/") {
|
91
|
+
str += ch;
|
92
|
+
}
|
93
|
+
var c = "";
|
94
|
+
while ((c = stream.eat(regs.validIdentifier))) {
|
95
|
+
str += c;
|
96
|
+
}
|
97
|
+
var i, j;
|
98
|
+
for (i=0, j=keyFuncs.length; i<j; i++) {
|
99
|
+
if (keyFuncs[i] == str) {
|
100
|
+
return ret("keyword", "keyword");
|
101
|
+
}
|
102
|
+
}
|
103
|
+
if (/\s/.test(ch)) {
|
104
|
+
return null;
|
105
|
+
}
|
106
|
+
return ret("tag", "tag");
|
107
|
+
}
|
108
|
+
}
|
109
|
+
|
110
|
+
function inAttribute(quote) {
|
111
|
+
return function(stream, state) {
|
112
|
+
while (!stream.eol()) {
|
113
|
+
if (stream.next() == quote) {
|
114
|
+
state.tokenize = inSmarty;
|
115
|
+
break;
|
116
|
+
}
|
117
|
+
}
|
118
|
+
return "string";
|
119
|
+
};
|
120
|
+
}
|
121
|
+
|
122
|
+
function inBlock(style, terminator) {
|
123
|
+
return function(stream, state) {
|
124
|
+
while (!stream.eol()) {
|
125
|
+
if (stream.match(terminator)) {
|
126
|
+
state.tokenize = tokenizer;
|
127
|
+
break;
|
128
|
+
}
|
129
|
+
stream.next();
|
130
|
+
}
|
131
|
+
return style;
|
132
|
+
};
|
133
|
+
}
|
134
|
+
|
135
|
+
return {
|
136
|
+
startState: function() {
|
137
|
+
return { tokenize: tokenizer, mode: "smarty", last: null };
|
138
|
+
},
|
139
|
+
token: function(stream, state) {
|
140
|
+
var style = state.tokenize(stream, state);
|
141
|
+
state.last = last;
|
142
|
+
return style;
|
143
|
+
},
|
144
|
+
electricChars: ""
|
145
|
+
}
|
146
|
+
});
|
147
|
+
|
148
|
+
CodeMirror.defineMIME("text/x-smarty", "smarty");
|
@@ -82,22 +82,37 @@ CodeMirror.defineMode("stex", function(cmCfg, modeCfg)
|
|
82
82
|
}
|
83
83
|
|
84
84
|
function normal(source, state) {
|
85
|
-
if (source.match(/^\\[a-
|
85
|
+
if (source.match(/^\\[a-zA-Z@]+/)) {
|
86
86
|
var cmdName = source.current();
|
87
87
|
cmdName = cmdName.substr(1, cmdName.length-1);
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
88
|
+
var plug;
|
89
|
+
if (plugins.hasOwnProperty(cmdName)) {
|
90
|
+
plug = plugins[cmdName];
|
91
|
+
} else {
|
92
|
+
plug = plugins["DEFAULT"];
|
93
|
+
}
|
92
94
|
plug = new plug();
|
93
95
|
pushCommand(state, plug);
|
94
96
|
setState(state, beginParams);
|
95
97
|
return plug.style;
|
96
98
|
}
|
97
99
|
|
100
|
+
// escape characters
|
101
|
+
if (source.match(/^\\[$&%#{}_]/)) {
|
102
|
+
return "tag";
|
103
|
+
}
|
104
|
+
|
105
|
+
// white space control characters
|
106
|
+
if (source.match(/^\\[,;!\/]/)) {
|
107
|
+
return "tag";
|
108
|
+
}
|
109
|
+
|
98
110
|
var ch = source.next();
|
99
111
|
if (ch == "%") {
|
100
|
-
|
112
|
+
// special case: % at end of its own line; stay in same state
|
113
|
+
if (!source.eol()) {
|
114
|
+
setState(state, inCComment);
|
115
|
+
}
|
101
116
|
return "comment";
|
102
117
|
}
|
103
118
|
else if (ch=='}' || ch==']') {
|
@@ -1,18 +1,18 @@
|
|
1
1
|
/***
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
2
|
+
|''Name''|tiddlywiki.js|
|
3
|
+
|''Description''|Enables TiddlyWikiy syntax highlighting using CodeMirror|
|
4
|
+
|''Author''|PMario|
|
5
|
+
|''Version''|0.1.7|
|
6
|
+
|''Status''|''stable''|
|
7
|
+
|''Source''|[[GitHub|https://github.com/pmario/CodeMirror2/blob/tw-syntax/mode/tiddlywiki]]|
|
8
|
+
|''Documentation''|http://codemirror.tiddlyspace.com/|
|
9
|
+
|''License''|[[MIT License|http://www.opensource.org/licenses/mit-license.php]]|
|
10
|
+
|''CoreVersion''|2.5.0|
|
11
|
+
|''Requires''|codemirror.js|
|
12
|
+
|''Keywords''|syntax highlighting color code mirror codemirror|
|
13
|
+
! Info
|
14
|
+
CoreVersion parameter is needed for TiddlyWiki only!
|
15
|
+
***/
|
16
16
|
//{{{
|
17
17
|
CodeMirror.defineMode("tiddlywiki", function (config, parserConfig) {
|
18
18
|
var indentUnit = config.indentUnit;
|
@@ -47,20 +47,20 @@ CodeMirror.defineMode("tiddlywiki", function (config, parserConfig) {
|
|
47
47
|
}();
|
48
48
|
|
49
49
|
var isSpaceName = /[\w_\-]/i,
|
50
|
-
reHR = /^\-\-\-\-+$/,
|
50
|
+
reHR = /^\-\-\-\-+$/, // <hr>
|
51
51
|
reWikiCommentStart = /^\/\*\*\*$/, // /***
|
52
52
|
reWikiCommentStop = /^\*\*\*\/$/, // ***/
|
53
53
|
reBlockQuote = /^<<<$/,
|
54
54
|
|
55
|
-
reJsCodeStart = /^\/\/\{\{\{$/, // //{{{
|
56
|
-
reJsCodeStop = /^\/\/\}\}\}$/, // //}}}
|
57
|
-
reXmlCodeStart = /^<!--\{\{\{-->$/,
|
58
|
-
reXmlCodeStop = /^<!--\}\}\}-->$/,
|
55
|
+
reJsCodeStart = /^\/\/\{\{\{$/, // //{{{ js block start
|
56
|
+
reJsCodeStop = /^\/\/\}\}\}$/, // //}}} js stop
|
57
|
+
reXmlCodeStart = /^<!--\{\{\{-->$/, // xml block start
|
58
|
+
reXmlCodeStop = /^<!--\}\}\}-->$/, // xml stop
|
59
59
|
|
60
|
-
reCodeBlockStart = /^\{\{\{$/,
|
61
|
-
reCodeBlockStop = /^\}\}\}$/,
|
60
|
+
reCodeBlockStart = /^\{\{\{$/, // {{{ TW text div block start
|
61
|
+
reCodeBlockStop = /^\}\}\}$/, // }}} TW text stop
|
62
62
|
|
63
|
-
reCodeStart = /\{\{\{/,
|
63
|
+
reCodeStart = /\{\{\{/, // {{{ code span start
|
64
64
|
reUntilCodeStop = /.*?\}\}\}/;
|
65
65
|
|
66
66
|
function chain(stream, state, f) {
|
@@ -95,9 +95,9 @@ CodeMirror.defineMode("tiddlywiki", function (config, parserConfig) {
|
|
95
95
|
|
96
96
|
state.block = false; // indicates the start of a code block.
|
97
97
|
|
98
|
-
ch = stream.peek();
|
98
|
+
ch = stream.peek(); // don't eat, to make matching simpler
|
99
99
|
|
100
|
-
// check start of blocks
|
100
|
+
// check start of blocks
|
101
101
|
if (sol && /[<\/\*{}\-]/.test(ch)) {
|
102
102
|
if (stream.match(reCodeBlockStart)) {
|
103
103
|
state.block = true;
|
@@ -107,16 +107,16 @@ CodeMirror.defineMode("tiddlywiki", function (config, parserConfig) {
|
|
107
107
|
return ret('quote', 'quote');
|
108
108
|
}
|
109
109
|
if (stream.match(reWikiCommentStart) || stream.match(reWikiCommentStop)) {
|
110
|
-
return ret('code', '
|
110
|
+
return ret('code', 'comment');
|
111
111
|
}
|
112
112
|
if (stream.match(reJsCodeStart) || stream.match(reJsCodeStop) || stream.match(reXmlCodeStart) || stream.match(reXmlCodeStop)) {
|
113
|
-
return ret('code', '
|
113
|
+
return ret('code', 'comment');
|
114
114
|
}
|
115
115
|
if (stream.match(reHR)) {
|
116
116
|
return ret('hr', 'hr');
|
117
117
|
}
|
118
118
|
} // sol
|
119
|
-
|
119
|
+
ch = stream.next();
|
120
120
|
|
121
121
|
if (sol && /[\/\*!#;:>|]/.test(ch)) {
|
122
122
|
if (ch == "!") { // tw header
|
@@ -125,26 +125,26 @@ CodeMirror.defineMode("tiddlywiki", function (config, parserConfig) {
|
|
125
125
|
}
|
126
126
|
if (ch == "*") { // tw list
|
127
127
|
stream.eatWhile('*');
|
128
|
-
return ret("list", "
|
128
|
+
return ret("list", "comment");
|
129
129
|
}
|
130
130
|
if (ch == "#") { // tw numbered list
|
131
131
|
stream.eatWhile('#');
|
132
|
-
return ret("list", "
|
132
|
+
return ret("list", "comment");
|
133
133
|
}
|
134
|
-
if (ch == ";") { //
|
134
|
+
if (ch == ";") { // definition list, term
|
135
135
|
stream.eatWhile(';');
|
136
|
-
return ret("list", "
|
136
|
+
return ret("list", "comment");
|
137
137
|
}
|
138
|
-
if (ch == ":") { //
|
138
|
+
if (ch == ":") { // definition list, description
|
139
139
|
stream.eatWhile(':');
|
140
|
-
return ret("list", "
|
140
|
+
return ret("list", "comment");
|
141
141
|
}
|
142
142
|
if (ch == ">") { // single line quote
|
143
143
|
stream.eatWhile(">");
|
144
144
|
return ret("quote", "quote");
|
145
145
|
}
|
146
146
|
if (ch == '|') {
|
147
|
-
return ret('table', '
|
147
|
+
return ret('table', 'header');
|
148
148
|
}
|
149
149
|
}
|
150
150
|
|
@@ -155,13 +155,16 @@ CodeMirror.defineMode("tiddlywiki", function (config, parserConfig) {
|
|
155
155
|
// rudimentary html:// file:// link matching. TW knows much more ...
|
156
156
|
if (/[hf]/i.test(ch)) {
|
157
157
|
if (/[ti]/i.test(stream.peek()) && stream.match(/\b(ttps?|tp|ile):\/\/[\-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i)) {
|
158
|
-
return ret("link
|
158
|
+
return ret("link", "link");
|
159
159
|
}
|
160
160
|
}
|
161
161
|
// just a little string indicator, don't want to have the whole string covered
|
162
162
|
if (ch == '"') {
|
163
163
|
return ret('string', 'string');
|
164
164
|
}
|
165
|
+
if (ch == '~') { // _no_ CamelCase indicator should be bold
|
166
|
+
return ret('text', 'brace');
|
167
|
+
}
|
165
168
|
if (/[\[\]]/.test(ch)) { // check for [[..]]
|
166
169
|
if (stream.peek() == ch) {
|
167
170
|
stream.next();
|
@@ -170,7 +173,7 @@ CodeMirror.defineMode("tiddlywiki", function (config, parserConfig) {
|
|
170
173
|
}
|
171
174
|
if (ch == "@") { // check for space link. TODO fix @@...@@ highlighting
|
172
175
|
stream.eatWhile(isSpaceName);
|
173
|
-
return ret("link
|
176
|
+
return ret("link", "link");
|
174
177
|
}
|
175
178
|
if (/\d/.test(ch)) { // numbers
|
176
179
|
stream.eatWhile(/\d/);
|
@@ -189,9 +192,15 @@ CodeMirror.defineMode("tiddlywiki", function (config, parserConfig) {
|
|
189
192
|
return chain(stream, state, twTokenUnderline);
|
190
193
|
}
|
191
194
|
}
|
192
|
-
|
195
|
+
// strikethrough and mdash handling
|
196
|
+
if (ch == "-") {
|
193
197
|
if (stream.eat("-")) {
|
194
|
-
|
198
|
+
// if strikethrough looks ugly, change CSS.
|
199
|
+
if (stream.peek() != ' ')
|
200
|
+
return chain(stream, state, twTokenStrike);
|
201
|
+
// mdash
|
202
|
+
if (stream.peek() == ' ')
|
203
|
+
return ret('text', 'brace');
|
195
204
|
}
|
196
205
|
}
|
197
206
|
if (ch == "'") { // tw bold
|
@@ -208,6 +217,7 @@ CodeMirror.defineMode("tiddlywiki", function (config, parserConfig) {
|
|
208
217
|
return ret(ch);
|
209
218
|
}
|
210
219
|
|
220
|
+
// core macro handling
|
211
221
|
stream.eatWhile(/[\w\$_]/);
|
212
222
|
var word = stream.current(),
|
213
223
|
known = textwords.propertyIsEnumerable(word) && textwords[word];
|
@@ -256,21 +266,21 @@ CodeMirror.defineMode("tiddlywiki", function (config, parserConfig) {
|
|
256
266
|
var ch, sb = state.block;
|
257
267
|
|
258
268
|
if (sb && stream.current()) {
|
259
|
-
return ret("code", "
|
269
|
+
return ret("code", "comment");
|
260
270
|
}
|
261
271
|
|
262
272
|
if (!sb && stream.match(reUntilCodeStop)) {
|
263
273
|
state.tokenize = jsTokenBase;
|
264
|
-
return ret("code", "
|
274
|
+
return ret("code", "comment");
|
265
275
|
}
|
266
276
|
|
267
277
|
if (sb && stream.sol() && stream.match(reCodeBlockStop)) {
|
268
278
|
state.tokenize = jsTokenBase;
|
269
|
-
return ret("code", "
|
279
|
+
return ret("code", "comment");
|
270
280
|
}
|
271
281
|
|
272
282
|
ch = stream.next();
|
273
|
-
return (sb) ? ret("code", "
|
283
|
+
return (sb) ? ret("code", "comment") : ret("code", "comment");
|
274
284
|
}
|
275
285
|
|
276
286
|
// tw em / italic
|
@@ -301,8 +311,8 @@ CodeMirror.defineMode("tiddlywiki", function (config, parserConfig) {
|
|
301
311
|
return ret("text", "underlined");
|
302
312
|
}
|
303
313
|
|
304
|
-
// tw strike through text looks ugly
|
305
|
-
//
|
314
|
+
// tw strike through text looks ugly
|
315
|
+
// change CSS if needed
|
306
316
|
function twTokenStrike(stream, state) {
|
307
317
|
var maybeEnd = false,
|
308
318
|
ch, nr;
|
@@ -314,7 +324,7 @@ CodeMirror.defineMode("tiddlywiki", function (config, parserConfig) {
|
|
314
324
|
}
|
315
325
|
maybeEnd = (ch == "-");
|
316
326
|
}
|
317
|
-
return ret("text", "
|
327
|
+
return ret("text", "strikethrough");
|
318
328
|
}
|
319
329
|
|
320
330
|
// macro
|