1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
|
" Vim syntax file.
" Language: Astro
" Author: Wuelner MartÃnez <wuelner.martinez@outlook.com>
" Maintainer: Wuelner MartÃnez <wuelner.martinez@outlook.com>
" URL: https://github.com/wuelnerdotexe/vim-astro
" Last Change: 2022 Aug 22
" Based On: Evan Lecklider's vim-svelte
" Changes: See https://github.com/evanleck/vim-svelte
" Credits: See vim-svelte on github
" Quit when a (custom) syntax file was already loaded.
if !exists('main_syntax')
if exists('b:current_syntax')
finish
endif
let main_syntax = 'astro'
elseif exists('b:current_syntax') && b:current_syntax == 'astro'
finish
endif
" Astro syntax variables are initialized.
let g:astro_typescript = get(g:, 'astro_typescript', 'disable')
let g:astro_stylus = get(g:, 'astro_stylus', 'disable')
let s:cpoptions_save = &cpoptions
set cpoptions&vim
" Embedded HTML syntax.
runtime! syntax/html.vim
" htmlTagName: expand HTML tag names to include mixed case and periods.
syntax match htmlTagName contained "\<[a-zA-Z\.]*\>"
" astroDirectives: add Astro Directives to HTML arguments.
syntax match astroDirectives contained '\<[a-z]\+:[a-z|]*\>' containedin=htmlTag
unlet b:current_syntax
if g:astro_typescript == 'enable'
" Embedded TypeScript syntax.
syntax include @astroJavaScript syntax/typescript.vim
" javaScriptExpression: a javascript expression is used as an arg value.
syntax clear javaScriptExpression
syntax region javaScriptExpression
\ contained start=+&{+
\ keepend end=+};+
\ contains=@astroJavaScript,@htmlPreproc
" javaScript: add TypeScript support to HTML script tag.
syntax clear javaScript
syntax region javaScript
\ start=+<script\_[^>]*>+
\ keepend
\ end=+</script\_[^>]*>+me=s-1
\ contains=htmlScriptTag,@astroJavaScript,@htmlPreproc,htmlCssStyleComment
else
" Embedded JavaScript syntax.
syntax include @astroJavaScript syntax/javascript.vim
endif
" astroFence: detect the Astro fence.
syntax match astroFence contained +^---$+
" astrojavaScript: add TypeScript support to Astro code fence.
syntax region astroJavaScript
\ start=+^---$+
\ keepend
\ end=+^---$+
\ contains=htmlTag,@astroJavaScript,@htmlPreproc,htmlCssStyleComment,htmlEndTag,astroFence
\ fold
unlet b:current_syntax
if g:astro_typescript == 'enable'
" Embedded TypeScript React (TSX) syntax.
syntax include @astroJavaScriptReact syntax/typescriptreact.vim
else
" Embedded JavaScript React (JSX) syntax.
syntax include @astroJavaScriptReact syntax/javascriptreact.vim
endif
" astroJavaScriptExpression: add {JSX or TSX} support to Astro expresions.
execute 'syntax region astroJavaScriptExpression start=+{+ keepend end=+}+ ' .
\ 'contains=@astroJavaScriptReact, @htmlPreproc containedin=' . join([
\ 'htmlArg', 'htmlBold', 'htmlBoldItalic', 'htmlBoldItalicUnderline',
\ 'htmlBoldUnderline', 'htmlBoldUnderlineItalic', 'htmlH1', 'htmlH2',
\ 'htmlH3', 'htmlH4', 'htmlH5', 'htmlH6', 'htmlHead', 'htmlItalic',
\ 'htmlItalicBold', 'htmlItalicBoldUnderline', 'htmlItalicUnderline',
\ 'htmlItalicUnderlineBold', 'htmlLeadingSpace', 'htmlLink',
\ 'htmlStrike', 'htmlString', 'htmlTag', 'htmlTitle', 'htmlUnderline',
\ 'htmlUnderlineBold', 'htmlUnderlineBoldItalic',
\ 'htmlUnderlineItalic', 'htmlUnderlineItalicBold', 'htmlValue'
\ ], ',')
" cssStyle: add CSS style tags support in TypeScript React.
syntax region cssStyle
\ start=+<style\_[^>]*>+
\ keepend
\ end=+</style\_[^>]*>+me=s-1
\ contains=htmlTag,@htmlCss,htmlCssStyleComment,@htmlPreproc,htmlEndTag
\ containedin=@astroJavaScriptReact
unlet b:current_syntax
" Embedded SCSS syntax.
syntax include @astroScss syntax/scss.vim
" cssStyle: add SCSS style tags support in Astro.
syntax region scssStyle
\ start=/<style\>\_[^>]*\(lang\)=\("\|''\)[^\2]*scss[^\2]*\2\_[^>]*>/
\ keepend
\ end=+</style>+me=s-1
\ contains=@astroScss,astroSurroundingTag
\ fold
unlet b:current_syntax
" Embedded SASS syntax.
syntax include @astroSass syntax/sass.vim
" cssStyle: add SASS style tags support in Astro.
syntax region sassStyle
\ start=/<style\>\_[^>]*\(lang\)=\("\|''\)[^\2]*sass[^\2]*\2\_[^>]*>/
\ keepend
\ end=+</style>+me=s-1
\ contains=@astroSass,astroSurroundingTag
\ fold
unlet b:current_syntax
" Embedded LESS syntax.
syntax include @astroLess syntax/less.vim
" cssStyle: add LESS style tags support in Astro.
syntax region lessStyle
\ start=/<style\>\_[^>]*\(lang\)=\("\|''\)[^\2]*less[^\2]*\2\_[^>]*>/
\ keepend
\ end=+</style>+me=s-1
\ contains=@astroLess,astroSurroundingTag
\ fold
unlet b:current_syntax
" Embedded Stylus syntax.
" NOTE: Vim does not provide stylus support by default, but you can install
" this plugin to support it: https://github.com/wavded/vim-stylus
if g:astro_stylus == 'enable'
try
" Embedded Stylus syntax.
syntax include @astroStylus syntax/stylus.vim
" stylusStyle: add Stylus style tags support in Astro.
syntax region stylusStyle
\ start=/<style\>\_[^>]*\(lang\)=\("\|''\)[^\2]*stylus[^\2]*\2\_[^>]*>/
\ keepend
\ end=+</style>+me=s-1
\ contains=@astroStylus,astroSurroundingTag
\ fold
unlet b:current_syntax
catch
echomsg "you need install a external plugin for support stylus in .astro files"
endtry
endif
" astroSurroundingTag: add surround HTML tag to script and style.
syntax region astroSurroundingTag
\ start=+<\(script\|style\)+
\ end=+>+
\ contains=htmlTagError,htmlTagN,htmlArg,htmlValue,htmlEvent,htmlString
\ contained
\ fold
" Define the default highlighting.
" Only used when an item doesn't have highlighting yet.
highlight default link astroDirectives Special
highlight default link astroFence Comment
let b:current_syntax = 'astro'
if main_syntax == 'astro'
unlet main_syntax
endif
" Sync from start because of the wacky nesting.
syntax sync fromstart
let &cpoptions = s:cpoptions_save
unlet s:cpoptions_save
" vim: ts=8
|