UNPKG

2.36 kBJavaScriptView Raw
1(function () {
2
3 if (typeof Prism === 'undefined') {
4 return;
5 }
6
7 var autoLinkerProcess = function (grammar) {
8 if (Prism.plugins.autolinker) {
9 Prism.plugins.autolinker.processGrammar(grammar);
10 }
11 return grammar;
12 };
13 var dataURI = {
14 pattern: /(.)\bdata:[^\/]+\/[^,]+,(?:(?!\1)[\s\S]|\\\1)+(?=\1)/,
15 lookbehind: true,
16 inside: {
17 'language-css': {
18 pattern: /(data:[^\/]+\/(?:[^+,]+\+)?css,)[\s\S]+/,
19 lookbehind: true
20 },
21 'language-javascript': {
22 pattern: /(data:[^\/]+\/(?:[^+,]+\+)?javascript,)[\s\S]+/,
23 lookbehind: true
24 },
25 'language-json': {
26 pattern: /(data:[^\/]+\/(?:[^+,]+\+)?json,)[\s\S]+/,
27 lookbehind: true
28 },
29 'language-markup': {
30 pattern: /(data:[^\/]+\/(?:[^+,]+\+)?(?:html|xml),)[\s\S]+/,
31 lookbehind: true
32 }
33 }
34 };
35
36 // Tokens that may contain URLs
37 var candidates = ['url', 'attr-value', 'string'];
38
39 Prism.plugins.dataURIHighlight = {
40 processGrammar: function (grammar) {
41 // Abort if grammar has already been processed
42 if (!grammar || grammar['data-uri']) {
43 return;
44 }
45
46 Prism.languages.DFS(grammar, function (key, def, type) {
47 if (candidates.indexOf(type) > -1 && !Array.isArray(def)) {
48 if (!def.pattern) {
49 def = this[key] = {
50 pattern: def
51 };
52 }
53
54 def.inside = def.inside || {};
55
56 if (type == 'attr-value') {
57 Prism.languages.insertBefore('inside', def.inside['url-link'] ? 'url-link' : 'punctuation', {
58 'data-uri': dataURI
59 }, def);
60 } else {
61 if (def.inside['url-link']) {
62 Prism.languages.insertBefore('inside', 'url-link', {
63 'data-uri': dataURI
64 }, def);
65 } else {
66 def.inside['data-uri'] = dataURI;
67 }
68 }
69 }
70 });
71 grammar['data-uri'] = dataURI;
72 }
73 };
74
75 Prism.hooks.add('before-highlight', function (env) {
76 // Prepare the needed grammars for this code block
77 if (dataURI.pattern.test(env.code)) {
78 for (var p in dataURI.inside) {
79 if (dataURI.inside.hasOwnProperty(p)) {
80 if (!dataURI.inside[p].inside && dataURI.inside[p].pattern.test(env.code)) {
81 var lang = p.match(/^language-(.+)/)[1];
82 if (Prism.languages[lang]) {
83 dataURI.inside[p].inside = {
84 rest: autoLinkerProcess(Prism.languages[lang])
85 };
86 }
87 }
88 }
89 }
90 }
91
92 Prism.plugins.dataURIHighlight.processGrammar(env.grammar);
93 });
94}());