UNPKG

4.69 kBJavaScriptView Raw
1Prism.languages.markup = {
2 'comment': {
3 pattern: /<!--(?:(?!<!--)[\s\S])*?-->/,
4 greedy: true
5 },
6 'prolog': {
7 pattern: /<\?[\s\S]+?\?>/,
8 greedy: true
9 },
10 'doctype': {
11 // https://www.w3.org/TR/xml/#NT-doctypedecl
12 pattern: /<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,
13 greedy: true,
14 inside: {
15 'internal-subset': {
16 pattern: /(^[^\[]*\[)[\s\S]+(?=\]>$)/,
17 lookbehind: true,
18 greedy: true,
19 inside: null // see below
20 },
21 'string': {
22 pattern: /"[^"]*"|'[^']*'/,
23 greedy: true
24 },
25 'punctuation': /^<!|>$|[[\]]/,
26 'doctype-tag': /^DOCTYPE/i,
27 'name': /[^\s<>'"]+/
28 }
29 },
30 'cdata': {
31 pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
32 greedy: true
33 },
34 'tag': {
35 pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,
36 greedy: true,
37 inside: {
38 'tag': {
39 pattern: /^<\/?[^\s>\/]+/,
40 inside: {
41 'punctuation': /^<\/?/,
42 'namespace': /^[^\s>\/:]+:/
43 }
44 },
45 'special-attr': [],
46 'attr-value': {
47 pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,
48 inside: {
49 'punctuation': [
50 {
51 pattern: /^=/,
52 alias: 'attr-equals'
53 },
54 /"|'/
55 ]
56 }
57 },
58 'punctuation': /\/?>/,
59 'attr-name': {
60 pattern: /[^\s>\/]+/,
61 inside: {
62 'namespace': /^[^\s>\/:]+:/
63 }
64 }
65
66 }
67 },
68 'entity': [
69 {
70 pattern: /&[\da-z]{1,8};/i,
71 alias: 'named-entity'
72 },
73 /&#x?[\da-f]{1,8};/i
74 ]
75};
76
77Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] =
78 Prism.languages.markup['entity'];
79Prism.languages.markup['doctype'].inside['internal-subset'].inside = Prism.languages.markup;
80
81// Plugin to make entity title show the real entity, idea by Roman Komarov
82Prism.hooks.add('wrap', function (env) {
83
84 if (env.type === 'entity') {
85 env.attributes['title'] = env.content.replace(/&amp;/, '&');
86 }
87});
88
89Object.defineProperty(Prism.languages.markup.tag, 'addInlined', {
90 /**
91 * Adds an inlined language to markup.
92 *
93 * An example of an inlined language is CSS with `<style>` tags.
94 *
95 * @param {string} tagName The name of the tag that contains the inlined language. This name will be treated as
96 * case insensitive.
97 * @param {string} lang The language key.
98 * @example
99 * addInlined('style', 'css');
100 */
101 value: function addInlined(tagName, lang) {
102 var includedCdataInside = {};
103 includedCdataInside['language-' + lang] = {
104 pattern: /(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,
105 lookbehind: true,
106 inside: Prism.languages[lang]
107 };
108 includedCdataInside['cdata'] = /^<!\[CDATA\[|\]\]>$/i;
109
110 var inside = {
111 'included-cdata': {
112 pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
113 inside: includedCdataInside
114 }
115 };
116 inside['language-' + lang] = {
117 pattern: /[\s\S]+/,
118 inside: Prism.languages[lang]
119 };
120
121 var def = {};
122 def[tagName] = {
123 pattern: RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g, function () { return tagName; }), 'i'),
124 lookbehind: true,
125 greedy: true,
126 inside: inside
127 };
128
129 Prism.languages.insertBefore('markup', 'cdata', def);
130 }
131});
132Object.defineProperty(Prism.languages.markup.tag, 'addAttribute', {
133 /**
134 * Adds an pattern to highlight languages embedded in HTML attributes.
135 *
136 * An example of an inlined language is CSS with `style` attributes.
137 *
138 * @param {string} attrName The name of the tag that contains the inlined language. This name will be treated as
139 * case insensitive.
140 * @param {string} lang The language key.
141 * @example
142 * addAttribute('style', 'css');
143 */
144 value: function (attrName, lang) {
145 Prism.languages.markup.tag.inside['special-attr'].push({
146 pattern: RegExp(
147 /(^|["'\s])/.source + '(?:' + attrName + ')' + /\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,
148 'i'
149 ),
150 lookbehind: true,
151 inside: {
152 'attr-name': /^[^\s=]+/,
153 'attr-value': {
154 pattern: /=[\s\S]+/,
155 inside: {
156 'value': {
157 pattern: /(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,
158 lookbehind: true,
159 alias: [lang, 'language-' + lang],
160 inside: Prism.languages[lang]
161 },
162 'punctuation': [
163 {
164 pattern: /^=/,
165 alias: 'attr-equals'
166 },
167 /"|'/
168 ]
169 }
170 }
171 }
172 });
173 }
174});
175
176Prism.languages.html = Prism.languages.markup;
177Prism.languages.mathml = Prism.languages.markup;
178Prism.languages.svg = Prism.languages.markup;
179
180Prism.languages.xml = Prism.languages.extend('markup', {});
181Prism.languages.ssml = Prism.languages.xml;
182Prism.languages.atom = Prism.languages.xml;
183Prism.languages.rss = Prism.languages.xml;