liquid.vim (6457B)
1 " Vim syntax file 2 " Language: Liquid 3 " Maintainer: Tim Pope <vimNOSPAM@tpope.org> 4 " Filenames: *.liquid 5 " Last Change: 2022 Mar 15 6 7 if exists('b:current_syntax') 8 finish 9 endif 10 11 if !exists('main_syntax') 12 let main_syntax = 'liquid' 13 endif 14 15 if !exists('g:liquid_default_subtype') 16 let g:liquid_default_subtype = 'html' 17 endif 18 19 if !exists('b:liquid_subtype') && main_syntax == 'liquid' 20 let s:lines = getline(1)."\n".getline(2)."\n".getline(3)."\n".getline(4)."\n".getline(5)."\n".getline("$") 21 let b:liquid_subtype = matchstr(s:lines,'liquid_subtype=\zs\w\+') 22 if b:liquid_subtype == '' 23 let b:liquid_subtype = matchstr(&filetype,'^liquid\.\zs\w\+') 24 endif 25 if b:liquid_subtype == '' 26 let b:liquid_subtype = matchstr(substitute(expand('%:t'),'\c\%(\.liquid\)\+$','',''),'\.\zs\w\+$') 27 endif 28 if b:liquid_subtype == '' 29 let b:liquid_subtype = g:liquid_default_subtype 30 endif 31 endif 32 33 if exists('b:liquid_subtype') && b:liquid_subtype != '' 34 exe 'runtime! syntax/'.b:liquid_subtype.'.vim' 35 unlet! b:current_syntax 36 endif 37 38 syn case match 39 40 if exists('b:liquid_subtype') && b:liquid_subtype != 'yaml' 41 " YAML Front Matter 42 syn include @liquidYamlTop syntax/yaml.vim 43 unlet! b:current_syntax 44 syn region liquidYamlHead start="\%^---$" end="^---\s*$" keepend contains=@liquidYamlTop,@Spell 45 endif 46 47 if !exists('g:liquid_highlight_types') 48 let g:liquid_highlight_types = [] 49 endif 50 51 if !exists('s:subtype') 52 let s:subtype = exists('b:liquid_subtype') ? b:liquid_subtype : '' 53 54 for s:type in map(copy(g:liquid_highlight_types),'matchstr(v:val,"[^=]*$")') 55 if s:type =~ '\.' 56 let b:{matchstr(s:type,'[^.]*')}_subtype = matchstr(s:type,'\.\zs.*') 57 endif 58 exe 'syn include @liquidHighlight'.substitute(s:type,'\.','','g').' syntax/'.matchstr(s:type,'[^.]*').'.vim' 59 unlet! b:current_syntax 60 endfor 61 unlet! s:type 62 63 if s:subtype == '' 64 unlet! b:liquid_subtype 65 else 66 let b:liquid_subtype = s:subtype 67 endif 68 unlet s:subtype 69 endif 70 71 syn region liquidStatement matchgroup=liquidDelimiter start="{%-\=" end="-\=%}" contains=@liquidStatement containedin=ALLBUT,@liquidExempt keepend 72 syn region liquidExpression matchgroup=liquidDelimiter start="{{-\=" end="-\=}}" contains=@liquidExpression containedin=ALLBUT,@liquidExempt keepend 73 syn region liquidComment matchgroup=liquidDelimiter start="{%-\=\s*comment\s*-\=%}" end="{%-\=\s*endcomment\s*-\=%}" contains=liquidTodo,@Spell containedin=ALLBUT,@liquidExempt keepend 74 syn region liquidRaw matchgroup=liquidDelimiter start="{%-\=\s*raw\s*-\=%}" end="{%-\=\s*endraw\s*-\=%}" contains=TOP,@liquidExempt containedin=ALLBUT,@liquidExempt keepend 75 76 syn cluster liquidExempt contains=liquidStatement,liquidExpression,liquidComment,liquidRaw,@liquidStatement,liquidYamlHead 77 syn cluster liquidStatement contains=liquidConditional,liquidRepeat,liquidKeyword,@liquidExpression 78 syn cluster liquidExpression contains=liquidOperator,liquidString,liquidNumber,liquidFloat,liquidBoolean,liquidNull,liquidEmpty,liquidPipe,liquidForloop 79 80 syn keyword liquidKeyword highlight nextgroup=liquidTypeHighlight skipwhite contained 81 syn keyword liquidKeyword endhighlight contained 82 syn region liquidHighlight start="{%-\=\s*highlight\s\+\w\+\s*-\=%}" end="{%-\= endhighlight -\=%}" keepend 83 84 for s:type in g:liquid_highlight_types 85 exe 'syn match liquidTypeHighlight "\<'.matchstr(s:type,'[^=]*').'\>" contained' 86 exe 'syn region liquidHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\..*','','').' start="{%-\=\s*highlight\s\+'.matchstr(s:type,'[^=]*').'\s*-\=%}" end="{%-\= endhighlight -\=%}" keepend contains=@liquidHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\.','','g') 87 endfor 88 unlet! s:type 89 90 syn region liquidString matchgroup=liquidQuote start=+"+ end=+"+ contained 91 syn region liquidString matchgroup=liquidQuote start=+'+ end=+'+ contained 92 syn match liquidNumber "-\=\<\d\+\>" contained 93 syn match liquidFloat "-\=\<\d\+\>\.\.\@!\%(\d\+\>\)\=" contained 94 syn keyword liquidBoolean true false contained 95 syn keyword liquidNull null nil blank contained 96 syn match liquidEmpty "\<empty\>" contained 97 98 syn keyword liquidOperator and or not contained 99 syn match liquidPipe '|' contained skipwhite nextgroup=liquidFilter 100 101 syn keyword liquidFilter date capitalize downcase upcase escape escape_once first last join sort size where uniq strip_html strip_newlines newline_to_br replace replace_first remove remove_first slice split strip truncate truncatewords prepend append url_encode url_decode abs at_most at_least ceil divided_by floor minus plus round times modulo contained 102 103 syn keyword liquidConditional if elsif else endif unless endunless case when endcase ifchanged endifchanged contained 104 syn keyword liquidRepeat for endfor tablerow endtablerow in break continue limit offset reversed contained 105 syn match liquidRepeat "\%({%-\=\s*\)\@<=empty\>" contained 106 syn keyword liquidKeyword assign capture endcapture increasement decreasement cycle include with render contained 107 108 syn keyword liquidForloop forloop nextgroup=liquidForloopDot contained 109 syn match liquidForloopDot "\." nextgroup=liquidForloopAttribute contained 110 syn keyword liquidForloopAttribute length index index0 rindex rindex0 first last contained 111 112 syn keyword liquidTablerowloop tablerowloop nextgroup=liquidTablerowloopDot contained 113 syn match liquidTablerowloopDot "\." nextgroup=liquidTableForloopAttribute contained 114 syn keyword liquidTablerowloopAttribute length index index0 col col0 index0 rindex rindex0 first last col_first col_last contained 115 116 hi def link liquidDelimiter PreProc 117 hi def link liquidComment Comment 118 hi def link liquidTypeHighlight Type 119 hi def link liquidConditional Conditional 120 hi def link liquidRepeat Repeat 121 hi def link liquidKeyword Keyword 122 hi def link liquidOperator Operator 123 hi def link liquidString String 124 hi def link liquidQuote Delimiter 125 hi def link liquidNumber Number 126 hi def link liquidFloat Float 127 hi def link liquidEmpty liquidNull 128 hi def link liquidNull liquidBoolean 129 hi def link liquidBoolean Boolean 130 hi def link liquidFilter Function 131 hi def link liquidForloop Identifier 132 hi def link liquidForloopAttribute Identifier 133 134 let b:current_syntax = 'liquid' 135 136 if exists('main_syntax') && main_syntax == 'liquid' 137 unlet main_syntax 138 endif