darkrc/lua/vim.moon
DarkWiiPlayer 9a8141d73b Add tab function to vim.moon and refactor
vim.column is now called vim.col and has been turned into a wrapper for
the tab function. The vim.row wrapper has been added and does what you'd
expect. vim.box is also a wrapper for vim.tab now.
Some other refactoring has been done.
2018-08-15 10:22:11 +02:00

98 lines
2.3 KiB
Text

-- vim: set noexpandtab :miv --
-- ┌──────────────────────────┐
-- │ Generic Helper Functions │
-- └──────────────────────────┘
match_all = (str, pat, init=0) ->
s,e = str\find(pat, init)
if s then
return str\sub(s,e), match_all(str, pat, e+1)
match_lines = (str) -> match_all(str, '[^\n]+')
tree = (tab, pref='') ->
print tab.title and tab.title or '┐'
for idx, element in ipairs tab
last = idx == #tab
first = idx == 1
io.write pref
io.write last and "└─" or "├─"
switch type element
when "table"
tree element, pref .. (last and ' ' or '│ ')
else
print tostring element
pad = (str='', len) ->
str..string.rep(" ", len-#str)
-- ┌──────────────────┐
-- │ Actual Functions │
-- └──────────────────┘
import max from math
chktbl = (obj) -> error("Object is not a table", 2) if type(obj) ~= 'table'
to_tab = (obj) -> type(obj)=='table' and obj or {match_lines tostring obj}
tab = (rows) ->
-- Get Measurements
chktbl(rows)
width = {}
height = {}
for row, fields in ipairs rows
chktbl(fields)
height[row] = 1
for col, lines in ipairs fields
lines = to_tab lines
height[row] = max(height[row], #lines)
for line in *lines do
width[col] = max(width[col] or 1, #line)
fields[col] = lines
bars = [string.rep('─', i+2) for i in *width]
-- Top Line
print '┌'..table.concat(bars, '┬')..'┐'
-- Rows
for row, fields in ipairs rows
for line=1,height[row]
io.write '│' -- Outer Left Border
for col, lines in ipairs fields
io.write ' '..pad(lines[line], width[col])..' '
io.write '│' if col < #fields
print '│' -- Outer Left Border
print '├'..table.concat(bars, '┼')..'┤' unless row == #rows
print '└'..table.concat(bars, '┴')..'┘'
col = (col) -> tab([{elem} for elem in *col])
row = (row) -> tab{row}
box = (box) -> tab{{box}}
CLASS = [[
print vim.col {
{ 'Class' } -- Title
{
-- Members
}
{
-- Methods
}
}
]]
draw = ->
for line in * {
{ "─", "│", "┼" }
{ "┌", "┐", "└", "┘" }
{ "├", "┤", "┬", "┴" }
{ "╼", "╽", "╾", "╾" }
}
print table.concat(line, " ")
{
:tree, :box, :draw, :tab, :col, :row
:CLASS
-- Aliases
table: tab
}