OLD | NEW |
1 (function(){ | 1 (function(){ |
2 | 2 |
3 if (!self.Prism) { | 3 if ( |
| 4 » typeof self !== 'undefined' && !self.Prism || |
| 5 » typeof global !== 'undefined' && !global.Prism |
| 6 ) { |
4 return; | 7 return; |
5 } | 8 } |
6 | 9 |
7 var url = /\b([a-z]{3,7}:\/\/|tel:)[\w\-+%~/.:#=?&]+/, | 10 var url = /\b([a-z]{3,7}:\/\/|tel:)[\w\-+%~/.:#=?&]+/, |
8 email = /\b\S+@[\w.]+[a-z]{2}/, | 11 email = /\b\S+@[\w.]+[a-z]{2}/, |
9 linkMd = /\[([^\]]+)]\(([^)]+)\)/, | 12 linkMd = /\[([^\]]+)]\(([^)]+)\)/, |
10 | 13 |
11 // Tokens that may contain URLs and emails | 14 // Tokens that may contain URLs and emails |
12 candidates = ['comment', 'url', 'attr-value', 'string']; | 15 candidates = ['comment', 'url', 'attr-value', 'string']; |
13 | 16 |
14 for (var language in Prism.languages) { | 17 Prism.hooks.add('before-highlight', function(env) { |
15 » var tokens = Prism.languages[language]; | 18 » // Abort if grammar has already been processed |
16 » | 19 » if (!env.grammar || env.grammar['url-link']) { |
17 » Prism.languages.DFS(tokens, function (key, def, type) { | 20 » » return; |
| 21 » } |
| 22 » Prism.languages.DFS(env.grammar, function (key, def, type) { |
18 if (candidates.indexOf(type) > -1 && Prism.util.type(def) !== 'A
rray') { | 23 if (candidates.indexOf(type) > -1 && Prism.util.type(def) !== 'A
rray') { |
19 if (!def.pattern) { | 24 if (!def.pattern) { |
20 def = this[key] = { | 25 def = this[key] = { |
21 pattern: def | 26 pattern: def |
22 }; | 27 }; |
23 } | 28 } |
24 » » » | 29 |
25 def.inside = def.inside || {}; | 30 def.inside = def.inside || {}; |
26 » » » | 31 |
27 if (type == 'comment') { | 32 if (type == 'comment') { |
28 def.inside['md-link'] = linkMd; | 33 def.inside['md-link'] = linkMd; |
29 } | 34 } |
30 if (type == 'attr-value') { | 35 if (type == 'attr-value') { |
31 Prism.languages.insertBefore('inside', 'punctuat
ion', { 'url-link': url }, def); | 36 Prism.languages.insertBefore('inside', 'punctuat
ion', { 'url-link': url }, def); |
32 } | 37 } |
33 else { | 38 else { |
34 def.inside['url-link'] = url; | 39 def.inside['url-link'] = url; |
35 } | 40 } |
36 » » » | 41 |
37 def.inside['email-link'] = email; | 42 def.inside['email-link'] = email; |
38 } | 43 } |
39 }); | 44 }); |
40 » | 45 » env.grammar['url-link'] = url; |
41 » tokens['url-link'] = url; | 46 » env.grammar['email-link'] = email; |
42 » tokens['email-link'] = email; | 47 }); |
43 } | |
44 | 48 |
45 Prism.hooks.add('wrap', function(env) { | 49 Prism.hooks.add('wrap', function(env) { |
46 if (/-link$/.test(env.type)) { | 50 if (/-link$/.test(env.type)) { |
47 env.tag = 'a'; | 51 env.tag = 'a'; |
48 | 52 |
49 var href = env.content; | 53 var href = env.content; |
50 | 54 |
51 if (env.type == 'email-link' && href.indexOf('mailto:') != 0) { | 55 if (env.type == 'email-link' && href.indexOf('mailto:') != 0) { |
52 href = 'mailto:' + href; | 56 href = 'mailto:' + href; |
53 } | 57 } |
54 else if (env.type == 'md-link') { | 58 else if (env.type == 'md-link') { |
55 // Markdown | 59 // Markdown |
56 var match = env.content.match(linkMd); | 60 var match = env.content.match(linkMd); |
57 | 61 |
58 href = match[2]; | 62 href = match[2]; |
59 env.content = match[1]; | 63 env.content = match[1]; |
60 } | 64 } |
61 | 65 |
62 env.attributes.href = href; | 66 env.attributes.href = href; |
63 } | 67 } |
64 }); | 68 }); |
65 | 69 |
66 })(); | 70 })(); |
OLD | NEW |