1" Vim syntax file
2" Language:	DTD (Document Type Definition for XML)
3" Maintainer:	Johannes Zellner <johannes@zellner.org>
4"		Author and previous maintainer:
5"		Daniel Amyot <damyot@site.uottawa.ca>
6" Last Change:	Tue, 27 Apr 2004 14:54:59 CEST
7" Filenames:	*.dtd
8"
9" REFERENCES:
10"   http://www.w3.org/TR/html40/
11"   http://www.w3.org/TR/NOTE-html-970421
12"
13" TODO:
14"   - improve synchronizing.
15
16if version < 600
17    syntax clear
18    let __dtd_cpo_save__ = &cpo
19    set cpo&
20else
21    if exists("b:current_syntax")
22	finish
23    endif
24    let s:dtd_cpo_save = &cpo
25    set cpo&vim
26endif
27
28if !exists("dtd_ignore_case")
29    " I prefer having the case takes into consideration.
30    syn case match
31else
32    syn case ignore
33endif
34
35
36" the following line makes the opening <! and
37" closing > highlighted using 'dtdFunction'.
38"
39" PROVIDES: @dtdTagHook
40"
41syn region dtdTag matchgroup=dtdFunction
42    \ start=+<!+ end=+>+ matchgroup=NONE
43    \ contains=dtdTag,dtdTagName,dtdError,dtdComment,dtdString,dtdAttrType,dtdAttrDef,dtdEnum,dtdParamEntityInst,dtdParamEntityDecl,dtdCard,@dtdTagHook
44
45if !exists("dtd_no_tag_errors")
46    " mark everything as an error which starts with a <!
47    " and is not overridden later. If this is annoying,
48    " it can be switched off by setting the variable
49    " dtd_no_tag_errors.
50    syn region dtdError contained start=+<!+lc=2 end=+>+
51endif
52
53" if this is a html like comment hightlight also
54" the opening <! and the closing > as Comment.
55syn region dtdComment		start=+<![ \t]*--+ end=+-->+ contains=dtdTodo,@Spell
56
57
58" proper DTD comment
59syn region dtdComment contained start=+--+ end=+--+ contains=dtdTodo,@Spell
60
61
62" Start tags (keywords). This is contained in dtdFunction.
63" Note that everything not contained here will be marked
64" as error.
65syn match dtdTagName contained +<!\(ATTLIST\|DOCTYPE\|ELEMENT\|ENTITY\|NOTATION\|SHORTREF\|USEMAP\|\[\)+lc=2,hs=s+2
66
67
68" wildcards and operators
69syn match  dtdCard contained "|"
70syn match  dtdCard contained ","
71" evenutally overridden by dtdEntity
72syn match  dtdCard contained "&"
73syn match  dtdCard contained "?"
74syn match  dtdCard contained "\*"
75syn match  dtdCard contained "+"
76
77" ...and finally, special cases.
78syn match  dtdCard      "ANY"
79syn match  dtdCard      "EMPTY"
80
81if !exists("dtd_no_param_entities")
82
83    " highlight parameter entity declarations
84    " and instances. Note that the closing `;'
85    " is optional.
86
87    " instances
88    syn region dtdParamEntityInst oneline matchgroup=dtdParamEntityPunct
89	\ start="%[-_a-zA-Z0-9.]\+"he=s+1,rs=s+1
90	\ skip=+[-_a-zA-Z0-9.]+
91	\ end=";\|\>"
92	\ matchgroup=NONE contains=dtdParamEntityPunct
93    syn match  dtdParamEntityPunct contained "\."
94
95    " declarations
96    " syn region dtdParamEntityDecl oneline matchgroup=dtdParamEntityDPunct start=+<!ENTITY % +lc=8 skip=+[-_a-zA-Z0-9.]+ matchgroup=NONE end="\>" contains=dtdParamEntityDPunct
97    syn match dtdParamEntityDecl +<!ENTITY % [-_a-zA-Z0-9.]*+lc=8 contains=dtdParamEntityDPunct
98    syn match  dtdParamEntityDPunct contained "%\|\."
99
100endif
101
102" &entities; compare with xml
103syn match   dtdEntity		      "&[^; \t]*;" contains=dtdEntityPunct
104syn match   dtdEntityPunct  contained "[&.;]"
105
106" Strings are between quotes
107syn region dtdString    start=+"+ skip=+\\\\\|\\"+  end=+"+ contains=dtdAttrDef,dtdAttrType,dtdEnum,dtdParamEntityInst,dtdEntity,dtdCard
108syn region dtdString    start=+'+ skip=+\\\\\|\\'+  end=+'+ contains=dtdAttrDef,dtdAttrType,dtdEnum,dtdParamEntityInst,dtdEntity,dtdCard
109
110" Enumeration of elements or data between parenthesis
111"
112" PROVIDES: @dtdEnumHook
113"
114syn region dtdEnum matchgroup=dtdType start="(" end=")" matchgroup=NONE contains=dtdEnum,dtdParamEntityInst,dtdCard,@dtdEnumHook
115
116"Attribute types
117syn keyword dtdAttrType NMTOKEN  ENTITIES  NMTOKENS  ID  CDATA
118syn keyword dtdAttrType IDREF  IDREFS
119" ENTITY has to treated special for not overriding <!ENTITY
120syn match   dtdAttrType +[^!]\<ENTITY+
121
122"Attribute Definitions
123syn match  dtdAttrDef   "#REQUIRED"
124syn match  dtdAttrDef   "#IMPLIED"
125syn match  dtdAttrDef   "#FIXED"
126
127syn case match
128" define some common keywords to mark TODO
129" and important sections inside comments.
130syn keyword dtdTodo contained TODO FIXME XXX
131
132syn sync lines=250
133
134" Define the default highlighting.
135" For version 5.7 and earlier: only when not done already
136" For version 5.8 and later: only when an item doesn't have highlighting yet
137if version >= 508 || !exists("did_dtd_syn_inits")
138    if version < 508
139	let did_dtd_syn_inits = 1
140	command -nargs=+ HiLink hi link <args>
141    else
142	command -nargs=+ HiLink hi def link <args>
143    endif
144
145    " The default highlighting.
146    HiLink dtdFunction		Function
147    HiLink dtdTag		Normal
148    HiLink dtdType		Type
149    HiLink dtdAttrType		dtdType
150    HiLink dtdAttrDef		dtdType
151    HiLink dtdConstant		Constant
152    HiLink dtdString		dtdConstant
153    HiLink dtdEnum		dtdConstant
154    HiLink dtdCard		dtdFunction
155
156    HiLink dtdEntity		Statement
157    HiLink dtdEntityPunct	dtdType
158    HiLink dtdParamEntityInst	dtdConstant
159    HiLink dtdParamEntityPunct	dtdType
160    HiLink dtdParamEntityDecl	dtdType
161    HiLink dtdParamEntityDPunct dtdComment
162
163    HiLink dtdComment		Comment
164    HiLink dtdTagName		Statement
165    HiLink dtdError		Error
166    HiLink dtdTodo		Todo
167
168    delcommand HiLink
169endif
170
171if version < 600
172    let &cpo = __dtd_cpo_save__
173    unlet __dtd_cpo_save__
174else
175    let &cpo = s:dtd_cpo_save
176    unlet s:dtd_cpo_save
177endif
178
179let b:current_syntax = "dtd"
180
181" vim: ts=8
182