written 0.0.2

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.
Files changed (65) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -0
  3. data/Gemfile +15 -0
  4. data/Gemfile.lock +128 -0
  5. data/Rakefile +83 -0
  6. data/lib/written/app/assets/javascripts/vendors/prism.js +1411 -0
  7. data/lib/written/app/assets/javascripts/written/core/content.coffee +106 -0
  8. data/lib/written/app/assets/javascripts/written/core/cursor.coffee +59 -0
  9. data/lib/written/app/assets/javascripts/written/core/document.coffee +19 -0
  10. data/lib/written/app/assets/javascripts/written/core/ext.coffee +109 -0
  11. data/lib/written/app/assets/javascripts/written/core/extensions.coffee +2 -0
  12. data/lib/written/app/assets/javascripts/written/core/history.coffee +16 -0
  13. data/lib/written/app/assets/javascripts/written/core/observer.coffee +29 -0
  14. data/lib/written/app/assets/javascripts/written/extensions/clipboard.coffee +114 -0
  15. data/lib/written/app/assets/javascripts/written/extensions/image.coffee +91 -0
  16. data/lib/written/app/assets/javascripts/written/parsers/block/code.coffee +25 -0
  17. data/lib/written/app/assets/javascripts/written/parsers/block/heading.coffee +10 -0
  18. data/lib/written/app/assets/javascripts/written/parsers/block/image.coffee +18 -0
  19. data/lib/written/app/assets/javascripts/written/parsers/block/olist.coffee +18 -0
  20. data/lib/written/app/assets/javascripts/written/parsers/block/paragraph.coffee +10 -0
  21. data/lib/written/app/assets/javascripts/written/parsers/block/ulist.coffee +17 -0
  22. data/lib/written/app/assets/javascripts/written/parsers/inline/italic.coffee +13 -0
  23. data/lib/written/app/assets/javascripts/written/parsers/inline/link.coffee +16 -0
  24. data/lib/written/app/assets/javascripts/written/parsers/inline/strong.coffee +12 -0
  25. data/lib/written/app/assets/javascripts/written/parsers/parsers.coffee +98 -0
  26. data/lib/written/app/assets/javascripts/written.coffee +4 -0
  27. data/lib/written/app/assets/stylesheets/vendors/prism.css +138 -0
  28. data/lib/written/app/assets/stylesheets/written.scss +21 -0
  29. data/lib/written/document.rb +42 -0
  30. data/lib/written/node.rb +21 -0
  31. data/lib/written/nodes/code.rb +65 -0
  32. data/lib/written/nodes/heading.rb +15 -0
  33. data/lib/written/nodes/image.rb +14 -0
  34. data/lib/written/nodes/ordered_list.rb +18 -0
  35. data/lib/written/nodes/unordered_list.rb +19 -0
  36. data/lib/written/parsers/base.rb +26 -0
  37. data/lib/written/parsers/code.rb +60 -0
  38. data/lib/written/parsers/heading.rb +19 -0
  39. data/lib/written/parsers/image.rb +19 -0
  40. data/lib/written/parsers/link.rb +12 -0
  41. data/lib/written/parsers/list.rb +33 -0
  42. data/lib/written/parsers/word.rb +16 -0
  43. data/lib/written/parsers.rb +11 -0
  44. data/lib/written/railtie.rb +20 -0
  45. data/lib/written/version.rb +3 -0
  46. data/lib/written.rb +14 -0
  47. data/test/javascript/assertions/assert.coffee +3 -0
  48. data/test/javascript/polyfills/HTMLULListElement.coffee +0 -0
  49. data/test/javascript/polyfills/Text.coffee +0 -0
  50. data/test/javascript/polyfills.coffee +2 -0
  51. data/test/javascript/runner.coffee +46 -0
  52. data/test/javascript/tests/initialization.coffee +16 -0
  53. data/test/javascript/tests/parsing.coffee +9 -0
  54. data/test/ruby/blank_test.rb +83 -0
  55. data/test/server/app/assets/javascripts/application.coffee +3 -0
  56. data/test/server/app/assets/stylesheets/application.scss +10 -0
  57. data/test/server/app/controllers/application_controller.rb +2 -0
  58. data/test/server/app/controllers/posts_controller.rb +4 -0
  59. data/test/server/app/views/layouts/application.html.erb +14 -0
  60. data/test/server/app/views/posts/show.html.erb +14 -0
  61. data/test/server/application.rb +12 -0
  62. data/test/server/config.ru +5 -0
  63. data/test/server/log/test.log +570 -0
  64. data/written.gemspec +17 -0
  65. metadata +106 -0
