From 00c54e8e02138088bdb5df3efc8b2d2137be5500 Mon Sep 17 00:00:00 2001 From: Dhruva Sagar Date: Thu, 24 Apr 2014 15:48:57 +0530 Subject: [PATCH] Refactoring alignment --- autoload/tablemode/align.vim | 42 +++++++++++++++---------------- autoload/tablemode/table.vim | 49 +++++++++++++++++++----------------- plugin/table-mode.vim | 1 + t/align.vim | 12 +++++++-- t/config/options.vim | 1 + 5 files changed, 58 insertions(+), 47 deletions(-) diff --git a/autoload/tablemode/align.vim b/autoload/tablemode/align.vim index d618f45..a6773af 100644 --- a/autoload/tablemode/align.vim +++ b/autoload/tablemode/align.vim @@ -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 diff --git a/autoload/tablemode/table.vim b/autoload/tablemode/table.vim index 15c1f7f..8e615d7 100644 --- a/autoload/tablemode/table.vim +++ b/autoload/tablemode/table.vim @@ -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 - diff --git a/plugin/table-mode.vim b/plugin/table-mode.vim index cea283c..11b7119 100644 --- a/plugin/table-mode.vim +++ b/plugin/table-mode.vim @@ -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('.') diff --git a/t/align.vim b/t/align.vim index 479f81a..60ca2f8 100644 --- a/t/align.vim +++ b/t/align.vim @@ -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 diff --git a/t/config/options.vim b/t/config/options.vim index 550ce28..a277b0f 100644 --- a/t/config/options.vim +++ b/t/config/options.vim @@ -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 = ':'