spacevim/bundle/splitjoin.vim/autoload/sj/jsx.vim
JIe 2bb7059579
Some checks failed
Detach Plugins / check (FlyGrep.vim) (push) Has been cancelled
Detach Plugins / check (GitHub.vim) (push) Has been cancelled
Detach Plugins / check (JavaUnit.vim) (push) Has been cancelled
Detach Plugins / check (SourceCounter.vim) (push) Has been cancelled
Detach Plugins / check (cpicker.nvim) (push) Has been cancelled
Detach Plugins / check (dein-ui.vim) (push) Has been cancelled
Detach Plugins / check (git.vim) (push) Has been cancelled
Detach Plugins / check (iedit.vim) (push) Has been cancelled
Detach Plugins / check (scrollbar.vim) (push) Has been cancelled
Detach Plugins / check (vim-chat) (push) Has been cancelled
Detach Plugins / check (vim-cheat) (push) Has been cancelled
Detach Plugins / check (vim-todo) (push) Has been cancelled
Detach Plugins / check (xmake.vim) (push) Has been cancelled
test / Linux (nvim, nightly) (push) Has been cancelled
test / Linux (nvim, v0.3.8) (push) Has been cancelled
test / Linux (nvim, v0.4.0) (push) Has been cancelled
test / Linux (nvim, v0.4.2) (push) Has been cancelled
test / Linux (nvim, v0.4.3) (push) Has been cancelled
test / Linux (nvim, v0.4.4) (push) Has been cancelled
test / Linux (nvim, v0.5.0) (push) Has been cancelled
test / Linux (nvim, v0.5.1) (push) Has been cancelled
test / Linux (nvim, v0.6.0) (push) Has been cancelled
test / Linux (nvim, v0.6.1) (push) Has been cancelled
test / Linux (nvim, v0.7.0) (push) Has been cancelled
test / Linux (nvim, v0.7.2) (push) Has been cancelled
test / Linux (nvim, v0.8.0) (push) Has been cancelled
test / Linux (nvim, v0.8.1) (push) Has been cancelled
test / Linux (nvim, v0.8.2) (push) Has been cancelled
test / Linux (nvim, v0.8.3) (push) Has been cancelled
test / Linux (nvim, v0.9.0) (push) Has been cancelled
test / Linux (nvim, v0.9.1) (push) Has been cancelled
test / Linux (true, vim, v7.4.052) (push) Has been cancelled
test / Linux (true, vim, v7.4.1689) (push) Has been cancelled
test / Linux (true, vim, v7.4.629) (push) Has been cancelled
test / Linux (true, vim, v8.0.0027) (push) Has been cancelled
test / Linux (true, vim, v8.0.0183) (push) Has been cancelled
test / Linux (vim, nightly) (push) Has been cancelled
test / Linux (vim, v8.0.0184) (push) Has been cancelled
test / Linux (vim, v8.0.1453) (push) Has been cancelled
test / Linux (vim, v8.1.2269) (push) Has been cancelled
test / Linux (vim, v8.2.2434) (push) Has been cancelled
test / Linux (vim, v8.2.3995) (push) Has been cancelled
test / Windows (nvim, nightly) (push) Has been cancelled
test / Windows (nvim, v0.3.8) (push) Has been cancelled
test / Windows (nvim, v0.4.2) (push) Has been cancelled
test / Windows (nvim, v0.4.3) (push) Has been cancelled
test / Windows (nvim, v0.4.4) (push) Has been cancelled
test / Windows (nvim, v0.5.0) (push) Has been cancelled
test / Windows (nvim, v0.5.1) (push) Has been cancelled
test / Windows (nvim, v0.6.0) (push) Has been cancelled
test / Windows (nvim, v0.6.1) (push) Has been cancelled
test / Windows (nvim, v0.7.0) (push) Has been cancelled
test / Windows (nvim, v0.7.2) (push) Has been cancelled
test / Windows (nvim, v0.8.0) (push) Has been cancelled
test / Windows (nvim, v0.8.1) (push) Has been cancelled
test / Windows (nvim, v0.8.2) (push) Has been cancelled
test / Windows (nvim, v0.8.3) (push) Has been cancelled
test / Windows (nvim, v0.9.0) (push) Has been cancelled
test / Windows (nvim, v0.9.1) (push) Has been cancelled
test / Windows (vim, nightly) (push) Has been cancelled
test / Windows (vim, v7.4.1185) (push) Has been cancelled
test / Windows (vim, v7.4.1689) (push) Has been cancelled
test / Windows (vim, v8.0.0027) (push) Has been cancelled
test / Windows (vim, v8.0.1453) (push) Has been cancelled
test / Windows (vim, v8.1.2269) (push) Has been cancelled
test / Windows (vim, v8.2.2434) (push) Has been cancelled
test / Windows (vim, v8.2.3995) (push) Has been cancelled
docker / docker (push) Has been cancelled
mirror / check (coding) (push) Has been cancelled
mirror / check (gitee) (push) Has been cancelled
mirror / check (gitlab) (push) Has been cancelled
init
2024-08-21 14:17:26 +08:00

