1 Commits

Author SHA1 Message Date
Yasuhiro Matsumoto
5fe726da47 fix abbreviation 2015-11-11 19:44:25 +09:00
26 changed files with 2397 additions and 3646 deletions

8
.github/FUNDING.yml vendored
View File

@@ -1,8 +0,0 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: mattn # Replace with a single Patreon username
open_collective: mattn # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
custom: # Replace with a single custom sponsorship URL

View File

@@ -1,11 +0,0 @@
language: generic
sudo: false
dist: xenial
git:
depth: 10
script:
- uname -a
- which -a vim
- vim --cmd version --cmd quit
- make test

21
LICENSE
View File

@@ -1,21 +0,0 @@
The MIT License (MIT)
Copyright (c) 2019 Yasuhiro Matsumoto
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -9,7 +9,3 @@ emmet-vim.zip: remove-zip
release: emmet-vim.zip
vimup update-script emmet.vim
test:
@-rm -f test.log 2> /dev/null
@vim -N -c "let &rtp .= ',' . getcwd()" -c "so unittest.vim" -c EmmetUnitTest! || cat test.log || exit 1

View File

@@ -1,68 +1,47 @@
# 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
[emmet](http://emmet.io/).
![screenshot](https://raw.githubusercontent.com/mattn/emmet-vim/master/doc/screenshot.gif)
[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/mattn/emmet-vim/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
## Installation
[Download zip file](http://www.vim.org/scripts/script.php?script_id=2981):
```sh
cd ~/.vim
unzip emmet-vim.zip
```
cd ~/.vim
unzip emmet-vim.zip
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
```
To install using pathogen.vim:
cd ~/.vim/bundle
git clone https://github.com/mattn/emmet-vim.git
To install using [Vundle](https://github.com/gmarik/vundle):
```vim
" add this line to your .vimrc file
Plugin 'mattn/emmet-vim'
```
To install using [Vim-Plug](https://github.com/junegunn/vim-plug):
```vim
" add this line to your .vimrc file
Plug 'mattn/emmet-vim'
```
" add this line to your .vimrc file
Plugin 'mattn/emmet-vim'
To checkout the source from repository:
```sh
cd ~/.vim/bundle
git clone https://github.com/mattn/emmet-vim.git
```
cd ~/.vim/bundle
git clone https://github.com/mattn/emmet-vim.git
or:
```sh
git clone https://github.com/mattn/emmet-vim.git
cd emmet-vim
cp plugin/emmet.vim ~/.vim/plugin/
cp autoload/emmet.vim ~/.vim/autoload/
cp -a autoload/emmet ~/.vim/autoload/
```
git clone https://github.com/mattn/emmet-vim.git
cd emmet-vim
cp plugin/emmet.vim ~/.vim/plugin/
cp autoload/emmet.vim ~/.vim/autoload/
cp -a autoload/emmet ~/.vim/autoload/
## Quick Tutorial
Open or create a New File:
```sh
vim index.html
```
vim index.html
Type ("\_" is the cursor position):
@@ -83,7 +62,7 @@ Then type `<c-y>,` (<kbd>Ctrl</kbd><kbd>y</kbd><kbd>,</kbd>), and you should see
</html>
```
[More Tutorials](https://raw.githubusercontent.com/mattn/emmet-vim/master/TUTORIAL)
[More Tutorials](https://raw.github.com/mattn/emmet-vim/master/TUTORIAL)
## Enable in different mode
@@ -124,42 +103,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.
## 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
[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
### Emmet official site:
@@ -172,7 +119,7 @@ Update this in your .vimrc file.
### emmet.vim:
* <https://mattn.github.io/emmet-vim/>
* <http://mattn.github.com/emmet-vim>
### development repository:

View File

@@ -1,247 +0,0 @@
# Tutorial for Emmet.vim
mattn <mattn.jp@gmail.com>
## Expand an Abbreviation
Type the abbreviation as `div>p#foo$*3>a` and type `<c-y>,`
```html
<div>
<p id="foo1">
<a href=""></a>
</p>
<p id="foo2">
<a href=""></a>
</p>
<p id="foo3">
<a href=""></a>
</p>
</div>
```
## Wrap with an Abbreviation
Write as below:
```html
test1
test2
test3
```
Then do visual select(line wise) and type `<c-y>,`. Once you get to the 'Tag:' prompt, type `ul>li*`.
```html
<ul>
<li>test1</li>
<li>test2</li>
<li>test3</li>
</ul>
```
If you type a tag, such as `blockquote`, then you'll see the following:
```html
<blockquote>
test1
test2
test3
</blockquote>
```
## Balance a Tag Inward
Just type `<c-y>d` in insert mode.
## Balance a Tag Outward
Just type `<c-y>D` in insert mode.
## Go to the Next Edit Point
Just type `<c-y>n` in insert mode.
## Go to the Previous Edit Point
Just type `<c-y>N` in insert mode.
## Update an <img>s Size
Move cursor to the img tag.
```html
<img src="foo.png" />
```
Type `<c-y>i` on img tag
## Merge Lines
select the lines, which include `<li>`
```html
<ul>
<li class="list1"></li>
<li class="list2"></li>
<li class="list3"></li>
</ul>
```
and then type `<c-y>m`
```html
<ul>
<li class="list1"></li><li class="list2"></li><li class="list3"></li>
</ul>
```
## Remove the tag
Move cursor in block
```html
<div class="foo">
<a>cursor is here</a>
</div>
```
Type '<c-y>k' in insert mode.
```html
<div class="foo">
</div>
```
And type '<c-y>k' in there again.
```html
```
## Split/Join Tag
Move the cursor inside block
```html
<div class="foo">
cursor is here
</div>
```
Type '<c-y>j' in insert mode.
```html
<div class="foo"/>
```
And then type '<c-y>j' in there again.
```html
<div class="foo">
cursor is here
</div>
```
## Toggle Comment
Move cursor inside the block
```html
<div>
hello world
</div>
```
Type '<c-y>/' in insert mode.
```html
<!-- <div>
hello world
</div> -->
```
Type '<c-y>/' in there again.
```html
<div>
hello world
</div>
```
## Make an anchor from a URL
Move cursor to URL
```http
http://www.google.com/
```
Type '<c-y>a'
```html
<a href="http://www.google.com/">Google</a>
```
## Make some quoted text from a URL
Move cursor to the URL
```http
http://github.com/
```
Type '<c-y>A'
```html
<blockquote class="quote">
<a href="http://github.com/">Secure source code hosting and collaborative development - GitHub</a><br />
<p>How does it work? Get up and running in seconds by forking a project, pushing an existing repository...</p>
<cite>http://github.com/</cite>
</blockquote>
```
## Installing emmet.vim for the language you are using:
```sh
cd ~/.vim
unzip emmet-vim.zip
```
Or if you are using pathogen.vim:
```shell
cd ~/.vim/bundle # or make directory
unzip /path/to/emmet-vim.zip
```
Or if you get the sources from the repository:
```sh
cd ~/.vim/bundle # or make directory
git clone http://github.com/mattn/emmet-vim.git
```
## Enable emmet.vim for the language you using.
You can customize the behavior of the languages you are using.
```sh
cat >> ~/.vimrc
let g:user_emmet_settings = {
\ 'php' : {
\ 'extends' : 'html',
\ 'filters' : 'c',
\ },
\ 'xml' : {
\ 'extends' : 'html',
\ },
\ 'haml' : {
\ 'extends' : 'html',
\ },
\}
```

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

@@ -1,241 +0,0 @@
function! emmet#lang#elm#findTokens(str) abort
return emmet#lang#html#findTokens(a:str)
endfunction
function! emmet#lang#elm#parseIntoTree(abbr, type) abort
let l:tree = emmet#lang#html#parseIntoTree(a:abbr, a:type)
if len(l:tree.child) < 2 | return l:tree | endif
" Add ',' nodes between root elements.
let l:new_children = []
for l:child in l:tree.child[0:-2]
let l:comma = emmet#newNode()
let l:comma.name = ','
call add(l:new_children, l:child)
call add(l:new_children, l:comma)
endfor
call add(l:new_children, l:tree.child[-1])
let l:tree.child = l:new_children
return l:tree
endfunction
function! emmet#lang#elm#renderNode(node)
let l:elm_nodes = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'
\, 'div', 'p', 'hr', 'pre', 'blockquote'
\, 'span', 'a', 'code', 'em', 'strong', 'i', 'b', 'u', 'sub', 'sup', 'br'
\, 'ol', 'ul', 'li', 'dl', 'dt', 'dd'
\, 'img', 'iframe', 'canvas', 'math'
\, 'form', 'input', 'textarea', 'button', 'select', 'option'
\, 'section', 'nav', 'article', 'aside', 'header', 'footer', 'address', 'main_', 'body'
\, 'figure', 'figcaption'
\, 'table', 'caption', 'colgroup', 'col', 'tbody', 'thead', 'tfoot', 'tr', 'td', 'th'
\, 'fieldset', 'legend', 'label', 'datalist', 'optgroup', 'keygen', 'output', 'progress', 'meter'
\, 'audio', 'video', 'source', 'track'
\, 'embed', 'object', 'param'
\, 'ins', 'del'
\, 'small', 'cite', 'dfn', 'abbr', 'time', 'var', 'samp', 'kbd', 's', 'q'
\, 'mark', 'ruby', 'rt', 'rp', 'bdi', 'bdo', 'wbr'
\, 'details', 'summary', 'menuitem', 'menu']
if index(l:elm_nodes, a:node) >= 0
return a:node
endif
return 'node "' . a:node . '"'
endfunction
function! emmet#lang#elm#renderParam(param)
let l:elm_events = ["onClick", "onDoubleClick"
\, "onMouseDown", "onMouseUp"
\, "onMouseEnter", "onMouseLeave"
\, "onMouseOver", "onMouseOut"
\, "onInput", "onCheck", "onSubmit"
\, "onBlur", "onFocus"
\, "on", "onWithOptions", "Options", "defaultOptions"
\, "targetValue", "targetChecked", "keyCode"]
if index(l:elm_events, a:param) >= 0
return a:param
endif
let l:elm_attributes = ["style", "map" , "class", "id", "title", "hidden"
\, "type", "type_", "value", "defaultValue", "checked", "placeholder", "selected"
\, "accept", "acceptCharset", "action", "autocomplete", "autofocus"
\, "disabled", "enctype", "formaction", "list", "maxlength", "minlength", "method", "multiple"
\, "name", "novalidate", "pattern", "readonly", "required", "size", "for", "form"
\, "max", "min", "step"
\, "cols", "rows", "wrap"
\, "href", "target", "download", "downloadAs", "hreflang", "media", "ping", "rel"
\, "ismap", "usemap", "shape", "coords"
\, "src", "height", "width", "alt"
\, "autoplay", "controls", "loop", "preload", "poster", "default", "kind", "srclang"
\, "sandbox", "seamless", "srcdoc"
\, "reversed", "start"
\, "align", "colspan", "rowspan", "headers", "scope"
\, "async", "charset", "content", "defer", "httpEquiv", "language", "scoped"
\, "accesskey", "contenteditable", "contextmenu", "dir", "draggable", "dropzone"
\, "itemprop", "lang", "spellcheck", "tabindex"
\, "challenge", "keytype"
\, "cite", "datetime", "pubdate", "manifest"]
if index(l:elm_attributes, a:param) >= 0
if a:param == 'type'
return 'type_'
endif
return a:param
endif
return 'attribute "' . a:param . '"'
endfunction
function! emmet#lang#elm#toString(settings, current, type, inline, filters, itemno, indent) abort
let l:settings = a:settings
let l:current = a:current
let l:type = a:type
let l:inline = a:inline
let l:filters = a:filters
let l:itemno = a:itemno
let l:indent = emmet#getIndentation(l:type)
let l:dollar_expr = emmet#getResource(l:type, 'dollar_expr', 1)
let l:str = ''
" comma between items with *, eg. li*3
if l:itemno > 0
let l:str = ", "
endif
let l:current_name = l:current.name
if l:dollar_expr
let l:current_name = substitute(l:current.name, '\$$', l:itemno+1, '')
endif
if len(l:current.name) > 0
" inserted root comma nodes
if l:current_name == ','
return "\n, "
endif
let l:str .= emmet#lang#elm#renderNode(l:current_name)
let l:tmp = ''
for l:attr in emmet#util#unique(l:current.attrs_order + keys(l:current.attr))
if !has_key(l:current.attr, l:attr)
continue
endif
let l:Val = l:current.attr[l:attr]
let l:attr = emmet#lang#elm#renderParam(l:attr)
if type(l:Val) == 2 && l:Val == function('emmet#types#true')
let l:tmp .= ', ' . l:attr . ' True'
else
if l:dollar_expr
while l:Val =~# '\$\([^#{]\|$\)'
let l:Val = substitute(l:Val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g')
endwhile
let l:attr = substitute(l:attr, '\$$', l:itemno+1, '')
endif
let l:valtmp = substitute(l:Val, '\${cursor}', '', '')
if l:attr ==# 'id' && len(l:valtmp) > 0
let l:tmp .=', id "' . l:Val . '"'
elseif l:attr ==# 'class' && len(l:valtmp) > 0
let l:tmp .= ', class "' . substitute(l:Val, '\.', ' ', 'g') . '"'
else
let l:tmp .= ', ' . l:attr . ' "' . l:Val . '"'
endif
endif
endfor
if ! len(l:tmp)
let l:str .= ' []'
else
let l:tmp = strpart(l:tmp, 2)
let l:str .= ' [ ' . l:tmp . ' ]'
endif
" No children quit early
if len(l:current.child) == 0 && len(l:current.value) == 0
"Place cursor in node with no value or children
let l:str .= ' [${cursor}]'
return l:str
endif
let l:inner = ''
" Parent contex text
if len(l:current.value) > 0
let l:text = l:current.value[1:-2]
if l:dollar_expr
let l:text = substitute(l:text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g')
let l:text = substitute(l:text, '\${nr}', "\n", 'g')
let l:text = substitute(l:text, '\\\$', '$', 'g')
" let l:str = substitute(l:str, '\$#', l:text, 'g')
let l:inner .= ', text "' . l:text . '"'
endif
endif
" Has children
for l:child in l:current.child
if len(l:child.name) == 0 && len(l:child.value) > 0
" Text node
let l:text = l:child.value[1:-2]
if l:dollar_expr
let l:text = substitute(l:text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g')
let l:text = substitute(l:text, '\${nr}', "\n", 'g')
let l:text = substitute(l:text, '\\\$', '$', 'g')
endif
let l:inner .= ', text "' . l:text . '"'
else
" Other nodes
let l:inner .= ', ' . emmet#toString(l:child, l:type, l:inline, l:filters, 0, l:indent)
endif
endfor
let l:inner = substitute(l:inner, "\n", "\n" . escape(l:indent, '\'), 'g')
let l:inner = substitute(l:inner, "\n" . escape(l:indent, '\') . '$', '', 'g')
let l:inner = strpart(l:inner, 2)
let l:inner = substitute(l:inner, ' ', '', 'g')
if ! len(l:inner)
let l:str .= ' []'
else
let l:str .= ' [ ' . l:inner . ' ]'
endif
else
let l:str = l:current.value[1:-2]
if l:dollar_expr
let l:str = substitute(l:str, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g')
let l:str = substitute(l:str, '\${nr}', "\n", 'g')
let l:str = substitute(l:str, '\\\$', '$', 'g')
endif
endif
let l:str .= "\n"
return l:str
endfunction
function! emmet#lang#elm#imageEncode() abort
endfunction
function! emmet#lang#elm#parseTag(tag) abort
return {}
endfunction
function! emmet#lang#elm#toggleComment() abort
endfunction
function! emmet#lang#elm#balanceTag(flag) range abort
endfunction
function! emmet#lang#elm#moveNextPrevItem(flag) abort
return emmet#lang#elm#moveNextPrev(a:flag)
endfunction
function! emmet#lang#elm#moveNextPrev(flag) abort
endfunction
function! emmet#lang#elm#splitJoinTag() abort
endfunction
function! emmet#lang#elm#removeTag() abort
endfunction
function! emmet#lang#elm#mergeLines() abort
endfunction

View File

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

View File

@@ -14,8 +14,8 @@ function! emmet#lang#less#imageSize() abort
call emmet#lang#css#imageSize()
endfunction
function! emmet#lang#less#imageEncode() abort
return emmet#lang#css#imageEncode()
function! emmet#lang#less#encodeImage() abort
return emmet#lang#css#encodeImage()
endfunction
function! emmet#lang#less#parseTag(tag) abort
@@ -45,7 +45,3 @@ endfunction
function! emmet#lang#less#removeTag() abort
call emmet#lang#css#removeTag()
endfunction
function! emmet#lang#less#mergeLines() abort
call emmet#lang#css#mergeLines()
endfunction

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -148,19 +148,21 @@ You should copy this section and create new buffer, paste and write as
</p>
</div>
<
2. Expand word *emmet-expand-word* *<C-y>;*
2. Expand abbreviation *emmet-expand-word* *<C-y>;*
When you want to expand word except html tokens like below, use this.
>
<html>foo
<html
>foo
<
This will be expanded like:
>
<html><foo></foo>
<
<html
><foo></foo>
3. Update tag *emmet-update-tag* *<C-y>u*
The beginning of tags '<div>' on below
The begining of tags '<div>' on below
>
<div>foo</div>
<
@@ -170,7 +172,7 @@ You should copy this section and create new buffer, paste and write as
<
This will be expanded like:
>
<div class="global">foo</div>
<div class=".global">foo</div>
<
4. Wrap with abbreviation *emmet-wrap-with-abbreviation* *v_<C-y>,*
@@ -1264,14 +1266,14 @@ CUSTOMIZE *emmet-customize*
1. Key mapping *emmet-customize-key-mappings*
To specify leading key for expanding or balance tag, or for all,
Add this line in your 'vimrc':
Add this line in your 'vimrc': >
>
let g:user_emmet_leader_key = '<C-y>'
<
Note that to expand abbreviation a trailing ',' must be typed, so
the resultant keymap is '<C-y>,'.
If you prefer to map for each action separately, use following variables:
If you prefer to map for each actions separately, use following valuables:
>
let g:user_emmet_expandabbr_key = '<C-y>,'
let g:user_emmet_expandword_key = '<C-y>;'
@@ -1332,7 +1334,7 @@ CUSTOMIZE *emmet-customize*
3. Define tag's behavior *emmet-define-tags-behavior*
User can create abbreviations and snippets for each filetype
User can create abbreviations and snippets for each filetypes
using |g:user_emmet_settings|. For details, see official site of Emmet.
For example, user can add following:
>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

1
docs

Submodule docs deleted from ff5a094cc8

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>
" | <title></title>
" | <meta charset="UTF-8">
" | <meta name="viewport" content="width=device-width, initial-scale=1.0">
" | </head>
" | <body>
" | _
@@ -47,7 +46,7 @@
" Tips:
"
" You can customize behavior of expanding with overriding config.
" This configuration will be merged at loading plugin.
" This configuration will be marged at loading plugin.
"
" let g:user_emmet_settings = {
" \ 'indentation' : ' ',
@@ -96,8 +95,8 @@ if !exists('g:user_emmet_leader_key')
endif
function! s:install_plugin(mode, buffer)
let l:buffer = a:buffer ? '<buffer>' : ''
let l:items = [
let buffer = a:buffer ? '<buffer>' : ''
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': '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>'},
@@ -107,13 +106,13 @@ function! s:install_plugin(mode, buffer)
\ {'mode': 'n', 'var': 'user_emmet_update_tag', 'key': 'u', 'plug': 'emmet-update-tag', 'func': ':call emmet#updateTag()<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_balancetaginward_key', 'key': 'd', 'plug': 'emmet-balance-tag-inward', 'func': '<esc>:call emmet#balanceTag(1)<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_balancetaginward_key', 'key': 'd', 'plug': 'emmet-balance-tag-inward', 'func': ':call emmet#balanceTag(1)<cr>'},
\ {'mode': 'v', 'var': 'user_emmet_balancetaginward_key', 'key': 'd', 'plug': 'emmet-balance-tag-inward', 'func': '<esc>:call emmet#balanceTag(1)<cr>'},
\ {'mode': 'v', 'var': 'user_emmet_balancetaginward_key', 'key': 'd', 'plug': 'emmet-balance-tag-inward', 'func': ':call emmet#balanceTag(2)<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_balancetagoutward_key', 'key': 'D', 'plug': 'emmet-balance-tag-outword', 'func': '<esc>:call emmet#balanceTag(-1)<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_balancetagoutward_key', 'key': 'D', 'plug': 'emmet-balance-tag-outword', 'func': ':call emmet#balanceTag(-1)<cr>'},
\ {'mode': 'v', 'var': 'user_emmet_balancetagoutward_key', 'key': 'D', 'plug': 'emmet-balance-tag-outword', 'func': '<esc>:call emmet#balanceTag(-1)<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_next_key', 'key': 'n', 'plug': 'emmet-move-next', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#moveNextPrev(0)<cr>'},
\ {'mode': 'v', 'var': 'user_emmet_balancetagoutward_key', 'key': 'D', 'plug': 'emmet-balance-tag-outword', 'func': ':call emmet#balanceTag(-2)<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_next_key', 'key': 'n', 'plug': 'emmet-move-next', 'func': '<esc>:call emmet#moveNextPrev(0)<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_next_key', 'key': 'n', 'plug': 'emmet-move-next', 'func': ':call emmet#moveNextPrev(0)<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_prev_key', 'key': 'N', 'plug': 'emmet-move-prev', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#moveNextPrev(1)<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_prev_key', 'key': 'N', 'plug': 'emmet-move-prev', 'func': '<esc>:call emmet#moveNextPrev(1)<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_prev_key', 'key': 'N', 'plug': 'emmet-move-prev', 'func': ':call emmet#moveNextPrev(1)<cr>'},
\ {'mode': 'i', 'var': '', 'key': '', 'plug': 'emmet-move-next-item', 'func': '<esc>:call emmet#moveNextPrevItem(0)<cr>'},
\ {'mode': 'n', 'var': '', 'key': '', 'plug': 'emmet-move-next-item', 'func': ':call emmet#moveNextPrevItem(0)<cr>'},
@@ -121,8 +120,6 @@ function! s:install_plugin(mode, buffer)
\ {'mode': 'n', 'var': '', 'key': '', 'plug': 'emmet-move-prev-item', 'func': ':call emmet#moveNextPrevItem(1)<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_imagesize_key', 'key': 'i', 'plug': 'emmet-image-size', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#imageSize()<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_imagesize_key', 'key': 'i', 'plug': 'emmet-image-size', 'func': ':call emmet#imageSize()<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_imageencode_key', 'key': 'I', 'plug': 'emmet-image-encode', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#imageEncode()<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_imageencode_key', 'key': 'I', 'plug': 'emmet-image-encode', 'func': ':call emmet#imageEncode()<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_togglecomment_key', 'key': '/', 'plug': 'emmet-toggle-comment', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#toggleComment()<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_togglecomment_key', 'key': '/', 'plug': 'emmet-toggle-comment', 'func': ':call emmet#toggleComment()<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_splitjointag_key', 'key': 'j', 'plug': 'emmet-split-join-tag', 'func': '<esc>:call emmet#splitJoinTag()<cr>'},
@@ -133,25 +130,24 @@ function! s:install_plugin(mode, buffer)
\ {'mode': 'n', 'var': 'user_emmet_anchorizeurl_key', 'key': 'a', 'plug': 'emmet-anchorize-url', 'func': ':call emmet#anchorizeURL(0)<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_anchorizesummary_key', 'key': 'A', 'plug': 'emmet-anchorize-summary', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#anchorizeURL(1)<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_anchorizesummary_key', 'key': 'A', 'plug': 'emmet-anchorize-summary', 'func': ':call emmet#anchorizeURL(1)<cr>'},
\ {'mode': 'i', 'var': 'user_emmet_mergelines_key', 'key': 'm', 'plug': 'emmet-merge-lines', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#mergeLines()<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_mergelines_key', 'key': 'm', 'plug': 'emmet-merge-lines', 'func': ':call emmet#mergeLines()<cr>'},
\ {'mode': 'v', 'var': 'user_emmet_mergelines_key', 'key': 'm', 'plug': 'emmet-merge-lines', 'func': ':call emmet#mergeLines()<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)
for l:item in l:items
if a:mode !=# 'a' && stridx(a:mode, l:item.mode) == -1
let only_plug = get(g:, 'emmet_install_only_plug', 0)
for item in items
if a:mode !=# 'a' && stridx(a:mode, item.mode) == -1
continue
endif
exe l:item.mode . 'noremap '. l:buffer .' <plug>(' . l:item.plug . ') ' . l:item.func
if l:item.var != '' && !l:only_plug
if exists('g:' . l:item.var)
let l:key = eval('g:' . l:item.var)
exe item.mode . 'noremap '. buffer .' <plug>(' . item.plug . ') ' . item.func
if item.var != '' && !only_plug
if exists('g:' . item.var)
let key = eval('g:' . item.var)
else
let l:key = g:user_emmet_leader_key . l:item.key
let key = g:user_emmet_leader_key . item.key
endif
if !hasmapto('<plug>(' . l:item.plug . ')', l:item.mode) && !len(maparg(l:key, l:item.mode))
exe l:item.mode . 'map ' . l:buffer . ' <unique> <silent>' . l:key . ' <plug>(' . l:item.plug . ')'
if !hasmapto('<plug>(' . item.plug . ')', item.mode) && !len(maparg(key, item.mode))
exe item.mode . 'map ' . buffer . ' <unique> ' . key . ' <plug>(' . item.plug . ')'
endif
endif
endfor
@@ -175,17 +171,6 @@ if get(g:, 'user_emmet_install_command', 1)
command! -nargs=1 Emmet call emmet#expandAbbr(4, <q-args>)
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
unlet s:save_cpo

View File

@@ -1,6 +1,5 @@
" {{{
let s:sfile = expand('<sfile>')
let s:logging = 0
function! s:reload(d)
exe 'so' a:d.'/plugin/emmet.vim'
@@ -9,32 +8,22 @@ function! s:reload(d)
endfor
endfunction
function! s:logn(msg)
echon a:msg
call writefile([a:msg, ''], "test.log", "ab")
endfunction
function! s:log(msg)
echo a:msg
call writefile(split(a:msg, "\n"), "test.log", "ab")
endfunction
function! s:show_type(type)
echohl Search | call s:log('['.a:type.']') | echohl None
echohl Search | echon '[' a:type "]\n" | echohl None
echo "\r"
endfunction
function! s:show_category(category)
echohl MatchParen | call s:log('['.a:category.']') | echohl None
echohl MatchParen | echon '[' a:category "]\n" | echohl None
echo "\r"
endfunction
function! s:show_pass(pass)
echohl Title | call s:log('pass '.substitute(a:pass, '\s', '', 'g')) | echohl None
echohl Title | echo 'pass'.a:pass."\n" | echohl None
endfunction
function! s:show_done()
echohl IncSearch | call s:log('done') | echohl None
echohl IncSearch | echo 'done' | echohl None
endfunction
function! s:escape(str)
@@ -47,39 +36,37 @@ endfunction
function! s:show_title(no, title)
let title = s:escape(a:title)
let width = &columns - 23
echon "\r"
echohl MoreMsg | call s:logn('testing #'.printf('%03d', a:no))
echohl None | call s:logn(': '.(len(title) < width ? (title.' '.repeat('.', width-len(title)+1)) : strpart(title, 0, width+2)).'... ')
echohl MoreMsg | echon "\rtesting #".printf('%03d', a:no)
echohl None | echon ': ' . (len(title) < width ? (title.repeat(' ', width-len(title))) : strpart(title, 0, width)) . ' ... '
endfunction
function! s:show_skip(no, title)
let title = s:escape(a:title)
let width = &columns - 23
echon "\r"
echohl WarningMsg | call s:logn('skipped #'.printf('%03d', a:no))
echohl None | call s:logn(': '.(len(title) < width ? (title.' '.repeat('.', width-len(title)+1)) : strpart(title, 0, width+2)).'... ')
echohl WarningMsg | echon "\rskipped #".printf('%03d', a:no)
echohl None | echon ': ' . (len(title) < width ? (title.repeat(' ', width-len(title))) : strpart(title, 0, width)) . ' ... '
echo ''
endfunction
function! s:show_ok()
echohl Title | call s:logn('ok') | echohl None
echohl Title | echon "ok\n" | echohl None
echo ''
endfunction
function! s:show_ng(no, expect, got)
echohl WarningMsg | call s:logn('ng') | echohl None
echohl ErrorMsg | call s:log('failed test #'.a:no) | echohl None
echohl WarningMsg | echon "ng\n" | echohl None
echohl ErrorMsg | echo 'failed test #'.a:no | echohl None
set more
echohl WarningMsg | call s:log(printf('expect(%d):', len(a:expect))) | echohl None
echohl WarningMsg | echo printf('expect(%d):', len(a:expect)) | echohl None
echo join(split(a:expect, "\n", 1), "|\n")
echohl WarningMsg | call s:log(printf('got(%d):', len(a:got))) | echohl None
call s:log(join(split(a:got, "\n", 1), "|\n"))
echohl WarningMsg | echo printf('got(%d):', len(a:got)) | echohl None
echo join(split(a:got, "\n", 1), "|\n")
let cs = split(a:expect, '\zs')
for c in range(len(cs))
if c < len(a:got)
if a:expect[c] != a:got[c]
echohl WarningMsg | call s:log('differ at:') | echohl None
call s:log(a:expect[c :-1])
echohl WarningMsg | echo 'differ at:' | echohl None
echo a:expect[c :-1]
break
endif
endif
@@ -104,7 +91,6 @@ function! s:test(...)
let start = reltime()
for n in range(len(tests))
if len(index) > 0 && n != index | continue | endif
if has_key(tests[n], 'ignore') && tests[n].ignore | continue | endif
let query = tests[n].query
let options = has_key(tests[n], 'options') ? tests[n].options : {}
let result = tests[n].result
@@ -122,7 +108,6 @@ function! s:test(...)
if stridx(query, '$$$$') != -1
silent! 1new
silent! exe 'setlocal ft='.testgroup.type
EmmetInstall
silent! let key = matchstr(query, '.*\$\$\$\$\zs.*\ze\$\$\$\$')
if len(key) > 0
exe printf('let key = "%s"', key)
@@ -169,9 +154,8 @@ function! s:test(...)
endfor
endfunction
function! s:do_tests(bang, ...)
function! s:do_tests(...)
try
let s:logging = a:bang
if exists('g:user_emmet_settings')
let s:old_user_emmet_settings = g:user_emmet_settings
endif
@@ -181,22 +165,13 @@ function! s:do_tests(bang, ...)
let &more = 0
call call('s:test', a:000)
call s:show_done()
if a:bang == '!'
qall!
endif
catch
echohl ErrorMsg | echomsg v:exception | echohl None
if a:bang == '!'
cquit!
endif
finally
let &more=oldmore
if exists('s:old_user_emmet_settings')
let g:user_emmet_settings = s:old_user_emmet_settings
endif
if exists('s:old_user_emmet_install_global')
let g:user_emmet_install_global = s:old_user_emmet_install_global
endif
endtry
endfunction
@@ -214,7 +189,7 @@ function! s:emmet_unittest_complete(arglead, cmdline, cmdpos)
return []
endfunction
command! -bang -nargs=* -complete=customlist,<SID>emmet_unittest_complete EmmetUnitTest call s:do_tests("<bang>", <f-args>)
command! -nargs=* -complete=customlist,<SID>emmet_unittest_complete EmmetUnitTest call s:do_tests(<f-args>)
if s:sfile == expand('%:p')
EmmetUnitTest
endif
@@ -266,7 +241,7 @@ finish
},
{
'query': "html:xt>div#header>div#logo+ul#nav>li.item-$*5>a",
'result': "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\">\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\" />\n\t<title></title>\n</head>\n<body>\n\t<div id=\"header\">\n\t\t<div id=\"logo\"></div>\n\t\t<ul id=\"nav\">\n\t\t\t<li class=\"item-1\"><a href=\"\"></a></li>\n\t\t\t<li class=\"item-2\"><a href=\"\"></a></li>\n\t\t\t<li class=\"item-3\"><a href=\"\"></a></li>\n\t\t\t<li class=\"item-4\"><a href=\"\"></a></li>\n\t\t\t<li class=\"item-5\"><a href=\"\"></a></li>\n\t\t</ul>\n\t</div>\n\t\n</body>\n</html>",
'result': "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\">\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\">\n\t\t<title>${1:Document}</title>\n\t</head>\n\t<body>\n\t<div id=\"header\">\n\t\t<div id=\"logo\"></div>\n\t\t<ul id=\"nav\">\n\t\t\t<li class=\"item-1\"><a href=\"\"></a></li>\n\t\t\t<li class=\"item-2\"><a href=\"\"></a></li>\n\t\t\t<li class=\"item-3\"><a href=\"\"></a></li>\n\t\t\t<li class=\"item-4\"><a href=\"\"></a></li>\n\t\t\t<li class=\"item-5\"><a href=\"\"></a></li>\n\t\t</ul>\n\t</div>\n\t\n</body>\n</html>",
},
{
'query': "ol>li*2",
@@ -322,11 +297,11 @@ finish
},
{
'query': "blockquote>b>i<<b",
'result': "<blockquote>\n\t<b><i></i></b>\n</blockquote>\n<b></b>\n",
'result': "<blockquote><b><i></i></b></blockquote>\n<b></b>\n",
},
{
'query': "blockquote>b>i^^b",
'result': "<blockquote>\n\t<b><i></i></b>\n</blockquote>\n<b></b>\n",
'result': "<blockquote><b><i></i></b></blockquote>\n<b></b>\n",
},
{
'query': "a[href=foo][class=bar]",
@@ -357,19 +332,19 @@ finish
'result': "<table>\n\t<tr>\n\t\t<td id=\"foo\" class=\"name\"></td>\n\t\t<td></td>\n\t\t<td></td>\n\t\t<td></td>\n\t</tr>\n</table>\n",
},
{
'query': "div#header+div#footer",
'query': "div#header + div#footer",
'result': "<div id=\"header\"></div>\n<div id=\"footer\"></div>\n",
},
{
'query': "#header+div#footer",
'query': "#header + div#footer",
'result': "<div id=\"header\"></div>\n<div id=\"footer\"></div>\n",
},
{
'query': "#header>ul>li<p{Footer}",
'query': "#header > ul > li < p{Footer}",
'result': "<div id=\"header\">\n\t<ul>\n\t\t<li></li>\n\t</ul>\n\t<p>Footer</p>\n</div>\n",
},
{
'query': "#header>ul>li^p{Footer}",
'query': "#header > ul > li ^ p{Footer}",
'result': "<div id=\"header\">\n\t<ul>\n\t\t<li></li>\n\t</ul>\n\t<p>Footer</p>\n</div>\n",
},
{
@@ -562,11 +537,7 @@ finish
},
{
'query': "form.search-form._wide>input.-query-string+input:s.-btn_large|bem",
'result': "<form class=\"search-form search-form_wide\" action=\"\">\n\t<input class=\"search-form__query-string\" type=\"\">\n\t<input class=\"search-form__btn search-form__btn_large\" type=\"submit\" value=\"\">\n</form>\n",
},
{
'query': "form>fieldset>legend+(label>input[type=\"checkbox\"])*3",
'result': "<form action=\"\">\n\t<fieldset>\n\t\t<legend></legend>\n\t\t<label for=\"\"><input type=\"checkbox\"></label>\n\t\t<label for=\"\"><input type=\"checkbox\"></label>\n\t\t<label for=\"\"><input type=\"checkbox\"></label>\n\t</fieldset>\n</form>\n",
'result': "<form class=\"search-form search-form_wide\" action=\"\">\n\t<input class=\"search-form-query-string\" type=\"\">\n\t<input class=\"search-form-btn_large\" type=\"submit\" value=\"\">\n</form>\n",
},
],
},
@@ -575,20 +546,12 @@ finish
'tests': [
{
'query': "<div>\n\t<span>$$$$\\<c-y>j$$$$</span>\n</div>",
'result': "<div>\n\t<span />\n</div>",
'result': "<div>\n\t<span/>\n</div>",
},
{
'query': "<div>\n\t<span$$$$\\<c-y>j$$$$/>\n</div>",
'result': "<div>\n\t<span></span>\n</div>",
},
{
'query': "<div onclick=\"javascript:console.log(Date.now() % 1000 > 500)\">test$$$$\\<c-y>j$$$$/>\n</div>",
'result': "<div onclick=\"javascript:console.log(Date.now() % 1000 > 500)\" />",
},
{
'query': "<div>\n\t<some-tag$$$$\\<c-y>j$$$$/>\n</div>",
'result': "<div>\n\t<some-tag></some-tag>\n</div>",
},
],
},
{
@@ -681,19 +644,6 @@ finish
'query': "<h$$$$\\<c-y>u.global\\<cr>$$$$3></h3>",
'result': "<h3 class=\"global\"></h3>",
},
{
'query': "<button$$$$\\<c-y>u.btn\\<cr>$$$$ disabled></button>",
'result': "<button class=\"btn\" disabled></button>",
},
],
},
{
'name': 'base value',
'tests': [
{
'query': "ul>li#id$@0*3",
'result': "<ul>\n\t<li id=\"id0\"></li>\n\t<li id=\"id1\"></li>\n\t<li id=\"id2\"></li>\n</ul>\n",
},
],
},
],
@@ -742,7 +692,7 @@ finish
},
{
'query': "{-bdrs20$$$$}",
'result': "{-webkit-border-radius: 20px;\n-moz-border-radius: 20px;\n-o-border-radius: 20px;\n-ms-border-radius: 20px;\nborder-radius: 20px;}",
'result': "{-webkit-border-radius: 20px;\n-moz-border-radius: 20px;\nborder-radius: 20px;}",
},
{
'query': "{lg(top,#fff,#000)$$$$}",
@@ -849,7 +799,7 @@ finish
],
},
{
'name': 'split join',
'name': 'expand abbreviation',
'tests': [
{
'query': "%a foo\n bar$$$$\\<c-y>j$$$$",
@@ -1030,7 +980,7 @@ finish
},
{
'query': "{-bdrs20$$$$}",
'result': "{-webkit-border-radius: 20px;\n-moz-border-radius: 20px;\n-o-border-radius: 20px;\n-ms-border-radius: 20px;\nborder-radius: 20px;}",
'result': "{-webkit-border-radius: 20px;\n-moz-border-radius: 20px;\nborder-radius: 20px;}",
},
{
'query': "{lg(top,#fff,#000)$$$$}",
@@ -1064,67 +1014,5 @@ finish
},
],
'dummy': "}}}"},
{ 'test-jade': "{{{",
'type': 'jade',
'categories': [
{
'name': 'expand abbreviation',
'tests': [
{
'query': "!!!$$$$\\<c-y>,$$$$",
'result': "doctype html\n\n",
},
{
'query': "span.my-span$$$$\\<c-y>,$$$$",
'result': "span.my-span",
},
],
},
],
'dummy': "}}}"},
{ 'test-pug': "{{{",
'type': 'pug',
'categories': [
{
'name': 'expand abbreviation',
'tests': [
{
'query': "!!!$$$$\\<c-y>,$$$$",
'result': "doctype html\n\n",
},
{
'query': "span.my-span$$$$\\<c-y>,$$$$",
'result': "span.my-span",
},
{
'query': "input$$$$\\<c-y>,text$$$$",
'result': "input(type=\"text\")",
},
],
},
],
'dummy': "}}}"},
{ 'test-jsx': "{{{",
'type': 'javascript.jsx',
'categories': [
{
'name': 'expand abbreviation',
'tests': [
{
'query': "img$$$$\\<c-y>,$$$$",
'result': "<img src=\"\" alt=\"\" />",
},
{
'query': "span.my-span$$$$\\<c-y>,$$$$",
'result': "<span className=\"my-span\"></span>",
},
{
'query': "function() { return span.my-span$$$$\\<c-y>,$$$$; }",
'result': "function() { return <span className=\"my-span\"></span>; }",
},
],
},
],
'dummy': "}}}"},
]
" vim:set et fdm=marker: