if polyglot#init#is_disabled(expand(':p'), 'jsx', 'after/syntax/jsx_pretty.vim') finish endif let s:highlight_close_tag = get(g:, 'vim_jsx_pretty_highlight_close_tag', 0) " detect jsx region syntax region jsxRegion \ start=+\%(\%(\_[([,?:=+\-*/>{}]\|<\s\+\|&&\|||\|=>\|\\|\z(\%(script\|\s*\\)\@!\<[_$A-Za-z][-:._$A-Za-z0-9]*\>\)\%(\_s*\%([-+*)\]}&|?,]\|/\%([/*]\|\_s*>\)\@!\)\)\@!\)+ \ end=++ \ contains=jsxElement " " ~~~~~~~~~~~~~~~~~ " and self close tag " " ~~~~~~~~~~~~~~~~~~~ syntax region jsxTag \ start=+<+ \ matchgroup=jsxOpenPunct \ end=+>+ \ matchgroup=NONE \ end=+\%(/\_s*>\)\@=+ \ contained \ contains=jsxOpenTag,jsxAttrib,jsxExpressionBlock,jsxSpreadOperator,jsComment,@javascriptComments,javaScriptLineComment,javaScriptComment,typescriptLineComment,typescriptComment \ keepend \ extend \ skipwhite \ skipempty \ nextgroup=jsxCloseString " " ~~~~~~~~~~~ " and fragment " <> " ~~~~~ " and self close tag " " ~~~~~~~ syntax region jsxElement \ start=+<\_s*\%(>\|\${\|\z(\<[-:._$A-Za-z0-9]\+\>\)\)+ \ end=+/\_s*>+ \ end=+<\_s*/\_s*\z1\_s*>+ \ contains=jsxElement,jsxTag,jsxExpressionBlock,jsxComment,jsxCloseTag,@Spell \ keepend \ extend \ contained \ fold " " ~~~~ " 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 region jsxExpressionBlock \ matchgroup=jsxBraces \ start=+{+ \ end=+}+ \ contained \ extend \ contains=@jsExpression,jsSpreadExpression,@javascriptExpression,javascriptSpreadOp,@javaScriptEmbededExpr,@typescriptExpression,typescriptObjectSpread,jsComment,@javascriptComments,javaScriptLineComment,javaScriptComment,typescriptLineComment,typescriptComment " " ~ syntax match jsxDot +\.+ contained " " ~ syntax match jsxNamespace +:+ contained " " ~ syntax match jsxEqual +=+ contained skipwhite skipempty nextgroup=jsxString,jsxExpressionBlock,jsxRegion " " ~~ 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][-:_$A-Za-z0-9]*\>+ \ contained \ nextgroup=jsxEqual \ skipwhite \ skipempty \ contains=jsxAttribKeyword,jsxNamespace " " ~~~~~~~~~~~ " NOT " " ~~~~~ exe 'syntax match jsxComponentName \ +\<[_$]\?[A-Z][-_$A-Za-z0-9]*\>+ \ contained \ ' .(s:highlight_close_tag ? 'transparent' : '') " " ~~~ exe 'syntax match jsxTagName \ +\<[-:._$A-Za-z0-9]\+\>+ \ contained \ contains=jsxComponentName,jsxDot,jsxNamespace \ nextgroup=jsxAttrib \ skipempty \ skipwhite \ ' .(s:highlight_close_tag ? 'transparent' : '') " " ~~~~~~~~ " and " " ~~~~~~~~ syntax region jsxString start=+\z(["']\)+ skip=+\\\\\|\\\z1\|\\\n+ end=+\z1+ extend contained contains=@Spell let s:tags = get(g:, 'vim_jsx_pretty_template_tags', ['html', 'jsx']) 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 match jsxRegion +\%(' . join(s:tags, '\|') . '\)\%(\_s*`\)\@=+ contains=jsTemplateStringTag,jsTaggedTemplate,javascriptTagRef skipwhite skipempty nextgroup=jsxTaggedRegion' syntax region jsxTaggedRegion \ matchgroup=jsxBackticks \ start=+`+ \ end=+`+ \ extend \ contained \ contains=jsxElement,jsxExpressionBlock \ transparent syntax region jsxExpressionBlock \ matchgroup=jsxBraces \ start=+\${+ \ end=+}+ \ extend \ contained \ contains=@jsExpression,jsSpreadExpression,@javascriptExpression,javascriptSpreadOp,@javaScriptEmbededExpr,@typescriptExpression,typescriptObjectSpread syntax region jsxOpenTag \ matchgroup=jsxOpenPunct \ start=+<\%(\${\)\@=+ \ matchgroup=NONE \ end=+}\@1<=+ \ contained \ contains=jsxExpressionBlock \ skipwhite \ skipempty \ nextgroup=jsxAttrib,jsxSpreadOperator syntax keyword jsxAttribKeyword class contained syntax match jsxSpreadOperator +\.\.\.+ contained nextgroup=jsxExpressionBlock skipwhite syntax match jsxCloseTag ++ contained syntax match jsxComment ++ 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 jsxString String highlight def link jsxComment Comment highlight def link jsxDot Operator highlight def link jsxNamespace Operator highlight def link jsxEqual Operator highlight def link jsxSpreadOperator Operator highlight def link jsxBraces Special if s:highlight_close_tag highlight def link jsxCloseString Identifier highlight def link jsxOpenPunct jsxTag else " Highlight the jsxCloseString (i.e. />), jsxPunct (i.e. <,>) and jsxCloseTag (i.e. ) highlight def link jsxCloseString Comment highlight def link jsxOpenPunct jsxPunct endif highlight def link jsxPunct jsxCloseString highlight def link jsxClosePunct jsxPunct highlight def link jsxCloseTag jsxCloseString 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