diff options
Diffstat (limited to 'vim/bundle/vim-table-mode/autoload/tablemode/align.vim')
-rw-r--r-- | vim/bundle/vim-table-mode/autoload/tablemode/align.vim | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/vim/bundle/vim-table-mode/autoload/tablemode/align.vim b/vim/bundle/vim-table-mode/autoload/tablemode/align.vim new file mode 100644 index 0000000..9e6330c --- /dev/null +++ b/vim/bundle/vim-table-mode/autoload/tablemode/align.vim @@ -0,0 +1,134 @@ +" Borrowed from Tabular +" Private Functions {{{1 +" function! s:StripTrailingSpaces(string) - Remove all trailing spaces {{{2 +" from a string. +function! s:StripTrailingSpaces(string) + return matchstr(a:string, '^.\{-}\ze\s*$') +endfunction + +function! s:Padding(string, length, where) "{{{3 + let gap_length = a:length - tablemode#utils#StrDisplayWidth(a:string) + if a:where =~# 'l' + return a:string . repeat(" ", gap_length) + elseif a:where =~# 'r' + return repeat(" ", gap_length) . a:string + elseif a:where =~# 'c' + let right = gap_length / 2 + let left = right + (right * 2 != gap_length) + return repeat(" ", left) . a:string . repeat(" ", right) + endif +endfunction + +" Public Functions {{{1 +" function! tablemode#align#Split() - Split a string into fields and delimiters {{{2 +" Like split(), but include the delimiters as elements +" All odd numbered elements are delimiters +" All even numbered elements are non-delimiters (including zero) +function! tablemode#align#Split(string, delim) + let rv = [] + let beg = 0 + + let len = len(a:string) + let searchoff = 0 + + while 1 + let mid = match(a:string, a:delim, beg + searchoff, 1) + if mid == -1 || mid == len + break + endif + + let matchstr = matchstr(a:string, a:delim, beg + searchoff, 1) + let length = strlen(matchstr) + + if length == 0 && beg == mid + " Zero-length match for a zero-length delimiter - advance past it + let searchoff += 1 + continue + endif + + if beg == mid + let rv += [ "" ] + else + let rv += [ a:string[beg : mid-1] ] + endif + + let rv += [ matchstr ] + + let beg = mid + length + let searchoff = 0 + endwhile + + let rv += [ strpart(a:string, beg) ] + + return rv +endfunction + +function! tablemode#align#alignments(lnum, ncols) "{{{2 + let achr = g:table_mode_align_char + let alignments = [] + if tablemode#table#IsBorder(a:lnum+1) + let hcols = tablemode#align#Split(getline(a:lnum+1), '[' . g:table_mode_corner . g:table_mode_corner_corner . ']') + for idx in range(len(hcols)) + " Right align if header + call add(alignments, 'l') + if hcols[idx] =~# achr . '[^'.achr.']\+' . achr + let alignments[idx] = 'c' + elseif hcols[idx] =~# achr . '$' + let alignments[idx] = 'r' + endif + " if hcols[idx] !~# '[^0-9\.]' | let alignments[idx] = 'r' | endif + endfor + end + return alignments +endfunction + +function! tablemode#align#Align(lines) "{{{2 + if empty(a:lines) | return [] | endif + let lines = map(a:lines, 'map(v:val, "v:key =~# \"text\" ? tablemode#align#Split(v:val, g:table_mode_separator) : v:val")') + + for line in lines + let stext = line.text + if len(stext) <= 1 | continue | endif + + if stext[0] !~ tablemode#table#StartExpr() + let stext[0] = s:StripTrailingSpaces(stext[0]) + endif + if len(stext) >= 2 + for i in range(1, len(stext)-1) + let stext[i] = tablemode#utils#strip(stext[i]) + endfor + endif + endfor + + let maxes = [] + for line in lines + let stext = line.text + if len(stext) <= 1 | continue | endif + for i in range(len(stext)) + if i == len(maxes) + let maxes += [ tablemode#utils#StrDisplayWidth(stext[i]) ] + else + let maxes[i] = max([ maxes[i], tablemode#utils#StrDisplayWidth(stext[i]) ]) + endif + endfor + endfor + + let alignments = tablemode#align#alignments(lines[0].lnum, len(lines[0].text)) + + for idx in range(len(lines)) + let tlnum = lines[idx].lnum + let tline = lines[idx].text + + if len(tline) <= 1 | continue | endif + for jdx in range(len(tline)) + " Dealing with the header being the first line + if jdx >= len(alignments) | call add(alignments, 'l') | endif + let field = s:Padding(tline[jdx], maxes[jdx], alignments[jdx]) + let tline[jdx] = field . (jdx == 0 || jdx == len(tline) ? '' : ' ') + endfor + + let lines[idx].text = s:StripTrailingSpaces(join(tline, '')) + endfor + + return lines +endfunction |