summaryrefslogtreecommitdiffstats
path: root/syntax/vue.vim
diff options
context:
space:
mode:
authorAdam Stankiewicz <sheerun@sher.pl>2017-05-17 11:07:28 +0200
committerAdam Stankiewicz <sheerun@sher.pl>2017-05-17 11:07:28 +0200
commitaf870100716f20ee4daef9cc527a9ecf41b54114 (patch)
tree0859464c3145682cbfc29ad08de4527dd661abf7 /syntax/vue.vim
parentef369d45a505403587ea0bae30ce6768ba51398c (diff)
downloadvim-polyglot-af870100716f20ee4daef9cc527a9ecf41b54114.tar.gz
vim-polyglot-af870100716f20ee4daef9cc527a9ecf41b54114.zip
Update
Diffstat (limited to '')
-rw-r--r--syntax/vue.vim129
1 files changed, 47 insertions, 82 deletions
diff --git a/syntax/vue.vim b/syntax/vue.vim
index a3ab794c..bb9590e3 100644
--- a/syntax/vue.vim
+++ b/syntax/vue.vim
@@ -8,90 +8,55 @@ if exists("b:current_syntax")
finish
endif
-if !exists("s:syntaxes")
- " Search available syntax files.
- function s:search_syntaxes(...)
- let syntaxes = {}
- let names = a:000
- for name in names
- let syntaxes[name] = 0
- endfor
-
- for path in split(&runtimepath, ',')
- if isdirectory(path . '/syntax')
- for name in names
- let syntaxes[name] = syntaxes[name] || filereadable(path . '/syntax/' . name . '.vim')
- endfor
- endif
- endfor
- return syntaxes
- endfunction
-
- let s:syntaxes = s:search_syntaxes('pug', 'slm', 'coffee', 'stylus', 'sass', 'scss', 'less', 'typescript')
-endif
-
-
-syntax include @HTML syntax/html.vim
-unlet! b:current_syntax
-syntax region html keepend start=/^<template\_[^>]*>/ end=/^<\/template>/ contains=@HTML fold
-
-if s:syntaxes.pug
- syntax include @PUG syntax/pug.vim
- unlet! b:current_syntax
- syntax region pug keepend start=/<template lang=\("\|'\)[^\1]*pug[^\1]*\1>/ end="</template>" contains=@PUG fold
- syntax region pug keepend start=/<template lang=\("\|'\)[^\1]*jade[^\1]*\1>/ end="</template>" contains=@PUG fold
-endif
-
-if s:syntaxes.slm
- syntax include @SLM syntax/slm.vim
- unlet! b:current_syntax
- syntax region slm keepend start=/<template lang=\("\|'\)[^\1]*slm[^\1]*\1>/ end="</template>" contains=@SLM fold
-endif
-
-syntax include @JS syntax/javascript.vim
-unlet! b:current_syntax
-syntax region javascript keepend matchgroup=Delimiter start=/<script\( lang="babel"\)\?\( type="text\/babel"\)\?>/ end="</script>" contains=@JS fold
-
-if s:syntaxes.typescript
- syntax include @TS syntax/typescript.vim
- unlet! b:current_syntax
- syntax region typescript keepend matchgroup=Delimiter start=/<script \_[^>]*\(lang=\("\|'\)[^\2]*\(ts\|typescript\)[^\2]*\2\|ts\)\_[^>]*>/ end="</script>" contains=@TS fold
-endif
-
-if s:syntaxes.coffee
- syntax include @COFFEE syntax/coffee.vim
- unlet! b:current_syntax
- " Matchgroup seems to be necessary for coffee
- syntax region coffee keepend matchgroup=Delimiter start="<script lang=\"coffee\">" end="</script>" contains=@COFFEE fold
-endif
-
-syntax include @CSS syntax/css.vim
+runtime! syntax/html.vim
unlet! b:current_syntax
-syntax region css keepend start=/<style\_[^>]*>/ end="</style>" contains=@CSS fold
-
-if s:syntaxes.stylus
- syntax include @stylus syntax/stylus.vim
- unlet! b:current_syntax
- syntax region stylus keepend start=/<style \_[^>]*lang=\("\|'\)[^\1]*stylus[^\1]*\1\_[^>]*>/ end="</style>" contains=@stylus fold
-endif
-
-if s:syntaxes.sass
- syntax include @sass syntax/sass.vim
- unlet! b:current_syntax
- syntax region sass keepend start=/<style \_[^>]*lang=\("\|'\)[^\1]*sass[^\1]*\1\_[^>]*>/ end="</style>" contains=@sass fold
-endif
-if s:syntaxes.scss
- syntax include @scss syntax/scss.vim
- unlet! b:current_syntax
- syntax region scss keepend start=/<style \_[^>]*lang=\("\|'\)[^\1]*scss[^\1]*\1\_[^>]*>/ end="</style>" contains=@scss fold
-endif
-
-if s:syntaxes.less
- syntax include @less syntax/less.vim
- unlet! b:current_syntax
- syntax region less keepend matchgroup=PreProc start=/<style \_[^>]*lang=\("\|'\)[^\1]*less[^\1]*\1\_[^>]*>/ end="</style>" contains=@less fold
-endif
+""
+" Get the pattern for a HTML {name} attribute with {value}.
+function! s:attr(name, value)
+ return a:name . '=\("\|''\)[^\1]*' . a:value . '[^\1]*\1'
+endfunction
+
+""
+" Check whether a syntax file for a given {language} exists.
+function! s:syntax_available(language)
+ return !empty(globpath(&runtimepath, 'syntax/' . a:language . '.vim'))
+endfunction
+
+""
+" Register {language} for a given {tag}. If [attr_override] is given and not
+" empty, it will be used for the attribute pattern.
+function! s:register_language(language, tag, ...)
+ let attr_override = a:0 ? a:1 : ''
+ let attr = !empty(attr_override) ? attr_override : s:attr('lang', a:language)
+
+ if s:syntax_available(a:language)
+ execute 'syntax include @' . a:language . ' syntax/' . a:language . '.vim'
+ unlet! b:current_syntax
+ execute 'syntax region vue_' . a:language
+ \ 'keepend'
+ \ 'start=/<' . a:tag . ' \_[^>]*' . attr . '\_[^>]*>/'
+ \ 'end="</' . a:tag . '>"me=s-1'
+ \ 'contains=@' . a:language . ',vueSurroundingTag'
+ \ 'fold'
+ endif
+endfunction
+
+call s:register_language('pug', 'template', s:attr('lang', '\%(pug\|jade\)'))
+call s:register_language('slm', 'template')
+call s:register_language('handlebars', 'template')
+call s:register_language('haml', 'template')
+call s:register_language('typescript', 'script', '\%(lang=\("\|''\)[^\1]*\(ts\|typescript\)[^\1]*\1\|ts\)')
+call s:register_language('coffee', 'script')
+call s:register_language('stylus', 'style')
+call s:register_language('sass', 'style')
+call s:register_language('scss', 'style')
+call s:register_language('less', 'style')
+
+syn region vueSurroundingTag contained start=+<\(script\|style\|template\)+ end=+>+ fold contains=htmlTagN,htmlString,htmlArg,htmlValue,htmlTagError,htmlEvent
+syn keyword htmlSpecialTagName contained template
+syn keyword htmlArg contained scoped ts
+syn match htmlArg "[@v:][-:.0-9_a-z]*\>" contained
let b:current_syntax = "vue"