summaryrefslogtreecommitdiffstats
path: root/runtime/syntax/tt2.vim
blob: 6826fb158197a63cfc36cdcb23c82d84dc231cda (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
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
" Vim syntax file
" Language:      TT2 (Perl Template Toolkit)
" Maintainer:    vim-perl <vim-perl@googlegroups.com>
" Author:        Moriki, Atsushi <4woods+vim@gmail.com>
" Homepage:      https://github.com/vim-perl/vim-perl
" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
" License:       Vim License (see :help license)
" Last Change:   2018 Mar 28
"
" Installation:
"   put tt2.vim and tt2html.vim in to your syntax directory.
"
"   add below in your filetype.vim.
"       au BufNewFile,BufRead *.tt2 setf tt2
"           or
"       au BufNewFile,BufRead *.tt2
"           \ if ( getline(1) . getline(2) . getline(3) =~ '<\chtml' |
"           \           && getline(1) . getline(2) . getline(3) !~ '<[%?]' ) |
"           \   || getline(1) =~ '<!DOCTYPE HTML' |
"           \   setf tt2html |
"           \ else |
"           \   setf tt2 |
"           \ endif
"
"   define START_TAG, END_TAG
"       "ASP"
"       :let b:tt2_syn_tags = '<% %>'
"       "PHP"
"       :let b:tt2_syn_tags = '<? ?>'
"       "TT2 and HTML"
"       :let b:tt2_syn_tags = '\[% %] <!-- -->'
"
" Changes:
"           0.1.3
"               Changed fileformat from 'dos' to 'unix'
"               Deleted 'echo' that print obstructive message
"           0.1.2
"               Added block comment syntax
"               e.g. [%# COMMENT
"                        COMMENT TOO %]
"                    [%# IT'S SAFE %]  HERE IS OUTSIDE OF TT2 DIRECTIVE
"                    [% # WRONG!! %]   HERE STILL BE COMMENT
"           0.1.1
"               Release
"           0.1.0
"               Internal

if !exists("b:tt2_syn_tags")
    let b:tt2_syn_tags = '\[% %]'
    "let b:tt2_syn_tags = '\[% %] \[\* \*]'
endif

if !exists("b:tt2_syn_inc_perl")
    let b:tt2_syn_inc_perl = 1
endif

if exists("b:current_syntax")
  finish
endif

let s:cpo_save = &cpo
set cpo&vim

syn case match

syn cluster tt2_top_cluster contains=tt2_perlcode,tt2_tag_region

" TT2 TAG Region
if exists("b:tt2_syn_tags")

    let s:str = b:tt2_syn_tags . ' '
    let s:str = substitute(s:str,'^ \+','','g')
    let s:str = substitute(s:str,' \+',' ','g')

    while stridx(s:str,' ') > 0

        let s:st = strpart(s:str,0,stridx(s:str,' '))
        let s:str = substitute(s:str,'[^ ]* ','',"")

        let s:ed = strpart(s:str,0,stridx(s:str,' '))
        let s:str = substitute(s:str,'[^ ]* ','',"")

        exec 'syn region  tt2_tag_region '.
                    \ 'matchgroup=tt2_tag '.
                    \ 'start=+\(' . s:st .'\)[-]\=+ '.
                    \ 'end=+[-]\=\(' . s:ed . '\)+ '.
                    \ 'contains=@tt2_statement_cluster keepend extend'

        exec 'syn region  tt2_commentblock_region '.
                    \ 'matchgroup=tt2_tag '.
                    \ 'start=+\(' . s:st .'\)[-]\=\(#\)\@=+ '.
                    \ 'end=+[-]\=\(' . s:ed . '\)+ '.
                    \ 'keepend extend'

        "Include Perl syntax when 'PERL' 'RAWPERL' block
        if b:tt2_syn_inc_perl
            syn include @Perl syntax/perl.vim
            exec 'syn region tt2_perlcode '.
                        \ 'start=+\(\(RAW\)\=PERL\s*[-]\=' . s:ed . '\(\n\)\=\)\@<=+ ' .
                        \ 'end=+' . s:st . '[-]\=\s*END+me=s-1 contains=@Perl keepend'
        endif

        "echo 'TAGS ' . s:st . ' ' . s:ed
        unlet s:st
        unlet s:ed
    endwhile

else

    syn region  tt2_tag_region
                \ matchgroup=tt2_tag
                \ start=+\(\[%\)[-]\=+
                \ end=+[-]\=%\]+
                \ contains=@tt2_statement_cluster keepend extend

    syn region  tt2_commentblock_region
                \ matchgroup=tt2_tag
                \ start=+\(\[%\)[-]\=#+
                \ end=+[-]\=%\]+
                \ keepend extend

    "Include Perl syntax when 'PERL' 'RAWPERL' block
    if b:tt2_syn_inc_perl
        syn include @Perl syntax/perl.vim
        syn region tt2_perlcode
                    \ start=+\(\(RAW\)\=PERL\s*[-]\=%]\(\n\)\=\)\@<=+
                    \ end=+\[%[-]\=\s*END+me=s-1
                    \ contains=@Perl keepend
    endif
endif

" Directive
syn keyword tt2_directive contained
            \ GET CALL SET DEFAULT DEBUG
            \ LAST NEXT BREAK STOP BLOCK
            \ IF IN UNLESS ELSIF FOR FOREACH WHILE SWITCH CASE
            \ USE PLUGIN MACRO META
            \ TRY FINAL RETURN LAST
            \ CLEAR TO STEP AND OR NOT MOD DIV
            \ ELSE PERL RAWPERL END
syn match   tt2_directive +|+ contained
syn keyword tt2_directive contained nextgroup=tt2_string_q,tt2_string_qq,tt2_blockname skipwhite skipempty
            \ INSERT INCLUDE PROCESS WRAPPER FILTER
            \ THROW CATCH
syn keyword tt2_directive contained nextgroup=tt2_def_tag skipwhite skipempty
            \ TAGS

syn match   tt2_def_tag "\S\+\s\+\S\+\|\<\w\+\>" contained

syn match   tt2_variable  +\I\w*+                           contained
syn match   tt2_operator  "[+*/%:?-]"                       contained
syn match   tt2_operator  "\<\(mod\|div\|or\|and\|not\)\>"  contained
syn match   tt2_operator  "[!=<>]=\=\|&&\|||"               contained
syn match   tt2_operator  "\(\s\)\@<=_\(\s\)\@="            contained
syn match   tt2_operator  "=>\|,"                           contained
syn match   tt2_deref     "\([[:alnum:]_)\]}]\s*\)\@<=\."   contained
syn match   tt2_comment   +#.*$+                            contained
syn match   tt2_func      +\<\I\w*\(\s*(\)\@=+              contained nextgroup=tt2_bracket_r skipempty skipwhite
"
syn region  tt2_bracket_r  start=+(+ end=+)+                contained contains=@tt2_statement_cluster keepend extend
syn region  tt2_bracket_b start=+\[+ end=+]+                contained contains=@tt2_statement_cluster keepend extend
syn region  tt2_bracket_b start=+{+  end=+}+                contained contains=@tt2_statement_cluster keepend extend

syn region  tt2_string_qq start=+"+ end=+"+ skip=+\\"+      contained contains=tt2_ivariable keepend extend
syn region  tt2_string_q  start=+'+ end=+'+ skip=+\\'+      contained keepend extend

syn match   tt2_ivariable  +\$\I\w*\>\(\.\I\w*\>\)*+        contained
syn match   tt2_ivariable  +\${\I\w*\>\(\.\I\w*\>\)*}+      contained

syn match   tt2_number    "\d\+"        contained
syn match   tt2_number    "\d\+\.\d\+"  contained
syn match   tt2_number    "0x\x\+"      contained
syn match   tt2_number    "0\o\+"       contained

syn match   tt2_blockname "\f\+"                       contained                        nextgroup=tt2_blockname_joint skipwhite skipempty
syn match   tt2_blockname "$\w\+"                      contained contains=tt2_ivariable nextgroup=tt2_blockname_joint skipwhite skipempty
syn region  tt2_blockname start=+"+ end=+"+ skip=+\\"+ contained contains=tt2_ivariable nextgroup=tt2_blockname_joint keepend skipwhite skipempty
syn region  tt2_blockname start=+'+ end=+'+ skip=+\\'+ contained                        nextgroup=tt2_blockname_joint keepend skipwhite skipempty
syn match   tt2_blockname_joint "+"                    contained                        nextgroup=tt2_blockname skipwhite skipempty

syn cluster tt2_statement_cluster contains=tt2_directive,tt2_variable,tt2_operator,tt2_string_q,tt2_string_qq,tt2_deref,tt2_comment,tt2_func,tt2_bracket_b,tt2_bracket_r,tt2_number

" Synchronizing
syn sync minlines=50

hi def link tt2_tag         Type
hi def link tt2_tag_region  Type
hi def link tt2_commentblock_region Comment
hi def link tt2_directive   Statement
hi def link tt2_variable    Identifier
hi def link tt2_ivariable   Identifier
hi def link tt2_operator    Statement
hi def link tt2_string_qq   String
hi def link tt2_string_q    String
hi def link tt2_blockname   String
hi def link tt2_comment     Comment
hi def link tt2_func        Function
hi def link tt2_number      Number

if exists("b:tt2_syn_tags")
    unlet b:tt2_syn_tags
endif

let b:current_syntax = "tt2"

let &cpo = s:cpo_save
unlet s:cpo_save

" vim:ts=4:sw=4