summaryrefslogtreecommitdiffstats
path: root/syntax
diff options
context:
space:
mode:
authorAdam Stankiewicz <sheerun@sher.pl>2013-09-14 11:38:54 +0200
committerAdam Stankiewicz <sheerun@sher.pl>2013-09-14 11:38:54 +0200
commitf0d869aea78030c6f802013a108678dd98e82378 (patch)
treea4246dcd888ff19c563ea62b2df04b1b8581f29b /syntax
parent96e9c416ae940753b57891b9852cfd834f9bd191 (diff)
downloadvim-polyglot-f0d869aea78030c6f802013a108678dd98e82378.tar.gz
vim-polyglot-f0d869aea78030c6f802013a108678dd98e82378.zip
Add jade template syntax support, closes #2
Diffstat (limited to 'syntax')
-rw-r--r--syntax/jade.vim89
1 files changed, 89 insertions, 0 deletions
diff --git a/syntax/jade.vim b/syntax/jade.vim
new file mode 100644
index 00000000..d61e4f01
--- /dev/null
+++ b/syntax/jade.vim
@@ -0,0 +1,89 @@
+" Vim syntax file
+" Language: Jade
+" Maintainer: Joshua Borton
+" Credits: Tim Pope
+" Filenames: *.jade
+
+if exists("b:current_syntax")
+ finish
+endif
+
+if !exists("main_syntax")
+ let main_syntax = 'jade'
+endif
+
+runtime! syntax/html.vim
+runtime! syntax/html/html5.vim
+silent! syntax include @htmlCoffeescript syntax/coffee.vim
+unlet! b:current_syntax
+silent! syntax include @htmlStylus syntax/stylus.vim
+unlet! b:current_syntax
+silent! syntax include @htmlMarkdown syntax/markdown.vim
+unlet! b:current_syntax
+
+syn case match
+
+syn region javascriptParenthesisBlock start="(" end=")" contains=@htmlJavascript contained keepend
+syn cluster htmlJavascript add=javascriptParenthesisBlock
+
+syn region jadeJavascript matchgroup=jadeJavascriptOutputChar start="[!&]\==\|\~" skip=",\s*$" end="$" contained contains=@htmlJavascript keepend
+syn region jadeJavascript matchgroup=jadeJavascriptChar start="-" skip=",\s*$" end="$" contained contains=@htmlJavascript keepend
+syn cluster jadeTop contains=jadeBegin,jadeComment,jadeHtmlComment,jadeJavascript
+syn match jadeBegin "^\s*\%([<>]\|&[^=~ ]\)\@!" nextgroup=jadeTag,jadeClassChar,jadeIdChar,jadePlainChar,jadeJavascript,jadeScriptConditional,jadeScriptStatement
+syn match jadeTag "+\?\w\+\%(:\w\+\)\=" contained contains=htmlTagName,htmlSpecialTagName nextgroup=@jadeComponent
+syn cluster jadeComponent contains=jadeAttributes,jadeIdChar,jadeBlockExpansionChar,jadeClassChar,jadePlainChar,jadeJavascript
+syn match jadeComment '\s*\/\/.*$'
+syn region jadeHtmlComment start="^\z(\s*\)/" end="^\%(\z1\s\|\s*$\)\@!"
+syn region jadeAttributes matchgroup=jadeAttributesDelimiter start="(" end=")" contained contains=@htmlJavascript,jadeHtmlArg,htmlArg,htmlEvent,htmlCssDefinition nextgroup=@jadeComponent
+syn match jadeClassChar "\." contained nextgroup=jadeClass
+syn match jadeBlockExpansionChar ":\s" contained nextgroup=jadeTag
+syn match jadeIdChar "#{\@!" contained nextgroup=jadeId
+syn match jadeClass "\%(\w\|-\)\+" contained nextgroup=@jadeComponent
+syn match jadeId "\%(\w\|-\)\+" contained nextgroup=@jadeComponent
+syn region jadeDocType start="^\s*\(!!!\|doctype\)" end="$"
+" Unless I'm mistaken, syntax/html.vim requires
+" that the = sign be present for these matches.
+" This adds the matches back for jade.
+syn keyword jadeHtmlArg contained href title
+
+syn match jadePlainChar "\\" contained
+syn region jadeInterpolation matchgroup=jadeInterpolationDelimiter start="#{" end="}" contains=@htmlJavascript
+syn match jadeInterpolationEscape "\\\@<!\%(\\\\\)*\\\%(\\\ze#{\|#\ze{\)"
+
+syn region jadeJavascriptFilter matchgroup=jadeFilter start="^\z(\s*\):javascript\s*$" end="^\%(\z1\s\|\s*$\)\@!" contains=@htmlJavascript
+syn region jadeCoffeescriptFilter matchgroup=jadeFilter start="^\z(\s*\):coffeescript\s*$" end="^\%(\z1\s\|\s*$\)\@!" contains=@htmlCoffeescript
+syn region jadeMarkdownFilter matchgroup=jadeFilter start=/^\z(\s*\):markdown\s*$/ end=/^\%(\z1\s\|\s*$\)\@!/ contains=@htmlMarkdown
+syn region jadeStylusFilter matchgroup=jadeFilter start="^\z(\s*\):stylus\s*$" end="^\%(\z1\s\|\s*$\)\@!" contains=@htmlStylus
+syn region jadePlainFilter matchgroup=jadeFilter start="^\z(\s*\):\%(sass\|less\|cdata\)\s*$" end="^\%(\z1\s\|\s*$\)\@!"
+
+syn match jadeScriptConditional "\<\%(if\|else\|unless\|while\|for\|until\|case\|when\|default\)\>[?!]\@!"
+syn match jadeScriptStatement "\<\%(each\|block\|prepend\|append\|mixin\|extends\|include\)\>[?!]\@!"
+
+syn region jadeJavascript start="^\z(\s*\)script\%(:\w\+\)\=" end="^\%(\z1\s\|\s*$\)\@!" contains=@htmlJavascript,jadeJavascriptTag keepend
+syn region jadeJavascriptTag contained start="^\z(\s*\)script\%(:\w\+\)\=" end="$" contains=jadeBegin,jadeTag
+syn region jadeCssBlock start="^\z(\s*\)style" nextgroup=@jadeComponent,jadeError end="^\%(\z1\s\|\s*$\)\@!" contains=@jadeTop,@htmlCss keepend
+
+syn match jadeError "\$" contained
+
+hi def link jadePlainChar Special
+hi def link jadeScriptConditional PreProc
+hi def link jadeScriptStatement PreProc
+hi def link jadeHtmlArg htmlArg
+hi def link jadeAttributeString String
+hi def link jadeAttributesDelimiter Identifier
+hi def link jadeIdChar Special
+hi def link jadeClassChar Special
+hi def link jadeBlockExpansionChar Special
+hi def link jadeId Identifier
+hi def link jadeClass Type
+hi def link jadeInterpolationDelimiter Delimiter
+hi def link jadeFilter PreProc
+hi def link jadeDocType PreProc
+hi def link jadeComment Comment
+hi def link jadeHtmlComment jadeComment
+
+let b:current_syntax = "jade"
+
+if main_syntax == "jade"
+ unlet main_syntax
+endif