summaryrefslogtreecommitdiffstats
path: root/runtime/syntax/astro.vim
blob: 0816051adaab7bc8eb6260c5d1c80c9f24c68483 (plain)
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