if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'jsx') != -1 finish endif function! jsx_pretty#syntax#highlight() let s:highlight_close_tag = get(g:, 'vim_jsx_pretty_highlight_close_tag', 0) " " ~~~~~~~~~~~~~~~~~ " and self close tag " " ~~~~~~~~~~~~~~~~~~~ syntax region jsxTag \ start=+<+ \ matchgroup=jsxOpenPunct \ end=+>+ \ matchgroup=NONE \ end=+\(/\_s*>\)\@=+ \ contained \ contains=jsxOpenTag,jsxEscapeJs,jsxAttrib,jsComment,@javascriptComments,javaScriptLineComment,javaScriptComment,typescriptLineComment,typescriptComment,jsxSpreadOperator \ keepend \ extend " " ~~~~~~~~~~~ " and fragment " <> " ~~~~~ " and self close tag " " ~~~~~~~ syntax region jsxElement \ start=+<\_s*\(>\|\${\|\z(\<[-:_\.\$0-9A-Za-z]\+\>\)\)+ \ end=+/\_s*>+ \ end=+<\_s*/\_s*\z1\_s*>+ \ contains=jsxElement,jsxEscapeJs,jsxTag,jsxComment,jsxCloseString,jsxCloseTag,@Spell \ keepend \ extend \ contained \ fold " detect jsx region syntax region jsxRegion \ start=+\(\(\_[([,?:=+\-*/<>{}]\|&&\|||\|=>\|\\|\z(\(script\)\@!\<[_\$A-Za-z][-:_\.\$0-9A-Za-z]*\>\)\(\_s*\([-+*)\]}&|?]\|/\([/*]\|\_s*>\)\@!\)\)\@!\)+ \ end=++ \ contains=jsxElement " " ~~~~~~~~~~~~~~~~ syntax region jsxEscapeJs \ start=+{+ \ end=++ \ extend \ contained \ contains=jsBlock,javascriptBlock,javaScriptBlockBuildIn,typescriptBlock " " ~~~~ " and fragment start tag " <> " ~~ exe 'syntax region jsxOpenTag \ matchgroup=jsxOpenPunct \ start=+<+ \ end=+>+ \ matchgroup=NONE \ end=+\>+ \ contained \ contains=jsxTagName \ nextgroup=jsxAttrib \ skipwhite \ skipempty ' .(s:highlight_close_tag ? 'transparent' : '') " " ~ syntax match jsxDot +\.+ contained display " " ~ syntax match jsxNamespace +:+ contained display " " ~ syntax match jsxEqual +=+ contained display nextgroup=jsxString,jsxEscapeJs,jsxRegion skipwhite " " ~~ syntax match jsxCloseString +/\_s*>+ contained " " ~~~~~~ " and fragment close tag " " ~~~ syntax region jsxCloseTag \ matchgroup=jsxClosePunct \ start=+<\_s*/+ \ end=+>+ \ contained \ contains=jsxTagName " " ~~~ syntax match jsxAttrib \ +\<[-A-Za-z_][-:_\$0-9A-Za-z]*\>+ \ contained \ nextgroup=jsxEqual \ skipwhite \ skipempty \ contains=jsxAttribKeyword \ display " " ~~~~~~~~~~~ " NOT " " ~~~~~ exe 'syntax match jsxComponentName \ +\<[A-Z][\$0-9A-Za-z]\+\>+ \ contained \ display ' .(s:highlight_close_tag ? 'transparent' : '') " " ~~~ exe 'syntax match jsxTagName \ +\<[-:_\.\$0-9A-Za-z]\+\>+ \ contained \ contains=jsxComponentName,jsxDot,jsxNamespace \ nextgroup=jsxAttrib \ skipempty \ skipwhite \ display ' .(s:highlight_close_tag ? 'transparent' : '') " " ~~~~~~~~ " and " " ~~~~~~~~ syntax region jsxString start=+\z(["']\)+ skip=+\\\%(\z1\|$\)+ end=+\z1+ contained contains=@Spell display let s:tags = get(g:, 'vim_jsx_pretty_template_tags', ['html', 'raw']) let s:enable_tagged_jsx = !empty(s:tags) " add support to JSX inside the tagged template string " https://github.com/developit/htm if s:enable_tagged_jsx exe 'syntax region jsxTaggedRegion \ start=+\%('. join(s:tags, '\|') .'\)\@<=`+ms=s+1 \ end=+`+me=e-1 \ extend \ contained \ containedin=jsTemplateString,javascriptTemplate,javaScriptStringT,typescriptStringB \ contains=jsxElement' syntax region jsxEscapeJs \ start=+\${+ \ end=++ \ extend \ contained \ contains=jsTemplateExpression,javascriptTemplateSubstitution,javaScriptEmbed,typescriptInterpolation syntax region jsxOpenTag \ matchgroup=jsxOpenPunct \ start=+<\%(\${\)\@=+ \ matchgroup=NONE \ end=++ \ contained \ contains=jsxEscapeJs \ nextgroup=jsxAttrib,jsxSpreadOperator \ skipwhite \ skipempty syntax keyword jsxAttribKeyword class contained display syntax match jsxSpreadOperator +\.\.\.+ contained display nextgroup=jsxEscapeJs skipwhite syntax match jsxCloseTag ++ display syntax match jsxComment ++ display endif " Highlight the tag name highlight def link jsxTag Function highlight def link jsxTagName Identifier highlight def link jsxComponentName Function highlight def link jsxAttrib Type highlight def link jsxAttribKeyword jsxAttrib highlight def link jsxEqual Operator highlight def link jsxString String highlight def link jsxDot Operator highlight def link jsxNamespace Operator " Highlight the jsxCloseString (i.e. />), jsxPunct (i.e. <,>) and jsxCloseTag (i.e. ) highlight def link jsxCloseString Comment highlight def link jsxPunct jsxCloseString highlight def link jsxOpenPunct jsxPunct highlight def link jsxClosePunct jsxPunct highlight def link jsxCloseTag jsxCloseString highlight def link jsxComment Comment highlight def link jsxSpreadOperator Operator if s:highlight_close_tag highlight! def link jsxOpenPunct jsxTag highlight! def link jsxCloseString Identifier endif let s:vim_jsx_pretty_colorful_config = get(g:, 'vim_jsx_pretty_colorful_config', 0) if s:vim_jsx_pretty_colorful_config == 1 highlight def link jsObjectKey Label highlight def link jsArrowFuncArgs Type highlight def link jsFuncArgs Type endif endfunction