xref: /vim-8.2.3635/runtime/syntax/xml.vim (revision 044b68f4)
1" Vim syntax file
2" Language:	XML
3" Maintainer:	Johannes Zellner <[email protected]>
4"		Author and previous maintainer:
5"		Paul Siegmann <[email protected]>
6" Last Change:	Mi, 13 Apr 2005 22:40:09 CEST
7" Filenames:	*.xml
8" $Id$
9
10" CONFIGURATION:
11"   syntax folding can be turned on by
12"
13"      let g:xml_syntax_folding = 1
14"
15"   before the syntax file gets loaded (e.g. in ~/.vimrc).
16"   This might slow down syntax highlighting significantly,
17"   especially for large files.
18"
19" CREDITS:
20"   The original version was derived by Paul Siegmann from
21"   Claudio Fleiner's html.vim.
22"
23" REFERENCES:
24"   [1] http://www.w3.org/TR/2000/REC-xml-20001006
25"   [2] http://www.w3.org/XML/1998/06/xmlspec-report-19980910.htm
26"
27"   as <[email protected]> pointed out according to reference [1]
28"
29"   2.3 Common Syntactic Constructs
30"   [4]    NameChar    ::=    Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender
31"   [5]    Name        ::=    (Letter | '_' | ':') (NameChar)*
32"
33" NOTE:
34"   1) empty tag delimiters "/>" inside attribute values (strings)
35"      confuse syntax highlighting.
36"   2) for large files, folding can be pretty slow, especially when
37"      loading a file the first time and viewoptions contains 'folds'
38"      so that folds of previous sessions are applied.
39"      Don't use 'foldmethod=syntax' in this case.
40
41
42" Quit when a syntax file was already loaded
43if exists("b:current_syntax")
44    finish
45endif
46
47let s:xml_cpo_save = &cpo
48set cpo&vim
49
50syn case match
51
52" mark illegal characters
53syn match xmlError "[<&]"
54
55" strings (inside tags) aka VALUES
56"
57" EXAMPLE:
58"
59" <tag foo.attribute = "value">
60"                      ^^^^^^^
61syn region  xmlString contained start=+"+ end=+"+ contains=xmlEntity,@Spell display
62syn region  xmlString contained start=+'+ end=+'+ contains=xmlEntity,@Spell display
63
64
65" punctuation (within attributes) e.g. <tag xml:foo.attribute ...>
66"                                              ^   ^
67" syn match   xmlAttribPunct +[-:._]+ contained display
68syn match   xmlAttribPunct +[:.]+ contained display
69
70" no highlighting for xmlEqual (xmlEqual has no highlighting group)
71syn match   xmlEqual +=+ display
72
73
74" attribute, everything before the '='
75"
76" PROVIDES: @xmlAttribHook
77"
78" EXAMPLE:
79"
80" <tag foo.attribute = "value">
81"      ^^^^^^^^^^^^^
82"
83syn match   xmlAttrib
84    \ +[-'"<]\@<!\<[a-zA-Z:_][-.0-9a-zA-Z0-9:_]*\>\(['">]\@!\|$\)+
85    \ contained
86    \ contains=xmlAttribPunct,@xmlAttribHook
87    \ display
88
89
90" namespace spec
91"
92" PROVIDES: @xmlNamespaceHook
93"
94" EXAMPLE:
95"
96" <xsl:for-each select = "lola">
97"  ^^^
98"
99if exists("g:xml_namespace_transparent")
100syn match   xmlNamespace
101    \ +\(<\|</\)\@<=[^ /!?<>"':]\+[:]\@=+
102    \ contained
103    \ contains=@xmlNamespaceHook
104    \ transparent
105    \ display
106else
107syn match   xmlNamespace
108    \ +\(<\|</\)\@<=[^ /!?<>"':]\+[:]\@=+
109    \ contained
110    \ contains=@xmlNamespaceHook
111    \ display
112endif
113
114
115" tag name
116"
117" PROVIDES: @xmlTagHook
118"
119" EXAMPLE:
120"
121" <tag foo.attribute = "value">
122"  ^^^
123"
124syn match   xmlTagName
125    \ +[<]\@<=[^ /!?<>"']\++
126    \ contained
127    \ contains=xmlNamespace,xmlAttribPunct,@xmlTagHook
128    \ display
129
130
131if exists('g:xml_syntax_folding')
132
133    " start tag
134    " use matchgroup=xmlTag to skip over the leading '<'
135    "
136    " PROVIDES: @xmlStartTagHook
137    "
138    " EXAMPLE:
139    "
140    " <tag id="whoops">
141    " s^^^^^^^^^^^^^^^e
142    "
143    syn region   xmlTag
144	\ matchgroup=xmlTag start=+<[^ /!?<>"']\@=+
145	\ matchgroup=xmlTag end=+>+
146	\ contained
147	\ contains=xmlError,xmlTagName,xmlAttrib,xmlEqual,xmlString,@xmlStartTagHook
148
149
150    " highlight the end tag
151    "
152    " PROVIDES: @xmlTagHook
153    " (should we provide a separate @xmlEndTagHook ?)
154    "
155    " EXAMPLE:
156    "
157    " </tag>
158    " ^^^^^^
159    "
160    syn match   xmlEndTag
161	\ +</[^ /!?<>"']\+>+
162	\ contained
163	\ contains=xmlNamespace,xmlAttribPunct,@xmlTagHook
164
165
166    " tag elements with syntax-folding.
167    " NOTE: NO HIGHLIGHTING -- highlighting is done by contained elements
168    "
169    " PROVIDES: @xmlRegionHook
170    "
171    " EXAMPLE:
172    "
173    " <tag id="whoops">
174    "   <!-- comment -->
175    "   <another.tag></another.tag>
176    "   <empty.tag/>
177    "   some data
178    " </tag>
179    "
180    syn region   xmlRegion
181	\ start=+<\z([^ /!?<>"']\+\)+
182	\ skip=+<!--\_.\{-}-->+
183	\ end=+</\z1\_\s\{-}>+
184	\ matchgroup=xmlEndTag end=+/>+
185	\ fold
186	\ contains=xmlTag,xmlEndTag,xmlCdata,xmlRegion,xmlComment,xmlEntity,xmlProcessing,@xmlRegionHook,@Spell
187	\ keepend
188	\ extend
189
190else
191
192    " no syntax folding:
193    " - contained attribute removed
194    " - xmlRegion not defined
195    "
196    syn region   xmlTag
197	\ matchgroup=xmlTag start=+<[^ /!?<>"']\@=+
198	\ matchgroup=xmlTag end=+>+
199	\ contains=xmlError,xmlTagName,xmlAttrib,xmlEqual,xmlString,@xmlStartTagHook
200
201    syn match   xmlEndTag
202	\ +</[^ /!?<>"']\+>+
203	\ contains=xmlNamespace,xmlAttribPunct,@xmlTagHook
204
205endif
206
207
208" &entities; compare with dtd
209syn match   xmlEntity                 "&[^; \t]*;" contains=xmlEntityPunct
210syn match   xmlEntityPunct  contained "[&.;]"
211
212if exists('g:xml_syntax_folding')
213
214    " The real comments (this implements the comments as defined by xml,
215    " but not all xml pages actually conform to it. Errors are flagged.
216    syn region  xmlComment
217	\ start=+<!+
218	\ end=+>+
219	\ contains=xmlCommentPart,xmlCommentError
220	\ extend
221	\ fold
222
223else
224
225    " no syntax folding:
226    " - fold attribute removed
227    "
228    syn region  xmlComment
229	\ start=+<!+
230	\ end=+>+
231	\ contains=xmlCommentPart,xmlCommentError
232	\ extend
233
234endif
235
236syn keyword xmlTodo         contained TODO FIXME XXX
237syn match   xmlCommentError contained "[^><!]"
238syn region  xmlCommentPart
239    \ start=+--+
240    \ end=+--+
241    \ contained
242    \ contains=xmlTodo,@xmlCommentHook,@Spell
243
244
245" CData sections
246"
247" PROVIDES: @xmlCdataHook
248"
249syn region    xmlCdata
250    \ start=+<!\[CDATA\[+
251    \ end=+]]>+
252    \ contains=xmlCdataStart,xmlCdataEnd,@xmlCdataHook,@Spell
253    \ keepend
254    \ extend
255
256" using the following line instead leads to corrupt folding at CDATA regions
257" syn match    xmlCdata      +<!\[CDATA\[\_.\{-}]]>+  contains=xmlCdataStart,xmlCdataEnd,@xmlCdataHook
258syn match    xmlCdataStart +<!\[CDATA\[+  contained contains=xmlCdataCdata
259syn keyword  xmlCdataCdata CDATA          contained
260syn match    xmlCdataEnd   +]]>+          contained
261
262
263" Processing instructions
264" This allows "?>" inside strings -- good idea?
265syn region  xmlProcessing matchgroup=xmlProcessingDelim start="<?" end="?>" contains=xmlAttrib,xmlEqual,xmlString
266
267
268if exists('g:xml_syntax_folding')
269
270    " DTD -- we use dtd.vim here
271    syn region  xmlDocType matchgroup=xmlDocTypeDecl
272	\ start="<!DOCTYPE"he=s+2,rs=s+2 end=">"
273	\ fold
274	\ contains=xmlDocTypeKeyword,xmlInlineDTD,xmlString
275else
276
277    " no syntax folding:
278    " - fold attribute removed
279    "
280    syn region  xmlDocType matchgroup=xmlDocTypeDecl
281	\ start="<!DOCTYPE"he=s+2,rs=s+2 end=">"
282	\ contains=xmlDocTypeKeyword,xmlInlineDTD,xmlString
283
284endif
285
286syn keyword xmlDocTypeKeyword contained DOCTYPE PUBLIC SYSTEM
287syn region  xmlInlineDTD contained matchgroup=xmlDocTypeDecl start="\[" end="]" contains=@xmlDTD
288syn include @xmlDTD <sfile>:p:h/dtd.vim
289unlet b:current_syntax
290
291
292" synchronizing
293" TODO !!! to be improved !!!
294
295syn sync match xmlSyncDT grouphere  xmlDocType +\_.\(<!DOCTYPE\)\@=+
296" syn sync match xmlSyncDT groupthere  NONE       +]>+
297
298if exists('g:xml_syntax_folding')
299    syn sync match xmlSync grouphere   xmlRegion  +\_.\(<[^ /!?<>"']\+\)\@=+
300    " syn sync match xmlSync grouphere  xmlRegion "<[^ /!?<>"']*>"
301    syn sync match xmlSync groupthere  xmlRegion  +</[^ /!?<>"']\+>+
302endif
303
304syn sync minlines=100
305
306
307" The default highlighting.
308hi def link xmlTodo		Todo
309hi def link xmlTag		Function
310hi def link xmlTagName		Function
311hi def link xmlEndTag		Identifier
312if !exists("g:xml_namespace_transparent")
313    hi def link xmlNamespace	Tag
314endif
315hi def link xmlEntity		Statement
316hi def link xmlEntityPunct	Type
317
318hi def link xmlAttribPunct	Comment
319hi def link xmlAttrib		Type
320
321hi def link xmlString		String
322hi def link xmlComment		Comment
323hi def link xmlCommentPart	Comment
324hi def link xmlCommentError	Error
325hi def link xmlError		Error
326
327hi def link xmlProcessingDelim	Comment
328hi def link xmlProcessing	Type
329
330hi def link xmlCdata		String
331hi def link xmlCdataCdata	Statement
332hi def link xmlCdataStart	Type
333hi def link xmlCdataEnd		Type
334
335hi def link xmlDocTypeDecl	Function
336hi def link xmlDocTypeKeyword	Statement
337hi def link xmlInlineDTD	Function
338
339let b:current_syntax = "xml"
340
341let &cpo = s:xml_cpo_save
342unlet s:xml_cpo_save
343
344" vim: ts=8
345