1" Vim syntax file 2" Language: SGML 3" Maintainer: Johannes Zellner <johannes@zellner.org> 4" Last Change: Tue, 27 Apr 2004 15:05:21 CEST 5" Filenames: *.sgml,*.sgm 6" $Id: sgml.vim,v 1.1 2004/06/13 17:52:57 vimboss Exp $ 7 8" For version 5.x: Clear all syntax items 9" For version 6.x: Quit when a syntax file was already loaded 10if version < 600 11 syntax clear 12elseif exists("b:current_syntax") 13 finish 14endif 15 16let s:sgml_cpo_save = &cpo 17set cpo&vim 18 19syn case match 20 21" mark illegal characters 22syn match sgmlError "[<&]" 23 24 25" unicode numbers: 26" provide different highlithing for unicode characters 27" inside strings and in plain text (character data). 28" 29" EXAMPLE: 30" 31" \u4e88 32" 33syn match sgmlUnicodeNumberAttr +\\u\x\{4}+ contained contains=sgmlUnicodeSpecifierAttr 34syn match sgmlUnicodeSpecifierAttr +\\u+ contained 35syn match sgmlUnicodeNumberData +\\u\x\{4}+ contained contains=sgmlUnicodeSpecifierData 36syn match sgmlUnicodeSpecifierData +\\u+ contained 37 38 39" strings inside character data or comments 40" 41syn region sgmlString contained start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=sgmlEntity,sgmlUnicodeNumberAttr display 42syn region sgmlString contained start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=sgmlEntity,sgmlUnicodeNumberAttr display 43 44" punctuation (within attributes) e.g. <tag sgml:foo.attribute ...> 45" ^ ^ 46syn match sgmlAttribPunct +[:.]+ contained display 47 48 49" no highlighting for sgmlEqual (sgmlEqual has no highlighting group) 50syn match sgmlEqual +=+ 51 52 53" attribute, everything before the '=' 54" 55" PROVIDES: @sgmlAttribHook 56" 57" EXAMPLE: 58" 59" <tag foo.attribute = "value"> 60" ^^^^^^^^^^^^^ 61" 62syn match sgmlAttrib 63 \ +[^-'"<]\@<=\<[a-zA-Z0-9.:]\+\>\([^'">]\@=\|$\)+ 64 \ contained 65 \ contains=sgmlAttribPunct,@sgmlAttribHook 66 \ display 67 68 69" UNQUOTED value (not including the '=' -- sgmlEqual) 70" 71" PROVIDES: @sgmlValueHook 72" 73" EXAMPLE: 74" 75" <tag foo.attribute = value> 76" ^^^^^ 77" 78syn match sgmlValue 79 \ +[^"' =/!?<>][^ =/!?<>]*+ 80 \ contained 81 \ contains=sgmlEntity,sgmlUnicodeNumberAttr,@sgmlValueHook 82 \ display 83 84 85" QUOTED value (not including the '=' -- sgmlEqual) 86" 87" PROVIDES: @sgmlValueHook 88" 89" EXAMPLE: 90" 91" <tag foo.attribute = "value"> 92" ^^^^^^^ 93" <tag foo.attribute = 'value'> 94" ^^^^^^^ 95" 96syn region sgmlValue contained start=+"+ skip=+\\\\\|\\"+ end=+"+ 97 \ contains=sgmlEntity,sgmlUnicodeNumberAttr,@sgmlValueHook 98syn region sgmlValue contained start=+'+ skip=+\\\\\|\\'+ end=+'+ 99 \ contains=sgmlEntity,sgmlUnicodeNumberAttr,@sgmlValueHook 100 101 102" value, everything after (and including) the '=' 103" no highlighting! 104" 105" EXAMPLE: 106" 107" <tag foo.attribute = "value"> 108" ^^^^^^^^^ 109" <tag foo.attribute = value> 110" ^^^^^^^ 111" 112syn match sgmlEqualValue 113 \ +=\s*[^ =/!?<>]\++ 114 \ contained 115 \ contains=sgmlEqual,sgmlString,sgmlValue 116 \ display 117 118 119" start tag 120" use matchgroup=sgmlTag to skip over the leading '<' 121" see also sgmlEmptyTag below. 122" 123" PROVIDES: @sgmlTagHook 124" 125syn region sgmlTag 126 \ matchgroup=sgmlTag start=+<[^ /!?"']\@=+ 127 \ matchgroup=sgmlTag end=+>+ 128 \ contained 129 \ contains=sgmlError,sgmlAttrib,sgmlEqualValue,@sgmlTagHook 130 131 132" tag content for empty tags. This is the same as sgmlTag 133" above, except the `matchgroup=sgmlEndTag for highlighting 134" the end '/>' differently. 135" 136" PROVIDES: @sgmlTagHook 137" 138syn region sgmlEmptyTag 139 \ matchgroup=sgmlTag start=+<[^ /!?"']\@=+ 140 \ matchgroup=sgmlEndTag end=+/>+ 141 \ contained 142 \ contains=sgmlError,sgmlAttrib,sgmlEqualValue,@sgmlTagHook 143 144 145" end tag 146" highlight everything but not the trailing '>' which 147" was already highlighted by the containing sgmlRegion. 148" 149" PROVIDES: @sgmlTagHook 150" (should we provide a separate @sgmlEndTagHook ?) 151" 152syn match sgmlEndTag 153 \ +</[^ /!?>"']\+>+ 154 \ contained 155 \ contains=@sgmlTagHook 156 157 158" [-- SGML SPECIFIC --] 159 160" SGML specific 161" tag content for abbreviated regions 162" 163" PROVIDES: @sgmlTagHook 164" 165syn region sgmlAbbrTag 166 \ matchgroup=sgmlTag start=+<[^ /!?"']\@=+ 167 \ matchgroup=sgmlTag end=+/+ 168 \ contained 169 \ contains=sgmlError,sgmlAttrib,sgmlEqualValue,@sgmlTagHook 170 171 172" SGML specific 173" just highlight the trailing '/' 174syn match sgmlAbbrEndTag +/+ 175 176 177" SGML specific 178" abbreviated regions 179" 180" No highlighing, highlighing is done by contained elements. 181" 182" PROVIDES: @sgmlRegionHook 183" 184" EXAMPLE: 185" 186" <bold/Im Anfang war das Wort/ 187" 188syn match sgmlAbbrRegion 189 \ +<[^/!?>"']\+/\_[^/]\+/+ 190 \ contains=sgmlAbbrTag,sgmlAbbrEndTag,sgmlCdata,sgmlComment,sgmlEntity,sgmlUnicodeNumberData,@sgmlRegionHook 191 192" [-- END OF SGML SPECIFIC --] 193 194 195" real (non-empty) elements. We cannot do syntax folding 196" as in xml, because end tags may be optional in sgml depending 197" on the dtd. 198" No highlighing, highlighing is done by contained elements. 199" 200" PROVIDES: @sgmlRegionHook 201" 202" EXAMPLE: 203" 204" <tag id="whoops"> 205" <!-- comment --> 206" <another.tag></another.tag> 207" <another.tag/> 208" some data 209" </tag> 210" 211" SGML specific: 212" compared to xmlRegion: 213" - removed folding 214" - added a single '/'in the start pattern 215" 216syn region sgmlRegion 217 \ start=+<\z([^ /!?>"']\+\)\(\(\_[^/>]*[^/!?]>\)\|>\)+ 218 \ end=+</\z1>+ 219 \ contains=sgmlTag,sgmlEndTag,sgmlCdata,@sgmlRegionCluster,sgmlComment,sgmlEntity,sgmlUnicodeNumberData,@sgmlRegionHook 220 \ keepend 221 \ extend 222 223 224" empty tags. Just a container, no highlighting. 225" Compare this with sgmlTag. 226" 227" EXAMPLE: 228" 229" <tag id="lola"/> 230" 231" TODO use sgmlEmptyTag intead of sgmlTag 232syn match sgmlEmptyRegion 233 \ +<[^ /!?>"']\(\_[^"'<>]\|"\_[^"]*"\|'\_[^']*'\)*/>+ 234 \ contains=sgmlEmptyTag 235 236 237" cluster which contains the above two elements 238syn cluster sgmlRegionCluster contains=sgmlRegion,sgmlEmptyRegion,sgmlAbbrRegion 239 240 241" &entities; compare with dtd 242syn match sgmlEntity "&[^; \t]*;" contains=sgmlEntityPunct 243syn match sgmlEntityPunct contained "[&.;]" 244 245 246" The real comments (this implements the comments as defined by sgml, 247" but not all sgml pages actually conform to it. Errors are flagged. 248syn region sgmlComment start=+<!+ end=+>+ contains=sgmlCommentPart,sgmlString,sgmlCommentError,sgmlTodo 249syn keyword sgmlTodo contained TODO FIXME XXX display 250syn match sgmlCommentError contained "[^><!]" 251syn region sgmlCommentPart contained start=+--+ end=+--+ 252 253 254" CData sections 255" 256" PROVIDES: @sgmlCdataHook 257" 258syn region sgmlCdata 259 \ start=+<!\[CDATA\[+ 260 \ end=+]]>+ 261 \ contains=sgmlCdataStart,sgmlCdataEnd,@sgmlCdataHook 262 \ keepend 263 \ extend 264" using the following line instead leads to corrupt folding at CDATA regions 265" syn match sgmlCdata +<!\[CDATA\[\_.\{-}]]>+ contains=sgmlCdataStart,sgmlCdataEnd,@sgmlCdataHook 266syn match sgmlCdataStart +<!\[CDATA\[+ contained contains=sgmlCdataCdata 267syn keyword sgmlCdataCdata CDATA contained 268syn match sgmlCdataEnd +]]>+ contained 269 270 271" Processing instructions 272" This allows "?>" inside strings -- good idea? 273syn region sgmlProcessing matchgroup=sgmlProcessingDelim start="<?" end="?>" contains=sgmlAttrib,sgmlEqualValue 274 275 276" DTD -- we use dtd.vim here 277syn region sgmlDocType matchgroup=sgmlDocTypeDecl start="\c<!DOCTYPE"he=s+2,rs=s+2 end=">" contains=sgmlDocTypeKeyword,sgmlInlineDTD,sgmlString 278syn keyword sgmlDocTypeKeyword contained DOCTYPE PUBLIC SYSTEM 279syn region sgmlInlineDTD contained start="\[" end="]" contains=@sgmlDTD 280syn include @sgmlDTD <sfile>:p:h/dtd.vim 281 282 283" synchronizing 284" TODO !!! to be improved !!! 285 286syn sync match sgmlSyncDT grouphere sgmlDocType +\_.\(<!DOCTYPE\)\@=+ 287" syn sync match sgmlSyncDT groupthere NONE +]>+ 288 289syn sync match sgmlSync grouphere sgmlRegion +\_.\(<[^ /!?>"']\+\)\@=+ 290" syn sync match sgmlSync grouphere sgmlRegion "<[^ /!?>"']*>" 291syn sync match sgmlSync groupthere sgmlRegion +</[^ /!?>"']\+>+ 292 293syn sync minlines=100 294 295 296" The default highlighting. 297hi def link sgmlTodo Todo 298hi def link sgmlTag Function 299hi def link sgmlEndTag Identifier 300" SGML specifig 301hi def link sgmlAbbrEndTag Identifier 302hi def link sgmlEmptyTag Function 303hi def link sgmlEntity Statement 304hi def link sgmlEntityPunct Type 305 306hi def link sgmlAttribPunct Comment 307hi def link sgmlAttrib Type 308 309hi def link sgmlValue String 310hi def link sgmlString String 311hi def link sgmlComment Comment 312hi def link sgmlCommentPart Comment 313hi def link sgmlCommentError Error 314hi def link sgmlError Error 315 316hi def link sgmlProcessingDelim Comment 317hi def link sgmlProcessing Type 318 319hi def link sgmlCdata String 320hi def link sgmlCdataCdata Statement 321hi def link sgmlCdataStart Type 322hi def link sgmlCdataEnd Type 323 324hi def link sgmlDocTypeDecl Function 325hi def link sgmlDocTypeKeyword Statement 326hi def link sgmlInlineDTD Function 327hi def link sgmlUnicodeNumberAttr Number 328hi def link sgmlUnicodeSpecifierAttr SpecialChar 329hi def link sgmlUnicodeNumberData Number 330hi def link sgmlUnicodeSpecifierData SpecialChar 331 332let b:current_syntax = "sgml" 333 334let &cpo = s:sgml_cpo_save 335unlet s:sgml_cpo_save 336 337" vim: ts=8 338