hyde_admin 0.0.1 → 0.0.3
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/.gitattributes +3 -0
- data/.idea/hyde_admin.iml +2 -0
- data/.idea/vcs.xml +6 -0
- data/CHANGELOG.md +11 -0
- data/README.md +23 -0
- data/TODO.md +1 -0
- data/bin/admin_views/admin_layout.html.erb +138 -109
- data/bin/admin_views/configuration.erb +13 -0
- data/bin/admin_views/dashboard.erb +1 -1
- data/bin/admin_views/editor_html.erb +24 -0
- data/bin/admin_views/editor_js.erb +120 -0
- data/bin/admin_views/files/edit.erb +30 -0
- data/bin/admin_views/files/listing.erb +111 -0
- data/bin/admin_views/posts/edit.erb +156 -0
- data/bin/admin_views/posts/listing.erb +34 -0
- data/bin/fslightbox/fslightbox.js +1 -0
- data/bin/hyde_admin +3 -0
- data/bin/hyde_admin.ru +243 -55
- data/bin/hyde_admin.yml +12 -5
- data/bin/hyde_assets/hyde_admin.css +18 -0
- data/bin/hyde_assets/hyde_admin.js +24 -0
- data/bin/i18n/en.yml +62 -1
- data/bin/i18n/fr.yml +62 -1
- data/bin/lib/codemirror.css +349 -0
- data/bin/lib/codemirror.js +9833 -0
- data/bin/mode/css/css.js +864 -0
- data/bin/mode/css/gss.html +104 -0
- data/bin/mode/css/gss_test.js +17 -0
- data/bin/mode/css/index.html +81 -0
- data/bin/mode/css/less.html +152 -0
- data/bin/mode/css/less_test.js +54 -0
- data/bin/mode/css/scss.html +158 -0
- data/bin/mode/css/scss_test.js +110 -0
- data/bin/mode/css/test.js +217 -0
- data/bin/mode/htmlembedded/htmlembedded.js +37 -0
- data/bin/mode/htmlembedded/index.html +60 -0
- data/bin/mode/htmlmixed/htmlmixed.js +153 -0
- data/bin/mode/htmlmixed/index.html +100 -0
- data/bin/mode/javascript/index.html +118 -0
- data/bin/mode/javascript/javascript.js +959 -0
- data/bin/mode/javascript/json-ld.html +72 -0
- data/bin/mode/javascript/test.js +521 -0
- data/bin/mode/javascript/typescript.html +62 -0
- data/bin/mode/markdown/index.html +418 -0
- data/bin/mode/markdown/markdown.js +886 -0
- data/bin/mode/markdown/test.js +1319 -0
- data/bin/mode/ruby/index.html +183 -0
- data/bin/mode/ruby/ruby.js +303 -0
- data/bin/mode/ruby/test.js +23 -0
- data/bin/mode/sass/index.html +68 -0
- data/bin/mode/sass/sass.js +459 -0
- data/bin/mode/sass/test.js +122 -0
- data/bin/mode/spreadsheet/index.html +42 -0
- data/bin/mode/spreadsheet/spreadsheet.js +112 -0
- data/bin/mode/xml/index.html +61 -0
- data/bin/mode/xml/test.js +51 -0
- data/bin/mode/xml/xml.js +417 -0
- data/bin/mode/yaml/index.html +80 -0
- data/bin/mode/yaml/yaml.js +120 -0
- data/bin/mode/yaml-frontmatter/index.html +121 -0
- data/bin/mode/yaml-frontmatter/yaml-frontmatter.js +72 -0
- data/hyde_admin.gemspec +6 -1
- data/lib/hyde_admin/version.rb +1 -1
- metadata +114 -7
- data/bin/admin_views/edit.erb +0 -57
- data/bin/admin_views/listing.erb +0 -32
- data/bin/hyde_admin.sh +0 -3
@@ -0,0 +1,459 @@
|
|
1
|
+
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
2
|
+
// Distributed under an MIT license: https://codemirror.net/LICENSE
|
3
|
+
|
4
|
+
(function(mod) {
|
5
|
+
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
6
|
+
mod(require("../../lib/codemirror"), require("../css/css"));
|
7
|
+
else if (typeof define == "function" && define.amd) // AMD
|
8
|
+
define(["../../lib/codemirror", "../css/css"], mod);
|
9
|
+
else // Plain browser env
|
10
|
+
mod(CodeMirror);
|
11
|
+
})(function(CodeMirror) {
|
12
|
+
"use strict";
|
13
|
+
|
14
|
+
CodeMirror.defineMode("sass", function(config) {
|
15
|
+
var cssMode = CodeMirror.mimeModes["text/css"];
|
16
|
+
var propertyKeywords = cssMode.propertyKeywords || {},
|
17
|
+
colorKeywords = cssMode.colorKeywords || {},
|
18
|
+
valueKeywords = cssMode.valueKeywords || {},
|
19
|
+
fontProperties = cssMode.fontProperties || {};
|
20
|
+
|
21
|
+
function tokenRegexp(words) {
|
22
|
+
return new RegExp("^" + words.join("|"));
|
23
|
+
}
|
24
|
+
|
25
|
+
var keywords = ["true", "false", "null", "auto"];
|
26
|
+
var keywordsRegexp = new RegExp("^" + keywords.join("|"));
|
27
|
+
|
28
|
+
var operators = ["\\(", "\\)", "=", ">", "<", "==", ">=", "<=", "\\+", "-",
|
29
|
+
"\\!=", "/", "\\*", "%", "and", "or", "not", ";","\\{","\\}",":"];
|
30
|
+
var opRegexp = tokenRegexp(operators);
|
31
|
+
|
32
|
+
var pseudoElementsRegexp = /^::?[a-zA-Z_][\w\-]*/;
|
33
|
+
|
34
|
+
var word;
|
35
|
+
|
36
|
+
function isEndLine(stream) {
|
37
|
+
return !stream.peek() || stream.match(/\s+$/, false);
|
38
|
+
}
|
39
|
+
|
40
|
+
function urlTokens(stream, state) {
|
41
|
+
var ch = stream.peek();
|
42
|
+
|
43
|
+
if (ch === ")") {
|
44
|
+
stream.next();
|
45
|
+
state.tokenizer = tokenBase;
|
46
|
+
return "operator";
|
47
|
+
} else if (ch === "(") {
|
48
|
+
stream.next();
|
49
|
+
stream.eatSpace();
|
50
|
+
|
51
|
+
return "operator";
|
52
|
+
} else if (ch === "'" || ch === '"') {
|
53
|
+
state.tokenizer = buildStringTokenizer(stream.next());
|
54
|
+
return "string";
|
55
|
+
} else {
|
56
|
+
state.tokenizer = buildStringTokenizer(")", false);
|
57
|
+
return "string";
|
58
|
+
}
|
59
|
+
}
|
60
|
+
function comment(indentation, multiLine) {
|
61
|
+
return function(stream, state) {
|
62
|
+
if (stream.sol() && stream.indentation() <= indentation) {
|
63
|
+
state.tokenizer = tokenBase;
|
64
|
+
return tokenBase(stream, state);
|
65
|
+
}
|
66
|
+
|
67
|
+
if (multiLine && stream.skipTo("*/")) {
|
68
|
+
stream.next();
|
69
|
+
stream.next();
|
70
|
+
state.tokenizer = tokenBase;
|
71
|
+
} else {
|
72
|
+
stream.skipToEnd();
|
73
|
+
}
|
74
|
+
|
75
|
+
return "comment";
|
76
|
+
};
|
77
|
+
}
|
78
|
+
|
79
|
+
function buildStringTokenizer(quote, greedy) {
|
80
|
+
if (greedy == null) { greedy = true; }
|
81
|
+
|
82
|
+
function stringTokenizer(stream, state) {
|
83
|
+
var nextChar = stream.next();
|
84
|
+
var peekChar = stream.peek();
|
85
|
+
var previousChar = stream.string.charAt(stream.pos-2);
|
86
|
+
|
87
|
+
var endingString = ((nextChar !== "\\" && peekChar === quote) || (nextChar === quote && previousChar !== "\\"));
|
88
|
+
|
89
|
+
if (endingString) {
|
90
|
+
if (nextChar !== quote && greedy) { stream.next(); }
|
91
|
+
if (isEndLine(stream)) {
|
92
|
+
state.cursorHalf = 0;
|
93
|
+
}
|
94
|
+
state.tokenizer = tokenBase;
|
95
|
+
return "string";
|
96
|
+
} else if (nextChar === "#" && peekChar === "{") {
|
97
|
+
state.tokenizer = buildInterpolationTokenizer(stringTokenizer);
|
98
|
+
stream.next();
|
99
|
+
return "operator";
|
100
|
+
} else {
|
101
|
+
return "string";
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
return stringTokenizer;
|
106
|
+
}
|
107
|
+
|
108
|
+
function buildInterpolationTokenizer(currentTokenizer) {
|
109
|
+
return function(stream, state) {
|
110
|
+
if (stream.peek() === "}") {
|
111
|
+
stream.next();
|
112
|
+
state.tokenizer = currentTokenizer;
|
113
|
+
return "operator";
|
114
|
+
} else {
|
115
|
+
return tokenBase(stream, state);
|
116
|
+
}
|
117
|
+
};
|
118
|
+
}
|
119
|
+
|
120
|
+
function indent(state) {
|
121
|
+
if (state.indentCount == 0) {
|
122
|
+
state.indentCount++;
|
123
|
+
var lastScopeOffset = state.scopes[0].offset;
|
124
|
+
var currentOffset = lastScopeOffset + config.indentUnit;
|
125
|
+
state.scopes.unshift({ offset:currentOffset });
|
126
|
+
}
|
127
|
+
}
|
128
|
+
|
129
|
+
function dedent(state) {
|
130
|
+
if (state.scopes.length == 1) return;
|
131
|
+
|
132
|
+
state.scopes.shift();
|
133
|
+
}
|
134
|
+
|
135
|
+
function tokenBase(stream, state) {
|
136
|
+
var ch = stream.peek();
|
137
|
+
|
138
|
+
// Comment
|
139
|
+
if (stream.match("/*")) {
|
140
|
+
state.tokenizer = comment(stream.indentation(), true);
|
141
|
+
return state.tokenizer(stream, state);
|
142
|
+
}
|
143
|
+
if (stream.match("//")) {
|
144
|
+
state.tokenizer = comment(stream.indentation(), false);
|
145
|
+
return state.tokenizer(stream, state);
|
146
|
+
}
|
147
|
+
|
148
|
+
// Interpolation
|
149
|
+
if (stream.match("#{")) {
|
150
|
+
state.tokenizer = buildInterpolationTokenizer(tokenBase);
|
151
|
+
return "operator";
|
152
|
+
}
|
153
|
+
|
154
|
+
// Strings
|
155
|
+
if (ch === '"' || ch === "'") {
|
156
|
+
stream.next();
|
157
|
+
state.tokenizer = buildStringTokenizer(ch);
|
158
|
+
return "string";
|
159
|
+
}
|
160
|
+
|
161
|
+
if(!state.cursorHalf){// state.cursorHalf === 0
|
162
|
+
// first half i.e. before : for key-value pairs
|
163
|
+
// including selectors
|
164
|
+
|
165
|
+
if (ch === "-") {
|
166
|
+
if (stream.match(/^-\w+-/)) {
|
167
|
+
return "meta";
|
168
|
+
}
|
169
|
+
}
|
170
|
+
|
171
|
+
if (ch === ".") {
|
172
|
+
stream.next();
|
173
|
+
if (stream.match(/^[\w-]+/)) {
|
174
|
+
indent(state);
|
175
|
+
return "qualifier";
|
176
|
+
} else if (stream.peek() === "#") {
|
177
|
+
indent(state);
|
178
|
+
return "tag";
|
179
|
+
}
|
180
|
+
}
|
181
|
+
|
182
|
+
if (ch === "#") {
|
183
|
+
stream.next();
|
184
|
+
// ID selectors
|
185
|
+
if (stream.match(/^[\w-]+/)) {
|
186
|
+
indent(state);
|
187
|
+
return "builtin";
|
188
|
+
}
|
189
|
+
if (stream.peek() === "#") {
|
190
|
+
indent(state);
|
191
|
+
return "tag";
|
192
|
+
}
|
193
|
+
}
|
194
|
+
|
195
|
+
// Variables
|
196
|
+
if (ch === "$") {
|
197
|
+
stream.next();
|
198
|
+
stream.eatWhile(/[\w-]/);
|
199
|
+
return "variable-2";
|
200
|
+
}
|
201
|
+
|
202
|
+
// Numbers
|
203
|
+
if (stream.match(/^-?[0-9\.]+/))
|
204
|
+
return "number";
|
205
|
+
|
206
|
+
// Units
|
207
|
+
if (stream.match(/^(px|em|in)\b/))
|
208
|
+
return "unit";
|
209
|
+
|
210
|
+
if (stream.match(keywordsRegexp))
|
211
|
+
return "keyword";
|
212
|
+
|
213
|
+
if (stream.match(/^url/) && stream.peek() === "(") {
|
214
|
+
state.tokenizer = urlTokens;
|
215
|
+
return "atom";
|
216
|
+
}
|
217
|
+
|
218
|
+
if (ch === "=") {
|
219
|
+
// Match shortcut mixin definition
|
220
|
+
if (stream.match(/^=[\w-]+/)) {
|
221
|
+
indent(state);
|
222
|
+
return "meta";
|
223
|
+
}
|
224
|
+
}
|
225
|
+
|
226
|
+
if (ch === "+") {
|
227
|
+
// Match shortcut mixin definition
|
228
|
+
if (stream.match(/^\+[\w-]+/)){
|
229
|
+
return "variable-3";
|
230
|
+
}
|
231
|
+
}
|
232
|
+
|
233
|
+
if(ch === "@"){
|
234
|
+
if(stream.match('@extend')){
|
235
|
+
if(!stream.match(/\s*[\w]/))
|
236
|
+
dedent(state);
|
237
|
+
}
|
238
|
+
}
|
239
|
+
|
240
|
+
|
241
|
+
// Indent Directives
|
242
|
+
if (stream.match(/^@(else if|if|media|else|for|each|while|mixin|function)/)) {
|
243
|
+
indent(state);
|
244
|
+
return "def";
|
245
|
+
}
|
246
|
+
|
247
|
+
// Other Directives
|
248
|
+
if (ch === "@") {
|
249
|
+
stream.next();
|
250
|
+
stream.eatWhile(/[\w-]/);
|
251
|
+
return "def";
|
252
|
+
}
|
253
|
+
|
254
|
+
if (stream.eatWhile(/[\w-]/)){
|
255
|
+
if(stream.match(/ *: *[\w-\+\$#!\("']/,false)){
|
256
|
+
word = stream.current().toLowerCase();
|
257
|
+
var prop = state.prevProp + "-" + word;
|
258
|
+
if (propertyKeywords.hasOwnProperty(prop)) {
|
259
|
+
return "property";
|
260
|
+
} else if (propertyKeywords.hasOwnProperty(word)) {
|
261
|
+
state.prevProp = word;
|
262
|
+
return "property";
|
263
|
+
} else if (fontProperties.hasOwnProperty(word)) {
|
264
|
+
return "property";
|
265
|
+
}
|
266
|
+
return "tag";
|
267
|
+
}
|
268
|
+
else if(stream.match(/ *:/,false)){
|
269
|
+
indent(state);
|
270
|
+
state.cursorHalf = 1;
|
271
|
+
state.prevProp = stream.current().toLowerCase();
|
272
|
+
return "property";
|
273
|
+
}
|
274
|
+
else if(stream.match(/ *,/,false)){
|
275
|
+
return "tag";
|
276
|
+
}
|
277
|
+
else{
|
278
|
+
indent(state);
|
279
|
+
return "tag";
|
280
|
+
}
|
281
|
+
}
|
282
|
+
|
283
|
+
if(ch === ":"){
|
284
|
+
if (stream.match(pseudoElementsRegexp)){ // could be a pseudo-element
|
285
|
+
return "variable-3";
|
286
|
+
}
|
287
|
+
stream.next();
|
288
|
+
state.cursorHalf=1;
|
289
|
+
return "operator";
|
290
|
+
}
|
291
|
+
|
292
|
+
} // cursorHalf===0 ends here
|
293
|
+
else{
|
294
|
+
|
295
|
+
if (ch === "#") {
|
296
|
+
stream.next();
|
297
|
+
// Hex numbers
|
298
|
+
if (stream.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/)){
|
299
|
+
if (isEndLine(stream)) {
|
300
|
+
state.cursorHalf = 0;
|
301
|
+
}
|
302
|
+
return "number";
|
303
|
+
}
|
304
|
+
}
|
305
|
+
|
306
|
+
// Numbers
|
307
|
+
if (stream.match(/^-?[0-9\.]+/)){
|
308
|
+
if (isEndLine(stream)) {
|
309
|
+
state.cursorHalf = 0;
|
310
|
+
}
|
311
|
+
return "number";
|
312
|
+
}
|
313
|
+
|
314
|
+
// Units
|
315
|
+
if (stream.match(/^(px|em|in)\b/)){
|
316
|
+
if (isEndLine(stream)) {
|
317
|
+
state.cursorHalf = 0;
|
318
|
+
}
|
319
|
+
return "unit";
|
320
|
+
}
|
321
|
+
|
322
|
+
if (stream.match(keywordsRegexp)){
|
323
|
+
if (isEndLine(stream)) {
|
324
|
+
state.cursorHalf = 0;
|
325
|
+
}
|
326
|
+
return "keyword";
|
327
|
+
}
|
328
|
+
|
329
|
+
if (stream.match(/^url/) && stream.peek() === "(") {
|
330
|
+
state.tokenizer = urlTokens;
|
331
|
+
if (isEndLine(stream)) {
|
332
|
+
state.cursorHalf = 0;
|
333
|
+
}
|
334
|
+
return "atom";
|
335
|
+
}
|
336
|
+
|
337
|
+
// Variables
|
338
|
+
if (ch === "$") {
|
339
|
+
stream.next();
|
340
|
+
stream.eatWhile(/[\w-]/);
|
341
|
+
if (isEndLine(stream)) {
|
342
|
+
state.cursorHalf = 0;
|
343
|
+
}
|
344
|
+
return "variable-2";
|
345
|
+
}
|
346
|
+
|
347
|
+
// bang character for !important, !default, etc.
|
348
|
+
if (ch === "!") {
|
349
|
+
stream.next();
|
350
|
+
state.cursorHalf = 0;
|
351
|
+
return stream.match(/^[\w]+/) ? "keyword": "operator";
|
352
|
+
}
|
353
|
+
|
354
|
+
if (stream.match(opRegexp)){
|
355
|
+
if (isEndLine(stream)) {
|
356
|
+
state.cursorHalf = 0;
|
357
|
+
}
|
358
|
+
return "operator";
|
359
|
+
}
|
360
|
+
|
361
|
+
// attributes
|
362
|
+
if (stream.eatWhile(/[\w-]/)) {
|
363
|
+
if (isEndLine(stream)) {
|
364
|
+
state.cursorHalf = 0;
|
365
|
+
}
|
366
|
+
word = stream.current().toLowerCase();
|
367
|
+
if (valueKeywords.hasOwnProperty(word)) {
|
368
|
+
return "atom";
|
369
|
+
} else if (colorKeywords.hasOwnProperty(word)) {
|
370
|
+
return "keyword";
|
371
|
+
} else if (propertyKeywords.hasOwnProperty(word)) {
|
372
|
+
state.prevProp = stream.current().toLowerCase();
|
373
|
+
return "property";
|
374
|
+
} else {
|
375
|
+
return "tag";
|
376
|
+
}
|
377
|
+
}
|
378
|
+
|
379
|
+
//stream.eatSpace();
|
380
|
+
if (isEndLine(stream)) {
|
381
|
+
state.cursorHalf = 0;
|
382
|
+
return null;
|
383
|
+
}
|
384
|
+
|
385
|
+
} // else ends here
|
386
|
+
|
387
|
+
if (stream.match(opRegexp))
|
388
|
+
return "operator";
|
389
|
+
|
390
|
+
// If we haven't returned by now, we move 1 character
|
391
|
+
// and return an error
|
392
|
+
stream.next();
|
393
|
+
return null;
|
394
|
+
}
|
395
|
+
|
396
|
+
function tokenLexer(stream, state) {
|
397
|
+
if (stream.sol()) state.indentCount = 0;
|
398
|
+
var style = state.tokenizer(stream, state);
|
399
|
+
var current = stream.current();
|
400
|
+
|
401
|
+
if (current === "@return" || current === "}"){
|
402
|
+
dedent(state);
|
403
|
+
}
|
404
|
+
|
405
|
+
if (style !== null) {
|
406
|
+
var startOfToken = stream.pos - current.length;
|
407
|
+
|
408
|
+
var withCurrentIndent = startOfToken + (config.indentUnit * state.indentCount);
|
409
|
+
|
410
|
+
var newScopes = [];
|
411
|
+
|
412
|
+
for (var i = 0; i < state.scopes.length; i++) {
|
413
|
+
var scope = state.scopes[i];
|
414
|
+
|
415
|
+
if (scope.offset <= withCurrentIndent)
|
416
|
+
newScopes.push(scope);
|
417
|
+
}
|
418
|
+
|
419
|
+
state.scopes = newScopes;
|
420
|
+
}
|
421
|
+
|
422
|
+
|
423
|
+
return style;
|
424
|
+
}
|
425
|
+
|
426
|
+
return {
|
427
|
+
startState: function() {
|
428
|
+
return {
|
429
|
+
tokenizer: tokenBase,
|
430
|
+
scopes: [{offset: 0, type: "sass"}],
|
431
|
+
indentCount: 0,
|
432
|
+
cursorHalf: 0, // cursor half tells us if cursor lies after (1)
|
433
|
+
// or before (0) colon (well... more or less)
|
434
|
+
definedVars: [],
|
435
|
+
definedMixins: []
|
436
|
+
};
|
437
|
+
},
|
438
|
+
token: function(stream, state) {
|
439
|
+
var style = tokenLexer(stream, state);
|
440
|
+
|
441
|
+
state.lastToken = { style: style, content: stream.current() };
|
442
|
+
|
443
|
+
return style;
|
444
|
+
},
|
445
|
+
|
446
|
+
indent: function(state) {
|
447
|
+
return state.scopes[0].offset;
|
448
|
+
},
|
449
|
+
|
450
|
+
blockCommentStart: "/*",
|
451
|
+
blockCommentEnd: "*/",
|
452
|
+
lineComment: "//",
|
453
|
+
fold: "indent"
|
454
|
+
};
|
455
|
+
}, "css");
|
456
|
+
|
457
|
+
CodeMirror.defineMIME("text/x-sass", "sass");
|
458
|
+
|
459
|
+
});
|
@@ -0,0 +1,122 @@
|
|
1
|
+
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
2
|
+
// Distributed under an MIT license: https://codemirror.net/LICENSE
|
3
|
+
|
4
|
+
(function() {
|
5
|
+
var mode = CodeMirror.getMode({indentUnit: 2}, "sass");
|
6
|
+
// Since Sass has an indent-based syntax, is almost impossible to test correctly the indentation in all cases.
|
7
|
+
// So disable it for tests.
|
8
|
+
mode.indent = undefined;
|
9
|
+
function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }
|
10
|
+
|
11
|
+
MT("comment",
|
12
|
+
"[comment // this is a comment]",
|
13
|
+
"[comment also this is a comment]")
|
14
|
+
|
15
|
+
MT("comment_multiline",
|
16
|
+
"[comment /* this is a comment]",
|
17
|
+
"[comment also this is a comment]")
|
18
|
+
|
19
|
+
MT("variable",
|
20
|
+
"[variable-2 $page-width][operator :] [number 800][unit px]")
|
21
|
+
|
22
|
+
MT("global_attributes",
|
23
|
+
"[tag body]",
|
24
|
+
" [property font][operator :]",
|
25
|
+
" [property family][operator :] [atom sans-serif]",
|
26
|
+
" [property size][operator :] [number 30][unit em]",
|
27
|
+
" [property weight][operator :] [atom bold]")
|
28
|
+
|
29
|
+
MT("scoped_styles",
|
30
|
+
"[builtin #contents]",
|
31
|
+
" [property width][operator :] [variable-2 $page-width]",
|
32
|
+
" [builtin #sidebar]",
|
33
|
+
" [property float][operator :] [atom right]",
|
34
|
+
" [property width][operator :] [variable-2 $sidebar-width]",
|
35
|
+
" [builtin #main]",
|
36
|
+
" [property width][operator :] [variable-2 $page-width] [operator -] [variable-2 $sidebar-width]",
|
37
|
+
" [property background][operator :] [variable-2 $primary-color]",
|
38
|
+
" [tag h2]",
|
39
|
+
" [property color][operator :] [keyword blue]")
|
40
|
+
|
41
|
+
// Sass allows to write the colon as first char instead of a "separator".
|
42
|
+
// :color red
|
43
|
+
// Not supported
|
44
|
+
// MT("property_syntax",
|
45
|
+
// "[qualifier .foo]",
|
46
|
+
// " [operator :][property color] [keyword red]")
|
47
|
+
|
48
|
+
MT("import",
|
49
|
+
"[def @import] [string \"sass/variables\"]",
|
50
|
+
// Probably it should parsed as above: as a string even without the " or '
|
51
|
+
// "[def @import] [string sass/baz]"
|
52
|
+
"[def @import] [tag sass][operator /][tag baz]")
|
53
|
+
|
54
|
+
MT("def",
|
55
|
+
"[def @if] [variable-2 $foo] [def @else]")
|
56
|
+
|
57
|
+
MT("tag_on_more_lines",
|
58
|
+
"[tag td],",
|
59
|
+
"[tag th]",
|
60
|
+
" [property font-family][operator :] [string \"Arial\"], [atom serif]")
|
61
|
+
|
62
|
+
MT("important",
|
63
|
+
"[qualifier .foo]",
|
64
|
+
" [property text-decoration][operator :] [atom none] [keyword !important]",
|
65
|
+
"[tag h1]",
|
66
|
+
" [property font-size][operator :] [number 2.5][unit em]")
|
67
|
+
|
68
|
+
MT("selector",
|
69
|
+
// SCSS doesn't highlight the :
|
70
|
+
// "[tag h1]:[variable-3 before],",
|
71
|
+
// "[tag h2]:[variable-3 before]",
|
72
|
+
"[tag h1][variable-3 :before],",
|
73
|
+
"[tag h2][variable-3 :before]",
|
74
|
+
" [property content][operator :] [string \"::\"]")
|
75
|
+
|
76
|
+
MT("definition_mixin_equal",
|
77
|
+
"[variable-2 $defined-bs-type][operator :] [atom border-box] [keyword !default]",
|
78
|
+
"[meta =bs][operator (][variable-2 $bs-type][operator :] [variable-2 $defined-bs-type][operator )]",
|
79
|
+
" [meta -webkit-][property box-sizing][operator :] [variable-2 $bs-type]",
|
80
|
+
" [property box-sizing][operator :] [variable-2 $bs-type]")
|
81
|
+
|
82
|
+
MT("definition_mixin_with_space",
|
83
|
+
"[variable-2 $defined-bs-type][operator :] [atom border-box] [keyword !default]",
|
84
|
+
"[def @mixin] [tag bs][operator (][variable-2 $bs-type][operator :] [variable-2 $defined-bs-type][operator )] ",
|
85
|
+
" [meta -moz-][property box-sizing][operator :] [variable-2 $bs-type]",
|
86
|
+
" [property box-sizing][operator :] [variable-2 $bs-type]")
|
87
|
+
|
88
|
+
MT("numbers_start_dot_include_plus",
|
89
|
+
// The % is not highlighted correctly
|
90
|
+
// "[meta =button-links][operator (][variable-2 $button-base][operator :] [atom darken][operator (][variable-2 $color11], [number 10][unit %][operator )][operator )]",
|
91
|
+
"[meta =button-links][operator (][variable-2 $button-base][operator :] [atom darken][operator (][variable-2 $color11], [number 10][operator %))]",
|
92
|
+
" [property padding][operator :] [number .3][unit em] [number .6][unit em]",
|
93
|
+
" [variable-3 +border-radius][operator (][number 8][unit px][operator )]",
|
94
|
+
" [property background-color][operator :] [variable-2 $button-base]")
|
95
|
+
|
96
|
+
MT("include",
|
97
|
+
"[qualifier .bar]",
|
98
|
+
" [def @include] [tag border-radius][operator (][number 8][unit px][operator )]")
|
99
|
+
|
100
|
+
MT("reference_parent",
|
101
|
+
"[qualifier .col]",
|
102
|
+
" [property clear][operator :] [atom both]",
|
103
|
+
// SCSS doesn't highlight the :
|
104
|
+
// " &:[variable-3 after]",
|
105
|
+
" &[variable-3 :after]",
|
106
|
+
" [property content][operator :] [string '']",
|
107
|
+
" [property clear][operator :] [atom both]")
|
108
|
+
|
109
|
+
MT("reference_parent_with_spaces",
|
110
|
+
"[tag section]",
|
111
|
+
" [property border-left][operator :] [number 20][unit px] [atom transparent] [atom solid] ",
|
112
|
+
" &[qualifier .section3]",
|
113
|
+
" [qualifier .title]",
|
114
|
+
" [property color][operator :] [keyword white] ",
|
115
|
+
" [qualifier .vermas]",
|
116
|
+
" [property display][operator :] [atom none]")
|
117
|
+
|
118
|
+
MT("font_face",
|
119
|
+
"[def @font-face]",
|
120
|
+
" [property font-family][operator :] [string 'icomoon']",
|
121
|
+
" [property src][operator :] [atom url][operator (][string fonts/icomoon.ttf][operator )]")
|
122
|
+
})();
|
@@ -0,0 +1,42 @@
|
|
1
|
+
<!doctype html>
|
2
|
+
|
3
|
+
<title>CodeMirror: Spreadsheet mode</title>
|
4
|
+
<meta charset="utf-8"/>
|
5
|
+
<link rel=stylesheet href="../../doc/docs.css">
|
6
|
+
|
7
|
+
<link rel="stylesheet" href="../../lib/codemirror.css">
|
8
|
+
<script src="../../lib/codemirror.js"></script>
|
9
|
+
<script src="../../addon/edit/matchbrackets.js"></script>
|
10
|
+
<script src="spreadsheet.js"></script>
|
11
|
+
<style>.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
|
12
|
+
<div id=nav>
|
13
|
+
<a href="https://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png" alt=""></a>
|
14
|
+
|
15
|
+
<ul>
|
16
|
+
<li><a href="../../index.html">Home</a>
|
17
|
+
<li><a href="../../doc/manual.html">Manual</a>
|
18
|
+
<li><a href="https://github.com/codemirror/codemirror">Code</a>
|
19
|
+
</ul>
|
20
|
+
<ul>
|
21
|
+
<li><a href="../index.html">Language modes</a>
|
22
|
+
<li><a class=active href="#">Spreadsheet</a>
|
23
|
+
</ul>
|
24
|
+
</div>
|
25
|
+
|
26
|
+
<article>
|
27
|
+
<h2>Spreadsheet mode</h2>
|
28
|
+
<form><textarea id="code" name="code">=IF(A1:B2, TRUE, FALSE) / 100</textarea></form>
|
29
|
+
|
30
|
+
<script>
|
31
|
+
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
|
32
|
+
lineNumbers: true,
|
33
|
+
matchBrackets: true,
|
34
|
+
extraKeys: {"Tab": "indentAuto"}
|
35
|
+
});
|
36
|
+
</script>
|
37
|
+
|
38
|
+
<p><strong>MIME types defined:</strong> <code>text/x-spreadsheet</code>.</p>
|
39
|
+
|
40
|
+
<h3>The Spreadsheet Mode</h3>
|
41
|
+
<p> Created by <a href="https://github.com/robertleeplummerjr">Robert Plummer</a></p>
|
42
|
+
</article>
|