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