1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | function xml(hljs) {
|
10 | const regex = hljs.regex;
|
11 |
|
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 |
|
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 |
|
147 |
|
148 |
|
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 |
|
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 |
|
181 | {
|
182 | className: 'tag',
|
183 | begin: /<>|<\/>/
|
184 | },
|
185 |
|
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 |
|
234 | module.exports = xml;
|