UNPKG

5.22 kBJavaScriptView Raw
1/*
2Language: HTML, XML
3Website: https://www.w3.org/XML/
4Category: common, web
5Audit: 2020
6*/
7
8/** @type LanguageFn */
9function xml(hljs) {
10 const regex = hljs.regex;
11 // Element names can contain letters, digits, hyphens, underscores, and periods
12 const TAG_NAME_RE = regex.concat(/[A-Z_]/, regex.optional(/[A-Z0-9_.-]*:/), /[A-Z0-9_.-]*/);
13 const XML_IDENT_RE = /[A-Za-z0-9._:-]+/;
14 const XML_ENTITIES = {
15 className: 'symbol',
16 begin: /&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/
17 };
18 const XML_META_KEYWORDS = {
19 begin: /\s/,
20 contains: [
21 {
22 className: 'keyword',
23 begin: /#?[a-z_][a-z1-9_-]+/,
24 illegal: /\n/
25 }
26 ]
27 };
28 const XML_META_PAR_KEYWORDS = hljs.inherit(XML_META_KEYWORDS, {
29 begin: /\(/,
30 end: /\)/
31 });
32 const APOS_META_STRING_MODE = hljs.inherit(hljs.APOS_STRING_MODE, { className: 'string' });
33 const QUOTE_META_STRING_MODE = hljs.inherit(hljs.QUOTE_STRING_MODE, { className: 'string' });
34 const TAG_INTERNALS = {
35 endsWithParent: true,
36 illegal: /</,
37 relevance: 0,
38 contains: [
39 {
40 className: 'attr',
41 begin: XML_IDENT_RE,
42 relevance: 0
43 },
44 {
45 begin: /=\s*/,
46 relevance: 0,
47 contains: [
48 {
49 className: 'string',
50 endsParent: true,
51 variants: [
52 {
53 begin: /"/,
54 end: /"/,
55 contains: [ XML_ENTITIES ]
56 },
57 {
58 begin: /'/,
59 end: /'/,
60 contains: [ XML_ENTITIES ]
61 },
62 { begin: /[^\s"'=<>`]+/ }
63 ]
64 }
65 ]
66 }
67 ]
68 };
69 return {
70 name: 'HTML, XML',
71 aliases: [
72 'html',
73 'xhtml',
74 'rss',
75 'atom',
76 'xjb',
77 'xsd',
78 'xsl',
79 'plist',
80 'wsf',
81 'svg'
82 ],
83 case_insensitive: true,
84 contains: [
85 {
86 className: 'meta',
87 begin: /<![a-z]/,
88 end: />/,
89 relevance: 10,
90 contains: [
91 XML_META_KEYWORDS,
92 QUOTE_META_STRING_MODE,
93 APOS_META_STRING_MODE,
94 XML_META_PAR_KEYWORDS,
95 {
96 begin: /\[/,
97 end: /\]/,
98 contains: [
99 {
100 className: 'meta',
101 begin: /<![a-z]/,
102 end: />/,
103 contains: [
104 XML_META_KEYWORDS,
105 XML_META_PAR_KEYWORDS,
106 QUOTE_META_STRING_MODE,
107 APOS_META_STRING_MODE
108 ]
109 }
110 ]
111 }
112 ]
113 },
114 hljs.COMMENT(
115 /<!--/,
116 /-->/,
117 { relevance: 10 }
118 ),
119 {
120 begin: /<!\[CDATA\[/,
121 end: /\]\]>/,
122 relevance: 10
123 },
124 XML_ENTITIES,
125 // xml processing instructions
126 {
127 className: 'meta',
128 end: /\?>/,
129 variants: [
130 {
131 begin: /<\?xml/,
132 relevance: 10,
133 contains: [
134 QUOTE_META_STRING_MODE
135 ]
136 },
137 {
138 begin: /<\?[a-z][a-z0-9]+/,
139 }
140 ]
141
142 },
143 {
144 className: 'tag',
145 /*
146 The lookahead pattern (?=...) ensures that 'begin' only matches
147 '<style' as a single word, followed by a whitespace or an
148 ending bracket.
149 */
150 begin: /<style(?=\s|>)/,
151 end: />/,
152 keywords: { name: 'style' },
153 contains: [ TAG_INTERNALS ],
154 starts: {
155 end: /<\/style>/,
156 returnEnd: true,
157 subLanguage: [
158 'css',
159 'xml'
160 ]
161 }
162 },
163 {
164 className: 'tag',
165 // See the comment in the <style tag about the lookahead pattern
166 begin: /<script(?=\s|>)/,
167 end: />/,
168 keywords: { name: 'script' },
169 contains: [ TAG_INTERNALS ],
170 starts: {
171 end: /<\/script>/,
172 returnEnd: true,
173 subLanguage: [
174 'javascript',
175 'handlebars',
176 'xml'
177 ]
178 }
179 },
180 // we need this for now for jSX
181 {
182 className: 'tag',
183 begin: /<>|<\/>/
184 },
185 // open tag
186 {
187 className: 'tag',
188 begin: regex.concat(
189 /</,
190 regex.lookahead(regex.concat(
191 TAG_NAME_RE,
192 // <tag/>
193 // <tag>
194 // <tag ...
195 regex.either(/\/>/, />/, /\s/)
196 ))
197 ),
198 end: /\/?>/,
199 contains: [
200 {
201 className: 'name',
202 begin: TAG_NAME_RE,
203 relevance: 0,
204 starts: TAG_INTERNALS
205 }
206 ]
207 },
208 // close tag
209 {
210 className: 'tag',
211 begin: regex.concat(
212 /<\//,
213 regex.lookahead(regex.concat(
214 TAG_NAME_RE, />/
215 ))
216 ),
217 contains: [
218 {
219 className: 'name',
220 begin: TAG_NAME_RE,
221 relevance: 0
222 },
223 {
224 begin: />/,
225 relevance: 0,
226 endsParent: true
227 }
228 ]
229 }
230 ]
231 };
232}
233
234module.exports = xml;