get extends recursively, minor additional fixes for pug and jsx

This commit is contained in:
Martin Pedersen
2019-05-09 00:45:41 +02:00
parent ae7d31f290
commit f8fc806a61
3 changed files with 104 additions and 19 deletions

View File

@@ -85,12 +85,7 @@ function! emmet#isExtends(type, extend) abort
if !has_key(s:emmet_settings[a:type], 'extends')
return 0
endif
let extends = s:emmet_settings[a:type].extends
if type(extends) ==# 1
let tmp = split(extends, '\s*,\s*')
unlet! extends
let extends = tmp
endif
let extends = emmet#lang#getExtends(a:type)
for ext in extends
if a:extend ==# ext
return 1
@@ -119,7 +114,7 @@ function! emmet#isExpandable() abort
endif
let part = matchstr(line, '\(\S.*\)$')
let type = emmet#getFileType()
let ftype = emmet#lang#exists(type) ? type : 'html'
let rtype = emmet#lang#type(type)
let part = emmet#lang#{ftype}#findTokens(part)
return len(part) > 0
endfunction
@@ -334,14 +329,14 @@ function! emmet#getResource(type, name, default) abort
let ret = a:default
if has_key(s:emmet_settings[type], 'extends')
let extends = s:emmet_settings[type].extends
if type(extends) ==# 1
let tmp = split(extends, '\s*,\s*')
unlet! extends
let extends = tmp
endif
let extends = emmet#lang#getExtends(a:type)
call reverse(extends) " reverse to overwrite the correct way
for ext in extends
if has_key(s:emmet_settings, ext) && has_key(s:emmet_settings[ext], a:name)
if !has_key(s:emmet_settings, ext)
continue
endif
if has_key(s:emmet_settings[ext], a:name)
if type(ret) ==# 3 || type(ret) ==# 4
call emmet#mergeConfig(ret, s:emmet_settings[ext][a:name])
else
@@ -386,13 +381,19 @@ function! emmet#getFileType(...) abort
let pos = emmet#util#getcurpos()
let type = synIDattr(synID(pos[1], pos[2], 1), 'name')
" ignore htmlTagName as it seems to occur too often
if type == 'htmlTagName'
let type = ''
endif
if type =~? '^css'
let type = 'css'
elseif type =~? '^html'
let type = 'html'
elseif type =~? '^jsx'
let type = 'jsx'
elseif type =~? '^js\w' || type =~? '^javascript'
elseif (type =~? '^js\w' || type =~? '^javascript') && !(&filetype =~? 'jsx')
let type = 'javascript'
elseif type =~? '^tsx'
let type = 'tsx'
@@ -403,7 +404,7 @@ function! emmet#getFileType(...) abort
else
let types = split(&filetype, '\.')
for part in types
if emmet#lang#exists(part)
if has_key(s:emmet_settings, part)
let type = part
break
endif
@@ -515,7 +516,7 @@ function! emmet#unescapeDollarExpr(expand) abort
endfunction
function! emmet#expandAbbr(mode, abbr) range abort
let type = emmet#lang#type(emmet#getFileType(1))
let type = emmet#getFileType(1)
let indent = emmet#getIndentation(type)
let expand = ''
let line = ''
@@ -652,8 +653,8 @@ function! emmet#expandAbbr(mode, abbr) range abort
let part = matchstr(line, '\([a-zA-Z0-9:_\-\@|]\+\)$')
else
let part = matchstr(line, '\(\S.*\)$')
let ftype = emmet#lang#exists(type) ? type : 'html'
let part = emmet#lang#{ftype}#findTokens(part)
let rtype = emmet#lang#type(type)
let part = emmet#lang#{rtype}#findTokens(part)
let line = line[0: strridx(line, part) + len(part) - 1]
endif
if col('.') ==# col('$')

View File

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

View File

@@ -1060,5 +1060,67 @@ finish
},
],
'dummy': "}}}"},
{ 'test-jade': "{{{",
'type': 'jade',
'categories': [
{
'name': 'expand abbreviation',
'tests': [
{
'query': "!!!$$$$\\<c-y>,$$$$",
'result': "doctype html\n\n",
},
{
'query': "span.my-span$$$$\\<c-y>,$$$$",
'result': "span.my-span",
},
],
},
],
'dummy': "}}}"},
{ 'test-pug': "{{{",
'type': 'pug',
'categories': [
{
'name': 'expand abbreviation',
'tests': [
{
'query': "!!!$$$$\\<c-y>,$$$$",
'result': "doctype html\n\n",
},
{
'query': "span.my-span$$$$\\<c-y>,$$$$",
'result': "span.my-span",
},
{
'query': "input$$$$\\<c-y>,text$$$$",
'result': "input(type=\"text\")",
},
],
},
],
'dummy': "}}}"},
{ 'test-jsx': "{{{",
'type': 'javascript.jsx',
'categories': [
{
'name': 'expand abbreviation',
'tests': [
{
'query': "img$$$$\\<c-y>,$$$$",
'result': "<img src=\"\" alt=\"\" />",
},
{
'query': "span.my-span$$$$\\<c-y>,$$$$",
'result': "<span className=\"my-span\"></span>",
},
{
'query': "function() { return span.my-span$$$$\\<c-y>,$$$$; }",
'result': "function() { return <span className=\"my-span\"></span>; }",
},
],
},
],
'dummy': "}}}"},
]
" vim:set et fdm=marker: