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.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +3 -0
  3. data/.idea/hyde_admin.iml +2 -0
  4. data/.idea/vcs.xml +6 -0
  5. data/CHANGELOG.md +35 -0
  6. data/README.md +23 -0
  7. data/TODO.md +3 -0
  8. data/bin/admin_views/admin_layout.html.erb +204 -108
  9. data/bin/admin_views/configuration.erb +13 -0
  10. data/bin/admin_views/dashboard.erb +1 -1
  11. data/bin/admin_views/editor_html.erb +24 -0
  12. data/bin/admin_views/editor_js.erb +120 -0
  13. data/bin/admin_views/files/edit.erb +30 -0
  14. data/bin/admin_views/files/listing.erb +111 -0
  15. data/bin/admin_views/partials/image_element.html.erb +4 -0
  16. data/bin/admin_views/partials/images_page.html.erb +8 -0
  17. data/bin/admin_views/posts/edit.erb +158 -0
  18. data/bin/admin_views/posts/listing.erb +37 -0
  19. data/bin/admin_views/upload_image_form.erb +45 -0
  20. data/bin/fslightbox/fslightbox.js +1 -0
  21. data/bin/hyde_admin +3 -0
  22. data/bin/hyde_admin.ru +306 -56
  23. data/bin/hyde_admin.yml +12 -5
  24. data/bin/hyde_assets/hyde_admin.css +37 -0
  25. data/bin/hyde_assets/hyde_admin.js +24 -0
  26. data/bin/i18n/en.yml +77 -1
  27. data/bin/i18n/fr.yml +77 -1
  28. data/bin/lib/codemirror.css +349 -0
  29. data/bin/lib/codemirror.js +9833 -0
  30. data/bin/mode/css/css.js +864 -0
  31. data/bin/mode/css/gss.html +104 -0
  32. data/bin/mode/css/gss_test.js +17 -0
  33. data/bin/mode/css/index.html +81 -0
  34. data/bin/mode/css/less.html +152 -0
  35. data/bin/mode/css/less_test.js +54 -0
  36. data/bin/mode/css/scss.html +158 -0
  37. data/bin/mode/css/scss_test.js +110 -0
  38. data/bin/mode/css/test.js +217 -0
  39. data/bin/mode/htmlembedded/htmlembedded.js +37 -0
  40. data/bin/mode/htmlembedded/index.html +60 -0
  41. data/bin/mode/htmlmixed/htmlmixed.js +153 -0
  42. data/bin/mode/htmlmixed/index.html +100 -0
  43. data/bin/mode/javascript/index.html +118 -0
  44. data/bin/mode/javascript/javascript.js +959 -0
  45. data/bin/mode/javascript/json-ld.html +72 -0
  46. data/bin/mode/javascript/test.js +521 -0
  47. data/bin/mode/javascript/typescript.html +62 -0
  48. data/bin/mode/markdown/index.html +418 -0
  49. data/bin/mode/markdown/markdown.js +886 -0
  50. data/bin/mode/markdown/test.js +1319 -0
  51. data/bin/mode/ruby/index.html +183 -0
  52. data/bin/mode/ruby/ruby.js +303 -0
  53. data/bin/mode/ruby/test.js +23 -0
  54. data/bin/mode/sass/index.html +68 -0
  55. data/bin/mode/sass/sass.js +459 -0
  56. data/bin/mode/sass/test.js +122 -0
  57. data/bin/mode/spreadsheet/index.html +42 -0
  58. data/bin/mode/spreadsheet/spreadsheet.js +112 -0
  59. data/bin/mode/xml/index.html +61 -0
  60. data/bin/mode/xml/test.js +51 -0
  61. data/bin/mode/xml/xml.js +417 -0
  62. data/bin/mode/yaml/index.html +80 -0
  63. data/bin/mode/yaml/yaml.js +120 -0
  64. data/bin/mode/yaml-frontmatter/index.html +121 -0
  65. data/bin/mode/yaml-frontmatter/yaml-frontmatter.js +72 -0
  66. data/hyde_admin.gemspec +7 -1
  67. data/lib/hyde_admin/version.rb +1 -1
  68. metadata +131 -7
  69. data/bin/admin_views/edit.erb +0 -57
  70. data/bin/admin_views/listing.erb +0 -32
  71. 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>