134 lines
3.0 KiB
VimL

function! sj#jsx#SplitJsxExpression()
" Examples:
"
" let x = <tag>
" () => <tag>
" return <tag>
"
let pattern = '\%(\%(let\|const\|var\)\s\+\k\+\s*=\s*\|)\s*=>\|return\s\+\)\s*' .
\ '\zs<\k[^>/[:space:]]*'
if sj#SearchUnderCursor(pattern) <= 0
return 0
endif
" is it a fully-closed jsx tag?
let body = sj#GetMotion('vat')
if body =~ '^<\(\k\+\).*</\1>$'
if body =~ "\n"
" multiple lines, not splitting
return 0
endif
call sj#ReplaceMotion('vat', "(\n".sj#Trim(body)."\n)")
return 1
endif
" is it a self-closing tag?
let body = sj#GetMotion('va>')
if body =~ '^<\k\+.*/>$'
if body =~ "\n"
" multiple lines, not splitting
return 0
endif
call sj#ReplaceMotion('va>', "(\n".sj#Trim(body)."\n)")
return 1
endif
return 0
endfunction
function! sj#jsx#JoinJsxExpression()
" Examples:
"
" let x = (
" () => (
" return (
"
let pattern = '\%(\%(let\|const\|var\)\s\+\k\+\s*=\s*\|)\s*=>\|return\s\+\)\s*($'
if sj#SearchUnderCursor(pattern) <= 0
return 0
endif
normal! $
let body = sj#Trim(sj#GetMotion('vi('))
if body =~ "\n"
" multiline tag, no point in handling
return 0
endif
if body !~ '^<\k\+.*/>$' && body !~ '^<\(\k\+\).*</\1>$'
" doesn't look like a tag
return 0
endif
call sj#ReplaceMotion('va(', body)
return 1
endfunction
function! sj#jsx#SplitSelfClosingTag()
if s:noTagUnderCursor()
return 0
endif
let tag = sj#GetMotion('va<')
if tag == '' || tag !~ '^<\k'
return 0
endif
" is it self-closing?
if tag !~ '/>$'
return 0
endif
let tag_name = matchstr(tag, '^<\zs\k[^>/[:space:]]*')
let replacement = substitute(tag, '\s*/>$', '>\n</'.tag_name.'>', '')
call sj#ReplaceMotion('va<', replacement)
return 1
endfunction
" Needs to be called with the cursor on a starting or ending tag to work.
function! sj#jsx#JoinHtmlTag()
if s:noTagUnderCursor()
return 0
endif
let tag = sj#GetMotion('vat')
if tag =~ '^\s*$'
return 0
endif
let tag_name = matchstr(tag, '^<\zs\k[^>/[:space:]]*')
let empty_tag_pattern = '>\_s*</\s*'.tag_name.'\s*>$'
if tag =~ empty_tag_pattern
" then there's no contents, let's turn it into a self-closing tag
let self_closing_tag = substitute(tag, empty_tag_pattern, ' />', '')
if self_closing_tag == tag
" then the substitution failed for some reason
return 0
endif
call sj#ReplaceMotion('vat', self_closing_tag)
else
" There's contents in the tag, let's try to single-line it
if len(split(tag, "\n")) == 1
" already single-line, nothing to do
return 0
endif
let body = sj#GetMotion('vit')
let body = join(sj#TrimList(split(body, "\n")), ' ')
call sj#ReplaceMotion('vit', body)
end
return 1
endfunction
function! s:noTagUnderCursor()
return searchpair('<', '', '>', 'cb', '', line('.')) <= 0
\ && searchpair('<', '', '>', 'c', '', line('.')) <= 0
endfunction