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