]> luflow.net public git repositories - flow-web.git/blob - static/highlight/languages/xml.js
Initial commit.
[flow-web.git] / static / highlight / languages / xml.js
1 /*! `xml` grammar compiled for Highlight.js 11.11.1 */
2 (function(){
3 var hljsGrammar = (function () {
4 'use strict';
5
6 /*
7 Language: HTML, XML
8 Website: https://www.w3.org/XML/
9 Category: common, web
10 Audit: 2020
11 */
12
13 /** @type LanguageFn */
14 function xml(hljs) {
15 const regex = hljs.regex;
16 // XML names can have the following additional letters: https://www.w3.org/TR/xml/#NT-NameChar
17 // OTHER_NAME_CHARS = /[:\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]/;
18 // Element names start with NAME_START_CHAR followed by optional other Unicode letters, ASCII digits, hyphens, underscores, and periods
19 // const TAG_NAME_RE = regex.concat(/[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/, regex.optional(/[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*:/), /[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*/);;
20 // const XML_IDENT_RE = /[A-Z_a-z:\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]+/;
21 // const TAG_NAME_RE = regex.concat(/[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/, regex.optional(/[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*:/), /[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*/);
22 // however, to cater for performance and more Unicode support rely simply on the Unicode letter class
23 const TAG_NAME_RE = regex.concat(/[\p{L}_]/u, regex.optional(/[\p{L}0-9_.-]*:/u), /[\p{L}0-9_.-]*/u);
24 const XML_IDENT_RE = /[\p{L}0-9._:-]+/u;
25 const XML_ENTITIES = {
26 className: 'symbol',
27 begin: /&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/
28 };
29 const XML_META_KEYWORDS = {
30 begin: /\s/,
31 contains: [
32 {
33 className: 'keyword',
34 begin: /#?[a-z_][a-z1-9_-]+/,
35 illegal: /\n/
36 }
37 ]
38 };
39 const XML_META_PAR_KEYWORDS = hljs.inherit(XML_META_KEYWORDS, {
40 begin: /\(/,
41 end: /\)/
42 });
43 const APOS_META_STRING_MODE = hljs.inherit(hljs.APOS_STRING_MODE, { className: 'string' });
44 const QUOTE_META_STRING_MODE = hljs.inherit(hljs.QUOTE_STRING_MODE, { className: 'string' });
45 const TAG_INTERNALS = {
46 endsWithParent: true,
47 illegal: /</,
48 relevance: 0,
49 contains: [
50 {
51 className: 'attr',
52 begin: XML_IDENT_RE,
53 relevance: 0
54 },
55 {
56 begin: /=\s*/,
57 relevance: 0,
58 contains: [
59 {
60 className: 'string',
61 endsParent: true,
62 variants: [
63 {
64 begin: /"/,
65 end: /"/,
66 contains: [ XML_ENTITIES ]
67 },
68 {
69 begin: /'/,
70 end: /'/,
71 contains: [ XML_ENTITIES ]
72 },
73 { begin: /[^\s"'=<>`]+/ }
74 ]
75 }
76 ]
77 }
78 ]
79 };
80 return {
81 name: 'HTML, XML',
82 aliases: [
83 'html',
84 'xhtml',
85 'rss',
86 'atom',
87 'xjb',
88 'xsd',
89 'xsl',
90 'plist',
91 'wsf',
92 'svg'
93 ],
94 case_insensitive: true,
95 unicodeRegex: true,
96 contains: [
97 {
98 className: 'meta',
99 begin: /<![a-z]/,
100 end: />/,
101 relevance: 10,
102 contains: [
103 XML_META_KEYWORDS,
104 QUOTE_META_STRING_MODE,
105 APOS_META_STRING_MODE,
106 XML_META_PAR_KEYWORDS,
107 {
108 begin: /\[/,
109 end: /\]/,
110 contains: [
111 {
112 className: 'meta',
113 begin: /<![a-z]/,
114 end: />/,
115 contains: [
116 XML_META_KEYWORDS,
117 XML_META_PAR_KEYWORDS,
118 QUOTE_META_STRING_MODE,
119 APOS_META_STRING_MODE
120 ]
121 }
122 ]
123 }
124 ]
125 },
126 hljs.COMMENT(
127 /<!--/,
128 /-->/,
129 { relevance: 10 }
130 ),
131 {
132 begin: /<!\[CDATA\[/,
133 end: /\]\]>/,
134 relevance: 10
135 },
136 XML_ENTITIES,
137 // xml processing instructions
138 {
139 className: 'meta',
140 end: /\?>/,
141 variants: [
142 {
143 begin: /<\?xml/,
144 relevance: 10,
145 contains: [
146 QUOTE_META_STRING_MODE
147 ]
148 },
149 {
150 begin: /<\?[a-z][a-z0-9]+/,
151 }
152 ]
153
154 },
155 {
156 className: 'tag',
157 /*
158 The lookahead pattern (?=...) ensures that 'begin' only matches
159 '<style' as a single word, followed by a whitespace or an
160 ending bracket.
161 */
162 begin: /<style(?=\s|>)/,
163 end: />/,
164 keywords: { name: 'style' },
165 contains: [ TAG_INTERNALS ],
166 starts: {
167 end: /<\/style>/,
168 returnEnd: true,
169 subLanguage: [
170 'css',
171 'xml'
172 ]
173 }
174 },
175 {
176 className: 'tag',
177 // See the comment in the <style tag about the lookahead pattern
178 begin: /<script(?=\s|>)/,
179 end: />/,
180 keywords: { name: 'script' },
181 contains: [ TAG_INTERNALS ],
182 starts: {
183 end: /<\/script>/,
184 returnEnd: true,
185 subLanguage: [
186 'javascript',
187 'handlebars',
188 'xml'
189 ]
190 }
191 },
192 // we need this for now for jSX
193 {
194 className: 'tag',
195 begin: /<>|<\/>/
196 },
197 // open tag
198 {
199 className: 'tag',
200 begin: regex.concat(
201 /</,
202 regex.lookahead(regex.concat(
203 TAG_NAME_RE,
204 // <tag/>
205 // <tag>
206 // <tag ...
207 regex.either(/\/>/, />/, /\s/)
208 ))
209 ),
210 end: /\/?>/,
211 contains: [
212 {
213 className: 'name',
214 begin: TAG_NAME_RE,
215 relevance: 0,
216 starts: TAG_INTERNALS
217 }
218 ]
219 },
220 // close tag
221 {
222 className: 'tag',
223 begin: regex.concat(
224 /<\//,
225 regex.lookahead(regex.concat(
226 TAG_NAME_RE, />/
227 ))
228 ),
229 contains: [
230 {
231 className: 'name',
232 begin: TAG_NAME_RE,
233 relevance: 0
234 },
235 {
236 begin: />/,
237 relevance: 0,
238 endsParent: true
239 }
240 ]
241 }
242 ]
243 };
244 }
245
246 return xml;
247
248 })();
249
250 hljs.registerLanguage('xml', hljsGrammar);
251 })();