mirror of
				https://github.com/vim/vim.git
				synced 2025-10-30 09:47:20 -04:00 
			
		
		
		
	
		
			
	
	
		
			191 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
		
		
			
		
	
	
			191 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
|   | " 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 |