Refactoring alignment

This commit is contained in:
Dhruva Sagar
2014-04-24 15:48:57 +05:30
parent cfbac6979d
commit 00c54e8e02
5 changed files with 58 additions and 47 deletions

View File

@@ -118,48 +118,46 @@ function! tablemode#align#scope() "{{{2
endfunction
function! tablemode#align#Align(lines) "{{{2
let lines = map(a:lines, 's:Split(v:val, g:table_mode_separator)')
let lines = map(a:lines, 'map(v:val, "v:key =~# \"text\" ? s:Split(v:val, g:table_mode_separator) : v:val")')
for line in lines
if len(line) <= 1 | continue | endif
let stext = line.text
if len(stext) <= 1 | continue | endif
if line[0] !~ tablemode#table#StartExpr()
let line[0] = s:StripTrailingSpaces(line[0])
if stext[0] !~ tablemode#table#StartExpr()
let stext[0] = s:StripTrailingSpaces(stext[0])
endif
if len(line) >= 2
for i in range(1, len(line)-1)
let line[i] = tablemode#utils#strip(line[i])
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
if len(line) <= 1 | continue | endif
for i in range(len(line))
let stext = line.text
if len(stext) <= 1 | continue | endif
for i in range(len(stext))
if i == len(maxes)
let maxes += [ s:Strlen(line[i]) ]
let maxes += [ s:Strlen(stext[i]) ]
else
let maxes[i] = max([ maxes[i], s:Strlen(line[i]) ])
let maxes[i] = max([ maxes[i], s:Strlen(stext[i]) ])
endif
endfor
endfor
for idx in range(len(lines))
let line = lines[idx]
let tlnum = lines[idx].lnum
let tline = lines[idx].text
if len(line) <= 1 | continue | endif
for i in range(len(line))
if line[i] !~# '[^0-9\.]'
let field = s:Padding(line[i], maxes[i], 'r')
else
let field = s:Padding(line[i], maxes[i], 'l')
endif
let line[i] = field . (i == 0 || i == len(line) ? '' : ' ')
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 tline[i] = field . (i == 0 || i == len(tline) ? '' : ' ')
endfor
let lines[idx] = s:StripTrailingSpaces(join(line, ''))
let lines[idx].text = s:StripTrailingSpaces(join(tline, ''))
endfor
return lines

View File

@@ -21,7 +21,7 @@
function! s:HeaderBorderExpr() "{{{2
return tablemode#table#StartExpr() .
\ '[' . g:table_mode_corner . g:table_mode_corner_corner . ']' .
\ '[' . g:table_mode_fillchar . g:table_mode_corner . ']*' .
\ '[' . g:table_mode_fillchar . g:table_mode_corner . g:table_mode_align_char . ']*' .
\ '[' . g:table_mode_corner . g:table_mode_corner_corner . ']' .
\ tablemode#table#EndExpr()
endfunction
@@ -147,44 +147,47 @@ function! tablemode#table#AddHeaderBorder(line) "{{{2
call setline(a:line, s:GenerateHeaderBorder(a:line))
endfunction
function! tablemode#table#alignment(line) "{{{2
if a:line !~# '[^0-9\.]'
return 'r'
else
return 'l'
endif
endfunction
function! tablemode#table#Realign(line) "{{{2
let line = tablemode#utils#line(a:line)
let [lnums, lines] = [[], []]
let [tline, blines] = [line, []]
while tablemode#table#IsATableRow(tline) || tablemode#table#IsATableHeader(tline)
if tablemode#table#IsATableHeader(tline)
call insert(blines, tline)
let tline -= 1
let lines = []
let [lnum, blines] = [line, []]
while tablemode#table#IsATableRow(lnum) || tablemode#table#IsATableHeader(lnum)
if tablemode#table#IsATableHeader(lnum)
call insert(blines, lnum)
let lnum -= 1
continue
endif
call insert(lnums, tline)
call insert(lines, getline(tline))
let tline -= 1
call insert(lines, {'lnum': lnum, 'text': getline(lnum)})
let lnum -= 1
endwhile
let tline = line + 1
while tablemode#table#IsATableRow(tline) || tablemode#table#IsATableHeader(tline)
if tablemode#table#IsATableHeader(tline)
call insert(blines, tline)
let tline += 1
let lnum = line + 1
while tablemode#table#IsATableRow(lnum) || tablemode#table#IsATableHeader(lnum)
if tablemode#table#IsATableHeader(lnum)
call insert(blines, lnum)
let lnum += 1
continue
endif
call add(lnums, tline)
call add(lines, getline(tline))
let tline += 1
call insert(lines, {'lnum': lnum, 'text': getline(lnum)})
let lnum += 1
endwhile
let lines = tablemode#align#Align(lines)
for lnum in lnums
let index = index(lnums, lnum)
call setline(lnum, lines[index])
for aline in lines
call setline(aline.lnum, aline.text)
endfor
for bline in blines
call tablemode#table#AddHeaderBorder(bline)
endfor
endfunction

View File

@@ -42,6 +42,7 @@ call s:SetGlobalOptDefault('table_mode_toggle_map', 'm')
call s:SetGlobalOptDefault('table_mode_always_active', 0)
call s:SetGlobalOptDefault('table_mode_delimiter', ',')
call s:SetGlobalOptDefault('table_mode_corner_corner', '|')
call s:SetGlobalOptDefault('table_mode_align_char', ':')
function! s:TableEchoCell() "{{{1
if tablemode#table#IsATableRow('.')

View File

@@ -3,12 +3,20 @@ source t/config/options.vim
call vspec#hint({'scope': 'tablemode#align#scope()', 'sid': 'tablemode#align#sid()'})
function! ConvertLines2Dict(lines)
let lines = []
for idx in range(len(a:lines))
call insert(lines, {"lnum": idx+1, "text": a:lines[idx]})
endfor
return lines
endfunction
describe 'Align'
it 'should align table content correctly'
Expect tablemode#align#Align(readfile('t/fixtures/align/simple_before.txt')) == readfile('t/fixtures/align/simple_after.txt')
Expect tablemode#align#Align(ConvertLines2Dict(readfile('t/fixtures/align/simple_before.txt'))) == ConvertLines2Dict(readfile('t/fixtures/align/simple_after.txt'))
end
it 'should align table content with unicode characters correctly'
Expect tablemode#align#Align(readfile('t/fixtures/align/unicode_before.txt')) == readfile('t/fixtures/align/unicode_after.txt')
Expect tablemode#align#Align(ConvertLines2Dict(readfile('t/fixtures/align/unicode_before.txt'))) == ConvertLines2Dict(readfile('t/fixtures/align/unicode_after.txt'))
end
end

View File

@@ -6,3 +6,4 @@ let g:table_mode_toggle_map = 'm'
let g:table_mode_always_active = 0
let g:table_mode_delimiter = ','
let g:table_mode_corner_corner = '|'
let g:table_mode_align_char = ':'