diff options
author | Jesse Luehrs <doy@tozt.net> | 2011-08-09 23:44:59 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2011-08-10 00:39:41 -0500 |
commit | ccd7b72f4ae12a3237b9dd4669286d5997a06016 (patch) | |
tree | dda4d0c9d4968d3ad47256f8634e8e2a92fe9b9f /vim | |
parent | 0ef873093574332dafd01348d76ac5369c75e7b7 (diff) | |
download | conf-ccd7b72f4ae12a3237b9dd4669286d5997a06016.tar.gz conf-ccd7b72f4ae12a3237b9dd4669286d5997a06016.zip |
add zencoding vim plugin
Diffstat (limited to 'vim')
-rw-r--r-- | vim/autoload/zencoding.vim | 2069 | ||||
-rw-r--r-- | vim/doc/tags | 37 | ||||
-rw-r--r-- | vim/doc/zencoding.txt | 383 | ||||
-rw-r--r-- | vim/plugin/zencoding.vim | 137 |
4 files changed, 2626 insertions, 0 deletions
diff --git a/vim/autoload/zencoding.vim b/vim/autoload/zencoding.vim new file mode 100644 index 0000000..ba9501c --- /dev/null +++ b/vim/autoload/zencoding.vim @@ -0,0 +1,2069 @@ +"============================================================================= +" zencoding.vim +" Author: Yasuhiro Matsumoto <mattn.jp@gmail.com> +" Last Change: 24-Feb-2011. + +let s:save_cpo = &cpo +set cpo&vim + +function! s:zen_getExpandos(type, key) + let expandos = s:zen_getResource(a:type, 'expandos', {}) + if has_key(expandos, a:key) + return expandos[a:key] + endif + return a:key +endfunction + +function! s:zen_useFilter(filters, filter) + for f in a:filters + if f == a:filter + return 1 + endif + endfor + return 0 +endfunction + +function! s:zen_isExtends(type, extend) + if a:type == a:extend + return 1 + endif + if !has_key(s:zen_settings, a:type) + return 0 + endif + if !has_key(s:zen_settings[a:type], 'extends') + return 0 + endif + let extends = s:zen_settings[a:type].extends + if type(extends) == 1 + let tmp = split(extends, '\s*,\s*') + unlet! extends + let extends = tmp + endif + for ext in extends + if a:extend == ext + return 1 + endif + endfor + return 0 +endfunction + +function! s:zen_parseIntoTree(abbr, type) + let abbr = a:abbr + let type = a:type + if !has_key(s:zen_settings, type) + let type = 'html' + endif + if len(type) == 0 | let type = 'html' | endif + + if has_key(s:zen_settings[type], 'indentation') + let indent = s:zen_settings[type].indentation + else + let indent = s:zen_settings.indentation + endif + + if s:zen_isExtends(type, "html") + let abbr = substitute(abbr, '\([a-zA-Z][a-zA-Z0-9]*\)+\([()]\|$\)', '\="(".s:zen_getExpandos(type, submatch(1)).")".submatch(2)', 'i') + let mx = '\([+>]\|<\+\)\{-}\s*\((*\)\{-}\s*\([@#.]\{-}[a-zA-Z\!][a-zA-Z0-9:\!\-]*\|{[^}]\+}\)\(\%(\%(#{[{}a-zA-Z0-9_\-\$]\+\|#[a-zA-Z0-9_\-\$]\+\)\|\%(\[[^\]]\+\]\)\|\%(\.{[{}a-zA-Z0-9_\-\$]\+\|\.[a-zA-Z0-9_\-\$]\+\)\)*\)\%(\({[^}]\+}\)\)\{0,1}\%(\s*\*\s*\([0-9]\+\)\s*\)\{0,1}\(\%(\s*)\%(\s*\*\s*[0-9]\+\s*\)\{0,1}\)*\)' + else + let mx = '\([+>]\|<\+\)\{-}\s*\((*\)\{-}\s*\([@#.]\{-}[a-zA-Z\!][a-zA-Z0-9:\!\+\-]*\|{[^}]\+}\)\(\%(\%(#{[{}a-zA-Z0-9_\-\$]\+\|#[a-zA-Z0-9_\-\$]\+\)\|\%(\[[^\]]\+\]\)\|\%(\.{[{}a-zA-Z0-9_\-\$]\+\|\.[a-zA-Z0-9_\-\$]\+\)\)*\)\%(\({[^}]\+}\)\)\{0,1}\%(\s*\*\s*\([0-9]\+\)\s*\)\{0,1}\(\%(\s*)\%(\s*\*\s*[0-9]\+\s*\)\{0,1}\)*\)' + endif + let root = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0 } + let parent = root + let last = root + let pos = [] + while len(abbr) + " parse line + let match = matchstr(abbr, mx) + let str = substitute(match, mx, '\0', 'ig') + let operator = substitute(match, mx, '\1', 'ig') + let block_start = substitute(match, mx, '\2', 'ig') + let tag_name = substitute(match, mx, '\3', 'ig') + let attributes = substitute(match, mx, '\4', 'ig') + let value = substitute(match, mx, '\5', 'ig') + let multiplier = 0 + substitute(match, mx, '\6', 'ig') + let block_end = substitute(match, mx, '\7', 'ig') + if len(str) == 0 + break + endif + if tag_name =~ '^#' + let attributes = tag_name . attributes + let tag_name = 'div' + endif + if tag_name =~ '^\.' + let attributes = tag_name . attributes + let tag_name = 'div' + endif + if multiplier <= 0 | let multiplier = 1 | endif + + " make default node + let current = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0 } + let current.name = tag_name + + " aliases + let aliases = s:zen_getResource(type, 'aliases', {}) + if has_key(aliases, tag_name) + let current.name = aliases[tag_name] + endif + + " snippets + let snippets = s:zen_getResource(type, 'snippets', {}) + if !empty(snippets) && has_key(snippets, tag_name) + let snippet = snippets[tag_name] + let snippet = substitute(snippet, '|', '${cursor}', 'g') + let lines = split(snippet, "\n") + call map(lines, 'substitute(v:val, "\\( \\|\\t\\)", indent, "g")') + let current.snippet = join(lines, "\n") + let current.name = '' + endif + + " default_attributes + let default_attributes = s:zen_getResource(type, 'default_attributes', {}) + if !empty(default_attributes) + for pat in [current.name, tag_name] + if has_key(default_attributes, pat) + if type(default_attributes[pat]) == 4 + let a = default_attributes[pat] + for k in keys(a) + let current.attr[k] = len(a[k]) ? substitute(a[k], '|', '${cursor}', 'g') : '${cursor}' + endfor + else + for a in default_attributes[pat] + for k in keys(a) + let current.attr[k] = len(a[k]) ? substitute(a[k], '|', '${cursor}', 'g') : '${cursor}' + endfor + endfor + endif + if has_key(s:zen_settings.html.default_attributes, current.name) + let current.name = substitute(current.name, ':.*$', '', '') + endif + break + endif + endfor + endif + + " parse attributes + if len(attributes) + let attr = attributes + while len(attr) + let item = matchstr(attr, '\(\%(\%(#[{}a-zA-Z0-9_\-\$]\+\)\|\%(\[[^\]]\+\]\)\|\%(\.[{}a-zA-Z0-9_\-\$]\+\)*\)\)') + if len(item) == 0 + break + endif + if item[0] == '#' + let current.attr.id = item[1:] + endif + if item[0] == '.' + let current.attr.class = substitute(item[1:], '\.', ' ', 'g') + endif + if item[0] == '[' + let atts = item[1:-2] + while len(atts) + let amat = matchstr(atts, '\(\w\+\%(="[^"]*"\|=''[^'']*''\|[^ ''"\]]*\)\{0,1}\)') + if len(amat) == 0 + break + endif + let key = split(amat, '=')[0] + let val = amat[len(key)+1:] + if val =~ '^["'']' + let val = val[1:-2] + endif + let current.attr[key] = val + let atts = atts[stridx(atts, amat) + len(amat):] + endwhile + endif + let attr = substitute(strpart(attr, len(item)), '^\s*', '', '') + endwhile + endif + + " parse text + if tag_name =~ '^{.*}$' + let current.name = '' + let current.value = tag_name + else + let current.value = value + endif + let current.multiplier = multiplier + + " parse step inside/outside + if !empty(last) + if operator =~ '>' + unlet! parent + let parent = last + let current.parent = last + let current.pos = last.pos + 1 + else + let current.parent = parent + let current.pos = last.pos + endif + else + let current.parent = parent + let current.pos = 1 + endif + if operator =~ '<' + for c in range(len(operator)) + let tmp = parent.parent + if empty(tmp) + break + endif + let parent = tmp + endfor + endif + + call add(parent.child, current) + let last = current + + " parse block + if block_start =~ '(' + if operator =~ '>' + let last.pos += 1 + endif + for n in range(len(block_start)) + let pos += [last.pos] + endfor + endif + if block_end =~ ')' + for n in split(substitute(substitute(block_end, ' ', '', 'g'), ')', ',),', 'g'), ',') + if n == ')' + if len(pos) > 0 && last.pos >= pos[-1] + for c in range(last.pos - pos[-1]) + let tmp = parent.parent + if !has_key(tmp, 'parent') + break + endif + let parent = tmp + endfor + if operator =~ '>' + call remove(pos, -1) + endif + let last = parent + let last.pos += 1 + endif + elseif len(n) + let cl = last.child + let cls = [] + for c in range(n[1:]) + let cls += cl + endfor + let last.child = cls + endif + endfor + endif + let abbr = abbr[stridx(abbr, match) + len(match):] + + if g:zencoding_debug > 1 + echo "str=".str + echo "block_start=".block_start + echo "tag_name=".tag_name + echo "operator=".operator + echo "attributes=".attributes + echo "value=".value + echo "multiplier=".multiplier + echo "block_end=".block_end + echo "abbr=".abbr + echo "pos=".string(pos) + echo "\n" + endif + endwhile + return root +endfunction + +function! s:zen_parseTag(tag) + let current = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0 } + let mx = '<\([a-zA-Z][a-zA-Z0-9]*\)\(\%(\s[a-zA-Z][a-zA-Z0-9]\+=\%([^"'' \t]\+\|["''][^"'']*["'']\)\s*\)*\)\(/\{0,1}\)>' + let match = matchstr(a:tag, mx) + let current.name = substitute(match, mx, '\1', 'i') + let attrs = substitute(match, mx, '\2', 'i') + let mx = '\([a-zA-Z0-9]\+\)=["'']\{0,1}\([^"'' \t]*\|[^"'']\+\)["'']\{0,1}' + while len(attrs) > 0 + let match = matchstr(attrs, mx) + if len(match) == 0 + break + endif + let name = substitute(match, mx, '\1', 'i') + let value = substitute(match, mx, '\2', 'i') + let current.attr[name] = value + let attrs = attrs[stridx(attrs, match) + len(match):] + endwhile + return current +endfunction + +function! s:zen_mergeConfig(lhs, rhs) + if type(a:lhs) == 3 && type(a:rhs) == 3 + let a:lhs += a:rhs + if len(a:lhs) + call remove(a:lhs, 0, len(a:lhs)-1) + endif + for rhi in a:rhs + call add(a:lhs, a:rhs[rhi]) + endfor + elseif type(a:lhs) == 4 && type(a:rhs) == 4 + for key in keys(a:rhs) + if type(a:rhs[key]) == 3 + if !has_key(a:lhs, key) + let a:lhs[key] = [] + endif + let a:lhs[key] += a:rhs[key] + elseif type(a:rhs[key]) == 4 + if has_key(a:lhs, key) + call s:zen_mergeConfig(a:lhs[key], a:rhs[key]) + else + let a:lhs[key] = a:rhs[key] + endif + else + let a:lhs[key] = a:rhs[key] + endif + endfor + endif +endfunction + + +function! s:zen_toString_haml(settings, current, type, inline, filters, itemno, indent) + let settings = a:settings + let current = a:current + let type = a:type + let inline = a:inline + let filters = a:filters + let itemno = a:itemno + let indent = a:indent + let str = "" + + let comment_indent = '' + let comment = '' + if len(current.name) > 0 + let str .= '%' . current.name + let tmp = '' + for attr in keys(current.attr) + let val = current.attr[attr] + if current.multiplier > 1 + while val =~ '\$\([^{]\|$\)' + let val = substitute(val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g') + endwhile + endif + if attr == 'id' + let str .= '#' . val + elseif attr == 'class' + let str .= '.' . substitute(val, ' ', '.', 'g') + else + if len(tmp) > 0 | let tmp .= ',' | endif + let tmp .= ' :' . attr . ' => "' . val . '"' + endif + endfor + if len(tmp) + let str .= '{' . tmp . ' }' + endif + if stridx(','.settings.html.empty_elements.',', ','.current.name.',') != -1 && len(current.value) == 0 + let str .= "/" + endif + + let inner = '' + if len(current.value) > 0 + let lines = split(current.value[1:-2], "\n") + let str .= " " . lines[0] + for line in lines[1:] + let str .= " |\n" . line + endfor + endif + if len(current.child) == 1 && len(current.child[0].name) == 0 + let lines = split(current.child[0].value[1:-2], "\n") + let str .= " " . lines[0] + for line in lines[1:] + let str .= " |\n" . line + endfor + elseif len(current.child) > 0 + for child in current.child + let inner .= s:zen_toString(child, type, inline, filters) + endfor + let inner = substitute(inner, "\n", "\n ", 'g') + let inner = substitute(inner, "\n $", "", 'g') + let str .= "\n " . inner + endif + endif + let str .= "\n" + return str +endfunction + +function! s:zen_toString_html(settings, current, type, inline, filters, itemno, indent) + let settings = a:settings + let current = a:current + let type = a:type + let inline = a:inline + let filters = a:filters + let itemno = a:itemno + let indent = a:indent + let str = "" + + let comment_indent = '' + let comment = '' + if s:zen_useFilter(filters, 'c') + let comment_indent = substitute(str, '^.*\(\s*\)$', '\1', '') + endif + let tmp = '<' . current.name + for attr in keys(current.attr) + if current.name =~ '^\(xsl:with-param\|xsl:variable\)$' && s:zen_useFilter(filters, 'xsl') && len(current.child) && attr == 'select' + continue + endif + let val = current.attr[attr] + if current.multiplier > 1 + while val =~ '\$\([^{]\|$\)' + let val = substitute(val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g') + endwhile + endif + let tmp .= ' ' . attr . '="' . val . '"' + if s:zen_useFilter(filters, 'c') + if attr == 'id' | let comment .= '#' . val | endif + if attr == 'class' | let comment .= '.' . val | endif + endif + endfor + if len(comment) > 0 + let tmp = "<!-- " . comment . " -->" . (inline ? "" : "\n") . comment_indent . tmp + endif + let str .= tmp + let inner = current.value[1:-2] + if stridx(','.settings.html.inline_elements.',', ','.current.name.',') != -1 + let child_inline = 1 + else + let child_inline = 0 + endif + for child in current.child + let html = s:zen_toString(child, type, child_inline, filters) + if child.name == 'br' + let inner = substitute(inner, '\n\s*$', '', '') + endif + let inner .= html + endfor + if len(current.child) == 1 && current.child[0].name == '' + if stridx(','.settings.html.inline_elements.',', ','.current.name.',') == -1 + let str .= ">" . inner . "</" . current.name . ">\n" + else + let str .= ">" . inner . "</" . current.name . ">" + endif + elseif len(current.child) + if inline == 0 + if stridx(','.settings.html.inline_elements.',', ','.current.name.',') == -1 + if inner =~ "\n$" + let inner = substitute(inner, "\n", "\n" . indent, 'g') + let inner = substitute(inner, indent . "$", "", 'g') + let str .= ">\n" . indent . inner . "</" . current.name . ">\n" + else + let str .= ">\n" . indent . inner . indent . "\n</" . current.name . ">\n" + endif + else + let str .= ">" . inner . "</" . current.name . ">\n" + endif + else + let str .= ">" . inner . "</" . current.name . ">" + endif + else + if inline == 0 + if stridx(','.settings.html.empty_elements.',', ','.current.name.',') != -1 + let str .= " />\n" + else + if stridx(','.settings.html.inline_elements.',', ','.current.name.',') == -1 && len(current.child) + let str .= ">\n" . inner . '${cursor}</' . current.name . ">\n" + else + let str .= ">" . inner . '${cursor}</' . current.name . ">\n" + endif + endif + else + if stridx(','.settings.html.empty_elements.',', ','.current.name.',') != -1 + let str .= " />" + else + let str .= ">" . inner . '${cursor}</' . current.name . ">" + endif + endif + endif + if len(comment) > 0 + let str .= "<!-- /" . comment . " -->" . (inline ? "" : "\n") . comment_indent + endif + return str +endfunction + +function! s:zen_toString(...) + let current = a:1 + if a:0 > 1 + let type = a:2 + else + let type = &ft + endif +" if !has_key(s:zen_settings, type) +" let type = 'html' +" endif + if len(type) == 0 | let type = 'html' | endif + if a:0 > 2 + let inline = a:3 + else + let inline = 0 + endif + if a:0 > 3 + if type(a:4) == 1 + let filters = split(a:4, '\s*,\s*') + else + let filters = a:4 + endif + else + let filters = ['html'] + endif + + if has_key(s:zen_settings, type) && has_key(s:zen_settings[type], 'indentation') + let indent = s:zen_settings[type].indentation + else + let indent = s:zen_settings.indentation + endif + let itemno = 0 + let str = '' + while itemno < current.multiplier + if len(current.name) + if exists('*g:zen_toString_'.type) + let str .= function('g:zen_toString_'.type)(s:zen_settings, current, type, inline, filters, itemno, indent) + elseif s:zen_useFilter(filters, 'haml') + let str .= s:zen_toString_haml(s:zen_settings, current, type, inline, filters, itemno, indent) + else + let str .= s:zen_toString_html(s:zen_settings, current, type, inline, filters, itemno, indent) + endif + else + let snippet = current.snippet + if len(current.snippet) == 0 + let snippets = s:zen_getResource(type, 'snippets', {}) + if !empty(snippets) && has_key(snippets, 'zensnippet') + let snippet = snippets['zensnippet'] + endif + endif + if len(snippet) > 0 + let tmp = substitute(snippet, '|', '${cursor}', 'g') + let tmp = substitute(tmp, '\${zenname}', current.name, 'g') + if type == 'css' && s:zen_useFilter(filters, 'fc') + let tmp = substitute(tmp, '^\([^:]\+\):\(.*\)$', '\1: \2', '') + endif + for attr in keys(current.attr) + let val = current.attr[attr] + let tmp = substitute(tmp, '\${' . attr . '}', val, 'g') + endfor + let str .= tmp + else + if len(current.name) + let str .= current.name + endif + if len(current.value) + let str .= current.value[1:-2] + endif + endif + let inner = '' + if len(current.child) + for n in current.child + let inner .= s:zen_toString(n, type, inline, filters) + endfor + let inner = substitute(inner, "\n", "\n" . indent, 'g') + endif + let str = substitute(str, '\${child}', inner, '') + endif + let itemno = itemno + 1 + endwhile + if s:zen_useFilter(filters, 'e') + let str = substitute(str, '&', '\&', 'g') + let str = substitute(str, '<', '\<', 'g') + let str = substitute(str, '>', '\>', 'g') + endif + return str +endfunction + +function! s:zen_getResource(type, name, default) + if !has_key(s:zen_settings, a:type) + return a:default + endif + let ret = a:default + + if has_key(s:zen_settings[a:type], a:name) + call s:zen_mergeConfig(ret, s:zen_settings[a:type][a:name]) + endif + + if has_key(s:zen_settings[a:type], 'extends') + let extends = s:zen_settings[a:type].extends + if type(extends) == 1 + let tmp = split(extends, '\s*,\s*') + unlet! extends + let extends = tmp + endif + for ext in extends + if has_key(s:zen_settings, ext) && has_key(s:zen_settings[ext], a:name) + call s:zen_mergeConfig(ret, s:zen_settings[ext][a:name]) + endif + endfor + endif + return ret +endfunction + +function! s:zen_getFileType() + let type = &ft + if type == 'xslt' | let type = 'xsl' | endif + if type == 'htmldjango' | let type = 'html' | endif + if type == 'html.django_template' | let type = 'html' | endif + if synIDattr(synID(line("."), col("."), 1), "name") =~ '^css' + let type = 'css' + endif + if synIDattr(synID(line("."), col("."), 1), "name") =~ '^html' + let type = 'html' + endif + if synIDattr(synID(line("."), col("."), 1), "name") =~ '^xml' + let type = 'xml' + endif + if synIDattr(synID(line("."), col("."), 1), "name") =~ '^javaScript' + let type = 'javascript' + endif + if len(type) == 0 | let type = 'html' | endif + return type +endfunction + +function! zencoding#expandAbbr(mode) range + let type = s:zen_getFileType() + let expand = '' + let filters = ['html'] + let line = '' + let part = '' + let rest = '' + + if has_key(s:zen_settings, type) && has_key(s:zen_settings[type], 'filters') + let filters = split(s:zen_settings[type].filters, '\s*,\s*') + endif + + if a:mode == 2 + let leader = substitute(input('Tag: ', ''), '^\s*\(.*\)\s*$', '\1', 'g') + if len(leader) == 0 + return + endif + let mx = '|\(\%(html\|haml\|e\|c\|fc\|xsl\)\s*,\{0,1}\s*\)*$' + if leader =~ mx + let filters = split(matchstr(leader, mx)[1:], '\s*,\s*') + let leader = substitute(leader, mx, '', '') + endif + if leader =~ '\*' + let query = substitute(leader, '*', '*' . (a:lastline - a:firstline + 1), '') . '>{$line$}' + let items = s:zen_parseIntoTree(query, type).child + for item in items + let expand .= s:zen_toString(item, type, 0, filters) + endfor + let line = getline(a:firstline) + let part = substitute(line, '^\s*', '', '') + for n in range(a:firstline, a:lastline) + let lline = getline(n) + let lpart = substitute(lline, '^\s*', '', '') + let pos = stridx(expand, "$line$") + if pos != -1 + let expand = expand[:pos-1] . lpart . expand[pos+6:] + endif + endfor + let expand = substitute(expand, '\$line\$', '', 'g') + else + let str = '' + if a:firstline != a:lastline + let line = getline(a:firstline) + let part = substitute(line, '^\s*', '', '') + for n in range(a:firstline, a:lastline) + if len(leader) > 0 + let str .= getline(n) . "\n" + else + let lpart = substitute(getline(n), '^\s*', '', '') + let str .= lpart . "\n" + endif + endfor + if len(leader) + let items = s:zen_parseIntoTree(leader, type).child + let items[0].value = "{\n".str."}" + else + let items = s:zen_parseIntoTree(leader, type).child + let items[0].value = "{".str."}" + endif + else + let str .= getline(a:firstline) + let items = s:zen_parseIntoTree(leader, type).child + let items[0].value = "{".str."}" + endif + for item in items + let expand .= s:zen_toString(item, type, 0, filters) + endfor + endif + silent! exe "normal! gvc" + else + let line = getline('.') + if col('.') < len(line) + let line = matchstr(line, '^\(.*\%'.col('.').'c.\)') + endif + if a:mode == 1 + let part = matchstr(line, '\([a-zA-Z0-9_\@:|]\+\)$') + else + let part = matchstr(line, '\(\S.*\)$') + while part =~ '<.*>' + let part = substitute(part, '<.\{-}>', '', '') + endwhile + endif + let rest = getline('.')[len(line):] + let str = part + let mx = '|\(\%(html\|haml\|e\|c\|fc\|xsl\)\s*,\{0,1}\s*\)*$' + if str =~ mx + let filters = split(matchstr(str, mx)[1:], '\s*,\s*') + let str = substitute(str, mx, '', '') + endif + let items = s:zen_parseIntoTree(str, type).child + for item in items + let expand .= s:zen_toString(item, type, 0, filters) + endfor + endif + if len(expand) + if expand !~ '\${cursor}' + if a:mode == 2 | + let expand = '${cursor}' . expand + else + let expand .= '${cursor}' + endif + endif + let expand = substitute(expand, '${lang}', s:zen_settings.lang, 'g') + let expand = substitute(expand, '${charset}', s:zen_settings.charset, 'g') + let expand = substitute(expand, '\${cursor}', '$cursor$', '') + let expand = substitute(expand, '\${cursor}', '', 'g') + if has_key(s:zen_settings, 'timezone') && len(s:zen_settings.timezone) + let expand = substitute(expand, '${datetime}', strftime("%Y-%m-%dT%H:%M:%S") . s:zen_settings.timezone, 'g') + else + " TODO: on windows, %z/%Z is 'Tokyo(Standard)' + let expand = substitute(expand, '${datetime}', strftime("%Y-%m-%dT%H:%M:%S %z"), 'g') + endif + if line[:-len(part)-1] =~ '^\s\+$' + let indent = line[:-len(part)-1] + else + let indent = '' + endif + let expand = substitute(expand, '\n\s*$', '', 'g') + let expand = line[:-len(part)-1] . substitute(expand, "\n", "\n" . indent, 'g') . rest + let lines = split(expand, '\n') + call setline(line('.'), lines[0]) + if len(lines) > 1 + call append(line('.'), lines[1:]) + endif + endif + silent! exe "normal! ".len(part)."h" + if search('\$cursor\$', 'e') + let oldselection = &selection + let &selection = 'inclusive' + silent! exe "normal! v7h\"_s" + let &selection = oldselection + endif + if g:zencoding_debug > 1 + call getchar() + endif +endfunction + +function! zencoding#moveNextPrev(flag) + if search('><\/\|\(""\)\|^\s*$', a:flag ? 'Wpb' : 'Wp') == 3 + startinsert! + else + silent! normal! l + startinsert + endif +endfunction + +function! zencoding#imageSize() + let img_region = s:search_region('<img\s', '>') + if !s:region_is_valid(img_region) || !s:cursor_in_region(img_region) + return + endif + let content = s:get_content(img_region) + if content !~ '^<img[^><]\+>$' + return + endif + let current = s:zen_parseTag(content) + let fn = current.attr.src + if fn !~ '^\(/\|http\)' + let fn = simplify(expand('%:h') . '/' . fn) + endif + let [type, width, height] = ['', -1, -1] + + if filereadable(fn) + let hex = substitute(system('xxd -p "'.fn.'"'), '\n', '', 'g') + else + let hex = substitute(system('curl -s "'.fn.'" | xxd -p'), '\n', '', 'g') + endif + + if hex =~ '^89504e470d0a1a0a' + let type = 'png' + let width = eval('0x'.hex[32:39]) + let height = eval('0x'.hex[40:47]) + endif + if hex =~ '^ffd8' + let pos = match(hex, 'ffc[02]') + let type = 'jpg' + let height = eval('0x'.hex[pos+10:pos+11])*256 + eval('0x'.hex[pos+12:pos+13]) + let width = eval('0x'.hex[pos+14:pos+15])*256 + eval('0x'.hex[pos+16:pos+17]) + endif + if hex =~ '^47494638' + let type = 'gif' + let width = eval('0x'.hex[14:15].hex[12:13]) + let height = eval('0x'.hex[18:19].hex[16:17]) + endif + + if width == -1 && height == -1 + return + endif + let current.attr.width = width + let current.attr.height = height + let html = s:zen_toString(current, 'html', 1) + call s:change_content(img_region, html) +endfunction + +function! zencoding#toggleComment() + if s:zen_getFileType() == 'css' + let line = getline('.') + let mx = '^\(\s*\)/\*\s*\(.*\)\s*\*/\s*$' + if line =~ mx + let space = substitute(matchstr(line, mx), mx, '\1', '') + let line = substitute(matchstr(line, mx), mx, '\2', '') + let line = space . substitute(line, '^\s*\|\s*$', '\1', 'g') + else + let mx = '^\(\s*\)\(.*\)\s*$' + let line = substitute(line, mx, '\1/* \2 */', '') + endif + call setline('.', line) + return + endif + + let curpos = getpos('.') + while 1 + let mx = '<\(/\{0,1}[a-zA-Z][a-zA-Z0-9]*\)[^>]*>' + let pos1 = searchpos(mx, 'bcnW') + let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx) + let tag_name = substitute(content, '^<\(/\{0,1}[a-zA-Z0-9]*\).*$', '\1', '') + let block = [pos1, [pos1[0], pos1[1] + len(content) - 1]] + if content[-2:] == '/>' && s:point_in_region(curpos[1:2], block) + let comment_region = s:search_region('<!--', '-->') + if !s:region_is_valid(comment_region) || !s:point_in_region(curpos[1:2], comment_region) || !(s:point_in_region(comment_region[0], block) && s:point_in_region(comment_region[1], block)) + let content = '<!-- ' . s:get_content(block) . ' -->' + call s:change_content(block, content) + else + let content = s:get_content(comment_region) + let content = substitute(content, '^<!--\s\(.*\)\s-->$', '\1', '') + call s:change_content(comment_region, content) + endif + return + else + if tag_name[0] == '/' + let pos1 = searchpos('<' . tag_name[1:] . '[^a-zA-Z0-9]', 'bcnW') + call setpos('.', [0, pos1[0], pos1[1], 0]) + let pos2 = searchpos('</' . tag_name[1:] . '>', 'cneW') + else + let pos2 = searchpos('</' . tag_name . '>', 'cneW') + endif + let block = [pos1, pos2] + if !s:region_is_valid(block) + call setpos('.', curpos) + let block = s:search_region('<!', '-->') + if !s:region_is_valid(block) + return + endif + endif + if s:point_in_region(curpos[1:2], block) + let comment_region = s:search_region('<!--', '-->') + if !s:region_is_valid(comment_region) || !s:point_in_region(curpos[1:2], comment_region) || !(s:point_in_region(comment_region[0], block) && s:point_in_region(comment_region[1], block)) + let content = '<!-- ' . s:get_content(block) . ' -->' + call s:change_content(block, content) + else + let content = s:get_content(comment_region) + let content = substitute(content, '^<!--\s\(.*\)\s-->$', '\1', '') + call s:change_content(comment_region, content) + endif + return + else + if block[0][0] > 0 + call setpos('.', [0, block[0][0]-1, block[0][1], 0]) + else + call setpos('.', curpos) + return + endif + endif + endif + endwhile +endfunction + +function! zencoding#splitJoinTag() + let curpos = getpos('.') + while 1 + let mx = '<\(/\{0,1}[a-zA-Z][a-zA-Z0-9]*\)[^>]*>' + let pos1 = searchpos(mx, 'bcnW') + let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx) + let tag_name = substitute(content, '^<\(/\{0,1}[a-zA-Z0-9]*\).*$', '\1', '') + let block = [pos1, [pos1[0], pos1[1] + len(content) - 1]] + if content[-2:] == '/>' && s:cursor_in_region(block) + let content = content[:-3] . "></" . tag_name . '>' + call s:change_content(block, content) + call setpos('.', [0, block[0][0], block[0][1], 0]) + return + else + if tag_name[0] == '/' + let pos1 = searchpos('<' . tag_name[1:] . '[^a-zA-Z0-9]', 'bcnW') + call setpos('.', [0, pos1[0], pos1[1], 0]) + let pos2 = searchpos('</' . tag_name[1:] . '>', 'cneW') + else + let pos2 = searchpos('</' . tag_name . '>', 'cneW') + endif + let block = [pos1, pos2] + let content = s:get_content(block) + if s:point_in_region(curpos[1:2], block) && content[1:] !~ '<' . tag_name . '[^a-zA-Z0-9]*[^>]*>' + let content = matchstr(content, mx)[:-2] . '/>' + call s:change_content(block, content) + call setpos('.', [0, block[0][0], block[0][1], 0]) + return + else + if block[0][0] > 0 + call setpos('.', [0, block[0][0]-1, block[0][1], 0]) + else + call setpos('.', curpos) + return + endif + endif + endif + endwhile +endfunction + +function! zencoding#removeTag() + let curpos = getpos('.') + while 1 + let mx = '<\(/\{0,1}[a-zA-Z][a-zA-Z0-9]*\)[^>]*>' + let pos1 = searchpos(mx, 'bcnW') + let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx) + let tag_name = substitute(content, '^<\(/\{0,1}[a-zA-Z0-9]*\).*$', '\1', '') + let block = [pos1, [pos1[0], pos1[1] + len(content) - 1]] + if content[-2:] == '/>' && s:cursor_in_region(block) + call s:change_content(block, '') + call setpos('.', [0, block[0][0], block[0][1], 0]) + return + else + if tag_name[0] == '/' + let pos1 = searchpos('<' . tag_name[1:] . '[^a-zA-Z0-9]', 'bcnW') + call setpos('.', [0, pos1[0], pos1[1], 0]) + let pos2 = searchpos('</' . tag_name[1:] . '>', 'cneW') + else + let pos2 = searchpos('</' . tag_name . '>', 'cneW') + endif + let block = [pos1, pos2] + let content = s:get_content(block) + if s:point_in_region(curpos[1:2], block) && content[1:] !~ '<' . tag_name . '[^a-zA-Z0-9]*[^>]*>' + call s:change_content(block, '') + call setpos('.', [0, block[0][0], block[0][1], 0]) + return + else + if block[0][0] > 0 + call setpos('.', [0, block[0][0]-1, block[0][1], 0]) + else + call setpos('.', curpos) + return + endif + endif + endif + endwhile +endfunction + +function! zencoding#balanceTag(flag) range + let vblock = s:get_visualblock() + if a:flag == -2 || a:flag == 2 + let curpos = [0, line("'<"), col("'<"), 0] + else + let curpos = getpos('.') + endif + while 1 + let mx = '<\(/\{0,1}[a-zA-Z][a-zA-Z0-9]*\)[^>]*>' + let pos1 = searchpos(mx, (a:flag == -2 ? 'nW' : 'bcnW')) + let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx) + let tag_name = substitute(content, '^<\(/\{0,1}[a-zA-Z0-9]*\).*$', '\1', '') + let block = [pos1, [pos1[0], pos1[1] + len(content) - 1]] + if !s:region_is_valid(block) + break + endif + if content[-2:] == '/>' && s:point_in_region(curpos[1:2], block) + call s:select_region(block) + return + else + if tag_name[0] == '/' + let pos1 = searchpos('<' . tag_name[1:] . '[^a-zA-Z0-9]', a:flag == -2 ? 'nW' : 'bcnW') + if pos1[0] == 0 + break + endif + call setpos('.', [0, pos1[0], pos1[1], 0]) + let pos2 = searchpos('</' . tag_name[1:] . '>', 'cneW') + else + let pos2 = searchpos('</' . tag_name . '>', 'cneW') + endif + let block = [pos1, pos2] + if !s:region_is_valid(block) + break + endif + let content = s:get_content(block) + if a:flag == -2 + let check = s:region_in_region(vblock, block) && content[1:] !~ '<' . tag_name . '[^a-zA-Z0-9]*[^>]*>' + else + let check = s:point_in_region(curpos[1:2], block) && content[1:] !~ '<' . tag_name . '[^a-zA-Z0-9]*[^>]*>' + endif + if check + if a:flag < 0 + let l = getline(pos1[0]) + let content = matchstr(l[pos1[1]-1:], mx) + if pos1[1] + len(content) > len(l) + let pos1[0] += 1 + else + let pos1[1] += len(content) + endif + let pos2 = searchpos('\(\n\|.\)</' . tag_name . '>', 'cnW') + else + let pos2 = searchpos('</' . tag_name . '>', 'cneW') + endif + let block = [pos1, pos2] + call s:select_region(block) + return + else + if s:region_is_valid(block) + if a:flag == -2 + if setpos('.', [0, block[0][0]+1, block[0][1], 0]) == -1 + break + endif + else + if setpos('.', [0, block[0][0]-1, block[0][1], 0]) == -1 + break + endif + endif + else + break + endif + endif + endif + endwhile + if a:flag == -2 || a:flag == 2 + silent! exe "normal! gv" + else + call setpos('.', curpos) + endif +endfunction + +function! zencoding#anchorizeURL(flag) + let mx = 'https\=:\/\/[-!#$%&*+,./:;=?@0-9a-zA-Z_~]\+' + let pos1 = searchpos(mx, 'bcnW') + let url = matchstr(getline(pos1[0])[pos1[1]-1:], mx) + let block = [pos1, [pos1[0], pos1[1] + len(url) - 1]] + if !s:cursor_in_region(block) + return + endif + + let content = s:get_content_from_url(url) + let content = substitute(content, '\n', '', 'g') + let content = substitute(content, '\n\s*\n', '\n', 'g') + let head = strpart(content, 0, stridx(content, '</head>')) + let title = substitute(head, '.*<title[^>]*>\([^<]\+\)<\/title[^>]*>.*', '\1', 'g') + + if a:flag == 0 + let a = s:zen_parseTag('<a>') + let a.attr.href = url + let a.value = '{' . title . '}' + let expand = s:zen_toString(a, 'html', 0, []) + let expand = substitute(expand, '\${cursor}', '', 'g') + else + let body = s:get_text_from_html(content) + let body = '{' . substitute(body, '^\(.\{0,100}\).*', '\1', '') . '...}' + + let blockquote = s:zen_parseTag('<blockquote class="quote">') + let a = s:zen_parseTag('<a>') + let a.attr.href = url + let a.value = '{' . title . '}' + call add(blockquote.child, a) + call add(blockquote.child, s:zen_parseTag('<br/>')) + let p = s:zen_parseTag('<p>') + let p.value = body + call add(blockquote.child, p) + let cite = s:zen_parseTag('<cite>') + let cite.value = '{' . url . '}' + call add(blockquote.child, cite) + let expand = s:zen_toString(blockquote, 'html', 0, []) + let expand = substitute(expand, '\${cursor}', '', 'g') + let indent = substitute(getline('.'), '^\(\s*\).*', '\1', '') + let expand = substitute(expand, "\n", "\n" . indent, 'g') + endif + call s:change_content(block, expand) +endfunction + +"============================================================================== +" html utils +"============================================================================== +function! s:get_content_from_url(url) + silent! new + silent! exec '0r!curl -s -L "'.substitute(a:url, '#.*', '', '').'"' + let ret = join(getline(1, '$'), "\n") + silent! bw! + return ret +endfunction + +function! s:get_text_from_html(buf) + let threshold_len = 100 + let threshold_per = 0.1 + let buf = a:buf + + let buf = substitute(buf, '<!--.\{-}-->', '', 'g') + let buf = strpart(buf, stridx(buf, '</head>')) + let buf = substitute(buf, '<style[^>]*>.\{-}</style>', '', 'g') + let buf = substitute(buf, '<script[^>]*>.\{-}</script>', '', 'g') + let res = '' + let max = 0 + let mx = '\(<td[^>]\{-}>\)\|\(<\/td>\)\|\(<div[^>]\{-}>\)\|\(<\/div>\)' + let m = split(buf, mx) + for str in m + let c = split(str, '<[^>]*?>') + let str = substitute(str, '<[^>]\{-}>', '', 'g') + let str = substitute(str, '>', '>', 'g') + let str = substitute(str, '<', '<', 'g') + let str = substitute(str, '"', '"', 'g') + let str = substitute(str, ''', "'", 'g') + let str = substitute(str, ' ', ' ', 'g') + let str = substitute(str, '¥', '\¥', 'g') + let str = substitute(str, '&', '\&', 'g') + let str = substitute(str, '^\s*\(.*\)\s*$', '\1', '') + let str = substitute(str, '\s\+', ' ', 'g') + let l = len(str) + if l > threshold_len + let per = len(c) / l + if max < l && per < threshold_per + let max = l + let res = str + endif + endif + endfor + let res = substitute(res, '^\s*\(.*\)\s*$', '\1', 'g') + return res +endfunction +"============================================================================== + +"============================================================================== +" region utils +"============================================================================== +" delete_content : delete content in region +" if region make from between '<foo>' and '</foo>' +" -------------------- +" begin:<foo> +" </foo>:end +" -------------------- +" this function make the content as following +" -------------------- +" begin::end +" -------------------- +function! s:delete_content(region) + let lines = getline(a:region[0][0], a:region[1][0]) + call setpos('.', [0, a:region[0][0], a:region[0][1], 0]) + silent! exe "delete ".(a:region[1][0] - a:region[0][0]) + call setline(line('.'), lines[0][:a:region[0][1]-2] . lines[-1][a:region[1][1]]) +endfunction + +" change_content : change content in region +" if region make from between '<foo>' and '</foo>' +" -------------------- +" begin:<foo> +" </foo>:end +" -------------------- +" and content is +" -------------------- +" foo +" bar +" baz +" -------------------- +" this function make the content as following +" -------------------- +" begin:foo +" bar +" baz:end +" -------------------- +function! s:change_content(region, content) + let newlines = split(a:content, '\n') + let oldlines = getline(a:region[0][0], a:region[1][0]) + call setpos('.', [0, a:region[0][0], a:region[0][1], 0]) + silent! exe "delete ".(a:region[1][0] - a:region[0][0]) + if len(newlines) == 0 + let tmp = '' + if a:region[0][1] > 1 + let tmp = oldlines[0][:a:region[0][1]-2] + endif + if a:region[1][1] > 1 + let tmp .= oldlines[-1][a:region[1][1]:] + endif + call setline(line('.'), tmp) + elseif len(newlines) == 1 + if a:region[0][1] > 1 + let newlines[0] = oldlines[0][:a:region[0][1]-2] . newlines[0] + endif + if a:region[1][1] > 1 + let newlines[0] .= oldlines[-1][a:region[1][1]:] + endif + call setline(line('.'), newlines[0]) + else + if a:region[0][1] > 1 + let newlines[0] = oldlines[0][:a:region[0][1]-2] . newlines[0] + endif + if a:region[1][1] > 1 + let newlines[-1] .= oldlines[-1][a:region[1][1]:] + endif + call setline(line('.'), newlines[0]) + call append(line('.'), newlines[1:]) + endif +endfunction + +" select_region : select region +" this function make a selection of region +function! s:select_region(region) + call setpos('.', [0, a:region[1][0], a:region[1][1], 0]) + normal! v + call setpos('.', [0, a:region[0][0], a:region[0][1], 0]) +endfunction + +" point_in_region : check point is in the region +" this function return 0 or 1 +function! s:point_in_region(point, region) + if !s:region_is_valid(a:region) | return 0 | endif + if a:region[0][0] > a:point[0] | return 0 | endif + if a:region[1][0] < a:point[0] | return 0 | endif + if a:region[0][0] == a:point[0] && a:region[0][1] > a:point[1] | return 0 | endif + if a:region[1][0] == a:point[0] && a:region[1][1] < a:point[1] | return 0 | endif + return 1 +endfunction + +" cursor_in_region : check cursor is in the region +" this function return 0 or 1 +function! s:cursor_in_region(region) + if !s:region_is_valid(a:region) | return 0 | endif + let cur = getpos('.')[1:2] + return s:point_in_region(cur, a:region) +endfunction + +" region_is_valid : check region is valid +" this function return 0 or 1 +function! s:region_is_valid(region) + if a:region[0][0] == 0 || a:region[1][0] == 0 | return 0 | endif + return 1 +endfunction + +" search_region : make region from pattern which is composing start/end +" this function return array of position +function! s:search_region(start, end) + return [searchpos(a:start, 'bcnW'), searchpos(a:end, 'cneW')] +endfunction + +" get_content : get content in region +" this function return string in region +function! s:get_content(region) + if !s:region_is_valid(a:region) + return '' + endif + let lines = getline(a:region[0][0], a:region[1][0]) + if a:region[0][0] == a:region[1][0] + let lines[0] = lines[0][a:region[0][1]-1:a:region[1][1]-1] + else + let lines[0] = lines[0][a:region[0][1]-1:] + let lines[-1] = lines[-1][:a:region[1][1]-1] + endif + return join(lines, "\n") +endfunction + +" region_in_region : check region is in the region +" this function return 0 or 1 +function! s:region_in_region(outer, inner) + if !s:region_is_valid(a:inner) || !s:region_is_valid(a:outer) + return 0 + endif + return s:point_in_region(a:inner[0], a:outer) && s:point_in_region(a:inner[1], a:outer) +endfunction + +" get_visualblock : get region of visual block +" this function return region of visual block +function! s:get_visualblock() + return [[line("'<"), col("'<")], [line("'>"), col("'>")]] +endfunction +"============================================================================== + +function! zencoding#ExpandWord(abbr, type, orig) + let mx = '|\(\%(html\|haml\|e\|c\|fc\|xsl\)\s*,\{0,1}\s*\)*$' + let str = a:abbr + let type = a:type + + if len(type) == 0 | let type = 'html' | endif + if str =~ mx + let filters = split(matchstr(str, mx)[1:], '\s*,\s*') + let str = substitute(str, mx, '', '') + elseif has_key(s:zen_settings[a:type], 'filters') + let filters = split(s:zen_settings[a:type].filters, '\s*,\s*') + else + let filters = ['html'] + endif + let items = s:zen_parseIntoTree(str, a:type).child + let expand = '' + for item in items + let expand .= s:zen_toString(item, a:type, 0, filters) + endfor + if a:orig == 0 + let expand = substitute(expand, '\${lang}', s:zen_settings.lang, 'g') + let expand = substitute(expand, '\${charset}', s:zen_settings.charset, 'g') + let expand = substitute(expand, '\${cursor}', '', 'g') + endif + return expand +endfunction + +function! zencoding#CompleteTag(findstart, base) + if a:findstart + let line = getline('.') + let start = col('.') - 1 + while start > 0 && line[start - 1] =~ '[a-zA-Z0-9:\@]' + let start -= 1 + endwhile + return start + else + let type = s:zen_getFileType() + let res = [] + + let snippets = s:zen_getResource(type, 'snippets', {}) + for item in keys(snippets) + if stridx(item, a:base) != -1 + call add(res, substitute(item, '\${cursor}\||', '', 'g')) + endif + endfor + let aliases = s:zen_getResource(type, 'aliases', {}) + for item in values(aliases) + if stridx(item, a:base) != -1 + call add(res, substitute(item, '\${cursor}\||', '', 'g')) + endif + endfor + return res + endif +endfunction + +unlet! s:zen_settings +let s:zen_settings = { +\ 'indentation': "\t", +\ 'lang': "en", +\ 'charset': "UTF-8", +\ 'css': { +\ 'snippets': { +\ '@i': '@import url(|);', +\ '@m': "@media print {\n\t|\n}", +\ '@f': "@font-face {\n\tfont-family:|;\n\tsrc:url(|);\n}", +\ '!': '!important', +\ 'pos': 'position:|;', +\ 'pos:s': 'position:static;', +\ 'pos:a': 'position:absolute;', +\ 'pos:r': 'position:relative;', +\ 'pos:f': 'position:fixed;', +\ 't': 'top:|;', +\ 't:a': 'top:auto;', +\ 'r': 'right:|;', +\ 'r:a': 'right:auto;', +\ 'b': 'bottom:|;', +\ 'b:a': 'bottom:auto;', +\ 'l': 'left:|;', +\ 'l:a': 'left:auto;', +\ 'z': 'z-index:|;', +\ 'z:a': 'z-index:auto;', +\ 'fl': 'float:|;', +\ 'fl:n': 'float:none;', +\ 'fl:l': 'float:left;', +\ 'fl:r': 'float:right;', +\ 'cl': 'clear:|;', +\ 'cl:n': 'clear:none;', +\ 'cl:l': 'clear:left;', +\ 'cl:r': 'clear:right;', +\ 'cl:b': 'clear:both;', +\ 'd': 'display:|;', +\ 'd:n': 'display:none;', +\ 'd:b': 'display:block;', +\ 'd:i': 'display:inline;', +\ 'd:ib': 'display:inline-block;', +\ 'd:li': 'display:list-item;', +\ 'd:ri': 'display:run-in;', +\ 'd:cp': 'display:compact;', +\ 'd:tb': 'display:table;', +\ 'd:itb': 'display:inline-table;', +\ 'd:tbcp': 'display:table-caption;', +\ 'd:tbcl': 'display:table-column;', +\ 'd:tbclg': 'display:table-column-group;', +\ 'd:tbhg': 'display:table-header-group;', +\ 'd:tbfg': 'display:table-footer-group;', +\ 'd:tbr': 'display:table-row;', +\ 'd:tbrg': 'display:table-row-group;', +\ 'd:tbc': 'display:table-cell;', +\ 'd:rb': 'display:ruby;', +\ 'd:rbb': 'display:ruby-base;', +\ 'd:rbbg': 'display:ruby-base-group;', +\ 'd:rbt': 'display:ruby-text;', +\ 'd:rbtg': 'display:ruby-text-group;', +\ 'v': 'visibility:|;', +\ 'v:v': 'visibility:visible;', +\ 'v:h': 'visibility:hidden;', +\ 'v:c': 'visibility:collapse;', +\ 'ov': 'overflow:|;', +\ 'ov:v': 'overflow:visible;', +\ 'ov:h': 'overflow:hidden;', +\ 'ov:s': 'overflow:scroll;', +\ 'ov:a': 'overflow:auto;', +\ 'ovx': 'overflow-x:|;', +\ 'ovx:v': 'overflow-x:visible;', +\ 'ovx:h': 'overflow-x:hidden;', +\ 'ovx:s': 'overflow-x:scroll;', +\ 'ovx:a': 'overflow-x:auto;', +\ 'ovy': 'overflow-y:|;', +\ 'ovy:v': 'overflow-y:visible;', +\ 'ovy:h': 'overflow-y:hidden;', +\ 'ovy:s': 'overflow-y:scroll;', +\ 'ovy:a': 'overflow-y:auto;', +\ 'ovs': 'overflow-style:|;', +\ 'ovs:a': 'overflow-style:auto;', +\ 'ovs:s': 'overflow-style:scrollbar;', +\ 'ovs:p': 'overflow-style:panner;', +\ 'ovs:m': 'overflow-style:move;', +\ 'ovs:mq': 'overflow-style:marquee;', +\ 'zoo': 'zoom:1;', +\ 'cp': 'clip:|;', +\ 'cp:a': 'clip:auto;', +\ 'cp:r': 'clip:rect(|);', +\ 'bxz': 'box-sizing:|;', +\ 'bxz:cb': 'box-sizing:content-box;', +\ 'bxz:bb': 'box-sizing:border-box;', +\ 'bxsh': 'box-shadow:|;', +\ 'bxsh:n': 'box-shadow:none;', +\ 'bxsh:w': '-webkit-box-shadow:0 0 0 #000;', +\ 'bxsh:m': '-moz-box-shadow:0 0 0 0 #000;', +\ 'm': 'margin:|;', +\ 'm:a': 'margin:auto;', +\ 'm:0': 'margin:0;', +\ 'm:2': 'margin:0 0;', +\ 'm:3': 'margin:0 0 0;', +\ 'm:4': 'margin:0 0 0 0;', +\ 'mt': 'margin-top:|;', +\ 'mt:a': 'margin-top:auto;', +\ 'mr': 'margin-right:|;', +\ 'mr:a': 'margin-right:auto;', +\ 'mb': 'margin-bottom:|;', +\ 'mb:a': 'margin-bottom:auto;', +\ 'ml': 'margin-left:|;', +\ 'ml:a': 'margin-left:auto;', +\ 'p': 'padding:|;', +\ 'p:0': 'padding:0;', +\ 'p:2': 'padding:0 0;', +\ 'p:3': 'padding:0 0 0;', +\ 'p:4': 'padding:0 0 0 0;', +\ 'pt': 'padding-top:|;', +\ 'pr': 'padding-right:|;', +\ 'pb': 'padding-bottom:|;', +\ 'pl': 'padding-left:|;', +\ 'w': 'width:|;', +\ 'w:a': 'width:auto;', +\ 'h': 'height:|;', +\ 'h:a': 'height:auto;', +\ 'maw': 'max-width:|;', +\ 'maw:n': 'max-width:none;', +\ 'mah': 'max-height:|;', +\ 'mah:n': 'max-height:none;', +\ 'miw': 'min-width:|;', +\ 'mih': 'min-height:|;', +\ 'o': 'outline:|;', +\ 'o:n': 'outline:none;', +\ 'oo': 'outline-offset:|;', +\ 'ow': 'outline-width:|;', +\ 'os': 'outline-style:|;', +\ 'oc': 'outline-color:#000;', +\ 'oc:i': 'outline-color:invert;', +\ 'bd': 'border:|;', +\ 'bd+': 'border:1px solid #000;', +\ 'bd:n': 'border:none;', +\ 'bdbk': 'border-break:|;', +\ 'bdbk:c': 'border-break:close;', +\ 'bdcl': 'border-collapse:|;', +\ 'bdcl:c': 'border-collapse:collapse;', +\ 'bdcl:s': 'border-collapse:separate;', +\ 'bdc': 'border-color:#000;', +\ 'bdi': 'border-image:url(|);', +\ 'bdi:n': 'border-image:none;', +\ 'bdi:w': '-webkit-border-image:url(|) 0 0 0 0 stretch stretch;', +\ 'bdi:m': '-moz-border-image:url(|) 0 0 0 0 stretch stretch;', +\ 'bdti': 'border-top-image:url(|);', +\ 'bdti:n': 'border-top-image:none;', +\ 'bdri': 'border-right-image:url(|);', +\ 'bdri:n': 'border-right-image:none;', +\ 'bdbi': 'border-bottom-image:url(|);', +\ 'bdbi:n': 'border-bottom-image:none;', +\ 'bdli': 'border-left-image:url(|);', +\ 'bdli:n': 'border-left-image:none;', +\ 'bdci': 'border-corner-image:url(|);', +\ 'bdci:n': 'border-corner-image:none;', +\ 'bdci:c': 'border-corner-image:continue;', +\ 'bdtli': 'border-top-left-image:url(|);', +\ 'bdtli:n': 'border-top-left-image:none;', +\ 'bdtli:c': 'border-top-left-image:continue;', +\ 'bdtri': 'border-top-right-image:url(|);', +\ 'bdtri:n': 'border-top-right-image:none;', +\ 'bdtri:c': 'border-top-right-image:continue;', +\ 'bdbri': 'border-bottom-right-image:url(|);', +\ 'bdbri:n': 'border-bottom-right-image:none;', +\ 'bdbri:c': 'border-bottom-right-image:continue;', +\ 'bdbli': 'border-bottom-left-image:url(|);', +\ 'bdbli:n': 'border-bottom-left-image:none;', +\ 'bdbli:c': 'border-bottom-left-image:continue;', +\ 'bdf': 'border-fit:|;', +\ 'bdf:c': 'border-fit:clip;', +\ 'bdf:r': 'border-fit:repeat;', +\ 'bdf:sc': 'border-fit:scale;', +\ 'bdf:st': 'border-fit:stretch;', +\ 'bdf:ow': 'border-fit:overwrite;', +\ 'bdf:of': 'border-fit:overflow;', +\ 'bdf:sp': 'border-fit:space;', +\ 'bdl': 'border-left:|;', +\ 'bdl:a': 'border-length:auto;', +\ 'bdsp': 'border-spacing:|;', +\ 'bds': 'border-style:|;', +\ 'bds:n': 'border-style:none;', +\ 'bds:h': 'border-style:hidden;', +\ 'bds:dt': 'border-style:dotted;', +\ 'bds:ds': 'border-style:dashed;', +\ 'bds:s': 'border-style:solid;', +\ 'bds:db': 'border-style:double;', +\ 'bds:dtds': 'border-style:dot-dash;', +\ 'bds:dtdtds': 'border-style:dot-dot-dash;', +\ 'bds:w': 'border-style:wave;', +\ 'bds:g': 'border-style:groove;', +\ 'bds:r': 'border-style:ridge;', +\ 'bds:i': 'border-style:inset;', +\ 'bds:o': 'border-style:outset;', +\ 'bdw': 'border-width:|;', +\ 'bdt': 'border-top:|;', +\ 'bdt+': 'border-top:1px solid #000;', +\ 'bdt:n': 'border-top:none;', +\ 'bdtw': 'border-top-width:|;', +\ 'bdts': 'border-top-style:|;', +\ 'bdts:n': 'border-top-style:none;', +\ 'bdtc': 'border-top-color:#000;', +\ 'bdr': 'border-right:|;', +\ 'bdr+': 'border-right:1px solid #000;', +\ 'bdr:n': 'border-right:none;', +\ 'bdrw': 'border-right-width:|;', +\ 'bdrs': 'border-right-style:|;', +\ 'bdrs:n': 'border-right-style:none;', +\ 'bdrc': 'border-right-color:#000;', +\ 'bdb': 'border-bottom:|;', +\ 'bdb+': 'border-bottom:1px solid #000;', +\ 'bdb:n': 'border-bottom:none;', +\ 'bdbw': 'border-bottom-width:|;', +\ 'bdbs': 'border-bottom-style:|;', +\ 'bdbs:n': 'border-bottom-style:none;', +\ 'bdbc': 'border-bottom-color:#000;', +\ 'bdln': 'border-length:|;', +\ 'bdl+': 'border-left:1px solid #000;', +\ 'bdl:n': 'border-left:none;', +\ 'bdlw': 'border-left-width:|;', +\ 'bdls': 'border-left-style:|;', +\ 'bdls:n': 'border-left-style:none;', +\ 'bdlc': 'border-left-color:#000;', +\ 'bdrus': 'border-radius:|;', +\ 'bdtrrs': 'border-top-right-radius:|;', +\ 'bdtlrs': 'border-top-left-radius:|;', +\ 'bdbrrs': 'border-bottom-right-radius:|;', +\ 'bdblrs': 'border-bottom-left-radius:|;', +\ 'bg': 'background:|;', +\ 'bg+': 'background:#FFF url(|) 0 0 no-repeat;', +\ 'bg:n': 'background:none;', +\ 'bg:ie': 'filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=''|x.png'');', +\ 'bgc': 'background-color:#FFF;', +\ 'bgi': 'background-image:url(|);', +\ 'bgi:n': 'background-image:none;', +\ 'bgr': 'background-repeat:|;', +\ 'bgr:n': 'background-repeat:no-repeat;', +\ 'bgr:x': 'background-repeat:repeat-x;', +\ 'bgr:y': 'background-repeat:repeat-y;', +\ 'bga': 'background-attachment:|;', +\ 'bga:f': 'background-attachment:fixed;', +\ 'bga:s': 'background-attachment:scroll;', +\ 'bgp': 'background-position:0 0;', +\ 'bgpx': 'background-position-x:|;', +\ 'bgpy': 'background-position-y:|;', +\ 'bgbk': 'background-break:|;', +\ 'bgbk:bb': 'background-break:bounding-box;', +\ 'bgbk:eb': 'background-break:each-box;', +\ 'bgbk:c': 'background-break:continuous;', +\ 'bgcp': 'background-clip:|;', +\ 'bgcp:bb': 'background-clip:border-box;', +\ 'bgcp:pb': 'background-clip:padding-box;', +\ 'bgcp:cb': 'background-clip:content-box;', +\ 'bgcp:nc': 'background-clip:no-clip;', +\ 'bgo': 'background-origin:|;', +\ 'bgo:pb': 'background-origin:padding-box;', +\ 'bgo:bb': 'background-origin:border-box;', +\ 'bgo:cb': 'background-origin:content-box;', +\ 'bgz': 'background-size:|;', +\ 'bgz:a': 'background-size:auto;', +\ 'bgz:ct': 'background-size:contain;', +\ 'bgz:cv': 'background-size:cover;', +\ 'c': 'color:#000;', +\ 'tbl': 'table-layout:|;', +\ 'tbl:a': 'table-layout:auto;', +\ 'tbl:f': 'table-layout:fixed;', +\ 'cps': 'caption-side:|;', +\ 'cps:t': 'caption-side:top;', +\ 'cps:b': 'caption-side:bottom;', +\ 'ec': 'empty-cells:|;', +\ 'ec:s': 'empty-cells:show;', +\ 'ec:h': 'empty-cells:hide;', +\ 'lis': 'list-style:|;', +\ 'lis:n': 'list-style:none;', +\ 'lisp': 'list-style-position:|;', +\ 'lisp:i': 'list-style-position:inside;', +\ 'lisp:o': 'list-style-position:outside;', +\ 'list': 'list-style-type:|;', +\ 'list:n': 'list-style-type:none;', +\ 'list:d': 'list-style-type:disc;', +\ 'list:c': 'list-style-type:circle;', +\ 'list:s': 'list-style-type:square;', +\ 'list:dc': 'list-style-type:decimal;', +\ 'list:dclz': 'list-style-type:decimal-leading-zero;', +\ 'list:lr': 'list-style-type:lower-roman;', +\ 'list:ur': 'list-style-type:upper-roman;', +\ 'lisi': 'list-style-image:|;', +\ 'lisi:n': 'list-style-image:none;', +\ 'q': 'quotes:|;', +\ 'q:n': 'quotes:none;', +\ 'q:ru': 'quotes:''\00AB'' ''\00BB'' ''\201E'' ''\201C'';', +\ 'q:en': 'quotes:''\201C'' ''\201D'' ''\2018'' ''\2019'';', +\ 'ct': 'content:|;', +\ 'ct:n': 'content:normal;', +\ 'ct:oq': 'content:open-quote;', +\ 'ct:noq': 'content:no-open-quote;', +\ 'ct:cq': 'content:close-quote;', +\ 'ct:ncq': 'content:no-close-quote;', +\ 'ct:a': 'content:attr(|);', +\ 'ct:c': 'content:counter(|);', +\ 'ct:cs': 'content:counters(|);', +\ 'coi': 'counter-increment:|;', +\ 'cor': 'counter-reset:|;', +\ 'va': 'vertical-align:|;', +\ 'va:sup': 'vertical-align:super;', +\ 'va:t': 'vertical-align:top;', +\ 'va:tt': 'vertical-align:text-top;', +\ 'va:m': 'vertical-align:middle;', +\ 'va:bl': 'vertical-align:baseline;', +\ 'va:b': 'vertical-align:bottom;', +\ 'va:tb': 'vertical-align:text-bottom;', +\ 'va:sub': 'vertical-align:sub;', +\ 'ta': 'text-align:|;', +\ 'ta:l': 'text-align:left;', +\ 'ta:c': 'text-align:center;', +\ 'ta:r': 'text-align:right;', +\ 'tal': 'text-align-last:|;', +\ 'tal:a': 'text-align-last:auto;', +\ 'tal:l': 'text-align-last:left;', +\ 'tal:c': 'text-align-last:center;', +\ 'tal:r': 'text-align-last:right;', +\ 'td': 'text-decoration:|;', +\ 'td:n': 'text-decoration:none;', +\ 'td:u': 'text-decoration:underline;', +\ 'td:o': 'text-decoration:overline;', +\ 'td:l': 'text-decoration:line-through;', +\ 'te': 'text-emphasis:|;', +\ 'te:n': 'text-emphasis:none;', +\ 'te:ac': 'text-emphasis:accent;', +\ 'te:dt': 'text-emphasis:dot;', +\ 'te:c': 'text-emphasis:circle;', +\ 'te:ds': 'text-emphasis:disc;', +\ 'te:b': 'text-emphasis:before;', +\ 'te:a': 'text-emphasis:after;', +\ 'th': 'text-height:|;', +\ 'th:a': 'text-height:auto;', +\ 'th:f': 'text-height:font-size;', +\ 'th:t': 'text-height:text-size;', +\ 'th:m': 'text-height:max-size;', +\ 'ti': 'text-indent:|;', +\ 'ti:-': 'text-indent:-9999px;', +\ 'tj': 'text-justify:|;', +\ 'tj:a': 'text-justify:auto;', +\ 'tj:iw': 'text-justify:inter-word;', +\ 'tj:ii': 'text-justify:inter-ideograph;', +\ 'tj:ic': 'text-justify:inter-cluster;', +\ 'tj:d': 'text-justify:distribute;', +\ 'tj:k': 'text-justify:kashida;', +\ 'tj:t': 'text-justify:tibetan;', +\ 'to': 'text-outline:|;', +\ 'to+': 'text-outline:0 0 #000;', +\ 'to:n': 'text-outline:none;', +\ 'tr': 'text-replace:|;', +\ 'tr:n': 'text-replace:none;', +\ 'tt': 'text-transform:|;', +\ 'tt:n': 'text-transform:none;', +\ 'tt:c': 'text-transform:capitalize;', +\ 'tt:u': 'text-transform:uppercase;', +\ 'tt:l': 'text-transform:lowercase;', +\ 'tw': 'text-wrap:|;', +\ 'tw:n': 'text-wrap:normal;', +\ 'tw:no': 'text-wrap:none;', +\ 'tw:u': 'text-wrap:unrestricted;', +\ 'tw:s': 'text-wrap:suppress;', +\ 'tsh': 'text-shadow:|;', +\ 'tsh+': 'text-shadow:0 0 0 #000;', +\ 'tsh:n': 'text-shadow:none;', +\ 'lh': 'line-height:|;', +\ 'whs': 'white-space:|;', +\ 'whs:n': 'white-space:normal;', +\ 'whs:p': 'white-space:pre;', +\ 'whs:nw': 'white-space:nowrap;', +\ 'whs:pw': 'white-space:pre-wrap;', +\ 'whs:pl': 'white-space:pre-line;', +\ 'whsc': 'white-space-collapse:|;', +\ 'whsc:n': 'white-space-collapse:normal;', +\ 'whsc:k': 'white-space-collapse:keep-all;', +\ 'whsc:l': 'white-space-collapse:loose;', +\ 'whsc:bs': 'white-space-collapse:break-strict;', +\ 'whsc:ba': 'white-space-collapse:break-all;', +\ 'wob': 'word-break:|;', +\ 'wob:n': 'word-break:normal;', +\ 'wob:k': 'word-break:keep-all;', +\ 'wob:l': 'word-break:loose;', +\ 'wob:bs': 'word-break:break-strict;', +\ 'wob:ba': 'word-break:break-all;', +\ 'wos': 'word-spacing:|;', +\ 'wow': 'word-wrap:|;', +\ 'wow:nm': 'word-wrap:normal;', +\ 'wow:n': 'word-wrap:none;', +\ 'wow:u': 'word-wrap:unrestricted;', +\ 'wow:s': 'word-wrap:suppress;', +\ 'lts': 'letter-spacing:|;', +\ 'f': 'font:|;', +\ 'f+': 'font:1em Arial,sans-serif;', +\ 'fw': 'font-weight:|;', +\ 'fw:n': 'font-weight:normal;', +\ 'fw:b': 'font-weight:bold;', +\ 'fw:br': 'font-weight:bolder;', +\ 'fw:lr': 'font-weight:lighter;', +\ 'fs': 'font-style:|;', +\ 'fs:n': 'font-style:normal;', +\ 'fs:i': 'font-style:italic;', +\ 'fs:o': 'font-style:oblique;', +\ 'fv': 'font-variant:|;', +\ 'fv:n': 'font-variant:normal;', +\ 'fv:sc': 'font-variant:small-caps;', +\ 'fz': 'font-size:|;', +\ 'fza': 'font-size-adjust:|;', +\ 'fza:n': 'font-size-adjust:none;', +\ 'ff': 'font-family:|;', +\ 'ff:s': 'font-family:serif;', +\ 'ff:ss': 'font-family:sans-serif;', +\ 'ff:c': 'font-family:cursive;', +\ 'ff:f': 'font-family:fantasy;', +\ 'ff:m': 'font-family:monospace;', +\ 'fef': 'font-effect:|;', +\ 'fef:n': 'font-effect:none;', +\ 'fef:eg': 'font-effect:engrave;', +\ 'fef:eb': 'font-effect:emboss;', +\ 'fef:o': 'font-effect:outline;', +\ 'fem': 'font-emphasize:|;', +\ 'femp': 'font-emphasize-position:|;', +\ 'femp:b': 'font-emphasize-position:before;', +\ 'femp:a': 'font-emphasize-position:after;', +\ 'fems': 'font-emphasize-style:|;', +\ 'fems:n': 'font-emphasize-style:none;', +\ 'fems:ac': 'font-emphasize-style:accent;', +\ 'fems:dt': 'font-emphasize-style:dot;', +\ 'fems:c': 'font-emphasize-style:circle;', +\ 'fems:ds': 'font-emphasize-style:disc;', +\ 'fsm': 'font-smooth:|;', +\ 'fsm:a': 'font-smooth:auto;', +\ 'fsm:n': 'font-smooth:never;', +\ 'fsm:aw': 'font-smooth:always;', +\ 'fst': 'font-stretch:|;', +\ 'fst:n': 'font-stretch:normal;', +\ 'fst:uc': 'font-stretch:ultra-condensed;', +\ 'fst:ec': 'font-stretch:extra-condensed;', +\ 'fst:c': 'font-stretch:condensed;', +\ 'fst:sc': 'font-stretch:semi-condensed;', +\ 'fst:se': 'font-stretch:semi-expanded;', +\ 'fst:e': 'font-stretch:expanded;', +\ 'fst:ee': 'font-stretch:extra-expanded;', +\ 'fst:ue': 'font-stretch:ultra-expanded;', +\ 'op': 'opacity:|;', +\ 'op:ie': 'filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);', +\ 'op:ms': '-ms-filter:''progid:DXImageTransform.Microsoft.Alpha(Opacity=100)'';', +\ 'rz': 'resize:|;', +\ 'rz:n': 'resize:none;', +\ 'rz:b': 'resize:both;', +\ 'rz:h': 'resize:horizontal;', +\ 'rz:v': 'resize:vertical;', +\ 'cur': 'cursor:|;', +\ 'cur:a': 'cursor:auto;', +\ 'cur:d': 'cursor:default;', +\ 'cur:c': 'cursor:crosshair;', +\ 'cur:ha': 'cursor:hand;', +\ 'cur:he': 'cursor:help;', +\ 'cur:m': 'cursor:move;', +\ 'cur:p': 'cursor:pointer;', +\ 'cur:t': 'cursor:text;', +\ 'pgbb': 'page-break-before:|;', +\ 'pgbb:au': 'page-break-before:auto;', +\ 'pgbb:al': 'page-break-before:always;', +\ 'pgbb:l': 'page-break-before:left;', +\ 'pgbb:r': 'page-break-before:right;', +\ 'pgbi': 'page-break-inside:|;', +\ 'pgbi:au': 'page-break-inside:auto;', +\ 'pgbi:av': 'page-break-inside:avoid;', +\ 'pgba': 'page-break-after:|;', +\ 'pgba:au': 'page-break-after:auto;', +\ 'pgba:al': 'page-break-after:always;', +\ 'pgba:l': 'page-break-after:left;', +\ 'pgba:r': 'page-break-after:right;', +\ 'orp': 'orphans:|;', +\ 'wid': 'widows:|;' +\ }, +\ 'filters': 'fc' +\ }, +\ 'html': { +\ 'snippets': { +\ 'cc:ie6': "<!--[if lte IE 6]>\n\t${child}|\n<![endif]-->", +\ 'cc:ie': "<!--[if IE]>\n\t${child}|\n<![endif]-->", +\ 'cc:noie': "<!--[if !IE]><!-->\n\t${child}|\n<!--<![endif]-->", +\ 'html:4t': "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n" +\ ."<html lang=\"${lang}\">\n" +\ ."<head>\n" +\ ." <meta http-equiv=\"Content-Type\" content=\"text/html;charset=${charset}\">\n" +\ ." <title></title>\n" +\ ."</head>\n" +\ ."<body>\n\t${child}|\n</body>\n" +\ ."</html>", +\ 'html:4s': "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n" +\ ."<html lang=\"${lang}\">\n" +\ ."<head>\n" +\ ." <meta http-equiv=\"Content-Type\" content=\"text/html;charset=${charset}\">\n" +\ ." <title></title>\n" +\ ."</head>\n" +\ ."<body>\n\t${child}|\n</body>\n" +\ ."</html>", +\ 'html:xt': "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" +\ ."<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"${lang}\">\n" +\ ."<head>\n" +\ ." <meta http-equiv=\"Content-Type\" content=\"text/html;charset=${charset}\" />\n" +\ ." <title></title>\n" +\ ."</head>\n" +\ ."<body>\n\t${child}|\n</body>\n" +\ ."</html>", +\ 'html:xs': "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n" +\ ."<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"${lang}\">\n" +\ ."<head>\n" +\ ." <meta http-equiv=\"Content-Type\" content=\"text/html;charset=${charset}\" />\n" +\ ." <title></title>\n" +\ ."</head>\n" +\ ."<body>\n\t${child}|\n</body>\n" +\ ."</html>", +\ 'html:xxs': "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n" +\ ."<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"${lang}\">\n" +\ ."<head>\n" +\ ." <meta http-equiv=\"Content-Type\" content=\"text/html;charset=${charset}\" />\n" +\ ." <title></title>\n" +\ ."</head>\n" +\ ."<body>\n\t${child}|\n</body>\n" +\ ."</html>", +\ 'html:5': "<!DOCTYPE HTML>\n" +\ ."<html lang=\"${lang}\">\n" +\ ."<head>\n" +\ ." <meta charset=\"${charset}\">\n" +\ ." <title></title>\n" +\ ."</head>\n" +\ ."<body>\n\t${child}|\n</body>\n" +\ ."</html>" +\ }, +\ 'default_attributes': { +\ 'a': {'href': ''}, +\ 'a:link': {'href': 'http://|'}, +\ 'a:mail': {'href': 'mailto:|'}, +\ 'abbr': {'title': ''}, +\ 'acronym': {'title': ''}, +\ 'base': {'href': ''}, +\ 'bdo': {'dir': ''}, +\ 'bdo:r': {'dir': 'rtl'}, +\ 'bdo:l': {'dir': 'ltr'}, +\ 'del': {'datetime': '${datetime}'}, +\ 'ins': {'datetime': '${datetime}'}, +\ 'link:css': [{'rel': 'stylesheet'}, {'type': 'text/css'}, {'href': '|style.css'}, {'media': 'all'}], +\ 'link:print': [{'rel': 'stylesheet'}, {'type': 'text/css'}, {'href': '|print.css'}, {'media': 'print'}], +\ 'link:favicon': [{'rel': 'shortcut icon'}, {'type': 'image/x-icon'}, {'href': '|favicon.ico'}], +\ 'link:touch': [{'rel': 'apple-touch-icon'}, {'href': '|favicon.png'}], +\ 'link:rss': [{'rel': 'alternate'}, {'type': 'application/rss+xml'}, {'title': 'RSS'}, {'href': '|rss.xml'}], +\ 'link:atom': [{'rel': 'alternate'}, {'type': 'application/atom+xml'}, {'title': 'Atom'}, {'href': 'atom.xml'}], +\ 'meta:utf': [{'http-equiv': 'Content-Type'}, {'content': 'text/html;charset=UTF-8'}], +\ 'meta:win': [{'http-equiv': 'Content-Type'}, {'content': 'text/html;charset=Win-1251'}], +\ 'meta:compat': [{'http-equiv': 'X-UA-Compatible'}, {'content': 'IE=7'}], +\ 'style': {'type': 'text/css'}, +\ 'script': {'type': 'text/javascript'}, +\ 'script:src': [{'type': 'text/javascript'}, {'src': ''}], +\ 'img': [{'src': ''}, {'alt': ''}], +\ 'iframe': [{'src': ''}, {'frameborder': '0'}], +\ 'embed': [{'src': ''}, {'type': ''}], +\ 'object': [{'data': ''}, {'type': ''}], +\ 'param': [{'name': ''}, {'value': ''}], +\ 'map': {'name': ''}, +\ 'area': [{'shape': ''}, {'coords': ''}, {'href': ''}, {'alt': ''}], +\ 'area:d': [{'shape': 'default'}, {'href': ''}, {'alt': ''}], +\ 'area:c': [{'shape': 'circle'}, {'coords': ''}, {'href': ''}, {'alt': ''}], +\ 'area:r': [{'shape': 'rect'}, {'coords': ''}, {'href': ''}, {'alt': ''}], +\ 'area:p': [{'shape': 'poly'}, {'coords': ''}, {'href': ''}, {'alt': ''}], +\ 'link': [{'rel': 'stylesheet'}, {'href': ''}], +\ 'form': {'action': ''}, +\ 'form:get': {'action': '', 'method': 'get'}, +\ 'form:post': {'action': '', 'method': 'post'}, +\ 'form:upload': {'action': '', 'method': 'post', 'enctype': 'multipart/form-data'}, +\ 'label': {'for': ''}, +\ 'input': {'type': ''}, +\ 'input:hidden': [{'type': 'hidden'}, {'name': ''}], +\ 'input:h': [{'type': 'hidden'}, {'name': ''}], +\ 'input:text': [{'type': 'text'}, {'name': ''}, {'id': ''}], +\ 'input:t': [{'type': 'text'}, {'name': ''}, {'id': ''}], +\ 'input:search': [{'type': 'search'}, {'name': ''}, {'id': ''}], +\ 'input:email': [{'type': 'email'}, {'name': ''}, {'id': ''}], +\ 'input:url': [{'type': 'url'}, {'name': ''}, {'id': ''}], +\ 'input:password': [{'type': 'password'}, {'name': ''}, {'id': ''}], +\ 'input:p': [{'type': 'password'}, {'name': ''}, {'id': ''}], +\ 'input:datetime': [{'type': 'datetime'}, {'name': ''}, {'id': ''}], +\ 'input:date': [{'type': 'date'}, {'name': ''}, {'id': ''}], +\ 'input:datetime-local': [{'type': 'datetime-local'}, {'name': ''}, {'id': ''}], +\ 'input:month': [{'type': 'month'}, {'name': ''}, {'id': ''}], +\ 'input:week': [{'type': 'week'}, {'name': ''}, {'id': ''}], +\ 'input:time': [{'type': 'time'}, {'name': ''}, {'id': ''}], +\ 'input:number': [{'type': 'number'}, {'name': ''}, {'id': ''}], +\ 'input:color': [{'type': 'color'}, {'name': ''}, {'id': ''}], +\ 'input:checkbox': [{'type': 'checkbox'}, {'name': ''}, {'id': ''}], +\ 'input:c': [{'type': 'checkbox'}, {'name': ''}, {'id': ''}], +\ 'input:radio': [{'type': 'radio'}, {'name': ''}, {'id': ''}], +\ 'input:r': [{'type': 'radio'}, {'name': ''}, {'id': ''}], +\ 'input:range': [{'type': 'range'}, {'name': ''}, {'id': ''}], +\ 'input:file': [{'type': 'file'}, {'name': ''}, {'id': ''}], +\ 'input:f': [{'type': 'file'}, {'name': ''}, {'id': ''}], +\ 'input:submit': [{'type': 'submit'}, {'value': ''}], +\ 'input:s': [{'type': 'submit'}, {'value': ''}], +\ 'input:image': [{'type': 'image'}, {'src': ''}, {'alt': ''}], +\ 'input:i': [{'type': 'image'}, {'src': ''}, {'alt': ''}], +\ 'input:reset': [{'type': 'reset'}, {'value': ''}], +\ 'input:button': [{'type': 'button'}, {'value': ''}], +\ 'input:b': [{'type': 'button'}, {'value': ''}], +\ 'select': [{'name': ''}, {'id': ''}], +\ 'option': {'value': ''}, +\ 'textarea': [{'name': ''}, {'id': ''}, {'cols': '30'}, {'rows': '10'}], +\ 'menu:context': {'type': 'context'}, +\ 'menu:c': {'type': 'context'}, +\ 'menu:toolbar': {'type': 'toolbar'}, +\ 'menu:t': {'type': 'toolbar'}, +\ 'video': {'src': ''}, +\ 'audio': {'src': ''}, +\ 'html:xml': [{'xmlns': 'http://www.w3.org/1999/xhtml'}, {'xml:lang': '${lang}'}] +\ }, +\ 'aliases': { +\ 'link:*': 'link', +\ 'meta:*': 'meta', +\ 'area:*': 'area', +\ 'bdo:*': 'bdo', +\ 'form:*': 'form', +\ 'input:*': 'input', +\ 'script:*': 'script', +\ 'html:*': 'html', +\ 'a:*': 'a', +\ 'menu:*': 'menu', +\ 'bq': 'blockquote', +\ 'acr': 'acronym', +\ 'fig': 'figure', +\ 'ifr': 'iframe', +\ 'emb': 'embed', +\ 'obj': 'object', +\ 'src': 'source', +\ 'cap': 'caption', +\ 'colg': 'colgroup', +\ 'fst': 'fieldset', +\ 'btn': 'button', +\ 'optg': 'optgroup', +\ 'opt': 'option', +\ 'tarea': 'textarea', +\ 'leg': 'legend', +\ 'sect': 'section', +\ 'art': 'article', +\ 'hdr': 'header', +\ 'ftr': 'footer', +\ 'adr': 'address', +\ 'dlg': 'dialog', +\ 'str': 'strong', +\ 'sty': 'style', +\ 'prog': 'progress', +\ 'fset': 'fieldset', +\ 'datag': 'datagrid', +\ 'datal': 'datalist', +\ 'kg': 'keygen', +\ 'out': 'output', +\ 'det': 'details', +\ 'cmd': 'command' +\ }, +\ 'expandos': { +\ 'ol': 'ol>li', +\ 'ul': 'ul>li', +\ 'dl': 'dl>dt+dd', +\ 'map': 'map>area', +\ 'table': 'table>tr>td', +\ 'colgroup': 'colgroup>col', +\ 'colg': 'colgroup>col', +\ 'tr': 'tr>td', +\ 'select': 'select>option', +\ 'optgroup': 'optgroup>option', +\ 'optg': 'optgroup>option' +\ }, +\ 'empty_elements': 'area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,keygen,command', +\ 'block_elements': 'address,applet,blockquote,button,center,dd,del,dir,div,dl,dt,fieldset,form,frameset,hr,iframe,ins,isindex,link,map,menu,noframes,noscript,object,ol,p,pre,script,table,tbody,td,tfoot,th,thead,tr,ul,h1,h2,h3,h4,h5,h6,style', +\ 'inline_elements': 'a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,small,span,strike,strong,sub,sup,textarea,tt,u,var', +\ }, +\ 'xsl': { +\ 'extends': 'html', +\ 'default_attributes': { +\ 'tmatch': [{'match': ''}, {'mode': ''}], +\ 'tname': [{'name': ''}], +\ 'xsl:when': {'test': ''}, +\ 'var': [{'name': ''}, {'select': ''}], +\ 'vari': {'name': ''}, +\ 'if': {'test': ''}, +\ 'call': {'name': ''}, +\ 'attr': {'name': ''}, +\ 'wp': [{'name': ''}, {'select': ''}], +\ 'par': [{'name': ''}, {'select': ''}], +\ 'val': {'select': ''}, +\ 'co': {'select': ''}, +\ 'each': {'select': ''}, +\ 'ap': [{'select': ''}, {'mode': ''}] +\ }, +\ 'aliases': { +\ 'tmatch': 'xsl:template', +\ 'tname': 'xsl:template', +\ 'var': 'xsl:variable', +\ 'vari': 'xsl:variable', +\ 'if': 'xsl:if', +\ 'call': 'xsl:call-template', +\ 'wp': 'xsl:with-param', +\ 'par': 'xsl:param', +\ 'val': 'xsl:value-of', +\ 'attr': 'xsl:attribute', +\ 'co' : 'xsl:copy-of', +\ 'each' : 'xsl:for-each', +\ 'ap' : 'xsl:apply-templates' +\ }, +\ 'expandos': { +\ 'choose': 'xsl:choose>xsl:when+xsl:otherwise' +\ } +\ }, +\ 'haml': { +\ 'extends': 'html' +\ }, +\ 'xhtml': { +\ 'extends': 'html' +\ }, +\ 'mustache': { +\ 'extends': 'html' +\ } +\} + +if exists('g:user_zen_settings') + call s:zen_mergeConfig(s:zen_settings, g:user_zen_settings) +endif + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim:set et: diff --git a/vim/doc/tags b/vim/doc/tags index 64408a2..3cd29b5 100644 --- a/vim/doc/tags +++ b/vim/doc/tags @@ -42,6 +42,17 @@ :TCommentInline tcomment.txt /*:TCommentInline* :TCommentMaybeInline tcomment.txt /*:TCommentMaybeInline* :TCommentRight tcomment.txt /*:TCommentRight* +<C-Y>, zencoding.txt /*<C-Y>,* +<C-Y>/ zencoding.txt /*<C-Y>\/* +<C-Y>A zencoding.txt /*<C-Y>A* +<C-Y>D zencoding.txt /*<C-Y>D* +<C-Y>N zencoding.txt /*<C-Y>N* +<C-Y>a zencoding.txt /*<C-Y>a* +<C-Y>d zencoding.txt /*<C-Y>d* +<C-Y>i zencoding.txt /*<C-Y>i* +<C-Y>j zencoding.txt /*<C-Y>j* +<C-Y>k zencoding.txt /*<C-Y>k* +<C-Y>n zencoding.txt /*<C-Y>n* ExtractSnips() snipMate.txt /*ExtractSnips()* ExtractSnipsFile() snipMate.txt /*ExtractSnipsFile()* Filename() snipMate.txt /*Filename()* @@ -324,6 +335,7 @@ tcomment#OperatorLine() tcomment.txt /*tcomment#OperatorLine()* tcomment#OperatorLineAnyway() tcomment.txt /*tcomment#OperatorLineAnyway()* tcomment-maps tcomment.txt /*tcomment-maps* tcomment.txt tcomment.txt /*tcomment.txt* +v_<C-Y>, zencoding.txt /*v_<C-Y>,* v_[% matchit.txt /*v_[%* v_]% matchit.txt /*v_]%* v_a% matchit.txt /*v_a%* @@ -343,3 +355,28 @@ yankring-visual-example yankring.txt /*yankring-visual-example* yankring-window yankring.txt /*yankring-window* yankring-window-example yankring.txt /*yankring-window-example* yankring.txt yankring.txt /*yankring.txt* +zencoding zencoding.txt /*zencoding* +zencoding-balance-tag-inward zencoding.txt /*zencoding-balance-tag-inward* +zencoding-balance-tag-outward zencoding.txt /*zencoding-balance-tag-outward* +zencoding-complete-tag zencoding.txt /*zencoding-complete-tag* +zencoding-contents zencoding.txt /*zencoding-contents* +zencoding-customize zencoding.txt /*zencoding-customize* +zencoding-customize-keymappings zencoding.txt /*zencoding-customize-keymappings* +zencoding-define-tags-behavior zencoding.txt /*zencoding-define-tags-behavior* +zencoding-expandabbr zencoding.txt /*zencoding-expandabbr* +zencoding-goto-next-point zencoding.txt /*zencoding-goto-next-point* +zencoding-goto-previous-point zencoding.txt /*zencoding-goto-previous-point* +zencoding-indent-size zencoding.txt /*zencoding-indent-size* +zencoding-install zencoding.txt /*zencoding-install* +zencoding-introduction zencoding.txt /*zencoding-introduction* +zencoding-make-anchor-url zencoding.txt /*zencoding-make-anchor-url* +zencoding-merge-lines zencoding.txt /*zencoding-merge-lines* +zencoding-quoted-text-url zencoding.txt /*zencoding-quoted-text-url* +zencoding-remove-tag zencoding.txt /*zencoding-remove-tag* +zencoding-split-join-tag zencoding.txt /*zencoding-split-join-tag* +zencoding-todo zencoding.txt /*zencoding-todo* +zencoding-toggle-comment zencoding.txt /*zencoding-toggle-comment* +zencoding-tutorial zencoding.txt /*zencoding-tutorial* +zencoding-update-image-size zencoding.txt /*zencoding-update-image-size* +zencoding-wrap-wtih-abbreviation zencoding.txt /*zencoding-wrap-wtih-abbreviation* +zencoding.txt zencoding.txt /*zencoding.txt* diff --git a/vim/doc/zencoding.txt b/vim/doc/zencoding.txt new file mode 100644 index 0000000..e3f767a --- /dev/null +++ b/vim/doc/zencoding.txt @@ -0,0 +1,383 @@ +*zencoding.txt* ZenCoding for Vim + + ------------------------------------------------------- + ZenCoding: vim plugins for HTML and CSS hi-speed coding + ------------------------------------------------------- + +Author: Yasuhiro Matsumoto <mattn.jp@gmail.com> +WebSite: http://mattn.kaoriya.net/ +Repository: http://github.com/mattn/zencoding-vim +Site: http://mattn.github.com/zencoding-vim +License: BSD style license + +============================================================================== +CONTENTS *zencoding-contents* + +Introduction |zencoding-introduction| +Install |zencoding-install| +Tutorial |zencoding-tutorial| + 1. Expand Abbreviation |zencoding-expandabbr| + 2. Wrap with Abbreviation |zencoding-wrap-wtih-abbreviation| + 3. Balance Tag Inward |zencoding-balance-tag-inward| + 4. Balance Tag Outward |zencoding-balance-tag-outward| + 5. Go to Next Edit Point |zencoding-goto-next-point| |<C-Y>n| + 6. Go to Previous Edit Point |zencoding-goto-previous-point| + 7. Update <img> Size |zencoding-update-image-size| + 8. Merge Lines |zencoding-merge-lines| + 9. Remove Tag |zencoding-remove-tag| + 10. Split/Join Tag |zencoding-split-join-tag| + 11. Toggle Comment |zencoding-toggle-comment| + 12. Make anchor from URL |zencoding-make-anchor-url| + 13. Make quoted text from URL |zencoding-quoted-text-url| +Customize |zencoding-customize| + 1. Key Mappings |zencoding-customize-keymappings| + 2. Indent Size |zencoding-indent-size| + 3. Define Tag's Behavior |zencoding-define-tags-behavior| + 4. Complete Tag |zencoding-complete-tag| +ToDo |zencoding-todo| + +============================================================================== +INTRODUCTION *zencoding-introduction* *zencoding* + +|ZenCoding| is an editor plugin for high-speed HTML, XML, XSL (or any other +structured code format) coding and editing. The core of this plugin is a +powerful abbreviation engine which allows you to expand expressions?similar to +CSS selectors?into HTML code: +> + div#page>div.logo+ul#navigation>li*5>a +< +...can be expanded into: +> + <div id="page"> + <div class="logo"></div> + <ul id="navigation"> + <li><a href=""></a></li> + <li><a href=""></a></li> + <li><a href=""></a></li> + <li><a href=""></a></li> + <li><a href=""></a></li> + </ul> + </div> +< +Read more about current Zen Coding syntax + http://code.google.com/p/zen-coding/wiki/ZenHTMLSelectorsEn + +Abbreviation engine has a modular structure which allows you to expand +abbreviations into different languages. Zen Coding currently supports CSS, +HTML, XML/XSL and HAML languages via filters. + +============================================================================== +INSTALL *zencoding-install* + +Install the distributed files into Vim runtime directory which is usually +~/.vim/, or $HOME/vimfiles on Windows. + +If you install pathogen that provided from Tim Pope, you should extract the +file into 'bundle' directory. + +============================================================================== +TUTORIAL *zencoding-tutorial* + +If you are seeing this file as :help, then you can't edit this file. +You should copy this section and create new buffer, paste and write as +'zencoding-tutor.txt'. Formally, open the file to start tutorial. + +1. Expand Abbreviation *zencoding-expandabbr* *<C-Y>,* + + Type abbreviation as 'div>p#foo$*3>a' and type |<C-Y>,|. +> + <div> + <p id="foo1"> + <a href=""></a> + </p> + <p id="foo2"> + <a href=""></a> + </p> + <p id="foo3"> + <a href=""></a> + </p> + </div> +< +2. Wrap with Abbreviation *zencoding-wrap-wtih-abbreviation* *v_<C-Y>,* + + Write as below. +> + test1 + test2 + test3 +< + Then do visual select(line wize) and type |<C-Y>,|. + If you request 'Tag:', then type 'ul>li*'. +> + <ul> + <li>test1</li> + <li>test2</li> + <li>test3</li> + </ul> +< + If you type tag as 'blockquote', then you'll see as following. +> + <blockquote> + test1 + test2 + test3 + </blockquote> +< +3. Balance Tag Inward *zencoding-balance-tag-inward* *<C-Y>d* + + To select inward of ul tag, type |<C-Y>d| in insert mode. +> + <ul> + * <li class="list1"></li> + <li class="list2"></li> + <li class="list3"></li> + </ul> +< + If cursor is at '*', |<C-Y>d| select from begin of <ul> to end of </ul>. + If cursor is at first of <li>, it select <li class="list1"></li>. + +4. Balance Tag Outward *zencoding-balance-tag-outward* *<C-Y>D* + + To select outward of ul tag, insert mode, type <C-Y>D in insert mode. +> + <ul> + * <li class="list1"></li> + <li class="list2"></li> + <li class="list3"></li> + </ul> +< + If cursor is at '*', |<C-Y>d| select from next letter of <ul> to previous + letter of </ul>. + If cursor is at first of <li>, it select <li class="list1"></li>. + +5. Go to Next Edit Point *zencoding-goto-next-point* *<C-Y>n* + + To jump next point that need to edit, type |<C-Y>n| in insert mode. +> + * <div id="foo" class="">foo</div> + <div id="bar" class="bar"></li> +< + If cursor is at '*', |<C-Y>n| move a cursor into attribute value of div + specified id as 'foo'. And type again |<C-Y>n| move a cursor into inner of + div specified id as 'bar'. + +6. Go to Previous Edit Point *zencoding-goto-previous-point* *<C-Y>N* + + To jump previous point that need to edit, type |<C-Y>N| in insert mode. +> + <div id="foo" class="">foo</div> + <div id="bar" class="bar"></li> * +< + If cursor is at '*', |<C-Y>N| move a cursor into div specified id as 'bar'. + And type again |<C-Y>N| move a cursor into attribute value of 'foo'. + +7. Update <img> Size *zencoding-update-image-size* *<C-Y>i* + + To expand or update size of image, type |<C-Y>i| on img tag +> + <img src="foo.png" /> +< + Type '<c-y>i' on img tag +> + <img src="foo.png" width="32" height="32" /> +< + If you change image, then type it again. it will be following. +> + <img src="foo-48.png" width="32" height="48" /> +< +8. Merge Lines *zencoding-merge-lines* + + To join multi line text like following, type |J|. +> + <ul> + <li class="list1"></li> + <li class="list2"></li> + <li class="list3"></li> + </ul> +< + If you select part of line include <li> and type |J|, it will be following. +> + <ul> + <li class="list1"></li><li class="list2"></li><li class="list3"></li> + </ul> +< +9. Remove Tag *zencoding-remove-tag* *<C-Y>k* + + To remove tag in the block, type |<C-Y>k|. +> + <div class="foo"> + <a>cursor is here</a> + </div> +< + Type |<C-Y>k| in insert mode, then +> + <div class="foo"> + + </div> +< + And type |<C-Y>k| in there again, then div will be removed. + +10. Split/Join Tag *zencoding-split-join-tag* *<C-Y>j* + + To join block, type |<C-Y>j|. +> + <div class="foo"> + cursor is here + </div> +< + Type |<C-Y>j| in insert mode. then, +> + <div class="foo"/> +< + And type |<C-Y>j| in there again. +> + <div class="foo"> + </div> +< +11. Toggle Comment *zencoding-toggle-comment* *<C-Y>/* + + Move cursor to block +> + <div> + hello world + </div> +< + Type '<c-y>/' in insert mode. +> + <!-- <div> + hello world + </div> --> +< + Type '<c-y>/' in there again. +> + <div> + hello world + </div> +< +12. Make anchor from URL *zencoding-make-anchor-url* *<C-Y>a* + + Move cursor to URL +> + http://www.google.com/ +< + Type |<C-Y>a| +> + <a href="http://www.google.com/">Google</a> +< +13. Make quoted text from URL *zencoding-quoted-text-url* *<C-Y>A* + + Move cursor to URL +> + http://github.com/ +< + Type |<C-Y>A| +> + <blockquote class="quote"> + <a href="http://github.com/">Secure source code hosting and collaborative development - GitHub</a><br /> + <p>How does it work? Get up and running in seconds by forking a project, pushing an existing repository...</p> + <cite>http://github.com/</cite> + </blockquote> +< +============================================================================== +CUSTOMIZE *zencoding-customize* + +1. Key Mapping *zencoding-customize-keymappings* + + To specify leading key for expanding or balance tag, or for all, + Add this line in your vimrc: > +> + let g:user_zen_leader_key = '<c-y>' +< + Or if you prefer to map for each actions, then you set each variables. + + 'user_zen_expandabbr_key' + 'user_zen_expandword_key' + 'user_zen_balancetaginward_key' + 'user_zen_balancetagoutward_key' + 'user_zen_next_key' + 'user_zen_prev_key' + 'user_zen_imagesize_key' + 'user_zen_togglecomment_key' + 'user_zen_splitjointag_key' + 'user_zen_removetag_key' + 'user_zen_anchorizeurl_key' + 'user_zen_anchorizesummary_key' + +2. Indent Size *zencoding-indent-size* + + To change indent size of html, add this code in your vimrc. +> + let g:user_zen_settings = { + \ 'html' : { + \ 'indentation' : ' ' + \ }, + \} +< + If you prefer to change global indent size then add this. +> + let g:user_zen_settings = { + \ 'indentation' : ' ' + \} +< +3. Define Tag's Behavior *zencoding-define-tags-behavior* + + zencoding.vim can change behavior of expanding abbreviation for each + filetypes as |Dictionary|. for details, see official site of zencoding. + for example, vimmer can add following. +> + let g:user_zen_settings = { + \ 'lang' : 'ja', + \ 'html' : { + \ 'filters' : 'html', + \ 'indentation' : ' ' + \ }, + \ 'perl' : { + \ 'indentation' : ' ', + \ 'aliases' : { + \ 'req' : "require '|'" + \ }, + \ 'snippets' : { + \ 'use' : "use strict\nuse warnings\n\n", + \ 'w' : "warn \"${cursor}\";", + \ }, + \ }, + \ 'php' : { + \ 'extends' : 'html', + \ 'filters' : 'html,c', + \ }, + \ 'css' : { + \ 'filters' : 'fc', + \ }, + \ 'javascript' : { + \ 'snippets' : { + \ 'jq' : "$(function() {\n\t${cursor}${child}\n});", + \ 'jq:each' : "$.each(arr, function(index, item)\n\t${child}\n});", + \ 'fn' : "(function() {\n\t${cursor}\n})();", + \ 'tm' : "setTimeout(function() {\n\t${cursor}\n}, 100);", + \ }, + \ }, + \ 'java' : { + \ 'indentation' : ' ', + \ 'snippets' : { + \ 'main': "public static void main(String[] args) {\n\t|\n}", + \ 'println': "System.out.println(\"|\");", + \ 'class': "public class | {\n}\n", + \ }, + \ }, + \} +< +4. Complete Tag *zencoding-complete-tag* + + If you want to complete tags using |omnifunc| then add this. +> + let g:use_zen_complete_tag = 1 +< +============================================================================== +TODO *zencoding-todo* + * wrapping inline selected. + * more documents. + * more contributor. + * more time to improve zencodig.vim. + +============================================================================== +vim:tw=78:ts=8:ft=help:norl:noet:fen:fdl=0: diff --git a/vim/plugin/zencoding.vim b/vim/plugin/zencoding.vim new file mode 100644 index 0000000..a92bcec --- /dev/null +++ b/vim/plugin/zencoding.vim @@ -0,0 +1,137 @@ +"============================================================================= +" File: zencoding.vim +" Author: Yasuhiro Matsumoto <mattn.jp@gmail.com> +" Last Change: 14-Jan-2011. +" Version: 0.52 +" WebPage: http://github.com/mattn/zencoding-vim +" Description: vim plugins for HTML and CSS hi-speed coding. +" SeeAlso: http://code.google.com/p/zen-coding/ +" Usage: +" +" This is vim script support expanding abbreviation like zen-coding. +" ref: http://code.google.com/p/zen-coding/ +" +" Type abbreviation +" +------------------------------------- +" | html:5_ +" +------------------------------------- +" "_" is a cursor position. and type "<c-y>," (Ctrl+y and Comma) +" NOTE: Don't worry about key map. you can change it easily. +" +------------------------------------- +" | <!DOCTYPE HTML> +" | <html lang="en"> +" | <head> +" | <title></title> +" | <meta charset="UTF-8"> +" | </head> +" | <body> +" | _ +" | </body> +" | </html> +" +------------------------------------- +" Type following +" +------------------------------------- +" | div#foo$*2>div.bar +" +------------------------------------- +" And type "<c-y>," +" +------------------------------------- +" |<div id="foo1"> +" | <div class="bar">_</div> +" |</div> +" |<div id="foo2"> +" | <div class="bar"></div> +" |</div> +" +------------------------------------- +" +" Tips: +" +" You can customize behavior of expanding with overriding config. +" This configuration will be marged at loading plugin. +" +" let g:user_zen_settings = { +" \ 'indentation' : ' ', +" \ 'perl' : { +" \ 'aliases' : { +" \ 'req' : 'require ' +" \ }, +" \ 'snippets' : { +" \ 'use' : "use strict\nuse warnings\n\n", +" \ 'warn' : "warn \"|\";", +" \ } +" \ } +" \} +" +" You can set language attribute in html using 'zen_settings.lang'. +" +" GetLatestVimScripts: 2981 1 :AutoInstall: zencoding.vim +" script type: plugin + +if &cp || (exists('g:loaded_zencoding_vim') && g:loaded_zencoding_vim) + finish +endif +let g:loaded_zencoding_vim = 1 + +let s:save_cpo = &cpo +set cpo&vim + +if !exists('g:zencoding_debug') + let g:zencoding_debug = 0 +endif + +if exists('g:use_zen_complete_tag') && g:use_zen_complete_tag + setlocal omnifunc=zencoding#CompleteTag +endif + +if !exists('g:user_zen_leader_key') + let g:user_zen_leader_key = '<c-y>' +endif + +function! s:install_plugin() + for item in [ + \ {'mode': 'i', 'var': 'user_zen_expandabbr_key', 'key': ',', 'plug': 'ZenCodingExpandAbbr', 'func': '<c-g>u<esc>:call zencoding#expandAbbr(0)<cr>a'}, + \ {'mode': 'v', 'var': 'user_zen_expandabbr_key', 'key': ',', 'plug': 'ZenCodingExpandVisual', 'func': ':call zencoding#expandAbbr(2)<cr>'}, + \ {'mode': 'n', 'var': 'user_zen_expandabbr_key', 'key': ',', 'plug': 'ZenCodingExpandNormal', 'func': ':call zencoding#expandAbbr(3)<cr>'}, + \ {'mode': 'i', 'var': 'user_zen_expandword_key', 'key': ';', 'plug': 'ZenCodingExpandWord', 'func': '<c-g>u<esc>:call zencoding#expandAbbr(1)<cr>a'}, + \ {'mode': 'n', 'var': 'user_zen_expandword_key', 'key': ',', 'plug': 'ZenCodingExpandWord', 'func': ':call zencoding#expandAbbr(1)<cr>'}, + \ {'mode': 'i', 'var': 'user_zen_balancetaginward_key', 'key': 'd', 'plug': 'ZenCodingBalanceTagInwardInsert', 'func': '<esc>:call zencoding#balanceTag(1)<cr>a'}, + \ {'mode': 'n', 'var': 'user_zen_balancetaginward_key', 'key': 'd', 'plug': 'ZenCodingBalanceTagInwardNormal', 'func': ':call zencoding#balanceTag(1)<cr>'}, + \ {'mode': 'v', 'var': 'user_zen_balancetaginward_key', 'key': 'd', 'plug': 'ZenCodingBalanceTagInwardVisual', 'func': ':call zencoding#balanceTag(2)<cr>'}, + \ {'mode': 'i', 'var': 'user_zen_balancetagoutward_key', 'key': 'D', 'plug': 'ZenCodingBalanceTagOutwardInsert', 'func': '<esc>:call zencoding#balanceTag(-1)<cr>a'}, + \ {'mode': 'n', 'var': 'user_zen_balancetagoutward_key', 'key': 'D', 'plug': 'ZenCodingBalanceTagOutwardNormal', 'func': ':call zencoding#balanceTag(-1)<cr>'}, + \ {'mode': 'v', 'var': 'user_zen_balancetagoutward_key', 'key': 'D', 'plug': 'ZenCodingBalanceTagOutwardVisual', 'func': ':call zencoding#balanceTag(-2)<cr>'}, + \ {'mode': 'i', 'var': 'user_zen_next_key', 'key': 'n', 'plug': 'ZenCodingNext', 'func': '<esc>:call zencoding#moveNextPrev(0)<cr>'}, + \ {'mode': 'n', 'var': 'user_zen_next_key', 'key': 'n', 'plug': 'ZenCodingNext', 'func': ':call zencoding#moveNextPrev(0)<cr>'}, + \ {'mode': 'i', 'var': 'user_zen_prev_key', 'key': 'N', 'plug': 'ZenCodingPrev', 'func': '<esc>:call zencoding#moveNextPrev(1)<cr>'}, + \ {'mode': 'n', 'var': 'user_zen_prev_key', 'key': 'N', 'plug': 'ZenCodingPrev', 'func': ':call zencoding#moveNextPrev(1)<cr>'}, + \ {'mode': 'i', 'var': 'user_zen_imagesize_key', 'key': 'i', 'plug': 'ZenCodingImageSize', 'func': '<esc>:call zencoding#imageSize()<cr>a'}, + \ {'mode': 'n', 'var': 'user_zen_imagesize_key', 'key': 'i', 'plug': 'ZenCodingImageSize', 'func': ':call zencoding#imageSize()<cr>'}, + \ {'mode': 'i', 'var': 'user_zen_togglecomment_key', 'key': '/', 'plug': 'ZenCodingToggleComment', 'func': '<esc>:call zencoding#toggleComment()<cr>a'}, + \ {'mode': 'n', 'var': 'user_zen_togglecomment_key', 'key': '/', 'plug': 'ZenCodingToggleComment', 'func': ':call zencoding#toggleComment()<cr>'}, + \ {'mode': 'i', 'var': 'user_zen_splitjointag_key', 'key': 'j', 'plug': 'ZenCodingSplitJoinTagInsert', 'func': '<esc>:call zencoding#splitJoinTag()<cr>a'}, + \ {'mode': 'n', 'var': 'user_zen_splitjointag_key', 'key': 'j', 'plug': 'ZenCodingSplitJoinTagNormal', 'func': ':call zencoding#splitJoinTag()<cr>'}, + \ {'mode': 'i', 'var': 'user_zen_removetag_key', 'key': 'k', 'plug': 'ZenCodingRemoveTag', 'func': '<esc>:call zencoding#removeTag()<cr>a'}, + \ {'mode': 'n', 'var': 'user_zen_removetag_key', 'key': 'k', 'plug': 'ZenCodingRemoveTag', 'func': ':call zencoding#removeTag()<cr>'}, + \ {'mode': 'i', 'var': 'user_zen_anchorizeurl_key', 'key': 'a', 'plug': 'ZenCodingAnchorizeURL', 'func': '<esc>:call zencoding#anchorizeURL(0)<cr>a'}, + \ {'mode': 'n', 'var': 'user_zen_anchorizeurl_key', 'key': 'a', 'plug': 'ZenCodingAnchorizeURL', 'func': ':call zencoding#anchorizeURL(0)<cr>'}, + \ {'mode': 'i', 'var': 'user_zen_anchorizesummary_key', 'key': 'A', 'plug': 'ZenCodingAnchorizeSummary', 'func': '<esc>:call zencoding#anchorizeURL(1)<cr>a'}, + \ {'mode': 'n', 'var': 'user_zen_anchorizesummary_key', 'key': 'A', 'plug': 'ZenCodingAnchorizeSummary', 'func': ':call zencoding#anchorizeURL(1)<cr>'}, + \] + + if !hasmapto('<plug>'.item.plug, item.mode) + exe item.mode . 'noremap <silent> <plug>' . item.plug . ' ' . item.func + endif + if !exists('g:' . item.var) + exe 'let g:' . item.var . " = '" . g:user_zen_leader_key . item.key . "'" + endif + if len(maparg(eval('g:' . item.var), item.mode)) == 0 + exe item.mode . 'map <silent> <unique> ' . eval('g:' . item.var) . ' <plug>' . item.plug + endif + endfor +endfunction +call s:install_plugin() +delfunction s:install_plugin + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim:set et: |