xref: /vim-8.2.3635/runtime/syntax/sgml.vim (revision 6c391a74)
1071d4279SBram Moolenaar" Vim syntax file
2071d4279SBram Moolenaar" Language:	SGML
3071d4279SBram Moolenaar" Maintainer:	Johannes Zellner <[email protected]>
4071d4279SBram Moolenaar" Last Change:	Tue, 27 Apr 2004 15:05:21 CEST
5071d4279SBram Moolenaar" Filenames:	*.sgml,*.sgm
65c73622aSBram Moolenaar" $Id: sgml.vim,v 1.1 2004/06/13 17:52:57 vimboss Exp $
7071d4279SBram Moolenaar
889bcfda6SBram Moolenaar" quit when a syntax file was already loaded
989bcfda6SBram Moolenaarif exists("b:current_syntax")
10071d4279SBram Moolenaar  finish
11071d4279SBram Moolenaarendif
12071d4279SBram Moolenaar
13071d4279SBram Moolenaarlet s:sgml_cpo_save = &cpo
14071d4279SBram Moolenaarset cpo&vim
15071d4279SBram Moolenaar
16071d4279SBram Moolenaarsyn case match
17071d4279SBram Moolenaar
18071d4279SBram Moolenaar" mark illegal characters
19071d4279SBram Moolenaarsyn match sgmlError "[<&]"
20071d4279SBram Moolenaar
21071d4279SBram Moolenaar
22071d4279SBram Moolenaar" unicode numbers:
23071d4279SBram Moolenaar" provide different highlithing for unicode characters
24071d4279SBram Moolenaar" inside strings and in plain text (character data).
25071d4279SBram Moolenaar"
26071d4279SBram Moolenaar" EXAMPLE:
27071d4279SBram Moolenaar"
28071d4279SBram Moolenaar" \u4e88
29071d4279SBram Moolenaar"
30071d4279SBram Moolenaarsyn match   sgmlUnicodeNumberAttr    +\\u\x\{4}+ contained contains=sgmlUnicodeSpecifierAttr
31071d4279SBram Moolenaarsyn match   sgmlUnicodeSpecifierAttr +\\u+ contained
32071d4279SBram Moolenaarsyn match   sgmlUnicodeNumberData    +\\u\x\{4}+ contained contains=sgmlUnicodeSpecifierData
33071d4279SBram Moolenaarsyn match   sgmlUnicodeSpecifierData +\\u+ contained
34071d4279SBram Moolenaar
35071d4279SBram Moolenaar
36071d4279SBram Moolenaar" strings inside character data or comments
37071d4279SBram Moolenaar"
38071d4279SBram Moolenaarsyn region  sgmlString contained start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=sgmlEntity,sgmlUnicodeNumberAttr display
39071d4279SBram Moolenaarsyn region  sgmlString contained start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=sgmlEntity,sgmlUnicodeNumberAttr display
40071d4279SBram Moolenaar
41071d4279SBram Moolenaar" punctuation (within attributes) e.g. <tag sgml:foo.attribute ...>
42071d4279SBram Moolenaar"						^   ^
43071d4279SBram Moolenaarsyn match   sgmlAttribPunct +[:.]+ contained display
44071d4279SBram Moolenaar
45071d4279SBram Moolenaar
46071d4279SBram Moolenaar" no highlighting for sgmlEqual (sgmlEqual has no highlighting group)
47071d4279SBram Moolenaarsyn match   sgmlEqual +=+
48071d4279SBram Moolenaar
49071d4279SBram Moolenaar
50071d4279SBram Moolenaar" attribute, everything before the '='
51071d4279SBram Moolenaar"
52071d4279SBram Moolenaar" PROVIDES: @sgmlAttribHook
53071d4279SBram Moolenaar"
54071d4279SBram Moolenaar" EXAMPLE:
55071d4279SBram Moolenaar"
56071d4279SBram Moolenaar" <tag foo.attribute = "value">
57071d4279SBram Moolenaar"      ^^^^^^^^^^^^^
58071d4279SBram Moolenaar"
59071d4279SBram Moolenaarsyn match   sgmlAttrib
60071d4279SBram Moolenaar    \ +[^-'"<]\@<=\<[a-zA-Z0-9.:]\+\>\([^'">]\@=\|$\)+
61071d4279SBram Moolenaar    \ contained
62071d4279SBram Moolenaar    \ contains=sgmlAttribPunct,@sgmlAttribHook
63071d4279SBram Moolenaar    \ display
64071d4279SBram Moolenaar
65071d4279SBram Moolenaar
66071d4279SBram Moolenaar" UNQUOTED value (not including the '=' -- sgmlEqual)
67071d4279SBram Moolenaar"
68071d4279SBram Moolenaar" PROVIDES: @sgmlValueHook
69071d4279SBram Moolenaar"
70071d4279SBram Moolenaar" EXAMPLE:
71071d4279SBram Moolenaar"
72071d4279SBram Moolenaar" <tag foo.attribute = value>
73071d4279SBram Moolenaar"		       ^^^^^
74071d4279SBram Moolenaar"
75071d4279SBram Moolenaarsyn match   sgmlValue
76071d4279SBram Moolenaar    \ +[^"' =/!?<>][^ =/!?<>]*+
77071d4279SBram Moolenaar    \ contained
78071d4279SBram Moolenaar    \ contains=sgmlEntity,sgmlUnicodeNumberAttr,@sgmlValueHook
79071d4279SBram Moolenaar    \ display
80071d4279SBram Moolenaar
81071d4279SBram Moolenaar
82071d4279SBram Moolenaar" QUOTED value (not including the '=' -- sgmlEqual)
83071d4279SBram Moolenaar"
84071d4279SBram Moolenaar" PROVIDES: @sgmlValueHook
85071d4279SBram Moolenaar"
86071d4279SBram Moolenaar" EXAMPLE:
87071d4279SBram Moolenaar"
88071d4279SBram Moolenaar" <tag foo.attribute = "value">
89071d4279SBram Moolenaar"		       ^^^^^^^
90071d4279SBram Moolenaar" <tag foo.attribute = 'value'>
91071d4279SBram Moolenaar"		       ^^^^^^^
92071d4279SBram Moolenaar"
93071d4279SBram Moolenaarsyn region  sgmlValue contained start=+"+ skip=+\\\\\|\\"+ end=+"+
94071d4279SBram Moolenaar	    \ contains=sgmlEntity,sgmlUnicodeNumberAttr,@sgmlValueHook
95071d4279SBram Moolenaarsyn region  sgmlValue contained start=+'+ skip=+\\\\\|\\'+ end=+'+
96071d4279SBram Moolenaar	    \ contains=sgmlEntity,sgmlUnicodeNumberAttr,@sgmlValueHook
97071d4279SBram Moolenaar
98071d4279SBram Moolenaar
99071d4279SBram Moolenaar" value, everything after (and including) the '='
100071d4279SBram Moolenaar" no highlighting!
101071d4279SBram Moolenaar"
102071d4279SBram Moolenaar" EXAMPLE:
103071d4279SBram Moolenaar"
104071d4279SBram Moolenaar" <tag foo.attribute = "value">
105071d4279SBram Moolenaar"		     ^^^^^^^^^
106071d4279SBram Moolenaar" <tag foo.attribute = value>
107071d4279SBram Moolenaar"		     ^^^^^^^
108071d4279SBram Moolenaar"
109071d4279SBram Moolenaarsyn match   sgmlEqualValue
110071d4279SBram Moolenaar    \ +=\s*[^ =/!?<>]\++
111071d4279SBram Moolenaar    \ contained
112071d4279SBram Moolenaar    \ contains=sgmlEqual,sgmlString,sgmlValue
113071d4279SBram Moolenaar    \ display
114071d4279SBram Moolenaar
115071d4279SBram Moolenaar
116071d4279SBram Moolenaar" start tag
117071d4279SBram Moolenaar" use matchgroup=sgmlTag to skip over the leading '<'
118071d4279SBram Moolenaar" see also sgmlEmptyTag below.
119071d4279SBram Moolenaar"
120071d4279SBram Moolenaar" PROVIDES: @sgmlTagHook
121071d4279SBram Moolenaar"
122071d4279SBram Moolenaarsyn region   sgmlTag
123071d4279SBram Moolenaar    \ matchgroup=sgmlTag start=+<[^ /!?"']\@=+
124071d4279SBram Moolenaar    \ matchgroup=sgmlTag end=+>+
125071d4279SBram Moolenaar    \ contained
126071d4279SBram Moolenaar    \ contains=sgmlError,sgmlAttrib,sgmlEqualValue,@sgmlTagHook
127071d4279SBram Moolenaar
128071d4279SBram Moolenaar
129071d4279SBram Moolenaar" tag content for empty tags. This is the same as sgmlTag
130071d4279SBram Moolenaar" above, except the `matchgroup=sgmlEndTag for highlighting
131071d4279SBram Moolenaar" the end '/>' differently.
132071d4279SBram Moolenaar"
133071d4279SBram Moolenaar" PROVIDES: @sgmlTagHook
134071d4279SBram Moolenaar"
135071d4279SBram Moolenaarsyn region   sgmlEmptyTag
136071d4279SBram Moolenaar    \ matchgroup=sgmlTag start=+<[^ /!?"']\@=+
137071d4279SBram Moolenaar    \ matchgroup=sgmlEndTag end=+/>+
138071d4279SBram Moolenaar    \ contained
139071d4279SBram Moolenaar    \ contains=sgmlError,sgmlAttrib,sgmlEqualValue,@sgmlTagHook
140071d4279SBram Moolenaar
141071d4279SBram Moolenaar
142071d4279SBram Moolenaar" end tag
143071d4279SBram Moolenaar" highlight everything but not the trailing '>' which
144071d4279SBram Moolenaar" was already highlighted by the containing sgmlRegion.
145071d4279SBram Moolenaar"
146071d4279SBram Moolenaar" PROVIDES: @sgmlTagHook
147071d4279SBram Moolenaar" (should we provide a separate @sgmlEndTagHook ?)
148071d4279SBram Moolenaar"
149071d4279SBram Moolenaarsyn match   sgmlEndTag
150071d4279SBram Moolenaar    \ +</[^ /!?>"']\+>+
151071d4279SBram Moolenaar    \ contained
152071d4279SBram Moolenaar    \ contains=@sgmlTagHook
153071d4279SBram Moolenaar
154071d4279SBram Moolenaar
155071d4279SBram Moolenaar" [-- SGML SPECIFIC --]
156071d4279SBram Moolenaar
157071d4279SBram Moolenaar" SGML specific
158071d4279SBram Moolenaar" tag content for abbreviated regions
159071d4279SBram Moolenaar"
160071d4279SBram Moolenaar" PROVIDES: @sgmlTagHook
161071d4279SBram Moolenaar"
162071d4279SBram Moolenaarsyn region   sgmlAbbrTag
163071d4279SBram Moolenaar    \ matchgroup=sgmlTag start=+<[^ /!?"']\@=+
164071d4279SBram Moolenaar    \ matchgroup=sgmlTag end=+/+
165071d4279SBram Moolenaar    \ contained
166071d4279SBram Moolenaar    \ contains=sgmlError,sgmlAttrib,sgmlEqualValue,@sgmlTagHook
167071d4279SBram Moolenaar
168071d4279SBram Moolenaar
169071d4279SBram Moolenaar" SGML specific
170071d4279SBram Moolenaar" just highlight the trailing '/'
171071d4279SBram Moolenaarsyn match   sgmlAbbrEndTag +/+
172071d4279SBram Moolenaar
173071d4279SBram Moolenaar
174071d4279SBram Moolenaar" SGML specific
175071d4279SBram Moolenaar" abbreviated regions
176071d4279SBram Moolenaar"
177*6c391a74SBram Moolenaar" No highlighting, highlighting is done by contained elements.
178071d4279SBram Moolenaar"
179071d4279SBram Moolenaar" PROVIDES: @sgmlRegionHook
180071d4279SBram Moolenaar"
181071d4279SBram Moolenaar" EXAMPLE:
182071d4279SBram Moolenaar"
183071d4279SBram Moolenaar" <bold/Im Anfang war das Wort/
184071d4279SBram Moolenaar"
185071d4279SBram Moolenaarsyn match   sgmlAbbrRegion
186071d4279SBram Moolenaar    \ +<[^/!?>"']\+/\_[^/]\+/+
187071d4279SBram Moolenaar    \ contains=sgmlAbbrTag,sgmlAbbrEndTag,sgmlCdata,sgmlComment,sgmlEntity,sgmlUnicodeNumberData,@sgmlRegionHook
188071d4279SBram Moolenaar
189071d4279SBram Moolenaar" [-- END OF SGML SPECIFIC --]
190071d4279SBram Moolenaar
191071d4279SBram Moolenaar
192071d4279SBram Moolenaar" real (non-empty) elements. We cannot do syntax folding
193071d4279SBram Moolenaar" as in xml, because end tags may be optional in sgml depending
194071d4279SBram Moolenaar" on the dtd.
195*6c391a74SBram Moolenaar" No highlighting, highlighting is done by contained elements.
196071d4279SBram Moolenaar"
197071d4279SBram Moolenaar" PROVIDES: @sgmlRegionHook
198071d4279SBram Moolenaar"
199071d4279SBram Moolenaar" EXAMPLE:
200071d4279SBram Moolenaar"
201071d4279SBram Moolenaar" <tag id="whoops">
202071d4279SBram Moolenaar"   <!-- comment -->
203071d4279SBram Moolenaar"   <another.tag></another.tag>
204071d4279SBram Moolenaar"   <another.tag/>
205071d4279SBram Moolenaar"   some data
206071d4279SBram Moolenaar" </tag>
207071d4279SBram Moolenaar"
208071d4279SBram Moolenaar" SGML specific:
209071d4279SBram Moolenaar" compared to xmlRegion:
210071d4279SBram Moolenaar"   - removed folding
211071d4279SBram Moolenaar"   - added a single '/'in the start pattern
212071d4279SBram Moolenaar"
213071d4279SBram Moolenaarsyn region   sgmlRegion
214071d4279SBram Moolenaar    \ start=+<\z([^ /!?>"']\+\)\(\(\_[^/>]*[^/!?]>\)\|>\)+
215071d4279SBram Moolenaar    \ end=+</\z1>+
216071d4279SBram Moolenaar    \ contains=sgmlTag,sgmlEndTag,sgmlCdata,@sgmlRegionCluster,sgmlComment,sgmlEntity,sgmlUnicodeNumberData,@sgmlRegionHook
217071d4279SBram Moolenaar    \ keepend
218071d4279SBram Moolenaar    \ extend
219071d4279SBram Moolenaar
220071d4279SBram Moolenaar
221071d4279SBram Moolenaar" empty tags. Just a container, no highlighting.
222071d4279SBram Moolenaar" Compare this with sgmlTag.
223071d4279SBram Moolenaar"
224071d4279SBram Moolenaar" EXAMPLE:
225071d4279SBram Moolenaar"
226071d4279SBram Moolenaar" <tag id="lola"/>
227071d4279SBram Moolenaar"
228*6c391a74SBram Moolenaar" TODO use sgmlEmptyTag instead of sgmlTag
229071d4279SBram Moolenaarsyn match    sgmlEmptyRegion
230071d4279SBram Moolenaar    \ +<[^ /!?>"']\(\_[^"'<>]\|"\_[^"]*"\|'\_[^']*'\)*/>+
231071d4279SBram Moolenaar    \ contains=sgmlEmptyTag
232071d4279SBram Moolenaar
233071d4279SBram Moolenaar
234071d4279SBram Moolenaar" cluster which contains the above two elements
235071d4279SBram Moolenaarsyn cluster sgmlRegionCluster contains=sgmlRegion,sgmlEmptyRegion,sgmlAbbrRegion
236071d4279SBram Moolenaar
237071d4279SBram Moolenaar
238071d4279SBram Moolenaar" &entities; compare with dtd
239071d4279SBram Moolenaarsyn match   sgmlEntity		       "&[^; \t]*;" contains=sgmlEntityPunct
240071d4279SBram Moolenaarsyn match   sgmlEntityPunct  contained "[&.;]"
241071d4279SBram Moolenaar
242071d4279SBram Moolenaar
243071d4279SBram Moolenaar" The real comments (this implements the comments as defined by sgml,
244071d4279SBram Moolenaar" but not all sgml pages actually conform to it. Errors are flagged.
245071d4279SBram Moolenaarsyn region  sgmlComment                start=+<!+        end=+>+ contains=sgmlCommentPart,sgmlString,sgmlCommentError,sgmlTodo
246071d4279SBram Moolenaarsyn keyword sgmlTodo         contained TODO FIXME XXX display
247071d4279SBram Moolenaarsyn match   sgmlCommentError contained "[^><!]"
248071d4279SBram Moolenaarsyn region  sgmlCommentPart  contained start=+--+        end=+--+
249071d4279SBram Moolenaar
250071d4279SBram Moolenaar
251071d4279SBram Moolenaar" CData sections
252071d4279SBram Moolenaar"
253071d4279SBram Moolenaar" PROVIDES: @sgmlCdataHook
254071d4279SBram Moolenaar"
255071d4279SBram Moolenaarsyn region    sgmlCdata
256071d4279SBram Moolenaar    \ start=+<!\[CDATA\[+
257071d4279SBram Moolenaar    \ end=+]]>+
258071d4279SBram Moolenaar    \ contains=sgmlCdataStart,sgmlCdataEnd,@sgmlCdataHook
259071d4279SBram Moolenaar    \ keepend
260071d4279SBram Moolenaar    \ extend
261071d4279SBram Moolenaar" using the following line instead leads to corrupt folding at CDATA regions
262071d4279SBram Moolenaar" syn match    sgmlCdata      +<!\[CDATA\[\_.\{-}]]>+  contains=sgmlCdataStart,sgmlCdataEnd,@sgmlCdataHook
263071d4279SBram Moolenaarsyn match    sgmlCdataStart +<!\[CDATA\[+  contained contains=sgmlCdataCdata
264071d4279SBram Moolenaarsyn keyword  sgmlCdataCdata CDATA          contained
265071d4279SBram Moolenaarsyn match    sgmlCdataEnd   +]]>+          contained
266071d4279SBram Moolenaar
267071d4279SBram Moolenaar
268071d4279SBram Moolenaar" Processing instructions
269071d4279SBram Moolenaar" This allows "?>" inside strings -- good idea?
270071d4279SBram Moolenaarsyn region  sgmlProcessing matchgroup=sgmlProcessingDelim start="<?" end="?>" contains=sgmlAttrib,sgmlEqualValue
271071d4279SBram Moolenaar
272071d4279SBram Moolenaar
273071d4279SBram Moolenaar" DTD -- we use dtd.vim here
274071d4279SBram Moolenaarsyn region  sgmlDocType matchgroup=sgmlDocTypeDecl start="\c<!DOCTYPE"he=s+2,rs=s+2 end=">" contains=sgmlDocTypeKeyword,sgmlInlineDTD,sgmlString
275071d4279SBram Moolenaarsyn keyword sgmlDocTypeKeyword contained DOCTYPE PUBLIC SYSTEM
276071d4279SBram Moolenaarsyn region  sgmlInlineDTD contained start="\[" end="]" contains=@sgmlDTD
277071d4279SBram Moolenaarsyn include @sgmlDTD <sfile>:p:h/dtd.vim
278071d4279SBram Moolenaar
279071d4279SBram Moolenaar
280071d4279SBram Moolenaar" synchronizing
281071d4279SBram Moolenaar" TODO !!! to be improved !!!
282071d4279SBram Moolenaar
283071d4279SBram Moolenaarsyn sync match sgmlSyncDT grouphere  sgmlDocType +\_.\(<!DOCTYPE\)\@=+
284071d4279SBram Moolenaar" syn sync match sgmlSyncDT groupthere  NONE       +]>+
285071d4279SBram Moolenaar
286071d4279SBram Moolenaarsyn sync match sgmlSync grouphere   sgmlRegion  +\_.\(<[^ /!?>"']\+\)\@=+
287071d4279SBram Moolenaar" syn sync match sgmlSync grouphere  sgmlRegion "<[^ /!?>"']*>"
288071d4279SBram Moolenaarsyn sync match sgmlSync groupthere  sgmlRegion  +</[^ /!?>"']\+>+
289071d4279SBram Moolenaar
290071d4279SBram Moolenaarsyn sync minlines=100
291071d4279SBram Moolenaar
292071d4279SBram Moolenaar
293071d4279SBram Moolenaar" The default highlighting.
294071d4279SBram Moolenaarhi def link sgmlTodo			Todo
295071d4279SBram Moolenaarhi def link sgmlTag			Function
296071d4279SBram Moolenaarhi def link sgmlEndTag			Identifier
297071d4279SBram Moolenaar" SGML specifig
298071d4279SBram Moolenaarhi def link sgmlAbbrEndTag		Identifier
299071d4279SBram Moolenaarhi def link sgmlEmptyTag		Function
300071d4279SBram Moolenaarhi def link sgmlEntity			Statement
301071d4279SBram Moolenaarhi def link sgmlEntityPunct		Type
302071d4279SBram Moolenaar
303071d4279SBram Moolenaarhi def link sgmlAttribPunct		Comment
304071d4279SBram Moolenaarhi def link sgmlAttrib			Type
305071d4279SBram Moolenaar
306071d4279SBram Moolenaarhi def link sgmlValue			String
307071d4279SBram Moolenaarhi def link sgmlString			String
308071d4279SBram Moolenaarhi def link sgmlComment			Comment
309071d4279SBram Moolenaarhi def link sgmlCommentPart		Comment
310071d4279SBram Moolenaarhi def link sgmlCommentError		Error
311071d4279SBram Moolenaarhi def link sgmlError			Error
312071d4279SBram Moolenaar
313071d4279SBram Moolenaarhi def link sgmlProcessingDelim		Comment
314071d4279SBram Moolenaarhi def link sgmlProcessing		Type
315071d4279SBram Moolenaar
316071d4279SBram Moolenaarhi def link sgmlCdata			String
317071d4279SBram Moolenaarhi def link sgmlCdataCdata		Statement
318071d4279SBram Moolenaarhi def link sgmlCdataStart		Type
319071d4279SBram Moolenaarhi def link sgmlCdataEnd		Type
320071d4279SBram Moolenaar
321071d4279SBram Moolenaarhi def link sgmlDocTypeDecl		Function
322071d4279SBram Moolenaarhi def link sgmlDocTypeKeyword		Statement
323071d4279SBram Moolenaarhi def link sgmlInlineDTD		Function
324071d4279SBram Moolenaarhi def link sgmlUnicodeNumberAttr	Number
325071d4279SBram Moolenaarhi def link sgmlUnicodeSpecifierAttr	SpecialChar
326071d4279SBram Moolenaarhi def link sgmlUnicodeNumberData	Number
327071d4279SBram Moolenaarhi def link sgmlUnicodeSpecifierData	SpecialChar
328071d4279SBram Moolenaar
329071d4279SBram Moolenaarlet b:current_syntax = "sgml"
330071d4279SBram Moolenaar
331071d4279SBram Moolenaarlet &cpo = s:sgml_cpo_save
332071d4279SBram Moolenaarunlet s:sgml_cpo_save
333071d4279SBram Moolenaar
334071d4279SBram Moolenaar" vim: ts=8
335