123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428 |
- " Private Functions {{{1
- function! s:TotalCells(list) "{{{2
- let result = 0
- for item in a:list
- if type(item) == type([])
- let result += s:TotalCells(item)
- else
- let result += 1
- endif
- endfor
- return result
- endfunction
- function! s:Min(list) "{{{2
- let found = v:false
- let result = 0
- for item in a:list
- if empty(item)
- continue
- endif
- if type(item) == type(1) || type(item) == type(1.0)
- if found == v:false || item < result
- let found = v:true
- let result = item
- endif
- elseif type(item) == type('')
- let val = str2float(item)
- if found == v:false || val < result
- let found = v:true
- let result = val
- endif
- elseif type(item) == type([])
- let val = s:Min(item)
- if found == v:false || val < result
- let found = v:true
- let result = val
- endif
- endif
- endfor
- return result
- endfunction
- function! s:Max(list) "{{{2
- let found = v:false
- let result = 0
- for item in a:list
- if empty(item)
- continue
- endif
- if type(item) == type(1) || type(item) == type(1.0)
- if found == v:false || item > result
- let found = v:true
- let result = item
- endif
- elseif type(item) == type('')
- let val = str2float(item)
- if found == v:false || val > result
- let found = v:true
- let result = val
- endif
- elseif type(item) == type([])
- let val = s:Max(item)
- if found == v:false || val > result
- let found = v:true
- let result = val
- endif
- endif
- endfor
- return result
- endfunction
- function! s:CountE(list) "{{{2
- let result = 0
- for item in a:list
- if empty(item)
- let result += 1
- elseif type(item) == type([])
- let result += s:CountE(item)
- endif
- endfor
- return result
- endfunction
- function! s:CountNE(list) "{{{2
- let result = 0
- for item in a:list
- if type(item) == type([])
- let result += s:CountNE(item)
- elseif !empty(item)
- let result += 1
- endif
- endfor
- return result
- endfunction
- function! s:PercentE(list) "{{{2
- return (s:CountE(a:list)*100)/s:TotalCells(a:list)
- endfunction
- function! s:PercentNE(list) "{{{2
- return (s:CountNE(a:list)*100)/s:TotalCells(a:list)
- endfunction
- function! s:Sum(list) "{{{2
- let result = 0.0
- for item in a:list
- if type(item) == type(1) || type(item) == type(1.0)
- let result += item
- elseif type(item) == type('')
- let result += str2float(item)
- elseif type(item) == type([])
- let result += s:Sum(item)
- endif
- endfor
- return result
- endfunction
- function! s:Average(list) "{{{2
- return s:Sum(a:list)/s:TotalCells(a:list)
- endfunction
- function! s:AverageNE(list) "{{{2
- return s:Sum(a:list)/s:CountNE(a:list)
- endfunction
- " Public Functions {{{1
- function! tablemode#spreadsheet#GetFirstRow(line) "{{{2
- if tablemode#table#IsRow(a:line)
- let line = tablemode#utils#line(a:line)
- while !tablemode#table#IsHeader(line - 1) && (tablemode#table#IsRow(line - 1) || tablemode#table#IsBorder(line - 1))
- let line -= 1
- endwhile
- if tablemode#table#IsBorder(line) | let line += 1 | endif
- return line
- endif
- endfunction
- function! tablemode#spreadsheet#GetFirstRowOrHeader(line) "{{{2
- if tablemode#table#IsRow(a:line)
- let line = tablemode#utils#line(a:line)
- while tablemode#table#IsTable(line - 1)
- let line -= 1
- endwhile
- if tablemode#table#IsBorder(line) | let line += 1 | endif
- return line
- endif
- endfunction
- function! tablemode#spreadsheet#MoveToFirstRow() "{{{2
- if tablemode#table#IsRow('.')
- call tablemode#utils#MoveToLine(tablemode#spreadsheet#GetFirstRow('.'))
- endif
- endfunction
- function! tablemode#spreadsheet#MoveToFirstRowOrHeader() "{{{2
- if tablemode#table#IsRow('.')
- call tablemode#utils#MoveToLine(tablemode#spreadsheet#GetFirstRowOrHeader('.'))
- endif
- endfunction
- function! tablemode#spreadsheet#GetLastRow(line) "{{{2
- if tablemode#table#IsRow(a:line)
- let line = tablemode#utils#line(a:line)
- while tablemode#table#IsTable(line + 1)
- let line += 1
- endwhile
- if tablemode#table#IsBorder(line) | let line -= 1 | endif
- return line
- endif
- endfunction
- function! tablemode#spreadsheet#MoveToLastRow() "{{{2
- if tablemode#table#IsRow('.')
- call tablemode#utils#MoveToLine(tablemode#spreadsheet#GetLastRow('.'))
- endif
- endfunction
- function! tablemode#spreadsheet#LineNr(line, row) "{{{2
- if tablemode#table#IsRow(a:line)
- let line = tablemode#spreadsheet#GetFirstRow(a:line)
- let row_nr = 0
- while tablemode#table#IsTable(line + 1)
- if tablemode#table#IsRow(line)
- let row_nr += 1
- if a:row ==# row_nr | break | endif
- endif
- let line += 1
- endwhile
- return line
- endif
- endfunction
- function! tablemode#spreadsheet#RowNr(line) "{{{2
- let line = tablemode#utils#line(a:line)
- let rowNr = 0
- while !tablemode#table#IsHeader(line) && tablemode#table#IsTable(line)
- if tablemode#table#IsRow(line) | let rowNr += 1 | endif
- let line -= 1
- endwhile
- return rowNr
- endfunction
- function! tablemode#spreadsheet#RowCount(line) "{{{2
- let line = tablemode#utils#line(a:line)
- let [tline, totalRowCount] = [line, 0]
- while !tablemode#table#IsHeader(tline) && tablemode#table#IsTable(tline)
- if tablemode#table#IsRow(tline) | let totalRowCount += 1 | endif
- let tline -= 1
- endwhile
- let tline = line + 1
- while !tablemode#table#IsHeader(tline) && tablemode#table#IsTable(tline)
- if tablemode#table#IsRow(tline) | let totalRowCount += 1 | endif
- let tline += 1
- endwhile
- return totalRowCount
- endfunction
- function! tablemode#spreadsheet#ColumnNr(pos) "{{{2
- let pos = []
- if type(a:pos) == type('')
- let pos = [line(a:pos), col(a:pos)]
- elseif type(a:pos) == type([])
- let pos = a:pos
- else
- return 0
- endif
- let row_start = stridx(getline(pos[0]), g:table_mode_separator)
- return tablemode#utils#SeparatorCount(getline(pos[0])[row_start:pos[1]-2])
- endfunction
- function! tablemode#spreadsheet#ColumnCount(line) "{{{2
- return tablemode#utils#SeparatorCount(getline(tablemode#utils#line(a:line))) - 1
- endfunction
- function! tablemode#spreadsheet#IsFirstCell() "{{{2
- return tablemode#spreadsheet#ColumnNr('.') ==# 1
- endfunction
- function! tablemode#spreadsheet#IsLastCell() "{{{2
- return tablemode#spreadsheet#ColumnNr('.') ==# tablemode#spreadsheet#ColumnCount('.')
- endfunction
- function! tablemode#spreadsheet#MoveToStartOfCell() "{{{2
- if getline('.')[col('.')-1] !=# g:table_mode_separator || tablemode#spreadsheet#IsLastCell()
- call search(g:table_mode_escaped_separator_regex, 'b', line('.'))
- endif
- normal! 2l
- endfunction
- function! tablemode#spreadsheet#MoveToEndOfCell() "{{{2
- call search(g:table_mode_escaped_separator_regex, 'z', line('.'))
- normal! 2h
- endfunction
- function! tablemode#spreadsheet#DeleteColumn() "{{{2
- if tablemode#table#IsRow('.')
- for i in range(v:count1)
- call tablemode#spreadsheet#MoveToStartOfCell()
- call tablemode#spreadsheet#MoveToFirstRowOrHeader()
- silent! execute "normal! h\<C-V>"
- call tablemode#spreadsheet#MoveToEndOfCell()
- normal! 2l
- call tablemode#spreadsheet#MoveToLastRow()
- normal! d
- endfor
- call tablemode#table#Realign('.')
- endif
- endfunction
- function! tablemode#spreadsheet#DeleteRow() "{{{2
- if tablemode#table#IsRow('.')
- for i in range(v:count1)
- if tablemode#table#IsRow('.')
- normal! dd
- endif
- if !tablemode#table#IsRow('.')
- normal! k
- endif
- endfor
- call tablemode#table#Realign('.')
- endif
- endfunction
- function! tablemode#spreadsheet#InsertColumn(after) "{{{2
- if tablemode#table#IsRow('.')
- let quantity = v:count1
- call tablemode#spreadsheet#MoveToFirstRowOrHeader()
- call tablemode#spreadsheet#MoveToStartOfCell()
- if a:after
- call tablemode#spreadsheet#MoveToEndOfCell()
- normal! 3l
- endif
- execute "normal! h\<C-V>"
- call tablemode#spreadsheet#MoveToLastRow()
- normal! y
- let corner = tablemode#utils#get_buffer_or_global_option('table_mode_corner')
- if a:after
- let cell_line = g:table_mode_separator.' '
- let header_line = corner.g:table_mode_fillchar.g:table_mode_fillchar
- else
- let cell_line = ' '.g:table_mode_separator
- let header_line = g:table_mode_fillchar.g:table_mode_fillchar.corner
- endif
- let cell_line = escape(cell_line, '\&')
- let header_line = escape(header_line, '\&')
- " This transforms the character column before or after the column separator
- " into a new column with separator.
- " This requires, that
- " g:table_mode_separator != g:table_mode_fillchar
- " && g:table_mode_separator != g:table_mode_header_fillchar
- " && g:table_mode_separator != g:table_mode_align_char
- call setreg(
- \ '"',
- \ substitute(
- \ substitute(@", ' ', cell_line, 'g'),
- \ '\V\C'.escape(g:table_mode_fillchar, '\')
- \ .'\|'.escape(g:table_mode_header_fillchar, '\')
- \ .'\|'.escape(g:table_mode_align_char, '\'),
- \ header_line,
- \ 'g'),
- \ 'b')
- if a:after
- execute "normal! ".quantity."pl"
- else
- execute "normal! ".quantity."P"
- endif
- call tablemode#table#Realign('.')
- startinsert
- endif
- endfunction
- function! tablemode#spreadsheet#Min(range, ...) abort "{{{2
- let args = copy(a:000)
- call insert(args, a:range)
- return s:Min(call('tablemode#spreadsheet#cell#GetCellRange', args))
- endfunction
- function! tablemode#spreadsheet#Max(range, ...) abort "{{{2
- let args = copy(a:000)
- call insert(args, a:range)
- return s:Max(call('tablemode#spreadsheet#cell#GetCellRange', args))
- endfunction
- function! tablemode#spreadsheet#CountE(range, ...) abort "{{{2
- let args = copy(a:000)
- call insert(args, a:range)
- return s:CountE(call('tablemode#spreadsheet#cell#GetCellRange', args))
- endfunction
- function! tablemode#spreadsheet#CountNE(range, ...) abort "{{{2
- let args = copy(a:000)
- call insert(args, a:range)
- return s:CountNE(call('tablemode#spreadsheet#cell#GetCellRange', args))
- endfunction
- function! tablemode#spreadsheet#PercentE(range, ...) abort "{{{2
- let args = copy(a:000)
- call insert(args, a:range)
- return s:PercentE(call('tablemode#spreadsheet#cell#GetCellRange', args))
- endfunction
- function! tablemode#spreadsheet#PercentNE(range, ...) abort "{{{2
- let args = copy(a:000)
- call insert(args, a:range)
- return s:PercentNE(call('tablemode#spreadsheet#cell#GetCellRange', args))
- endfunction
- function! tablemode#spreadsheet#Sum(range, ...) abort "{{{2
- let args = copy(a:000)
- call insert(args, a:range)
- return s:Sum(call('tablemode#spreadsheet#cell#GetCellRange', args))
- endfunction
- function! tablemode#spreadsheet#Average(range, ...) abort "{{{2
- let args = copy(a:000)
- call insert(args, a:range)
- return s:Average(call('tablemode#spreadsheet#cell#GetCellRange', args))
- endfunction
- function! tablemode#spreadsheet#AverageNE(range, ...) abort "{{{2
- let args = copy(a:000)
- call insert(args, a:range)
- return s:AverageNE(call('tablemode#spreadsheet#cell#GetCellRange', args))
- endfunction
- function! tablemode#spreadsheet#Sort(bang, ...) range "{{{2
- if exists('*getcurpos')
- let col = getcurpos()[4] " curswant
- else
- let col = col('.')
- endif
- let opts = a:0 ? a:1 : ''
- let bang = a:bang ? '!' : ''
- if a:firstline == a:lastline
- let [firstRow, lastRow] = [tablemode#spreadsheet#GetFirstRow('.'), tablemode#spreadsheet#GetLastRow('.')]
- else
- let [firstRow, lastRow] = [a:firstline, a:lastline]
- endif
- call tablemode#spreadsheet#MoveToStartOfCell()
- exec ':undojoin | '.firstRow.','.lastRow . 'sort'.bang opts '/.*\%'.col.'v/'
- endfunction
- function! tablemode#spreadsheet#EchoCell()
- if tablemode#table#IsRow('.')
- echomsg '$' . tablemode#spreadsheet#RowNr('.') . ',' . tablemode#spreadsheet#ColumnNr('.')
- endif
- endfunction
|