summaryrefslogtreecommitdiffstats
path: root/syntax/svelte.vim
diff options
context:
space:
mode:
authorAdam Stankiewicz <sheerun@sher.pl>2020-05-20 16:59:09 +0200
committerAdam Stankiewicz <sheerun@sher.pl>2020-05-20 16:59:09 +0200
commita688c66a049b12e7b19f6ab4cb27c5a24dc3d52c (patch)
tree4f21330aa69ea67c4b32ad89918034e375bd1e1c /syntax/svelte.vim
parent0a7c62b3b22a75f91245a718c1409e4216ae61c8 (diff)
downloadvim-polyglot-a688c66a049b12e7b19f6ab4cb27c5a24dc3d52c.tar.gz
vim-polyglot-a688c66a049b12e7b19f6ab4cb27c5a24dc3d52c.zip
Update
Diffstat (limited to 'syntax/svelte.vim')
-rw-r--r--syntax/svelte.vim55
1 files changed, 55 insertions, 0 deletions
diff --git a/syntax/svelte.vim b/syntax/svelte.vim
index e4b5f27d..7f7e4ff0 100644
--- a/syntax/svelte.vim
+++ b/syntax/svelte.vim
@@ -36,6 +36,8 @@ syntax keyword svelteKeyword slot contained containedin=htmlTag
" https://github.com/mxw/vim-jsx/blob/master/after/syntax/jsx.vim
syntax region svelteExpression start="{" end="" contains=jsBlock,javascriptBlock containedin=htmlString,htmlTag,htmlArg,htmlValue,htmlH1,htmlH2,htmlH3,htmlH4,htmlH5,htmlH6,htmlHead,htmlTitle,htmlBoldItalicUnderline,htmlUnderlineBold,htmlUnderlineItalicBold,htmlUnderlineBoldItalic,htmlItalicUnderline,htmlItalicBold,htmlItalicBoldUnderline,htmlItalicUnderlineBold,htmlLink,htmlLeadingSpace,htmlBold,htmlBoldUnderline,htmlBoldItalic,htmlBoldUnderlineItalic,htmlUnderline,htmlUnderlineItalic,htmlItalic,htmlStrike,javaScript
+syntax region svelteSurroundingTag contained start=+<\(script\|style\|template\)+ end=+>+ fold contains=htmlTagN,htmlString,htmlArg,htmlValue,htmlTagError,htmlEvent
+
" Block conditionals.
syntax match svelteConditional "#if" contained containedin=jsBlock,javascriptBlock
syntax match svelteConditional "/if" contained containedin=jsBlock,javascriptBlock
@@ -60,6 +62,59 @@ highlight def link svelteConditional Conditional
highlight def link svelteKeyword Keyword
highlight def link svelteRepeat Repeat
+" Preprocessed languages that aren't supported out of the box by Svelte require
+" additional syntax files to be pulled in and can slow Vim down a bit. For that
+" reason, preprocessed languages must be enabled manually. Note that some may
+" require additional plugins that contain the actual syntax definitions.
+"
+" Heavily cribbed from https://github.com/posva/vim-vue and largely completed by
+" @davidroeca (thank you!).
+
+" A syntax should be registered if there's a valid syntax definition known to
+" Vim and it is enabled for the Svelte plugin.
+function! s:enabled(language)
+ " Check whether a syntax file for {language} exists
+ if empty(globpath(&runtimepath, 'syntax/' . a:language . '.vim'))
+ return 0
+ endif
+
+ " If g:svelte_preprocessors is set, check for it there, otherwise return 0.
+ if exists('g:svelte_preprocessors') && type(g:svelte_preprocessors) == v:t_list
+ return index(g:svelte_preprocessors, a:language) != -1
+ else
+ return 0
+ endif
+endfunction
+
+let s:languages = [
+ \ { 'name': 'less', 'tag': 'style' },
+ \ { 'name': 'scss', 'tag': 'style' },
+ \ { 'name': 'sass', 'tag': 'style' },
+ \ { 'name': 'stylus', 'tag': 'style' },
+ \ { 'name': 'typescript', 'tag': 'script' },
+ \ ]
+
+for s:language in s:languages
+ let s:attr = '\(lang\|type\)=\("\|''\)[^\2]*' . s:language.name . '[^\2]*\2'
+ let s:start = '<' . s:language.tag . '\>\_[^>]*' . s:attr . '\_[^>]*>'
+
+ if s:enabled(s:language.name)
+ execute 'syntax include @' . s:language.name . ' syntax/' . s:language.name . '.vim'
+ unlet! b:current_syntax
+
+ execute 'syntax region svelte_' . s:language.name
+ \ 'keepend'
+ \ 'start=/' . s:start . '/'
+ \ 'end="</' . s:language.tag . '>"me=s-1'
+ \ 'contains=@' . s:language.name . ',svelteSurroundingTag'
+ \ 'fold'
+ endif
+endfor
+
+" Cybernetically enhanced web apps.
let b:current_syntax = "svelte"
+" Sync from start because of the wacky nesting.
+syntax sync fromstart
+
endif