UNPKG

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