1 Commits
Author SHA1 Message Date
Yasuhiro Matsumoto 5fe726da47 fix abbreviation 2015-11-11 19:44:25 +09:00
34 changed files with 2430 additions and 4610 deletions
-8
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
-26
View File
@@ -1,26 +0,0 @@
name: Test
on:
push:
branches: [master]
pull_request:
branches: [master]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
vim:
- head
steps:
- uses: actions/checkout@v4
- uses: thinca/action-setup-vim@v2
with:
vim_version: ${{ matrix.vim }}
- uses: actions/checkout@v4
with:
repository: thinca/vim-themis
path: vim-themis
- name: Run tests
run: ./vim-themis/bin/themis --runtimepath . test/
-13
View File
@@ -1,13 +0,0 @@
let &runtimepath .= ',' . fnamemodify(expand('<sfile>'), ':h') . '/test'
call themis#helper('command').with(themis#helper('assert'))
let s:emmet = themis#helper('emmet')
call s:emmet.setup()
function! ExpandWord(query, type) abort
return s:emmet.expand_word(a:query, a:type)
endfunction
function! ExpandInBuffer(query, type, result) abort
return s:emmet.expand_in_buffer(a:query, a:type, a:result)
endfunction
-11
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
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.
-7
View File
@@ -9,10 +9,3 @@ emmet-vim.zip: remove-zip
release: emmet-vim.zip release: emmet-vim.zip
vimup update-script emmet.vim vimup update-script emmet.vim
test:
@../vim-themis/bin/themis --runtimepath . test/
test-old:
@-rm -f test.log 2> /dev/null
@vim -N -c "let &rtp .= ',' . getcwd()" -c "so unittest.vim" -c EmmetUnitTest! || cat test.log || exit 1
+19 -72
View File
@@ -1,68 +1,47 @@
# Emmet-vim # Emmet-vim
[emmet-vim](http://mattn.github.com/emmet-vim) is a vim plug-in
[![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
which provides support for expanding abbreviations similar to which provides support for expanding abbreviations similar to
[emmet](http://emmet.io/). [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 ## Installation
[Download zip file](http://www.vim.org/scripts/script.php?script_id=2981): [Download zip file](http://www.vim.org/scripts/script.php?script_id=2981):
```sh cd ~/.vim
cd ~/.vim unzip emmet-vim.zip
unzip emmet-vim.zip
```
To install using [pathogen.vim](https://github.com/tpope/vim-pathogen): To install using pathogen.vim:
```sh cd ~/.vim/bundle
git clone https://github.com/mattn/emmet-vim.git ~/.vim/bundle/emmet-vim git clone https://github.com/mattn/emmet-vim.git
```
To install using [Vundle](https://github.com/gmarik/vundle): To install using [Vundle](https://github.com/gmarik/vundle):
```vim " add this line to your .vimrc file
" add this line to your .vimrc file Plugin 'mattn/emmet-vim'
Plugin 'mattn/emmet-vim'
```
To install using [Vim-Plug](https://github.com/junegunn/vim-plug):
```vim
" add this line to your .vimrc file
Plug 'mattn/emmet-vim'
```
To checkout the source from repository: To checkout the source from repository:
```sh cd ~/.vim/bundle
cd ~/.vim/bundle git clone https://github.com/mattn/emmet-vim.git
git clone https://github.com/mattn/emmet-vim.git
```
or: or:
```sh git clone https://github.com/mattn/emmet-vim.git
git clone https://github.com/mattn/emmet-vim.git cd emmet-vim
cd emmet-vim cp plugin/emmet.vim ~/.vim/plugin/
cp plugin/emmet.vim ~/.vim/plugin/ cp autoload/emmet.vim ~/.vim/autoload/
cp autoload/emmet.vim ~/.vim/autoload/ cp -a autoload/emmet ~/.vim/autoload/
cp -a autoload/emmet ~/.vim/autoload/
```
## Quick Tutorial ## Quick Tutorial
Open or create a New File: Open or create a New File:
```sh vim index.html
vim index.html
```
Type ("\_" is the cursor position): Type ("\_" is the cursor position):
@@ -83,7 +62,7 @@ Then type `<c-y>,` (<kbd>Ctrl</kbd><kbd>y</kbd><kbd>,</kbd>), and you should see
</html> </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 ## 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. [Here](http://docs.emmet.io/customization/snippets/) you can find instructions about creating your customized **snippets.json** file.
## Snippet to add meta tag for responsiveness
Update this in your .vimrc file.
let g:user_emmet_settings = {
\ 'variables': {'lang': 'ja'},
\ 'html': {
\ 'default_attributes': {
\ 'option': {'value': v:null},
\ 'textarea': {'id': v:null, 'name': v:null, 'cols': 10, 'rows': 10},
\ },
\ 'snippets': {
\ 'html:5': "<!DOCTYPE html>\n"
\ ."<html lang=\"${lang}\">\n"
\ ."<head>\n"
\ ."\t<meta charset=\"${charset}\">\n"
\ ."\t<title></title>\n"
\ ."\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n"
\ ."</head>\n"
\ ."<body>\n\t${child}|\n</body>\n"
\ ."</html>",
\ },
\ },
\}
## Project Authors ## Project Authors
[Yasuhiro Matsumoto](http://mattn.kaoriya.net/) [Yasuhiro Matsumoto](http://mattn.kaoriya.net/)
## FAQ
* Pressing ctrl+y+, doesn't work
Probably you set `timeoutlen=0`. Most of Vim plugins which using key-mappings does not work with `timeoutlen=0`.
## Links ## Links
### Emmet official site: ### Emmet official site:
@@ -172,7 +119,7 @@ Update this in your .vimrc file.
### emmet.vim: ### emmet.vim:
* <https://mattn.github.io/emmet-vim/> * <http://mattn.github.com/emmet-vim>
### development repository: ### development repository:
-247
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',
\ },
\}
```
+630 -830
View File
File diff suppressed because it is too large Load Diff
-41
View File
@@ -9,44 +9,3 @@ function! emmet#lang#exists(type) abort
return s:exists[a:type] return s:exists[a:type]
endfunction 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
+220 -259
View File
@@ -1,6 +1,6 @@
function! emmet#lang#css#findTokens(str) abort function! emmet#lang#css#findTokens(str) abort
let l:tmp = substitute(substitute(a:str, '^.*[;{]\s*', '', ''), '}\s*$', '', '') let tmp = substitute(substitute(a:str, '^.*[;{]\s*', '', ''), '}\s*$', '', '')
if l:tmp =~ '/' && l:tmp =~ '^[a-zA-Z0-9/_.]\+$' if tmp =~ '/' && tmp =~ '^[a-zA-Z0-9/_.]\+$'
" maybe path or something " maybe path or something
return '' return ''
endif endif
@@ -8,281 +8,243 @@ function! emmet#lang#css#findTokens(str) abort
endfunction endfunction
function! emmet#lang#css#parseIntoTree(abbr, type) abort function! emmet#lang#css#parseIntoTree(abbr, type) abort
let l:abbr = a:abbr let abbr = a:abbr
let l:type = a:type let type = a:type
let l:prefix = 0 let prefix = 0
let l:value = '' let value = ''
let l:indent = emmet#getIndentation(l:type) let indent = emmet#getIndentation(type)
let l:aliases = emmet#getResource(l:type, 'aliases', {}) let aliases = emmet#getResource(type, 'aliases', {})
let l:snippets = emmet#getResource(l:type, 'snippets', {}) let snippets = emmet#getResource(type, 'snippets', {})
let l:use_pipe_for_cursor = emmet#getResource(l:type, 'use_pipe_for_cursor', 1) let use_pipe_for_cursor = emmet#getResource(type, 'use_pipe_for_cursor', 1)
let l:root = emmet#newNode() let root = emmet#newNode()
" emmet " emmet
let l:tokens = split(l:abbr, '+\ze[^+)!]') let tokens = split(abbr, '+\ze[^+)!]')
let l:block = emmet#util#searchRegion('{', '}') let block = emmet#util#searchRegion('{', '}')
if l:abbr !~# '^@' && emmet#getBaseType(l:type) ==# 'css' && l:type !=# 'sass' && l:type !=# 'styled' && l:block[0] ==# [0,0] && l:block[1] ==# [0,0] if abbr !~# '^@' && emmet#getBaseType(type) ==# 'css' && type !=# 'sass' && block[0] ==# [0,0] && block[1] ==# [0,0]
let l:current = emmet#newNode() let current = emmet#newNode()
let l:current.snippet = substitute(l:abbr, '\s\+$', '', '') . " {\n" . l:indent . "${cursor}\n}" let current.snippet = substitute(abbr, '\s\+$', '', '') . " {\n" . indent . "${cursor}\n}"
let l:current.name = '' let current.name = ''
call add(l:root.child, deepcopy(l:current)) call add(root.child, deepcopy(current))
else else
for l:n in range(len(l:tokens)) for n in range(len(tokens))
let l:token = l:tokens[l:n] let token = tokens[n]
let l:prop = matchlist(l:token, '^\(-\{0,1}[a-zA-Z]\+\|[a-zA-Z0-9]\++\{0,1}\|([a-zA-Z0-9]\++\{0,1})\)\(\%([0-9.-]\+\%(p\|e\|em\|x\|vh\|vw\|re\|rem\|%\)\{0,}-\{0,1}\|-auto\)*\)$') let prop = matchlist(token, '^\(-\{0,1}[a-zA-Z]\+\|[a-zA-Z0-9]\++\{0,1}\|([a-zA-Z0-9]\++\{0,1})\)\(\%([0-9.-]\+\%(p\|e\|em\|re\|rem\|%\)\{0,1}-\{0,1}\|-auto\)*\)$')
if len(l:prop) if len(prop)
let l:token = substitute(l:prop[1], '^(\(.*\))', '\1', '') let token = substitute(prop[1], '^(\(.*\))', '\1', '')
if l:token =~# '^-' if token =~# '^-'
let l:prefix = 1 let prefix = 1
let l:token = l:token[1:] let token = token[1:]
endif endif
let l:value = '' let value = ''
for l:vt in split(l:prop[2], '\a\+\zs') for v in split(prop[2], '\d\zs-')
let l:ut = matchstr(l:vt, '[a-z]\+$') if len(value) > 0
if l:ut == 'auto' let value .= ' '
let l:ut = '' 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 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 endfor
endif endif
let l:tag_name = l:token let tag_name = token
if l:tag_name =~# '.!$' if tag_name =~# '.!$'
let l:tag_name = l:tag_name[:-2] let tag_name = tag_name[:-2]
let l:important = 1 let important = 1
else else
let l:important = 0 let important = 0
endif endif
" make default node " make default node
let l:current = emmet#newNode() let current = emmet#newNode()
let l:current.important = l:important let current.important = important
let l:current.name = l:tag_name let current.name = tag_name
" aliases " aliases
if has_key(l:aliases, l:tag_name) if has_key(aliases, tag_name)
let l:current.name = l:aliases[l:tag_name] let current.name = aliases[tag_name]
endif endif
" snippets " snippets
if !empty(l:snippets) if !empty(snippets)
let l:snippet_name = l:tag_name let snippet_name = tag_name
if !has_key(l:snippets, l:snippet_name) if !has_key(snippets, snippet_name)
let l:pat = '^' . join(split(l:tag_name, '\zs'), '\%(\|[^:-]\+-\)') let pat = '^' . join(split(tag_name, '\zs'), '\%(\|[^:-]\+-\)')
let l:vv = filter(sort(keys(l:snippets)), 'l:snippets[v:val] =~ l:pat') let vv = filter(sort(keys(snippets)), 'snippets[v:val] =~ pat')
if len(l:vv) == 0 if len(vv) > 0
let l:vv = filter(sort(keys(l:snippets)), 'substitute(v:val, ":", "", "g") == l:snippet_name') let snippet_name = vv[0]
endif
if len(l:vv) > 0
let l:snippet_name = l:vv[0]
else else
let l:pat = '^' . join(split(l:tag_name, '\zs'), '\%(\|[^:-]\+-*\)') let pat = '^' . join(split(tag_name, '\zs'), '\%(\|[^:-]\+-*\)')
let l:vv = filter(sort(keys(l:snippets)), 'l:snippets[v:val] =~ l:pat') let vv = filter(sort(keys(snippets)), 'snippets[v:val] =~ pat')
if len(l:vv) == 0 if len(vv) == 0
let l:pat = '^' . join(split(l:tag_name, '\zs'), '[^:]\{-}') let pat = '^' . join(split(tag_name, '\zs'), '[^:]\{-}')
let l:vv = filter(sort(keys(l:snippets)), 'l:snippets[v:val] =~ l:pat') let vv = filter(sort(keys(snippets)), 'snippets[v:val] =~ pat')
if len(l:vv) == 0 if len(vv) == 0
let l:pat = '^' . join(split(l:tag_name, '\zs'), '.\{-}') let pat = '^' . join(split(tag_name, '\zs'), '.\{-}')
let l:vv = filter(sort(keys(l:snippets)), 'l:snippets[v:val] =~ l:pat') let vv = filter(sort(keys(snippets)), 'snippets[v:val] =~ pat')
endif endif
endif endif
let l:minl = -1 let minl = -1
for l:vk in l:vv for vk in vv
let l:vvs = l:snippets[l:vk] let vvs = snippets[vk]
if l:minl == -1 || len(l:vvs) < l:minl if minl == -1 || len(vvs) < minl
let l:snippet_name = l:vk let snippet_name = vk
let l:minl = len(l:vvs) let minl = len(vvs)
endif endif
endfor endfor
endif endif
endif endif
if has_key(l:snippets, l:snippet_name) if has_key(snippets, snippet_name)
let l:snippet = l:snippets[l:snippet_name] let snippet = snippets[snippet_name]
if l:use_pipe_for_cursor if use_pipe_for_cursor
let l:snippet = substitute(l:snippet, '|', '${cursor}', 'g') let snippet = substitute(snippet, '|', '${cursor}', 'g')
endif endif
let l:lines = split(l:snippet, "\n") let lines = split(snippet, "\n")
call map(l:lines, 'substitute(v:val, "\\( \\|\\t\\)", escape(l:indent, "\\\\"), "g")') call map(lines, 'substitute(v:val, "\\( \\|\\t\\)", escape(indent, "\\\\"), "g")')
let l:current.snippet = join(l:lines, "\n") let current.snippet = join(lines, "\n")
let l:current.name = '' let current.name = ''
let l:current.snippet = substitute(l:current.snippet, ';', l:value . ';', '') let current.snippet = substitute(current.snippet, ';', value . ';', '')
if l:use_pipe_for_cursor && len(l:value) > 0 if use_pipe_for_cursor && len(value) > 0
let l:current.snippet = substitute(l:current.snippet, '\${cursor}', '', 'g') let current.snippet = substitute(current.snippet, '\${cursor}', '', 'g')
endif endif
if l:n < len(l:tokens) - 1 if n < len(tokens) - 1
let l:current.snippet .= "\n" let current.snippet .= "\n"
endif endif
endif endif
endif endif
let l:current.pos = 0 let current.pos = 0
let l:lg = matchlist(l:token, '^\%(linear-gradient\|lg\)(\s*\(\S\+\)\s*,\s*\([^,]\+\)\s*,\s*\([^)]\+\)\s*)$') let lg = matchlist(token, '^\%(linear-gradient\|lg\)(\s*\(\S\+\)\s*,\s*\([^,]\+\)\s*,\s*\([^)]\+\)\s*)$')
if len(l:lg) == 0 if len(lg) == 0
let l:lg = matchlist(l:token, '^\%(linear-gradient\|lg\)(\s*\(\S\+\)\s*,\s*\([^,]\+\)\s*)$') let lg = matchlist(token, '^\%(linear-gradient\|lg\)(\s*\(\S\+\)\s*,\s*\([^,]\+\)\s*)$')
if len(l:lg) if len(lg)
let [l:lg[1], l:lg[2], l:lg[3]] = ['linear', l:lg[1], l:lg[2]] let [lg[1], lg[2], lg[3]] = ['linear', lg[1], lg[2]]
endif endif
endif endif
if len(l:lg) if len(lg)
let l:current.name = '' let current.name = ''
let l:current.snippet = printf("background-image:-webkit-gradient(%s, 0 0, 0 100%%, from(%s), to(%s));\n", l:lg[1], l:lg[2], l:lg[3]) let current.snippet = printf("background-image:-webkit-gradient(%s, 0 0, 0 100%, from(%s), to(%s));\n", lg[1], lg[2], lg[3])
call add(l:root.child, deepcopy(l:current)) call add(root.child, deepcopy(current))
let l:current.snippet = printf("background-image:-webkit-linear-gradient(%s, %s);\n", l:lg[2], l:lg[3]) let current.snippet = printf("background-image:-webkit-linear-gradient(%s, %s);\n", lg[2], lg[3])
call add(l:root.child, deepcopy(l:current)) call add(root.child, deepcopy(current))
let l:current.snippet = printf("background-image:-moz-linear-gradient(%s, %s);\n", l:lg[2], l:lg[3]) let current.snippet = printf("background-image:-moz-linear-gradient(%s, %s);\n", lg[2], lg[3])
call add(l:root.child, deepcopy(l:current)) call add(root.child, deepcopy(current))
let l:current.snippet = printf("background-image:-o-linear-gradient(%s, %s);\n", l:lg[2], l:lg[3]) let current.snippet = printf("background-image:-o-linear-gradient(%s, %s);\n", lg[2], lg[3])
call add(l:root.child, deepcopy(l:current)) call add(root.child, deepcopy(current))
let l:current.snippet = printf("background-image:linear-gradient(%s, %s);\n", l:lg[2], l:lg[3]) let current.snippet = printf("background-image:linear-gradient(%s, %s);\n", lg[2], lg[3])
call add(l:root.child, deepcopy(l:current)) call add(root.child, deepcopy(current))
elseif l:prefix elseif prefix
let l:snippet = l:current.snippet let snippet = current.snippet
let l:current.snippet = '-webkit-' . l:snippet . "\n" let current.snippet = '-webkit-' . snippet . "\n"
call add(l:root.child, deepcopy(l:current)) call add(root.child, deepcopy(current))
let l:current.snippet = '-moz-' . l:snippet . "\n" let current.snippet = '-moz-' . snippet . "\n"
call add(l:root.child, deepcopy(l:current)) call add(root.child, deepcopy(current))
let l:current.snippet = '-o-' . l:snippet . "\n" let current.snippet = snippet
call add(l:root.child, deepcopy(l:current)) call add(root.child, current)
let l:current.snippet = '-ms-' . l:snippet . "\n" elseif token =~# '^c#\([0-9a-fA-F]\{3}\|[0-9a-fA-F]\{6}\)\(\.[0-9]\+\)\?'
call add(l:root.child, deepcopy(l:current)) let cs = split(token, '\.')
let l:current.snippet = l:snippet let current.name = ''
call add(l:root.child, l:current) let [r,g,b] = [0,0,0]
elseif l:token =~# '^c#\([0-9a-fA-F]\{3}\|[0-9a-fA-F]\{6}\)\(\.[0-9]\+\)\?' if len(cs[0]) == 5
let l:cs = split(l:token, '\.') let rgb = matchlist(cs[0], 'c#\(.\)\(.\)\(.\)')
let l:current.name = '' let r = eval('0x'.rgb[1].rgb[1])
let [l:r,l:g,l:b] = [0,0,0] let g = eval('0x'.rgb[2].rgb[2])
if len(l:cs[0]) == 5 let b = eval('0x'.rgb[3].rgb[3])
let l:rgb = matchlist(l:cs[0], 'c#\(.\)\(.\)\(.\)') elseif len(cs[0]) == 8
let l:r = eval('0x'.l:rgb[1].l:rgb[1]) let rgb = matchlist(cs[0], 'c#\(..\)\(..\)\(..\)')
let l:g = eval('0x'.l:rgb[2].l:rgb[2]) let r = eval('0x'.rgb[1])
let l:b = eval('0x'.l:rgb[3].l:rgb[3]) let g = eval('0x'.rgb[2])
elseif len(l:cs[0]) == 8 let b = eval('0x'.rgb[3])
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])
endif endif
if len(l:cs) == 1 if len(cs) == 1
let l:current.snippet = printf('color:rgb(%d, %d, %d);', l:r, l:g, l:b) let current.snippet = printf('color:rgb(%d, %d, %d);', r, g, b)
else else
let l:current.snippet = printf('color:rgb(%d, %d, %d, %s);', l:r, l:g, l:b, string(str2float('0.'.l:cs[1]))) let current.snippet = printf('color:rgb(%d, %d, %d, %s);', r, g, b, string(str2float('0.'.cs[1])))
endif endif
call add(l:root.child, l:current) call add(root.child, current)
elseif l:token =~# '^c#' elseif token =~# '^c#'
let l:current.name = '' let current.name = ''
let l:current.snippet = 'color:\${cursor};' let current.snippet = 'color:\${cursor};'
call add(l:root.child, l:current) call add(root.child, current)
else else
call add(l:root.child, l:current) call add(root.child, current)
endif endif
endfor endfor
endif endif
return l:root return root
endfunction endfunction
function! emmet#lang#css#toString(settings, current, type, inline, filters, itemno, indent) abort function! emmet#lang#css#toString(settings, current, type, inline, filters, itemno, indent) abort
let l:current = a:current let current = a:current
let l:value = l:current.value[1:-2] let value = current.value[1:-2]
let l:tmp = substitute(l:value, '\${cursor}', '', 'g') let tmp = substitute(value, '\${cursor}', '', 'g')
if l:tmp !~ '.*{[ \t\r\n]*}$' if tmp !~ '.*{[ \t\r\n]*}$'
if emmet#useFilter(a:filters, 'fc') if emmet#useFilter(a:filters, 'fc')
let l:value = substitute(l:value, '\([^:]\+\):\([^;]*\)', '\1: \2', 'g') let value = substitute(value, '\([^:]\+\):\([^;]*\)', '\1: \2', 'g')
else else
let l:value = substitute(l:value, '\([^:]\+\):\([^;]*\)', '\1:\2', 'g') let value = substitute(value, '\([^:]\+\):\([^;]*\)', '\1:\2', 'g')
endif endif
if l:current.important if current.important
let l:value = substitute(l:value, ';', ' !important;', '') let value = substitute(value, ';', ' !important;', '')
endif endif
endif endif
return l:value return value
endfunction endfunction
function! emmet#lang#css#imageSize() abort function! emmet#lang#css#imageSize() abort
let l:img_region = emmet#util#searchRegion('{', '}') let img_region = emmet#util#searchRegion('{', '}')
if !emmet#util#regionIsValid(l:img_region) || !emmet#util#cursorInRegion(l:img_region) if !emmet#util#regionIsValid(img_region) || !emmet#util#cursorInRegion(img_region)
return return
endif endif
let l:content = emmet#util#getContent(l:img_region) let content = emmet#util#getContent(img_region)
let l:fn = matchstr(l:content, '\<url(\zs[^)]\+\ze)') let fn = matchstr(content, '\<url(\zs[^)]\+\ze)')
let l:fn = substitute(l:fn, '[''" \t]', '', 'g') let fn = substitute(fn, '[''" \t]', '', 'g')
if l:fn =~# '^\s*$' if fn =~# '^\s*$'
return return
elseif l:fn !~# '^\(/\|http\)' elseif fn !~# '^\(/\|http\)'
let l:fn = simplify(expand('%:h') . '/' . l:fn) let fn = simplify(expand('%:h') . '/' . fn)
endif endif
let [l:width, l:height] = emmet#util#getImageSize(l:fn) let [width, height] = emmet#util#getImageSize(fn)
if l:width == -1 && l:height == -1 if width == -1 && height == -1
return return
endif endif
let l:indent = emmet#getIndentation('css') let indent = emmet#getIndentation('css')
if l:content =~# '.*\<width\s*:[^;]*;.*' if content =~# '.*\<width\s*:[^;]*;.*'
let l:content = substitute(l:content, '\<width\s*:[^;]*;', 'width: ' . l:width . 'px;', '') let content = substitute(content, '\<width\s*:[^;]*;', 'width: ' . width . 'px;', '')
else else
let l:content = substitute(l:content, '}', l:indent . 'width: ' . l:width . "px;\n}", '') let content = substitute(content, '}', indent . 'width: ' . width . "px;\n}", '')
endif endif
if l:content =~# '.*\<height\s*:[^;]*;.*' if content =~# '.*\<height\s*:[^;]*;.*'
let l:content = substitute(l:content, '\<height\s*:[^;]*;', 'height: ' . l:height . 'px;', '') let content = substitute(content, '\<height\s*:[^;]*;', 'height: ' . height . 'px;', '')
else else
let l:content = substitute(l:content, '}', l:indent . 'height: ' . l:height . "px;\n}", '') let content = substitute(content, '}', indent . 'height: ' . height . "px;\n}", '')
endif endif
call emmet#util#setContent(l:img_region, l:content) call emmet#util#setContent(img_region, content)
endfunction endfunction
function! emmet#lang#css#imageEncode() abort function! emmet#lang#css#encodeImage() 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 . ')')
endfunction endfunction
function! emmet#lang#css#parseTag(tag) abort function! emmet#lang#css#parseTag(tag) abort
@@ -290,67 +252,65 @@ function! emmet#lang#css#parseTag(tag) abort
endfunction endfunction
function! emmet#lang#css#toggleComment() abort function! emmet#lang#css#toggleComment() abort
let l:line = getline('.') let line = getline('.')
let l:mx = '^\(\s*\)/\*\s*\(.*\)\s*\*/\s*$' let mx = '^\(\s*\)/\*\s*\(.*\)\s*\*/\s*$'
if l:line =~# '{\s*$' if line =~# '{\s*$'
let l:block = emmet#util#searchRegion('/\*', '\*/\zs') let block = emmet#util#searchRegion('/\*', '\*/\zs')
if emmet#util#regionIsValid(l:block) if emmet#util#regionIsValid(block)
let l:content = emmet#util#getContent(l:block) let content = emmet#util#getContent(block)
let l:content = substitute(l:content, '/\*\s\(.*\)\s\*/', '\1', '') let content = substitute(content, '/\*\s\(.*\)\s\*/', '\1', '')
call emmet#util#setContent(l:block, l:content) call emmet#util#setContent(block, content)
else else
let l:node = expand('<cword>') let node = expand('<cword>')
if len(l:node) if len(node)
exe "normal ciw\<c-r>='/* '.l:node.' */'\<cr>" exe "normal ciw\<c-r>='/* '.node.' */'\<cr>"
endif endif
endif endif
else else
if l:line =~# l:mx if line =~# mx
let l:space = substitute(matchstr(l:line, l:mx), l:mx, '\1', '') let space = substitute(matchstr(line, mx), mx, '\1', '')
let l:line = substitute(matchstr(l:line, l:mx), l:mx, '\2', '') let line = substitute(matchstr(line, mx), mx, '\2', '')
let l:line = l:space . substitute(l:line, '^\s*\|\s*$', '\1', 'g') let line = space . substitute(line, '^\s*\|\s*$', '\1', 'g')
else else
let l:mx = '^\(\s*\)\(''[^'']*''\|[^'']*\|;\)\s*$' let mx = '^\(\s*\)\(.*\)\s*$'
" TODO multi-property let line = substitute(line, mx, '\1/* \2 */', '')
"let l:mx = '^\(\s*\)\(\%(''[^'']*''\|[^'';]\+\)*;\{0,1}\)'
let l:line = substitute(l:line, l:mx, '\1/* \2 */', '')
endif endif
call setline('.', l:line) call setline('.', line)
endif endif
endfunction endfunction
function! emmet#lang#css#balanceTag(flag) range abort function! emmet#lang#css#balanceTag(flag) range abort
if a:flag == -2 || a:flag == 2 if a:flag == -2 || a:flag == 2
let l:curpos = [0, line("'<"), col("'<"), 0] let curpos = [0, line("'<"), col("'<"), 0]
else else
let l:curpos = emmet#util#getcurpos() let curpos = emmet#util#getcurpos()
endif endif
let l:block = emmet#util#getVisualBlock() let block = emmet#util#getVisualBlock()
if !emmet#util#regionIsValid(l:block) if !emmet#util#regionIsValid(block)
if a:flag > 0 if a:flag > 0
let l:block = emmet#util#searchRegion('^', ';') let block = emmet#util#searchRegion('^', ';')
if emmet#util#regionIsValid(l:block) if emmet#util#regionIsValid(block)
call emmet#util#selectRegion(l:block) call emmet#util#selectRegion(block)
return return
endif endif
endif endif
else else
if a:flag > 0 if a:flag > 0
let l:content = emmet#util#getContent(l:block) let content = emmet#util#getContent(block)
if l:content !~# '^{.*}$' if content !~# '^{.*}$'
let l:block = emmet#util#searchRegion('{', '}') let block = emmet#util#searchRegion('{', '}')
if emmet#util#regionIsValid(l:block) if emmet#util#regionIsValid(block)
call emmet#util#selectRegion(l:block) call emmet#util#selectRegion(block)
return return
endif endif
endif endif
else else
let l:pos = searchpos('.*;', 'nW') let pos = searchpos('.*;', 'nW')
if l:pos[0] != 0 if pos[0] != 0
call setpos('.', [0, l:pos[0], l:pos[1], 0]) call setpos('.', [0, pos[0], pos[1], 0])
let l:block = emmet#util#searchRegion('^', ';') let block = emmet#util#searchRegion('^', ';')
if emmet#util#regionIsValid(l:block) if emmet#util#regionIsValid(block)
call emmet#util#selectRegion(l:block) call emmet#util#selectRegion(block)
return return
endif endif
endif endif
@@ -359,7 +319,7 @@ function! emmet#lang#css#balanceTag(flag) range abort
if a:flag == -2 || a:flag == 2 if a:flag == -2 || a:flag == 2
silent! exe 'normal! gv' silent! exe 'normal! gv'
else else
call setpos('.', l:curpos) call setpos('.', curpos)
endif endif
endfunction endfunction
@@ -368,8 +328,13 @@ function! emmet#lang#css#moveNextPrevItem(flag) abort
endfunction endfunction
function! emmet#lang#css#moveNextPrev(flag) abort function! emmet#lang#css#moveNextPrev(flag) abort
call search('""\|()\|\(:\s*\zs;\{1,0}$\)', a:flag ? 'Wbp' : 'Wp') let pos = search('""\|()\|\(:\s*\zs$\)', a:flag ? 'Wbp' : 'Wp')
return '' if pos == 2
startinsert!
else
silent! normal! l
startinsert
endif
endfunction endfunction
function! emmet#lang#css#splitJoinTag() abort function! emmet#lang#css#splitJoinTag() abort
@@ -379,7 +344,3 @@ endfunction
function! emmet#lang#css#removeTag() abort function! emmet#lang#css#removeTag() abort
" nothing to do " nothing to do
endfunction endfunction
function! emmet#lang#css#mergeLines() abort
" nothing to do
endfunction
-241
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
+203 -206
View File
@@ -7,251 +7,251 @@ function! emmet#lang#haml#parseIntoTree(abbr, type) abort
endfunction endfunction
function! emmet#lang#haml#toString(settings, current, type, inline, filters, itemno, indent) abort function! emmet#lang#haml#toString(settings, current, type, inline, filters, itemno, indent) abort
let l:settings = a:settings let settings = a:settings
let l:current = a:current let current = a:current
let l:type = a:type let type = a:type
let l:inline = a:inline let inline = a:inline
let l:filters = a:filters let filters = a:filters
let l:itemno = a:itemno let itemno = a:itemno
let l:indent = emmet#getIndentation(l:type) let indent = emmet#getIndentation(type)
let l:dollar_expr = emmet#getResource(l:type, 'dollar_expr', 1) let dollar_expr = emmet#getResource(type, 'dollar_expr', 1)
let l:attribute_style = emmet#getResource('haml', 'attribute_style', 'hash') let attribute_style = emmet#getResource('haml', 'attribute_style', 'hash')
let l:str = '' let str = ''
let l:current_name = l:current.name let current_name = current.name
if l:dollar_expr if dollar_expr
let l:current_name = substitute(l:current.name, '\$$', l:itemno+1, '') let current_name = substitute(current.name, '\$$', itemno+1, '')
endif endif
if len(l:current.name) > 0 if len(current.name) > 0
let l:str .= '%' . l:current_name let str .= '%' . current_name
let l:tmp = '' let tmp = ''
for l:attr in emmet#util#unique(l:current.attrs_order + keys(l:current.attr)) for attr in emmet#util#unique(current.attrs_order + keys(current.attr))
if !has_key(l:current.attr, l:attr) if !has_key(current.attr, attr)
continue continue
endif endif
let l:Val = l:current.attr[l:attr] let Val = current.attr[attr]
if type(l:Val) == 2 && l:Val == function('emmet#types#true') if type(Val) == 2 && Val == function('emmet#types#true')
if l:attribute_style ==# 'hash' if attribute_style ==# 'hash'
let l:tmp .= ' :' . l:attr . ' => true' let tmp .= ' :' . attr . ' => true'
elseif l:attribute_style ==# 'html' elseif attribute_style ==# 'html'
let l:tmp .= l:attr . '=true' let tmp .= attr . '=true'
end end
else else
if l:dollar_expr if dollar_expr
while l:Val =~# '\$\([^#{]\|$\)' while Val =~# '\$\([^#{]\|$\)'
let l:Val = substitute(l:Val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let Val = substitute(Val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
endwhile endwhile
let l:attr = substitute(l:attr, '\$$', l:itemno+1, '') let attr = substitute(attr, '\$$', itemno+1, '')
endif endif
let l:valtmp = substitute(l:Val, '\${cursor}', '', '') let valtmp = substitute(Val, '\${cursor}', '', '')
if l:attr ==# 'id' && len(l:valtmp) > 0 if attr ==# 'id' && len(valtmp) > 0
let l:str .= '#' . l:Val let str .= '#' . Val
elseif l:attr ==# 'class' && len(l:valtmp) > 0 elseif attr ==# 'class' && len(valtmp) > 0
let l:str .= '.' . substitute(l:Val, ' ', '.', 'g') let str .= '.' . substitute(Val, ' ', '.', 'g')
else else
if len(l:tmp) > 0 if len(tmp) > 0
if l:attribute_style ==# 'hash' if attribute_style ==# 'hash'
let l:tmp .= ',' let tmp .= ','
elseif l:attribute_style ==# 'html' elseif attribute_style ==# 'html'
let l:tmp .= ' ' let tmp .= ' '
endif endif
endif endif
if l:attribute_style ==# 'hash' if attribute_style ==# 'hash'
let l:tmp .= ' :' . l:attr . ' => "' . l:Val . '"' let tmp .= ' :' . attr . ' => "' . Val . '"'
elseif l:attribute_style ==# 'html' elseif attribute_style ==# 'html'
let l:tmp .= l:attr . '="' . l:Val . '"' let tmp .= attr . '="' . Val . '"'
end end
endif endif
endif endif
endfor endfor
if len(l:tmp) if len(tmp)
if l:attribute_style ==# 'hash' if attribute_style ==# 'hash'
let l:str .= '{' . l:tmp . ' }' let str .= '{' . tmp . ' }'
elseif l:attribute_style ==# 'html' elseif attribute_style ==# 'html'
let l:str .= '(' . l:tmp . ')' let str .= '(' . tmp . ')'
end end
endif endif
if stridx(','.l:settings.html.empty_elements.',', ','.l:current_name.',') != -1 && len(l:current.value) == 0 if stridx(','.settings.html.empty_elements.',', ','.current_name.',') != -1 && len(current.value) == 0
let l:str .= '/' let str .= '/'
endif endif
let l:inner = '' let inner = ''
if len(l:current.value) > 0 if len(current.value) > 0
let l:text = l:current.value[1:-2] let text = current.value[1:-2]
if l:dollar_expr if dollar_expr
let l:text = substitute(l:text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:text = substitute(l:text, '\${nr}', "\n", 'g') let text = substitute(text, '\${nr}', "\n", 'g')
let l:text = substitute(l:text, '\\\$', '$', 'g') let text = substitute(text, '\\\$', '$', 'g')
let l:str = substitute(l:str, '\$#', l:text, 'g') let str = substitute(str, '\$#', text, 'g')
endif endif
let l:lines = split(l:text, "\n") let lines = split(text, "\n")
if len(l:lines) == 1 if len(lines) == 1
let l:str .= ' ' . l:text let str .= ' ' . text
else else
for l:line in l:lines for line in lines
let l:str .= "\n" . l:indent . l:line . ' |' let str .= "\n" . indent . line . ' |'
endfor endfor
endif endif
elseif len(l:current.child) == 0 elseif len(current.child) == 0
let l:str .= '${cursor}' let str .= '${cursor}'
endif endif
if len(l:current.child) == 1 && len(l:current.child[0].name) == 0 if len(current.child) == 1 && len(current.child[0].name) == 0
let l:text = l:current.child[0].value[1:-2] let text = current.child[0].value[1:-2]
if l:dollar_expr if dollar_expr
let l:text = substitute(l:text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:text = substitute(l:text, '\${nr}', "\n", 'g') let text = substitute(text, '\${nr}', "\n", 'g')
let l:text = substitute(l:text, '\\\$', '$', 'g') let text = substitute(text, '\\\$', '$', 'g')
endif endif
let l:lines = split(l:text, "\n") let lines = split(text, "\n")
if len(l:lines) == 1 if len(lines) == 1
let l:str .= ' ' . l:text let str .= ' ' . text
else else
for l:line in l:lines for line in lines
let l:str .= "\n" . l:indent . l:line . ' |' let str .= "\n" . indent . line . ' |'
endfor endfor
endif endif
elseif len(l:current.child) > 0 elseif len(current.child) > 0
for l:child in l:current.child for child in current.child
let l:inner .= emmet#toString(l:child, l:type, l:inline, l:filters, l:itemno, l:indent) let inner .= emmet#toString(child, type, inline, filters, itemno, indent)
endfor endfor
let l:inner = substitute(l:inner, "\n", "\n" . escape(l:indent, '\'), 'g') let inner = substitute(inner, "\n", "\n" . escape(indent, '\'), 'g')
let l:inner = substitute(l:inner, "\n" . escape(l:indent, '\') . '$', '', 'g') let inner = substitute(inner, "\n" . escape(indent, '\') . '$', '', 'g')
let l:str .= "\n" . l:indent . l:inner let str .= "\n" . indent . inner
endif endif
else else
let l:str = l:current.value[1:-2] let str = current.value[1:-2]
if l:dollar_expr if dollar_expr
let l:str = substitute(l:str, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let str = substitute(str, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:str = substitute(l:str, '\${nr}', "\n", 'g') let str = substitute(str, '\${nr}', "\n", 'g')
let l:str = substitute(l:str, '\\\$', '$', 'g') let str = substitute(str, '\\\$', '$', 'g')
endif endif
endif endif
let l:str .= "\n" let str .= "\n"
return l:str return str
endfunction endfunction
function! emmet#lang#haml#imageSize() abort function! emmet#lang#haml#imageSize() abort
let l:line = getline('.') let line = getline('.')
let l:current = emmet#lang#haml#parseTag(l:line) let current = emmet#lang#haml#parseTag(line)
if empty(l:current) || !has_key(l:current.attr, 'src') if empty(current) || !has_key(current.attr, 'src')
return return
endif endif
let l:fn = l:current.attr.src let fn = current.attr.src
if l:fn =~# '^\s*$' if fn =~# '^\s*$'
return return
elseif l:fn !~# '^\(/\|http\)' elseif fn !~# '^\(/\|http\)'
let l:fn = simplify(expand('%:h') . '/' . l:fn) let fn = simplify(expand('%:h') . '/' . fn)
endif endif
let [l:width, l:height] = emmet#util#getImageSize(l:fn) let [width, height] = emmet#util#getImageSize(fn)
if l:width == -1 && l:height == -1 if width == -1 && height == -1
return return
endif endif
let l:current.attr.width = l:width let current.attr.width = width
let l:current.attr.height = l:height let current.attr.height = height
let l:current.attrs_order += ['width', 'height'] let current.attrs_order += ['width', 'height']
let l:haml = emmet#toString(l:current, 'haml', 1) let haml = emmet#toString(current, 'haml', 1)
let l:haml = substitute(l:haml, '\${cursor}', '', '') let haml = substitute(haml, '\${cursor}', '', '')
call setline('.', substitute(matchstr(l:line, '^\s*') . l:haml, "\n", '', 'g')) call setline('.', substitute(matchstr(line, '^\s*') . haml, "\n", '', 'g'))
endfunction endfunction
function! emmet#lang#haml#imageEncode() abort function! emmet#lang#haml#encodeImage() abort
endfunction endfunction
function! emmet#lang#haml#parseTag(tag) abort function! emmet#lang#haml#parseTag(tag) abort
let l:current = emmet#newNode() let current = emmet#newNode()
let l:mx = '%\([a-zA-Z][a-zA-Z0-9]*\)\s*\%({\(.*\)}\)' let mx = '%\([a-zA-Z][a-zA-Z0-9]*\)\s*\%({\(.*\)}\)'
let l:match = matchstr(a:tag, l:mx) let match = matchstr(a:tag, mx)
let l:current.name = substitute(l:match, l:mx, '\1', '') let current.name = substitute(match, mx, '\1', '')
let l:attrs = substitute(l:match, l:mx, '\2', '') let attrs = substitute(match, mx, '\2', '')
let l:mx = '\([a-zA-Z0-9]\+\)\s*=>\s*\%(\([^"'' \t]\+\)\|"\([^"]\{-}\)"\|''\([^'']\{-}\)''\)' let mx = '\([a-zA-Z0-9]\+\)\s*=>\s*\%(\([^"'' \t]\+\)\|"\([^"]\{-}\)"\|''\([^'']\{-}\)''\)'
while len(l:attrs) > 0 while len(attrs) > 0
let l:match = matchstr(l:attrs, l:mx) let match = matchstr(attrs, mx)
if len(l:match) ==# 0 if len(match) ==# 0
break break
endif endif
let l:attr_match = matchlist(l:match, l:mx) let attr_match = matchlist(match, mx)
let l:name = l:attr_match[1] let name = attr_match[1]
let l:value = len(l:attr_match[2]) ? l:attr_match[2] : l:attr_match[3] let value = len(attr_match[2]) ? attr_match[2] : attr_match[3]
let l:current.attr[l:name] = l:value let current.attr[name] = value
let l:current.attrs_order += [l:name] let current.attrs_order += [name]
let l:attrs = l:attrs[stridx(l:attrs, l:match) + len(l:match):] let attrs = attrs[stridx(attrs, match) + len(match):]
endwhile endwhile
return l:current return current
endfunction endfunction
function! emmet#lang#haml#toggleComment() abort function! emmet#lang#haml#toggleComment() abort
let l:line = getline('.') let line = getline('.')
let l:space = matchstr(l:line, '^\s*') let space = matchstr(line, '^\s*')
if l:line =~# '^\s*-#' if line =~# '^\s*-#'
call setline('.', l:space . matchstr(l:line[len(l:space)+2:], '^\s*\zs.*')) call setline('.', space . matchstr(line[len(space)+2:], '^\s*\zs.*'))
elseif l:line =~# '^\s*%[a-z]' elseif line =~# '^\s*%[a-z]'
call setline('.', l:space . '-# ' . l:line[len(l:space):]) call setline('.', space . '-# ' . line[len(space):])
endif endif
endfunction endfunction
function! emmet#lang#haml#balanceTag(flag) range abort function! emmet#lang#haml#balanceTag(flag) range abort
let l:block = emmet#util#getVisualBlock() let block = emmet#util#getVisualBlock()
if a:flag == -2 || a:flag == 2 if a:flag == -2 || a:flag == 2
let l:curpos = [0, line("'<"), col("'<"), 0] let curpos = [0, line("'<"), col("'<"), 0]
else else
let l:curpos = emmet#util#getcurpos() let curpos = emmet#util#getcurpos()
endif endif
let l:n = l:curpos[1] let n = curpos[1]
let l:ml = len(matchstr(getline(l:n), '^\s*')) let ml = len(matchstr(getline(n), '^\s*'))
if a:flag > 0 if a:flag > 0
if a:flag == 1 || !emmet#util#regionIsValid(l:block) if a:flag == 1 || !emmet#util#regionIsValid(block)
let l:n = line('.') let n = line('.')
else else
while l:n > 0 while n > 0
let l:l = len(matchstr(getline(l:n), '^\s*\ze%[a-z]')) let l = len(matchstr(getline(n), '^\s*\ze%[a-z]'))
if l:l > 0 && l:l < l:ml if l > 0 && l < ml
let l:ml = l:l let ml = l
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
endif endif
let l:sn = l:n let sn = n
if l:n == 0 if n == 0
let l:ml = 0 let ml = 0
endif endif
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*%[a-z]')) let l = len(matchstr(getline(n), '^\s*%[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
call setpos('.', [0, l:n, 1, 0]) call setpos('.', [0, n, 1, 0])
normal! V normal! V
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
else else
while l:n > 0 while n > 0
let l:l = len(matchstr(getline(l:n), '^\s*\ze[a-z]')) let l = len(matchstr(getline(n), '^\s*\ze[a-z]'))
if l:l > 0 && l:l > l:ml if l > 0 && l > ml
let l:ml = l:l let ml = l
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
let l:sn = l:n let sn = n
if l:n == 0 if n == 0
let l:ml = 0 let ml = 0
endif endif
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*%[a-z]')) let l = len(matchstr(getline(n), '^\s*%[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
call setpos('.', [0, l:n, 1, 0]) call setpos('.', [0, n, 1, 0])
normal! V normal! V
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
endif endif
endfunction endfunction
@@ -260,78 +260,75 @@ function! emmet#lang#haml#moveNextPrevItem(flag) abort
endfunction endfunction
function! emmet#lang#haml#moveNextPrev(flag) abort function! emmet#lang#haml#moveNextPrev(flag) abort
let l:pos = search('""', a:flag ? 'Wb' : 'W') let pos = search('""', a:flag ? 'Wb' : 'W')
if l:pos != 0 if pos != 0
silent! normal! l silent! normal! l
startinsert startinsert
endif endif
endfunction endfunction
function! emmet#lang#haml#splitJoinTag() abort function! emmet#lang#haml#splitJoinTag() abort
let l:n = line('.') let n = line('.')
let l:sml = len(matchstr(getline(l:n), '^\s*%[a-z]')) let sml = len(matchstr(getline(n), '^\s*%[a-z]'))
while l:n > 0 while n > 0
if getline(l:n) =~# '^\s*\ze%[a-z]' if getline(n) =~# '^\s*\ze%[a-z]'
if len(matchstr(getline(l:n), '^\s*%[a-z]')) < l:sml if len(matchstr(getline(n), '^\s*%[a-z]')) < sml
break break
endif endif
let l:line = getline(l:n) let line = getline(n)
call setline(l:n, substitute(l:line, '^\s*%\w\+\%(\s*{[^}]*}\|\s\)\zs.*', '', '')) call setline(n, substitute(line, '^\s*%\w\+\%(\s*{[^}]*}\|\s\)\zs.*', '', ''))
let l:sn = l:n let sn = n
let l:n += 1 let n += 1
let l:ml = len(matchstr(getline(l:n), '^\s*%[a-z]')) let ml = len(matchstr(getline(n), '^\s*%[a-z]'))
if len(matchstr(getline(l:n), '^\s*')) > l:ml if len(matchstr(getline(n), '^\s*')) > ml
while l:n <= line('$') while n <= line('$')
let l:l = len(matchstr(getline(l:n), '^\s*')) let l = len(matchstr(getline(n), '^\s*'))
if l:l <= l:ml if l <= ml
break break
endif endif
exe l:n 'delete' exe n 'delete'
endwhile endwhile
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
else else
let l:tag = matchstr(getline(l:sn), '^\s*%\zs\(\w\+\)') let tag = matchstr(getline(sn), '^\s*%\zs\(\w\+\)')
let l:spaces = matchstr(getline(l:sn), '^\s*') let spaces = matchstr(getline(sn), '^\s*')
let l:settings = emmet#getSettings() let settings = emmet#getSettings()
if stridx(','.l:settings.html.inline_elements.',', ','.l:tag.',') == -1 if stridx(','.settings.html.inline_elements.',', ','.tag.',') == -1
call append(l:sn, l:spaces . ' ') call append(sn, spaces . ' ')
call setpos('.', [0, l:sn+1, 1, 0]) call setpos('.', [0, sn+1, 1, 0])
else else
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
endif endif
startinsert! startinsert!
endif endif
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
endfunction endfunction
function! emmet#lang#haml#removeTag() abort function! emmet#lang#haml#removeTag() abort
let l:n = line('.') let n = line('.')
let l:ml = 0 let ml = 0
while l:n > 0 while n > 0
if getline(l:n) =~# '^\s*\ze[a-z]' if getline(n) =~# '^\s*\ze[a-z]'
let l:ml = len(matchstr(getline(l:n), '^\s*%[a-z]')) let ml = len(matchstr(getline(n), '^\s*%[a-z]'))
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
let l:sn = l:n let sn = n
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*%[a-z]')) let l = len(matchstr(getline(n), '^\s*%[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
if l:sn == l:n if sn == n
exe 'delete' exe 'delete'
else else
exe l:sn ',' (l:n-1) 'delete' exe sn ',' (n-1) 'delete'
endif endif
endfunction endfunction
function! emmet#lang#haml#mergeLines() abort
endfunction
File diff suppressed because it is too large Load Diff
+201 -205
View File
@@ -7,248 +7,248 @@ function! emmet#lang#jade#parseIntoTree(abbr, type) abort
endfunction endfunction
function! emmet#lang#jade#toString(settings, current, type, inline, filters, itemno, indent) abort function! emmet#lang#jade#toString(settings, current, type, inline, filters, itemno, indent) abort
let l:settings = a:settings let settings = a:settings
let l:current = a:current let current = a:current
let l:type = a:type let type = a:type
let l:inline = a:inline let inline = a:inline
let l:filters = a:filters let filters = a:filters
let l:itemno = a:itemno let itemno = a:itemno
let l:indent = emmet#getIndentation(l:type) let indent = emmet#getIndentation(type)
let l:dollar_expr = emmet#getResource(l:type, 'dollar_expr', 1) let dollar_expr = emmet#getResource(type, 'dollar_expr', 1)
let l:attribute_style = emmet#getResource('jade', 'attribute_style', 'hash') let attribute_style = emmet#getResource('jade', 'attribute_style', 'hash')
let l:str = '' let str = ''
let l:current_name = l:current.name let current_name = current.name
if l:dollar_expr if dollar_expr
let l:current_name = substitute(l:current.name, '\$$', l:itemno+1, '') let current_name = substitute(current.name, '\$$', itemno+1, '')
endif endif
if len(l:current.name) > 0 if len(current.name) > 0
let l:str .= '' . l:current_name let str .= '' . current_name
let l:tmp = '' let tmp = ''
for l:attr in emmet#util#unique(l:current.attrs_order + keys(l:current.attr)) for attr in emmet#util#unique(current.attrs_order + keys(current.attr))
if !has_key(l:current.attr, l:attr) if !has_key(current.attr, attr)
continue continue
endif endif
let l:Val = l:current.attr[l:attr] let Val = current.attr[attr]
if type(l:Val) == 2 && l:Val == function('emmet#types#true') if type(Val) == 2 && Val == function('emmet#types#true')
if l:attribute_style ==# 'hash' if attribute_style ==# 'hash'
let l:tmp .= ' ' . l:attr . ' = true' let tmp .= ' ' . attr . ' = true'
elseif l:attribute_style ==# 'html' elseif attribute_style ==# 'html'
let l:tmp .= l:attr . '=true' let tmp .= attr . '=true'
end end
else else
if l:dollar_expr if dollar_expr
while l:Val =~# '\$\([^#{]\|$\)' while Val =~# '\$\([^#{]\|$\)'
let l:Val = substitute(l:Val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let Val = substitute(Val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
endwhile endwhile
let l:attr = substitute(l:attr, '\$$', l:itemno+1, '') let attr = substitute(attr, '\$$', itemno+1, '')
endif endif
let l:valtmp = substitute(l:Val, '\${cursor}', '', '') let valtmp = substitute(Val, '\${cursor}', '', '')
if l:attr ==# 'id' && len(l:valtmp) > 0 if attr ==# 'id' && len(valtmp) > 0
let l:str .= '#' . l:Val let str .= '#' . Val
elseif l:attr ==# 'class' && len(l:valtmp) > 0 elseif attr ==# 'class' && len(valtmp) > 0
let l:str .= '.' . substitute(l:Val, ' ', '.', 'g') let str .= '.' . substitute(Val, ' ', '.', 'g')
else else
if len(l:tmp) > 0 if len(tmp) > 0
if l:attribute_style ==# 'hash' if attribute_style ==# 'hash'
let l:tmp .= ', ' let tmp .= ', '
elseif l:attribute_style ==# 'html' elseif attribute_style ==# 'html'
let l:tmp .= ' ' let tmp .= ' '
endif endif
endif endif
if l:attribute_style ==# 'hash' if attribute_style ==# 'hash'
let l:tmp .= '' . l:attr . '="' . l:Val . '"' let tmp .= '' . attr . '="' . Val . '"'
elseif l:attribute_style ==# 'html' elseif attribute_style ==# 'html'
let l:tmp .= l:attr . '="' . l:Val . '"' let tmp .= attr . '="' . Val . '"'
end end
endif endif
endif endif
endfor endfor
if len(l:tmp) if len(tmp)
if l:attribute_style ==# 'hash' if attribute_style ==# 'hash'
let l:str .= '(' . l:tmp . ')' let str .= '(' . tmp . ')'
elseif l:attribute_style ==# 'html' elseif attribute_style ==# 'html'
let l:str .= '(' . l:tmp . ')' let str .= '(' . tmp . ')'
end end
endif endif
let l:inner = '' let inner = ''
if len(l:current.value) > 0 if len(current.value) > 0
let l:text = l:current.value[1:-2] let text = current.value[1:-2]
if l:dollar_expr if dollar_expr
let l:text = substitute(l:text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:text = substitute(l:text, '\${nr}', "\n", 'g') let text = substitute(text, '\${nr}', "\n", 'g')
let l:text = substitute(l:text, '\\\$', '$', 'g') let text = substitute(text, '\\\$', '$', 'g')
let l:str = substitute(l:str, '\$#', l:text, 'g') let str = substitute(str, '\$#', text, 'g')
endif endif
let l:lines = split(l:text, "\n") let lines = split(text, "\n")
if len(l:lines) == 1 if len(lines) == 1
let l:str .= ' ' . l:text let str .= ' ' . text
else else
for l:line in l:lines for line in lines
let l:str .= "\n" . l:indent . l:line . ' |' let str .= "\n" . indent . line . ' |'
endfor endfor
endif endif
elseif len(l:current.child) == 0 elseif len(current.child) == 0
let l:str .= '${cursor}' let str .= '${cursor}'
endif endif
if len(l:current.child) == 1 && len(l:current.child[0].name) == 0 if len(current.child) == 1 && len(current.child[0].name) == 0
let l:text = l:current.child[0].value[1:-2] let text = current.child[0].value[1:-2]
if l:dollar_expr if dollar_expr
let l:text = substitute(l:text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:text = substitute(l:text, '\${nr}', "\n", 'g') let text = substitute(text, '\${nr}', "\n", 'g')
let l:text = substitute(l:text, '\\\$', '$', 'g') let text = substitute(text, '\\\$', '$', 'g')
endif endif
let l:lines = split(l:text, "\n") let lines = split(text, "\n")
if len(l:lines) == 1 if len(lines) == 1
let l:str .= ' ' . l:text let str .= ' ' . text
else else
for l:line in l:lines for line in lines
let l:str .= "\n" . l:indent . l:line . ' |' let str .= "\n" . indent . line . ' |'
endfor endfor
endif endif
elseif len(l:current.child) > 0 elseif len(current.child) > 0
for l:child in l:current.child for child in current.child
let l:inner .= emmet#toString(l:child, l:type, l:inline, l:filters, l:itemno, l:indent) let inner .= emmet#toString(child, type, inline, filters, itemno, indent)
endfor endfor
let l:inner = substitute(l:inner, "\n", "\n" . escape(l:indent, '\'), 'g') let inner = substitute(inner, "\n", "\n" . escape(indent, '\'), 'g')
let l:inner = substitute(l:inner, "\n" . escape(l:indent, '\') . '$', '', 'g') let inner = substitute(inner, "\n" . escape(indent, '\') . '$', '', 'g')
let l:str .= "\n" . l:indent . l:inner let str .= "\n" . indent . inner
endif endif
else else
let l:str = l:current.value[1:-2] let str = current.value[1:-2]
if l:dollar_expr if dollar_expr
let l:str = substitute(l:str, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let str = substitute(str, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:str = substitute(l:str, '\${nr}', "\n", 'g') let str = substitute(str, '\${nr}', "\n", 'g')
let l:str = substitute(l:str, '\\\$', '$', 'g') let str = substitute(str, '\\\$', '$', 'g')
endif endif
endif endif
let l:str .= "\n" let str .= "\n"
return l:str return str
endfunction endfunction
function! emmet#lang#jade#imageSize() abort function! emmet#lang#jade#imageSize() abort
let l:line = getline('.') let line = getline('.')
let l:current = emmet#lang#jade#parseTag(l:line) let current = emmet#lang#jade#parseTag(line)
if empty(l:current) || !has_key(l:current.attr, 'src') if empty(current) || !has_key(current.attr, 'src')
return return
endif endif
let l:fn = l:current.attr.src let fn = current.attr.src
if l:fn =~# '^\s*$' if fn =~# '^\s*$'
return return
elseif l:fn !~# '^\(/\|http\)' elseif fn !~# '^\(/\|http\)'
let l:fn = simplify(expand('%:h') . '/' . l:fn) let fn = simplify(expand('%:h') . '/' . fn)
endif endif
let [l:width, l:height] = emmet#util#getImageSize(l:fn) let [width, height] = emmet#util#getImageSize(fn)
if l:width == -1 && l:height == -1 if width == -1 && height == -1
return return
endif endif
let l:current.attr.width = l:width let current.attr.width = width
let l:current.attr.height = l:height let current.attr.height = height
let l:current.attrs_order += ['width', 'height'] let current.attrs_order += ['width', 'height']
let l:jade = emmet#toString(l:current, 'jade', 1) let jade = emmet#toString(current, 'jade', 1)
let l:jade = substitute(l:jade, '\${cursor}', '', '') let jade = substitute(jade, '\${cursor}', '', '')
call setline('.', substitute(matchstr(l:line, '^\s*') . l:jade, "\n", '', 'g')) call setline('.', substitute(matchstr(line, '^\s*') . jade, "\n", '', 'g'))
endfunction endfunction
function! emmet#lang#jade#imageEncode() abort function! emmet#lang#jade#encodeImage() abort
endfunction endfunction
function! emmet#lang#jade#parseTag(tag) abort function! emmet#lang#jade#parseTag(tag) abort
let l:current = emmet#newNode() let current = emmet#newNode()
let l:mx = '%\([a-zA-Z][a-zA-Z0-9]*\)\s*\%({\(.*\)}\)' let mx = '%\([a-zA-Z][a-zA-Z0-9]*\)\s*\%({\(.*\)}\)'
let l:match = matchstr(a:tag, l:mx) let match = matchstr(a:tag, mx)
let l:current.name = substitute(l:match, l:mx, '\1', '') let current.name = substitute(match, mx, '\1', '')
let l:attrs = substitute(l:match, l:mx, '\2', '') let attrs = substitute(match, mx, '\2', '')
let l:mx = '\([a-zA-Z0-9]\+\)\s*=>\s*\%(\([^"'' \t]\+\)\|"\([^"]\{-}\)"\|''\([^'']\{-}\)''\)' let mx = '\([a-zA-Z0-9]\+\)\s*=>\s*\%(\([^"'' \t]\+\)\|"\([^"]\{-}\)"\|''\([^'']\{-}\)''\)'
while len(l:attrs) > 0 while len(attrs) > 0
let l:match = matchstr(l:attrs, l:mx) let match = matchstr(attrs, mx)
if len(l:match) ==# 0 if len(match) ==# 0
break break
endif endif
let l:attr_match = matchlist(l:match, l:mx) let attr_match = matchlist(match, mx)
let l:name = l:attr_match[1] let name = attr_match[1]
let l:value = len(l:attr_match[2]) ? l:attr_match[2] : l:attr_match[3] let value = len(attr_match[2]) ? attr_match[2] : attr_match[3]
let l:current.attr[l:name] = l:value let current.attr[name] = value
let l:current.attrs_order += [l:name] let current.attrs_order += [name]
let l:attrs = l:attrs[stridx(l:attrs, l:match) + len(l:match):] let attrs = attrs[stridx(attrs, match) + len(match):]
endwhile endwhile
return l:current return current
endfunction endfunction
function! emmet#lang#jade#toggleComment() abort function! emmet#lang#jade#toggleComment() abort
let l:line = getline('.') let line = getline('.')
let l:space = matchstr(l:line, '^\s*') let space = matchstr(line, '^\s*')
if l:line =~# '^\s*-#' if line =~# '^\s*-#'
call setline('.', l:space . matchstr(l:line[len(l:space)+2:], '^\s*\zs.*')) call setline('.', space . matchstr(line[len(space)+2:], '^\s*\zs.*'))
elseif l:line =~# '^\s*%[a-z]' elseif line =~# '^\s*%[a-z]'
call setline('.', l:space . '-# ' . l:line[len(l:space):]) call setline('.', space . '-# ' . line[len(space):])
endif endif
endfunction endfunction
function! emmet#lang#jade#balanceTag(flag) range abort function! emmet#lang#jade#balanceTag(flag) range abort
let l:block = emmet#util#getVisualBlock() let block = emmet#util#getVisualBlock()
if a:flag == -2 || a:flag == 2 if a:flag == -2 || a:flag == 2
let l:curpos = [0, line("'<"), col("'<"), 0] let curpos = [0, line("'<"), col("'<"), 0]
else else
let l:curpos = emmet#util#getcurpos() let curpos = emmet#util#getcurpos()
endif endif
let l:n = l:curpos[1] let n = curpos[1]
let l:ml = len(matchstr(getline(l:n), '^\s*')) let ml = len(matchstr(getline(n), '^\s*'))
if a:flag > 0 if a:flag > 0
if a:flag == 1 || !emmet#util#regionIsValid(l:block) if a:flag == 1 || !emmet#util#regionIsValid(block)
let l:n = line('.') let n = line('.')
else else
while l:n > 0 while n > 0
let l:l = len(matchstr(getline(l:n), '^\s*\ze%[a-z]')) let l = len(matchstr(getline(n), '^\s*\ze%[a-z]'))
if l:l > 0 && l:l < l:ml if l > 0 && l < ml
let l:ml = l:l let ml = l
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
endif endif
let l:sn = l:n let sn = n
if l:n == 0 if n == 0
let l:ml = 0 let ml = 0
endif endif
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*%[a-z]')) let l = len(matchstr(getline(n), '^\s*%[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
call setpos('.', [0, l:n, 1, 0]) call setpos('.', [0, n, 1, 0])
normal! V normal! V
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
else else
while l:n > 0 while n > 0
let l:l = len(matchstr(getline(l:n), '^\s*\ze[a-z]')) let l = len(matchstr(getline(n), '^\s*\ze[a-z]'))
if l:l > 0 && l:l > l:ml if l > 0 && l > ml
let l:ml = l:l let ml = l
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
let l:sn = l:n let sn = n
if l:n == 0 if n == 0
let l:ml = 0 let ml = 0
endif endif
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*%[a-z]')) let l = len(matchstr(getline(n), '^\s*%[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
call setpos('.', [0, l:n, 1, 0]) call setpos('.', [0, n, 1, 0])
normal! V normal! V
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
endif endif
endfunction endfunction
@@ -257,79 +257,75 @@ function! emmet#lang#jade#moveNextPrevItem(flag) abort
endfunction endfunction
function! emmet#lang#jade#moveNextPrev(flag) abort function! emmet#lang#jade#moveNextPrev(flag) abort
let l:pos = search('""', a:flag ? 'Wb' : 'W') let pos = search('""', a:flag ? 'Wb' : 'W')
if l:pos != 0 if pos != 0
silent! normal! l silent! normal! l
startinsert startinsert
endif endif
endfunction endfunction
function! emmet#lang#jade#splitJoinTag() abort function! emmet#lang#jade#splitJoinTag() abort
let l:n = line('.') let n = line('.')
let l:sml = len(matchstr(getline(l:n), '^\s*%[a-z]')) let sml = len(matchstr(getline(n), '^\s*%[a-z]'))
while l:n > 0 while n > 0
if getline(l:n) =~# '^\s*\ze%[a-z]' if getline(n) =~# '^\s*\ze%[a-z]'
if len(matchstr(getline(l:n), '^\s*%[a-z]')) < l:sml if len(matchstr(getline(n), '^\s*%[a-z]')) < sml
break break
endif endif
let l:line = getline(l:n) let line = getline(n)
call setline(l:n, substitute(l:line, '^\s*%\w\+\%(\s*{[^}]*}\|\s\)\zs.*', '', '')) call setline(n, substitute(line, '^\s*%\w\+\%(\s*{[^}]*}\|\s\)\zs.*', '', ''))
let l:sn = l:n let sn = n
let l:n += 1 let n += 1
let l:ml = len(matchstr(getline(l:n), '^\s*%[a-z]')) let ml = len(matchstr(getline(n), '^\s*%[a-z]'))
if len(matchstr(getline(l:n), '^\s*')) > l:ml if len(matchstr(getline(n), '^\s*')) > ml
while l:n <= line('$') while n <= line('$')
let l:l = len(matchstr(getline(l:n), '^\s*')) let l = len(matchstr(getline(n), '^\s*'))
if l:l <= l:ml if l <= ml
break break
endif endif
exe l:n 'delete' exe n 'delete'
endwhile endwhile
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
else else
let l:tag = matchstr(getline(l:sn), '^\s*%\zs\(\w\+\)') let tag = matchstr(getline(sn), '^\s*%\zs\(\w\+\)')
let l:spaces = matchstr(getline(l:sn), '^\s*') let spaces = matchstr(getline(sn), '^\s*')
let l:settings = emmet#getSettings() let settings = emmet#getSettings()
if stridx(','.l:settings.html.inline_elements.',', ','.l:tag.',') == -1 if stridx(','.settings.html.inline_elements.',', ','.tag.',') == -1
call append(l:sn, l:spaces . ' ') call append(sn, spaces . ' ')
call setpos('.', [0, l:sn+1, 1, 0]) call setpos('.', [0, sn+1, 1, 0])
else else
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
endif endif
startinsert! startinsert!
endif endif
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
endfunction endfunction
function! emmet#lang#jade#removeTag() abort function! emmet#lang#jade#removeTag() abort
let l:n = line('.') let n = line('.')
let l:ml = 0 let ml = 0
while l:n > 0 while n > 0
if getline(l:n) =~# '^\s*\ze[a-z]' if getline(n) =~# '^\s*\ze[a-z]'
let l:ml = len(matchstr(getline(l:n), '^\s*%[a-z]')) let ml = len(matchstr(getline(n), '^\s*%[a-z]'))
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
let l:sn = l:n let sn = n
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*%[a-z]')) let l = len(matchstr(getline(n), '^\s*%[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
if l:sn == l:n if sn == n
exe 'delete' exe 'delete'
else else
exe l:sn ',' (l:n-1) 'delete' exe sn ',' (n-1) 'delete'
endif endif
endfunction endfunction
function! emmet#lang#jade#mergeLines() abort
" nothing to do
endfunction
+2 -6
View File
@@ -14,8 +14,8 @@ function! emmet#lang#less#imageSize() abort
call emmet#lang#css#imageSize() call emmet#lang#css#imageSize()
endfunction endfunction
function! emmet#lang#less#imageEncode() abort function! emmet#lang#less#encodeImage() abort
return emmet#lang#css#imageEncode() return emmet#lang#css#encodeImage()
endfunction endfunction
function! emmet#lang#less#parseTag(tag) abort function! emmet#lang#less#parseTag(tag) abort
@@ -45,7 +45,3 @@ endfunction
function! emmet#lang#less#removeTag() abort function! emmet#lang#less#removeTag() abort
call emmet#lang#css#removeTag() call emmet#lang#css#removeTag()
endfunction endfunction
function! emmet#lang#less#mergeLines() abort
call emmet#lang#css#mergeLines()
endfunction
+82 -85
View File
@@ -3,69 +3,69 @@ function! emmet#lang#sass#findTokens(str) abort
endfunction endfunction
function! emmet#lang#sass#parseIntoTree(abbr, type) abort 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 endfunction
function! emmet#lang#sass#toString(settings, current, type, inline, filters, itemno, indent) abort function! emmet#lang#sass#toString(settings, current, type, inline, filters, itemno, indent) abort
let l:settings = a:settings let settings = a:settings
let l:current = a:current let current = a:current
let l:type = a:type let type = a:type
let l:inline = a:inline let inline = a:inline
let l:filters = a:filters let filters = a:filters
let l:itemno = a:itemno let itemno = a:itemno
let l:indent = a:indent let indent = a:indent
let l:str = '' let str = ''
let l:current_name = l:current.name let current_name = current.name
let l:current_name = substitute(l:current.name, '\$$', l:itemno+1, '') let current_name = substitute(current.name, '\$$', itemno+1, '')
if len(l:current.name) > 0 if len(current.name) > 0
let l:str .= l:current_name let str .= current_name
let l:tmp = '' let tmp = ''
for l:attr in keys(l:current.attr) for attr in keys(current.attr)
let l:val = l:current.attr[l:attr] let val = current.attr[attr]
while l:val =~# '\$\([^#{]\|$\)' while val =~# '\$\([^#{]\|$\)'
let l:val = substitute(l:val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let val = substitute(val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
endwhile endwhile
let l:attr = substitute(l:attr, '\$$', l:itemno+1, '') let attr = substitute(attr, '\$$', itemno+1, '')
if l:attr ==# 'id' if attr ==# 'id'
let l:str .= '#' . l:val let str .= '#' . val
elseif l:attr ==# 'class' elseif attr ==# 'class'
let l:str .= '.' . l:val let str .= '.' . val
else else
let l:tmp .= l:attr . ': ' . l:val let tmp .= attr . ': ' . val
endif endif
endfor endfor
if len(l:tmp) > 0 if len(tmp) > 0
let l:str .= "\n" let str .= "\n"
for l:line in split(l:tmp, "\n") for line in split(tmp, "\n")
let l:str .= l:indent . l:line . "\n" let str .= indent . line . "\n"
endfor endfor
else else
let l:str .= "\n" let str .= "\n"
endif endif
let l:inner = '' let inner = ''
for l:child in l:current.child for child in current.child
let l:tmp = emmet#toString(l:child, l:type, l:inline, l:filters, l:itemno, l:indent) let tmp = emmet#toString(child, type, inline, filters, itemno, indent)
let l:tmp = substitute(l:tmp, "\n", "\n" . escape(l:indent, '\'), 'g') let tmp = substitute(tmp, "\n", "\n" . escape(indent, '\'), 'g')
let l:tmp = substitute(l:tmp, "\n" . escape(l:indent, '\') . '$', '${cursor}\n', 'g') let tmp = substitute(tmp, "\n" . escape(indent, '\') . '$', '${cursor}\n', 'g')
let l:inner .= l:tmp let inner .= tmp
endfor endfor
if len(l:inner) > 0 if len(inner) > 0
let l:str .= l:indent . l:inner let str .= indent . inner
endif endif
else else
let l:text = emmet#lang#css#toString(l:settings, l:current, l:type, l:inline, l:filters, l:itemno, l:indent) let text = emmet#lang#css#toString(settings, current, type, inline, filters, itemno, indent)
let l:text = substitute(l:text, '\s*;\ze\(\${[^}]\+}\)\?\(\n\|$\)', '', 'g') let text = substitute(text, '\s*;\ze\(\${[^}]\+}\)\?\(\n\|$\)', '', 'g')
return l:text return text
endif endif
return l:str return str
endfunction endfunction
function! emmet#lang#sass#imageSize() abort function! emmet#lang#sass#imageSize() abort
endfunction endfunction
function! emmet#lang#sass#imageEncode() abort function! emmet#lang#sass#encodeImage() abort
endfunction endfunction
function! emmet#lang#sass#parseTag(tag) abort function! emmet#lang#sass#parseTag(tag) abort
@@ -75,67 +75,67 @@ function! emmet#lang#sass#toggleComment() abort
endfunction endfunction
function! emmet#lang#sass#balanceTag(flag) range abort function! emmet#lang#sass#balanceTag(flag) range abort
let l:block = emmet#util#getVisualBlock() let block = emmet#util#getVisualBlock()
if a:flag == -2 || a:flag == 2 if a:flag == -2 || a:flag == 2
let l:curpos = [0, line("'<"), col("'<"), 0] let curpos = [0, line("'<"), col("'<"), 0]
else else
let l:curpos = emmet#util#getcurpos() let curpos = emmet#util#getcurpos()
endif endif
let l:n = l:curpos[1] let n = curpos[1]
let l:ml = len(matchstr(getline(l:n), '^\s*')) let ml = len(matchstr(getline(n), '^\s*'))
if a:flag > 0 if a:flag > 0
if a:flag == 1 || !emmet#util#regionIsValid(l:block) if a:flag == 1 || !emmet#util#regionIsValid(block)
let l:n = line('.') let n = line('.')
else else
while l:n > 0 while n > 0
let l:l = len(matchstr(getline(l:n), '^\s*\ze[a-z]')) let l = len(matchstr(getline(n), '^\s*\ze[a-z]'))
if l:l > 0 && l:l < l:ml if l > 0 && l < ml
let l:ml = l:l let ml = l
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
endif endif
let l:sn = l:n let sn = n
if l:n == 0 if n == 0
let l:ml = 0 let ml = 0
endif endif
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*[a-z]')) let l = len(matchstr(getline(n), '^\s*[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
call setpos('.', [0, l:n, 1, 0]) call setpos('.', [0, n, 1, 0])
normal! V normal! V
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
else else
while l:n > 0 while n > 0
let l:l = len(matchstr(getline(l:n), '^\s*\ze[a-z]')) let l = len(matchstr(getline(n), '^\s*\ze[a-z]'))
if l:l > 0 && l:l > l:ml if l > 0 && l > ml
let l:ml = l:l let ml = l
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
let l:sn = l:n let sn = n
if l:n == 0 if n == 0
let l:ml = 0 let ml = 0
endif endif
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*[a-z]')) let l = len(matchstr(getline(n), '^\s*[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
call setpos('.', [0, l:n, 1, 0]) call setpos('.', [0, n, 1, 0])
normal! V normal! V
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
endif endif
endfunction endfunction
@@ -144,10 +144,10 @@ function! emmet#lang#sass#moveNextPrevItem(flag) abort
endfunction endfunction
function! emmet#lang#sass#moveNextPrev(flag) abort function! emmet#lang#sass#moveNextPrev(flag) abort
let l:pos = search('""\|\(^\s*|\s*\zs\)', a:flag ? 'Wpb' : 'Wp') let pos = search('""\|\(^\s*|\s*\zs\)', a:flag ? 'Wpb' : 'Wp')
if l:pos == 2 if pos == 2
startinsert! startinsert!
elseif l:pos != 0 elseif pos != 0
silent! normal! l silent! normal! l
startinsert startinsert
endif endif
@@ -158,6 +158,3 @@ endfunction
function! emmet#lang#sass#removeTag() abort function! emmet#lang#sass#removeTag() abort
endfunction endfunction
function! emmet#lang#sass#mergeLines() abort
endfunction
+50 -54
View File
@@ -11,61 +11,61 @@ function! emmet#lang#scss#parseIntoTree(abbr, type) abort
endfunction endfunction
function! emmet#lang#scss#toString(settings, current, type, inline, filters, itemno, indent) abort function! emmet#lang#scss#toString(settings, current, type, inline, filters, itemno, indent) abort
let l:settings = a:settings let settings = a:settings
let l:current = a:current let current = a:current
let l:type = a:type let type = a:type
let l:inline = a:inline let inline = a:inline
let l:filters = a:filters let filters = a:filters
let l:itemno = a:itemno let itemno = a:itemno
let l:indent = a:indent let indent = a:indent
let l:str = '' let str = ''
let l:current_name = substitute(l:current.name, '\$$', l:itemno+1, '') let current_name = substitute(current.name, '\$$', itemno+1, '')
if len(l:current.name) > 0 if len(current.name) > 0
let l:str .= l:current_name let str .= current_name
let l:tmp = '' let tmp = ''
for l:attr in keys(l:current.attr) for attr in keys(current.attr)
let l:val = l:current.attr[l:attr] let val = current.attr[attr]
while l:val =~# '\$\([^#{]\|$\)' while val =~# '\$\([^#{]\|$\)'
let l:val = substitute(l:val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let val = substitute(val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
endwhile endwhile
let l:attr = substitute(l:attr, '\$$', l:itemno+1, '') let attr = substitute(attr, '\$$', itemno+1, '')
if l:attr ==# 'id' if attr ==# 'id'
let l:str .= '#' . l:val let str .= '#' . val
elseif l:attr ==# 'class' elseif attr ==# 'class'
let l:str .= '.' . l:val let str .= '.' . val
else else
let l:tmp .= l:attr . ': ' . l:val . ';' let tmp .= attr . ': ' . val . ';'
endif endif
endfor endfor
if len(l:tmp) > 0 if len(tmp) > 0
let l:str .= " {\n" let str .= " {\n"
for l:line in split(l:tmp, "\n") for line in split(tmp, "\n")
let l:str .= l:indent . l:line . "\n" let str .= indent . line . "\n"
endfor endfor
else else
let l:str .= " {\n" let str .= " {\n"
endif endif
let l:inner = '' let inner = ''
for l:child in l:current.child for child in current.child
let l:inner .= emmet#toString(l:child, l:type, l:inline, l:filters, l:itemno) let inner .= emmet#toString(child, type, inline, filters, itemno)
endfor endfor
let l:inner = substitute(l:inner, "\n", "\n" . escape(l:indent, '\'), 'g') let inner = substitute(inner, "\n", "\n" . escape(indent, '\'), 'g')
let l:inner = substitute(l:inner, "\n" . escape(l:indent, '\') . '$', '', 'g') let inner = substitute(inner, "\n" . escape(indent, '\') . '$', '', 'g')
let l:str .= l:indent . l:inner . "${cursor}\n}\n" let str .= indent . inner . "\n}\n"
else else
return emmet#lang#css#toString(l:settings, l:current, l:type, l:inline, l:filters, l:itemno, l:indent) return emmet#lang#css#toString(settings, current, type, inline, filters, itemno, indent)
endif endif
return l:str return str
endfunction endfunction
function! emmet#lang#scss#imageSize() abort function! emmet#lang#scss#imageSize() abort
call emmet#lang#css#imageSize() call emmet#lang#css#imageSize()
endfunction endfunction
function! emmet#lang#scss#imageEncode() abort function! emmet#lang#scss#encodeImage() abort
return emmet#lang#css#imageEncode() return emmet#lang#css#encodeImage()
endfunction endfunction
function! emmet#lang#scss#parseTag(tag) abort function! emmet#lang#scss#parseTag(tag) abort
@@ -78,33 +78,33 @@ endfunction
function! emmet#lang#scss#balanceTag(flag) range abort function! emmet#lang#scss#balanceTag(flag) range abort
if a:flag == -2 || a:flag == 2 if a:flag == -2 || a:flag == 2
let l:curpos = [0, line("'<"), col("'<"), 0] let curpos = [0, line("'<"), col("'<"), 0]
call setpos('.', l:curpos) call setpos('.', curpos)
else else
let l:curpos = emmet#util#getcurpos() let curpos = emmet#util#getcurpos()
endif endif
if a:flag < 0 if a:flag < 0
let l:ret = searchpair('}', '', '.\zs{') let ret = searchpair('}', '', '.\zs{')
else else
let l:ret = searchpair('{', '', '}', 'bW') let ret = searchpair('{', '', '}', 'bW')
endif endif
if l:ret > 0 if ret > 0
let l:pos1 = emmet#util#getcurpos()[1:2] let pos1 = emmet#util#getcurpos()[1:2]
if a:flag < 0 if a:flag < 0
let l:pos2 = searchpairpos('{', '', '}') let pos2 = searchpairpos('{', '', '}')
else else
let l:pos2 = searchpairpos('{', '', '}') let pos2 = searchpairpos('{', '', '}')
endif endif
let l:block = [l:pos1, l:pos2] let block = [pos1, pos2]
if emmet#util#regionIsValid(l:block) if emmet#util#regionIsValid(block)
call emmet#util#selectRegion(l:block) call emmet#util#selectRegion(block)
return return
endif endif
endif endif
if a:flag == -2 || a:flag == 2 if a:flag == -2 || a:flag == 2
silent! exe 'normal! gv' silent! exe 'normal! gv'
else else
call setpos('.', l:curpos) call setpos('.', curpos)
endif endif
endfunction endfunction
@@ -123,7 +123,3 @@ endfunction
function! emmet#lang#scss#removeTag() abort function! emmet#lang#scss#removeTag() abort
call emmet#lang#css#removeTag() call emmet#lang#css#removeTag()
endfunction endfunction
function! emmet#lang#scss#mergeLines() abort
call emmet#lang#css#mergeLines()
endfunction
+165 -168
View File
@@ -7,210 +7,210 @@ function! emmet#lang#slim#parseIntoTree(abbr, type) abort
endfunction endfunction
function! emmet#lang#slim#toString(settings, current, type, inline, filters, itemno, indent) abort function! emmet#lang#slim#toString(settings, current, type, inline, filters, itemno, indent) abort
let l:current = a:current let current = a:current
let l:type = a:type let type = a:type
let l:inline = a:inline let inline = a:inline
let l:filters = a:filters let filters = a:filters
let l:itemno = a:itemno let itemno = a:itemno
let l:indent = emmet#getIndentation(l:type) let indent = emmet#getIndentation(type)
let l:dollar_expr = emmet#getResource(l:type, 'dollar_expr', 1) let dollar_expr = emmet#getResource(type, 'dollar_expr', 1)
let l:str = '' let str = ''
let l:current_name = l:current.name let current_name = current.name
if l:dollar_expr if dollar_expr
let l:current_name = substitute(l:current.name, '\$$', l:itemno+1, '') let current_name = substitute(current.name, '\$$', itemno+1, '')
endif endif
if len(l:current.name) > 0 if len(current.name) > 0
let l:str .= l:current_name let str .= current_name
for l:attr in emmet#util#unique(l:current.attrs_order + keys(l:current.attr)) for attr in emmet#util#unique(current.attrs_order + keys(current.attr))
if !has_key(l:current.attr, l:attr) if !has_key(current.attr, attr)
continue continue
endif endif
let l:Val = l:current.attr[l:attr] let Val = current.attr[attr]
if type(l:Val) == 2 && l:Val == function('emmet#types#true') if type(Val) == 2 && Val == function('emmet#types#true')
let l:str .= ' ' . l:attr . '=true' let str .= ' ' . attr . '=true'
else else
if l:dollar_expr if dollar_expr
while l:Val =~# '\$\([^#{]\|$\)' while Val =~# '\$\([^#{]\|$\)'
let l:Val = substitute(l:Val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let Val = substitute(Val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
endwhile endwhile
endif endif
let l:attr = substitute(l:attr, '\$$', l:itemno+1, '') let attr = substitute(attr, '\$$', itemno+1, '')
let l:str .= ' ' . l:attr . '="' . l:Val . '"' let str .= ' ' . attr . '="' . Val . '"'
endif endif
endfor endfor
let l:inner = '' let inner = ''
if len(l:current.value) > 0 if len(current.value) > 0
let l:str .= "\n" let str .= "\n"
let l:text = l:current.value[1:-2] let text = current.value[1:-2]
if l:dollar_expr if dollar_expr
let l:text = substitute(l:text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:text = substitute(l:text, '\${nr}', "\n", 'g') let text = substitute(text, '\${nr}', "\n", 'g')
let l:text = substitute(l:text, '\\\$', '$', 'g') let text = substitute(text, '\\\$', '$', 'g')
let l:str = substitute(l:str, '\$#', l:text, 'g') let str = substitute(str, '\$#', text, 'g')
endif endif
for l:line in split(l:text, "\n") for line in split(text, "\n")
let l:str .= l:indent . '| ' . l:line . "\n" let str .= indent . '| ' . line . "\n"
endfor endfor
elseif len(l:current.child) == 0 elseif len(current.child) == 0
let l:str .= '${cursor}' let str .= '${cursor}'
endif endif
if len(l:current.child) == 1 && len(l:current.child[0].name) == 0 if len(current.child) == 1 && len(current.child[0].name) == 0
let l:str .= "\n" let str .= "\n"
let l:text = l:current.child[0].value[1:-2] let text = current.child[0].value[1:-2]
if l:dollar_expr if dollar_expr
let l:text = substitute(l:text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let text = substitute(text, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:text = substitute(l:text, '\${nr}', "\n", 'g') let text = substitute(text, '\${nr}', "\n", 'g')
let l:text = substitute(l:text, '\\\$', '$', 'g') let text = substitute(text, '\\\$', '$', 'g')
endif endif
for l:line in split(l:text, "\n") for line in split(text, "\n")
let l:str .= l:indent . '| ' . l:line . "\n" let str .= indent . '| ' . line . "\n"
endfor endfor
elseif len(l:current.child) > 0 elseif len(current.child) > 0
for l:child in l:current.child for child in current.child
let l:inner .= emmet#toString(l:child, l:type, l:inline, l:filters, l:itemno, l:indent) let inner .= emmet#toString(child, type, inline, filters, itemno, indent)
endfor endfor
let l:inner = substitute(l:inner, "\n", "\n" . escape(l:indent, '\'), 'g') let inner = substitute(inner, "\n", "\n" . escape(indent, '\'), 'g')
let l:inner = substitute(l:inner, "\n" . escape(l:indent, '\') . '$', '', 'g') let inner = substitute(inner, "\n" . escape(indent, '\') . '$', '', 'g')
let l:str .= "\n" . l:indent . l:inner let str .= "\n" . indent . inner
endif endif
else else
let l:str = l:current.value[1:-2] let str = current.value[1:-2]
if l:dollar_expr if dollar_expr
let l:str = substitute(l:str, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", l:itemno+1).submatch(2)', 'g') let str = substitute(str, '\%(\\\)\@\<!\(\$\+\)\([^{#]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g')
let l:str = substitute(l:str, '\${nr}', "\n", 'g') let str = substitute(str, '\${nr}', "\n", 'g')
let l:str = substitute(l:str, '\\\$', '$', 'g') let str = substitute(str, '\\\$', '$', 'g')
endif endif
endif endif
if l:str !~# "\n$" if str !~# "\n$"
let l:str .= "\n" let str .= "\n"
endif endif
return l:str return str
endfunction endfunction
function! emmet#lang#slim#imageSize() abort function! emmet#lang#slim#imageSize() abort
let l:line = getline('.') let line = getline('.')
let l:current = emmet#lang#slim#parseTag(l:line) let current = emmet#lang#slim#parseTag(line)
if empty(l:current) || !has_key(l:current.attr, 'src') if empty(current) || !has_key(current.attr, 'src')
return return
endif endif
let l:fn = l:current.attr.src let fn = current.attr.src
if l:fn =~# '^\s*$' if fn =~# '^\s*$'
return return
elseif l:fn !~# '^\(/\|http\)' elseif fn !~# '^\(/\|http\)'
let l:fn = simplify(expand('%:h') . '/' . l:fn) let fn = simplify(expand('%:h') . '/' . fn)
endif endif
let [l:width, l:height] = emmet#util#getImageSize(l:fn) let [width, height] = emmet#util#getImageSize(fn)
if l:width == -1 && l:height == -1 if width == -1 && height == -1
return return
endif endif
let l:current.attr.width = l:width let current.attr.width = width
let l:current.attr.height = l:height let current.attr.height = height
let l:current.attrs_order += ['width', 'height'] let current.attrs_order += ['width', 'height']
let l:slim = emmet#toString(l:current, 'slim', 1) let slim = emmet#toString(current, 'slim', 1)
let l:slim = substitute(l:slim, '\${cursor}', '', '') let slim = substitute(slim, '\${cursor}', '', '')
call setline('.', substitute(matchstr(l:line, '^\s*') . l:slim, "\n", '', 'g')) call setline('.', substitute(matchstr(line, '^\s*') . slim, "\n", '', 'g'))
endfunction endfunction
function! emmet#lang#slim#imageEncode() abort function! emmet#lang#slim#encodeImage() abort
endfunction endfunction
function! emmet#lang#slim#parseTag(tag) abort function! emmet#lang#slim#parseTag(tag) abort
let l:current = emmet#newNode() let current = emmet#newNode()
let l:mx = '\([a-zA-Z][a-zA-Z0-9]*\)\s\+\(.*\)' let mx = '\([a-zA-Z][a-zA-Z0-9]*\)\s\+\(.*\)'
let l:match = matchstr(a:tag, l:mx) let match = matchstr(a:tag, mx)
let l:current.name = substitute(l:match, l:mx, '\1', '') let current.name = substitute(match, mx, '\1', '')
let l:attrs = substitute(l:match, l:mx, '\2', '') let attrs = substitute(match, mx, '\2', '')
let l:mx = '\([a-zA-Z0-9]\+\)=\%(\([^"'' \t]\+\)\|"\([^"]\{-}\)"\|''\([^'']\{-}\)''\)' let mx = '\([a-zA-Z0-9]\+\)=\%(\([^"'' \t]\+\)\|"\([^"]\{-}\)"\|''\([^'']\{-}\)''\)'
while len(l:attrs) > 0 while len(attrs) > 0
let l:match = matchstr(l:attrs, l:mx) let match = matchstr(attrs, mx)
if len(l:match) == 0 if len(match) == 0
break break
endif endif
let l:attr_match = matchlist(l:match, l:mx) let attr_match = matchlist(match, mx)
let l:name = l:attr_match[1] let name = attr_match[1]
let l:value = len(l:attr_match[2]) ? l:attr_match[2] : l:attr_match[3] let value = len(attr_match[2]) ? attr_match[2] : attr_match[3]
let l:current.attr[l:name] = l:value let current.attr[name] = value
let l:current.attrs_order += [l:name] let current.attrs_order += [name]
let l:attrs = l:attrs[stridx(l:attrs, l:match) + len(l:match):] let attrs = attrs[stridx(attrs, match) + len(match):]
endwhile endwhile
return l:current return current
endfunction endfunction
function! emmet#lang#slim#toggleComment() abort function! emmet#lang#slim#toggleComment() abort
let l:line = getline('.') let line = getline('.')
let l:space = matchstr(l:line, '^\s*') let space = matchstr(line, '^\s*')
if l:line =~# '^\s*/' if line =~# '^\s*/'
call setline('.', l:space . l:line[len(l:space)+1:]) call setline('.', space . line[len(space)+1:])
elseif l:line =~# '^\s*[a-z]' elseif line =~# '^\s*[a-z]'
call setline('.', l:space . '/' . l:line[len(l:space):]) call setline('.', space . '/' . line[len(space):])
endif endif
endfunction endfunction
function! emmet#lang#slim#balanceTag(flag) range abort function! emmet#lang#slim#balanceTag(flag) range abort
let l:block = emmet#util#getVisualBlock() let block = emmet#util#getVisualBlock()
if a:flag == -2 || a:flag == 2 if a:flag == -2 || a:flag == 2
let l:curpos = [0, line("'<"), col("'<"), 0] let curpos = [0, line("'<"), col("'<"), 0]
else else
let l:curpos = emmet#util#getcurpos() let curpos = emmet#util#getcurpos()
endif endif
let l:n = l:curpos[1] let n = curpos[1]
let l:ml = len(matchstr(getline(l:n), '^\s*')) let ml = len(matchstr(getline(n), '^\s*'))
if a:flag > 0 if a:flag > 0
if a:flag == 1 || !emmet#util#regionIsValid(l:block) if a:flag == 1 || !emmet#util#regionIsValid(block)
let l:n = line('.') let n = line('.')
else else
while l:n > 0 while n > 0
let l:l = len(matchstr(getline(l:n), '^\s*\ze[a-z]')) let l = len(matchstr(getline(n), '^\s*\ze[a-z]'))
if l:l > 0 && l:l < l:ml if l > 0 && l < ml
let l:ml = l:l let ml = l
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
endif endif
let l:sn = l:n let sn = n
if l:n == 0 if n == 0
let l:ml = 0 let ml = 0
endif endif
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*[a-z]')) let l = len(matchstr(getline(n), '^\s*[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
call setpos('.', [0, l:n, 1, 0]) call setpos('.', [0, n, 1, 0])
normal! V normal! V
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
else else
while l:n > 0 while n > 0
let l:l = len(matchstr(getline(l:n), '^\s*\ze[a-z]')) let l = len(matchstr(getline(n), '^\s*\ze[a-z]'))
if l:l > 0 && l:l > l:ml if l > 0 && l > ml
let l:ml = l:l let ml = l
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
let l:sn = l:n let sn = n
if l:n == 0 if n == 0
let l:ml = 0 let ml = 0
endif endif
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*[a-z]')) let l = len(matchstr(getline(n), '^\s*[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
call setpos('.', [0, l:n, 1, 0]) call setpos('.', [0, n, 1, 0])
normal! V normal! V
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
endif endif
endfunction endfunction
@@ -219,66 +219,63 @@ function! emmet#lang#slim#moveNextPrevItem(flag) abort
endfunction endfunction
function! emmet#lang#slim#moveNextPrev(flag) abort function! emmet#lang#slim#moveNextPrev(flag) abort
let l:pos = search('""\|\(^\s*|\s*\zs\)', a:flag ? 'Wpb' : 'Wp') let pos = search('""\|\(^\s*|\s*\zs\)', a:flag ? 'Wpb' : 'Wp')
if l:pos == 2 if pos == 2
startinsert! startinsert!
elseif l:pos != 0 elseif pos != 0
silent! normal! l silent! normal! l
startinsert startinsert
endif endif
endfunction endfunction
function! emmet#lang#slim#splitJoinTag() abort function! emmet#lang#slim#splitJoinTag() abort
let l:n = line('.') let n = line('.')
while l:n > 0 while n > 0
if getline(l:n) =~# '^\s*\ze[a-z]' if getline(n) =~# '^\s*\ze[a-z]'
let l:sn = l:n let sn = n
let l:n += 1 let n += 1
if getline(l:n) =~# '^\s*|' if getline(n) =~# '^\s*|'
while l:n <= line('$') while n <= line('$')
if getline(l:n) !~# '^\s*|' if getline(n) !~# '^\s*|'
break break
endif endif
exe l:n 'delete' exe n 'delete'
endwhile endwhile
call setpos('.', [0, l:sn, 1, 0]) call setpos('.', [0, sn, 1, 0])
else else
let l:spaces = matchstr(getline(l:sn), '^\s*') let spaces = matchstr(getline(sn), '^\s*')
call append(l:sn, l:spaces . ' | ') call append(sn, spaces . ' | ')
call setpos('.', [0, l:sn+1, 1, 0]) call setpos('.', [0, sn+1, 1, 0])
startinsert! startinsert!
endif endif
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
endfunction endfunction
function! emmet#lang#slim#removeTag() abort function! emmet#lang#slim#removeTag() abort
let l:n = line('.') let n = line('.')
let l:ml = 0 let ml = 0
while l:n > 0 while n > 0
if getline(l:n) =~# '^\s*\ze[a-z]' if getline(n) =~# '^\s*\ze[a-z]'
let l:ml = len(matchstr(getline(l:n), '^\s*[a-z]')) let ml = len(matchstr(getline(n), '^\s*[a-z]'))
break break
endif endif
let l:n -= 1 let n -= 1
endwhile endwhile
let l:sn = l:n let sn = n
while l:n < line('$') while n < line('$')
let l:l = len(matchstr(getline(l:n), '^\s*[a-z]')) let l = len(matchstr(getline(n), '^\s*[a-z]'))
if l:l > 0 && l:l <= l:ml if l > 0 && l <= ml
let l:n -= 1 let n -= 1
break break
endif endif
let l:n += 1 let n += 1
endwhile endwhile
if l:sn == l:n if sn == n
exe 'delete' exe 'delete'
else else
exe l:sn ',' (l:n-1) 'delete' exe sn ',' (n-1) 'delete'
endif endif
endfunction endfunction
function! emmet#lang#slim#mergeLines() abort
endfunction
+26 -26
View File
@@ -1,9 +1,9 @@
function! emmet#lorem#en#expand(command) abort function! emmet#lorem#en#expand(command) abort
let l:wcount = matchstr(a:command, '\(\d*\)$') let wcount = matchstr(a:command, '\(\d*\)$')
let l:wcount = l:wcount > 0 ? l:wcount : 30 let wcount = wcount > 0 ? wcount : 30
let l:common = ['lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipisicing', 'elit'] let common = ['lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipisicing', 'elit']
let l:words = ['exercitationem', 'perferendis', 'perspiciatis', 'laborum', 'eveniet', let words = ['exercitationem', 'perferendis', 'perspiciatis', 'laborum', 'eveniet',
\ 'sunt', 'iure', 'nam', 'nobis', 'eum', 'cum', 'officiis', 'excepturi', \ 'sunt', 'iure', 'nam', 'nobis', 'eum', 'cum', 'officiis', 'excepturi',
\ 'odio', 'consectetur', 'quasi', 'aut', 'quisquam', 'vel', 'eligendi', \ 'odio', 'consectetur', 'quasi', 'aut', 'quisquam', 'vel', 'eligendi',
\ 'itaque', 'non', 'odit', 'tempore', 'quaerat', 'dignissimos', \ 'itaque', 'non', 'odit', 'tempore', 'quaerat', 'dignissimos',
@@ -32,34 +32,34 @@ function! emmet#lorem#en#expand(command) abort
\ 'architecto', 'est', 'esse', 'mollitia', 'nulla', 'a', 'similique', \ 'architecto', 'est', 'esse', 'mollitia', 'nulla', 'a', 'similique',
\ 'eos', 'alias', 'dolore', 'tenetur', 'deleniti', 'porro', 'facere', \ 'eos', 'alias', 'dolore', 'tenetur', 'deleniti', 'porro', 'facere',
\ 'maxime', 'corrupti'] \ 'maxime', 'corrupti']
let l:ret = [] let ret = []
let l:sentence = 0 let sentence = 0
for l:i in range(l:wcount) for i in range(wcount)
let l:arr = l:common let arr = common
if l:sentence > 0 if sentence > 0
let l:arr += l:words let arr += words
endif endif
let l:r = emmet#util#rand() let r = emmet#util#rand()
let l:word = l:arr[l:r % len(l:arr)] let word = arr[r % len(arr)]
if l:sentence == 0 if sentence == 0
let l:word = substitute(l:word, '^.', '\U&', '') let word = substitute(word, '^.', '\U&', '')
endif endif
let l:sentence += 1 let sentence += 1
call add(l:ret, l:word) call add(ret, word)
if (l:sentence > 5 && emmet#util#rand() < 10000) || l:i == l:wcount - 1 if (sentence > 5 && emmet#util#rand() < 10000) || i == wcount - 1
if l:i == l:wcount - 1 if i == wcount - 1
let l:endc = '?!...'[emmet#util#rand() % 5] let endc = '?!...'[emmet#util#rand() % 5]
call add(l:ret, l:endc) call add(ret, endc)
else else
let l:endc = '?!,...'[emmet#util#rand() % 6] let endc = '?!,...'[emmet#util#rand() % 6]
call add(l:ret, l:endc . ' ') call add(ret, endc . ' ')
endif endif
if l:endc !=# ',' if endc !=# ','
let l:sentence = 0 let sentence = 0
endif endif
else else
call add(l:ret, ' ') call add(ret, ' ')
endif endif
endfor endfor
return join(l:ret, '') return join(ret, '')
endfunction endfunction
+19 -19
View File
@@ -1,27 +1,27 @@
scriptencoding utf-8 scriptencoding utf-8
function! emmet#lorem#ja#expand(command) abort function! emmet#lorem#ja#expand(command) abort
let l:wcount = matchstr(a:command, '^\%(lorem\|lipsum\)\(\d*\)}$', '\1', '') let wcount = matchstr(a:command, '^\%(lorem\|lipsum\)\(\d*\)}$', '\1', '')
let l:wcount = l:wcount > 0 ? l:wcount : 30 let wcount = wcount > 0 ? wcount : 30
let l:url = "http://www.aozora.gr.jp/cards/000081/files/470_15407.html" let url = "http://www.aozora.gr.jp/cards/000081/files/470_15407.html"
let l:content = emmet#util#cache(l:url) let content = emmet#util#cache(url)
if len(l:content) == 0 if len(content) == 0
let l:content = emmet#util#getContentFromURL(l:url) let content = emmet#util#getContentFromURL(url)
let l:content = matchstr(l:content, '<div[^>]*>\zs.\{-}</div>') let content = matchstr(content, '<div[^>]*>\zs.\{-}</div>')
let l:content = substitute(l:content, '[ \r]', '', 'g') let content = substitute(content, '[ \r]', '', 'g')
let l:content = substitute(l:content, '<br[^>]*>', "\n", 'g') let content = substitute(content, '<br[^>]*>', "\n", 'g')
let l:content = substitute(l:content, '<[^>]\+>', '', 'g') let content = substitute(content, '<[^>]\+>', '', 'g')
let l:content = join(filter(split(l:content, "\n"), 'len(v:val)>0'), "\n") let content = join(filter(split(content, "\n"), 'len(v:val)>0'), "\n")
call emmet#util#cache(l:url, l:content) call emmet#util#cache(url, content)
endif endif
let l:content = substitute(l:content, "、\n", "、", "g") let content = substitute(content, "、\n", "、", "g")
let l:clines = split(l:content, '\n') let clines = split(content, '\n')
let l:lines = filter(l:clines, 'len(substitute(v:val,".",".","g"))<=l:wcount') let lines = filter(clines, 'len(substitute(v:val,".",".","g"))<=wcount')
if len(l:lines) == 0 if len(lines) == 0
let l:lines = l:clines let lines = clines
endif endif
let l:r = emmet#util#rand() let r = emmet#util#rand()
return l:lines[l:r % len(l:lines)] return lines[r % len(lines)]
endfunction endfunction
+168 -195
View File
@@ -12,10 +12,10 @@
" begin::end " begin::end
" -------------------- " --------------------
function! emmet#util#deleteContent(region) abort function! emmet#util#deleteContent(region) abort
let l:lines = getline(a:region[0][0], a:region[1][0]) let lines = getline(a:region[0][0], a:region[1][0])
call setpos('.', [0, a:region[0][0], a:region[0][1], 0]) call setpos('.', [0, a:region[0][0], a:region[0][1], 0])
silent! exe 'delete '.(a:region[1][0] - a:region[0][0]) silent! exe 'delete '.(a:region[1][0] - a:region[0][0])
call setline(line('.'), l:lines[0][:a:region[0][1]-2] . l:lines[-1][a:region[1][1]]) call setline(line('.'), lines[0][:a:region[0][1]-2] . lines[-1][a:region[1][1]])
endfunction endfunction
" change_content : change content in region " change_content : change content in region
@@ -37,22 +37,36 @@ endfunction
" baz:end " baz:end
" -------------------- " --------------------
function! emmet#util#setContent(region, content) abort function! emmet#util#setContent(region, content) abort
let l:newlines = split(a:content, '\n', 1) let newlines = split(a:content, '\n', 1)
let l:oldlines = getline(a:region[0][0], a:region[1][0]) let oldlines = getline(a:region[0][0], a:region[1][0])
call setpos('.', [0, a:region[0][0], a:region[0][1], 0]) call setpos('.', [0, a:region[0][0], a:region[0][1], 0])
silent! exe 'delete '.(a:region[1][0] - a:region[0][0]) silent! exe 'delete '.(a:region[1][0] - a:region[0][0])
if len(l:newlines) == 0 if len(newlines) == 0
let l:newlines = [''] let tmp = ''
endif if a:region[0][1] > 1
if a:region[0][1] > 1 let tmp = oldlines[0][:a:region[0][1]-2]
let l:newlines[0] = l:oldlines[0][:a:region[0][1]-2] . l:newlines[0] endif
endif if a:region[1][1] >= 1
if a:region[1][1] >= 1 let tmp .= oldlines[-1][a:region[1][1]:]
let l:newlines[-1] .= l:oldlines[-1][a:region[1][1]:] endif
endif call setline(line('.'), tmp)
call setline(line('.'), l:newlines[0]) elseif len(newlines) == 1
if len(l:newlines) > 1 if a:region[0][1] > 1
call append(line('.'), l:newlines[1:]) let newlines[0] = oldlines[0][:a:region[0][1]-2] . newlines[0]
endif
if a:region[1][1] >= 1
let newlines[0] .= oldlines[-1][a:region[1][1]:]
endif
call setline(line('.'), newlines[0])
else
if a:region[0][1] > 1
let newlines[0] = oldlines[0][:a:region[0][1]-2] . newlines[0]
endif
if a:region[1][1] >= 1
let newlines[-1] .= oldlines[-1][a:region[1][1]:]
endif
call setline(line('.'), newlines[0])
call append(line('.'), newlines[1:])
endif endif
endfunction endfunction
@@ -79,8 +93,8 @@ endfunction
" this function return 0 or 1 " this function return 0 or 1
function! emmet#util#cursorInRegion(region) abort function! emmet#util#cursorInRegion(region) abort
if !emmet#util#regionIsValid(a:region) | return 0 | endif if !emmet#util#regionIsValid(a:region) | return 0 | endif
let l:cur = emmet#util#getcurpos()[1:2] let cur = emmet#util#getcurpos()[1:2]
return emmet#util#pointInRegion(l:cur, a:region) return emmet#util#pointInRegion(cur, a:region)
endfunction endfunction
" region_is_valid : check region is valid " region_is_valid : check region is valid
@@ -93,11 +107,11 @@ endfunction
" search_region : make region from pattern which is composing start/end " search_region : make region from pattern which is composing start/end
" this function return array of position " this function return array of position
function! emmet#util#searchRegion(start, end) abort function! emmet#util#searchRegion(start, end) abort
let l:b = searchpairpos(a:start, '', a:end, 'bcnW') let b = searchpairpos(a:start, '', a:end, 'bcnW')
if l:b == [0, 0] if b == [0, 0]
return [searchpairpos(a:start, '', a:end, 'bnW'), searchpairpos(a:start, '\%#', a:end, 'nW')] return [searchpairpos(a:start, '', a:end, 'bnW'), searchpairpos(a:start, '\%#', a:end, 'nW')]
else else
return [l:b, searchpairpos(a:start, '', a:end. '', 'nW')] return [b, searchpairpos(a:start, '', a:end. '', 'nW')]
endif endif
endfunction endfunction
@@ -107,14 +121,14 @@ function! emmet#util#getContent(region) abort
if !emmet#util#regionIsValid(a:region) if !emmet#util#regionIsValid(a:region)
return '' return ''
endif endif
let l:lines = getline(a:region[0][0], a:region[1][0]) let lines = getline(a:region[0][0], a:region[1][0])
if a:region[0][0] == a:region[1][0] if a:region[0][0] == a:region[1][0]
let l:lines[0] = l:lines[0][a:region[0][1]-1:a:region[1][1]-1] let lines[0] = lines[0][a:region[0][1]-1:a:region[1][1]-1]
else else
let l:lines[0] = l:lines[0][a:region[0][1]-1:] let lines[0] = lines[0][a:region[0][1]-1:]
let l:lines[-1] = l:lines[-1][:a:region[1][1]-1] let lines[-1] = lines[-1][:a:region[1][1]-1]
endif endif
return join(l:lines, "\n") return join(lines, "\n")
endfunction endfunction
" region_in_region : check region is in the region " region_in_region : check region is in the region
@@ -135,147 +149,146 @@ endfunction
"============================================================================== "==============================================================================
" html utils " html utils
"============================================================================== "==============================================================================
function! s:splitHeaderBody(res) abort
let l:pos = stridx(a:res, "\r\n\r\n")
if l:pos != -1
return [l:pos, strpart(a:res, l:pos+4)]
endif
let l:pos = stridx(a:res, "\n\n")
return [l:pos, strpart(a:res, l:pos+2)]
endfunction
function! emmet#util#getContentFromURL(url) abort function! emmet#util#getContentFromURL(url) abort
let l:res = system(printf('%s -i %s', g:emmet_curl_command, shellescape(substitute(a:url, '#.*', '', '')))) let res = system(printf('%s -i %s', g:emmet_curl_command, shellescape(substitute(a:url, '#.*', '', ''))))
while l:res =~# '^HTTP/1.\d 3' || l:res =~# '^HTTP/1\.\d 200 Connection established' || l:res =~# '^HTTP/1\.\d 100 Continue' while res =~# '^HTTP/1.\d 3' || res =~# '^HTTP/1\.\d 200 Connection established' || res =~# '^HTTP/1\.\d 100 Continue'
let [l:pos, l:res] = s:splitHeaderBody(l:res) let pos = stridx(res, "\r\n\r\n")
if pos != -1
let res = strpart(res, pos+4)
else
let pos = stridx(res, "\n\n")
let res = strpart(res, pos+2)
endif
endwhile endwhile
let [l:pos, l:content] = s:splitHeaderBody(l:res) let pos = stridx(res, "\r\n\r\n")
let l:header = l:res[:l:pos-1] if pos != -1
let l:charset = matchstr(l:content, '<meta[^>]\+content=["''][^;"'']\+;\s*charset=\zs[^;"'']\+\ze["''][^>]*>') let content = strpart(res, pos+4)
if len(l:charset) == 0 else
let l:charset = matchstr(l:content, '<meta\s\+charset=["'']\?\zs[^"'']\+\ze["'']\?[^>]*>') let pos = stridx(res, "\n\n")
let content = strpart(res, pos+2)
endif endif
if len(l:charset) == 0 let header = res[:pos-1]
let l:charset = matchstr(l:header, '\nContent-Type:.* charset=[''"]\?\zs[^''";\n]\+\ze') let charset = matchstr(content, '<meta[^>]\+content=["''][^;"'']\+;\s*charset=\zs[^;"'']\+\ze["''][^>]*>')
if len(charset) == 0
let charset = matchstr(content, '<meta\s\+charset=["'']\?\zs[^"'']\+\ze["'']\?[^>]*>')
endif endif
if len(l:charset) == 0 if len(charset) == 0
let l:s1 = len(split(l:content, '?')) let charset = matchstr(header, '\nContent-Type:.* charset=[''"]\?\zs[^''";\n]\+\ze')
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
endif endif
return iconv(l:content, l:charset, &encoding) 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(content, charset, &encoding)
endfunction endfunction
function! emmet#util#getTextFromHTML(buf) abort function! emmet#util#getTextFromHTML(buf) abort
let l:threshold_len = 100 let threshold_len = 100
let l:threshold_per = 0.1 let threshold_per = 0.1
let l:buf = a:buf let buf = a:buf
let l:buf = strpart(l:buf, stridx(l:buf, '</head>')) let buf = strpart(buf, stridx(buf, '</head>'))
let l:buf = substitute(l:buf, '<style[^>]*>.\{-}</style>', '', 'g') let buf = substitute(buf, '<style[^>]*>.\{-}</style>', '', 'g')
let l:buf = substitute(l:buf, '<script[^>]*>.\{-}</script>', '', 'g') let buf = substitute(buf, '<script[^>]*>.\{-}</script>', '', 'g')
let l:res = '' let res = ''
let l:max = 0 let max = 0
let l:mx = '\(<td[^>]\{-}>\)\|\(<\/td>\)\|\(<div[^>]\{-}>\)\|\(<\/div>\)' let mx = '\(<td[^>]\{-}>\)\|\(<\/td>\)\|\(<div[^>]\{-}>\)\|\(<\/div>\)'
let l:m = split(l:buf, l:mx) let m = split(buf, mx)
for l:str in l:m for str in m
let l:c = split(l:str, '<[^>]*?>') let c = split(str, '<[^>]*?>')
let l:str = substitute(l:str, '<[^>]\{-}>', ' ', 'g') let str = substitute(str, '<[^>]\{-}>', ' ', 'g')
let l:str = substitute(l:str, '&gt;', '>', 'g') let str = substitute(str, '&gt;', '>', 'g')
let l:str = substitute(l:str, '&lt;', '<', 'g') let str = substitute(str, '&lt;', '<', 'g')
let l:str = substitute(l:str, '&quot;', '"', 'g') let str = substitute(str, '&quot;', '"', 'g')
let l:str = substitute(l:str, '&apos;', '''', 'g') let str = substitute(str, '&apos;', '''', 'g')
let l:str = substitute(l:str, '&nbsp;', ' ', 'g') let str = substitute(str, '&nbsp;', ' ', 'g')
let l:str = substitute(l:str, '&yen;', '\&#65509;', 'g') let str = substitute(str, '&yen;', '\&#65509;', 'g')
let l:str = substitute(l:str, '&amp;', '\&', 'g') let str = substitute(str, '&amp;', '\&', 'g')
let l:str = substitute(l:str, '^\s*\(.*\)\s*$', '\1', '') let str = substitute(str, '^\s*\(.*\)\s*$', '\1', '')
let l:str = substitute(l:str, '\s\+', ' ', 'g') let str = substitute(str, '\s\+', ' ', 'g')
let l:l = len(l:str) let l = len(str)
if l:l > l:threshold_len if l > threshold_len
let l:per = (l:l+0.0) / len(l:c) let per = (l+0.0) / len(c)
if l:max < l:l && l:per > l:threshold_per if max < l && per > threshold_per
let l:max = l:l let max = l
let l:res = l:str let res = str
endif endif
endif endif
endfor endfor
let l:res = substitute(l:res, '^\s*\(.*\)\s*$', '\1', 'g') let res = substitute(res, '^\s*\(.*\)\s*$', '\1', 'g')
return l:res return res
endfunction
function! s:resolveAndReadHex(fn) abort
let l:fn = a:fn
if filereadable(l:fn)
return substitute(system('xxd -p '.shellescape(l:fn)), '\n', '', 'g')
endif
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
return substitute(system(g:emmet_curl_command.' '.shellescape(l:fn).' | xxd -p'), '\n', '', 'g')
endfunction endfunction
function! emmet#util#getImageSize(fn) abort function! emmet#util#getImageSize(fn) abort
let l:fn = a:fn let fn = a:fn
if emmet#util#isImageMagickInstalled() if emmet#util#isImageMagickInstalled()
return emmet#util#imageSizeWithImageMagick(l:fn) return emmet#util#imageSizeWithImageMagick(fn)
endif endif
let l:hex = s:resolveAndReadHex(l:fn) if filereadable(fn)
let hex = substitute(system('xxd -p "'.fn.'"'), '\n', '', 'g')
let [l:width, l:height] = [-1, -1] else
if l:hex =~# '^89504e470d0a1a0a' if fn !~# '^\w\+://'
let l:width = eval('0x'.l:hex[32:39]) let path = fnamemodify(expand('%'), ':p:gs?\\?/?')
let l:height = eval('0x'.l:hex[40:47]) if has('win32') || has('win64') |
let path = tolower(path)
endif
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(path, root) == 0
let v = g:emmet_docroot[k]
let fn = (len(v) == 0 ? k : v) . fn
break
endif
endfor
endif
let hex = substitute(system(g:emmet_curl_command.' "'.fn.'" | xxd -p'), '\n', '', 'g')
endif endif
if l:hex =~# '^ffd8'
let l:pos = 4 let [width, height] = [-1, -1]
while l:pos < len(l:hex) if hex =~# '^89504e470d0a1a0a'
let l:bs = l:hex[l:pos+0:l:pos+3] let width = eval('0x'.hex[32:39])
let l:pos += 4 let height = eval('0x'.hex[40:47])
if l:bs ==# 'ffc0' || l:bs ==# 'ffc2' endif
let l:pos += 6 if hex =~# '^ffd8'
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 pos = 4
let l:pos += 4 while pos < len(hex)
let l:width = eval('0x'.l:hex[l:pos+0:l:pos+1])*256 + eval('0x'.l:hex[l:pos+2:l:pos+3]) let 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 break
elseif l:bs =~# 'ffd[9a]' elseif bs =~# 'ffd[9a]'
break break
elseif l:bs =~# 'ff\(e[0-9a-e]\|fe\|db\|dd\|c4\)' elseif bs =~# 'ff\(e[0-9a-e]\|fe\|db\|dd\|c4\)'
let l:pos += (eval('0x'.l:hex[l:pos+0:l:pos+1])*256 + eval('0x'.l:hex[l:pos+2:l:pos+3])) * 2 let pos += (eval('0x'.hex[pos+0:pos+1])*256 + eval('0x'.hex[pos+2:pos+3])) * 2
endif endif
endwhile endwhile
endif endif
if l:hex =~# '^47494638' if hex =~# '^47494638'
let l:width = eval('0x'.l:hex[14:15].l:hex[12:13]) let width = eval('0x'.hex[14:15].hex[12:13])
let l:height = eval('0x'.l:hex[18:19].l:hex[16:17]) let height = eval('0x'.hex[18:19].hex[16:17])
endif endif
return [l:width, l:height] return [width, height]
endfunction endfunction
function! emmet#util#imageSizeWithImageMagick(fn) abort function! emmet#util#imageSizeWithImageMagick(fn) abort
let l:img_info = system('identify -format "%wx%h" '.shellescape(a:fn)) let img_info = system('identify -format "%wx%h" "'.a:fn.'"')
let l:img_size = split(substitute(l:img_info, '\n', '', ''), 'x') let img_size = split(substitute(img_info, '\n', '', ''), 'x')
if len(l:img_size) != 2 if len(img_size) != 2
return [-1, -1] return [-1, -1]
endif endif
return l:img_size return img_size
endfunction endfunction
function! emmet#util#isImageMagickInstalled() abort function! emmet#util#isImageMagickInstalled() abort
@@ -285,56 +298,16 @@ function! emmet#util#isImageMagickInstalled() abort
return executable('identify') return executable('identify')
endfunction 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:hex = s:resolveAndReadHex(a:fn)
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 function! emmet#util#unique(arr) abort
let l:m = {} let m = {}
let l:r = [] let r = []
for l:i in a:arr for i in a:arr
if !has_key(l:m, l:i) if !has_key(m, i)
let l:m[l:i] = 1 let m[i] = 1
call add(l:r, l:i) call add(r, i)
endif endif
endfor endfor
return l:r return r
endfunction endfunction
let s:seed = localtime() let s:seed = localtime()
@@ -348,27 +321,27 @@ function! emmet#util#rand() abort
endfunction endfunction
function! emmet#util#cache(name, ...) abort function! emmet#util#cache(name, ...) abort
let l:content = get(a:000, 0, '') let content = get(a:000, 0, '')
let l:dir = expand('~/.emmet/cache') let dir = expand('~/.emmet/cache')
if !isdirectory(l:dir) if !isdirectory(dir)
call mkdir(l:dir, 'p', 0700) call mkdir(dir, 'p', 0700)
endif endif
let l:file = l:dir . '/' . substitute(a:name, '\W', '_', 'g') let file = dir . '/' . substitute(a:name, '\W', '_', 'g')
if len(l:content) == 0 if len(content) == 0
if !filereadable(l:file) if !filereadable(file)
return '' return ''
endif endif
return join(readfile(l:file), "\n") return join(readfile(file), "\n")
endif endif
call writefile(split(l:content, "\n"), l:file) call writefile(split(content, "\n"), file)
endfunction endfunction
function! emmet#util#getcurpos() abort function! emmet#util#getcurpos() abort
let l:pos = getpos('.') let pos = getpos('.')
if mode(0) ==# 'i' && l:pos[2] > 0 if mode(0) ==# 'i' && pos[2] > 0
let l:pos[2] -=1 let pos[2] -=1
endif endif
return l:pos return pos
endfunction endfunction
function! emmet#util#closePopup() abort function! emmet#util#closePopup() abort
+11 -9
View File
@@ -148,19 +148,21 @@ You should copy this section and create new buffer, paste and write as
</p> </p>
</div> </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. When you want to expand word except html tokens like below, use this.
> >
<html>foo <html
>foo
< <
This will be expanded like: This will be expanded like:
> >
<html><foo></foo> <html
< ><foo></foo>
3. Update tag *emmet-update-tag* *<C-y>u* 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> <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: 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>,* 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* 1. Key mapping *emmet-customize-key-mappings*
To specify leading key for expanding or balance tag, or for all, 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>' let g:user_emmet_leader_key = '<C-y>'
< <
Note that to expand abbreviation a trailing ',' must be typed, so Note that to expand abbreviation a trailing ',' must be typed, so
the resultant keymap is '<C-y>,'. 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_expandabbr_key = '<C-y>,'
let g:user_emmet_expandword_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* 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. using |g:user_emmet_settings|. For details, see official site of Emmet.
For example, user can add following: For example, user can add following:
> >
Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Submodule docs deleted from ff5a094cc8
-24
View File
@@ -1,24 +0,0 @@
local M = {}
M.get_node_at_cursor = function()
local node = vim.treesitter.get_node()
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
+18 -33
View File
@@ -23,7 +23,6 @@
" | <head> " | <head>
" | <title></title> " | <title></title>
" | <meta charset="UTF-8"> " | <meta charset="UTF-8">
" | <meta name="viewport" content="width=device-width, initial-scale=1.0">
" | </head> " | </head>
" | <body> " | <body>
" | _ " | _
@@ -47,7 +46,7 @@
" Tips: " Tips:
" "
" You can customize behavior of expanding with overriding config. " 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 = { " let g:user_emmet_settings = {
" \ 'indentation' : ' ', " \ 'indentation' : ' ',
@@ -96,8 +95,8 @@ if !exists('g:user_emmet_leader_key')
endif endif
function! s:install_plugin(mode, buffer) function! s:install_plugin(mode, buffer)
let l:buffer = a:buffer ? '<buffer>' : '' let buffer = a:buffer ? '<buffer>' : ''
let l:items = [ let items = [
\ {'mode': 'i', 'var': 'user_emmet_expandabbr_key', 'key': ',', 'plug': 'emmet-expand-abbr', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#expandAbbr(0,"")<cr>'}, \ {'mode': 'i', 'var': 'user_emmet_expandabbr_key', 'key': ',', 'plug': 'emmet-expand-abbr', 'func': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#expandAbbr(0,"")<cr>'},
\ {'mode': 'n', 'var': 'user_emmet_expandabbr_key', 'key': ',', 'plug': 'emmet-expand-abbr', 'func': ':call emmet#expandAbbr(3,"")<cr>'}, \ {'mode': 'n', 'var': 'user_emmet_expandabbr_key', 'key': ',', 'plug': 'emmet-expand-abbr', 'func': ':call emmet#expandAbbr(3,"")<cr>'},
\ {'mode': 'v', 'var': 'user_emmet_expandabbr_key', 'key': ',', 'plug': 'emmet-expand-abbr', 'func': ':call emmet#expandAbbr(2,"")<cr>'}, \ {'mode': 'v', 'var': 'user_emmet_expandabbr_key', 'key': ',', 'plug': 'emmet-expand-abbr', 'func': ':call emmet#expandAbbr(2,"")<cr>'},
@@ -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': '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': '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': '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': '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': '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': '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': '<c-r>=emmet#util#closePopup()<cr><c-r>=emmet#moveNextPrev(0)<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': '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': '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': '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>'}, \ {'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': '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': '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': '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': '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': '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>'}, \ {'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': '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': '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': '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': 'v', 'var': 'user_emmet_mergelines_key', 'key': 'm', 'plug': 'emmet-merge-lines', 'func': ':call 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_codepretty_key', 'key': 'c', 'plug': 'emmet-code-pretty', 'func': ':call emmet#codePretty()<cr>'}, \ {'mode': 'v', 'var': 'user_emmet_codepretty_key', 'key': 'c', 'plug': 'emmet-code-pretty', 'func': ':call emmet#codePretty()<cr>'},
\] \]
let l:only_plug = get(g:, 'emmet_install_only_plug', 0) let only_plug = get(g:, 'emmet_install_only_plug', 0)
for l:item in l:items for item in items
if a:mode !=# 'a' && stridx(a:mode, l:item.mode) == -1 if a:mode !=# 'a' && stridx(a:mode, item.mode) == -1
continue continue
endif endif
exe l:item.mode . 'noremap '. l:buffer .' <plug>(' . l:item.plug . ') ' . l:item.func exe item.mode . 'noremap '. buffer .' <plug>(' . item.plug . ') ' . item.func
if l:item.var != '' && !l:only_plug if item.var != '' && !only_plug
if exists('g:' . l:item.var) if exists('g:' . item.var)
let l:key = eval('g:' . l:item.var) let key = eval('g:' . item.var)
else else
let l:key = g:user_emmet_leader_key . l:item.key let key = g:user_emmet_leader_key . item.key
endif endif
if !hasmapto('<plug>(' . l:item.plug . ')', l:item.mode) && !len(maparg(l:key, l:item.mode)) if !hasmapto('<plug>(' . item.plug . ')', item.mode) && !len(maparg(key, item.mode))
exe l:item.mode . 'map ' . l:buffer . ' <unique> <silent>' . l:key . ' <plug>(' . l:item.plug . ')' exe item.mode . 'map ' . buffer . ' <unique> ' . key . ' <plug>(' . item.plug . ')'
endif endif
endif endif
endfor endfor
@@ -175,17 +171,6 @@ if get(g:, 'user_emmet_install_command', 1)
command! -nargs=1 Emmet call emmet#expandAbbr(4, <q-args>) command! -nargs=1 Emmet call emmet#expandAbbr(4, <q-args>)
endif endif
function! s:setup_styledEmmetAbbreviation() abort
if index(['javascript', 'javascriptreact', 'typescript', 'typescriptreact'], &filetype) != -1
syntax match styledEmmetAbbreviation "[a-z0-9#+!%]\+" containedin=styledDefinition contained
endif
endfunction
augroup ___emmet_setup___
au!
autocmd Syntax * call s:setup_styledEmmetAbbreviation()
augroup END
let &cpoptions = s:save_cpo let &cpoptions = s:save_cpo
unlet s:save_cpo unlet s:save_cpo
-36
View File
@@ -1,36 +0,0 @@
let s:helper = {}
function! s:helper.setup() abort
let g:user_emmet_settings = {'variables': {'indentation': "\t", 'use_selection': 1}}
exe 'so' getcwd() . '/plugin/emmet.vim'
endfunction
function! s:helper.expand_word(query, type) abort
return emmet#expandWord(a:query, a:type, 0)
endfunction
function! s:helper.expand_in_buffer(query, type, result) abort
silent! 1new
silent! exe 'setlocal ft=' . a:type
EmmetInstall
let l:key = matchstr(a:query, '.*\$\$\$\$\zs.*\ze\$\$\$\$')
if len(l:key) > 0
exe printf('let l:key = "%s"', l:key)
else
let l:key = "\<c-y>,"
endif
let l:q = substitute(a:query, '\$\$\$\$.*\$\$\$\$', '$$$$', '')
call setline(1, split(l:q, "\n"))
let l:cmd = "normal gg0/\\$\\$\\$\\$\ri\<del>\<del>\<del>\<del>" . l:key
if stridx(a:result, '$$$$') != -1
let l:cmd .= '$$$$'
endif
silent! exe l:cmd
let l:res = join(getline(1, line('$')), "\n")
silent! bw!
return l:res
endfunction
function! themis#helper#emmet#new(runner) abort
return deepcopy(s:helper)
endfunction
-144
View File
@@ -1,144 +0,0 @@
Describe css
Describe expand abbreviation
It expands font-style normal
let res = ExpandInBuffer('{fs:n$$$$}', 'css', '{font-style: normal;}')
Assert Equals(res, '{font-style: normal;}')
End
It expands float left with fc filter
let res = ExpandInBuffer('{fl:l|fc$$$$}', 'css', '{float: left;}')
Assert Equals(res, '{float: left;}')
End
It expands background+
let res = ExpandInBuffer('{bg+$$$$}', 'css', '{background: $$$$#fff url() 0 0 no-repeat;}')
Assert Equals(res, '{background: $$$$#fff url() 0 0 no-repeat;}')
End
It expands background+ important
let res = ExpandInBuffer('{bg+!$$$$}', 'css', '{background: $$$$#fff url() 0 0 no-repeat !important;}')
Assert Equals(res, '{background: $$$$#fff url() 0 0 no-repeat !important;}')
End
It expands margin
let res = ExpandInBuffer('{m$$$$}', 'css', '{margin: $$$$;}')
Assert Equals(res, '{margin: $$$$;}')
End
It expands margin percent
let res = ExpandInBuffer('{m0.1p$$$$}', 'css', '{margin: 0.1%;}')
Assert Equals(res, '{margin: 0.1%;}')
End
It expands margin em
let res = ExpandInBuffer('{m1.0$$$$}', 'css', '{margin: 1.0em;}')
Assert Equals(res, '{margin: 1.0em;}')
End
It expands margin px
let res = ExpandInBuffer('{m2$$$$}', 'css', '{margin: 2px;}')
Assert Equals(res, '{margin: 2px;}')
End
It expands border-radius
let res = ExpandInBuffer('{bdrs10$$$$}', 'css', '{border-radius: 10px;}')
Assert Equals(res, '{border-radius: 10px;}')
End
It expands vendor prefix border-radius
let res = ExpandInBuffer('{-bdrs20$$$$}', 'css', "{-webkit-border-radius: 20px;\n-moz-border-radius: 20px;\n-o-border-radius: 20px;\n-ms-border-radius: 20px;\nborder-radius: 20px;}")
Assert Equals(res, "{-webkit-border-radius: 20px;\n-moz-border-radius: 20px;\n-o-border-radius: 20px;\n-ms-border-radius: 20px;\nborder-radius: 20px;}")
End
It expands linear-gradient
let res = ExpandInBuffer('{lg(top,#fff,#000)$$$$}', 'css', "{background-image: -webkit-gradient(top, 0 0, 0 100%, from(#fff), to(#000));\nbackground-image: -webkit-linear-gradient(#fff, #000);\nbackground-image: -moz-linear-gradient(#fff, #000);\nbackground-image: -o-linear-gradient(#fff, #000);\nbackground-image: linear-gradient(#fff, #000);\n}")
Assert Equals(res, "{background-image: -webkit-gradient(top, 0 0, 0 100%, from(#fff), to(#000));\nbackground-image: -webkit-linear-gradient(#fff, #000);\nbackground-image: -moz-linear-gradient(#fff, #000);\nbackground-image: -o-linear-gradient(#fff, #000);\nbackground-image: linear-gradient(#fff, #000);\n}")
End
It expands margin multi value
let res = ExpandInBuffer('{m10-5-0$$$$}', 'css', '{margin: 10px 5px 0;}')
Assert Equals(res, '{margin: 10px 5px 0;}')
End
It expands margin negative
let res = ExpandInBuffer('{m-10--5$$$$}', 'css', '{margin: -10px -5px;}')
Assert Equals(res, '{margin: -10px -5px;}')
End
It expands margin auto
let res = ExpandInBuffer('{m10-auto$$$$}', 'css', '{margin: 10px auto;}')
Assert Equals(res, '{margin: 10px auto;}')
End
It expands width percent
let res = ExpandInBuffer('{w100p$$$$}', 'css', '{width: 100%;}')
Assert Equals(res, '{width: 100%;}')
End
It expands height em
let res = ExpandInBuffer('{h50e$$$$}', 'css', '{height: 50em;}')
Assert Equals(res, '{height: 50em;}')
End
It expands multi property group
let res = ExpandInBuffer('{(bg+)+c$$$$}', 'css', "{background: $$$$#fff url() 0 0 no-repeat;\ncolor: #000;}")
Assert Equals(res, "{background: $$$$#fff url() 0 0 no-repeat;\ncolor: #000;}")
End
It expands multi property
let res = ExpandInBuffer('{m0+bgi+bg++p0$$$$}', 'css', "{margin: 0;\nbackground-image: url($$$$);\nbackground: #fff url() 0 0 no-repeat;\npadding: 0;}")
Assert Equals(res, "{margin: 0;\nbackground-image: url($$$$);\nbackground: #fff url() 0 0 no-repeat;\npadding: 0;}")
End
It expands fuzzy border-left
let res = ExpandInBuffer('{borle$$$$}', 'css', '{border-left: $$$$;}')
Assert Equals(res, '{border-left: $$$$;}')
End
It expands color shorthand
let res = ExpandInBuffer('{c#dba$$$$}', 'css', '{color: rgb(221, 187, 170);}')
Assert Equals(res, '{color: rgb(221, 187, 170);}')
End
It expands color shorthand with alpha
let res = ExpandInBuffer('{c#dba.7$$$$}', 'css', '{color: rgb(221, 187, 170, 0.7);}')
Assert Equals(res, '{color: rgb(221, 187, 170, 0.7);}')
End
It expands display none
let res = ExpandInBuffer('{dn$$$$}', 'css', '{display: none;}')
Assert Equals(res, '{display: none;}')
End
It expands padding with percent sign
let res = ExpandInBuffer('{p10%$$$$}', 'css', '{padding: 10%;}')
Assert Equals(res, '{padding: 10%;}')
End
It expands padding with p suffix
let res = ExpandInBuffer('{p10p$$$$}', 'css', '{padding: 10%;}')
Assert Equals(res, '{padding: 10%;}')
End
It expands padding with e suffix
let res = ExpandInBuffer('{p10e$$$$}', 'css', '{padding: 10em;}')
Assert Equals(res, '{padding: 10em;}')
End
It expands padding with em suffix
let res = ExpandInBuffer('{p10em$$$$}', 'css', '{padding: 10em;}')
Assert Equals(res, '{padding: 10em;}')
End
It expands padding with re suffix
let res = ExpandInBuffer('{p10re$$$$}', 'css', '{padding: 10rem;}')
Assert Equals(res, '{padding: 10rem;}')
End
It expands padding with rem suffix
let res = ExpandInBuffer('{p10rem$$$$}', 'css', '{padding: 10rem;}')
Assert Equals(res, '{padding: 10rem;}')
End
End
End
-48
View File
@@ -1,48 +0,0 @@
Describe haml
Describe expand abbreviation
It expands complex
Assert Equals(ExpandWord('div>p+ul#foo>li.bar$[foo=bar][bar=baz]*3>{baz}', 'haml'), "%div\n %p\n %ul#foo\n %li.bar1{ :foo => \"bar\", :bar => \"baz\" } baz\n %li.bar2{ :foo => \"bar\", :bar => \"baz\" } baz\n %li.bar3{ :foo => \"bar\", :bar => \"baz\" } baz\n")
End
It expands with haml filter
Assert Equals(ExpandWord('div>p+ul#foo>li.bar$[foo=bar][bar=baz]*3>{baz}|haml', 'haml'), "%div\n %p\n %ul#foo\n %li.bar1{ :foo => \"bar\", :bar => \"baz\" } baz\n %li.bar2{ :foo => \"bar\", :bar => \"baz\" } baz\n %li.bar3{ :foo => \"bar\", :bar => \"baz\" } baz\n")
End
It expands a multiplier
Assert Equals(ExpandWord('a*3|haml', 'haml'), "%a{ :href => \"\" }\n%a{ :href => \"\" }\n%a{ :href => \"\" }\n")
End
It expands class with text
Assert Equals(ExpandWord('.content{Hello!}|haml', 'haml'), "%div.content Hello!\n")
End
It expands title dollar hash
Assert Equals(ExpandWord('a[title=$#]{foo}', 'haml'), "%a{ :href => \"\", :title => \"foo\" } foo\n")
End
End
Describe split join
It joins
let res = ExpandInBuffer("%a foo\n bar$$$$\\<c-y>j$$$$", 'haml', '%a ')
Assert Equals(res, '%a ')
End
It splits
let res = ExpandInBuffer("$$$$\\<c-y>j$$$$%a ", 'haml', '%a $$$$')
Assert Equals(res, '%a $$$$')
End
End
Describe toggle comment
It adds comment
let res = ExpandInBuffer('%a{ :href => "http://www.google.com"$$$$\<c-y>/$$$$ } hello', 'haml', '-# %a{ :href => "http://www.google.com" } hello')
Assert Equals(res, '-# %a{ :href => "http://www.google.com" } hello')
End
It removes comment
let res = ExpandInBuffer('-# %a{ :href => "http://www.google.com"$$$$\<c-y>/$$$$ } hello', 'haml', '%a{ :href => "http://www.google.com" } hello')
Assert Equals(res, '%a{ :href => "http://www.google.com" } hello')
End
End
End
-487
View File
@@ -1,487 +0,0 @@
Describe html
Describe expand abbreviation
It expands div
Assert Equals(ExpandWord('div', 'html'), "<div></div>\n")
End
It expands div with id
Assert Equals(ExpandWord('div#wrapper', 'html'), "<div id=\"wrapper\"></div>\n")
End
It expands div with class
Assert Equals(ExpandWord('div.box', 'html'), "<div class=\"box\"></div>\n")
End
It expands a with title attribute
Assert Equals(ExpandWord('a[title=TITLE]', 'html'), "<a href=\"\" title=\"TITLE\"></a>\n")
End
It expands div with id and class
Assert Equals(ExpandWord('div#wrapper.box', 'html'), "<div id=\"wrapper\" class=\"box\"></div>\n")
End
It expands div with id and multiple classes
Assert Equals(ExpandWord('div#wrapper.box.current', 'html'), "<div id=\"wrapper\" class=\"box current\"></div>\n")
End
It expands div with id, classes and attributes
Assert Equals(ExpandWord('div#wrapper.box.current[title=TITLE rel]', 'html'), "<div id=\"wrapper\" class=\"box current\" title=\"TITLE\" rel=\"\"></div>\n")
End
It expands sibling divs
Assert Equals(ExpandWord('div#main+div#sub', 'html'), "<div id=\"main\"></div>\n<div id=\"sub\"></div>\n")
End
It expands child div
Assert Equals(ExpandWord('div#main>div#sub', 'html'), "<div id=\"main\">\n\t<div id=\"sub\"></div>\n</div>\n")
End
It expands html:xt complex
Assert Equals(ExpandWord('html:xt>div#header>div#logo+ul#nav>li.item-$*5>a', 'html'), "<!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>")
End
It expands ol with li multiplier
Assert Equals(ExpandWord('ol>li*2', 'html'), "<ol>\n\t<li></li>\n\t<li></li>\n</ol>\n")
End
It expands a with default attribute
Assert Equals(ExpandWord('a', 'html'), "<a href=\"\"></a>\n")
End
It expands obj alias
Assert Equals(ExpandWord('obj', 'html'), "<object data=\"\" type=\"\"></object>\n")
End
It expands cc:ie6 complex
Assert Equals(ExpandWord('cc:ie6>p+blockquote#sample$.so.many.classes*2', 'html'), "<!--[if lte IE 6]>\n\t<p></p>\n\t<blockquote id=\"sample1\" class=\"so many classes\"></blockquote>\n\t<blockquote id=\"sample2\" class=\"so many classes\"></blockquote>\n\t\n<![endif]-->")
End
It expands html:4t complex
Assert Equals(ExpandWord('html:4t>div#wrapper>div#header+div#contents+div#footer', 'html'), "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html 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=\"wrapper\">\n\t\t<div id=\"header\"></div>\n\t\t<div id=\"contents\"></div>\n\t\t<div id=\"footer\"></div>\n\t</div>\n\t\n</body>\n</html>")
End
It expands a with href, class and id
Assert Equals(ExpandWord('a[href=http://www.google.com/].foo#hoge', 'html'), "<a id=\"hoge\" class=\"foo\" href=\"http://www.google.com/\"></a>\n")
End
It expands a with href and text
Assert Equals(ExpandWord('a[href=http://www.google.com/]{Google}', 'html'), "<a href=\"http://www.google.com/\">Google</a>\n")
End
It expands text only
Assert Equals(ExpandWord('{Emmet}', 'html'), 'Emmet')
End
It expands a+b
Assert Equals(ExpandWord('a+b', 'html'), "<a href=\"\"></a>\n<b></b>\n")
End
It climbs up with <
Assert Equals(ExpandWord('a>b>i<b', 'html'), "<a href=\"\"><b><i></i></b><b></b></a>\n")
End
It climbs up with ^
Assert Equals(ExpandWord('a>b>i^b', 'html'), "<a href=\"\"><b><i></i></b><b></b></a>\n")
End
It climbs up double with <<
Assert Equals(ExpandWord('a>b>i<<b', 'html'), "<a href=\"\"><b><i></i></b></a>\n<b></b>\n")
End
It climbs up double with ^^
Assert Equals(ExpandWord('a>b>i^^b', 'html'), "<a href=\"\"><b><i></i></b></a>\n<b></b>\n")
End
It climbs up blockquote with <<
Assert Equals(ExpandWord('blockquote>b>i<<b', 'html'), "<blockquote>\n\t<b><i></i></b>\n</blockquote>\n<b></b>\n")
End
It climbs up blockquote with ^^
Assert Equals(ExpandWord('blockquote>b>i^^b', 'html'), "<blockquote>\n\t<b><i></i></b>\n</blockquote>\n<b></b>\n")
End
It expands multiple attributes
Assert Equals(ExpandWord('a[href=foo][class=bar]', 'html'), "<a class=\"bar\" href=\"foo\"></a>\n")
End
It expands complex attrs with multiplier
Assert Equals(ExpandWord('a[a=b][b=c=d][e]{foo}*2', 'html'), "<a href=\"e\" a=\"b\" b=\"c=d\">foo</a>\n<a href=\"e\" a=\"b\" b=\"c=d\">foo</a>\n")
End
It expands attrs multiplier text after
Assert Equals(ExpandWord('a[a=b][b=c=d][e]*2{foo}', 'html'), "<a href=\"e\" a=\"b\" b=\"c=d\"></a>\n<a href=\"e\" a=\"b\" b=\"c=d\"></a>\nfoo")
End
It expands multiplier text tag
Assert Equals(ExpandWord('a*2{foo}a', 'html'), "<a href=\"\"></a>\n<a href=\"\"></a>\nfoo<a href=\"\"></a>\n")
End
It expands text multiplier child
Assert Equals(ExpandWord('a{foo}*2>b', 'html'), "<a href=\"\">foo<b></b></a>\n<a href=\"\">foo<b></b></a>\n")
End
It expands multiplier text child
Assert Equals(ExpandWord('a*2{foo}>b', 'html'), "<a href=\"\"></a>\n<a href=\"\"></a>\nfoo")
End
It expands table complex
Assert Equals(ExpandWord('table>tr>td.name#foo+td*3', 'html'), "<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")
End
It expands sibling ids
Assert Equals(ExpandWord('div#header+div#footer', 'html'), "<div id=\"header\"></div>\n<div id=\"footer\"></div>\n")
End
It expands implicit div sibling
Assert Equals(ExpandWord('#header+div#footer', 'html'), "<div id=\"header\"></div>\n<div id=\"footer\"></div>\n")
End
It climbs up with text using <
Assert Equals(ExpandWord('#header>ul>li<p{Footer}', 'html'), "<div id=\"header\">\n\t<ul>\n\t\t<li></li>\n\t</ul>\n\t<p>Footer</p>\n</div>\n")
End
It climbs up with text using ^
Assert Equals(ExpandWord('#header>ul>li^p{Footer}', 'html'), "<div id=\"header\">\n\t<ul>\n\t\t<li></li>\n\t</ul>\n\t<p>Footer</p>\n</div>\n")
End
It expands dollar padding
Assert Equals(ExpandWord('a#foo$$$*3', 'html'), "<a id=\"foo001\" href=\"\"></a>\n<a id=\"foo002\" href=\"\"></a>\n<a id=\"foo003\" href=\"\"></a>\n")
End
It expands ul expando
Assert Equals(ExpandWord('ul+', 'html'), "<ul>\n\t<li></li>\n</ul>\n")
End
It expands table expando
Assert Equals(ExpandWord('table+', 'html'), "<table>\n\t<tr>\n\t\t<td></td>\n\t</tr>\n</table>\n")
End
It climbs header to content with <
Assert Equals(ExpandWord('#header>li<#content', 'html'), "<div id=\"header\">\n\t<li></li>\n</div>\n<div id=\"content\"></div>\n")
End
It climbs header to content with ^
Assert Equals(ExpandWord('#header>li^#content', 'html'), "<div id=\"header\">\n\t<li></li>\n</div>\n<div id=\"content\"></div>\n")
End
It climbs group with <
Assert Equals(ExpandWord('(#header>li)<#content', 'html'), "<div id=\"header\">\n\t<li></li>\n</div>\n<div id=\"content\"></div>\n")
End
It climbs group with ^
Assert Equals(ExpandWord('(#header>li)^#content', 'html'), "<div id=\"header\">\n\t<li></li>\n</div>\n<div id=\"content\"></div>\n")
End
It climbs double to div with <<
Assert Equals(ExpandWord('a>b>i<<div', 'html'), "<a href=\"\"><b><i></i></b></a>\n<div></div>\n")
End
It climbs double to div with ^^
Assert Equals(ExpandWord('a>b>i^^div', 'html'), "<a href=\"\"><b><i></i></b></a>\n<div></div>\n")
End
It expands group siblings
Assert Equals(ExpandWord('(#header>h1)+#content+#footer', 'html'), "<div id=\"header\">\n\t<h1></h1>\n</div>\n<div id=\"content\"></div>\n<div id=\"footer\"></div>\n")
End
It expands complex nested groups
Assert Equals(ExpandWord('(#header>h1)+(#content>(#main>h2+div#entry$.section*5>(h3>a)+div>p*3+ul+)+(#utilities))+(#footer>address)', 'html'), "<div id=\"header\">\n\t<h1></h1>\n</div>\n<div id=\"content\">\n\t<div id=\"main\">\n\t\t<h2></h2>\n\t\t<div id=\"entry1\" class=\"section\">\n\t\t\t<h3><a href=\"\"></a></h3>\n\t\t\t<div>\n\t\t\t\t<p></p>\n\t\t\t\t<p></p>\n\t\t\t\t<p></p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li></li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\t\t<div id=\"entry2\" class=\"section\">\n\t\t\t<h3><a href=\"\"></a></h3>\n\t\t\t<div>\n\t\t\t\t<p></p>\n\t\t\t\t<p></p>\n\t\t\t\t<p></p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li></li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\t\t<div id=\"entry3\" class=\"section\">\n\t\t\t<h3><a href=\"\"></a></h3>\n\t\t\t<div>\n\t\t\t\t<p></p>\n\t\t\t\t<p></p>\n\t\t\t\t<p></p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li></li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\t\t<div id=\"entry4\" class=\"section\">\n\t\t\t<h3><a href=\"\"></a></h3>\n\t\t\t<div>\n\t\t\t\t<p></p>\n\t\t\t\t<p></p>\n\t\t\t\t<p></p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li></li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\t\t<div id=\"entry5\" class=\"section\">\n\t\t\t<h3><a href=\"\"></a></h3>\n\t\t\t<div>\n\t\t\t\t<p></p>\n\t\t\t\t<p></p>\n\t\t\t\t<p></p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li></li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div id=\"utilities\"></div>\n</div>\n<div id=\"footer\">\n\t<address></address>\n</div>\n")
End
It expands nested multiplier groups
Assert Equals(ExpandWord('(div>(ul*2)*2)+(#utilities)', 'html'), "<div>\n\t<ul></ul>\n\t<ul></ul>\n\t<ul></ul>\n\t<ul></ul>\n</div>\n<div id=\"utilities\"></div>\n")
End
It expands table multiplier group
Assert Equals(ExpandWord('table>(tr>td*3)*4', 'html'), "<table>\n\t<tr>\n\t\t<td></td>\n\t\t<td></td>\n\t\t<td></td>\n\t</tr>\n\t<tr>\n\t\t<td></td>\n\t\t<td></td>\n\t\t<td></td>\n\t</tr>\n\t<tr>\n\t\t<td></td>\n\t\t<td></td>\n\t\t<td></td>\n\t</tr>\n\t<tr>\n\t\t<td></td>\n\t\t<td></td>\n\t\t<td></td>\n\t</tr>\n</table>\n")
End
It expands deep nested multiplier groups
Assert Equals(ExpandWord('(((a#foo+a#bar)*2)*3)', 'html'), "<a id=\"foo\" href=\"\"></a>\n<a id=\"bar\" href=\"\"></a>\n<a id=\"foo\" href=\"\"></a>\n<a id=\"bar\" href=\"\"></a>\n<a id=\"foo\" href=\"\"></a>\n<a id=\"bar\" href=\"\"></a>\n<a id=\"foo\" href=\"\"></a>\n<a id=\"bar\" href=\"\"></a>\n<a id=\"foo\" href=\"\"></a>\n<a id=\"bar\" href=\"\"></a>\n<a id=\"foo\" href=\"\"></a>\n<a id=\"bar\" href=\"\"></a>\n")
End
It expands multiplier with child
Assert Equals(ExpandWord('div#box$*3>h3+p*2', 'html'), "<div id=\"box1\">\n\t<h3></h3>\n\t<p></p>\n\t<p></p>\n</div>\n<div id=\"box2\">\n\t<h3></h3>\n\t<p></p>\n\t<p></p>\n</div>\n<div id=\"box3\">\n\t<h3></h3>\n\t<p></p>\n\t<p></p>\n</div>\n")
End
It expands dollar multi class
Assert Equals(ExpandWord('div#box.foo$$$.bar$$$*3', 'html'), "<div id=\"box\" class=\"foo001 bar001\"></div>\n<div id=\"box\" class=\"foo002 bar002\"></div>\n<div id=\"box\" class=\"foo003 bar003\"></div>\n")
End
It applies escape filter
Assert Equals(ExpandWord('div#box$*3>h3+p.bar*2|e', 'html'), "&lt;div id=\"box1\"&gt;\n\t&lt;h3&gt;&lt;/h3&gt;\n\t&lt;p class=\"bar\"&gt;&lt;/p&gt;\n\t&lt;p class=\"bar\"&gt;&lt;/p&gt;\n&lt;/div&gt;\n&lt;div id=\"box2\"&gt;\n\t&lt;h3&gt;&lt;/h3&gt;\n\t&lt;p class=\"bar\"&gt;&lt;/p&gt;\n\t&lt;p class=\"bar\"&gt;&lt;/p&gt;\n&lt;/div&gt;\n&lt;div id=\"box3\"&gt;\n\t&lt;h3&gt;&lt;/h3&gt;\n\t&lt;p class=\"bar\"&gt;&lt;/p&gt;\n\t&lt;p class=\"bar\"&gt;&lt;/p&gt;\n&lt;/div&gt;\n")
End
It applies comment filter
Assert Equals(ExpandWord('div>div#page>p.title+p|c', 'html'), "<div>\n\t<!-- #page -->\n\t<div id=\"page\">\n\t\t<!-- .title -->\n\t\t<p class=\"title\"></p>\n\t\t<!-- /.title -->\n\t\t<p></p>\n\t</div>\n\t<!-- /#page -->\n</div>\n")
End
It applies single line filter
Assert Equals(ExpandWord('kbd*2|s', 'html'), '<kbd></kbd><kbd></kbd>')
End
It expands link:css
Assert Equals(ExpandWord('link:css', 'html'), "<link rel=\"stylesheet\" href=\"style.css\" media=\"all\">\n")
End
It expands attribute with quote
Assert Equals(ExpandWord("a[title=\"Hello', world\" rel]", 'html'), "<a href=\"\" title=\"Hello', world\" rel=\"\"></a>\n")
End
It expands child with text
Assert Equals(ExpandWord('div>a#foo{bar}', 'html'), "<div><a id=\"foo\" href=\"\">bar</a></div>\n")
End
It expands class with text
Assert Equals(ExpandWord('.content{Hello!}', 'html'), "<div class=\"content\">Hello!</div>\n")
End
It expands logo group siblings
Assert Equals(ExpandWord('div.logo+(div#navigation)+(div#links)', 'html'), "<div class=\"logo\"></div>\n<div id=\"navigation\"></div>\n<div id=\"links\"></div>\n")
End
It expands mixed text and tags
Assert Equals(ExpandWord('h1{header}+{Text}+a[href=http://link.org]{linktext}+{again some text}+a[href=http://anoterlink.org]{click me!}+{some final text}', 'html'), "<h1>header</h1>\nText<a href=\"http://link.org\">linktext</a>\nagain some text<a href=\"http://anoterlink.org\">click me!</a>\nsome final text")
End
It expands ampersand text
Assert Equals(ExpandWord('a{&}+div{&&}', 'html'), "<a href=\"\">&</a>\n<div>&&</div>\n")
End
It expands span after tag in buffer
let res = ExpandInBuffer('<foo/>span$$$$\<c-y>,$$$$', 'html', '<foo/><span></span>')
Assert Equals(res, '<foo/><span></span>')
End
It expands span after text in buffer
let res = ExpandInBuffer('foo span$$$$\<c-y>,$$$$', 'html', 'foo <span></span>')
Assert Equals(res, 'foo <span></span>')
End
It expands span between text in buffer
let res = ExpandInBuffer('foo span$$$$\<c-y>,$$$$ bar', 'html', 'foo <span></span> bar')
Assert Equals(res, 'foo <span></span> bar')
End
It wraps visual word (skip: ex mode)
if mode() ==# 'c'
Skip not supported in ex mode
endif
let res = ExpandInBuffer("foo $$$$\\<c-o>ve\\<c-y>,p\\<cr>$$$$bar baz", 'html', 'foo <p>bar</p> baz')
Assert Equals(res, 'foo <p>bar</p> baz')
End
It wraps visual multi word (skip: ex mode)
if mode() ==# 'c'
Skip not supported in ex mode
endif
let res = ExpandInBuffer("foo $$$$\\<c-o>vee\\<c-y>,p\\<cr>$$$$bar baz", 'html', 'foo <p>bar baz</p>')
Assert Equals(res, 'foo <p>bar baz</p>')
End
It expands complex nested in buffer
let res = ExpandInBuffer("f div.boxes>article.box2>header>(hgroup>h2{aaa}+h3{bbb})+p{ccc}$$$$", 'html', "f <div class=\"boxes\">\n\t<article class=\"box2\">\n\t\t<header>\n\t\t\t<hgroup>\n\t\t\t\t<h2>aaa</h2>\n\t\t\t\t<h3>bbb</h3>\n\t\t\t</hgroup>\n\t\t\t<p>ccc</p>\n\t\t</header>\n\t</article>\n</div>")
Assert Equals(res, "f <div class=\"boxes\">\n\t<article class=\"box2\">\n\t\t<header>\n\t\t\t<hgroup>\n\t\t\t\t<h2>aaa</h2>\n\t\t\t\t<h3>bbb</h3>\n\t\t\t</hgroup>\n\t\t\t<p>ccc</p>\n\t\t</header>\n\t</article>\n</div>")
End
It expands complex boxes
Assert Equals(ExpandWord("div.boxes>(div.box2>section>h2{a}+p{b})+(div.box1>section>h2{c}+p{d}+p{e}+(bq>h2{f}+h3{g})+p{h})", 'html'), "<div class=\"boxes\">\n\t<div class=\"box2\">\n\t\t<section>\n\t\t\t<h2>a</h2>\n\t\t\t<p>b</p>\n\t\t</section>\n\t</div>\n\t<div class=\"box1\">\n\t\t<section>\n\t\t\t<h2>c</h2>\n\t\t\t<p>d</p>\n\t\t\t<p>e</p>\n\t\t\t<blockquote>\n\t\t\t\t<h2>f</h2>\n\t\t\t\t<h3>g</h3>\n\t\t\t</blockquote>\n\t\t\t<p>h</p>\n\t\t</section>\n\t</div>\n</div>\n")
End
It expands label input group
Assert Equals(ExpandWord('(div>(label+input))+div', 'html'), "<div>\n\t<label for=\"\"></label>\n\t<input type=\"\">\n</div>\n<div></div>\n")
End
It wraps visual lines with multiplier (skip: ex mode)
if mode() ==# 'c'
Skip not supported in ex mode
endif
let res = ExpandInBuffer("test1\ntest2\ntest3$$$$\\<esc>ggVG\\<c-y>,ul>li>span*>a\\<cr>$$$$", 'html', "<ul>\n\t<li>\n\t\t<span><a href=\"\">test1</a></span>\n\t\t<span><a href=\"\">test2</a></span>\n\t\t<span><a href=\"\">test3</a></span>\n\t</li>\n</ul>")
Assert Equals(res, "<ul>\n\t<li>\n\t\t<span><a href=\"\">test1</a></span>\n\t\t<span><a href=\"\">test2</a></span>\n\t\t<span><a href=\"\">test3</a></span>\n\t</li>\n</ul>")
End
It wraps visual lines with input (skip: ex mode)
if mode() ==# 'c'
Skip not supported in ex mode
endif
let res = ExpandInBuffer("test1\ntest2\ntest3$$$$\\<esc>ggVG\\<c-y>,input[type=input value=$#]*\\<cr>$$$$", 'html', "<input type=\"input\" value=\"test1\">\n<input type=\"input\" value=\"test2\">\n<input type=\"input\" value=\"test3\">")
Assert Equals(res, "<input type=\"input\" value=\"test1\">\n<input type=\"input\" value=\"test2\">\n<input type=\"input\" value=\"test3\">")
End
It wraps visual lines with div id (skip: ex mode)
if mode() ==# 'c'
Skip not supported in ex mode
endif
let res = ExpandInBuffer("test1\ntest2\ntest3$$$$\\<esc>ggVG\\<c-y>,div[id=$#]*\\<cr>$$$$", 'html', "<div id=\"test1\"></div>\n<div id=\"test2\"></div>\n<div id=\"test3\"></div>")
Assert Equals(res, "<div id=\"test1\"></div>\n<div id=\"test2\"></div>\n<div id=\"test3\"></div>")
End
It expands nested id dollar
Assert Equals(ExpandWord('div#id-$*5>div#id2-$', 'html'), "<div id=\"id-1\">\n\t<div id=\"id2-1\"></div>\n</div>\n<div id=\"id-2\">\n\t<div id=\"id2-2\"></div>\n</div>\n<div id=\"id-3\">\n\t<div id=\"id2-3\"></div>\n</div>\n<div id=\"id-4\">\n\t<div id=\"id2-4\"></div>\n</div>\n<div id=\"id-5\">\n\t<div id=\"id2-5\"></div>\n</div>\n")
End
It expands implicit child attr
Assert Equals(ExpandWord('.foo>[bar=2]>.baz', 'html'), "<div class=\"foo\">\n\t<div bar=\"2\">\n\t\t<div class=\"baz\"></div>\n\t</div>\n</div>\n")
End
It expands text dollar
Assert Equals(ExpandWord('{test case $ }*3', 'html'), 'test case 1 test case 2 test case 3 ')
End
It expands text dollar newline
Assert Equals(ExpandWord('{test case $${nr}}*3', 'html'), "test case 1\ntest case 2\ntest case 3\n")
End
It expands text escaped dollar
Assert Equals(ExpandWord('{test case \$ }*3', 'html'), 'test case $ test case $ test case $ ')
End
It expands text dollar padding
Assert Equals(ExpandWord('{test case $$$ }*3', 'html'), 'test case 001 test case 002 test case 003 ')
End
It expands title dollar hash
Assert Equals(ExpandWord('a[title=$#]{foo}', 'html'), "<a href=\"\" title=\"foo\">foo</a>\n")
End
It expands span item dollar text
Assert Equals(ExpandWord('span.item$*2>{item $}', 'html'), "<span class=\"item1\">item 1</span>\n<span class=\"item2\">item 2</span>\n")
End
It wraps visual indented block (skip: ex mode)
if mode() ==# 'c'
Skip not supported in ex mode
endif
let res = ExpandInBuffer("\t<div class=\"footer_nav\">\n\t\t<a href=\"#\">nav link</a>\n\t</div>$$$$\\<esc>ggVG\\<c-y>,div\\<cr>$$$$", 'html', "\t<div>\n\t\t<div class=\"footer_nav\">\n\t\t\t<a href=\"#\">nav link</a>\n\t\t</div>\n\t</div>")
Assert Equals(res, "\t<div>\n\t\t<div class=\"footer_nav\">\n\t\t\t<a href=\"#\">nav link</a>\n\t\t</div>\n\t</div>")
End
It expands inside tag
let res = ExpandInBuffer('<small>a$$$$</small>', 'html', '<small><a href=""></a></small>')
Assert Equals(res, '<small><a href=""></a></small>')
End
It applies BEM filter
Assert Equals(ExpandWord('form.search-form._wide>input.-query-string+input:s.-btn_large|bem', 'html'), "<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")
End
It expands fieldset legend label
Assert Equals(ExpandWord('form>fieldset>legend+(label>input[type="checkbox"])*3', 'html'), "<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")
End
End
Describe split join tag
It joins tag
let res = ExpandInBuffer("<div>\n\t<span>$$$$\\<c-y>j$$$$</span>\n</div>", 'html', "<div>\n\t<span />\n</div>")
Assert Equals(res, "<div>\n\t<span />\n</div>")
End
It splits tag
let res = ExpandInBuffer("<div>\n\t<span$$$$\\<c-y>j$$$$/>\n</div>", 'html', "<div>\n\t<span></span>\n</div>")
Assert Equals(res, "<div>\n\t<span></span>\n</div>")
End
It joins with complex attribute
let res = ExpandInBuffer("<div onclick=\"javascript:console.log(Date.now() % 1000 > 500)\">test$$$$\\<c-y>j$$$$/>\n</div>", 'html', '<div onclick="javascript:console.log(Date.now() % 1000 > 500)" />')
Assert Equals(res, '<div onclick="javascript:console.log(Date.now() % 1000 > 500)" />')
End
It splits custom tag
let res = ExpandInBuffer("<div>\n\t<some-tag$$$$\\<c-y>j$$$$/>\n</div>", 'html', "<div>\n\t<some-tag></some-tag>\n</div>")
Assert Equals(res, "<div>\n\t<some-tag></some-tag>\n</div>")
End
End
Describe toggle comment
It adds comment
let res = ExpandInBuffer("<div>\n\t<span>$$$$\\<c-y>/$$$$</span>\n</div>", 'html', "<div>\n\t<!-- <span></span> -->\n</div>")
Assert Equals(res, "<div>\n\t<!-- <span></span> -->\n</div>")
End
It removes comment
let res = ExpandInBuffer("<div>\n\t<!-- <span>$$$$\\<c-y>/$$$$</span> -->\n</div>", 'html', "<div>\n\t<span></span>\n</div>")
Assert Equals(res, "<div>\n\t<span></span>\n</div>")
End
End
Describe image size
It gets remote png size
let res = ExpandInBuffer("img[src=http://mattn.kaoriya.net/images/logo.png]$$$$\\<c-y>,\\<c-y>i$$$$", 'html', '<img src="http://mattn.kaoriya.net/images/logo.png" alt="" width="113" height="113">')
Assert Equals(res, '<img src="http://mattn.kaoriya.net/images/logo.png" alt="" width="113" height="113">')
End
It handles missing local image
let res = ExpandInBuffer("img[src=/logo.png]$$$$\\<c-y>,\\<c-y>i$$$$", 'html', '<img src="/logo.png" alt="">')
Assert Equals(res, '<img src="/logo.png" alt="">')
End
It overwrites existing size
let res = ExpandInBuffer("img[src=http://mattn.kaoriya.net/images/logo.png width=foo height=bar]$$$$\\<c-y>,\\<c-y>i$$$$", 'html', '<img src="http://mattn.kaoriya.net/images/logo.png" alt="" width="113" height="113">')
Assert Equals(res, '<img src="http://mattn.kaoriya.net/images/logo.png" alt="" width="113" height="113">')
End
End
Describe move next prev
It moves to third attribute
let res = ExpandInBuffer("foo+bar+baz[dankogai=\"\"]$$$$\\<c-y>,\\<esc>gg0\\<c-y>n\\<c-y>n\\<c-y>n\\<esc>Byw:%d _\\<cr>p$$$$", 'html', 'dankogai')
Assert Equals(res, 'dankogai')
End
End
Describe contains dash in attributes
It expands foo-bar attribute
Assert Equals(ExpandWord('div[foo-bar="baz"]', 'html'), "<div foo-bar=\"baz\"></div>\n")
End
End
Describe default attributes
It expands a href shorthand
Assert Equals(ExpandWord('p.title>a[/hoge/]', 'html'), "<p class=\"title\"><a href=\"/hoge/\"></a></p>\n")
End
It expands script src
Assert Equals(ExpandWord('script[jquery.js]', 'html'), "<script src=\"jquery.js\"></script>\n")
End
End
Describe multiple group
It expands outer inner
Assert Equals(ExpandWord('.outer$*3>.inner$*2', 'html'), "<div class=\"outer1\">\n\t<div class=\"inner1\"></div>\n\t<div class=\"inner2\"></div>\n</div>\n<div class=\"outer2\">\n\t<div class=\"inner1\"></div>\n\t<div class=\"inner2\"></div>\n</div>\n<div class=\"outer3\">\n\t<div class=\"inner1\"></div>\n\t<div class=\"inner2\"></div>\n</div>\n")
End
End
Describe group itemno
It expands dl dt dd
Assert Equals(ExpandWord('dl>(dt{$}+dd)*3', 'html'), "<dl>\n\t<dt>1</dt>\n\t<dd></dd>\n\t<dt>2</dt>\n\t<dd></dd>\n\t<dt>3</dt>\n\t<dd></dd>\n</dl>\n")
End
It expands nested multiplier
Assert Equals(ExpandWord('(div[attr=$]*3)*3', 'html'), "<div attr=\"1\"></div>\n<div attr=\"2\"></div>\n<div attr=\"3\"></div>\n<div attr=\"1\"></div>\n<div attr=\"2\"></div>\n<div attr=\"3\"></div>\n<div attr=\"1\"></div>\n<div attr=\"2\"></div>\n<div attr=\"3\"></div>\n")
End
End
Describe update tag
It adds class (skip: ex mode)
if mode() ==# 'c'
Skip not supported in ex mode
endif
let res = ExpandInBuffer("<h$$$$\\<c-y>u.global\\<cr>$$$$3></h3>", 'html', '<h3 class="global"></h3>')
Assert Equals(res, '<h3 class="global"></h3>')
End
It adds class preserving attribute (skip: ex mode)
if mode() ==# 'c'
Skip not supported in ex mode
endif
let res = ExpandInBuffer("<button$$$$\\<c-y>u.btn\\<cr>$$$$ disabled></button>", 'html', '<button class="btn" disabled></button>')
Assert Equals(res, '<button class="btn" disabled></button>')
End
End
Describe base value
It starts from zero
Assert Equals(ExpandWord('ul>li#id$@0*3', 'html'), "<ul>\n\t<li id=\"id0\"></li>\n\t<li id=\"id1\"></li>\n\t<li id=\"id2\"></li>\n</ul>\n")
End
End
End
-171
View File
@@ -1,171 +0,0 @@
Describe others
Describe xsl
It expands vari
Assert Equals(ExpandWord('vari', 'xsl'), "<xsl:variable name=\"\"></xsl:variable>\n")
End
It expands ap>wp
Assert Equals(ExpandWord('ap>wp', 'xsl'), "<xsl:apply-templates select=\"\" mode=\"\">\n\t<xsl:with-param name=\"\" select=\"\"></xsl:with-param>\n</xsl:apply-templates>\n")
End
End
Describe xsd
It expands xsd:w3c
Assert Equals(ExpandWord('xsd:w3c', 'xsd'), "<?xml version=\"1.0\"?>\n<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n\t<xsd:element name=\"\" type=\"\"/>\n</xsd:schema>\n")
End
End
Describe mustache
It expands id with mustache syntax
Assert Equals(ExpandWord('div#{{foo}}', 'mustache'), "<div id=\"{{foo}}\"></div>\n")
End
It expands class with mustache syntax
Assert Equals(ExpandWord('div.{{foo}}', 'mustache'), "<div class=\"{{foo}}\"></div>\n")
End
End
Describe scss
It expands import
let res = ExpandInBuffer('@i$$$$', 'scss', '@import url();')
Assert Equals(res, '@import url();')
End
It expands font-style
let res = ExpandInBuffer('{fs:n$$$$}', 'scss', '{font-style: normal;}')
Assert Equals(res, '{font-style: normal;}')
End
It expands float left
let res = ExpandInBuffer('{fl:l|fc$$$$}', 'scss', '{float: left;}')
Assert Equals(res, '{float: left;}')
End
It expands background+
let res = ExpandInBuffer('{bg+$$$$}', 'scss', '{background: $$$$#fff url() 0 0 no-repeat;}')
Assert Equals(res, '{background: $$$$#fff url() 0 0 no-repeat;}')
End
It expands background+ important
let res = ExpandInBuffer('{bg+!$$$$}', 'scss', '{background: $$$$#fff url() 0 0 no-repeat !important;}')
Assert Equals(res, '{background: $$$$#fff url() 0 0 no-repeat !important;}')
End
It expands margin
let res = ExpandInBuffer('{m$$$$}', 'scss', '{margin: $$$$;}')
Assert Equals(res, '{margin: $$$$;}')
End
It expands margin percent
let res = ExpandInBuffer('{m0.1p$$$$}', 'scss', '{margin: 0.1%;}')
Assert Equals(res, '{margin: 0.1%;}')
End
It expands margin em
let res = ExpandInBuffer('{m1.0$$$$}', 'scss', '{margin: 1.0em;}')
Assert Equals(res, '{margin: 1.0em;}')
End
It expands margin px
let res = ExpandInBuffer('{m2$$$$}', 'scss', '{margin: 2px;}')
Assert Equals(res, '{margin: 2px;}')
End
It expands border-radius
let res = ExpandInBuffer('{bdrs10$$$$}', 'scss', '{border-radius: 10px;}')
Assert Equals(res, '{border-radius: 10px;}')
End
It expands vendor prefix
let res = ExpandInBuffer('{-bdrs20$$$$}', 'scss', "{-webkit-border-radius: 20px;\n-moz-border-radius: 20px;\n-o-border-radius: 20px;\n-ms-border-radius: 20px;\nborder-radius: 20px;}")
Assert Equals(res, "{-webkit-border-radius: 20px;\n-moz-border-radius: 20px;\n-o-border-radius: 20px;\n-ms-border-radius: 20px;\nborder-radius: 20px;}")
End
It expands linear-gradient
let res = ExpandInBuffer('{lg(top,#fff,#000)$$$$}', 'scss', "{background-image: -webkit-gradient(top, 0 0, 0 100%, from(#fff), to(#000));\nbackground-image: -webkit-linear-gradient(#fff, #000);\nbackground-image: -moz-linear-gradient(#fff, #000);\nbackground-image: -o-linear-gradient(#fff, #000);\nbackground-image: linear-gradient(#fff, #000);\n}")
Assert Equals(res, "{background-image: -webkit-gradient(top, 0 0, 0 100%, from(#fff), to(#000));\nbackground-image: -webkit-linear-gradient(#fff, #000);\nbackground-image: -moz-linear-gradient(#fff, #000);\nbackground-image: -o-linear-gradient(#fff, #000);\nbackground-image: linear-gradient(#fff, #000);\n}")
End
It expands margin multi
let res = ExpandInBuffer('{m10-5-0$$$$}', 'scss', '{margin: 10px 5px 0;}')
Assert Equals(res, '{margin: 10px 5px 0;}')
End
It expands margin negative
let res = ExpandInBuffer('{m-10--5$$$$}', 'scss', '{margin: -10px -5px;}')
Assert Equals(res, '{margin: -10px -5px;}')
End
It expands margin auto
let res = ExpandInBuffer('{m10-auto$$$$}', 'scss', '{margin: 10px auto;}')
Assert Equals(res, '{margin: 10px auto;}')
End
It expands width percent
let res = ExpandInBuffer('{w100p$$$$}', 'scss', '{width: 100%;}')
Assert Equals(res, '{width: 100%;}')
End
It expands height em
let res = ExpandInBuffer('{h50e$$$$}', 'scss', '{height: 50em;}')
Assert Equals(res, '{height: 50em;}')
End
It expands multi property group
let res = ExpandInBuffer('{(bg+)+c$$$$}', 'scss', "{background: $$$$#fff url() 0 0 no-repeat;\ncolor: #000;}")
Assert Equals(res, "{background: $$$$#fff url() 0 0 no-repeat;\ncolor: #000;}")
End
End
Describe jade
It expands doctype
let res = ExpandInBuffer("!!!$$$$\\<c-y>,$$$$", 'jade', "doctype html\n\n")
Assert Equals(res, "doctype html\n\n")
End
It expands span class
let res = ExpandInBuffer("span.my-span$$$$\\<c-y>,$$$$", 'jade', 'span.my-span')
Assert Equals(res, 'span.my-span')
End
It expands input
let res = ExpandInBuffer("input$$$$\\<c-y>,text$$$$", 'jade', 'input(type="text")')
Assert Equals(res, 'input(type="text")')
End
End
Describe pug
It expands doctype
let res = ExpandInBuffer("!!!$$$$\\<c-y>,$$$$", 'pug', "doctype html\n\n")
Assert Equals(res, "doctype html\n\n")
End
It expands span class
let res = ExpandInBuffer("span.my-span$$$$\\<c-y>,$$$$", 'pug', 'span.my-span')
Assert Equals(res, 'span.my-span')
End
It expands input
let res = ExpandInBuffer("input$$$$\\<c-y>,text$$$$", 'pug', 'input(type="text")')
Assert Equals(res, 'input(type="text")')
End
End
Describe jsx
It expands img
let res = ExpandInBuffer("img$$$$\\<c-y>,$$$$", 'javascript.jsx', '<img src="" alt="" />')
Assert Equals(res, '<img src="" alt="" />')
End
It expands span class
let res = ExpandInBuffer("span.my-span$$$$\\<c-y>,$$$$", 'javascript.jsx', '<span className="my-span"></span>')
Assert Equals(res, '<span className="my-span"></span>')
End
It expands in function
let res = ExpandInBuffer("function() { return span.my-span$$$$\\<c-y>,$$$$; }", 'javascript.jsx', 'function() { return <span className="my-span"></span>; }')
Assert Equals(res, 'function() { return <span className="my-span"></span>; }')
End
End
End
-48
View File
@@ -1,48 +0,0 @@
Describe slim
Describe expand abbreviation
It expands complex
Assert Equals(ExpandWord('div>p+ul#foo>li.bar$[foo=bar][bar=baz]*3>{baz}', 'slim'), "div\n p\n ul id=\"foo\"\n li class=\"bar1\" foo=\"bar\" bar=\"baz\"\n | baz\n li class=\"bar2\" foo=\"bar\" bar=\"baz\"\n | baz\n li class=\"bar3\" foo=\"bar\" bar=\"baz\"\n | baz\n")
End
It expands with slim filter
Assert Equals(ExpandWord('div>p+ul#foo>li.bar$[foo=bar][bar=baz]*3>{baz}|slim', 'slim'), "div\n p\n ul id=\"foo\"\n li class=\"bar1\" foo=\"bar\" bar=\"baz\"\n | baz\n li class=\"bar2\" foo=\"bar\" bar=\"baz\"\n | baz\n li class=\"bar3\" foo=\"bar\" bar=\"baz\"\n | baz\n")
End
It expands a multiplier
Assert Equals(ExpandWord('a*3|slim', 'slim'), "a href=\"\"\na href=\"\"\na href=\"\"\n")
End
It expands class with text
Assert Equals(ExpandWord('.content{Hello!}|slim', 'slim'), "div class=\"content\"\n | Hello!\n")
End
It expands title dollar hash
Assert Equals(ExpandWord('a[title=$#]{foo}', 'slim'), "a href=\"\" title=\"foo\"\n | foo\n")
End
End
Describe split join tag
It joins
let res = ExpandInBuffer("a\n | foo$$$$\\<c-y>j$$$$", 'slim', 'a')
Assert Equals(res, 'a')
End
It splits
let res = ExpandInBuffer("a$$$$\\<c-y>j$$$$", 'slim', "a\n | $$$$")
Assert Equals(res, "a\n | $$$$")
End
End
Describe toggle comment
It adds comment
let res = ExpandInBuffer("a href=\"http://www.google.com\"$$$$\\<c-y>/$$$$\n | hello", 'slim', "/a href=\"http://www.google.com\"\n | hello")
Assert Equals(res, "/a href=\"http://www.google.com\"\n | hello")
End
It removes comment
let res = ExpandInBuffer("/a href=\"http://www.google.com\"$$$$\\<c-y>/$$$$\n | hello", 'slim', "a href=\"http://www.google.com\"\n | hello")
Assert Equals(res, "a href=\"http://www.google.com\"\n | hello")
End
End
End
+30 -142
View File
@@ -1,6 +1,5 @@
" {{{ " {{{
let s:sfile = expand('<sfile>') let s:sfile = expand('<sfile>')
let s:logging = 0
function! s:reload(d) function! s:reload(d)
exe 'so' a:d.'/plugin/emmet.vim' exe 'so' a:d.'/plugin/emmet.vim'
@@ -9,32 +8,22 @@ function! s:reload(d)
endfor endfor
endfunction 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) function! s:show_type(type)
echohl Search | call s:log('['.a:type.']') | echohl None echohl Search | echon '[' a:type "]\n" | echohl None
echo "\r" echo "\r"
endfunction endfunction
function! s:show_category(category) function! s:show_category(category)
echohl MatchParen | call s:log('['.a:category.']') | echohl None echohl MatchParen | echon '[' a:category "]\n" | echohl None
echo "\r" echo "\r"
endfunction endfunction
function! s:show_pass(pass) 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 endfunction
function! s:show_done() function! s:show_done()
echohl IncSearch | call s:log('done') | echohl None echohl IncSearch | echo 'done' | echohl None
endfunction endfunction
function! s:escape(str) function! s:escape(str)
@@ -47,39 +36,37 @@ endfunction
function! s:show_title(no, title) function! s:show_title(no, title)
let title = s:escape(a:title) let title = s:escape(a:title)
let width = &columns - 23 let width = &columns - 23
echon "\r" echohl MoreMsg | echon "\rtesting #".printf('%03d', a:no)
echohl MoreMsg | call s:logn('testing #'.printf('%03d', a:no)) echohl None | echon ': ' . (len(title) < width ? (title.repeat(' ', width-len(title))) : strpart(title, 0, width)) . ' ... '
echohl None | call s:logn(': '.(len(title) < width ? (title.' '.repeat('.', width-len(title)+1)) : strpart(title, 0, width+2)).'... ')
endfunction endfunction
function! s:show_skip(no, title) function! s:show_skip(no, title)
let title = s:escape(a:title) let title = s:escape(a:title)
let width = &columns - 23 let width = &columns - 23
echon "\r" echohl WarningMsg | echon "\rskipped #".printf('%03d', a:no)
echohl WarningMsg | call s:logn('skipped #'.printf('%03d', a:no)) echohl None | echon ': ' . (len(title) < width ? (title.repeat(' ', width-len(title))) : strpart(title, 0, width)) . ' ... '
echohl None | call s:logn(': '.(len(title) < width ? (title.' '.repeat('.', width-len(title)+1)) : strpart(title, 0, width+2)).'... ')
echo '' echo ''
endfunction endfunction
function! s:show_ok() function! s:show_ok()
echohl Title | call s:logn('ok') | echohl None echohl Title | echon "ok\n" | echohl None
echo '' echo ''
endfunction endfunction
function! s:show_ng(no, expect, got) function! s:show_ng(no, expect, got)
echohl WarningMsg | call s:logn('ng') | echohl None echohl WarningMsg | echon "ng\n" | echohl None
echohl ErrorMsg | call s:log('failed test #'.a:no) | echohl None echohl ErrorMsg | echo 'failed test #'.a:no | echohl None
set more 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") echo join(split(a:expect, "\n", 1), "|\n")
echohl WarningMsg | call s:log(printf('got(%d):', len(a:got))) | echohl None echohl WarningMsg | echo printf('got(%d):', len(a:got)) | echohl None
call s:log(join(split(a:got, "\n", 1), "|\n")) echo join(split(a:got, "\n", 1), "|\n")
let cs = split(a:expect, '\zs') let cs = split(a:expect, '\zs')
for c in range(len(cs)) for c in range(len(cs))
if c < len(a:got) if c < len(a:got)
if a:expect[c] != a:got[c] if a:expect[c] != a:got[c]
echohl WarningMsg | call s:log('differ at:') | echohl None echohl WarningMsg | echo 'differ at:' | echohl None
call s:log(a:expect[c :-1]) echo a:expect[c :-1]
break break
endif endif
endif endif
@@ -104,7 +91,6 @@ function! s:test(...)
let start = reltime() let start = reltime()
for n in range(len(tests)) for n in range(len(tests))
if len(index) > 0 && n != index | continue | endif 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 query = tests[n].query
let options = has_key(tests[n], 'options') ? tests[n].options : {} let options = has_key(tests[n], 'options') ? tests[n].options : {}
let result = tests[n].result let result = tests[n].result
@@ -122,7 +108,6 @@ function! s:test(...)
if stridx(query, '$$$$') != -1 if stridx(query, '$$$$') != -1
silent! 1new silent! 1new
silent! exe 'setlocal ft='.testgroup.type silent! exe 'setlocal ft='.testgroup.type
EmmetInstall
silent! let key = matchstr(query, '.*\$\$\$\$\zs.*\ze\$\$\$\$') silent! let key = matchstr(query, '.*\$\$\$\$\zs.*\ze\$\$\$\$')
if len(key) > 0 if len(key) > 0
exe printf('let key = "%s"', key) exe printf('let key = "%s"', key)
@@ -169,9 +154,8 @@ function! s:test(...)
endfor endfor
endfunction endfunction
function! s:do_tests(bang, ...) function! s:do_tests(...)
try try
let s:logging = a:bang
if exists('g:user_emmet_settings') if exists('g:user_emmet_settings')
let s:old_user_emmet_settings = g:user_emmet_settings let s:old_user_emmet_settings = g:user_emmet_settings
endif endif
@@ -181,22 +165,13 @@ function! s:do_tests(bang, ...)
let &more = 0 let &more = 0
call call('s:test', a:000) call call('s:test', a:000)
call s:show_done() call s:show_done()
if a:bang == '!'
qall!
endif
catch catch
echohl ErrorMsg | echomsg v:exception | echohl None echohl ErrorMsg | echomsg v:exception | echohl None
if a:bang == '!'
cquit!
endif
finally finally
let &more=oldmore let &more=oldmore
if exists('s:old_user_emmet_settings') if exists('s:old_user_emmet_settings')
let g:user_emmet_settings = s:old_user_emmet_settings let g:user_emmet_settings = s:old_user_emmet_settings
endif endif
if exists('s:old_user_emmet_install_global')
let g:user_emmet_install_global = s:old_user_emmet_install_global
endif
endtry endtry
endfunction endfunction
@@ -214,7 +189,7 @@ function! s:emmet_unittest_complete(arglead, cmdline, cmdpos)
return [] return []
endfunction 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') if s:sfile == expand('%:p')
EmmetUnitTest EmmetUnitTest
endif endif
@@ -266,7 +241,7 @@ finish
}, },
{ {
'query': "html:xt>div#header>div#logo+ul#nav>li.item-$*5>a", '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", 'query': "ol>li*2",
@@ -322,11 +297,11 @@ finish
}, },
{ {
'query': "blockquote>b>i<<b", '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", '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]", '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", '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", '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", '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", '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", '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", '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", '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",
},
{
'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",
}, },
], ],
}, },
@@ -575,20 +546,12 @@ finish
'tests': [ 'tests': [
{ {
'query': "<div>\n\t<span>$$$$\\<c-y>j$$$$</span>\n</div>", '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>", 'query': "<div>\n\t<span$$$$\\<c-y>j$$$$/>\n</div>",
'result': "<div>\n\t<span></span>\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>", 'query': "<h$$$$\\<c-y>u.global\\<cr>$$$$3></h3>",
'result': "<h3 class=\"global\"></h3>", 'result': "<h3 class=\"global\"></h3>",
}, },
{
'query': "<button$$$$\\<c-y>u.btn\\<cr>$$$$ disabled></button>",
'result': "<button class=\"btn\" disabled></button>",
},
],
},
{
'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$$$$}", '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)$$$$}", 'query': "{lg(top,#fff,#000)$$$$}",
@@ -849,7 +799,7 @@ finish
], ],
}, },
{ {
'name': 'split join', 'name': 'expand abbreviation',
'tests': [ 'tests': [
{ {
'query': "%a foo\n bar$$$$\\<c-y>j$$$$", 'query': "%a foo\n bar$$$$\\<c-y>j$$$$",
@@ -1030,7 +980,7 @@ finish
}, },
{ {
'query': "{-bdrs20$$$$}", '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)$$$$}", 'query': "{lg(top,#fff,#000)$$$$}",
@@ -1064,67 +1014,5 @@ finish
}, },
], ],
'dummy': "}}}"}, '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: " vim:set et fdm=marker: