diff --git a/autoload/emmet.vim b/autoload/emmet.vim
index 72b9f64..922fc07 100644
--- a/autoload/emmet.vim
+++ b/autoload/emmet.vim
@@ -811,9 +811,9 @@ function! emmet#imageSize() abort
return ''
endfunction
-function! emmet#encodeImage() abort
+function! emmet#imageEncode() abort
let type = emmet#getFileType()
- return emmet#lang#{emmet#lang#type(type)}#encodeImage()
+ return emmet#lang#{emmet#lang#type(type)}#imageEncode()
endfunction
function! emmet#toggleComment() abort
diff --git a/autoload/emmet/lang/html.vim b/autoload/emmet/lang/html.vim
index 305e9c1..6363b92 100644
--- a/autoload/emmet/lang/html.vim
+++ b/autoload/emmet/lang/html.vim
@@ -692,7 +692,7 @@ function! emmet#lang#html#imageSize() abort
call emmet#util#setContent(img_region, html)
endfunction
-function! emmet#lang#html#encodeImage() abort
+function! emmet#lang#html#imageEncode() abort
let img_region = emmet#util#searchRegion('
')
if !emmet#util#regionIsValid(img_region) || !emmet#util#cursorInRegion(img_region)
return
@@ -706,17 +706,16 @@ function! emmet#lang#html#encodeImage() abort
return
endif
let fn = current.attr.src
- if fn !~# '^\(/\|http\)'
+ if fn =~# '^\s*$'
+ return
+ elseif fn !~# '^\(/\|http\)'
let fn = simplify(expand('%:h') . '/' . fn)
endif
- let [width, height] = emmet#util#getImageSize(fn)
- if width == -1 && height == -1
- return
- endif
- let current.attr.width = width
- let current.attr.height = height
- let html = emmet#toString(current, 'html', 1)
+ let encoded = emmet#util#imageEncodeDecode(fn, 0)
+ let current.attr.src = encoded
+ let html = substitute(emmet#toString(current, 'html', 1), '\n', '', '')
+ let html = substitute(html, '\${cursor}', '', '')
call emmet#util#setContent(img_region, html)
endfunction
diff --git a/autoload/emmet/util.vim b/autoload/emmet/util.vim
index 9a5b8d3..78960c0 100644
--- a/autoload/emmet/util.vim
+++ b/autoload/emmet/util.vim
@@ -233,12 +233,12 @@ function! emmet#util#getImageSize(fn) abort
else
if fn !~# '^\w\+://'
let path = fnamemodify(expand('%'), ':p:gs?\\?/?')
- if has('win32') || has('win64') |
+ 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') |
+ if has('win32') || has('win64') |
let root = tolower(root)
endif
if stridx(path, root) == 0
@@ -298,6 +298,67 @@ function! emmet#util#isImageMagickInstalled() abort
return executable('identify')
endfunction
+function! s:b64encode(bytes, table, pad)
+ let b64 = []
+ for i in range(0, len(a:bytes) - 1, 3)
+ let n = a:bytes[i] * 0x10000
+ \ + get(a:bytes, i + 1, 0) * 0x100
+ \ + get(a:bytes, i + 2, 0)
+ call add(b64, a:table[n / 0x40000])
+ call add(b64, a:table[n / 0x1000 % 0x40])
+ call add(b64, a:table[n / 0x40 % 0x40])
+ call add(b64, a:table[n % 0x40])
+ endfor
+ if len(a:bytes) % 3 == 2
+ let b64[-1] = a:pad
+ elseif len(a:bytes) % 3 == 1
+ let b64[-1] = a:pad
+ let b64[-2] = a:pad
+ endif
+ return b64
+endfunction
+
+function! emmet#util#imageEncodeDecode(fn, flag) abort
+ let fn = a:fn
+
+ if filereadable(fn)
+ let hex = substitute(system('xxd -p "'.fn.'"'), '\n', '', 'g')
+ else
+ if fn !~# '^\w\+://'
+ let path = fnamemodify(expand('%'), ':p:gs?\\?/?')
+ 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
+
+ let bin = map(split(hex, '..\zs'), 'eval("0x" . v:val)')
+ let table = split('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', '\zs')
+ let ret = 'data:image/'
+ if hex =~# '^89504e470d0a1a0a'
+ let ret .= 'png'
+ elseif hex =~# '^ffd8'
+ let ret .= 'jpeg'
+ elseif hex =~# '^47494638'
+ let ret .= 'gif'
+ else
+ let ret .= 'unknown'
+ endif
+ return ret . ';base64,' . join(s:b64encode(bin, table, '='), '')
+endfunction
+
function! emmet#util#unique(arr) abort
let m = {}
let r = []
diff --git a/plugin/emmet.vim b/plugin/emmet.vim
index 02caacc..69b6a05 100644
--- a/plugin/emmet.vim
+++ b/plugin/emmet.vim
@@ -120,6 +120,8 @@ function! s:install_plugin(mode, buffer)
\ {'mode': 'n', 'var': '', 'key': '', 'plug': 'emmet-move-prev-item', 'func': ':call emmet#moveNextPrevItem(1)'},
\ {'mode': 'i', 'var': 'user_emmet_imagesize_key', 'key': 'i', 'plug': 'emmet-image-size', 'func': '=emmet#util#closePopup()=emmet#imageSize()'},
\ {'mode': 'n', 'var': 'user_emmet_imagesize_key', 'key': 'i', 'plug': 'emmet-image-size', 'func': ':call emmet#imageSize()'},
+ \ {'mode': 'i', 'var': 'user_emmet_imageencode_key', 'key': 'I', 'plug': 'emmet-image-encode', 'func': '=emmet#util#closePopup()=emmet#imageEncode()'},
+ \ {'mode': 'n', 'var': 'user_emmet_imageencode_key', 'key': 'I', 'plug': 'emmet-image-encode', 'func': ':call emmet#imageEncode()'},
\ {'mode': 'i', 'var': 'user_emmet_togglecomment_key', 'key': '/', 'plug': 'emmet-toggle-comment', 'func': '=emmet#util#closePopup()=emmet#toggleComment()'},
\ {'mode': 'n', 'var': 'user_emmet_togglecomment_key', 'key': '/', 'plug': 'emmet-toggle-comment', 'func': ':call emmet#toggleComment()'},
\ {'mode': 'i', 'var': 'user_emmet_splitjointag_key', 'key': 'j', 'plug': 'emmet-split-join-tag', 'func': ':call emmet#splitJoinTag()'},