hyde_admin 0.0.1 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitattributes +3 -0
- data/.idea/hyde_admin.iml +2 -0
- data/.idea/vcs.xml +6 -0
- data/CHANGELOG.md +35 -0
- data/README.md +23 -0
- data/TODO.md +3 -0
- data/bin/admin_views/admin_layout.html.erb +204 -108
- 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/partials/image_element.html.erb +4 -0
- data/bin/admin_views/partials/images_page.html.erb +8 -0
- data/bin/admin_views/posts/edit.erb +158 -0
- data/bin/admin_views/posts/listing.erb +37 -0
- data/bin/admin_views/upload_image_form.erb +45 -0
- data/bin/fslightbox/fslightbox.js +1 -0
- data/bin/hyde_admin +3 -0
- data/bin/hyde_admin.ru +306 -56
- data/bin/hyde_admin.yml +12 -5
- data/bin/hyde_assets/hyde_admin.css +37 -0
- data/bin/hyde_assets/hyde_admin.js +24 -0
- data/bin/i18n/en.yml +77 -1
- data/bin/i18n/fr.yml +77 -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 +7 -1
- data/lib/hyde_admin/version.rb +1 -1
- metadata +131 -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>
|