Added support for column alignment #23

Now we can define gfm-style aligment by adding them to the header column
This commit is contained in:
Dhruva Sagar
2014-04-25 14:42:02 +05:30
parent 71051e2c22
commit 5007e5f728
2 changed files with 44 additions and 12 deletions

View File

@@ -64,11 +64,21 @@ function! s:Padding(string, length, where) "{{{3
endif
endfunction
" function! s:Split() - Split a string into fields and delimiters {{{2
" Public Functions {{{1
function! tablemode#align#sid() "{{{2
return maparg('<sid>', 'n')
endfunction
nnoremap <sid> <sid>
function! tablemode#align#scope() "{{{2
return s:
endfunction
" 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! s:Split(string, delim)
function! tablemode#align#Split(string, delim)
let rv = []
let beg = 0
@@ -107,18 +117,20 @@ function! s:Split(string, delim)
return rv
endfunction
" Public Functions {{{1
function! tablemode#align#sid() "{{{2
return maparg('<sid>', 'n')
endfunction
nnoremap <sid> <sid>
function! tablemode#align#scope() "{{{2
return s:
function! tablemode#align#alignments(lnum, ncols) "{{{2
let alignments = repeat(['l'], a:ncols) " For each column
if tablemode#table#IsHeader(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
if hcols[idx] =~# g:table_mode_align_char . '$' | let alignments[idx] = 'r' | endif
endfor
end
return alignments
endfunction
function! tablemode#align#Align(lines) "{{{2
let lines = map(a:lines, 'map(v:val, "v:key =~# \"text\" ? s:Split(v:val, g:table_mode_separator) : v:val")')
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
@@ -147,13 +159,15 @@ function! tablemode#align#Align(lines) "{{{2
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 i in range(len(tline))
let field = s:Padding(tline[i], maxes[i], tablemode#table#alignment(tline[i]))
let field = s:Padding(tline[i], maxes[i], alignments[i])
let tline[i] = field . (i == 0 || i == len(tline) ? '' : ' ')
endfor

View File

@@ -50,6 +50,24 @@ function! s:GenerateHeaderBorder(line) "{{{2
let border = substitute(border, '[^' . g:table_mode_corner . ']', g:table_mode_fillchar, 'g')
let border = substitute(border, '^' . g:table_mode_corner . '\(.*\)' . g:table_mode_corner . '$', g:table_mode_corner_corner . '\1' . g:table_mode_corner_corner, '')
" Incorporate header alignment chars
if getline(line) =~# g:table_mode_align_char
let pat = '[' . g:table_mode_corner_corner . g:table_mode_corner . ']'
let hcols = tablemode#align#Split(getline(line), pat)
let gcols = tablemode#align#Split(border, pat)
for idx in range(len(hcols))
if hcols[idx] =~# g:table_mode_align_char
if hcols[idx] =~# g:table_mode_align_char . '$'
let gcols[idx] = gcols[idx][:-2] . g:table_mode_align_char
else
let gcols[idx] = g:table_mode_align_char . gcols[idx][1:]
endif
endif
endfor
let border = join(gcols, '')
endif
let cstartexpr = tablemode#table#StartCommentExpr()
if tablemode#utils#strlen(cstartexpr) > 0 && getline(line) =~# cstartexpr
let sce = matchstr(line_val, tablemode#table#StartCommentExpr())