109c6f265SBram Moolenaar" Vim syntax file 209c6f265SBram Moolenaar" Language: TypeScript with React (JSX) 309c6f265SBram Moolenaar" Maintainer: Bram Moolenaar 4*91359014SBram Moolenaar" Last Change: 2019 Nov 30 509c6f265SBram Moolenaar" Based On: Herrington Darkholme's yats.vim 609c6f265SBram Moolenaar" Changes: See https:github.com/HerringtonDarkholme/yats.vim 709c6f265SBram Moolenaar" Credits: See yats.vim on github 809c6f265SBram Moolenaar 909c6f265SBram Moolenaarif !exists("main_syntax") 1009c6f265SBram Moolenaar if exists("b:current_syntax") 1109c6f265SBram Moolenaar finish 1209c6f265SBram Moolenaar endif 1309c6f265SBram Moolenaar let main_syntax = 'typescriptreact' 1409c6f265SBram Moolenaarendif 1509c6f265SBram Moolenaar 1609c6f265SBram Moolenaarlet s:cpo_save = &cpo 1709c6f265SBram Moolenaarset cpo&vim 1809c6f265SBram Moolenaar 1909c6f265SBram Moolenaarsyntax region tsxTag 2009c6f265SBram Moolenaar \ start=+<\([^/!?<>="':]\+\)\@=+ 2109c6f265SBram Moolenaar \ skip=+</[^ /!?<>"']\+>+ 2209c6f265SBram Moolenaar \ end=+/\@<!>+ 2309c6f265SBram Moolenaar \ end=+\(/>\)\@=+ 2409c6f265SBram Moolenaar \ contained 2509c6f265SBram Moolenaar \ contains=tsxTagName,tsxIntrinsicTagName,tsxAttrib,tsxEscJs, 2609c6f265SBram Moolenaar \tsxCloseString,@tsxComment 2709c6f265SBram Moolenaar 2809c6f265SBram Moolenaarsyntax match tsxTag /<>/ contained 2909c6f265SBram Moolenaar 3009c6f265SBram Moolenaar 3109c6f265SBram Moolenaar" <tag></tag> 3209c6f265SBram Moolenaar" s~~~~~~~~~e 3309c6f265SBram Moolenaar" and self close tag 3409c6f265SBram Moolenaar" <tag/> 3509c6f265SBram Moolenaar" s~~~~e 3609c6f265SBram Moolenaar" A big start regexp borrowed from https://git.io/vDyxc 3709c6f265SBram Moolenaarsyntax region tsxRegion 3809c6f265SBram Moolenaar \ start=+<\_s*\z([a-zA-Z1-9\$_-]\+\(\.\k\+\)*\)+ 3909c6f265SBram Moolenaar \ skip=+<!--\_.\{-}-->+ 4009c6f265SBram Moolenaar \ end=+</\_s*\z1>+ 4109c6f265SBram Moolenaar \ matchgroup=tsxCloseString end=+/>+ 4209c6f265SBram Moolenaar \ fold 4309c6f265SBram Moolenaar \ contains=tsxRegion,tsxCloseString,tsxCloseTag,tsxTag,tsxCommentInvalid,tsxFragment,tsxEscJs,@Spell 4409c6f265SBram Moolenaar \ keepend 4509c6f265SBram Moolenaar \ extend 4609c6f265SBram Moolenaar 4709c6f265SBram Moolenaar" <> </> 4809c6f265SBram Moolenaar" s~~~~~~e 4909c6f265SBram Moolenaar" A big start regexp borrowed from https://git.io/vDyxc 5009c6f265SBram Moolenaarsyntax region tsxFragment 5109c6f265SBram Moolenaar \ start=+\(\((\|{\|}\|\[\|,\|&&\|||\|?\|:\|=\|=>\|\Wreturn\|^return\|\Wdefault\|^\|>\)\_s*\)\@<=<>+ 5209c6f265SBram Moolenaar \ skip=+<!--\_.\{-}-->+ 5309c6f265SBram Moolenaar \ end=+</>+ 5409c6f265SBram Moolenaar \ fold 5509c6f265SBram Moolenaar \ contains=tsxRegion,tsxCloseString,tsxCloseTag,tsxTag,tsxCommentInvalid,tsxFragment,tsxEscJs,@Spell 5609c6f265SBram Moolenaar \ keepend 5709c6f265SBram Moolenaar \ extend 5809c6f265SBram Moolenaar 5909c6f265SBram Moolenaar" </tag> 6009c6f265SBram Moolenaar" ~~~~~~ 6109c6f265SBram Moolenaarsyntax match tsxCloseTag 6209c6f265SBram Moolenaar \ +</\_s*[^/!?<>"']\+>+ 6309c6f265SBram Moolenaar \ contained 6409c6f265SBram Moolenaar \ contains=tsxTagName,tsxIntrinsicTagName 6509c6f265SBram Moolenaar 6609c6f265SBram Moolenaarsyntax match tsxCloseTag +</>+ contained 6709c6f265SBram Moolenaar 6809c6f265SBram Moolenaarsyntax match tsxCloseString 6909c6f265SBram Moolenaar \ +/>+ 7009c6f265SBram Moolenaar \ contained 7109c6f265SBram Moolenaar 7209c6f265SBram Moolenaar" <!-- --> 7309c6f265SBram Moolenaar" ~~~~~~~~ 7409c6f265SBram Moolenaarsyntax match tsxCommentInvalid /<!--\_.\{-}-->/ display 7509c6f265SBram Moolenaar 7609c6f265SBram Moolenaarsyntax region tsxBlockComment 7709c6f265SBram Moolenaar \ contained 7809c6f265SBram Moolenaar \ start="/\*" 7909c6f265SBram Moolenaar \ end="\*/" 8009c6f265SBram Moolenaar 8109c6f265SBram Moolenaarsyntax match tsxLineComment 8209c6f265SBram Moolenaar \ "//.*$" 8309c6f265SBram Moolenaar \ contained 8409c6f265SBram Moolenaar \ display 8509c6f265SBram Moolenaar 8609c6f265SBram Moolenaarsyntax cluster tsxComment contains=tsxBlockComment,tsxLineComment 8709c6f265SBram Moolenaar 8809c6f265SBram Moolenaarsyntax match tsxEntity "&[^; \t]*;" contains=tsxEntityPunct 8909c6f265SBram Moolenaarsyntax match tsxEntityPunct contained "[&.;]" 9009c6f265SBram Moolenaar 9109c6f265SBram Moolenaar" <tag key={this.props.key}> 9209c6f265SBram Moolenaar" ~~~ 9309c6f265SBram Moolenaarsyntax match tsxTagName 9409c6f265SBram Moolenaar \ +[</]\_s*[^/!?<>"'* ]\++hs=s+1 9509c6f265SBram Moolenaar \ contained 9609c6f265SBram Moolenaar \ nextgroup=tsxAttrib 9709c6f265SBram Moolenaar \ skipwhite 9809c6f265SBram Moolenaar \ display 9909c6f265SBram Moolenaarsyntax match tsxIntrinsicTagName 10009c6f265SBram Moolenaar \ +[</]\_s*[a-z1-9-]\++hs=s+1 10109c6f265SBram Moolenaar \ contained 10209c6f265SBram Moolenaar \ nextgroup=tsxAttrib 10309c6f265SBram Moolenaar \ skipwhite 10409c6f265SBram Moolenaar \ display 10509c6f265SBram Moolenaar 10609c6f265SBram Moolenaar" <tag key={this.props.key}> 10709c6f265SBram Moolenaar" ~~~ 10809c6f265SBram Moolenaarsyntax match tsxAttrib 10909c6f265SBram Moolenaar \ +[a-zA-Z_][-0-9a-zA-Z_]*+ 11009c6f265SBram Moolenaar \ nextgroup=tsxEqual skipwhite 11109c6f265SBram Moolenaar \ contained 11209c6f265SBram Moolenaar \ display 11309c6f265SBram Moolenaar 11409c6f265SBram Moolenaar" <tag id="sample"> 11509c6f265SBram Moolenaar" ~ 11609c6f265SBram Moolenaarsyntax match tsxEqual +=+ display contained 11709c6f265SBram Moolenaar \ nextgroup=tsxString skipwhite 11809c6f265SBram Moolenaar 11909c6f265SBram Moolenaar" <tag id="sample"> 12009c6f265SBram Moolenaar" s~~~~~~e 12109c6f265SBram Moolenaarsyntax region tsxString contained start=+"+ end=+"+ contains=tsxEntity,@Spell display 12209c6f265SBram Moolenaar 12309c6f265SBram Moolenaar" <tag key={this.props.key}> 12409c6f265SBram Moolenaar" s~~~~~~~~~~~~~~e 12509c6f265SBram Moolenaarsyntax region tsxEscJs 12609c6f265SBram Moolenaar \ contained 12709c6f265SBram Moolenaar \ contains=@typescriptValue,@tsxComment 12809c6f265SBram Moolenaar \ matchgroup=typescriptBraces 12909c6f265SBram Moolenaar \ start=+{+ 13009c6f265SBram Moolenaar \ end=+}+ 13109c6f265SBram Moolenaar \ extend 13209c6f265SBram Moolenaar 13309c6f265SBram Moolenaar 13409c6f265SBram Moolenaar""""""""""""""""""""""""""""""""""""""""""""""""""" 13509c6f265SBram Moolenaar" Source the part common with typescriptreact.vim 13609c6f265SBram Moolenaarsource <sfile>:h/typescriptcommon.vim 13709c6f265SBram Moolenaar 13809c6f265SBram Moolenaar 13909c6f265SBram Moolenaarsyntax cluster typescriptExpression add=tsxRegion,tsxFragment 14009c6f265SBram Moolenaar 14109c6f265SBram Moolenaarhi def link tsxTag htmlTag 14209c6f265SBram Moolenaarhi def link tsxTagName Function 14309c6f265SBram Moolenaarhi def link tsxIntrinsicTagName htmlTagName 14409c6f265SBram Moolenaarhi def link tsxString String 14509c6f265SBram Moolenaarhi def link tsxNameSpace Function 14609c6f265SBram Moolenaarhi def link tsxCommentInvalid Error 14709c6f265SBram Moolenaarhi def link tsxBlockComment Comment 14809c6f265SBram Moolenaarhi def link tsxLineComment Comment 14909c6f265SBram Moolenaarhi def link tsxAttrib Type 15009c6f265SBram Moolenaarhi def link tsxEscJs tsxEscapeJs 15109c6f265SBram Moolenaarhi def link tsxCloseTag htmlTag 15209c6f265SBram Moolenaarhi def link tsxCloseString Identifier 15309c6f265SBram Moolenaar 15409c6f265SBram Moolenaarlet b:current_syntax = "typescriptreact" 15509c6f265SBram Moolenaarif main_syntax == 'typescriptreact' 15609c6f265SBram Moolenaar unlet main_syntax 15709c6f265SBram Moolenaarendif 15809c6f265SBram Moolenaar 15909c6f265SBram Moolenaarlet &cpo = s:cpo_save 16009c6f265SBram Moolenaarunlet s:cpo_save 161