1 Commits

Author SHA1 Message Date
Yasuhiro Matsumoto
84a0388827 [WIP] styled 2019-11-13 16:28:12 +09:00
17 changed files with 2455 additions and 2640 deletions

View File

@@ -3,7 +3,7 @@
[![Build Status](https://travis-ci.org/mattn/emmet-vim.svg?branch=master)](https://travis-ci.org/mattn/emmet-vim) [![Build Status](https://travis-ci.org/mattn/emmet-vim.svg?branch=master)](https://travis-ci.org/mattn/emmet-vim)
[emmet-vim](https://mattn.github.io/emmet-vim/) is a vim plug-in [emmet-vim](http://mattn.github.com/emmet-vim) is a vim plug-in
which provides support for expanding abbreviations similar to which provides support for expanding abbreviations similar to
[emmet](http://emmet.io/). [emmet](http://emmet.io/).
@@ -13,56 +13,42 @@ which provides support for expanding abbreviations similar to
[Download zip file](http://www.vim.org/scripts/script.php?script_id=2981): [Download zip file](http://www.vim.org/scripts/script.php?script_id=2981):
```sh cd ~/.vim
cd ~/.vim unzip emmet-vim.zip
unzip emmet-vim.zip
```
To install using [pathogen.vim](https://github.com/tpope/vim-pathogen): To install using [pathogen.vim](https://github.com/tpope/vim-pathogen):
```sh git clone https://github.com/mattn/emmet-vim.git ~/.vim/bundle/emmet-vim
git clone https://github.com/mattn/emmet-vim.git ~/.vim/bundle/emmet-vim
```
To install using [Vundle](https://github.com/gmarik/vundle): To install using [Vundle](https://github.com/gmarik/vundle):
```vim " add this line to your .vimrc file
" add this line to your .vimrc file Plugin 'mattn/emmet-vim'
Plugin 'mattn/emmet-vim'
```
To install using [Vim-Plug](https://github.com/junegunn/vim-plug): To install using [Vim-Plug](https://github.com/junegunn/vim-plug):
```vim " add this line to your .vimrc file
" add this line to your .vimrc file Plug 'mattn/emmet-vim'
Plug 'mattn/emmet-vim'
```
To checkout the source from repository: To checkout the source from repository:
```sh cd ~/.vim/bundle
cd ~/.vim/bundle git clone https://github.com/mattn/emmet-vim.git
git clone https://github.com/mattn/emmet-vim.git
```
or: or:
```sh git clone https://github.com/mattn/emmet-vim.git
git clone https://github.com/mattn/emmet-vim.git cd emmet-vim
cd emmet-vim cp plugin/emmet.vim ~/.vim/plugin/
cp plugin/emmet.vim ~/.vim/plugin/ cp autoload/emmet.vim ~/.vim/autoload/
cp autoload/emmet.vim ~/.vim/autoload/ cp -a autoload/emmet ~/.vim/autoload/
cp -a autoload/emmet ~/.vim/autoload/
```
## Quick Tutorial ## Quick Tutorial
Open or create a New File: Open or create a New File:
```sh vim index.html
vim index.html
```
Type ("\_" is the cursor position): Type ("\_" is the cursor position):
@@ -124,42 +110,10 @@ You can change the **path** to your **snippets_custom.json** according to your p
[Here](http://docs.emmet.io/customization/snippets/) you can find instructions about creating your customized **snippets.json** file. [Here](http://docs.emmet.io/customization/snippets/) you can find instructions about creating your customized **snippets.json** file.
## Snippet to add meta tag for responsiveness
Update this in your .vimrc file.
let g:user_emmet_settings = {
\ 'variables': {'lang': 'ja'},
\ 'html': {
\ 'default_attributes': {
\ 'option': {'value': v:null},
\ 'textarea': {'id': v:null, 'name': v:null, 'cols': 10, 'rows': 10},
\ },
\ 'snippets': {
\ 'html:5': "<!DOCTYPE html>\n"
\ ."<html lang=\"${lang}\">\n"
\ ."<head>\n"
\ ."\t<meta charset=\"${charset}\">\n"
\ ."\t<title></title>\n"
\ ."\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n"
\ ."</head>\n"
\ ."<body>\n\t${child}|\n</body>\n"
\ ."</html>",
\ },
\ },
\}
## Project Authors ## Project Authors
[Yasuhiro Matsumoto](http://mattn.kaoriya.net/) [Yasuhiro Matsumoto](http://mattn.kaoriya.net/)
## FAQ
* Pressing ctrl+y+, doesn't work
Probably you set `timeoutlen=0`. Most of Vim plugins which using key-mappings does not work with `timeoutlen=0`.
## Links ## Links
### Emmet official site: ### Emmet official site:
@@ -172,7 +126,7 @@ Update this in your .vimrc file.
### emmet.vim: ### emmet.vim:
* <https://mattn.github.io/emmet-vim/> * <http://mattn.github.com/emmet-vim>
### development repository: ### development repository:

File diff suppressed because it is too large Load Diff

View File

@@ -10,19 +10,20 @@ function! emmet#lang#exists(type) abort
endfunction endfunction
function! emmet#lang#type(type) abort function! emmet#lang#type(type) abort
let l:type = a:type let type = a:type
let l:base = l:type let base = type
let l:settings = emmet#getSettings() let settings = emmet#getSettings()
while l:base != '' while base != ''
for l:b in split(l:base, '\.') for b in split(base, '\.')
if emmet#lang#exists(l:b) let b = substitute(b, '-.*', '', '')
return l:b if emmet#lang#exists(b)
return b
endif endif
if has_key(l:settings, l:b) && has_key(l:settings[l:b], 'extends') if has_key(settings, b) && has_key(settings[b], 'extends')
let l:base = l:settings[l:b].extends let base = settings[b].extends
break break
else else
let l:base = '' let base = ''
endif endif
endfor endfor
endwhile endwhile
@@ -31,22 +32,22 @@ endfunction
" get all extends for a type recursively " get all extends for a type recursively
function! emmet#lang#getExtends(type) abort function! emmet#lang#getExtends(type) abort
let l:settings = emmet#getSettings() let settings = emmet#getSettings()
if !has_key(l:settings[a:type], 'extends') if !has_key(settings[a:type], 'extends')
return [] return []
endif endif
let l:extends = l:settings[a:type].extends let extends = settings[a:type].extends
if type(l:extends) ==# 1 if type(extends) ==# 1
let l:tmp = split(l:extends, '\s*,\s*') let tmp = split(extends, '\s*,\s*')
unlet! l:extends unlet! extends
let l:extends = l:tmp let extends = tmp
endif endif
for l:ext in l:extends for ext in extends
let l:extends = l:extends + emmet#lang#getExtends(l:ext) let extends = extends + emmet#lang#getExtends(ext)
endfor endfor
return l:extends return extends
endfunction endfunction

View File

@@ -1,6 +1,6 @@
function! emmet#lang#css#findTokens(str) abort function! emmet#lang#css#findTokens(str) abort
let l:tmp = substitute(substitute(a:str, '^.*[;{]\s*', '', ''), '}\s*$', '', '') let tmp = substitute(substitute(a:str, '^.*[;{]\s*', '', ''), '}\s*$', '', '')
if l:tmp =~ '/' && l:tmp =~ '^[a-zA-Z0-9/_.]\+$' if tmp =~ '/' && tmp =~ '^[a-zA-Z0-9/_.]\+$'
" maybe path or something " maybe path or something
return '' return ''
endif endif
@@ -8,281 +8,282 @@ function! emmet#lang#css#findTokens(str) abort
endfunction endfunction
function! emmet#lang#css#parseIntoTree(abbr, type) abort function! emmet#lang#css#parseIntoTree(abbr, type) abort
let l:abbr = a:abbr let abbr = a:abbr
let l:type = a:type let type = a:type
let l:prefix = 0 let prefix = 0
let l:value = '' let value = ''
let l:indent = emmet#getIndentation(l:type) let ftype = substitute(type, '-.*', '', '')
let l:aliases = emmet#getResource(l:type, 'aliases', {}) let indent = emmet#getIndentation(ftype)
let l:snippets = emmet#getResource(l:type, 'snippets', {}) let aliases = emmet#getResource(ftype, 'aliases', {})
let l:use_pipe_for_cursor = emmet#getResource(l:type, 'use_pipe_for_cursor', 1) let snippets = emmet#getResource(ftype, 'snippets', {})
let use_pipe_for_cursor = emmet#getResource(ftype, 'use_pipe_for_cursor', 1)
let l:root = emmet#newNode() let root = emmet#newNode()
" emmet " emmet
let l:tokens = split(l:abbr, '+\ze[^+)!]') let tokens = split(abbr, '+\ze[^+)!]')
let l:block = emmet#util#searchRegion('{', '}') let block = emmet#util#searchRegion('{', '}')
if l:abbr !~# '^@' && emmet#getBaseType(l:type) ==# 'css' && l:type !=# 'sass' && l:type !=# 'styled' && l:block[0] ==# [0,0] && l:block[1] ==# [0,0] if abbr !~# '^@' && emmet#getBaseType(type) ==# 'css' && type !=# 'sass' && block[0] ==# [0,0] && block[1] ==# [0,0]
let l:current = emmet#newNode() let current = emmet#newNode()
let l:current.snippet = substitute(l:abbr, '\s\+$', '', '') . " {\n" . l:indent . "${cursor}\n}" let current.snippet = substitute(abbr, '\s\+$', '', '') . " {\n" . indent . "${cursor}\n}"
let l:current.name = '' let current.name = ''
call add(l:root.child, deepcopy(l:current)) call add(root.child, deepcopy(current))
else else
for l:n in range(len(l:tokens)) for n in range(len(tokens))
let l:token = l:tokens[l:n] let token = tokens[n]
let l:prop = matchlist(l:token, '^\(-\{0,1}[a-zA-Z]\+\|[a-zA-Z0-9]\++\{0,1}\|([a-zA-Z0-9]\++\{0,1})\)\(\%([0-9.-]\+\%(p\|e\|em\|x\|vh\|vw\|re\|rem\|%\)\{0,}-\{0,1}\|-auto\)*\)$') let prop = matchlist(token, '^\(-\{0,1}[a-zA-Z]\+\|[a-zA-Z0-9]\++\{0,1}\|([a-zA-Z0-9]\++\{0,1})\)\(\%([0-9.-]\+\%(p\|e\|em\|x\|vh\|vw\|re\|rem\|%\)\{0,}-\{0,1}\|-auto\)*\)$')
if len(l:prop) if len(prop)
let l:token = substitute(l:prop[1], '^(\(.*\))', '\1', '') let token = substitute(prop[1], '^(\(.*\))', '\1', '')
if l:token =~# '^-' if token =~# '^-'
let l:prefix = 1 let prefix = 1
let l:token = l:token[1:] let token = token[1:]
endif endif
let l:value = '' let value = ''
for l:vt in split(l:prop[2], '\a\+\zs') for vt in split(prop[2], '\a\+\zs')
let l:ut = matchstr(l:vt, '[a-z]\+$') let ut = matchstr(vt, '[a-z]\+$')
if l:ut == 'auto' if ut == 'auto'
let l:ut = '' let ut = ''
endif endif
for l:v in split(l:vt, '\d\zs-') for v in split(vt, '\d\zs-')
if len(l:value) > 0 if len(value) > 0
let l:value .= ' ' let value .= ' '
endif endif
if l:v !~ '[a-z]\+$' if v !~ '[a-z]\+$'
let l:v .= l:ut let v .= ut
endif endif
if l:token =~# '^[z]' if token =~# '^[z]'
" TODO " TODO
let l:value .= substitute(l:v, '[^0-9.]*$', '', '') let value .= substitute(v, '[^0-9.]*$', '', '')
elseif l:v =~# 'em$' elseif v =~# 'em$'
let l:value .= l:v let value .= v
elseif l:v =~# 'ex$' elseif v =~# 'ex$'
let l:value .= l:v let value .= v
elseif l:v =~# 'vh$' elseif v =~# 'vh$'
let l:value .= l:v let value .= v
elseif l:v =~# 'vw$' elseif v =~# 'vw$'
let l:value .= l:v let value .= v
elseif l:v =~# 'rem$' elseif v =~# 'rem$'
let l:value .= l:v let value .= v
elseif l:v ==# 'auto' elseif v ==# 'auto'
let l:value .= l:v let value .= v
elseif l:v =~# 'p$' elseif v =~# 'p$'
let l:value .= substitute(l:v, 'p$', '%', '') let value .= substitute(v, 'p$', '%', '')
elseif l:v =~# '%$' elseif v =~# '%$'
let l:value .= l:v let value .= v
elseif l:v =~# 'e$' elseif v =~# 'e$'
let l:value .= substitute(l:v, 'e$', 'em', '') let value .= substitute(v, 'e$', 'em', '')
elseif l:v =~# 'x$' elseif v =~# 'x$'
let l:value .= substitute(l:v, 'x$', 'ex', '') let value .= substitute(v, 'x$', 'ex', '')
elseif l:v =~# 're$' elseif v =~# 're$'
let l:value .= substitute(l:v, 're$', 'rem', '') let value .= substitute(v, 're$', 'rem', '')
elseif l:v =~# '\.' elseif v =~# '\.'
let l:value .= l:v . 'em' let value .= v . 'em'
elseif l:v ==# '0' elseif v ==# '0'
let l:value .= '0' let value .= '0'
else else
let l:value .= l:v . 'px' let value .= v . 'px'
endif endif
endfor endfor
endfor endfor
endif endif
let l:tag_name = l:token let tag_name = token
if l:tag_name =~# '.!$' if tag_name =~# '.!$'
let l:tag_name = l:tag_name[:-2] let tag_name = tag_name[:-2]
let l:important = 1 let important = 1
else else
let l:important = 0 let important = 0
endif endif
" make default node " make default node
let l:current = emmet#newNode() let current = emmet#newNode()
let l:current.important = l:important let current.important = important
let l:current.name = l:tag_name let current.name = tag_name
" aliases " aliases
if has_key(l:aliases, l:tag_name) if has_key(aliases, tag_name)
let l:current.name = l:aliases[l:tag_name] let current.name = aliases[tag_name]
endif endif
" snippets " snippets
if !empty(l:snippets) if !empty(snippets)
let l:snippet_name = l:tag_name let snippet_name = tag_name
if !has_key(l:snippets, l:snippet_name) if !has_key(snippets, snippet_name)
let l:pat = '^' . join(split(l:tag_name, '\zs'), '\%(\|[^:-]\+-\)') let pat = '^' . join(split(tag_name, '\zs'), '\%(\|[^:-]\+-\)')
let l:vv = filter(sort(keys(l:snippets)), 'l:snippets[v:val] =~ l:pat') let vv = filter(sort(keys(snippets)), 'snippets[v:val] =~ pat')
if len(l:vv) == 0 if len(vv) == 0
let l:vv = filter(sort(keys(l:snippets)), 'substitute(v:val, ":", "", "g") == l:snippet_name') let vv = filter(sort(keys(snippets)), 'substitute(v:val, ":", "", "g") == snippet_name')
endif endif
if len(l:vv) > 0 if len(vv) > 0
let l:snippet_name = l:vv[0] let snippet_name = vv[0]
else else
let l:pat = '^' . join(split(l:tag_name, '\zs'), '\%(\|[^:-]\+-*\)') let pat = '^' . join(split(tag_name, '\zs'), '\%(\|[^:-]\+-*\)')
let l:vv = filter(sort(keys(l:snippets)), 'l:snippets[v:val] =~ l:pat') let vv = filter(sort(keys(snippets)), 'snippets[v:val] =~ pat')
if len(l:vv) == 0 if len(vv) == 0
let l:pat = '^' . join(split(l:tag_name, '\zs'), '[^:]\{-}') let pat = '^' . join(split(tag_name, '\zs'), '[^:]\{-}')
let l:vv = filter(sort(keys(l:snippets)), 'l:snippets[v:val] =~ l:pat') let vv = filter(sort(keys(snippets)), 'snippets[v:val] =~ pat')
if len(l:vv) == 0 if len(vv) == 0
let l:pat = '^' . join(split(l:tag_name, '\zs'), '.\{-}') let pat = '^' . join(split(tag_name, '\zs'), '.\{-}')
let l:vv = filter(sort(keys(l:snippets)), 'l:snippets[v:val] =~ l:pat') let vv = filter(sort(keys(snippets)), 'snippets[v:val] =~ pat')
endif endif
endif endif
let l:minl = -1 let minl = -1
for l:vk in l:vv for vk in vv
let l:vvs = l:snippets[l:vk] let vvs = snippets[vk]
if l:minl == -1 || len(l:vvs) < l:minl if minl == -1 || len(vvs) < minl
let l:snippet_name = l:vk let snippet_name = vk
let l:minl = len(l:vvs) let minl = len(vvs)
endif endif
endfor endfor
endif endif
endif endif
if has_key(l:snippets, l:snippet_name) if has_key(snippets, snippet_name)
let l:snippet = l:snippets[l:snippet_name] let snippet = snippets[snippet_name]
if l:use_pipe_for_cursor if use_pipe_for_cursor
let l:snippet = substitute(l:snippet, '|', '${cursor}', 'g') let snippet = substitute(snippet, '|', '${cursor}', 'g')
endif endif
let l:lines = split(l:snippet, "\n") let lines = split(snippet, "\n")
call map(l:lines, 'substitute(v:val, "\\( \\|\\t\\)", escape(l:indent, "\\\\"), "g")') call map(lines, 'substitute(v:val, "\\( \\|\\t\\)", escape(indent, "\\\\"), "g")')
let l:current.snippet = join(l:lines, "\n") let current.snippet = join(lines, "\n")
let l:current.name = '' let current.name = ''
let l:current.snippet = substitute(l:current.snippet, ';', l:value . ';', '') let current.snippet = substitute(current.snippet, ';', value . ';', '')
if l:use_pipe_for_cursor && len(l:value) > 0 if use_pipe_for_cursor && len(value) > 0
let l:current.snippet = substitute(l:current.snippet, '\${cursor}', '', 'g') let current.snippet = substitute(current.snippet, '\${cursor}', '', 'g')
endif endif
if l:n < len(l:tokens) - 1 if n < len(tokens) - 1
let l:current.snippet .= "\n" let current.snippet .= "\n"
endif endif
endif endif
endif endif
let l:current.pos = 0 let current.pos = 0
let l:lg = matchlist(l:token, '^\%(linear-gradient\|lg\)(\s*\(\S\+\)\s*,\s*\([^,]\+\)\s*,\s*\([^)]\+\)\s*)$') let lg = matchlist(token, '^\%(linear-gradient\|lg\)(\s*\(\S\+\)\s*,\s*\([^,]\+\)\s*,\s*\([^)]\+\)\s*)$')
if len(l:lg) == 0 if len(lg) == 0
let l:lg = matchlist(l:token, '^\%(linear-gradient\|lg\)(\s*\(\S\+\)\s*,\s*\([^,]\+\)\s*)$') let lg = matchlist(token, '^\%(linear-gradient\|lg\)(\s*\(\S\+\)\s*,\s*\([^,]\+\)\s*)$')
if len(l:lg) if len(lg)
let [l:lg[1], l:lg[2], l:lg[3]] = ['linear', l:lg[1], l:lg[2]] let [lg[1], lg[2], lg[3]] = ['linear', lg[1], lg[2]]
endif endif
endif endif
if len(l:lg) if len(lg)
let l:current.name = '' let current.name = ''
let l:current.snippet = printf("background-image:-webkit-gradient(%s, 0 0, 0 100%%, from(%s), to(%s));\n", l:lg[1], l:lg[2], l:lg[3]) 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(l:root.child, deepcopy(l:current)) call add(root.child, deepcopy(current))
let l:current.snippet = printf("background-image:-webkit-linear-gradient(%s, %s);\n", l:lg[2], l:lg[3]) let current.snippet = printf("background-image:-webkit-linear-gradient(%s, %s);\n", lg[2], lg[3])
call add(l:root.child, deepcopy(l:current)) call add(root.child, deepcopy(current))
let l:current.snippet = printf("background-image:-moz-linear-gradient(%s, %s);\n", l:lg[2], l:lg[3]) let current.snippet = printf("background-image:-moz-linear-gradient(%s, %s);\n", lg[2], lg[3])
call add(l:root.child, deepcopy(l:current)) call add(root.child, deepcopy(current))
let l:current.snippet = printf("background-image:-o-linear-gradient(%s, %s);\n", l:lg[2], l:lg[3]) let current.snippet = printf("background-image:-o-linear-gradient(%s, %s);\n", lg[2], lg[3])
call add(l:root.child, deepcopy(l:current)) call add(root.child, deepcopy(current))
let l:current.snippet = printf("background-image:linear-gradient(%s, %s);\n", l:lg[2], l:lg[3]) let current.snippet = printf("background-image:linear-gradient(%s, %s);\n", lg[2], lg[3])
call add(l:root.child, deepcopy(l:current)) call add(root.child, deepcopy(current))
elseif l:prefix elseif prefix
let l:snippet = l:current.snippet let snippet = current.snippet
let l:current.snippet = '-webkit-' . l:snippet . "\n" let current.snippet = '-webkit-' . snippet . "\n"
call add(l:root.child, deepcopy(l:current)) call add(root.child, deepcopy(current))
let l:current.snippet = '-moz-' . l:snippet . "\n" let current.snippet = '-moz-' . snippet . "\n"
call add(l:root.child, deepcopy(l:current)) call add(root.child, deepcopy(current))
let l:current.snippet = '-o-' . l:snippet . "\n" let current.snippet = '-o-' . snippet . "\n"
call add(l:root.child, deepcopy(l:current)) call add(root.child, deepcopy(current))
let l:current.snippet = '-ms-' . l:snippet . "\n" let current.snippet = '-ms-' . snippet . "\n"
call add(l:root.child, deepcopy(l:current)) call add(root.child, deepcopy(current))
let l:current.snippet = l:snippet let current.snippet = snippet
call add(l:root.child, l:current) call add(root.child, current)
elseif l:token =~# '^c#\([0-9a-fA-F]\{3}\|[0-9a-fA-F]\{6}\)\(\.[0-9]\+\)\?' elseif token =~# '^c#\([0-9a-fA-F]\{3}\|[0-9a-fA-F]\{6}\)\(\.[0-9]\+\)\?'
let l:cs = split(l:token, '\.') let cs = split(token, '\.')
let l:current.name = '' let current.name = ''
let [l:r,l:g,l:b] = [0,0,0] let [r,g,b] = [0,0,0]
if len(l:cs[0]) == 5 if len(cs[0]) == 5
let l:rgb = matchlist(l:cs[0], 'c#\(.\)\(.\)\(.\)') let rgb = matchlist(cs[0], 'c#\(.\)\(.\)\(.\)')
let l:r = eval('0x'.l:rgb[1].l:rgb[1]) let r = eval('0x'.rgb[1].rgb[1])
let l:g = eval('0x'.l:rgb[2].l:rgb[2]) let g = eval('0x'.rgb[2].rgb[2])
let l:b = eval('0x'.l:rgb[3].l:rgb[3]) let b = eval('0x'.rgb[3].rgb[3])
elseif len(l:cs[0]) == 8 elseif len(cs[0]) == 8
let l:rgb = matchlist(l:cs[0], 'c#\(..\)\(..\)\(..\)') let rgb = matchlist(cs[0], 'c#\(..\)\(..\)\(..\)')
let l:r = eval('0x'.l:rgb[1]) let r = eval('0x'.rgb[1])
let l:g = eval('0x'.l:rgb[2]) let g = eval('0x'.rgb[2])
let l:b = eval('0x'.l:rgb[3]) let b = eval('0x'.rgb[3])
endif endif
if len(l:cs) == 1 if len(cs) == 1
let l:current.snippet = printf('color:rgb(%d, %d, %d);', l:r, l:g, l:b) let current.snippet = printf('color:rgb(%d, %d, %d);', r, g, b)
else else
let l:current.snippet = printf('color:rgb(%d, %d, %d, %s);', l:r, l:g, l:b, string(str2float('0.'.l:cs[1]))) let current.snippet = printf('color:rgb(%d, %d, %d, %s);', r, g, b, string(str2float('0.'.cs[1])))
endif endif
call add(l:root.child, l:current) call add(root.child, current)
elseif l:token =~# '^c#' elseif token =~# '^c#'
let l:current.name = '' let current.name = ''
let l:current.snippet = 'color:\${cursor};' let current.snippet = 'color:\${cursor};'
call add(l:root.child, l:current) call add(root.child, current)
else else
call add(l:root.child, l:current) call add(root.child, current)
endif endif
endfor endfor
endif endif
return l:root return root
endfunction endfunction
function! emmet#lang#css#toString(settings, current, type, inline, filters, itemno, indent) abort function! emmet#lang#css#toString(settings, current, type, inline, filters, itemno, indent) abort
let l:current = a:current let current = a:current
let l:value = l:current.value[1:-2] let value = current.value[1:-2]
let l:tmp = substitute(l:value, '\${cursor}', '', 'g') let tmp = substitute(value, '\${cursor}', '', 'g')
if l:tmp !~ '.*{[ \t\r\n]*}$' if tmp !~ '.*{[ \t\r\n]*}$'
if emmet#useFilter(a:filters, 'fc') if emmet#useFilter(a:filters, 'fc')
let l:value = substitute(l:value, '\([^:]\+\):\([^;]*\)', '\1: \2', 'g') let value = substitute(value, '\([^:]\+\):\([^;]*\)', '\1: \2', 'g')
else else
let l:value = substitute(l:value, '\([^:]\+\):\([^;]*\)', '\1:\2', 'g') let value = substitute(value, '\([^:]\+\):\([^;]*\)', '\1:\2', 'g')
endif endif
if l:current.important if current.important
let l:value = substitute(l:value, ';', ' !important;', '') let value = substitute(value, ';', ' !important;', '')
endif endif
endif endif
return l:value return value
endfunction endfunction
function! emmet#lang#css#imageSize() abort function! emmet#lang#css#imageSize() abort
let l:img_region = emmet#util#searchRegion('{', '}') let img_region = emmet#util#searchRegion('{', '}')
if !emmet#util#regionIsValid(l:img_region) || !emmet#util#cursorInRegion(l:img_region) if !emmet#util#regionIsValid(img_region) || !emmet#util#cursorInRegion(img_region)
return return
endif endif
let l:content = emmet#util#getContent(l:img_region) let content = emmet#util#getContent(img_region)
let l:fn = matchstr(l:content, '\<url(\zs[^)]\+\ze)') let fn = matchstr(content, '\<url(\zs[^)]\+\ze)')
let l:fn = substitute(l:fn, '[''" \t]', '', 'g') let fn = substitute(fn, '[''" \t]', '', 'g')
if l:fn =~# '^\s*$' if fn =~# '^\s*$'
return return
elseif l:fn !~# '^\(/\|http\)' elseif fn !~# '^\(/\|http\)'
let l:fn = simplify(expand('%:h') . '/' . l:fn) let fn = simplify(expand('%:h') . '/' . fn)
endif endif
let [l:width, l:height] = emmet#util#getImageSize(l:fn) let [width, height] = emmet#util#getImageSize(fn)
if l:width == -1 && l:height == -1 if width == -1 && height == -1
return return
endif endif
let l:indent = emmet#getIndentation('css') let indent = emmet#getIndentation('css')
if l:content =~# '.*\<width\s*:[^;]*;.*' if content =~# '.*\<width\s*:[^;]*;.*'
let l:content = substitute(l:content, '\<width\s*:[^;]*;', 'width: ' . l:width . 'px;', '') let content = substitute(content, '\<width\s*:[^;]*;', 'width: ' . width . 'px;', '')
else else
let l:content = substitute(l:content, '}', l:indent . 'width: ' . l:width . "px;\n}", '') let content = substitute(content, '}', indent . 'width: ' . width . "px;\n}", '')
endif endif
if l:content =~# '.*\<height\s*:[^;]*;.*' if content =~# '.*\<height\s*:[^;]*;.*'
let l:content = substitute(l:content, '\<height\s*:[^;]*;', 'height: ' . l:height . 'px;', '') let content = substitute(content, '\<height\s*:[^;]*;', 'height: ' . height . 'px;', '')
else else
let l:content = substitute(l:content, '}', l:indent . 'height: ' . l:height . "px;\n}", '') let content = substitute(content, '}', indent . 'height: ' . height . "px;\n}", '')
endif endif
call emmet#util#setContent(l:img_region, l:content) call emmet#util#setContent(img_region, content)
endfunction endfunction
function! emmet#lang#css#imageEncode() abort function! emmet#lang#css#imageEncode() abort
let l:img_region = emmet#util#searchRegion('url(', ')') let img_region = emmet#util#searchRegion('url(', ')')
if !emmet#util#regionIsValid(l:img_region) || !emmet#util#cursorInRegion(l:img_region) if !emmet#util#regionIsValid(img_region) || !emmet#util#cursorInRegion(img_region)
return return
endif endif
let l:content = emmet#util#getContent(l:img_region) let content = emmet#util#getContent(img_region)
let l:fn = matchstr(l:content, '\<url(\zs[^)]\+\ze)') let fn = matchstr(content, '\<url(\zs[^)]\+\ze)')
let l:fn = substitute(l:fn, '[''" \t]', '', 'g') let fn = substitute(fn, '[''" \t]', '', 'g')
if l:fn =~# '^\s*$' if fn =~# '^\s*$'
return return
elseif l:fn !~# '^\(/\|http\)' elseif fn !~# '^\(/\|http\)'
let l:fn = simplify(expand('%:h') . '/' . l:fn) let fn = simplify(expand('%:h') . '/' . fn)
endif endif
let l:encoded = emmet#util#imageEncodeDecode(l:fn, 0) let encoded = emmet#util#imageEncodeDecode(fn, 0)
call emmet#util#setContent(l:img_region, 'url(' . l:encoded . ')') call emmet#util#setContent(img_region, 'url(' . encoded . ')')
endfunction endfunction
function! emmet#lang#css#parseTag(tag) abort function! emmet#lang#css#parseTag(tag) abort
@@ -290,67 +291,67 @@ function! emmet#lang#css#parseTag(tag) abort
endfunction endfunction
function! emmet#lang#css#toggleComment() abort function! emmet#lang#css#toggleComment() abort
let l:line = getline('.') let line = getline('.')
let l:mx = '^\(\s*\)/\*\s*\(.*\)\s*\*/\s*$' let mx = '^\(\s*\)/\*\s*\(.*\)\s*\*/\s*$'
if l:line =~# '{\s*$' if line =~# '{\s*$'
let l:block = emmet#util#searchRegion('/\*', '\*/\zs') let block = emmet#util#searchRegion('/\*', '\*/\zs')
if emmet#util#regionIsValid(l:block) if emmet#util#regionIsValid(block)
let l:content = emmet#util#getContent(l:block) let content = emmet#util#getContent(block)
let l:content = substitute(l:content, '/\*\s\(.*\)\s\*/', '\1', '') let content = substitute(content, '/\*\s\(.*\)\s\*/', '\1', '')
call emmet#util#setContent(l:block, l:content) call emmet#util#setContent(block, content)
else else
let l:node = expand('<cword>') let node = expand('<cword>')
if len(l:node) if len(node)
exe "normal ciw\<c-r>='/* '.l:node.' */'\<cr>" exe "normal ciw\<c-r>='/* '.node.' */'\<cr>"
endif endif
endif endif
else else
if l:line =~# l:mx if line =~# mx
let l:space = substitute(matchstr(l:line, l:mx), l:mx, '\1', '') let space = substitute(matchstr(line, mx), mx, '\1', '')
let l:line = substitute(matchstr(l:line, l:mx), l:mx, '\2', '') let line = substitute(matchstr(line, mx), mx, '\2', '')
let l:line = l:space . substitute(l:line, '^\s*\|\s*$', '\1', 'g') let line = space . substitute(line, '^\s*\|\s*$', '\1', 'g')
else else
let l:mx = '^\(\s*\)\(''[^'']*''\|[^'']*\|;\)\s*$' let mx = '^\(\s*\)\(''[^'']*''\|[^'']*\|;\)\s*$'
" TODO multi-property " TODO multi-property
"let l:mx = '^\(\s*\)\(\%(''[^'']*''\|[^'';]\+\)*;\{0,1}\)' "let mx = '^\(\s*\)\(\%(''[^'']*''\|[^'';]\+\)*;\{0,1}\)'
let l:line = substitute(l:line, l:mx, '\1/* \2 */', '') let line = substitute(line, mx, '\1/* \2 */', '')
endif endif
call setline('.', l:line) call setline('.', line)
endif endif
endfunction endfunction
function! emmet#lang#css#balanceTag(flag) range abort function! emmet#lang#css#balanceTag(flag) range abort
if a:flag == -2 || a:flag == 2 if a:flag == -2 || a:flag == 2
let l:curpos = [0, line("'<"), col("'<"), 0] let curpos = [0, line("'<"), col("'<"), 0]
else else
let l:curpos = emmet#util#getcurpos() let curpos = emmet#util#getcurpos()
endif endif
let l:block = emmet#util#getVisualBlock() let block = emmet#util#getVisualBlock()
if !emmet#util#regionIsValid(l:block) if !emmet#util#regionIsValid(block)
if a:flag > 0 if a:flag > 0
let l:block = emmet#util#searchRegion('^', ';') let block = emmet#util#searchRegion('^', ';')
if emmet#util#regionIsValid(l:block) if emmet#util#regionIsValid(block)
call emmet#util#selectRegion(l:block) call emmet#util#selectRegion(block)
return return
endif endif
endif endif
else else
if a:flag > 0 if a:flag > 0
let l:content = emmet#util#getContent(l:block) let content = emmet#util#getContent(block)
if l:content !~# '^{.*}$' if content !~# '^{.*}$'
let l:block = emmet#util#searchRegion('{', '}') let block = emmet#util#searchRegion('{', '}')
if emmet#util#regionIsValid(l:block) if emmet#util#regionIsValid(block)
call emmet#util#selectRegion(l:block) call emmet#util#selectRegion(block)
return return
endif endif
endif endif
else else
let l:pos = searchpos('.*;', 'nW') let pos = searchpos('.*;', 'nW')
if l:pos[0] != 0 if pos[0] != 0
call setpos('.', [0, l:pos[0], l:pos[1], 0]) call setpos('.', [0, pos[0], pos[1], 0])
let l:block = emmet#util#searchRegion('^', ';') let block = emmet#util#searchRegion('^', ';')
if emmet#util#regionIsValid(l:block) if emmet#util#regionIsValid(block)
call emmet#util#selectRegion(l:block) call emmet#util#selectRegion(block)
return return
endif endif
endif endif
@@ -359,7 +360,7 @@ function! emmet#lang#css#balanceTag(flag) range abort
if a:flag == -2 || a:flag == 2 if a:flag == -2 || a:flag == 2
silent! exe 'normal! gv' silent! exe 'normal! gv'
else else
call setpos('.', l:curpos) call setpos('.', curpos)
endif endif
endfunction endfunction

View File

@@ -3,24 +3,24 @@ function! emmet#lang#elm#findTokens(str) abort
endfunction endfunction
function! emmet#lang#elm#parseIntoTree(abbr, type) abort function! emmet#lang#elm#parseIntoTree(abbr, type) abort
let l:tree = emmet#lang#html#parseIntoTree(a:abbr, a:type) let tree = emmet#lang#html#parseIntoTree(a:abbr, a:type)
if len(l:tree.child) < 2 | return l:tree | endif if len(tree.child) < 2 | return tree | endif
" Add ',' nodes between root elements. " Add ',' nodes between root elements.
let l:new_children = [] let new_children = []
for l:child in l:tree.child[0:-2] for child in tree.child[0:-2]
let l:comma = emmet#newNode() let comma = emmet#newNode()
let l:comma.name = ',' let comma.name = ','
call add(l:new_children, l:child) call add(new_children, child)
call add(l:new_children, l:comma) call add(new_children, comma)
endfor endfor
call add(l:new_children, l:tree.child[-1]) call add(new_children, tree.child[-1])
let l:tree.child = l:new_children let tree.child = new_children
return l:tree return tree
endfunction endfunction
function! emmet#lang#elm#renderNode(node) function! emmet#lang#elm#renderNode(node)
let l:elm_nodes = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6' let elm_nodes = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'
\, 'div', 'p', 'hr', 'pre', 'blockquote' \, 'div', 'p', 'hr', 'pre', 'blockquote'
\, 'span', 'a', 'code', 'em', 'strong', 'i', 'b', 'u', 'sub', 'sup', 'br' \, 'span', 'a', 'code', 'em', 'strong', 'i', 'b', 'u', 'sub', 'sup', 'br'
\, 'ol', 'ul', 'li', 'dl', 'dt', 'dd' \, 'ol', 'ul', 'li', 'dl', 'dt', 'dd'
@@ -37,14 +37,14 @@ function! emmet#lang#elm#renderNode(node)
\, 'mark', 'ruby', 'rt', 'rp', 'bdi', 'bdo', 'wbr' \, 'mark', 'ruby', 'rt', 'rp', 'bdi', 'bdo', 'wbr'
\, 'details', 'summary', 'menuitem', 'menu'] \, 'details', 'summary', 'menuitem', 'menu']
if index(l:elm_nodes, a:node) >= 0 if index(elm_nodes, a:node) >= 0
return a:node return a:node
endif endif
return 'node "' . a:node . '"' return 'node "' . a:node . '"'
endfunction endfunction
function! emmet#lang#elm#renderParam(param) function! emmet#lang#elm#renderParam(param)
let l:elm_events = ["onClick", "onDoubleClick" let elm_events = ["onClick", "onDoubleClick"
\, "onMouseDown", "onMouseUp" \, "onMouseDown", "onMouseUp"
\, "onMouseEnter", "onMouseLeave" \, "onMouseEnter", "onMouseLeave"
\, "onMouseOver", "onMouseOut" \, "onMouseOver", "onMouseOut"
@@ -52,10 +52,10 @@ function! emmet#lang#elm#renderParam(param)
\, "onBlur", "onFocus" \, "onBlur", "onFocus"
\, "on", "onWithOptions", "Options", "defaultOptions" \, "on", "onWithOptions", "Options", "defaultOptions"
\, "targetValue", "targetChecked", "keyCode"] \, "targetValue", "targetChecked", "keyCode"]
if index(l:elm_events, a:param) >= 0 if index(elm_events, a:param) >= 0
return a:param return a:param
endif endif
let l:elm_attributes = ["style", "map" , "class", "id", "title", "hidden" let elm_attributes = ["style", "map" , "class", "id", "title", "hidden"
\, "type", "type_", "value", "defaultValue", "checked", "placeholder", "selected" \, "type", "type_", "value", "defaultValue", "checked", "placeholder", "selected"
\, "accept", "acceptCharset", "action", "autocomplete", "autofocus" \, "accept", "acceptCharset", "action", "autocomplete", "autofocus"
\, "disabled", "enctype", "formaction", "list", "maxlength", "minlength", "method", "multiple" \, "disabled", "enctype", "formaction", "list", "maxlength", "minlength", "method", "multiple"
@@ -75,7 +75,7 @@ function! emmet#lang#elm#renderParam(param)
\, "challenge", "keytype" \, "challenge", "keytype"
\, "cite", "datetime", "pubdate", "manifest"] \, "cite", "datetime", "pubdate", "manifest"]
if index(l:elm_attributes, a:param) >= 0 if index(elm_attributes, a:param) >= 0
if a:param == 'type' if a:param == 'type'
return 'type_' return 'type_'
endif endif
@@ -85,130 +85,130 @@ function! emmet#lang#elm#renderParam(param)
endfunction endfunction
function! emmet#lang#elm#toString(settings, current, type, inline, filters, itemno, indent) abort function! emmet#lang#elm#toString(settings, current, type, inline, filters, itemno, indent) abort
let l:settings = a:settings let settings = a:settings
let l:current = a:current let current = a:current
let l:type = a:type let type = a:type
let l:inline = a:inline let inline = a:inline
let l:filters = a:filters let filters = a:filters
let l:itemno = a:itemno let itemno = a:itemno
let l:indent = emmet#getIndentation(l:type) let indent = emmet#getIndentation(type)
let l:dollar_expr = emmet#getResource(l:type, 'dollar_expr', 1) let dollar_expr = emmet#getResource(type, 'dollar_expr', 1)
let l:str = '' let str = ''
" comma between items with *, eg. li*3 " comma between items with *, eg. li*3
if l:itemno > 0 if itemno > 0
let l:str = ", " let str = ", "
endif endif
let l:current_name = l:current.name let current_name = current.name
if l:dollar_expr if dollar_expr
let l:current_name = substitute(l:current.name, '\$$', l:itemno+1, '') let current_name = substitute(current.name, '\$$', itemno+1, '')
endif endif
if len(l:current.name) > 0 if len(current.name) > 0
" inserted root comma nodes " inserted root comma nodes
if l:current_name == ',' if current_name == ','
return "\n, " return "\n, "
endif endif
let l:str .= emmet#lang#elm#renderNode(l:current_name) let str .= emmet#lang#elm#renderNode(current_name)
let l:tmp = '' let tmp = ''
for l:attr in emmet#util#unique(l:current.attrs_order + keys(l:current.attr)) for attr in emmet#util#unique(current.attrs_order + keys(current.attr))
if !has_key(l:current.attr, l:attr) if !has_key(current.attr, attr)
continue continue
endif endif
let l:Val = l:current.attr[l:attr] let Val = current.attr[attr]
let l:attr = emmet#lang#elm#renderParam(l:attr) let attr = emmet#lang#elm#renderParam(attr)
if type(l:Val) == 2 && l:Val == function('emmet#types#true') if type(Val) == 2 && Val == function('emmet#types#true')
let l:tmp .= ', ' . l:attr . ' True' let tmp .= ', ' . attr . ' True'
else else
if l:dollar_expr if dollar_expr
while l:Val =~# '\$\([^#{]\|$\)' while Val =~# '\$\([^#{]\|$\)'
let l:Val = substitute(l:Val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let Val = substitute(Val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
endwhile endwhile
let l:attr = substitute(l:attr, '\$$', l:itemno+1, '') let attr = substitute(attr, '\$$', itemno+1, '')
endif endif
let l:valtmp = substitute(l:Val, '\${cursor}', '', '') let valtmp = substitute(Val, '\${cursor}', '', '')
if l:attr ==# 'id' && len(l:valtmp) > 0 if attr ==# 'id' && len(valtmp) > 0
let l:tmp .=', id "' . l:Val . '"' let tmp .=', id "' . Val . '"'
elseif l:attr ==# 'class' && len(l:valtmp) > 0 elseif attr ==# 'class' && len(valtmp) > 0
let l:tmp .= ', class "' . substitute(l:Val, '\.', ' ', 'g') . '"' let tmp .= ', class "' . substitute(Val, '\.', ' ', 'g') . '"'
else else
let l:tmp .= ', ' . l:attr . ' "' . l:Val . '"' let tmp .= ', ' . attr . ' "' . Val . '"'
endif endif
endif endif
endfor endfor
if ! len(l:tmp) if ! len(tmp)
let l:str .= ' []' let str .= ' []'
else else
let l:tmp = strpart(l:tmp, 2) let tmp = strpart(tmp, 2)
let l:str .= ' [ ' . l:tmp . ' ]' let str .= ' [ ' . tmp . ' ]'
endif endif
" No children quit early " No children quit early
if len(l:current.child) == 0 && len(l:current.value) == 0 if len(current.child) == 0 && len(current.value) == 0
"Place cursor in node with no value or children "Place cursor in node with no value or children
let l:str .= ' [${cursor}]' let str .= ' [${cursor}]'
return l:str return str
endif endif
let l:inner = '' let inner = ''
" Parent contex text " Parent contex text
if len(l:current.value) > 0 if len(current.value) > 0
let l:text = l:current.value[1:-2] let text = current.value[1:-2]
if l:dollar_expr if dollar_expr
let l:text = substitute(l:text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:text = substitute(l:text, '\${nr}', "\n", 'g') let text = substitute(text, '\${nr}', "\n", 'g')
let l:text = substitute(l:text, '\\\$', '$', 'g') let text = substitute(text, '\\\$', '$', 'g')
" let l:str = substitute(l:str, '\$#', l:text, 'g') " let str = substitute(str, '\$#', text, 'g')
let l:inner .= ', text "' . l:text . '"' let inner .= ', text "' . text . '"'
endif endif
endif endif
" Has children " Has children
for l:child in l:current.child for child in current.child
if len(l:child.name) == 0 && len(l:child.value) > 0 if len(child.name) == 0 && len(child.value) > 0
" Text node " Text node
let l:text = l:child.value[1:-2] let text = child.value[1:-2]
if l:dollar_expr if dollar_expr
let l:text = substitute(l:text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:text = substitute(l:text, '\${nr}', "\n", 'g') let text = substitute(text, '\${nr}', "\n", 'g')
let l:text = substitute(l:text, '\\\$', '$', 'g') let text = substitute(text, '\\\$', '$', 'g')
endif endif
let l:inner .= ', text "' . l:text . '"' let inner .= ', text "' . text . '"'
else else
" Other nodes " Other nodes
let l:inner .= ', ' . emmet#toString(l:child, l:type, l:inline, l:filters, 0, l:indent) let inner .= ', ' . emmet#toString(child, type, inline, filters, 0, indent)
endif endif
endfor endfor
let l:inner = substitute(l:inner, "\n", "\n" . escape(l:indent, '\'), 'g') let inner = substitute(inner, "\n", "\n" . escape(indent, '\'), 'g')
let l:inner = substitute(l:inner, "\n" . escape(l:indent, '\') . '$', '', 'g') let inner = substitute(inner, "\n" . escape(indent, '\') . '$', '', 'g')
let l:inner = strpart(l:inner, 2) let inner = strpart(inner, 2)
let l:inner = substitute(l:inner, ' ', '', 'g') let inner = substitute(inner, ' ', '', 'g')
if ! len(l:inner) if ! len(inner)
let l:str .= ' []' let str .= ' []'
else else
let l:str .= ' [ ' . l:inner . ' ]' let str .= ' [ ' . inner . ' ]'
endif endif
else else
let l:str = l:current.value[1:-2] let str = current.value[1:-2]
if l:dollar_expr if dollar_expr
let l:str = substitute(l:str, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let str = substitute(str, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:str = substitute(l:str, '\${nr}', "\n", 'g') let str = substitute(str, '\${nr}', "\n", 'g')
let l:str = substitute(l:str, '\\\$', '$', 'g') let str = substitute(str, '\\\$', '$', 'g')
endif endif
endif endif
let l:str .= "\n" let str .= "\n"
return l:str return str
endfunction endfunction
function! emmet#lang#elm#imageEncode() abort function! emmet#lang#elm#imageEncode() abort

View File

@@ -7,251 +7,251 @@ function! emmet#lang#haml#parseIntoTree(abbr, type) abort
endfunction endfunction
function! emmet#lang#haml#toString(settings, current, type, inline, filters, itemno, indent) abort function! emmet#lang#haml#toString(settings, current, type, inline, filters, itemno, indent) abort
let l:settings = a:settings let settings = a:settings
let l:current = a:current let current = a:current
let l:type = a:type let type = a:type
let l:inline = a:inline let inline = a:inline
let l:filters = a:filters let filters = a:filters
let l:itemno = a:itemno let itemno = a:itemno
let l:indent = emmet#getIndentation(l:type) let indent = emmet#getIndentation(type)
let l:dollar_expr = emmet#getResource(l:type, 'dollar_expr', 1) let dollar_expr = emmet#getResource(type, 'dollar_expr', 1)
let l:attribute_style = emmet#getResource('haml', 'attribute_style', 'hash') let attribute_style = emmet#getResource('haml', 'attribute_style', 'hash')
let l:str = '' let str = ''
let l:current_name = l:current.name let current_name = current.name
if l:dollar_expr if dollar_expr
let l:current_name = substitute(l:current.name, '\$$', l:itemno+1, '') let current_name = substitute(current.name, '\$$', itemno+1, '')
endif endif
if len(l:current.name) > 0 if len(current.name) > 0
let l:str .= '%' . l:current_name let str .= '%' . current_name
let l:tmp = '' let tmp = ''
for l:attr in emmet#util#unique(l:current.attrs_order + keys(l:current.attr)) for attr in emmet#util#unique(current.attrs_order + keys(current.attr))
if !has_key(l:current.attr, l:attr) if !has_key(current.attr, attr)
continue continue
endif endif
let l:Val = l:current.attr[l:attr] let Val = current.attr[attr]
if type(l:Val) == 2 && l:Val == function('emmet#types#true') if type(Val) == 2 && Val == function('emmet#types#true')
if l:attribute_style ==# 'hash' if attribute_style ==# 'hash'
let l:tmp .= ' :' . l:attr . ' => true' let tmp .= ' :' . attr . ' => true'
elseif l:attribute_style ==# 'html' elseif attribute_style ==# 'html'
let l:tmp .= l:attr . '=true' let tmp .= attr . '=true'
end end
else else
if l:dollar_expr if dollar_expr
while l:Val =~# '\$\([^#{]\|$\)' while Val =~# '\$\([^#{]\|$\)'
let l:Val = substitute(l:Val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let Val = substitute(Val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
endwhile endwhile
let l:attr = substitute(l:attr, '\$$', l:itemno+1, '') let attr = substitute(attr, '\$$', itemno+1, '')
endif endif
let l:valtmp = substitute(l:Val, '\${cursor}', '', '') let valtmp = substitute(Val, '\${cursor}', '', '')
if l:attr ==# 'id' && len(l:valtmp) > 0 if attr ==# 'id' && len(valtmp) > 0
let l:str .= '#' . l:Val let str .= '#' . Val
elseif l:attr ==# 'class' && len(l:valtmp) > 0 elseif attr ==# 'class' && len(valtmp) > 0
let l:str .= '.' . substitute(l:Val, ' ', '.', 'g') let str .= '.' . substitute(Val, ' ', '.', 'g')
else else
if len(l:tmp) > 0 if len(tmp) > 0
if l:attribute_style ==# 'hash' if attribute_style ==# 'hash'
let l:tmp .= ',' let tmp .= ','
elseif l:attribute_style ==# 'html' elseif attribute_style ==# 'html'
let l:tmp .= ' ' let tmp .= ' '
endif endif
endif endif
if l:attribute_style ==# 'hash' if attribute_style ==# 'hash'
let l:tmp .= ' :' . l:attr . ' => "' . l:Val . '"' let tmp .= ' :' . attr . ' => "' . Val . '"'
elseif l:attribute_style ==# 'html' elseif attribute_style ==# 'html'
let l:tmp .= l:attr . '="' . l:Val . '"' let tmp .= attr . '="' . Val . '"'
end end
endif endif
endif endif
endfor endfor
if len(l:tmp) if len(tmp)
if l:attribute_style ==# 'hash' if attribute_style ==# 'hash'
let l:str .= '{' . l:tmp . ' }' let str .= '{' . tmp . ' }'
elseif l:attribute_style ==# 'html' elseif attribute_style ==# 'html'
let l:str .= '(' . l:tmp . ')' let str .= '(' . tmp . ')'
end end
endif endif
if stridx(','.l:settings.html.empty_elements.',', ','.l:current_name.',') != -1 && len(l:current.value) == 0 if stridx(','.settings.html.empty_elements.',', ','.current_name.',') != -1 && len(current.value) == 0
let l:str .= '/' let str .= '/'
endif endif
let l:inner = '' let inner = ''
if len(l:current.value) > 0 if len(current.value) > 0
let l:text = l:current.value[1:-2] let text = current.value[1:-2]
if l:dollar_expr if dollar_expr
let l:text = substitute(l:text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:text = substitute(l:text, '\${nr}', "\n", 'g') let text = substitute(text, '\${nr}', "\n", 'g')
let l:text = substitute(l:text, '\\\$', '$', 'g') let text = substitute(text, '\\\$', '$', 'g')
let l:str = substitute(l:str, '\$#', l:text, 'g') let str = substitute(str, '\$#', text, 'g')
endif endif
let l:lines = split(l:text, "\n") let lines = split(text, "\n")
if len(l:lines) == 1 if len(lines) == 1
let l:str .= ' ' . l:text let str .= ' ' . text
else else
for l:line in l:lines for line in lines
let l:str .= "\n" . l:indent . l:line . ' |' let str .= "\n" . indent . line . ' |'
endfor endfor
endif endif
elseif len(l:current.child) == 0 elseif len(current.child) == 0
let l:str .= '${cursor}' let str .= '${cursor}'
endif endif
if len(l:current.child) == 1 && len(l:current.child[0].name) == 0 if len(current.child) == 1 && len(current.child[0].name) == 0
let l:text = l:current.child[0].value[1:-2] let text = current.child[0].value[1:-2]
if l:dollar_expr if dollar_expr
let l:text = substitute(l:text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:text = substitute(l:text, '\${nr}', "\n", 'g') let text = substitute(text, '\${nr}', "\n", 'g')
let l:text = substitute(l:text, '\\\$', '$', 'g') let text = substitute(text, '\\\$', '$', 'g')
endif endif
let l:lines = split(l:text, "\n") let lines = split(text, "\n")
if len(l:lines) == 1 if len(lines) == 1
let l:str .= ' ' . l:text let str .= ' ' . text
else else
for l:line in l:lines for line in lines
let l:str .= "\n" . l:indent . l:line . ' |' let str .= "\n" . indent . line . ' |'
endfor endfor
endif endif
elseif len(l:current.child) > 0 elseif len(current.child) > 0
for l:child in l:current.child for child in current.child
let l:inner .= emmet#toString(l:child, l:type, l:inline, l:filters, l:itemno, l:indent) let inner .= emmet#toString(child, type, inline, filters, itemno, indent)
endfor endfor
let l:inner = substitute(l:inner, "\n", "\n" . escape(l:indent, '\'), 'g') let inner = substitute(inner, "\n", "\n" . escape(indent, '\'), 'g')
let l:inner = substitute(l:inner, "\n" . escape(l:indent, '\') . '$', '', 'g') let inner = substitute(inner, "\n" . escape(indent, '\') . '$', '', 'g')
let l:str .= "\n" . l:indent . l:inner let str .= "\n" . indent . inner
endif endif
else else
let l:str = l:current.value[1:-2] let str = current.value[1:-2]
if l:dollar_expr if dollar_expr
let l:str = substitute(l:str, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let str = substitute(str, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:str = substitute(l:str, '\${nr}', "\n", 'g') let str = substitute(str, '\${nr}', "\n", 'g')
let l:str = substitute(l:str, '\\\$', '$', 'g') let str = substitute(str, '\\\$', '$', 'g')
endif endif
endif endif
let l:str .= "\n" let str .= "\n"
return l:str return str
endfunction endfunction
function! emmet#lang#haml#imageSize() abort function! emmet#lang#haml#imageSize() abort
let l:line = getline('.') let line = getline('.')
let l:current = emmet#lang#haml#parseTag(l:line) let current = emmet#lang#haml#parseTag(line)
if empty(l:current) || !has_key(l:current.attr, 'src') if empty(current) || !has_key(current.attr, 'src')
return return
endif endif
let l:fn = l:current.attr.src let fn = current.attr.src
if l:fn =~# '^\s*$' if fn =~# '^\s*$'
return return
elseif l:fn !~# '^\(/\|http\)' elseif fn !~# '^\(/\|http\)'
let l:fn = simplify(expand('%:h') . '/' . l:fn) let fn = simplify(expand('%:h') . '/' . fn)
endif endif
let [l:width, l:height] = emmet#util#getImageSize(l:fn) let [width, height] = emmet#util#getImageSize(fn)
if l:width == -1 && l:height == -1 if width == -1 && height == -1
return return
endif endif
let l:current.attr.width = l:width let current.attr.width = width
let l:current.attr.height = l:height let current.attr.height = height
let l:current.attrs_order += ['width', 'height'] let current.attrs_order += ['width', 'height']
let l:haml = emmet#toString(l:current, 'haml', 1) let haml = emmet#toString(current, 'haml', 1)
let l:haml = substitute(l:haml, '\${cursor}', '', '') let haml = substitute(haml, '\${cursor}', '', '')
call setline('.', substitute(matchstr(l:line, '^\s*') . l:haml, "\n", '', 'g')) call setline('.', substitute(matchstr(line, '^\s*') . haml, "\n", '', 'g'))
endfunction endfunction
function! emmet#lang#haml#imageEncode() abort function! emmet#lang#haml#imageEncode() abort
endfunction endfunction
function! emmet#lang#haml#parseTag(tag) abort function! emmet#lang#haml#parseTag(tag) abort
let l:current = emmet#newNode() let current = emmet#newNode()
let l:mx = '%\([a-zA-Z][a-zA-Z0-9]*\)\s*\%({\(.*\)}\)' let mx = '%\([a-zA-Z][a-zA-Z0-9]*\)\s*\%({\(.*\)}\)'
let l:match = matchstr(a:tag, l:mx) let match = matchstr(a:tag, mx)
let l:current.name = substitute(l:match, l:mx, '\1', '') let current.name = substitute(match, mx, '\1', '')
let l:attrs = substitute(l:match, l:mx, '\2', '') let attrs = substitute(match, mx, '\2', '')
let l:mx = '\([a-zA-Z0-9]\+\)\s*=>\s*\%(\([^"'' \t]\+\)\|"\([^"]\{-}\)"\|''\([^'']\{-}\)''\)' let mx = '\([a-zA-Z0-9]\+\)\s*=>\s*\%(\([^"'' \t]\+\)\|"\([^"]\{-}\)"\|''\([^'']\{-}\)''\)'
while len(l:attrs) > 0 while len(attrs) > 0
let l:match = matchstr(l:attrs, l:mx) let match = matchstr(attrs, mx)
if len(l:match) ==# 0 if len(match) ==# 0
break break
endif endif
let l:attr_match = matchlist(l:match, l:mx) let attr_match = matchlist(match, mx)
let l:name = l:attr_match[1] let name = attr_match[1]
let l:value = len(l:attr_match[2]) ? l:attr_match[2] : l:attr_match[3] let value = len(attr_match[2]) ? attr_match[2] : attr_match[3]
let l:current.attr[l:name] = l:value let current.attr[name] = value
let l:current.attrs_order += [l:name] let current.attrs_order += [name]
let l:attrs = l:attrs[stridx(l:attrs, l:match) + len(l:match):] let attrs = attrs[stridx(attrs, match) + len(match):]
endwhile endwhile
return l:current return current
endfunction endfunction
function! emmet#lang#haml#toggleComment() abort function! emmet#lang#haml#toggleComment() abort
let l:line = getline('.') let line = getline('.')
let l:space = matchstr(l:line, '^\s*') let space = matchstr(line, '^\s*')
if l:line =~# '^\s*-#' if line =~# '^\s*-#'
call setline('.', l:space . matchstr(l:line[len(l:space)+2:], '^\s*\zs.*')) call setline('.', space . matchstr(line[len(space)+2:], '^\s*\zs.*'))
elseif l:line =~# '^\s*%[a-z]' elseif line =~# '^\s*%[a-z]'
call setline('.', l:space . '-# ' . l:line[len(l:space):]) call setline('.', space . '-# ' . line[len(space):])
endif endif
endfunction endfunction
function! emmet#lang#haml#balanceTag(flag) range abort function! emmet#lang#haml#balanceTag(flag) range abort
let l:block = emmet#util#getVisualBlock() let block = emmet#util#getVisualBlock()
if a:flag == -2 || a:flag == 2 if a:flag == -2 || a:flag == 2
let l:curpos = [0, line("'<"), col("'<"), 0] let curpos = [0, line("'<"), col("'<"), 0]
else else
let l:curpos = emmet#util#getcurpos() let curpos = emmet#util#getcurpos()
endif endif
let l:n = l:curpos[1] let n = curpos[1]
let l:ml = len(matchstr(getline(l:n), '^\s*')) let ml = len(matchstr(getline(n), '^\s*'))
if a:flag > 0 if a:flag > 0
if a:flag == 1 || !emmet#util#regionIsValid(l:block) if a:flag == 1 || !emmet#util#regionIsValid(block)
let l:n = line('.') let n = line('.')
else else
while l:n > 0 while n > 0
let l:l = len(matchstr(getline(l:n), '^\s*\ze%[a-z]')) let l = len(matchstr(getline(n), '^\s*\ze%[a-z]'))
if l:l > 0 && l:l < l:ml if l > 0 && l < ml
let l:ml = l:l let ml = l
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
endif endif
let l:sn = l:n let sn = n
if l:n == 0 if n == 0
let l:ml = 0 let ml = 0
endif endif
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*%[a-z]')) let l = len(matchstr(getline(n), '^\s*%[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
call setpos('.', [0, l:n, 1, 0]) call setpos('.', [0, n, 1, 0])
normal! V normal! V
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
else else
while l:n > 0 while n > 0
let l:l = len(matchstr(getline(l:n), '^\s*\ze[a-z]')) let l = len(matchstr(getline(n), '^\s*\ze[a-z]'))
if l:l > 0 && l:l > l:ml if l > 0 && l > ml
let l:ml = l:l let ml = l
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
let l:sn = l:n let sn = n
if l:n == 0 if n == 0
let l:ml = 0 let ml = 0
endif endif
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*%[a-z]')) let l = len(matchstr(getline(n), '^\s*%[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
call setpos('.', [0, l:n, 1, 0]) call setpos('.', [0, n, 1, 0])
normal! V normal! V
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
endif endif
endfunction endfunction
@@ -260,76 +260,76 @@ function! emmet#lang#haml#moveNextPrevItem(flag) abort
endfunction endfunction
function! emmet#lang#haml#moveNextPrev(flag) abort function! emmet#lang#haml#moveNextPrev(flag) abort
let l:pos = search('""', a:flag ? 'Wb' : 'W') let pos = search('""', a:flag ? 'Wb' : 'W')
if l:pos != 0 if pos != 0
silent! normal! l silent! normal! l
startinsert startinsert
endif endif
endfunction endfunction
function! emmet#lang#haml#splitJoinTag() abort function! emmet#lang#haml#splitJoinTag() abort
let l:n = line('.') let n = line('.')
let l:sml = len(matchstr(getline(l:n), '^\s*%[a-z]')) let sml = len(matchstr(getline(n), '^\s*%[a-z]'))
while l:n > 0 while n > 0
if getline(l:n) =~# '^\s*\ze%[a-z]' if getline(n) =~# '^\s*\ze%[a-z]'
if len(matchstr(getline(l:n), '^\s*%[a-z]')) < l:sml if len(matchstr(getline(n), '^\s*%[a-z]')) < sml
break break
endif endif
let l:line = getline(l:n) let line = getline(n)
call setline(l:n, substitute(l:line, '^\s*%\w\+\%(\s*{[^}]*}\|\s\)\zs.*', '', '')) call setline(n, substitute(line, '^\s*%\w\+\%(\s*{[^}]*}\|\s\)\zs.*', '', ''))
let l:sn = l:n let sn = n
let l:n += 1 let n += 1
let l:ml = len(matchstr(getline(l:n), '^\s*%[a-z]')) let ml = len(matchstr(getline(n), '^\s*%[a-z]'))
if len(matchstr(getline(l:n), '^\s*')) > l:ml if len(matchstr(getline(n), '^\s*')) > ml
while l:n <= line('$') while n <= line('$')
let l:l = len(matchstr(getline(l:n), '^\s*')) let l = len(matchstr(getline(n), '^\s*'))
if l:l <= l:ml if l <= ml
break break
endif endif
exe l:n 'delete' exe n 'delete'
endwhile endwhile
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
else else
let l:tag = matchstr(getline(l:sn), '^\s*%\zs\(\w\+\)') let tag = matchstr(getline(sn), '^\s*%\zs\(\w\+\)')
let l:spaces = matchstr(getline(l:sn), '^\s*') let spaces = matchstr(getline(sn), '^\s*')
let l:settings = emmet#getSettings() let settings = emmet#getSettings()
if stridx(','.l:settings.html.inline_elements.',', ','.l:tag.',') == -1 if stridx(','.settings.html.inline_elements.',', ','.tag.',') == -1
call append(l:sn, l:spaces . ' ') call append(sn, spaces . ' ')
call setpos('.', [0, l:sn+1, 1, 0]) call setpos('.', [0, sn+1, 1, 0])
else else
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
endif endif
startinsert! startinsert!
endif endif
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
endfunction endfunction
function! emmet#lang#haml#removeTag() abort function! emmet#lang#haml#removeTag() abort
let l:n = line('.') let n = line('.')
let l:ml = 0 let ml = 0
while l:n > 0 while n > 0
if getline(l:n) =~# '^\s*\ze[a-z]' if getline(n) =~# '^\s*\ze[a-z]'
let l:ml = len(matchstr(getline(l:n), '^\s*%[a-z]')) let ml = len(matchstr(getline(n), '^\s*%[a-z]'))
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
let l:sn = l:n let sn = n
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*%[a-z]')) let l = len(matchstr(getline(n), '^\s*%[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
if l:sn == l:n if sn == n
exe 'delete' exe 'delete'
else else
exe l:sn ',' (l:n-1) 'delete' exe sn ',' (n-1) 'delete'
endif endif
endfunction endfunction

File diff suppressed because it is too large Load Diff

View File

@@ -7,248 +7,248 @@ function! emmet#lang#jade#parseIntoTree(abbr, type) abort
endfunction endfunction
function! emmet#lang#jade#toString(settings, current, type, inline, filters, itemno, indent) abort function! emmet#lang#jade#toString(settings, current, type, inline, filters, itemno, indent) abort
let l:settings = a:settings let settings = a:settings
let l:current = a:current let current = a:current
let l:type = a:type let type = a:type
let l:inline = a:inline let inline = a:inline
let l:filters = a:filters let filters = a:filters
let l:itemno = a:itemno let itemno = a:itemno
let l:indent = emmet#getIndentation(l:type) let indent = emmet#getIndentation(type)
let l:dollar_expr = emmet#getResource(l:type, 'dollar_expr', 1) let dollar_expr = emmet#getResource(type, 'dollar_expr', 1)
let l:attribute_style = emmet#getResource('jade', 'attribute_style', 'hash') let attribute_style = emmet#getResource('jade', 'attribute_style', 'hash')
let l:str = '' let str = ''
let l:current_name = l:current.name let current_name = current.name
if l:dollar_expr if dollar_expr
let l:current_name = substitute(l:current.name, '\$$', l:itemno+1, '') let current_name = substitute(current.name, '\$$', itemno+1, '')
endif endif
if len(l:current.name) > 0 if len(current.name) > 0
let l:str .= '' . l:current_name let str .= '' . current_name
let l:tmp = '' let tmp = ''
for l:attr in emmet#util#unique(l:current.attrs_order + keys(l:current.attr)) for attr in emmet#util#unique(current.attrs_order + keys(current.attr))
if !has_key(l:current.attr, l:attr) if !has_key(current.attr, attr)
continue continue
endif endif
let l:Val = l:current.attr[l:attr] let Val = current.attr[attr]
if type(l:Val) == 2 && l:Val == function('emmet#types#true') if type(Val) == 2 && Val == function('emmet#types#true')
if l:attribute_style ==# 'hash' if attribute_style ==# 'hash'
let l:tmp .= ' ' . l:attr . ' = true' let tmp .= ' ' . attr . ' = true'
elseif l:attribute_style ==# 'html' elseif attribute_style ==# 'html'
let l:tmp .= l:attr . '=true' let tmp .= attr . '=true'
end end
else else
if l:dollar_expr if dollar_expr
while l:Val =~# '\$\([^#{]\|$\)' while Val =~# '\$\([^#{]\|$\)'
let l:Val = substitute(l:Val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let Val = substitute(Val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
endwhile endwhile
let l:attr = substitute(l:attr, '\$$', l:itemno+1, '') let attr = substitute(attr, '\$$', itemno+1, '')
endif endif
let l:valtmp = substitute(l:Val, '\${cursor}', '', '') let valtmp = substitute(Val, '\${cursor}', '', '')
if l:attr ==# 'id' && len(l:valtmp) > 0 if attr ==# 'id' && len(valtmp) > 0
let l:str .= '#' . l:Val let str .= '#' . Val
elseif l:attr ==# 'class' && len(l:valtmp) > 0 elseif attr ==# 'class' && len(valtmp) > 0
let l:str .= '.' . substitute(l:Val, ' ', '.', 'g') let str .= '.' . substitute(Val, ' ', '.', 'g')
else else
if len(l:tmp) > 0 if len(tmp) > 0
if l:attribute_style ==# 'hash' if attribute_style ==# 'hash'
let l:tmp .= ', ' let tmp .= ', '
elseif l:attribute_style ==# 'html' elseif attribute_style ==# 'html'
let l:tmp .= ' ' let tmp .= ' '
endif endif
endif endif
if l:attribute_style ==# 'hash' if attribute_style ==# 'hash'
let l:tmp .= '' . l:attr . '="' . l:Val . '"' let tmp .= '' . attr . '="' . Val . '"'
elseif l:attribute_style ==# 'html' elseif attribute_style ==# 'html'
let l:tmp .= l:attr . '="' . l:Val . '"' let tmp .= attr . '="' . Val . '"'
end end
endif endif
endif endif
endfor endfor
if len(l:tmp) if len(tmp)
if l:attribute_style ==# 'hash' if attribute_style ==# 'hash'
let l:str .= '(' . l:tmp . ')' let str .= '(' . tmp . ')'
elseif l:attribute_style ==# 'html' elseif attribute_style ==# 'html'
let l:str .= '(' . l:tmp . ')' let str .= '(' . tmp . ')'
end end
endif endif
let l:inner = '' let inner = ''
if len(l:current.value) > 0 if len(current.value) > 0
let l:text = l:current.value[1:-2] let text = current.value[1:-2]
if l:dollar_expr if dollar_expr
let l:text = substitute(l:text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:text = substitute(l:text, '\${nr}', "\n", 'g') let text = substitute(text, '\${nr}', "\n", 'g')
let l:text = substitute(l:text, '\\\$', '$', 'g') let text = substitute(text, '\\\$', '$', 'g')
let l:str = substitute(l:str, '\$#', l:text, 'g') let str = substitute(str, '\$#', text, 'g')
endif endif
let l:lines = split(l:text, "\n") let lines = split(text, "\n")
if len(l:lines) == 1 if len(lines) == 1
let l:str .= ' ' . l:text let str .= ' ' . text
else else
for l:line in l:lines for line in lines
let l:str .= "\n" . l:indent . l:line . ' |' let str .= "\n" . indent . line . ' |'
endfor endfor
endif endif
elseif len(l:current.child) == 0 elseif len(current.child) == 0
let l:str .= '${cursor}' let str .= '${cursor}'
endif endif
if len(l:current.child) == 1 && len(l:current.child[0].name) == 0 if len(current.child) == 1 && len(current.child[0].name) == 0
let l:text = l:current.child[0].value[1:-2] let text = current.child[0].value[1:-2]
if l:dollar_expr if dollar_expr
let l:text = substitute(l:text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:text = substitute(l:text, '\${nr}', "\n", 'g') let text = substitute(text, '\${nr}', "\n", 'g')
let l:text = substitute(l:text, '\\\$', '$', 'g') let text = substitute(text, '\\\$', '$', 'g')
endif endif
let l:lines = split(l:text, "\n") let lines = split(text, "\n")
if len(l:lines) == 1 if len(lines) == 1
let l:str .= ' ' . l:text let str .= ' ' . text
else else
for l:line in l:lines for line in lines
let l:str .= "\n" . l:indent . l:line . ' |' let str .= "\n" . indent . line . ' |'
endfor endfor
endif endif
elseif len(l:current.child) > 0 elseif len(current.child) > 0
for l:child in l:current.child for child in current.child
let l:inner .= emmet#toString(l:child, l:type, l:inline, l:filters, l:itemno, l:indent) let inner .= emmet#toString(child, type, inline, filters, itemno, indent)
endfor endfor
let l:inner = substitute(l:inner, "\n", "\n" . escape(l:indent, '\'), 'g') let inner = substitute(inner, "\n", "\n" . escape(indent, '\'), 'g')
let l:inner = substitute(l:inner, "\n" . escape(l:indent, '\') . '$', '', 'g') let inner = substitute(inner, "\n" . escape(indent, '\') . '$', '', 'g')
let l:str .= "\n" . l:indent . l:inner let str .= "\n" . indent . inner
endif endif
else else
let l:str = l:current.value[1:-2] let str = current.value[1:-2]
if l:dollar_expr if dollar_expr
let l:str = substitute(l:str, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let str = substitute(str, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:str = substitute(l:str, '\${nr}', "\n", 'g') let str = substitute(str, '\${nr}', "\n", 'g')
let l:str = substitute(l:str, '\\\$', '$', 'g') let str = substitute(str, '\\\$', '$', 'g')
endif endif
endif endif
let l:str .= "\n" let str .= "\n"
return l:str return str
endfunction endfunction
function! emmet#lang#jade#imageSize() abort function! emmet#lang#jade#imageSize() abort
let l:line = getline('.') let line = getline('.')
let l:current = emmet#lang#jade#parseTag(l:line) let current = emmet#lang#jade#parseTag(line)
if empty(l:current) || !has_key(l:current.attr, 'src') if empty(current) || !has_key(current.attr, 'src')
return return
endif endif
let l:fn = l:current.attr.src let fn = current.attr.src
if l:fn =~# '^\s*$' if fn =~# '^\s*$'
return return
elseif l:fn !~# '^\(/\|http\)' elseif fn !~# '^\(/\|http\)'
let l:fn = simplify(expand('%:h') . '/' . l:fn) let fn = simplify(expand('%:h') . '/' . fn)
endif endif
let [l:width, l:height] = emmet#util#getImageSize(l:fn) let [width, height] = emmet#util#getImageSize(fn)
if l:width == -1 && l:height == -1 if width == -1 && height == -1
return return
endif endif
let l:current.attr.width = l:width let current.attr.width = width
let l:current.attr.height = l:height let current.attr.height = height
let l:current.attrs_order += ['width', 'height'] let current.attrs_order += ['width', 'height']
let l:jade = emmet#toString(l:current, 'jade', 1) let jade = emmet#toString(current, 'jade', 1)
let l:jade = substitute(l:jade, '\${cursor}', '', '') let jade = substitute(jade, '\${cursor}', '', '')
call setline('.', substitute(matchstr(l:line, '^\s*') . l:jade, "\n", '', 'g')) call setline('.', substitute(matchstr(line, '^\s*') . jade, "\n", '', 'g'))
endfunction endfunction
function! emmet#lang#jade#imageEncode() abort function! emmet#lang#jade#imageEncode() abort
endfunction endfunction
function! emmet#lang#jade#parseTag(tag) abort function! emmet#lang#jade#parseTag(tag) abort
let l:current = emmet#newNode() let current = emmet#newNode()
let l:mx = '%\([a-zA-Z][a-zA-Z0-9]*\)\s*\%({\(.*\)}\)' let mx = '%\([a-zA-Z][a-zA-Z0-9]*\)\s*\%({\(.*\)}\)'
let l:match = matchstr(a:tag, l:mx) let match = matchstr(a:tag, mx)
let l:current.name = substitute(l:match, l:mx, '\1', '') let current.name = substitute(match, mx, '\1', '')
let l:attrs = substitute(l:match, l:mx, '\2', '') let attrs = substitute(match, mx, '\2', '')
let l:mx = '\([a-zA-Z0-9]\+\)\s*=>\s*\%(\([^"'' \t]\+\)\|"\([^"]\{-}\)"\|''\([^'']\{-}\)''\)' let mx = '\([a-zA-Z0-9]\+\)\s*=>\s*\%(\([^"'' \t]\+\)\|"\([^"]\{-}\)"\|''\([^'']\{-}\)''\)'
while len(l:attrs) > 0 while len(attrs) > 0
let l:match = matchstr(l:attrs, l:mx) let match = matchstr(attrs, mx)
if len(l:match) ==# 0 if len(match) ==# 0
break break
endif endif
let l:attr_match = matchlist(l:match, l:mx) let attr_match = matchlist(match, mx)
let l:name = l:attr_match[1] let name = attr_match[1]
let l:value = len(l:attr_match[2]) ? l:attr_match[2] : l:attr_match[3] let value = len(attr_match[2]) ? attr_match[2] : attr_match[3]
let l:current.attr[l:name] = l:value let current.attr[name] = value
let l:current.attrs_order += [l:name] let current.attrs_order += [name]
let l:attrs = l:attrs[stridx(l:attrs, l:match) + len(l:match):] let attrs = attrs[stridx(attrs, match) + len(match):]
endwhile endwhile
return l:current return current
endfunction endfunction
function! emmet#lang#jade#toggleComment() abort function! emmet#lang#jade#toggleComment() abort
let l:line = getline('.') let line = getline('.')
let l:space = matchstr(l:line, '^\s*') let space = matchstr(line, '^\s*')
if l:line =~# '^\s*-#' if line =~# '^\s*-#'
call setline('.', l:space . matchstr(l:line[len(l:space)+2:], '^\s*\zs.*')) call setline('.', space . matchstr(line[len(space)+2:], '^\s*\zs.*'))
elseif l:line =~# '^\s*%[a-z]' elseif line =~# '^\s*%[a-z]'
call setline('.', l:space . '-# ' . l:line[len(l:space):]) call setline('.', space . '-# ' . line[len(space):])
endif endif
endfunction endfunction
function! emmet#lang#jade#balanceTag(flag) range abort function! emmet#lang#jade#balanceTag(flag) range abort
let l:block = emmet#util#getVisualBlock() let block = emmet#util#getVisualBlock()
if a:flag == -2 || a:flag == 2 if a:flag == -2 || a:flag == 2
let l:curpos = [0, line("'<"), col("'<"), 0] let curpos = [0, line("'<"), col("'<"), 0]
else else
let l:curpos = emmet#util#getcurpos() let curpos = emmet#util#getcurpos()
endif endif
let l:n = l:curpos[1] let n = curpos[1]
let l:ml = len(matchstr(getline(l:n), '^\s*')) let ml = len(matchstr(getline(n), '^\s*'))
if a:flag > 0 if a:flag > 0
if a:flag == 1 || !emmet#util#regionIsValid(l:block) if a:flag == 1 || !emmet#util#regionIsValid(block)
let l:n = line('.') let n = line('.')
else else
while l:n > 0 while n > 0
let l:l = len(matchstr(getline(l:n), '^\s*\ze%[a-z]')) let l = len(matchstr(getline(n), '^\s*\ze%[a-z]'))
if l:l > 0 && l:l < l:ml if l > 0 && l < ml
let l:ml = l:l let ml = l
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
endif endif
let l:sn = l:n let sn = n
if l:n == 0 if n == 0
let l:ml = 0 let ml = 0
endif endif
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*%[a-z]')) let l = len(matchstr(getline(n), '^\s*%[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
call setpos('.', [0, l:n, 1, 0]) call setpos('.', [0, n, 1, 0])
normal! V normal! V
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
else else
while l:n > 0 while n > 0
let l:l = len(matchstr(getline(l:n), '^\s*\ze[a-z]')) let l = len(matchstr(getline(n), '^\s*\ze[a-z]'))
if l:l > 0 && l:l > l:ml if l > 0 && l > ml
let l:ml = l:l let ml = l
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
let l:sn = l:n let sn = n
if l:n == 0 if n == 0
let l:ml = 0 let ml = 0
endif endif
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*%[a-z]')) let l = len(matchstr(getline(n), '^\s*%[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
call setpos('.', [0, l:n, 1, 0]) call setpos('.', [0, n, 1, 0])
normal! V normal! V
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
endif endif
endfunction endfunction
@@ -257,76 +257,76 @@ function! emmet#lang#jade#moveNextPrevItem(flag) abort
endfunction endfunction
function! emmet#lang#jade#moveNextPrev(flag) abort function! emmet#lang#jade#moveNextPrev(flag) abort
let l:pos = search('""', a:flag ? 'Wb' : 'W') let pos = search('""', a:flag ? 'Wb' : 'W')
if l:pos != 0 if pos != 0
silent! normal! l silent! normal! l
startinsert startinsert
endif endif
endfunction endfunction
function! emmet#lang#jade#splitJoinTag() abort function! emmet#lang#jade#splitJoinTag() abort
let l:n = line('.') let n = line('.')
let l:sml = len(matchstr(getline(l:n), '^\s*%[a-z]')) let sml = len(matchstr(getline(n), '^\s*%[a-z]'))
while l:n > 0 while n > 0
if getline(l:n) =~# '^\s*\ze%[a-z]' if getline(n) =~# '^\s*\ze%[a-z]'
if len(matchstr(getline(l:n), '^\s*%[a-z]')) < l:sml if len(matchstr(getline(n), '^\s*%[a-z]')) < sml
break break
endif endif
let l:line = getline(l:n) let line = getline(n)
call setline(l:n, substitute(l:line, '^\s*%\w\+\%(\s*{[^}]*}\|\s\)\zs.*', '', '')) call setline(n, substitute(line, '^\s*%\w\+\%(\s*{[^}]*}\|\s\)\zs.*', '', ''))
let l:sn = l:n let sn = n
let l:n += 1 let n += 1
let l:ml = len(matchstr(getline(l:n), '^\s*%[a-z]')) let ml = len(matchstr(getline(n), '^\s*%[a-z]'))
if len(matchstr(getline(l:n), '^\s*')) > l:ml if len(matchstr(getline(n), '^\s*')) > ml
while l:n <= line('$') while n <= line('$')
let l:l = len(matchstr(getline(l:n), '^\s*')) let l = len(matchstr(getline(n), '^\s*'))
if l:l <= l:ml if l <= ml
break break
endif endif
exe l:n 'delete' exe n 'delete'
endwhile endwhile
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
else else
let l:tag = matchstr(getline(l:sn), '^\s*%\zs\(\w\+\)') let tag = matchstr(getline(sn), '^\s*%\zs\(\w\+\)')
let l:spaces = matchstr(getline(l:sn), '^\s*') let spaces = matchstr(getline(sn), '^\s*')
let l:settings = emmet#getSettings() let settings = emmet#getSettings()
if stridx(','.l:settings.html.inline_elements.',', ','.l:tag.',') == -1 if stridx(','.settings.html.inline_elements.',', ','.tag.',') == -1
call append(l:sn, l:spaces . ' ') call append(sn, spaces . ' ')
call setpos('.', [0, l:sn+1, 1, 0]) call setpos('.', [0, sn+1, 1, 0])
else else
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
endif endif
startinsert! startinsert!
endif endif
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
endfunction endfunction
function! emmet#lang#jade#removeTag() abort function! emmet#lang#jade#removeTag() abort
let l:n = line('.') let n = line('.')
let l:ml = 0 let ml = 0
while l:n > 0 while n > 0
if getline(l:n) =~# '^\s*\ze[a-z]' if getline(n) =~# '^\s*\ze[a-z]'
let l:ml = len(matchstr(getline(l:n), '^\s*%[a-z]')) let ml = len(matchstr(getline(n), '^\s*%[a-z]'))
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
let l:sn = l:n let sn = n
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*%[a-z]')) let l = len(matchstr(getline(n), '^\s*%[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
if l:sn == l:n if sn == n
exe 'delete' exe 'delete'
else else
exe l:sn ',' (l:n-1) 'delete' exe sn ',' (n-1) 'delete'
endif endif
endfunction endfunction

View File

@@ -7,59 +7,59 @@ function! emmet#lang#sass#parseIntoTree(abbr, type) abort
endfunction endfunction
function! emmet#lang#sass#toString(settings, current, type, inline, filters, itemno, indent) abort function! emmet#lang#sass#toString(settings, current, type, inline, filters, itemno, indent) abort
let l:settings = a:settings let settings = a:settings
let l:current = a:current let current = a:current
let l:type = a:type let type = a:type
let l:inline = a:inline let inline = a:inline
let l:filters = a:filters let filters = a:filters
let l:itemno = a:itemno let itemno = a:itemno
let l:indent = a:indent let indent = a:indent
let l:str = '' let str = ''
let l:current_name = l:current.name let current_name = current.name
let l:current_name = substitute(l:current.name, '\$$', l:itemno+1, '') let current_name = substitute(current.name, '\$$', itemno+1, '')
if len(l:current.name) > 0 if len(current.name) > 0
let l:str .= l:current_name let str .= current_name
let l:tmp = '' let tmp = ''
for l:attr in keys(l:current.attr) for attr in keys(current.attr)
let l:val = l:current.attr[l:attr] let val = current.attr[attr]
while l:val =~# '\$\([^#{]\|$\)' while val =~# '\$\([^#{]\|$\)'
let l:val = substitute(l:val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let val = substitute(val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
endwhile endwhile
let l:attr = substitute(l:attr, '\$$', l:itemno+1, '') let attr = substitute(attr, '\$$', itemno+1, '')
if l:attr ==# 'id' if attr ==# 'id'
let l:str .= '#' . l:val let str .= '#' . val
elseif l:attr ==# 'class' elseif attr ==# 'class'
let l:str .= '.' . l:val let str .= '.' . val
else else
let l:tmp .= l:attr . ': ' . l:val let tmp .= attr . ': ' . val
endif endif
endfor endfor
if len(l:tmp) > 0 if len(tmp) > 0
let l:str .= "\n" let str .= "\n"
for l:line in split(l:tmp, "\n") for line in split(tmp, "\n")
let l:str .= l:indent . l:line . "\n" let str .= indent . line . "\n"
endfor endfor
else else
let l:str .= "\n" let str .= "\n"
endif endif
let l:inner = '' let inner = ''
for l:child in l:current.child for child in current.child
let l:tmp = emmet#toString(l:child, l:type, l:inline, l:filters, l:itemno, l:indent) let tmp = emmet#toString(child, type, inline, filters, itemno, indent)
let l:tmp = substitute(l:tmp, "\n", "\n" . escape(l:indent, '\'), 'g') let tmp = substitute(tmp, "\n", "\n" . escape(indent, '\'), 'g')
let l:tmp = substitute(l:tmp, "\n" . escape(l:indent, '\') . '$', '${cursor}\n', 'g') let tmp = substitute(tmp, "\n" . escape(indent, '\') . '$', '${cursor}\n', 'g')
let l:inner .= l:tmp let inner .= tmp
endfor endfor
if len(l:inner) > 0 if len(inner) > 0
let l:str .= l:indent . l:inner let str .= indent . inner
endif endif
else else
let l:text = emmet#lang#css#toString(l:settings, l:current, l:type, l:inline, l:filters, l:itemno, l:indent) let text = emmet#lang#css#toString(settings, current, type, inline, filters, itemno, indent)
let l:text = substitute(l:text, '\s*;\ze\(\${[^}]\+}\)\?\(\n\|$\)', '', 'g') let text = substitute(text, '\s*;\ze\(\${[^}]\+}\)\?\(\n\|$\)', '', 'g')
return l:text return text
endif endif
return l:str return str
endfunction endfunction
function! emmet#lang#sass#imageSize() abort function! emmet#lang#sass#imageSize() abort
@@ -75,67 +75,67 @@ function! emmet#lang#sass#toggleComment() abort
endfunction endfunction
function! emmet#lang#sass#balanceTag(flag) range abort function! emmet#lang#sass#balanceTag(flag) range abort
let l:block = emmet#util#getVisualBlock() let block = emmet#util#getVisualBlock()
if a:flag == -2 || a:flag == 2 if a:flag == -2 || a:flag == 2
let l:curpos = [0, line("'<"), col("'<"), 0] let curpos = [0, line("'<"), col("'<"), 0]
else else
let l:curpos = emmet#util#getcurpos() let curpos = emmet#util#getcurpos()
endif endif
let l:n = l:curpos[1] let n = curpos[1]
let l:ml = len(matchstr(getline(l:n), '^\s*')) let ml = len(matchstr(getline(n), '^\s*'))
if a:flag > 0 if a:flag > 0
if a:flag == 1 || !emmet#util#regionIsValid(l:block) if a:flag == 1 || !emmet#util#regionIsValid(block)
let l:n = line('.') let n = line('.')
else else
while l:n > 0 while n > 0
let l:l = len(matchstr(getline(l:n), '^\s*\ze[a-z]')) let l = len(matchstr(getline(n), '^\s*\ze[a-z]'))
if l:l > 0 && l:l < l:ml if l > 0 && l < ml
let l:ml = l:l let ml = l
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
endif endif
let l:sn = l:n let sn = n
if l:n == 0 if n == 0
let l:ml = 0 let ml = 0
endif endif
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*[a-z]')) let l = len(matchstr(getline(n), '^\s*[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
call setpos('.', [0, l:n, 1, 0]) call setpos('.', [0, n, 1, 0])
normal! V normal! V
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
else else
while l:n > 0 while n > 0
let l:l = len(matchstr(getline(l:n), '^\s*\ze[a-z]')) let l = len(matchstr(getline(n), '^\s*\ze[a-z]'))
if l:l > 0 && l:l > l:ml if l > 0 && l > ml
let l:ml = l:l let ml = l
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
let l:sn = l:n let sn = n
if l:n == 0 if n == 0
let l:ml = 0 let ml = 0
endif endif
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*[a-z]')) let l = len(matchstr(getline(n), '^\s*[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
call setpos('.', [0, l:n, 1, 0]) call setpos('.', [0, n, 1, 0])
normal! V normal! V
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
endif endif
endfunction endfunction
@@ -144,10 +144,10 @@ function! emmet#lang#sass#moveNextPrevItem(flag) abort
endfunction endfunction
function! emmet#lang#sass#moveNextPrev(flag) abort function! emmet#lang#sass#moveNextPrev(flag) abort
let l:pos = search('""\|\(^\s*|\s*\zs\)', a:flag ? 'Wpb' : 'Wp') let pos = search('""\|\(^\s*|\s*\zs\)', a:flag ? 'Wpb' : 'Wp')
if l:pos == 2 if pos == 2
startinsert! startinsert!
elseif l:pos != 0 elseif pos != 0
silent! normal! l silent! normal! l
startinsert startinsert
endif endif

View File

@@ -11,53 +11,53 @@ function! emmet#lang#scss#parseIntoTree(abbr, type) abort
endfunction endfunction
function! emmet#lang#scss#toString(settings, current, type, inline, filters, itemno, indent) abort function! emmet#lang#scss#toString(settings, current, type, inline, filters, itemno, indent) abort
let l:settings = a:settings let settings = a:settings
let l:current = a:current let current = a:current
let l:type = a:type let type = a:type
let l:inline = a:inline let inline = a:inline
let l:filters = a:filters let filters = a:filters
let l:itemno = a:itemno let itemno = a:itemno
let l:indent = a:indent let indent = a:indent
let l:str = '' let str = ''
let l:current_name = substitute(l:current.name, '\$$', l:itemno+1, '') let current_name = substitute(current.name, '\$$', itemno+1, '')
if len(l:current.name) > 0 if len(current.name) > 0
let l:str .= l:current_name let str .= current_name
let l:tmp = '' let tmp = ''
for l:attr in keys(l:current.attr) for attr in keys(current.attr)
let l:val = l:current.attr[l:attr] let val = current.attr[attr]
while l:val =~# '\$\([^#{]\|$\)' while val =~# '\$\([^#{]\|$\)'
let l:val = substitute(l:val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let val = substitute(val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
endwhile endwhile
let l:attr = substitute(l:attr, '\$$', l:itemno+1, '') let attr = substitute(attr, '\$$', itemno+1, '')
if l:attr ==# 'id' if attr ==# 'id'
let l:str .= '#' . l:val let str .= '#' . val
elseif l:attr ==# 'class' elseif attr ==# 'class'
let l:str .= '.' . l:val let str .= '.' . val
else else
let l:tmp .= l:attr . ': ' . l:val . ';' let tmp .= attr . ': ' . val . ';'
endif endif
endfor endfor
if len(l:tmp) > 0 if len(tmp) > 0
let l:str .= " {\n" let str .= " {\n"
for l:line in split(l:tmp, "\n") for line in split(tmp, "\n")
let l:str .= l:indent . l:line . "\n" let str .= indent . line . "\n"
endfor endfor
else else
let l:str .= " {\n" let str .= " {\n"
endif endif
let l:inner = '' let inner = ''
for l:child in l:current.child for child in current.child
let l:inner .= emmet#toString(l:child, l:type, l:inline, l:filters, l:itemno) let inner .= emmet#toString(child, type, inline, filters, itemno)
endfor endfor
let l:inner = substitute(l:inner, "\n", "\n" . escape(l:indent, '\'), 'g') let inner = substitute(inner, "\n", "\n" . escape(indent, '\'), 'g')
let l:inner = substitute(l:inner, "\n" . escape(l:indent, '\') . '$', '', 'g') let inner = substitute(inner, "\n" . escape(indent, '\') . '$', '', 'g')
let l:str .= l:indent . l:inner . "${cursor}\n}\n" let str .= indent . inner . "${cursor}\n}\n"
else else
return emmet#lang#css#toString(l:settings, l:current, l:type, l:inline, l:filters, l:itemno, l:indent) return emmet#lang#css#toString(settings, current, type, inline, filters, itemno, indent)
endif endif
return l:str return str
endfunction endfunction
function! emmet#lang#scss#imageSize() abort function! emmet#lang#scss#imageSize() abort
@@ -78,33 +78,33 @@ endfunction
function! emmet#lang#scss#balanceTag(flag) range abort function! emmet#lang#scss#balanceTag(flag) range abort
if a:flag == -2 || a:flag == 2 if a:flag == -2 || a:flag == 2
let l:curpos = [0, line("'<"), col("'<"), 0] let curpos = [0, line("'<"), col("'<"), 0]
call setpos('.', l:curpos) call setpos('.', curpos)
else else
let l:curpos = emmet#util#getcurpos() let curpos = emmet#util#getcurpos()
endif endif
if a:flag < 0 if a:flag < 0
let l:ret = searchpair('}', '', '.\zs{') let ret = searchpair('}', '', '.\zs{')
else else
let l:ret = searchpair('{', '', '}', 'bW') let ret = searchpair('{', '', '}', 'bW')
endif endif
if l:ret > 0 if ret > 0
let l:pos1 = emmet#util#getcurpos()[1:2] let pos1 = emmet#util#getcurpos()[1:2]
if a:flag < 0 if a:flag < 0
let l:pos2 = searchpairpos('{', '', '}') let pos2 = searchpairpos('{', '', '}')
else else
let l:pos2 = searchpairpos('{', '', '}') let pos2 = searchpairpos('{', '', '}')
endif endif
let l:block = [l:pos1, l:pos2] let block = [pos1, pos2]
if emmet#util#regionIsValid(l:block) if emmet#util#regionIsValid(block)
call emmet#util#selectRegion(l:block) call emmet#util#selectRegion(block)
return return
endif endif
endif endif
if a:flag == -2 || a:flag == 2 if a:flag == -2 || a:flag == 2
silent! exe 'normal! gv' silent! exe 'normal! gv'
else else
call setpos('.', l:curpos) call setpos('.', curpos)
endif endif
endfunction endfunction

View File

@@ -7,210 +7,210 @@ function! emmet#lang#slim#parseIntoTree(abbr, type) abort
endfunction endfunction
function! emmet#lang#slim#toString(settings, current, type, inline, filters, itemno, indent) abort function! emmet#lang#slim#toString(settings, current, type, inline, filters, itemno, indent) abort
let l:current = a:current let current = a:current
let l:type = a:type let type = a:type
let l:inline = a:inline let inline = a:inline
let l:filters = a:filters let filters = a:filters
let l:itemno = a:itemno let itemno = a:itemno
let l:indent = emmet#getIndentation(l:type) let indent = emmet#getIndentation(type)
let l:dollar_expr = emmet#getResource(l:type, 'dollar_expr', 1) let dollar_expr = emmet#getResource(type, 'dollar_expr', 1)
let l:str = '' let str = ''
let l:current_name = l:current.name let current_name = current.name
if l:dollar_expr if dollar_expr
let l:current_name = substitute(l:current.name, '\$$', l:itemno+1, '') let current_name = substitute(current.name, '\$$', itemno+1, '')
endif endif
if len(l:current.name) > 0 if len(current.name) > 0
let l:str .= l:current_name let str .= current_name
for l:attr in emmet#util#unique(l:current.attrs_order + keys(l:current.attr)) for attr in emmet#util#unique(current.attrs_order + keys(current.attr))
if !has_key(l:current.attr, l:attr) if !has_key(current.attr, attr)
continue continue
endif endif
let l:Val = l:current.attr[l:attr] let Val = current.attr[attr]
if type(l:Val) == 2 && l:Val == function('emmet#types#true') if type(Val) == 2 && Val == function('emmet#types#true')
let l:str .= ' ' . l:attr . '=true' let str .= ' ' . attr . '=true'
else else
if l:dollar_expr if dollar_expr
while l:Val =~# '\$\([^#{]\|$\)' while Val =~# '\$\([^#{]\|$\)'
let l:Val = substitute(l:Val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let Val = substitute(Val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
endwhile endwhile
endif endif
let l:attr = substitute(l:attr, '\$$', l:itemno+1, '') let attr = substitute(attr, '\$$', itemno+1, '')
let l:str .= ' ' . l:attr . '="' . l:Val . '"' let str .= ' ' . attr . '="' . Val . '"'
endif endif
endfor endfor
let l:inner = '' let inner = ''
if len(l:current.value) > 0 if len(current.value) > 0
let l:str .= "\n" let str .= "\n"
let l:text = l:current.value[1:-2] let text = current.value[1:-2]
if l:dollar_expr if dollar_expr
let l:text = substitute(l:text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:text = substitute(l:text, '\${nr}', "\n", 'g') let text = substitute(text, '\${nr}', "\n", 'g')
let l:text = substitute(l:text, '\\\$', '$', 'g') let text = substitute(text, '\\\$', '$', 'g')
let l:str = substitute(l:str, '\$#', l:text, 'g') let str = substitute(str, '\$#', text, 'g')
endif endif
for l:line in split(l:text, "\n") for line in split(text, "\n")
let l:str .= l:indent . '| ' . l:line . "\n" let str .= indent . '| ' . line . "\n"
endfor endfor
elseif len(l:current.child) == 0 elseif len(current.child) == 0
let l:str .= '${cursor}' let str .= '${cursor}'
endif endif
if len(l:current.child) == 1 && len(l:current.child[0].name) == 0 if len(current.child) == 1 && len(current.child[0].name) == 0
let l:str .= "\n" let str .= "\n"
let l:text = l:current.child[0].value[1:-2] let text = current.child[0].value[1:-2]
if l:dollar_expr if dollar_expr
let l:text = substitute(l:text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:text = substitute(l:text, '\${nr}', "\n", 'g') let text = substitute(text, '\${nr}', "\n", 'g')
let l:text = substitute(l:text, '\\\$', '$', 'g') let text = substitute(text, '\\\$', '$', 'g')
endif endif
for l:line in split(l:text, "\n") for line in split(text, "\n")
let l:str .= l:indent . '| ' . l:line . "\n" let str .= indent . '| ' . line . "\n"
endfor endfor
elseif len(l:current.child) > 0 elseif len(current.child) > 0
for l:child in l:current.child for child in current.child
let l:inner .= emmet#toString(l:child, l:type, l:inline, l:filters, l:itemno, l:indent) let inner .= emmet#toString(child, type, inline, filters, itemno, indent)
endfor endfor
let l:inner = substitute(l:inner, "\n", "\n" . escape(l:indent, '\'), 'g') let inner = substitute(inner, "\n", "\n" . escape(indent, '\'), 'g')
let l:inner = substitute(l:inner, "\n" . escape(l:indent, '\') . '$', '', 'g') let inner = substitute(inner, "\n" . escape(indent, '\') . '$', '', 'g')
let l:str .= "\n" . l:indent . l:inner let str .= "\n" . indent . inner
endif endif
else else
let l:str = l:current.value[1:-2] let str = current.value[1:-2]
if l:dollar_expr if dollar_expr
let l:str = substitute(l:str, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let str = substitute(str, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:str = substitute(l:str, '\${nr}', "\n", 'g') let str = substitute(str, '\${nr}', "\n", 'g')
let l:str = substitute(l:str, '\\\$', '$', 'g') let str = substitute(str, '\\\$', '$', 'g')
endif endif
endif endif
if l:str !~# "\n$" if str !~# "\n$"
let l:str .= "\n" let str .= "\n"
endif endif
return l:str return str
endfunction endfunction
function! emmet#lang#slim#imageSize() abort function! emmet#lang#slim#imageSize() abort
let l:line = getline('.') let line = getline('.')
let l:current = emmet#lang#slim#parseTag(l:line) let current = emmet#lang#slim#parseTag(line)
if empty(l:current) || !has_key(l:current.attr, 'src') if empty(current) || !has_key(current.attr, 'src')
return return
endif endif
let l:fn = l:current.attr.src let fn = current.attr.src
if l:fn =~# '^\s*$' if fn =~# '^\s*$'
return return
elseif l:fn !~# '^\(/\|http\)' elseif fn !~# '^\(/\|http\)'
let l:fn = simplify(expand('%:h') . '/' . l:fn) let fn = simplify(expand('%:h') . '/' . fn)
endif endif
let [l:width, l:height] = emmet#util#getImageSize(l:fn) let [width, height] = emmet#util#getImageSize(fn)
if l:width == -1 && l:height == -1 if width == -1 && height == -1
return return
endif endif
let l:current.attr.width = l:width let current.attr.width = width
let l:current.attr.height = l:height let current.attr.height = height
let l:current.attrs_order += ['width', 'height'] let current.attrs_order += ['width', 'height']
let l:slim = emmet#toString(l:current, 'slim', 1) let slim = emmet#toString(current, 'slim', 1)
let l:slim = substitute(l:slim, '\${cursor}', '', '') let slim = substitute(slim, '\${cursor}', '', '')
call setline('.', substitute(matchstr(l:line, '^\s*') . l:slim, "\n", '', 'g')) call setline('.', substitute(matchstr(line, '^\s*') . slim, "\n", '', 'g'))
endfunction endfunction
function! emmet#lang#slim#imageEncode() abort function! emmet#lang#slim#imageEncode() abort
endfunction endfunction
function! emmet#lang#slim#parseTag(tag) abort function! emmet#lang#slim#parseTag(tag) abort
let l:current = emmet#newNode() let current = emmet#newNode()
let l:mx = '\([a-zA-Z][a-zA-Z0-9]*\)\s\+\(.*\)' let mx = '\([a-zA-Z][a-zA-Z0-9]*\)\s\+\(.*\)'
let l:match = matchstr(a:tag, l:mx) let match = matchstr(a:tag, mx)
let l:current.name = substitute(l:match, l:mx, '\1', '') let current.name = substitute(match, mx, '\1', '')
let l:attrs = substitute(l:match, l:mx, '\2', '') let attrs = substitute(match, mx, '\2', '')
let l:mx = '\([a-zA-Z0-9]\+\)=\%(\([^"'' \t]\+\)\|"\([^"]\{-}\)"\|''\([^'']\{-}\)''\)' let mx = '\([a-zA-Z0-9]\+\)=\%(\([^"'' \t]\+\)\|"\([^"]\{-}\)"\|''\([^'']\{-}\)''\)'
while len(l:attrs) > 0 while len(attrs) > 0
let l:match = matchstr(l:attrs, l:mx) let match = matchstr(attrs, mx)
if len(l:match) == 0 if len(match) == 0
break break
endif endif
let l:attr_match = matchlist(l:match, l:mx) let attr_match = matchlist(match, mx)
let l:name = l:attr_match[1] let name = attr_match[1]
let l:value = len(l:attr_match[2]) ? l:attr_match[2] : l:attr_match[3] let value = len(attr_match[2]) ? attr_match[2] : attr_match[3]
let l:current.attr[l:name] = l:value let current.attr[name] = value
let l:current.attrs_order += [l:name] let current.attrs_order += [name]
let l:attrs = l:attrs[stridx(l:attrs, l:match) + len(l:match):] let attrs = attrs[stridx(attrs, match) + len(match):]
endwhile endwhile
return l:current return current
endfunction endfunction
function! emmet#lang#slim#toggleComment() abort function! emmet#lang#slim#toggleComment() abort
let l:line = getline('.') let line = getline('.')
let l:space = matchstr(l:line, '^\s*') let space = matchstr(line, '^\s*')
if l:line =~# '^\s*/' if line =~# '^\s*/'
call setline('.', l:space . l:line[len(l:space)+1:]) call setline('.', space . line[len(space)+1:])
elseif l:line =~# '^\s*[a-z]' elseif line =~# '^\s*[a-z]'
call setline('.', l:space . '/' . l:line[len(l:space):]) call setline('.', space . '/' . line[len(space):])
endif endif
endfunction endfunction
function! emmet#lang#slim#balanceTag(flag) range abort function! emmet#lang#slim#balanceTag(flag) range abort
let l:block = emmet#util#getVisualBlock() let block = emmet#util#getVisualBlock()
if a:flag == -2 || a:flag == 2 if a:flag == -2 || a:flag == 2
let l:curpos = [0, line("'<"), col("'<"), 0] let curpos = [0, line("'<"), col("'<"), 0]
else else
let l:curpos = emmet#util#getcurpos() let curpos = emmet#util#getcurpos()
endif endif
let l:n = l:curpos[1] let n = curpos[1]
let l:ml = len(matchstr(getline(l:n), '^\s*')) let ml = len(matchstr(getline(n), '^\s*'))
if a:flag > 0 if a:flag > 0
if a:flag == 1 || !emmet#util#regionIsValid(l:block) if a:flag == 1 || !emmet#util#regionIsValid(block)
let l:n = line('.') let n = line('.')
else else
while l:n > 0 while n > 0
let l:l = len(matchstr(getline(l:n), '^\s*\ze[a-z]')) let l = len(matchstr(getline(n), '^\s*\ze[a-z]'))
if l:l > 0 && l:l < l:ml if l > 0 && l < ml
let l:ml = l:l let ml = l
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
endif endif
let l:sn = l:n let sn = n
if l:n == 0 if n == 0
let l:ml = 0 let ml = 0
endif endif
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*[a-z]')) let l = len(matchstr(getline(n), '^\s*[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
call setpos('.', [0, l:n, 1, 0]) call setpos('.', [0, n, 1, 0])
normal! V normal! V
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
else else
while l:n > 0 while n > 0
let l:l = len(matchstr(getline(l:n), '^\s*\ze[a-z]')) let l = len(matchstr(getline(n), '^\s*\ze[a-z]'))
if l:l > 0 && l:l > l:ml if l > 0 && l > ml
let l:ml = l:l let ml = l
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
let l:sn = l:n let sn = n
if l:n == 0 if n == 0
let l:ml = 0 let ml = 0
endif endif
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*[a-z]')) let l = len(matchstr(getline(n), '^\s*[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
call setpos('.', [0, l:n, 1, 0]) call setpos('.', [0, n, 1, 0])
normal! V normal! V
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
endif endif
endfunction endfunction
@@ -219,64 +219,64 @@ function! emmet#lang#slim#moveNextPrevItem(flag) abort
endfunction endfunction
function! emmet#lang#slim#moveNextPrev(flag) abort function! emmet#lang#slim#moveNextPrev(flag) abort
let l:pos = search('""\|\(^\s*|\s*\zs\)', a:flag ? 'Wpb' : 'Wp') let pos = search('""\|\(^\s*|\s*\zs\)', a:flag ? 'Wpb' : 'Wp')
if l:pos == 2 if pos == 2
startinsert! startinsert!
elseif l:pos != 0 elseif pos != 0
silent! normal! l silent! normal! l
startinsert startinsert
endif endif
endfunction endfunction
function! emmet#lang#slim#splitJoinTag() abort function! emmet#lang#slim#splitJoinTag() abort
let l:n = line('.') let n = line('.')
while l:n > 0 while n > 0
if getline(l:n) =~# '^\s*\ze[a-z]' if getline(n) =~# '^\s*\ze[a-z]'
let l:sn = l:n let sn = n
let l:n += 1 let n += 1
if getline(l:n) =~# '^\s*|' if getline(n) =~# '^\s*|'
while l:n <= line('$') while n <= line('$')
if getline(l:n) !~# '^\s*|' if getline(n) !~# '^\s*|'
break break
endif endif
exe l:n 'delete' exe n 'delete'
endwhile endwhile
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
else else
let l:spaces = matchstr(getline(l:sn), '^\s*') let spaces = matchstr(getline(sn), '^\s*')
call append(l:sn, l:spaces . ' | ') call append(sn, spaces . ' | ')
call setpos('.', [0, l:sn+1, 1, 0]) call setpos('.', [0, sn+1, 1, 0])
startinsert! startinsert!
endif endif
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
endfunction endfunction
function! emmet#lang#slim#removeTag() abort function! emmet#lang#slim#removeTag() abort
let l:n = line('.') let n = line('.')
let l:ml = 0 let ml = 0
while l:n > 0 while n > 0
if getline(l:n) =~# '^\s*\ze[a-z]' if getline(n) =~# '^\s*\ze[a-z]'
let l:ml = len(matchstr(getline(l:n), '^\s*[a-z]')) let ml = len(matchstr(getline(n), '^\s*[a-z]'))
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
let l:sn = l:n let sn = n
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*[a-z]')) let l = len(matchstr(getline(n), '^\s*[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
if l:sn == l:n if sn == n
exe 'delete' exe 'delete'
else else
exe l:sn ',' (l:n-1) 'delete' exe sn ',' (n-1) 'delete'
endif endif
endfunction endfunction

View File

@@ -1,9 +1,9 @@
function! emmet#lorem#en#expand(command) abort function! emmet#lorem#en#expand(command) abort
let l:wcount = matchstr(a:command, '\(\d*\)$') let wcount = matchstr(a:command, '\(\d*\)$')
let l:wcount = l:wcount > 0 ? l:wcount : 30 let wcount = wcount > 0 ? wcount : 30
let l:common = ['lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipisicing', 'elit'] let common = ['lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipisicing', 'elit']
let l:words = ['exercitationem', 'perferendis', 'perspiciatis', 'laborum', 'eveniet', let words = ['exercitationem', 'perferendis', 'perspiciatis', 'laborum', 'eveniet',
\ 'sunt', 'iure', 'nam', 'nobis', 'eum', 'cum', 'officiis', 'excepturi', \ 'sunt', 'iure', 'nam', 'nobis', 'eum', 'cum', 'officiis', 'excepturi',
\ 'odio', 'consectetur', 'quasi', 'aut', 'quisquam', 'vel', 'eligendi', \ 'odio', 'consectetur', 'quasi', 'aut', 'quisquam', 'vel', 'eligendi',
\ 'itaque', 'non', 'odit', 'tempore', 'quaerat', 'dignissimos', \ 'itaque', 'non', 'odit', 'tempore', 'quaerat', 'dignissimos',
@@ -32,34 +32,34 @@ function! emmet#lorem#en#expand(command) abort
\ 'architecto', 'est', 'esse', 'mollitia', 'nulla', 'a', 'similique', \ 'architecto', 'est', 'esse', 'mollitia', 'nulla', 'a', 'similique',
\ 'eos', 'alias', 'dolore', 'tenetur', 'deleniti', 'porro', 'facere', \ 'eos', 'alias', 'dolore', 'tenetur', 'deleniti', 'porro', 'facere',
\ 'maxime', 'corrupti'] \ 'maxime', 'corrupti']
let l:ret = [] let ret = []
let l:sentence = 0 let sentence = 0
for l:i in range(l:wcount) for i in range(wcount)
let l:arr = l:common let arr = common
if l:sentence > 0 if sentence > 0
let l:arr += l:words let arr += words
endif endif
let l:r = emmet#util#rand() let r = emmet#util#rand()
let l:word = l:arr[l:r % len(l:arr)] let word = arr[r % len(arr)]
if l:sentence == 0 if sentence == 0
let l:word = substitute(l:word, '^.', '\U&', '') let word = substitute(word, '^.', '\U&', '')
endif endif
let l:sentence += 1 let sentence += 1
call add(l:ret, l:word) call add(ret, word)
if (l:sentence > 5 && emmet#util#rand() < 10000) || l:i == l:wcount - 1 if (sentence > 5 && emmet#util#rand() < 10000) || i == wcount - 1
if l:i == l:wcount - 1 if i == wcount - 1
let l:endc = '?!...'[emmet#util#rand() % 5] let endc = '?!...'[emmet#util#rand() % 5]
call add(l:ret, l:endc) call add(ret, endc)
else else
let l:endc = '?!,...'[emmet#util#rand() % 6] let endc = '?!,...'[emmet#util#rand() % 6]
call add(l:ret, l:endc . ' ') call add(ret, endc . ' ')
endif endif
if l:endc !=# ',' if endc !=# ','
let l:sentence = 0 let sentence = 0
endif endif
else else
call add(l:ret, ' ') call add(ret, ' ')
endif endif
endfor endfor
return join(l:ret, '') return join(ret, '')
endfunction endfunction

View File

@@ -1,27 +1,27 @@
scriptencoding utf-8 scriptencoding utf-8
function! emmet#lorem#ja#expand(command) abort function! emmet#lorem#ja#expand(command) abort
let l:wcount = matchstr(a:command, '^\%(lorem\|lipsum\)\(\d*\)}$', '\1', '') let wcount = matchstr(a:command, '^\%(lorem\|lipsum\)\(\d*\)}$', '\1', '')
let l:wcount = l:wcount > 0 ? l:wcount : 30 let wcount = wcount > 0 ? wcount : 30
let l:url = "http://www.aozora.gr.jp/cards/000081/files/470_15407.html" let url = "http://www.aozora.gr.jp/cards/000081/files/470_15407.html"
let l:content = emmet#util#cache(l:url) let content = emmet#util#cache(url)
if len(l:content) == 0 if len(content) == 0
let l:content = emmet#util#getContentFromURL(l:url) let content = emmet#util#getContentFromURL(url)
let l:content = matchstr(l:content, '<div[^>]*>\zs.\{-}</div>') let content = matchstr(content, '<div[^>]*>\zs.\{-}</div>')
let l:content = substitute(l:content, '[ \r]', '', 'g') let content = substitute(content, '[ \r]', '', 'g')
let l:content = substitute(l:content, '<br[^>]*>', "\n", 'g') let content = substitute(content, '<br[^>]*>', "\n", 'g')
let l:content = substitute(l:content, '<[^>]\+>', '', 'g') let content = substitute(content, '<[^>]\+>', '', 'g')
let l:content = join(filter(split(l:content, "\n"), 'len(v:val)>0'), "\n") let content = join(filter(split(content, "\n"), 'len(v:val)>0'), "\n")
call emmet#util#cache(l:url, l:content) call emmet#util#cache(url, content)
endif endif
let l:content = substitute(l:content, "、\n", "、", "g") let content = substitute(content, "、\n", "、", "g")
let l:clines = split(l:content, '\n') let clines = split(content, '\n')
let l:lines = filter(l:clines, 'len(substitute(v:val,".",".","g"))<=l:wcount') let lines = filter(clines, 'len(substitute(v:val,".",".","g"))<=wcount')
if len(l:lines) == 0 if len(lines) == 0
let l:lines = l:clines let lines = clines
endif endif
let l:r = emmet#util#rand() let r = emmet#util#rand()
return l:lines[l:r % len(l:lines)] return lines[r % len(lines)]
endfunction endfunction

View File

@@ -12,10 +12,10 @@
" begin::end " begin::end
" -------------------- " --------------------
function! emmet#util#deleteContent(region) abort function! emmet#util#deleteContent(region) abort
let l:lines = getline(a:region[0][0], a:region[1][0]) let lines = getline(a:region[0][0], a:region[1][0])
call setpos('.', [0, a:region[0][0], a:region[0][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]) silent! exe 'delete '.(a:region[1][0] - a:region[0][0])
call setline(line('.'), l:lines[0][:a:region[0][1]-2] . l:lines[-1][a:region[1][1]]) call setline(line('.'), lines[0][:a:region[0][1]-2] . lines[-1][a:region[1][1]])
endfunction endfunction
" change_content : change content in region " change_content : change content in region
@@ -37,36 +37,36 @@ endfunction
" baz:end " baz:end
" -------------------- " --------------------
function! emmet#util#setContent(region, content) abort function! emmet#util#setContent(region, content) abort
let l:newlines = split(a:content, '\n', 1) let newlines = split(a:content, '\n', 1)
let l:oldlines = getline(a:region[0][0], a:region[1][0]) let oldlines = getline(a:region[0][0], a:region[1][0])
call setpos('.', [0, a:region[0][0], a:region[0][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]) silent! exe 'delete '.(a:region[1][0] - a:region[0][0])
if len(l:newlines) == 0 if len(newlines) == 0
let l:tmp = '' let tmp = ''
if a:region[0][1] > 1 if a:region[0][1] > 1
let l:tmp = l:oldlines[0][:a:region[0][1]-2] let tmp = oldlines[0][:a:region[0][1]-2]
endif endif
if a:region[1][1] >= 1 if a:region[1][1] >= 1
let l:tmp .= l:oldlines[-1][a:region[1][1]:] let tmp .= oldlines[-1][a:region[1][1]:]
endif endif
call setline(line('.'), l:tmp) call setline(line('.'), tmp)
elseif len(l:newlines) == 1 elseif len(newlines) == 1
if a:region[0][1] > 1 if a:region[0][1] > 1
let l:newlines[0] = l:oldlines[0][:a:region[0][1]-2] . l:newlines[0] let newlines[0] = oldlines[0][:a:region[0][1]-2] . newlines[0]
endif endif
if a:region[1][1] >= 1 if a:region[1][1] >= 1
let l:newlines[0] .= l:oldlines[-1][a:region[1][1]:] let newlines[0] .= oldlines[-1][a:region[1][1]:]
endif endif
call setline(line('.'), l:newlines[0]) call setline(line('.'), newlines[0])
else else
if a:region[0][1] > 1 if a:region[0][1] > 1
let l:newlines[0] = l:oldlines[0][:a:region[0][1]-2] . l:newlines[0] let newlines[0] = oldlines[0][:a:region[0][1]-2] . newlines[0]
endif endif
if a:region[1][1] >= 1 if a:region[1][1] >= 1
let l:newlines[-1] .= l:oldlines[-1][a:region[1][1]:] let newlines[-1] .= oldlines[-1][a:region[1][1]:]
endif endif
call setline(line('.'), l:newlines[0]) call setline(line('.'), newlines[0])
call append(line('.'), l:newlines[1:]) call append(line('.'), newlines[1:])
endif endif
endfunction endfunction
@@ -93,8 +93,8 @@ endfunction
" this function return 0 or 1 " this function return 0 or 1
function! emmet#util#cursorInRegion(region) abort function! emmet#util#cursorInRegion(region) abort
if !emmet#util#regionIsValid(a:region) | return 0 | endif if !emmet#util#regionIsValid(a:region) | return 0 | endif
let l:cur = emmet#util#getcurpos()[1:2] let cur = emmet#util#getcurpos()[1:2]
return emmet#util#pointInRegion(l:cur, a:region) return emmet#util#pointInRegion(cur, a:region)
endfunction endfunction
" region_is_valid : check region is valid " region_is_valid : check region is valid
@@ -107,11 +107,11 @@ endfunction
" search_region : make region from pattern which is composing start/end " search_region : make region from pattern which is composing start/end
" this function return array of position " this function return array of position
function! emmet#util#searchRegion(start, end) abort function! emmet#util#searchRegion(start, end) abort
let l:b = searchpairpos(a:start, '', a:end, 'bcnW') let b = searchpairpos(a:start, '', a:end, 'bcnW')
if l:b == [0, 0] if b == [0, 0]
return [searchpairpos(a:start, '', a:end, 'bnW'), searchpairpos(a:start, '\%#', a:end, 'nW')] return [searchpairpos(a:start, '', a:end, 'bnW'), searchpairpos(a:start, '\%#', a:end, 'nW')]
else else
return [l:b, searchpairpos(a:start, '', a:end. '', 'nW')] return [b, searchpairpos(a:start, '', a:end. '', 'nW')]
endif endif
endfunction endfunction
@@ -121,14 +121,14 @@ function! emmet#util#getContent(region) abort
if !emmet#util#regionIsValid(a:region) if !emmet#util#regionIsValid(a:region)
return '' return ''
endif endif
let l:lines = getline(a:region[0][0], a:region[1][0]) let lines = getline(a:region[0][0], a:region[1][0])
if a:region[0][0] == a:region[1][0] if a:region[0][0] == a:region[1][0]
let l:lines[0] = l:lines[0][a:region[0][1]-1:a:region[1][1]-1] let lines[0] = lines[0][a:region[0][1]-1:a:region[1][1]-1]
else else
let l:lines[0] = l:lines[0][a:region[0][1]-1:] let lines[0] = lines[0][a:region[0][1]-1:]
let l:lines[-1] = l:lines[-1][:a:region[1][1]-1] let lines[-1] = lines[-1][:a:region[1][1]-1]
endif endif
return join(l:lines, "\n") return join(lines, "\n")
endfunction endfunction
" region_in_region : check region is in the region " region_in_region : check region is in the region
@@ -150,145 +150,145 @@ endfunction
" html utils " html utils
"============================================================================== "==============================================================================
function! emmet#util#getContentFromURL(url) abort function! emmet#util#getContentFromURL(url) abort
let l:res = system(printf('%s -i %s', g:emmet_curl_command, shellescape(substitute(a:url, '#.*', '', '')))) let res = system(printf('%s -i %s', g:emmet_curl_command, shellescape(substitute(a:url, '#.*', '', ''))))
while l:res =~# '^HTTP/1.\d 3' || l:res =~# '^HTTP/1\.\d 200 Connection established' || l:res =~# '^HTTP/1\.\d 100 Continue' while res =~# '^HTTP/1.\d 3' || res =~# '^HTTP/1\.\d 200 Connection established' || res =~# '^HTTP/1\.\d 100 Continue'
let l:pos = stridx(l:res, "\r\n\r\n") let pos = stridx(res, "\r\n\r\n")
if l:pos != -1 if pos != -1
let l:res = strpart(l:res, l:pos+4) let res = strpart(res, pos+4)
else else
let l:pos = stridx(l:res, "\n\n") let pos = stridx(res, "\n\n")
let l:res = strpart(l:res, l:pos+2) let res = strpart(res, pos+2)
endif endif
endwhile endwhile
let l:pos = stridx(l:res, "\r\n\r\n") let pos = stridx(res, "\r\n\r\n")
if l:pos != -1 if pos != -1
let l:content = strpart(l:res, l:pos+4) let content = strpart(res, pos+4)
else else
let l:pos = stridx(l:res, "\n\n") let pos = stridx(res, "\n\n")
let l:content = strpart(l:res, l:pos+2) let content = strpart(res, pos+2)
endif endif
let l:header = l:res[:l:pos-1] let header = res[:pos-1]
let l:charset = matchstr(l:content, '<meta[^>]\+content=["''][^;"'']\+;\s*charset=\zs[^;"'']\+\ze["''][^>]*>') let charset = matchstr(content, '<meta[^>]\+content=["''][^;"'']\+;\s*charset=\zs[^;"'']\+\ze["''][^>]*>')
if len(l:charset) == 0 if len(charset) == 0
let l:charset = matchstr(l:content, '<meta\s\+charset=["'']\?\zs[^"'']\+\ze["'']\?[^>]*>') let charset = matchstr(content, '<meta\s\+charset=["'']\?\zs[^"'']\+\ze["'']\?[^>]*>')
endif endif
if len(l:charset) == 0 if len(charset) == 0
let l:charset = matchstr(l:header, '\nContent-Type:.* charset=[''"]\?\zs[^''";\n]\+\ze') let charset = matchstr(header, '\nContent-Type:.* charset=[''"]\?\zs[^''";\n]\+\ze')
endif endif
if len(l:charset) == 0 if len(charset) == 0
let l:s1 = len(split(l:content, '?')) let s1 = len(split(content, '?'))
let l:utf8 = iconv(l:content, 'utf-8', &encoding) let utf8 = iconv(content, 'utf-8', &encoding)
let l:s2 = len(split(l:utf8, '?')) let s2 = len(split(utf8, '?'))
return (l:s2 == l:s1 || l:s2 >= l:s1 * 2) ? l:utf8 : l:content return (s2 == s1 || s2 >= s1 * 2) ? utf8 : content
endif endif
return iconv(l:content, l:charset, &encoding) return iconv(content, charset, &encoding)
endfunction endfunction
function! emmet#util#getTextFromHTML(buf) abort function! emmet#util#getTextFromHTML(buf) abort
let l:threshold_len = 100 let threshold_len = 100
let l:threshold_per = 0.1 let threshold_per = 0.1
let l:buf = a:buf let buf = a:buf
let l:buf = strpart(l:buf, stridx(l:buf, '</head>')) let buf = strpart(buf, stridx(buf, '</head>'))
let l:buf = substitute(l:buf, '<style[^>]*>.\{-}</style>', '', 'g') let buf = substitute(buf, '<style[^>]*>.\{-}</style>', '', 'g')
let l:buf = substitute(l:buf, '<script[^>]*>.\{-}</script>', '', 'g') let buf = substitute(buf, '<script[^>]*>.\{-}</script>', '', 'g')
let l:res = '' let res = ''
let l:max = 0 let max = 0
let l:mx = '\(<td[^>]\{-}>\)\|\(<\/td>\)\|\(<div[^>]\{-}>\)\|\(<\/div>\)' let mx = '\(<td[^>]\{-}>\)\|\(<\/td>\)\|\(<div[^>]\{-}>\)\|\(<\/div>\)'
let l:m = split(l:buf, l:mx) let m = split(buf, mx)
for l:str in l:m for str in m
let l:c = split(l:str, '<[^>]*?>') let c = split(str, '<[^>]*?>')
let l:str = substitute(l:str, '<[^>]\{-}>', ' ', 'g') let str = substitute(str, '<[^>]\{-}>', ' ', 'g')
let l:str = substitute(l:str, '&gt;', '>', 'g') let str = substitute(str, '&gt;', '>', 'g')
let l:str = substitute(l:str, '&lt;', '<', 'g') let str = substitute(str, '&lt;', '<', 'g')
let l:str = substitute(l:str, '&quot;', '"', 'g') let str = substitute(str, '&quot;', '"', 'g')
let l:str = substitute(l:str, '&apos;', '''', 'g') let str = substitute(str, '&apos;', '''', 'g')
let l:str = substitute(l:str, '&nbsp;', ' ', 'g') let str = substitute(str, '&nbsp;', ' ', 'g')
let l:str = substitute(l:str, '&yen;', '\&#65509;', 'g') let str = substitute(str, '&yen;', '\&#65509;', 'g')
let l:str = substitute(l:str, '&amp;', '\&', 'g') let str = substitute(str, '&amp;', '\&', 'g')
let l:str = substitute(l:str, '^\s*\(.*\)\s*$', '\1', '') let str = substitute(str, '^\s*\(.*\)\s*$', '\1', '')
let l:str = substitute(l:str, '\s\+', ' ', 'g') let str = substitute(str, '\s\+', ' ', 'g')
let l:l = len(l:str) let l = len(str)
if l:l > l:threshold_len if l > threshold_len
let l:per = (l:l+0.0) / len(l:c) let per = (l+0.0) / len(c)
if l:max < l:l && l:per > l:threshold_per if max < l && per > threshold_per
let l:max = l:l let max = l
let l:res = l:str let res = str
endif endif
endif endif
endfor endfor
let l:res = substitute(l:res, '^\s*\(.*\)\s*$', '\1', 'g') let res = substitute(res, '^\s*\(.*\)\s*$', '\1', 'g')
return l:res return res
endfunction endfunction
function! emmet#util#getImageSize(fn) abort function! emmet#util#getImageSize(fn) abort
let l:fn = a:fn let fn = a:fn
if emmet#util#isImageMagickInstalled() if emmet#util#isImageMagickInstalled()
return emmet#util#imageSizeWithImageMagick(l:fn) return emmet#util#imageSizeWithImageMagick(fn)
endif endif
if filereadable(l:fn) if filereadable(fn)
let l:hex = substitute(system('xxd -p '.shellescape(l:fn)), '\n', '', 'g') let hex = substitute(system('xxd -p "'.fn.'"'), '\n', '', 'g')
else else
if l:fn !~# '^\w\+://' if fn !~# '^\w\+://'
let l:path = fnamemodify(expand('%'), ':p:gs?\\?/?') let path = fnamemodify(expand('%'), ':p:gs?\\?/?')
if has('win32') || has('win64') | if has('win32') || has('win64') |
let l:path = tolower(l:path) let path = tolower(path)
endif endif
for l:k in keys(g:emmet_docroot) for k in keys(g:emmet_docroot)
let l:root = fnamemodify(l:k, ':p:gs?\\?/?') let root = fnamemodify(k, ':p:gs?\\?/?')
if has('win32') || has('win64') | if has('win32') || has('win64') |
let l:root = tolower(l:root) let root = tolower(root)
endif endif
if stridx(l:path, l:root) == 0 if stridx(path, root) == 0
let l:v = g:emmet_docroot[l:k] let v = g:emmet_docroot[k]
let l:fn = (len(l:v) == 0 ? l:k : l:v) . l:fn let fn = (len(v) == 0 ? k : v) . fn
break break
endif endif
endfor endfor
endif endif
let l:hex = substitute(system(g:emmet_curl_command.' '.shellescape(l:fn).' | xxd -p'), '\n', '', 'g') let hex = substitute(system(g:emmet_curl_command.' "'.fn.'" | xxd -p'), '\n', '', 'g')
endif endif
let [l:width, l:height] = [-1, -1] let [width, height] = [-1, -1]
if l:hex =~# '^89504e470d0a1a0a' if hex =~# '^89504e470d0a1a0a'
let l:width = eval('0x'.l:hex[32:39]) let width = eval('0x'.hex[32:39])
let l:height = eval('0x'.l:hex[40:47]) let height = eval('0x'.hex[40:47])
endif endif
if l:hex =~# '^ffd8' if hex =~# '^ffd8'
let l:pos = 4 let pos = 4
while l:pos < len(l:hex) while pos < len(hex)
let l:bs = l:hex[l:pos+0:l:pos+3] let bs = hex[pos+0:pos+3]
let l:pos += 4 let pos += 4
if l:bs ==# 'ffc0' || l:bs ==# 'ffc2' if bs ==# 'ffc0' || bs ==# 'ffc2'
let l:pos += 6 let pos += 6
let l:height = eval('0x'.l:hex[l:pos+0:l:pos+1])*256 + eval('0x'.l:hex[l:pos+2:l:pos+3]) let height = eval('0x'.hex[pos+0:pos+1])*256 + eval('0x'.hex[pos+2:pos+3])
let l:pos += 4 let pos += 4
let l:width = eval('0x'.l:hex[l:pos+0:l:pos+1])*256 + eval('0x'.l:hex[l:pos+2:l:pos+3]) let width = eval('0x'.hex[pos+0:pos+1])*256 + eval('0x'.hex[pos+2:pos+3])
break break
elseif l:bs =~# 'ffd[9a]' elseif bs =~# 'ffd[9a]'
break break
elseif l:bs =~# 'ff\(e[0-9a-e]\|fe\|db\|dd\|c4\)' elseif bs =~# 'ff\(e[0-9a-e]\|fe\|db\|dd\|c4\)'
let l:pos += (eval('0x'.l:hex[l:pos+0:l:pos+1])*256 + eval('0x'.l:hex[l:pos+2:l:pos+3])) * 2 let pos += (eval('0x'.hex[pos+0:pos+1])*256 + eval('0x'.hex[pos+2:pos+3])) * 2
endif endif
endwhile endwhile
endif endif
if l:hex =~# '^47494638' if hex =~# '^47494638'
let l:width = eval('0x'.l:hex[14:15].l:hex[12:13]) let width = eval('0x'.hex[14:15].hex[12:13])
let l:height = eval('0x'.l:hex[18:19].l:hex[16:17]) let height = eval('0x'.hex[18:19].hex[16:17])
endif endif
return [l:width, l:height] return [width, height]
endfunction endfunction
function! emmet#util#imageSizeWithImageMagick(fn) abort function! emmet#util#imageSizeWithImageMagick(fn) abort
let l:img_info = system('identify -format "%wx%h" '.shellescape(a:fn)) let img_info = system('identify -format "%wx%h" "'.a:fn.'"')
let l:img_size = split(substitute(l:img_info, '\n', '', ''), 'x') let img_size = split(substitute(img_info, '\n', '', ''), 'x')
if len(l:img_size) != 2 if len(img_size) != 2
return [-1, -1] return [-1, -1]
endif endif
return l:img_size return img_size
endfunction endfunction
function! emmet#util#isImageMagickInstalled() abort function! emmet#util#isImageMagickInstalled() abort
@@ -299,78 +299,76 @@ function! emmet#util#isImageMagickInstalled() abort
endfunction endfunction
function! s:b64encode(bytes, table, pad) function! s:b64encode(bytes, table, pad)
let l:b64 = [] let b64 = []
for l:i in range(0, len(a:bytes) - 1, 3) for i in range(0, len(a:bytes) - 1, 3)
let l:n = a:bytes[l:i] * 0x10000 let n = a:bytes[i] * 0x10000
\ + get(a:bytes, l:i + 1, 0) * 0x100 \ + get(a:bytes, i + 1, 0) * 0x100
\ + get(a:bytes, l:i + 2, 0) \ + get(a:bytes, i + 2, 0)
call add(l:b64, a:table[l:n / 0x40000]) call add(b64, a:table[n / 0x40000])
call add(l:b64, a:table[l:n / 0x1000 % 0x40]) call add(b64, a:table[n / 0x1000 % 0x40])
call add(l:b64, a:table[l:n / 0x40 % 0x40]) call add(b64, a:table[n / 0x40 % 0x40])
call add(l:b64, a:table[l:n % 0x40]) call add(b64, a:table[n % 0x40])
endfor endfor
if len(a:bytes) % 3 == 2 if len(a:bytes) % 3 == 2
let l:b64[-1] = a:pad let b64[-1] = a:pad
elseif len(a:bytes) % 3 == 1 elseif len(a:bytes) % 3 == 1
let l:b64[-1] = a:pad let b64[-1] = a:pad
let l:b64[-2] = a:pad let b64[-2] = a:pad
endif endif
return l:b64 return b64
endfunction endfunction
function! emmet#util#imageEncodeDecode(fn, flag) abort function! emmet#util#imageEncodeDecode(fn, flag) abort
let l:fn = a:fn let fn = a:fn
if filereadable(l:fn) if filereadable(fn)
let l:hex = substitute(system('xxd -p '.shellescape(l:fn)), '\n', '', 'g') let hex = substitute(system('xxd -p "'.fn.'"'), '\n', '', 'g')
else else
if l:fn !~# '^\w\+://' if fn !~# '^\w\+://'
let l:path = fnamemodify(expand('%'), ':p:gs?\\?/?') let path = fnamemodify(expand('%'), ':p:gs?\\?/?')
if has('win32') || has('win64') | if has('win32') || has('win64') |
let l:path = tolower(l:path) let path = tolower(path)
endif endif
for l:k in keys(g:emmet_docroot) for k in keys(g:emmet_docroot)
let l:root = fnamemodify(l:k, ':p:gs?\\?/?') let root = fnamemodify(k, ':p:gs?\\?/?')
if has('win32') || has('win64') | if has('win32') || has('win64') |
let l:root = tolower(l:root) let root = tolower(root)
endif endif
if stridx(l:path, l:root) == 0 if stridx(path, root) == 0
let l:v = g:emmet_docroot[l:k] let v = g:emmet_docroot[k]
let l:fn = (len(l:v) == 0 ? l:k : l:v) . l:fn let fn = (len(v) == 0 ? k : v) . fn
break break
endif endif
endfor endfor
endif endif
let l:hex = substitute(system(g:emmet_curl_command.' '.shellescape(l:fn).' | xxd -p'), '\n', '', 'g') let hex = substitute(system(g:emmet_curl_command.' "'.fn.'" | xxd -p'), '\n', '', 'g')
endif endif
let l:bin = map(split(l:hex, '..\zs'), 'eval("0x" . v:val)') let bin = map(split(hex, '..\zs'), 'eval("0x" . v:val)')
let l:table = split('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', '\zs') let table = split('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', '\zs')
let l:ret = 'data:image/' let ret = 'data:image/'
if l:hex =~# '^89504e470d0a1a0a' if hex =~# '^89504e470d0a1a0a'
let l:ret .= 'png' let ret .= 'png'
elseif l:hex =~# '^ffd8' elseif hex =~# '^ffd8'
let l:ret .= 'jpeg' let ret .= 'jpeg'
elseif l:hex =~# '^47494638' elseif hex =~# '^47494638'
let l:ret .= 'gif' let ret .= 'gif'
elseif l:hex =~# '^00000020667479706176696600000000'
let l:ret .= 'avif'
else else
let l:ret .= 'unknown' let ret .= 'unknown'
endif endif
return l:ret . ';base64,' . join(s:b64encode(l:bin, l:table, '='), '') return ret . ';base64,' . join(s:b64encode(bin, table, '='), '')
endfunction endfunction
function! emmet#util#unique(arr) abort function! emmet#util#unique(arr) abort
let l:m = {} let m = {}
let l:r = [] let r = []
for l:i in a:arr for i in a:arr
if !has_key(l:m, l:i) if !has_key(m, i)
let l:m[l:i] = 1 let m[i] = 1
call add(l:r, l:i) call add(r, i)
endif endif
endfor endfor
return l:r return r
endfunction endfunction
let s:seed = localtime() let s:seed = localtime()
@@ -384,27 +382,27 @@ function! emmet#util#rand() abort
endfunction endfunction
function! emmet#util#cache(name, ...) abort function! emmet#util#cache(name, ...) abort
let l:content = get(a:000, 0, '') let content = get(a:000, 0, '')
let l:dir = expand('~/.emmet/cache') let dir = expand('~/.emmet/cache')
if !isdirectory(l:dir) if !isdirectory(dir)
call mkdir(l:dir, 'p', 0700) call mkdir(dir, 'p', 0700)
endif endif
let l:file = l:dir . '/' . substitute(a:name, '\W', '_', 'g') let file = dir . '/' . substitute(a:name, '\W', '_', 'g')
if len(l:content) == 0 if len(content) == 0
if !filereadable(l:file) if !filereadable(file)
return '' return ''
endif endif
return join(readfile(l:file), "\n") return join(readfile(file), "\n")
endif endif
call writefile(split(l:content, "\n"), l:file) call writefile(split(content, "\n"), file)
endfunction endfunction
function! emmet#util#getcurpos() abort function! emmet#util#getcurpos() abort
let l:pos = getpos('.') let pos = getpos('.')
if mode(0) ==# 'i' && l:pos[2] > 0 if mode(0) ==# 'i' && pos[2] > 0
let l:pos[2] -=1 let pos[2] -=1
endif endif
return l:pos return pos
endfunction endfunction
function! emmet#util#closePopup() abort function! emmet#util#closePopup() abort

View File

@@ -1,25 +0,0 @@
local M = {}
M.get_node_at_cursor = function()
local ts_utils = require("nvim-treesitter.ts_utils")
local node = ts_utils.get_node_at_cursor()
if not node then
return nil
end
while node do
local node_type = node:type()
if node_type == "element" then
return "html"
elseif node_type == "stylesheet" then
return "css"
end
node = node:parent()
end
return ""
end
return M

View File

@@ -23,7 +23,6 @@
" | <head> " | <head>
" | <title></title> " | <title></title>
" | <meta charset="UTF-8"> " | <meta charset="UTF-8">
" | <meta name="viewport" content="width=device-width, initial-scale=1.0">
" | </head> " | </head>
" | <body> " | <body>
" | _ " | _
@@ -96,8 +95,8 @@ if !exists('g:user_emmet_leader_key')
endif endif
function! s:install_plugin(mode, buffer) function! s:install_plugin(mode, buffer)
let l:buffer = a:buffer ? '<buffer>' : '' let buffer = a:buffer ? '<buffer>' : ''
let l:items = [ let items = [
\ {'mode': 'i', 'var': 'user_emmet_expandabbr_key', 'key': ',', 'plug': 'emmet-expand-abbr', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#expandAbbr(0,"")<cr>'}, \ {'mode': 'i', 'var': 'user_emmet_expandabbr_key', 'key': ',', 'plug': 'emmet-expand-abbr', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#expandAbbr(0,"")<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_expandabbr_key', 'key': ',', 'plug': 'emmet-expand-abbr', 'func': ':call emmet#expandAbbr(3,"")<cr>'}, \ {'mode': 'n', 'var': 'user_emmet_expandabbr_key', 'key': ',', 'plug': 'emmet-expand-abbr', 'func': ':call emmet#expandAbbr(3,"")<cr>'},
\ {'mode': 'v', 'var': 'user_emmet_expandabbr_key', 'key': ',', 'plug': 'emmet-expand-abbr', 'func': ':call emmet#expandAbbr(2,"")<cr>'}, \ {'mode': 'v', 'var': 'user_emmet_expandabbr_key', 'key': ',', 'plug': 'emmet-expand-abbr', 'func': ':call emmet#expandAbbr(2,"")<cr>'},
@@ -138,20 +137,20 @@ function! s:install_plugin(mode, buffer)
\ {'mode': 'v', 'var': 'user_emmet_codepretty_key', 'key': 'c', 'plug': 'emmet-code-pretty', 'func': ':call emmet#codePretty()<cr>'}, \ {'mode': 'v', 'var': 'user_emmet_codepretty_key', 'key': 'c', 'plug': 'emmet-code-pretty', 'func': ':call emmet#codePretty()<cr>'},
\] \]
let l:only_plug = get(g:, 'emmet_install_only_plug', 0) let only_plug = get(g:, 'emmet_install_only_plug', 0)
for l:item in l:items for item in items
if a:mode !=# 'a' && stridx(a:mode, l:item.mode) == -1 if a:mode !=# 'a' && stridx(a:mode, item.mode) == -1
continue continue
endif endif
exe l:item.mode . 'noremap '. l:buffer .' <plug>(' . l:item.plug . ') ' . l:item.func exe item.mode . 'noremap '. buffer .' <plug>(' . item.plug . ') ' . item.func
if l:item.var != '' && !l:only_plug if item.var != '' && !only_plug
if exists('g:' . l:item.var) if exists('g:' . item.var)
let l:key = eval('g:' . l:item.var) let key = eval('g:' . item.var)
else else
let l:key = g:user_emmet_leader_key . l:item.key let key = g:user_emmet_leader_key . item.key
endif endif
if !hasmapto('<plug>(' . l:item.plug . ')', l:item.mode) && !len(maparg(l:key, l:item.mode)) if !hasmapto('<plug>(' . item.plug . ')', item.mode) && !len(maparg(key, item.mode))
exe l:item.mode . 'map ' . l:buffer . ' <unique> <silent>' . l:key . ' <plug>(' . l:item.plug . ')' exe item.mode . 'map ' . buffer . ' <unique> ' . key . ' <plug>(' . item.plug . ')'
endif endif
endif endif
endfor endfor
@@ -175,17 +174,6 @@ if get(g:, 'user_emmet_install_command', 1)
command! -nargs=1 Emmet call emmet#expandAbbr(4, <q-args>) command! -nargs=1 Emmet call emmet#expandAbbr(4, <q-args>)
endif endif
function! s:setup_styledEmmetAbbreviation() abort
if index(['javascript', 'javascriptreact', 'typescript', 'typescriptreact'], &filetype) != -1
syntax match styledEmmetAbbreviation "[a-z0-9#+!%]\+" containedin=styledDefinition contained
endif
endfunction
augroup ___emmet_setup___
au!
autocmd Syntax * call s:setup_styledEmmetAbbreviation()
augroup END
let &cpoptions = s:save_cpo let &cpoptions = s:save_cpo
unlet s:save_cpo unlet s:save_cpo

View File

@@ -681,10 +681,6 @@ finish
'query': "<h$$$$\\<c-y>u.global\\<cr>$$$$3></h3>", 'query': "<h$$$$\\<c-y>u.global\\<cr>$$$$3></h3>",
'result': "<h3 class=\"global\"></h3>", 'result': "<h3 class=\"global\"></h3>",
}, },
{
'query': "<button$$$$\\<c-y>u.btn\\<cr>$$$$ disabled></button>",
'result': "<button class=\"btn\" disabled></button>",
},
], ],
}, },
{ {