1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-01-24 05:30:07 +08:00
SpaceVim/bundle/vim-asciidoc/autoload/asciidoc.vim
2020-09-06 21:56:12 +08:00

123 lines
3.8 KiB
VimL

" TODO: create T title text-object
" TODO: make section jumps [[ ]] etc work
let s:atx_title = '\_^=*\s\+\(\S\%(.\%(\s\+=\+\s*\_$\)\@!\)*.\)\(\s\+=\+\)\?\s*$'
let s:setext_title_underline = '[-=~^+]\+\s*$'
let s:setext_title = '\_^\(\S.\+\)\s*\n' . s:setext_title_underline
let s:setext_levels = ['=','-', '~', '^', '+']
function! asciidoc#find_prior_section_title()
let old_pos = getpos('.')
let pos = old_pos
let pos[2] = 0
call setpos('.', pos)
let prior_atx = search(s:atx_title, 'Wbn')
let prior_setext = search(s:setext_title, 'Wbn')
call setpos('.', old_pos)
let prior = max([prior_atx, prior_setext])
if prior == 0
return
endif
return prior . 'G'
endfunction
function! asciidoc#find_next_section_title()
let next_atx = search(s:atx_title, 'Wn')
let next_setext = search(s:setext_title, 'Wn')
let next = min(filter([next_atx, next_setext], 'v:val != 0'))
if next == 0
return
endif
return next . 'G'
endfunction
function! asciidoc#get_atx_section_title(line_number)
let line = getline(a:line_number)
let match = matchlist(line, s:atx_title)
if !empty(match)
let title = match[1]
let symmetric = len(match[2]) != 0
let level = len(matchstr(line, '^=*'))
return {'line' : a:line_number, 'type' : 'atx', 'symmetric' : symmetric, 'level' : level, 'title' : title}
else
return {}
endif
endfunction
function! asciidoc#get_setext_section_title(line_number)
let line = getline(a:line_number)
if line =~ '^' . s:setext_title_underline
let underline = line
let line_number = a:line_number - 1
let line = getline(line_number)
else
let line_number = a:line_number
let underline = getline(line_number + 1)
endif
let level = 1 + index(s:setext_levels, underline[0])
if (line . "\n" . underline) =~ s:setext_title
return {'line' : line_number, 'type' : 'setext', 'level' : level, 'title' : line}
else
return {}
endif
endfunction
function! asciidoc#get_section_title(line_number)
let atx = asciidoc#get_atx_section_title(a:line_number)
if !empty(atx)
return atx
else
return asciidoc#get_setext_section_title(a:line_number)
endif
endfunction
function! asciidoc#set_atx_section_title(line_number, level, title, symmetric)
let level_marks = repeat('=', a:level)
call setline(a:line_number, level_marks . ' ' . a:title . (a:symmetric ? (' ' . level_marks) : ''))
endfunction
function! asciidoc#set_setext_section_title(line_number, level, title)
let line_number = a:line_number + 1
let level_marks = repeat(s:setext_levels[a:level - 1], len(a:title))
if getline(line_number) =~ '^$'
call append(line_number - 1, level_marks)
else
call setline(line_number, level_marks)
endif
endfunction
function! asciidoc#set_section_title_level(level)
let line = line('.')
let section_title = asciidoc#get_section_title(line)
if !empty(section_title)
if section_title.type == 'atx'
call asciidoc#set_atx_section_title(section_title.line, a:level, section_title.title, section_title.symmetric)
else
call asciidoc#set_setext_section_title(section_title.line, a:level, section_title.title)
endif
else
let title = getline('.')
if g:asciidoc_title_style == 'atx'
call asciidoc#set_atx_section_title(line, a:level, title, g:asciidoc_title_style_atx != 'asymmetric')
else
call asciidoc#set_setext_section_title(line, a:level, title)
endif
endif
endfunction
function! asciidoc#make_list(type) range
let old_search = @/
exe a:firstline . ',' . a:lastline . 's/^\s*\([*.]*\)\s*/\=repeat("' . a:type . '", max([1, len(submatch(1))]))." "/'
let @/ = old_search
endfunction
function! asciidoc#dent_list(in_out) range
let old_search = @/
if a:in_out == 'in'
silent! exe a:firstline . ',' . a:lastline . 's/^[*.]//'
else
silent! exe a:firstline . ',' . a:lastline . 's/^\([*.]\)/&&/'
endif
let @/ = old_search
endfunction