@@ -0,0 +1,1411 @@
1
+ /* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript+apacheconf+bash+c+csharp+cpp+ruby+git+go+haml+http+java+nginx+objectivec+php+python+scss */
2
+ var _self = (typeof window !== 'undefined')
3
+ ? window // if in browser
4
+ : (
5
+ (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)
6
+ ? self // if in worker
7
+ : {} // if in node js
8
+ );
9
+
10
+ /**
11
+ * Prism: Lightweight, robust, elegant syntax highlighting
12
+ * MIT license http://www.opensource.org/licenses/mit-license.php/
13
+ * @author Lea Verou http://lea.verou.me
14
+ */
15
+
16
+ var Prism = (function(){
17
+
18
+ // Private helper vars
19
+ var lang = /\blang(?:uage)?-(?!\*)(\w+)\b/i;
20
+
21
+ var _ = _self.Prism = {
22
+ util: {
23
+ encode: function (tokens) {
24
+ if (tokens instanceof Token) {
25
+ return new Token(tokens.type, _.util.encode(tokens.content), tokens.alias);
26
+ } else if (_.util.type(tokens) === 'Array') {
27
+ return tokens.map(_.util.encode);
28
+ } else {
29
+ return tokens.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\u00a0/g, ' ');
30
+ }
31
+ },
32
+
33
+ type: function (o) {
34
+ return Object.prototype.toString.call(o).match(/\[object (\w+)\]/)[1];
35
+ },
36
+
37
+ // Deep clone a language definition (e.g. to extend it)
38
+ clone: function (o) {
39
+ var type = _.util.type(o);
40
+
41
+ switch (type) {
42
+ case 'Object':
43
+ var clone = {};
44
+
45
+ for (var key in o) {
46
+ if (o.hasOwnProperty(key)) {
47
+ clone[key] = _.util.clone(o[key]);
48
+ }
49
+ }
50
+
51
+ return clone;
52
+
53
+ case 'Array':
54
+ // Check for existence for IE8
55
+ return o.map && o.map(function(v) { return _.util.clone(v); });
56
+ }
57
+
58
+ return o;
59
+ }
60
+ },
61
+
62
+ languages: {
63
+ extend: function (id, redef) {
64
+ var lang = _.util.clone(_.languages[id]);
65
+
66
+ for (var key in redef) {
67
+ lang[key] = redef[key];
68
+ }
69
+
70
+ return lang;
71
+ },
72
+
73
+ /**
74
+ * Insert a token before another token in a language literal
75
+ * As this needs to recreate the object (we cannot actually insert before keys in object literals),
76
+ * we cannot just provide an object, we need anobject and a key.
77
+ * @param inside The key (or language id) of the parent
78
+ * @param before The key to insert before. If not provided, the function appends instead.
79
+ * @param insert Object with the key/value pairs to insert
80
+ * @param root The object that contains `inside`. If equal to Prism.languages, it can be omitted.
81
+ */
82
+ insertBefore: function (inside, before, insert, root) {
83
+ root = root || _.languages;
84
+ var grammar = root[inside];
85
+
86
+ if (arguments.length == 2) {
87
+ insert = arguments[1];
88
+
89
+ for (var newToken in insert) {
90
+ if (insert.hasOwnProperty(newToken)) {
91
+ grammar[newToken] = insert[newToken];
92
+ }
93
+ }
94
+
95
+ return grammar;
96
+ }
97
+
98
+ var ret = {};
99
+
100
+ for (var token in grammar) {
101
+
102
+ if (grammar.hasOwnProperty(token)) {
103
+
104
+ if (token == before) {
105
+
106
+ for (var newToken in insert) {
107
+
108
+ if (insert.hasOwnProperty(newToken)) {
109
+ ret[newToken] = insert[newToken];
110
+ }
111
+ }
112
+ }
113
+
114
+ ret[token] = grammar[token];
115
+ }
116
+ }
117
+
118
+ // Update references in other language definitions
119
+ _.languages.DFS(_.languages, function(key, value) {
120
+ if (value === root[inside] && key != inside) {
121
+ this[key] = ret;
122
+ }
123
+ });
124
+
125
+ return root[inside] = ret;
126
+ },
127
+
128
+ // Traverse a language definition with Depth First Search
129
+ DFS: function(o, callback, type) {
130
+ for (var i in o) {
131
+ if (o.hasOwnProperty(i)) {
132
+ callback.call(o, i, o[i], type || i);
133
+
134
+ if (_.util.type(o[i]) === 'Object') {
135
+ _.languages.DFS(o[i], callback);
136
+ }
137
+ else if (_.util.type(o[i]) === 'Array') {
138
+ _.languages.DFS(o[i], callback, i);
139
+ }
140
+ }
141
+ }
142
+ }
143
+ },
144
+ plugins: {},
145
+
146
+ highlightAll: function(async, callback) {
147
+ var elements = document.querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code');
148
+
149
+ for (var i=0, element; element = elements[i++];) {
150
+ _.highlightElement(element, async === true, callback);
151
+ }
152
+ },
153
+
154
+ highlightElement: function(element, async, callback) {
155
+ // Find language
156
+ var language, grammar, parent = element;
157
+
158
+ while (parent && !lang.test(parent.className)) {
159
+ parent = parent.parentNode;
160
+ }
161
+
162
+ if (parent) {
163
+ language = (parent.className.match(lang) || [,''])[1];
164
+ grammar = _.languages[language];
165
+ }
166
+
167
+ // Set language on the element, if not present
168
+ element.className = element.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
169
+
170
+ // Set language on the parent, for styling
171
+ parent = element.parentNode;
172
+
173
+ if (/pre/i.test(parent.nodeName)) {
174
+ parent.className = parent.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
175
+ }
176
+
177
+ var code = element.textContent;
178
+
179
+ var env = {
180
+ element: element,
181
+ language: language,
182
+ grammar: grammar,
183
+ code: code
184
+ };
185
+
186
+ if (!code || !grammar) {
187
+ _.hooks.run('complete', env);
188
+ return;
189
+ }
190
+
191
+ _.hooks.run('before-highlight', env);
192
+
193
+ if (async && _self.Worker) {
194
+ var worker = new Worker(_.filename);
195
+
196
+ worker.onmessage = function(evt) {
197
+ env.highlightedCode = evt.data;
198
+
199
+ _.hooks.run('before-insert', env);
200
+
201
+ env.element.innerHTML = env.highlightedCode;
202
+
203
+ callback && callback.call(env.element);
204
+ _.hooks.run('after-highlight', env);
205
+ _.hooks.run('complete', env);
206
+ };
207
+
208
+ worker.postMessage(JSON.stringify({
209
+ language: env.language,
210
+ code: env.code,
211
+ immediateClose: true
212
+ }));
213
+ }
214
+ else {
215
+ env.highlightedCode = _.highlight(env.code, env.grammar, env.language);
216
+
217
+ _.hooks.run('before-insert', env);
218
+
219
+ env.element.innerHTML = env.highlightedCode;
220
+
221
+ callback && callback.call(element);
222
+
223
+ _.hooks.run('after-highlight', env);
224
+ _.hooks.run('complete', env);
225
+ }
226
+ },
227
+
228
+ highlight: function (text, grammar, language) {
229
+ var tokens = _.tokenize(text, grammar);
230
+ return Token.stringify(_.util.encode(tokens), language);
231
+ },
232
+
233
+ tokenize: function(text, grammar, language) {
234
+ var Token = _.Token;
235
+
236
+ var strarr = [text];
237
+
238
+ var rest = grammar.rest;
239
+
240
+ if (rest) {
241
+ for (var token in rest) {
242
+ grammar[token] = rest[token];
243
+ }
244
+
245
+ delete grammar.rest;
246
+ }
247
+
248
+ tokenloop: for (var token in grammar) {
249
+ if(!grammar.hasOwnProperty(token) || !grammar[token]) {
250
+ continue;
251
+ }
252
+
253
+ var patterns = grammar[token];
254
+ patterns = (_.util.type(patterns) === "Array") ? patterns : [patterns];
255
+
256
+ for (var j = 0; j < patterns.length; ++j) {
257
+ var pattern = patterns[j],
258
+ inside = pattern.inside,
259
+ lookbehind = !!pattern.lookbehind,
260
+ lookbehindLength = 0,
261
+ alias = pattern.alias;
262
+
263
+ pattern = pattern.pattern || pattern;
264
+
265
+ for (var i=0; i<strarr.length; i++) { // Don’t cache length as it changes during the loop
266
+
267
+ var str = strarr[i];
268
+
269
+ if (strarr.length > text.length) {
270
+ // Something went terribly wrong, ABORT, ABORT!
271
+ break tokenloop;
272
+ }
273
+
274
+ if (str instanceof Token) {
275
+ continue;
276
+ }
277
+
278
+ pattern.lastIndex = 0;
279
+
280
+ var match = pattern.exec(str);
281
+
282
+ if (match) {
283
+ if(lookbehind) {
284
+ lookbehindLength = match[1].length;
285
+ }
286
+
287
+ var from = match.index - 1 + lookbehindLength,
288
+ match = match[0].slice(lookbehindLength),
289
+ len = match.length,
290
+ to = from + len,
291
+ before = str.slice(0, from + 1),
292
+ after = str.slice(to + 1);
293
+
294
+ var args = [i, 1];
295
+
296
+ if (before) {
297
+ args.push(before);
298
+ }
299
+
300
+ var wrapped = new Token(token, inside? _.tokenize(match, inside) : match, alias);
301
+
302
+ args.push(wrapped);
303
+
304
+ if (after) {
305
+ args.push(after);
306
+ }
307
+
308
+ Array.prototype.splice.apply(strarr, args);
309
+ }
310
+ }
311
+ }
312
+ }
313
+
314
+ return strarr;
315
+ },
316
+
317
+ hooks: {
318
+ all: {},
319
+
320
+ add: function (name, callback) {
321
+ var hooks = _.hooks.all;
322
+
323
+ hooks[name] = hooks[name] || [];
324
+
325
+ hooks[name].push(callback);
326
+ },
327
+
328
+ run: function (name, env) {
329
+ var callbacks = _.hooks.all[name];
330
+
331
+ if (!callbacks || !callbacks.length) {
332
+ return;
333
+ }
334
+
335
+ for (var i=0, callback; callback = callbacks[i++];) {
336
+ callback(env);
337
+ }
338
+ }
339
+ }
340
+ };
341
+
342
+ var Token = _.Token = function(type, content, alias) {
343
+ this.type = type;
344
+ this.content = content;
345
+ this.alias = alias;
346
+ };
347
+
348
+ Token.stringify = function(o, language, parent) {
349
+ if (typeof o == 'string') {
350
+ return o;
351
+ }
352
+
353
+ if (_.util.type(o) === 'Array') {
354
+ return o.map(function(element) {
355
+ return Token.stringify(element, language, o);
356
+ }).join('');
357
+ }
358
+
359
+ var env = {
360
+ type: o.type,
361
+ content: Token.stringify(o.content, language, parent),
362
+ tag: 'span',
363
+ classes: ['token', o.type],
364
+ attributes: {},
365
+ language: language,
366
+ parent: parent
367
+ };
368
+
369
+ if (env.type == 'comment') {
370
+ env.attributes['spellcheck'] = 'true';
371
+ }
372
+
373
+ if (o.alias) {
374
+ var aliases = _.util.type(o.alias) === 'Array' ? o.alias : [o.alias];
375
+ Array.prototype.push.apply(env.classes, aliases);
376
+ }
377
+
378
+ _.hooks.run('wrap', env);
379
+
380
+ var attributes = '';
381
+
382
+ for (var name in env.attributes) {
383
+ attributes += (attributes ? ' ' : '') + name + '="' + (env.attributes[name] || '') + '"';
384
+ }
385
+
386
+ return '<' + env.tag + ' class="' + env.classes.join(' ') + '" ' + attributes + '>' + env.content + '</' + env.tag + '>';
387
+
388
+ };
389
+
390
+ if (!_self.document) {
391
+ if (!_self.addEventListener) {
392
+ // in Node.js
393
+ return _self.Prism;
394
+ }
395
+ // In worker
396
+ _self.addEventListener('message', function(evt) {
397
+ var message = JSON.parse(evt.data),
398
+ lang = message.language,
399
+ code = message.code,
400
+ immediateClose = message.immediateClose;
401
+
402
+ _self.postMessage(_.highlight(code, _.languages[lang], lang));
403
+ if (immediateClose) {
404
+ _self.close();
405
+ }
406
+ }, false);
407
+
408
+ return _self.Prism;
409
+ }
410
+
411
+ // Get current script and highlight
412
+ var script = document.getElementsByTagName('script');
413
+
414
+ script = script[script.length - 1];
415
+
416
+ if (script) {
417
+ _.filename = script.src;
418
+
419
+ if (document.addEventListener && !script.hasAttribute('data-manual')) {
420
+ document.addEventListener('DOMContentLoaded', _.highlightAll);
421
+ }
422
+ }
423
+
424
+ return _self.Prism;
425
+
426
+ })();
427
+
428
+ if (typeof module !== 'undefined' && module.exports) {
429
+ module.exports = Prism;
430
+ }
431
+
432
+ // hack for components to work correctly in node.js
433
+ if (typeof global !== 'undefined') {
434
+ global.Prism = Prism;
435
+ }
436
+ ;
437
+ Prism.languages.markup = {
438
+ 'comment': /<!--[\w\W]*?-->/,
439
+ 'prolog': /<\?[\w\W]+?\?>/,
440
+ 'doctype': /<!DOCTYPE[\w\W]+?>/,
441
+ 'cdata': /<!\[CDATA\[[\w\W]*?]]>/i,
442
+ 'tag': {
443
+ pattern: /<\/?(?!\d)[^\s>\/=.$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,
444
+ inside: {
445
+ 'tag': {
446
+ pattern: /^<\/?[^\s>\/]+/i,
447
+ inside: {
448
+ 'punctuation': /^<\/?/,
449
+ 'namespace': /^[^\s>\/:]+:/
450
+ }
451
+ },
452
+ 'attr-value': {
453
+ pattern: /=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,
454
+ inside: {
455
+ 'punctuation': /[=>"']/
456
+ }
457
+ },
458
+ 'punctuation': /\/?>/,
459
+ 'attr-name': {
460
+ pattern: /[^\s>\/]+/,
461
+ inside: {
462
+ 'namespace': /^[^\s>\/:]+:/
463
+ }
464
+ }
465
+
466
+ }
467
+ },
468
+ 'entity': /&#?[\da-z]{1,8};/i
469
+ };
470
+
471
+ // Plugin to make entity title show the real entity, idea by Roman Komarov
472
+ Prism.hooks.add('wrap', function(env) {
473
+
474
+ if (env.type === 'entity') {
475
+ env.attributes['title'] = env.content.replace(/&amp;/, '&');
476
+ }
477
+ });
478
+
479
+ Prism.languages.xml = Prism.languages.markup;
480
+ Prism.languages.html = Prism.languages.markup;
481
+ Prism.languages.mathml = Prism.languages.markup;
482
+ Prism.languages.svg = Prism.languages.markup;
483
+
484
+ Prism.languages.css = {
485
+ 'comment': /\/\*[\w\W]*?\*\//,
486
+ 'atrule': {
487
+ pattern: /@[\w-]+?.*?(;|(?=\s*\{))/i,
488
+ inside: {
489
+ 'rule': /@[\w-]+/
490
+ // See rest below
491
+ }
492
+ },
493
+ 'url': /url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,
494
+ 'selector': /[^\{\}\s][^\{\};]*?(?=\s*\{)/,
495
+ 'string': /("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,
496
+ 'property': /(\b|\B)[\w-]+(?=\s*:)/i,
497
+ 'important': /\B!important\b/i,
498
+ 'function': /[-a-z0-9]+(?=\()/i,
499
+ 'punctuation': /[(){};:]/
500
+ };
501
+
502
+ Prism.languages.css['atrule'].inside.rest = Prism.util.clone(Prism.languages.css);
503
+
504
+ if (Prism.languages.markup) {
505
+ Prism.languages.insertBefore('markup', 'tag', {
506
+ 'style': {
507
+ pattern: /(<style[\w\W]*?>)[\w\W]*?(?=<\/style>)/i,
508
+ lookbehind: true,
509
+ inside: Prism.languages.css,
510
+ alias: 'language-css'
511
+ }
512
+ });
513
+
514
+ Prism.languages.insertBefore('inside', 'attr-value', {
515
+ 'style-attr': {
516
+ pattern: /\s*style=("|').*?\1/i,
517
+ inside: {
518
+ 'attr-name': {
519
+ pattern: /^\s*style/i,
520
+ inside: Prism.languages.markup.tag.inside
521
+ },
522
+ 'punctuation': /^\s*=\s*['"]|['"]\s*$/,
523
+ 'attr-value': {
524
+ pattern: /.+/i,
525
+ inside: Prism.languages.css
526
+ }
527
+ },
528
+ alias: 'language-css'
529
+ }
530
+ }, Prism.languages.markup.tag);
531
+ };
532
+ Prism.languages.clike = {
533
+ 'comment': [
534
+ {
535
+ pattern: /(^|[^\\])\/\*[\w\W]*?\*\//,
536
+ lookbehind: true
537
+ },
538
+ {
539
+ pattern: /(^|[^\\:])\/\/.*/,
540
+ lookbehind: true
541
+ }
542
+ ],
543
+ 'string': /(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
544
+ 'class-name': {
545
+ pattern: /((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,
546
+ lookbehind: true,
547
+ inside: {
548
+ punctuation: /(\.|\\)/
549
+ }
550
+ },
551
+ 'keyword': /\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,
552
+ 'boolean': /\b(true|false)\b/,
553
+ 'function': /[a-z0-9_]+(?=\()/i,
554
+ 'number': /\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,
555
+ 'operator': /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,
556
+ 'punctuation': /[{}[\];(),.:]/
557
+ };
558
+
559
+ Prism.languages.javascript = Prism.languages.extend('clike', {
560
+ 'keyword': /\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/,
561
+ 'number': /\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,
562
+ // Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)
563
+ 'function': /[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i
564
+ });
565
+
566
+ Prism.languages.insertBefore('javascript', 'keyword', {
567
+ 'regex': {
568
+ pattern: /(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,
569
+ lookbehind: true
570
+ }
571
+ });
572
+
573
+ Prism.languages.insertBefore('javascript', 'class-name', {
574
+ 'template-string': {
575
+ pattern: /`(?:\\`|\\?[^`])*`/,
576
+ inside: {
577
+ 'interpolation': {
578
+ pattern: /\$\{[^}]+\}/,
579
+ inside: {
580
+ 'interpolation-punctuation': {
581
+ pattern: /^\$\{|\}$/,
582
+ alias: 'punctuation'
583
+ },
584
+ rest: Prism.languages.javascript
585
+ }
586
+ },
587
+ 'string': /[\s\S]+/
588
+ }
589
+ }
590
+ });
591
+
592
+ if (Prism.languages.markup) {
593
+ Prism.languages.insertBefore('markup', 'tag', {
594
+ 'script': {
595
+ pattern: /(<script[\w\W]*?>)[\w\W]*?(?=<\/script>)/i,
596
+ lookbehind: true,
597
+ inside: Prism.languages.javascript,
598
+ alias: 'language-javascript'
599
+ }
600
+ });
601
+ }
602
+
603
+ Prism.languages.js = Prism.languages.javascript;
604
+ Prism.languages.apacheconf = {
605
+ 'comment': /#.*/,
606
+ 'directive-inline': {
607
+ pattern: /^(\s*)\b(AcceptFilter|AcceptPathInfo|AccessFileName|Action|AddAlt|AddAltByEncoding|AddAltByType|AddCharset|AddDefaultCharset|AddDescription|AddEncoding|AddHandler|AddIcon|AddIconByEncoding|AddIconByType|AddInputFilter|AddLanguage|AddModuleInfo|AddOutputFilter|AddOutputFilterByType|AddType|Alias|AliasMatch|Allow|AllowCONNECT|AllowEncodedSlashes|AllowMethods|AllowOverride|AllowOverrideList|Anonymous|Anonymous_LogEmail|Anonymous_MustGiveEmail|Anonymous_NoUserID|Anonymous_VerifyEmail|AsyncRequestWorkerFactor|AuthBasicAuthoritative|AuthBasicFake|AuthBasicProvider|AuthBasicUseDigestAlgorithm|AuthDBDUserPWQuery|AuthDBDUserRealmQuery|AuthDBMGroupFile|AuthDBMType|AuthDBMUserFile|AuthDigestAlgorithm|AuthDigestDomain|AuthDigestNonceLifetime|AuthDigestProvider|AuthDigestQop|AuthDigestShmemSize|AuthFormAuthoritative|AuthFormBody|AuthFormDisableNoStore|AuthFormFakeBasicAuth|AuthFormLocation|AuthFormLoginRequiredLocation|AuthFormLoginSuccessLocation|AuthFormLogoutLocation|AuthFormMethod|AuthFormMimetype|AuthFormPassword|AuthFormProvider|AuthFormSitePassphrase|AuthFormSize|AuthFormUsername|AuthGroupFile|AuthLDAPAuthorizePrefix|AuthLDAPBindAuthoritative|AuthLDAPBindDN|AuthLDAPBindPassword|AuthLDAPCharsetConfig|AuthLDAPCompareAsUser|AuthLDAPCompareDNOnServer|AuthLDAPDereferenceAliases|AuthLDAPGroupAttribute|AuthLDAPGroupAttributeIsDN|AuthLDAPInitialBindAsUser|AuthLDAPInitialBindPattern|AuthLDAPMaxSubGroupDepth|AuthLDAPRemoteUserAttribute|AuthLDAPRemoteUserIsDN|AuthLDAPSearchAsUser|AuthLDAPSubGroupAttribute|AuthLDAPSubGroupClass|AuthLDAPUrl|AuthMerging|AuthName|AuthnCacheContext|AuthnCacheEnable|AuthnCacheProvideFor|AuthnCacheSOCache|AuthnCacheTimeout|AuthnzFcgiCheckAuthnProvider|AuthnzFcgiDefineProvider|AuthType|AuthUserFile|AuthzDBDLoginToReferer|AuthzDBDQuery|AuthzDBDRedirectQuery|AuthzDBMType|AuthzSendForbiddenOnFailure|BalancerGrowth|BalancerInherit|BalancerMember|BalancerPersist|BrowserMatch|BrowserMatchNoCase|BufferedLogs|BufferSize|CacheDefaultExpire|CacheDetailHeader|CacheDirLength|CacheDirLevels|CacheDisable|CacheEnable|CacheFile|CacheHeader|CacheIgnoreCacheControl|CacheIgnoreHeaders|CacheIgnoreNoLastMod|CacheIgnoreQueryString|CacheIgnoreURLSessionIdentifiers|CacheKeyBaseURL|CacheLastModifiedFactor|CacheLock|CacheLockMaxAge|CacheLockPath|CacheMaxExpire|CacheMaxFileSize|CacheMinExpire|CacheMinFileSize|CacheNegotiatedDocs|CacheQuickHandler|CacheReadSize|CacheReadTime|CacheRoot|CacheSocache|CacheSocacheMaxSize|CacheSocacheMaxTime|CacheSocacheMinTime|CacheSocacheReadSize|CacheSocacheReadTime|CacheStaleOnError|CacheStoreExpired|CacheStoreNoStore|CacheStorePrivate|CGIDScriptTimeout|CGIMapExtension|CharsetDefault|CharsetOptions|CharsetSourceEnc|CheckCaseOnly|CheckSpelling|ChrootDir|ContentDigest|CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking|CoreDumpDirectory|CustomLog|Dav|DavDepthInfinity|DavGenericLockDB|DavLockDB|DavMinTimeout|DBDExptime|DBDInitSQL|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver|DefaultIcon|DefaultLanguage|DefaultRuntimeDir|DefaultType|Define|DeflateBufferSize|DeflateCompressionLevel|DeflateFilterNote|DeflateInflateLimitRequestBody|DeflateInflateRatioBurst|DeflateInflateRatioLimit|DeflateMemLevel|DeflateWindowSize|Deny|DirectoryCheckHandler|DirectoryIndex|DirectoryIndexRedirect|DirectorySlash|DocumentRoot|DTracePrivileges|DumpIOInput|DumpIOOutput|EnableExceptionHook|EnableMMAP|EnableSendfile|Error|ErrorDocument|ErrorLog|ErrorLogFormat|Example|ExpiresActive|ExpiresByType|ExpiresDefault|ExtendedStatus|ExtFilterDefine|ExtFilterOptions|FallbackResource|FileETag|FilterChain|FilterDeclare|FilterProtocol|FilterProvider|FilterTrace|ForceLanguagePriority|ForceType|ForensicLog|GprofDir|GracefulShutdownTimeout|Group|Header|HeaderName|HeartbeatAddress|HeartbeatListen|HeartbeatMaxServers|HeartbeatStorage|HeartbeatStorage|HostnameLookups|IdentityCheck|IdentityCheckTimeout|ImapBase|ImapDefault|ImapMenu|Include|IncludeOptional|IndexHeadInsert|IndexIgnore|IndexIgnoreReset|IndexOptions|IndexOrderDefault|IndexStyleSheet|InputSed|ISAPIAppendLogToErrors|ISAPIAppendLogToQuery|ISAPICacheFile|ISAPIFakeAsync|ISAPILogNotSupported|ISAPIReadAheadBuffer|KeepAlive|KeepAliveTimeout|KeptBodySize|LanguagePriority|LDAPCacheEntries|LDAPCacheTTL|LDAPConnectionPoolTTL|LDAPConnectionTimeout|LDAPLibraryDebug|LDAPOpCacheEntries|LDAPOpCacheTTL|LDAPReferralHopLimit|LDAPReferrals|LDAPRetries|LDAPRetryDelay|LDAPSharedCacheFile|LDAPSharedCacheSize|LDAPTimeout|LDAPTrustedClientCert|LDAPTrustedGlobalCert|LDAPTrustedMode|LDAPVerifyServerCert|LimitInternalRecursion|LimitRequestBody|LimitRequestFields|LimitRequestFieldSize|LimitRequestLine|LimitXMLRequestBody|Listen|ListenBackLog|LoadFile|LoadModule|LogFormat|LogLevel|LogMessage|LuaAuthzProvider|LuaCodeCache|LuaHookAccessChecker|LuaHookAuthChecker|LuaHookCheckUserID|LuaHookFixups|LuaHookInsertFilter|LuaHookLog|LuaHookMapToStorage|LuaHookTranslateName|LuaHookTypeChecker|LuaInherit|LuaInputFilter|LuaMapHandler|LuaOutputFilter|LuaPackageCPath|LuaPackagePath|LuaQuickHandler|LuaRoot|LuaScope|MaxConnectionsPerChild|MaxKeepAliveRequests|MaxMemFree|MaxRangeOverlaps|MaxRangeReversals|MaxRanges|MaxRequestWorkers|MaxSpareServers|MaxSpareThreads|MaxThreads|MergeTrailers|MetaDir|MetaFiles|MetaSuffix|MimeMagicFile|MinSpareServers|MinSpareThreads|MMapFile|ModemStandard|ModMimeUsePathInfo|MultiviewsMatch|Mutex|NameVirtualHost|NoProxy|NWSSLTrustedCerts|NWSSLUpgradeable|Options|Order|OutputSed|PassEnv|PidFile|PrivilegesMode|Protocol|ProtocolEcho|ProxyAddHeaders|ProxyBadHeader|ProxyBlock|ProxyDomain|ProxyErrorOverride|ProxyExpressDBMFile|ProxyExpressDBMType|ProxyExpressEnable|ProxyFtpDirCharset|ProxyFtpEscapeWildcards|ProxyFtpListOnWildcard|ProxyHTMLBufSize|ProxyHTMLCharsetOut|ProxyHTMLDocType|ProxyHTMLEnable|ProxyHTMLEvents|ProxyHTMLExtended|ProxyHTMLFixups|ProxyHTMLInterp|ProxyHTMLLinks|ProxyHTMLMeta|ProxyHTMLStripComments|ProxyHTMLURLMap|ProxyIOBufferSize|ProxyMaxForwards|ProxyPass|ProxyPassInherit|ProxyPassInterpolateEnv|ProxyPassMatch|ProxyPassReverse|ProxyPassReverseCookieDomain|ProxyPassReverseCookiePath|ProxyPreserveHost|ProxyReceiveBufferSize|ProxyRemote|ProxyRemoteMatch|ProxyRequests|ProxySCGIInternalRedirect|ProxySCGISendfile|ProxySet|ProxySourceAddress|ProxyStatus|ProxyTimeout|ProxyVia|ReadmeName|ReceiveBufferSize|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ReflectorHeader|RemoteIPHeader|RemoteIPInternalProxy|RemoteIPInternalProxyList|RemoteIPProxiesHeader|RemoteIPTrustedProxy|RemoteIPTrustedProxyList|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|RequestHeader|RequestReadTimeout|Require|RewriteBase|RewriteCond|RewriteEngine|RewriteMap|RewriteOptions|RewriteRule|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScoreBoardFile|Script|ScriptAlias|ScriptAliasMatch|ScriptInterpreterSource|ScriptLog|ScriptLogBuffer|ScriptLogLength|ScriptSock|SecureListen|SeeRequestTail|SendBufferSize|ServerAdmin|ServerAlias|ServerLimit|ServerName|ServerPath|ServerRoot|ServerSignature|ServerTokens|Session|SessionCookieName|SessionCookieName2|SessionCookieRemove|SessionCryptoCipher|SessionCryptoDriver|SessionCryptoPassphrase|SessionCryptoPassphraseFile|SessionDBDCookieName|SessionDBDCookieName2|SessionDBDCookieRemove|SessionDBDDeleteLabel|SessionDBDInsertLabel|SessionDBDPerUser|SessionDBDSelectLabel|SessionDBDUpdateLabel|SessionEnv|SessionExclude|SessionHeader|SessionInclude|SessionMaxAge|SetEnv|SetEnvIf|SetEnvIfExpr|SetEnvIfNoCase|SetHandler|SetInputFilter|SetOutputFilter|SSIEndTag|SSIErrorMsg|SSIETag|SSILastModified|SSILegacyExprParser|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|SSLCACertificateFile|SSLCACertificatePath|SSLCADNRequestFile|SSLCADNRequestPath|SSLCARevocationCheck|SSLCARevocationFile|SSLCARevocationPath|SSLCertificateChainFile|SSLCertificateFile|SSLCertificateKeyFile|SSLCipherSuite|SSLCompression|SSLCryptoDevice|SSLEngine|SSLFIPS|SSLHonorCipherOrder|SSLInsecureRenegotiation|SSLOCSPDefaultResponder|SSLOCSPEnable|SSLOCSPOverrideResponder|SSLOCSPResponderTimeout|SSLOCSPResponseMaxAge|SSLOCSPResponseTimeSkew|SSLOCSPUseRequestNonce|SSLOpenSSLConfCmd|SSLOptions|SSLPassPhraseDialog|SSLProtocol|SSLProxyCACertificateFile|SSLProxyCACertificatePath|SSLProxyCARevocationCheck|SSLProxyCARevocationFile|SSLProxyCARevocationPath|SSLProxyCheckPeerCN|SSLProxyCheckPeerExpire|SSLProxyCheckPeerName|SSLProxyCipherSuite|SSLProxyEngine|SSLProxyMachineCertificateChainFile|SSLProxyMachineCertificateFile|SSLProxyMachineCertificatePath|SSLProxyProtocol|SSLProxyVerify|SSLProxyVerifyDepth|SSLRandomSeed|SSLRenegBufferSize|SSLRequire|SSLRequireSSL|SSLSessionCache|SSLSessionCacheTimeout|SSLSessionTicketKeyFile|SSLSRPUnknownUserSeed|SSLSRPVerifierFile|SSLStaplingCache|SSLStaplingErrorCacheTimeout|SSLStaplingFakeTryLater|SSLStaplingForceURL|SSLStaplingResponderTimeout|SSLStaplingResponseMaxAge|SSLStaplingResponseTimeSkew|SSLStaplingReturnResponderErrors|SSLStaplingStandardCacheTimeout|SSLStrictSNIVHostCheck|SSLUserName|SSLUseStapling|SSLVerifyClient|SSLVerifyDepth|StartServers|StartThreads|Substitute|Suexec|SuexecUserGroup|ThreadLimit|ThreadsPerChild|ThreadStackSize|TimeOut|TraceEnable|TransferLog|TypesConfig|UnDefine|UndefMacro|UnsetEnv|Use|UseCanonicalName|UseCanonicalPhysicalPort|User|UserDir|VHostCGIMode|VHostCGIPrivs|VHostGroup|VHostPrivs|VHostSecure|VHostUser|VirtualDocumentRoot|VirtualDocumentRootIP|VirtualScriptAlias|VirtualScriptAliasIP|WatchdogInterval|XBitHack|xml2EncAlias|xml2EncDefault|xml2StartParse)\b/mi,
608
+ lookbehind: true,
609
+ alias: 'property'
610
+ },
611
+ 'directive-block': {
612
+ pattern: /<\/?\b(AuthnProviderAlias|AuthzProviderAlias|Directory|DirectoryMatch|Else|ElseIf|Files|FilesMatch|If|IfDefine|IfModule|IfVersion|Limit|LimitExcept|Location|LocationMatch|Macro|Proxy|RequireAll|RequireAny|RequireNone|VirtualHost)\b *.*>/i,
613
+ inside: {
614
+ 'directive-block': {
615
+ pattern: /^<\/?\w+/,
616
+ inside: {
617
+ 'punctuation': /^<\/?/
618
+ },
619
+ alias: 'tag'
620
+ },
621
+ 'directive-block-parameter': {
622
+ pattern: /.*[^>]/,
623
+ inside: {
624
+ 'punctuation': /:/,
625
+ 'string': {
626
+ pattern: /("|').*\1/,
627
+ inside: {
628
+ 'variable': /(\$|%)\{?(\w\.?(\+|\-|:)?)+\}?/
629
+ }
630
+ }
631
+ },
632
+ alias: 'attr-value'
633
+ },
634
+ 'punctuation': />/
635
+ },
636
+ alias: 'tag'
637
+ },
638
+ 'directive-flags': {
639
+ pattern: /\[(\w,?)+\]/,
640
+ alias: 'keyword'
641
+ },
642
+ 'string': {
643
+ pattern: /("|').*\1/,
644
+ inside: {
645
+ 'variable': /(\$|%)\{?(\w\.?(\+|\-|:)?)+\}?/
646
+ }
647
+ },
648
+ 'variable': /(\$|%)\{?(\w\.?(\+|\-|:)?)+\}?/,
649
+ 'regex': /\^?.*\$|\^.*\$?/
650
+ };
651
+
652
+ (function(Prism) {
653
+ var insideString = {
654
+ variable: [
655
+ // Arithmetic Environment
656
+ {
657
+ pattern: /\$?\(\([\w\W]+?\)\)/,
658
+ inside: {
659
+ // If there is a $ sign at the beginning highlight $(( and )) as variable
660
+ variable: [{
661
+ pattern: /(^\$\(\([\w\W]+)\)\)/,
662
+ lookbehind: true
663
+ },
664
+ /^\$\(\(/,
665
+ ],
666
+ number: /\b-?(?:0x[\dA-Fa-f]+|\d*\.?\d+(?:[Ee]-?\d+)?)\b/,
667
+ // Operators according to https://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic
668
+ operator: /--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,
669
+ // If there is no $ sign at the beginning highlight (( and )) as punctuation
670
+ punctuation: /\(\(?|\)\)?|,|;/
671
+ }
672
+ },
673
+ // Command Substitution
674
+ {
675
+ pattern: /\$\([^)]+\)|`[^`]+`/,
676
+ inside: {
677
+ variable: /^\$\(|^`|\)$|`$/
678
+ }
679
+ },
680
+ /\$(?:[a-z0-9_#\?\*!@]+|\{[^}]+\})/i
681
+ ],
682
+ };
683
+
684
+ Prism.languages.bash = {
685
+ 'shebang': {
686
+ pattern: /^#!\s*\/bin\/bash|^#!\s*\/bin\/sh/,
687
+ alias: 'important'
688
+ },
689
+ 'comment': {
690
+ pattern: /(^|[^"{\\])#.*/,
691
+ lookbehind: true
692
+ },
693
+ 'string': [
694
+ //Support for Here-Documents https://en.wikipedia.org/wiki/Here_document
695
+ {
696
+ pattern: /((?:^|[^<])<<\s*)(?:"|')?(\w+?)(?:"|')?\s*\r?\n(?:[\s\S])*?\r?\n\2/g,
697
+ lookbehind: true,
698
+ inside: insideString
699
+ },
700
+ {
701
+ pattern: /("|')(?:\\?[\s\S])*?\1/g,
702
+ inside: insideString
703
+ }
704
+ ],
705
+ 'variable': insideString.variable,
706
+ // Originally based on http://ss64.com/bash/
707
+ 'function': {
708
+ pattern: /(^|\s|;|\||&)(?:alias|apropos|apt-get|aptitude|aspell|awk|basename|bash|bc|bg|builtin|bzip2|cal|cat|cd|cfdisk|chgrp|chmod|chown|chroot|chkconfig|cksum|clear|cmp|comm|command|cp|cron|crontab|csplit|cut|date|dc|dd|ddrescue|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|enable|env|ethtool|eval|exec|expand|expect|export|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|getopts|git|grep|groupadd|groupdel|groupmod|groups|gzip|hash|head|help|hg|history|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|jobs|join|kill|killall|less|link|ln|locate|logname|logout|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|make|man|mkdir|mkfifo|mkisofs|mknod|more|most|mount|mtools|mtr|mv|mmv|nano|netstat|nice|nl|nohup|notify-send|nslookup|open|op|passwd|paste|pathchk|ping|pkill|popd|pr|printcap|printenv|printf|ps|pushd|pv|pwd|quota|quotacheck|quotactl|ram|rar|rcp|read|readarray|readonly|reboot|rename|renice|remsync|rev|rm|rmdir|rsync|screen|scp|sdiff|sed|seq|service|sftp|shift|shopt|shutdown|sleep|slocate|sort|source|split|ssh|stat|strace|su|sudo|sum|suspend|sync|tail|tar|tee|test|time|timeout|times|touch|top|traceroute|trap|tr|tsort|tty|type|ulimit|umask|umount|unalias|uname|unexpand|uniq|units|unrar|unshar|uptime|useradd|userdel|usermod|users|uuencode|uudecode|v|vdir|vi|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yes|zip)(?=$|\s|;|\||&)/,
709
+ lookbehind: true
710
+ },
711
+ 'keyword': {
712
+ pattern: /(^|\s|;|\||&)(?:let|:|\.|if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)(?=$|\s|;|\||&)/,
713
+ lookbehind: true
714
+ },
715
+ 'boolean': {
716
+ pattern: /(^|\s|;|\||&)(?:true|false)(?=$|\s|;|\||&)/,
717
+ lookbehind: true
718
+ },
719
+ 'operator': /&&?|\|\|?|==?|!=?|<<<?|>>|<=?|>=?|=~/,
720
+ 'punctuation': /\$?\(\(?|\)\)?|\.\.|[{}[\];]/
721
+ };
722
+
723
+ var inside = insideString.variable[1].inside;
724
+ inside['function'] = Prism.languages.bash['function'];
725
+ inside.keyword = Prism.languages.bash.keyword;
726
+ inside.boolean = Prism.languages.bash.boolean;
727
+ inside.operator = Prism.languages.bash.operator;
728
+ inside.punctuation = Prism.languages.bash.punctuation;
729
+ })(Prism);
730
+ Prism.languages.c = Prism.languages.extend('clike', {
731
+ 'keyword': /\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,
732
+ 'operator': /\-[>-]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|?\||[~^%?*\/]/,
733
+ 'number': /\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)[ful]*\b/i
734
+ });
735
+
736
+ Prism.languages.insertBefore('c', 'string', {
737
+ 'macro': {
738
+ // allow for multiline macro definitions
739
+ // spaces after the # character compile fine with gcc
740
+ pattern: /(^\s*)#\s*[a-z]+([^\r\n\\]|\\.|\\(?:\r\n?|\n))*/im,
741
+ lookbehind: true,
742
+ alias: 'property',
743
+ inside: {
744
+ // highlight the path of the include statement as a string
745
+ 'string': {
746
+ pattern: /(#\s*include\s*)(<.+?>|("|')(\\?.)+?\3)/,
747
+ lookbehind: true
748
+ },
749
+ // highlight macro directives as keywords
750
+ 'directive': {
751
+ pattern: /(#\s*)\b(define|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/,
752
+ lookbehind: true,
753
+ alias: 'keyword'
754
+ }
755
+ }
756
+ },
757
+ // highlight predefined macros as constants
758
+ 'constant': /\b(__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|stdin|stdout|stderr)\b/
759
+ });
760
+
761
+ delete Prism.languages.c['class-name'];
762
+ delete Prism.languages.c['boolean'];
763
+
764
+ Prism.languages.csharp = Prism.languages.extend('clike', {
765
+ 'keyword': /\b(abstract|as|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|do|double|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|goto|if|implicit|in|int|interface|internal|is|lock|long|namespace|new|null|object|operator|out|override|params|private|protected|public|readonly|ref|return|sbyte|sealed|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|virtual|void|volatile|while|add|alias|ascending|async|await|descending|dynamic|from|get|global|group|into|join|let|orderby|partial|remove|select|set|value|var|where|yield)\b/,
766
+ 'string': [
767
+ /@("|')(\1\1|\\\1|\\?(?!\1)[\s\S])*\1/,
768
+ /("|')(\\?.)*?\1/
769
+ ],
770
+ 'number': /\b-?(0x[\da-f]+|\d*\.?\d+f?)\b/i
771
+ });
772
+
773
+ Prism.languages.insertBefore('csharp', 'keyword', {
774
+ 'preprocessor': {
775
+ pattern: /(^\s*)#.*/m,
776
+ lookbehind: true,
777
+ alias: 'property',
778
+ inside: {
779
+ // highlight preprocessor directives as keywords
780
+ 'directive': {
781
+ pattern: /(\s*#)\b(define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/,
782
+ lookbehind: true,
783
+ alias: 'keyword'
784
+ }
785
+ }
786
+ }
787
+ });
788
+
789
+ Prism.languages.cpp = Prism.languages.extend('c', {
790
+ 'keyword': /\b(alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,
791
+ 'boolean': /\b(true|false)\b/,
792
+ 'operator': /[-+]{1,2}|!=?|<{1,2}=?|>{1,2}=?|\->|:{1,2}|={1,2}|\^|~|%|&{1,2}|\|?\||\?|\*|\/|\b(and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/
793
+ });
794
+
795
+ Prism.languages.insertBefore('cpp', 'keyword', {
796
+ 'class-name': {
797
+ pattern: /(class\s+)[a-z0-9_]+/i,
798
+ lookbehind: true
799
+ }
800
+ });
801
+ /**
802
+ * Original by Samuel Flores
803
+ *
804
+ * Adds the following new token classes:
805
+ * constant, builtin, variable, symbol, regex
806
+ */
807
+ (function(Prism) {
808
+ Prism.languages.ruby = Prism.languages.extend('clike', {
809
+ 'comment': /#(?!\{[^\r\n]*?\}).*/,
810
+ 'keyword': /\b(alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|false|for|if|in|module|new|next|nil|not|or|raise|redo|require|rescue|retry|return|self|super|then|throw|true|undef|unless|until|when|while|yield)\b/
811
+ });
812
+
813
+ var interpolation = {
814
+ pattern: /#\{[^}]+\}/,
815
+ inside: {
816
+ 'delimiter': {
817
+ pattern: /^#\{|\}$/,
818
+ alias: 'tag'
819
+ },
820
+ rest: Prism.util.clone(Prism.languages.ruby)
821
+ }
822
+ };
823
+
824
+ Prism.languages.insertBefore('ruby', 'keyword', {
825
+ 'regex': [
826
+ {
827
+ pattern: /%r([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1[gim]{0,3}/,
828
+ inside: {
829
+ 'interpolation': interpolation
830
+ }
831
+ },
832
+ {
833
+ pattern: /%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/,
834
+ inside: {
835
+ 'interpolation': interpolation
836
+ }
837
+ },
838
+ {
839
+ // Here we need to specifically allow interpolation
840
+ pattern: /%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/,
841
+ inside: {
842
+ 'interpolation': interpolation
843
+ }
844
+ },
845
+ {
846
+ pattern: /%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/,
847
+ inside: {
848
+ 'interpolation': interpolation
849
+ }
850
+ },
851
+ {
852
+ pattern: /%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/,
853
+ inside: {
854
+ 'interpolation': interpolation
855
+ }
856
+ },
857
+ {
858
+ pattern: /(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/,
859
+ lookbehind: true
860
+ }
861
+ ],
862
+ 'variable': /[@$]+[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/,
863
+ 'symbol': /:[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/
864
+ });
865
+
866
+ Prism.languages.insertBefore('ruby', 'number', {
867
+ 'builtin': /\b(Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|File|Fixnum|Fload|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,
868
+ 'constant': /\b[A-Z][a-zA-Z_0-9]*(?:[?!]|\b)/
869
+ });
870
+
871
+ Prism.languages.ruby.string = [
872
+ {
873
+ pattern: /%[qQiIwWxs]?([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1/,
874
+ inside: {
875
+ 'interpolation': interpolation
876
+ }
877
+ },
878
+ {
879
+ pattern: /%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/,
880
+ inside: {
881
+ 'interpolation': interpolation
882
+ }
883
+ },
884
+ {
885
+ // Here we need to specifically allow interpolation
886
+ pattern: /%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/,
887
+ inside: {
888
+ 'interpolation': interpolation
889
+ }
890
+ },
891
+ {
892
+ pattern: /%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/,
893
+ inside: {
894
+ 'interpolation': interpolation
895
+ }
896
+ },
897
+ {
898
+ pattern: /%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/,
899
+ inside: {
900
+ 'interpolation': interpolation
901
+ }
902
+ },
903
+ {
904
+ pattern: /("|')(#\{[^}]+\}|\\(?:\r?\n|\r)|\\?.)*?\1/,
905
+ inside: {
906
+ 'interpolation': interpolation
907
+ }
908
+ }
909
+ ];
910
+ }(Prism));
911
+ Prism.languages.git = {
912
+ /*
913
+ * A simple one line comment like in a git status command
914
+ * For instance:
915
+ * $ git status
916
+ * # On branch infinite-scroll
917
+ * # Your branch and 'origin/sharedBranches/frontendTeam/infinite-scroll' have diverged,
918
+ * # and have 1 and 2 different commits each, respectively.
919
+ * nothing to commit (working directory clean)
920
+ */
921
+ 'comment': /^#.*/m,
922
+
923
+ /*
924
+ * Regexp to match the changed lines in a git diff output. Check the example below.
925
+ */
926
+ 'deleted': /^[-–].*/m,
927
+ 'inserted': /^\+.*/m,
928
+
929
+ /*
930
+ * a string (double and simple quote)
931
+ */
932
+ 'string': /("|')(\\?.)*?\1/m,
933
+
934
+ /*
935
+ * a git command. It starts with a random prompt finishing by a $, then "git" then some other parameters
936
+ * For instance:
937
+ * $ git add file.txt
938
+ */
939
+ 'command': {
940
+ pattern: /^.*\$ git .*$/m,
941
+ inside: {
942
+ /*
943
+ * A git command can contain a parameter starting by a single or a double dash followed by a string
944
+ * For instance:
945
+ * $ git diff --cached
946
+ * $ git log -p
947
+ */
948
+ 'parameter': /\s(--|-)\w+/m
949
+ }
950
+ },
951
+
952
+ /*
953
+ * Coordinates displayed in a git diff command
954
+ * For instance:
955
+ * $ git diff
956
+ * diff --git file.txt file.txt
957
+ * index 6214953..1d54a52 100644
958
+ * --- file.txt
959
+ * +++ file.txt
960
+ * @@ -1 +1,2 @@
961
+ * -Here's my tetx file
962
+ * +Here's my text file
963
+ * +And this is the second line
964
+ */
965
+ 'coord': /^@@.*@@$/m,
966
+
967
+ /*
968
+ * Match a "commit [SHA1]" line in a git log output.
969
+ * For instance:
970
+ * $ git log
971
+ * commit a11a14ef7e26f2ca62d4b35eac455ce636d0dc09
972
+ * Author: lgiraudel
973
+ * Date: Mon Feb 17 11:18:34 2014 +0100
974
+ *
975
+ * Add of a new line
976
+ */
977
+ 'commit_sha1': /^commit \w{40}$/m
978
+ };
979
+
980
+ Prism.languages.go = Prism.languages.extend('clike', {
981
+ 'keyword': /\b(break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,
982
+ 'builtin': /\b(bool|byte|complex(64|128)|error|float(32|64)|rune|string|u?int(8|16|32|64|)|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(ln)?|real|recover)\b/,
983
+ 'boolean': /\b(_|iota|nil|true|false)\b/,
984
+ 'operator': /[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,
985
+ 'number': /\b(-?(0x[a-f\d]+|(\d+\.?\d*|\.\d+)(e[-+]?\d+)?)i?)\b/i,
986
+ 'string': /("|'|`)(\\?.|\r|\n)*?\1/
987
+ });
988
+ delete Prism.languages.go['class-name'];
989
+
990
+ /* TODO
991
+ Handle multiline code after tag
992
+ %foo= some |
993
+ multiline |
994
+ code |
995
+ */
996
+
997
+ (function(Prism) {
998
+
999
+ Prism.languages.haml = {
1000
+ // Multiline stuff should appear before the rest
1001
+
1002
+ 'multiline-comment': {
1003
+ pattern: /((?:^|\r?\n|\r)([\t ]*))(?:\/|-#).*((?:\r?\n|\r)\2[\t ]+.+)*/,
1004
+ lookbehind: true,
1005
+ alias: 'comment'
1006
+ },
1007
+
1008
+ 'multiline-code': [
1009
+ {
1010
+ pattern: /((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*,[\t ]*((?:\r?\n|\r)\2[\t ]+.*,[\t ]*)*((?:\r?\n|\r)\2[\t ]+.+)/,
1011
+ lookbehind: true,
1012
+ inside: {
1013
+ rest: Prism.languages.ruby
1014
+ }
1015
+ },
1016
+ {
1017
+ pattern: /((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*\|[\t ]*((?:\r?\n|\r)\2[\t ]+.*\|[\t ]*)*/,
1018
+ lookbehind: true,
1019
+ inside: {
1020
+ rest: Prism.languages.ruby
1021
+ }
1022
+ }
1023
+ ],
1024
+
1025
+ // See at the end of the file for known filters
1026
+ 'filter': {
1027
+ pattern: /((?:^|\r?\n|\r)([\t ]*)):[\w-]+((?:\r?\n|\r)(?:\2[\t ]+.+|\s*?(?=\r?\n|\r)))+/,
1028
+ lookbehind: true,
1029
+ inside: {
1030
+ 'filter-name': {
1031
+ pattern: /^:[\w-]+/,
1032
+ alias: 'variable'
1033
+ }
1034
+ }
1035
+ },
1036
+
1037
+ 'markup': {
1038
+ pattern: /((?:^|\r?\n|\r)[\t ]*)<.+/,
1039
+ lookbehind: true,
1040
+ inside: {
1041
+ rest: Prism.languages.markup
1042
+ }
1043
+ },
1044
+ 'doctype': {
1045
+ pattern: /((?:^|\r?\n|\r)[\t ]*)!!!(?: .+)?/,
1046
+ lookbehind: true
1047
+ },
1048
+ 'tag': {
1049
+ // Allows for one nested group of braces
1050
+ pattern: /((?:^|\r?\n|\r)[\t ]*)[%.#][\w\-#.]*[\w\-](?:\([^)]+\)|\{(?:\{[^}]+\}|[^}])+\}|\[[^\]]+\])*[\/<>]*/,
1051
+ lookbehind: true,
1052
+ inside: {
1053
+ 'attributes': [
1054
+ {
1055
+ // Lookbehind tries to prevent interpolations for breaking it all
1056
+ // Allows for one nested group of braces
1057
+ pattern: /(^|[^#])\{(?:\{[^}]+\}|[^}])+\}/,
1058
+ lookbehind: true,
1059
+ inside: {
1060
+ rest: Prism.languages.ruby
1061
+ }
1062
+ },
1063
+ {
1064
+ pattern: /\([^)]+\)/,
1065
+ inside: {
1066
+ 'attr-value': {
1067
+ pattern: /(=\s*)(?:"(?:\\?.)*?"|[^)\s]+)/,
1068
+ lookbehind: true
1069
+ },
1070
+ 'attr-name': /[\w:-]+(?=\s*!?=|\s*[,)])/,
1071
+ 'punctuation': /[=(),]/
1072
+ }
1073
+ },
1074
+ {
1075
+ pattern: /\[[^\]]+\]/,
1076
+ inside: {
1077
+ rest: Prism.languages.ruby
1078
+ }
1079
+ }
1080
+ ],
1081
+ 'punctuation': /[<>]/
1082
+ }
1083
+ },
1084
+ 'code': {
1085
+ pattern: /((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,
1086
+ lookbehind: true,
1087
+ inside: {
1088
+ rest: Prism.languages.ruby
1089
+ }
1090
+ },
1091
+ // Interpolations in plain text
1092
+ 'interpolation': {
1093
+ pattern: /#\{[^}]+\}/,
1094
+ inside: {
1095
+ 'delimiter': {
1096
+ pattern: /^#\{|\}$/,
1097
+ alias: 'punctuation'
1098
+ },
1099
+ rest: Prism.languages.ruby
1100
+ }
1101
+ },
1102
+ 'punctuation': {
1103
+ pattern: /((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,
1104
+ lookbehind: true
1105
+ }
1106
+ };
1107
+
1108
+ var filter_pattern = '((?:^|\\r?\\n|\\r)([\\t ]*)):{{filter_name}}((?:\\r?\\n|\\r)(?:\\2[\\t ]+.+|\\s*?(?=\\r?\\n|\\r)))+';
1109
+
1110
+ // Non exhaustive list of available filters and associated languages
1111
+ var filters = [
1112
+ 'css',
1113
+ {filter:'coffee',language:'coffeescript'},
1114
+ 'erb',
1115
+ 'javascript',
1116
+ 'less',
1117
+ 'markdown',
1118
+ 'ruby',
1119
+ 'scss',
1120
+ 'textile'
1121
+ ];
1122
+ var all_filters = {};
1123
+ for (var i = 0, l = filters.length; i < l; i++) {
1124
+ var filter = filters[i];
1125
+ filter = typeof filter === 'string' ? {filter: filter, language: filter} : filter;
1126
+ if (Prism.languages[filter.language]) {
1127
+ all_filters['filter-' + filter.filter] = {
1128
+ pattern: RegExp(filter_pattern.replace('{{filter_name}}', filter.filter)),
1129
+ lookbehind: true,
1130
+ inside: {
1131
+ 'filter-name': {
1132
+ pattern: /^:[\w-]+/,
1133
+ alias: 'variable'
1134
+ },
1135
+ rest: Prism.languages[filter.language]
1136
+ }
1137
+ }
1138
+ }
1139
+ }
1140
+
1141
+ Prism.languages.insertBefore('haml', 'filter', all_filters);
1142
+
1143
+ }(Prism));
1144
+ Prism.languages.http = {
1145
+ 'request-line': {
1146
+ pattern: /^(POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\b\shttps?:\/\/\S+\sHTTP\/[0-9.]+/m,
1147
+ inside: {
1148
+ // HTTP Verb
1149
+ property: /^(POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\b/,
1150
+ // Path or query argument
1151
+ 'attr-name': /:\w+/
1152
+ }
1153
+ },
1154
+ 'response-status': {
1155
+ pattern: /^HTTP\/1.[01] [0-9]+.*/m,
1156
+ inside: {
1157
+ // Status, e.g. 200 OK
1158
+ property: {
1159
+ pattern: /(^HTTP\/1.[01] )[0-9]+.*/i,
1160
+ lookbehind: true
1161
+ }
1162
+ }
1163
+ },
1164
+ // HTTP header name
1165
+ 'header-name': {
1166
+ pattern: /^[\w-]+:(?=.)/m,
1167
+ alias: 'keyword'
1168
+ }
1169
+ };
1170
+
1171
+ // Create a mapping of Content-Type headers to language definitions
1172
+ var httpLanguages = {
1173
+ 'application/json': Prism.languages.javascript,
1174
+ 'application/xml': Prism.languages.markup,
1175
+ 'text/xml': Prism.languages.markup,
1176
+ 'text/html': Prism.languages.markup
1177
+ };
1178
+
1179
+ // Insert each content type parser that has its associated language
1180
+ // currently loaded.
1181
+ for (var contentType in httpLanguages) {
1182
+ if (httpLanguages[contentType]) {
1183
+ var options = {};
1184
+ options[contentType] = {
1185
+ pattern: new RegExp('(content-type:\\s*' + contentType + '[\\w\\W]*?)(?:\\r?\\n|\\r){2}[\\w\\W]*', 'i'),
1186
+ lookbehind: true,
1187
+ inside: {
1188
+ rest: httpLanguages[contentType]
1189
+ }
1190
+ };
1191
+ Prism.languages.insertBefore('http', 'header-name', options);
1192
+ }
1193
+ }
1194
+ ;
1195
+ Prism.languages.java = Prism.languages.extend('clike', {
1196
+ 'keyword': /\b(abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while)\b/,
1197
+ 'number': /\b0b[01]+\b|\b0x[\da-f]*\.?[\da-fp\-]+\b|\b\d*\.?\d+(?:e[+-]?\d+)?[df]?\b/i,
1198
+ 'operator': {
1199
+ pattern: /(^|[^.])(?:\+[+=]?|-[-=]?|!=?|<<?=?|>>?>?=?|==?|&[&=]?|\|[|=]?|\*=?|\/=?|%=?|\^=?|[?:~])/m,
1200
+ lookbehind: true
1201
+ }
1202
+ });
1203
+ Prism.languages.nginx = Prism.languages.extend('clike', {
1204
+ 'comment': {
1205
+ pattern: /(^|[^"{\\])#.*/,
1206
+ lookbehind: true
1207
+ },
1208
+ 'keyword': /\b(?:CONTENT_|DOCUMENT_|GATEWAY_|HTTP_|HTTPS|if_not_empty|PATH_|QUERY_|REDIRECT_|REMOTE_|REQUEST_|SCGI|SCRIPT_|SERVER_|http|server|events|location|include|accept_mutex|accept_mutex_delay|access_log|add_after_body|add_before_body|add_header|addition_types|aio|alias|allow|ancient_browser|ancient_browser_value|auth|auth_basic|auth_basic_user_file|auth_http|auth_http_header|auth_http_timeout|autoindex|autoindex_exact_size|autoindex_localtime|break|charset|charset_map|charset_types|chunked_transfer_encoding|client_body_buffer_size|client_body_in_file_only|client_body_in_single_buffer|client_body_temp_path|client_body_timeout|client_header_buffer_size|client_header_timeout|client_max_body_size|connection_pool_size|create_full_put_path|daemon|dav_access|dav_methods|debug_connection|debug_points|default_type|deny|devpoll_changes|devpoll_events|directio|directio_alignment|disable_symlinks|empty_gif|env|epoll_events|error_log|error_page|expires|fastcgi_buffer_size|fastcgi_buffers|fastcgi_busy_buffers_size|fastcgi_cache|fastcgi_cache_bypass|fastcgi_cache_key|fastcgi_cache_lock|fastcgi_cache_lock_timeout|fastcgi_cache_methods|fastcgi_cache_min_uses|fastcgi_cache_path|fastcgi_cache_purge|fastcgi_cache_use_stale|fastcgi_cache_valid|fastcgi_connect_timeout|fastcgi_hide_header|fastcgi_ignore_client_abort|fastcgi_ignore_headers|fastcgi_index|fastcgi_intercept_errors|fastcgi_keep_conn|fastcgi_max_temp_file_size|fastcgi_next_upstream|fastcgi_no_cache|fastcgi_param|fastcgi_pass|fastcgi_pass_header|fastcgi_read_timeout|fastcgi_redirect_errors|fastcgi_send_timeout|fastcgi_split_path_info|fastcgi_store|fastcgi_store_access|fastcgi_temp_file_write_size|fastcgi_temp_path|flv|geo|geoip_city|geoip_country|google_perftools_profiles|gzip|gzip_buffers|gzip_comp_level|gzip_disable|gzip_http_version|gzip_min_length|gzip_proxied|gzip_static|gzip_types|gzip_vary|if|if_modified_since|ignore_invalid_headers|image_filter|image_filter_buffer|image_filter_jpeg_quality|image_filter_sharpen|image_filter_transparency|imap_capabilities|imap_client_buffer|include|index|internal|ip_hash|keepalive|keepalive_disable|keepalive_requests|keepalive_timeout|kqueue_changes|kqueue_events|large_client_header_buffers|limit_conn|limit_conn_log_level|limit_conn_zone|limit_except|limit_rate|limit_rate_after|limit_req|limit_req_log_level|limit_req_zone|limit_zone|lingering_close|lingering_time|lingering_timeout|listen|location|lock_file|log_format|log_format_combined|log_not_found|log_subrequest|map|map_hash_bucket_size|map_hash_max_size|master_process|max_ranges|memcached_buffer_size|memcached_connect_timeout|memcached_next_upstream|memcached_pass|memcached_read_timeout|memcached_send_timeout|merge_slashes|min_delete_depth|modern_browser|modern_browser_value|mp4|mp4_buffer_size|mp4_max_buffer_size|msie_padding|msie_refresh|multi_accept|open_file_cache|open_file_cache_errors|open_file_cache_min_uses|open_file_cache_valid|open_log_file_cache|optimize_server_names|override_charset|pcre_jit|perl|perl_modules|perl_require|perl_set|pid|pop3_auth|pop3_capabilities|port_in_redirect|post_action|postpone_output|protocol|proxy|proxy_buffer|proxy_buffer_size|proxy_buffering|proxy_buffers|proxy_busy_buffers_size|proxy_cache|proxy_cache_bypass|proxy_cache_key|proxy_cache_lock|proxy_cache_lock_timeout|proxy_cache_methods|proxy_cache_min_uses|proxy_cache_path|proxy_cache_use_stale|proxy_cache_valid|proxy_connect_timeout|proxy_cookie_domain|proxy_cookie_path|proxy_headers_hash_bucket_size|proxy_headers_hash_max_size|proxy_hide_header|proxy_http_version|proxy_ignore_client_abort|proxy_ignore_headers|proxy_intercept_errors|proxy_max_temp_file_size|proxy_method|proxy_next_upstream|proxy_no_cache|proxy_pass|proxy_pass_error_message|proxy_pass_header|proxy_pass_request_body|proxy_pass_request_headers|proxy_read_timeout|proxy_redirect|proxy_redirect_errors|proxy_send_lowat|proxy_send_timeout|proxy_set_body|proxy_set_header|proxy_ssl_session_reuse|proxy_store|proxy_store_access|proxy_temp_file_write_size|proxy_temp_path|proxy_timeout|proxy_upstream_fail_timeout|proxy_upstream_max_fails|random_index|read_ahead|real_ip_header|recursive_error_pages|request_pool_size|reset_timedout_connection|resolver|resolver_timeout|return|rewrite|root|rtsig_overflow_events|rtsig_overflow_test|rtsig_overflow_threshold|rtsig_signo|satisfy|satisfy_any|secure_link_secret|send_lowat|send_timeout|sendfile|sendfile_max_chunk|server|server_name|server_name_in_redirect|server_names_hash_bucket_size|server_names_hash_max_size|server_tokens|set|set_real_ip_from|smtp_auth|smtp_capabilities|so_keepalive|source_charset|split_clients|ssi|ssi_silent_errors|ssi_types|ssi_value_length|ssl|ssl_certificate|ssl_certificate_key|ssl_ciphers|ssl_client_certificate|ssl_crl|ssl_dhparam|ssl_engine|ssl_prefer_server_ciphers|ssl_protocols|ssl_session_cache|ssl_session_timeout|ssl_verify_client|ssl_verify_depth|starttls|stub_status|sub_filter|sub_filter_once|sub_filter_types|tcp_nodelay|tcp_nopush|timeout|timer_resolution|try_files|types|types_hash_bucket_size|types_hash_max_size|underscores_in_headers|uninitialized_variable_warn|upstream|use|user|userid|userid_domain|userid_expires|userid_name|userid_p3p|userid_path|userid_service|valid_referers|variables_hash_bucket_size|variables_hash_max_size|worker_connections|worker_cpu_affinity|worker_priority|worker_processes|worker_rlimit_core|worker_rlimit_nofile|worker_rlimit_sigpending|working_directory|xclient|xml_entities|xslt_entities|xslt_stylesheet|xslt_types)\b/i,
1209
+ });
1210
+
1211
+ Prism.languages.insertBefore('nginx', 'keyword', {
1212
+ 'variable': /\$[a-z_]+/i
1213
+ });
1214
+ Prism.languages.objectivec = Prism.languages.extend('c', {
1215
+ 'keyword': /\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while|in|self|super)\b|(@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,
1216
+ 'string': /("|')(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|@"(\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,
1217
+ 'operator': /-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/
1218
+ });
1219
+
1220
+ /**
1221
+ * Original by Aaron Harun: http://aahacreative.com/2012/07/31/php-syntax-highlighting-prism/
1222
+ * Modified by Miles Johnson: http://milesj.me
1223
+ *
1224
+ * Supports the following:
1225
+ * - Extends clike syntax
1226
+ * - Support for PHP 5.3+ (namespaces, traits, generators, etc)
1227
+ * - Smarter constant and function matching
1228
+ *
1229
+ * Adds the following new token classes:
1230
+ * constant, delimiter, variable, function, package
1231
+ */
1232
+
1233
+ Prism.languages.php = Prism.languages.extend('clike', {
1234
+ 'keyword': /\b(and|or|xor|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|for|foreach|function|include|include_once|global|if|new|return|static|switch|use|require|require_once|var|while|abstract|interface|public|implements|private|protected|parent|throw|null|echo|print|trait|namespace|final|yield|goto|instanceof|finally|try|catch)\b/i,
1235
+ 'constant': /\b[A-Z0-9_]{2,}\b/,
1236
+ 'comment': {
1237
+ pattern: /(^|[^\\])(?:\/\*[\w\W]*?\*\/|\/\/.*)/,
1238
+ lookbehind: true
1239
+ }
1240
+ });
1241
+
1242
+ // Shell-like comments are matched after strings, because they are less
1243
+ // common than strings containing hashes...
1244
+ Prism.languages.insertBefore('php', 'class-name', {
1245
+ 'shell-comment': {
1246
+ pattern: /(^|[^\\])#.*/,
1247
+ lookbehind: true,
1248
+ alias: 'comment'
1249
+ }
1250
+ });
1251
+
1252
+ Prism.languages.insertBefore('php', 'keyword', {
1253
+ 'delimiter': /\?>|<\?(?:php)?/i,
1254
+ 'variable': /\$\w+\b/i,
1255
+ 'package': {
1256
+ pattern: /(\\|namespace\s+|use\s+)[\w\\]+/,
1257
+ lookbehind: true,
1258
+ inside: {
1259
+ punctuation: /\\/
1260
+ }
1261
+ }
1262
+ });
1263
+
1264
+ // Must be defined after the function pattern
1265
+ Prism.languages.insertBefore('php', 'operator', {
1266
+ 'property': {
1267
+ pattern: /(->)[\w]+/,
1268
+ lookbehind: true
1269
+ }
1270
+ });
1271
+
1272
+ // Add HTML support of the markup language exists
1273
+ if (Prism.languages.markup) {
1274
+
1275
+ // Tokenize all inline PHP blocks that are wrapped in <?php ?>
1276
+ // This allows for easy PHP + markup highlighting
1277
+ Prism.hooks.add('before-highlight', function(env) {
1278
+ if (env.language !== 'php') {
1279
+ return;
1280
+ }
1281
+
1282
+ env.tokenStack = [];
1283
+
1284
+ env.backupCode = env.code;
1285
+ env.code = env.code.replace(/(?:<\?php|<\?)[\w\W]*?(?:\?>)/ig, function(match) {
1286
+ env.tokenStack.push(match);
1287
+
1288
+ return '{{{PHP' + env.tokenStack.length + '}}}';
1289
+ });
1290
+ });
1291
+
1292
+ // Restore env.code for other plugins (e.g. line-numbers)
1293
+ Prism.hooks.add('before-insert', function(env) {
1294
+ if (env.language === 'php') {
1295
+ env.code = env.backupCode;
1296
+ delete env.backupCode;
1297
+ }
1298
+ });
1299
+
1300
+ // Re-insert the tokens after highlighting
1301
+ Prism.hooks.add('after-highlight', function(env) {
1302
+ if (env.language !== 'php') {
1303
+ return;
1304
+ }
1305
+
1306
+ for (var i = 0, t; t = env.tokenStack[i]; i++) {
1307
+ // The replace prevents $$, $&, $`, $', $n, $nn from being interpreted as special patterns
1308
+ env.highlightedCode = env.highlightedCode.replace('{{{PHP' + (i + 1) + '}}}', Prism.highlight(t, env.grammar, 'php').replace(/\$/g, '$$$$'));
1309
+ }
1310
+
1311
+ env.element.innerHTML = env.highlightedCode;
1312
+ });
1313
+
1314
+ // Wrap tokens in classes that are missing them
1315
+ Prism.hooks.add('wrap', function(env) {
1316
+ if (env.language === 'php' && env.type === 'markup') {
1317
+ env.content = env.content.replace(/(\{\{\{PHP[0-9]+\}\}\})/g, "<span class=\"token php\">$1</span>");
1318
+ }
1319
+ });
1320
+
1321
+ // Add the rules before all others
1322
+ Prism.languages.insertBefore('php', 'comment', {
1323
+ 'markup': {
1324
+ pattern: /<[^?]\/?(.*?)>/,
1325
+ inside: Prism.languages.markup
1326
+ },
1327
+ 'php': /\{\{\{PHP[0-9]+\}\}\}/
1328
+ });
1329
+ }
1330
+ ;
1331
+ Prism.languages.python= {
1332
+ 'comment': {
1333
+ pattern: /(^|[^\\])#.*/,
1334
+ lookbehind: true
1335
+ },
1336
+ 'string': /"""[\s\S]+?"""|'''[\s\S]+?'''|("|')(?:\\?.)*?\1/,
1337
+ 'function' : {
1338
+ pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_][a-zA-Z0-9_]*(?=\()/g,
1339
+ lookbehind: true
1340
+ },
1341
+ 'class-name': {
1342
+ pattern: /(\bclass\s+)[a-z0-9_]+/i,
1343
+ lookbehind: true
1344
+ },
1345
+ 'keyword' : /\b(?:as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|pass|print|raise|return|try|while|with|yield)\b/,
1346
+ 'boolean' : /\b(?:True|False)\b/,
1347
+ 'number' : /\b-?(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,
1348
+ 'operator' : /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:or|and|not)\b/,
1349
+ 'punctuation' : /[{}[\];(),.:]/
1350
+ };
1351
+
1352
+ Prism.languages.scss = Prism.languages.extend('css', {
1353
+ 'comment': {
1354
+ pattern: /(^|[^\\])(?:\/\*[\w\W]*?\*\/|\/\/.*)/,
1355
+ lookbehind: true
1356
+ },
1357
+ 'atrule': {
1358
+ pattern: /@[\w-]+(?:\([^()]+\)|[^(])*?(?=\s+[{;])/,
1359
+ inside: {
1360
+ 'rule': /@[\w-]+/
1361
+ // See rest below
1362
+ }
1363
+ },
1364
+ // url, compassified
1365
+ 'url': /(?:[-a-z]+-)*url(?=\()/i,
1366
+ // CSS selector regex is not appropriate for Sass
1367
+ // since there can be lot more things (var, @ directive, nesting..)
1368
+ // a selector must start at the end of a property or after a brace (end of other rules or nesting)
1369
+ // it can contain some characters that aren't used for defining rules or end of selector, & (parent selector), or interpolated variable
1370
+ // the end of a selector is found when there is no rules in it ( {} or {\s}) or if there is a property (because an interpolated var
1371
+ // can "pass" as a selector- e.g: proper#{$erty})
1372
+ // this one was hard to do, so please be careful if you edit this one :)
1373
+ 'selector': {
1374
+ // Initial look-ahead is used to prevent matching of blank selectors
1375
+ pattern: /(?=\S)[^@;\{\}\(\)]?([^@;\{\}\(\)]|&|#\{\$[-_\w]+\})+(?=\s*\{(\}|\s|[^\}]+(:|\{)[^\}]+))/m,
1376
+ inside: {
1377
+ 'placeholder': /%[-_\w]+/
1378
+ }
1379
+ }
1380
+ });
1381
+
1382
+ Prism.languages.insertBefore('scss', 'atrule', {
1383
+ 'keyword': [
1384
+ /@(?:if|else(?: if)?|for|each|while|import|extend|debug|warn|mixin|include|function|return|content)/i,
1385
+ {
1386
+ pattern: /( +)(?:from|through)(?= )/,
1387
+ lookbehind: true
1388
+ }
1389
+ ]
1390
+ });
1391
+
1392
+ Prism.languages.insertBefore('scss', 'property', {
1393
+ // var and interpolated vars
1394
+ 'variable': /\$[-_\w]+|#\{\$[-_\w]+\}/
1395
+ });
1396
+
1397
+ Prism.languages.insertBefore('scss', 'function', {
1398
+ 'placeholder': {
1399
+ pattern: /%[-_\w]+/,
1400
+ alias: 'selector'
1401
+ },
1402
+ 'statement': /\B!(?:default|optional)\b/i,
1403
+ 'boolean': /\b(?:true|false)\b/,
1404
+ 'null': /\bnull\b/,
1405
+ 'operator': {
1406
+ pattern: /(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|or|not)(?=\s)/,
1407
+ lookbehind: true
1408
+ }
1409
+ });
1410
+
1411
+ Prism.languages.scss['atrule'].inside.rest = Prism.util.clone(Prism.languages.scss);