From 672af42b710aae028ddb70eeded8c3043bac855f Mon Sep 17 00:00:00 2001 From: mattn Date: Wed, 24 Oct 2012 11:13:34 +0900 Subject: [PATCH] support (bg+)+c like format. --- autoload/zencoding/lang/css.vim | 184 +++++++++++++++++--------------- 1 file changed, 96 insertions(+), 88 deletions(-) diff --git a/autoload/zencoding/lang/css.vim b/autoload/zencoding/lang/css.vim index 106c703..8bde7ac 100644 --- a/autoload/zencoding/lang/css.vim +++ b/autoload/zencoding/lang/css.vim @@ -8,100 +8,108 @@ function! zencoding#lang#css#parseIntoTree(abbr, type) let prefix = 0 let value = '' - " emmet - let prop = matchlist(abbr, '^\(-\{0,1}[a-zA-Z]\+\)\(\%([0-9.-]\+[pe]\{0,1}-\{0,1}\|-auto\)*\)$') - if len(prop) - let abbr = prop[1] - if abbr =~ '^-' - let prefix = 1 - let abbr = abbr[1:] - endif - let value = '' - for v in split(prop[2], '\d\zs-') - if len(value) > 0 - let value .= ' ' - endif - if abbr =~ '^[z]' - " TODO - let value .= substitute(v, '[^0-9.]*$', '', '') - elseif v =~ 'p$' - let value .= substitute(v, 'p$', '%', '') - elseif v =~ 'e$' - let value .= substitute(v, 'e$', 'em', '') - elseif v =~ '\.' - let value .= v . 'em' - elseif v == 'auto' - let value .= v - else - let value .= v . 'px' - endif - endfor - endif let settings = zencoding#getSettings() let indent = zencoding#getIndentation(type) - + let root = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0, 'important': 0 } - let tag_name = abbr - if tag_name =~ '.!$' - let tag_name = tag_name[:-2] - let important = 1 - else - let important = 0 - endif - " make default node - let current = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0, 'important': important } - let current.name = tag_name - - " aliases - let aliases = zencoding#getResource(type, 'aliases', {}) - if has_key(aliases, tag_name) - let current.name = aliases[tag_name] - endif - let use_pipe_for_cursor = zencoding#getResource(type, 'use_pipe_for_cursor', 1) - - " snippets - let snippets = zencoding#getResource(type, 'snippets', {}) - if !empty(snippets) && has_key(snippets, tag_name) - let snippet = snippets[tag_name] - if use_pipe_for_cursor - let snippet = substitute(snippet, '|', '${cursor}', 'g') + " emmet + let tokens = split(abbr, '+\ze[^)!]') + for n in range(len(tokens)) + let token = tokens[n] + let prop = matchlist(token, '^\(-\{0,1}[a-zA-Z]\+\|[a-zA-Z0-9]\++\{0,1}\|([a-zA-Z0-9]\++\{0,1})\)\(\%([0-9.-]\+[pe]\{0,1}-\{0,1}\|-auto\)*\)$') + if len(prop) + let token = substitute(prop[1], '^(\(.*\))', '\1', '') + if token =~ '^-' + let prefix = 1 + let token = token[1:] + endif + let value = '' + for v in split(prop[2], '\d\zs-') + if len(value) > 0 + let value .= ' ' + endif + if token =~ '^[z]' + " TODO + let value .= substitute(v, '[^0-9.]*$', '', '') + elseif v =~ 'p$' + let value .= substitute(v, 'p$', '%', '') + elseif v =~ 'e$' + let value .= substitute(v, 'e$', 'em', '') + elseif v =~ '\.' + let value .= v . 'em' + elseif v == 'auto' + let value .= v + else + let value .= v . 'px' + endif + endfor endif - let lines = split(snippet, "\n") - call map(lines, 'substitute(v:val, "\\( \\|\\t\\)", escape(indent, "\\\\"), "g")') - let current.snippet = join(lines, "\n") - let current.name = '' - let current.snippet = substitute(current.snippet, ';', value . ';', '') - if use_pipe_for_cursor - let current.snippet = substitute(current.snippet, '${cursor}', '', 'g') . '${cursor}' + + let tag_name = token + if tag_name =~ '.!$' + let tag_name = tag_name[:-2] + let important = 1 + else + let important = 0 endif - endif - - let current.pos = 0 - let lg = matchlist(abbr, '^\%(linear-gradient\|lg\)(\s*\(\w\+\)\s*,\s*\([^,]\+\)\s*,\s*\([^)]\+\)\s*)$') - if len(lg) - let current.name = '' - let current.snippet = printf("background-image: -webkit-gradient(%s, 0 0, 0 100%, from(%s), to(%s));\n", lg[1], lg[2], lg[3]) - call add(root.child, deepcopy(current)) - let current.snippet = printf("background-image: -webkit-linear-gradient(%s, %s);\n", lg[2], lg[3]) - call add(root.child, deepcopy(current)) - let current.snippet = printf("background-image: -moz-linear-gradient(%s, %s);\n", lg[2], lg[3]) - call add(root.child, deepcopy(current)) - let current.snippet = printf("background-image: -o-linear-gradient(%s, %s);\n", lg[2], lg[3]) - call add(root.child, deepcopy(current)) - let current.snippet = printf("background-image: linear-gradient(%s, %s);\n", lg[2], lg[3]) - call add(root.child, deepcopy(current)) - elseif prefix - let snippet = current.snippet - let current.snippet = '-webkit-' . snippet . "\n" - call add(root.child, deepcopy(current)) - let current.snippet = '-moz-' . snippet . "\n" - call add(root.child, deepcopy(current)) - let current.snippet = snippet - call add(root.child, current) - else - call add(root.child, current) - endif + " make default node + let current = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0, 'important': important } + let current.name = tag_name + + " aliases + let aliases = zencoding#getResource(type, 'aliases', {}) + if has_key(aliases, tag_name) + let current.name = aliases[tag_name] + endif + let use_pipe_for_cursor = zencoding#getResource(type, 'use_pipe_for_cursor', 1) + + " snippets + let snippets = zencoding#getResource(type, 'snippets', {}) + if !empty(snippets) && has_key(snippets, tag_name) + let snippet = snippets[tag_name] + if use_pipe_for_cursor + let snippet = substitute(snippet, '|', '${cursor}', 'g') + endif + let lines = split(snippet, "\n") + call map(lines, 'substitute(v:val, "\\( \\|\\t\\)", escape(indent, "\\\\"), "g")') + let current.snippet = join(lines, "\n") + let current.name = '' + let current.snippet = substitute(current.snippet, ';', value . ';', '') + if use_pipe_for_cursor && len(value) > 0 && stridx(value, '${cursor}') == -1 + let current.snippet = substitute(current.snippet, '${cursor}', '', 'g') . '${cursor}' + endif + if n < len(tokens) - 1 + let current.snippet .= "\n" + endif + endif + + let current.pos = 0 + let lg = matchlist(token, '^\%(linear-gradient\|lg\)(\s*\(\w\+\)\s*,\s*\([^,]\+\)\s*,\s*\([^)]\+\)\s*)$') + if len(lg) + let current.name = '' + let current.snippet = printf("background-image: -webkit-gradient(%s, 0 0, 0 100%, from(%s), to(%s));\n", lg[1], lg[2], lg[3]) + call add(root.child, deepcopy(current)) + let current.snippet = printf("background-image: -webkit-linear-gradient(%s, %s);\n", lg[2], lg[3]) + call add(root.child, deepcopy(current)) + let current.snippet = printf("background-image: -moz-linear-gradient(%s, %s);\n", lg[2], lg[3]) + call add(root.child, deepcopy(current)) + let current.snippet = printf("background-image: -o-linear-gradient(%s, %s);\n", lg[2], lg[3]) + call add(root.child, deepcopy(current)) + let current.snippet = printf("background-image: linear-gradient(%s, %s);\n", lg[2], lg[3]) + call add(root.child, deepcopy(current)) + elseif prefix + let snippet = current.snippet + let current.snippet = '-webkit-' . snippet . "\n" + call add(root.child, deepcopy(current)) + let current.snippet = '-moz-' . snippet . "\n" + call add(root.child, deepcopy(current)) + let current.snippet = snippet + call add(root.child, current) + else + call add(root.child, current) + endif + endfor return root endfunction