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