summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rst_helpers.lua242
1 files changed, 29 insertions, 213 deletions
diff --git a/rst_helpers.lua b/rst_helpers.lua
index bb48aed..0f6e10c 100644
--- a/rst_helpers.lua
+++ b/rst_helpers.lua
@@ -143,212 +143,47 @@ local function set_layout (line)
return layout
end
---function helpers.table.create(raw)
- --local self = {}
- --self.rows = {}
-
- --local p = patterns
-
- --self.resolve_parent = function(row, col)
- --print(row, col)
- --local cell = self.rows[row][col]
- --local par_row, par_col
- --if cell.parent then
- --par_row, par_col = self.resolve_parent(cell.parent.y, cell.parent.x)
- --else
- --return par_row, par_col
- --end
- --end
-
- --self.__init = function()
- --local hc = helpers.cell
- --self.layout = set_layout(raw[1])
- --local rowcount = 0
-
- -- first get the correct horizontal spans
- --local next_is_new_row = true
- --for n, line in ipairs(raw) do
- -- caching the test results
- --local sepline = p.sep_line:match(line)
- --local sephead = p.sep_head:match(line)
- --local seppart = p.sep_part:match(line)
- --local newrow = sepline or sephead or seppart
-
- --if newrow and n > 1 then
- --if sephead then
- --self.has_head = true
- --end
- --rowcount = rowcount + 1
- --end
-
- --if not (sepline or
- --sephead) then
- --local row = {}
- --row.newrow = (newrow or next_is_new_row) and true or false
- --next_is_new_row = false
- --local sl = self.layout
- --local splitted = {p.cells:match(line, 1, sl)}
- --local pos_layout, pos_line = 1, 1
- --local last = nil
- --local ignore = {}
- --ignore.n, ignore.parent = 0, nil
- --while pos_layout <= #sl.slices do
- --local splitpos = splitted[pos_line]
- --local splitpos = splitted[pos_layout]
- --local width_layout = sl.widths[pos_layout]
- --local span = 1
- --local this
- --if ignore.n > 0 then
- --ignore.n = ignore.n - 1
- --this = hc.create(false, n, pos_layout, true)
- --row[pos_layout] = this
- --this.parent = ignore.parent
- --else
- --local width_cell = utf.len(splitpos)
- --if width_cell > width_layout then
- --print(splitpos, width_cell, sl.slices[pos_layout], width_layout)
- -- check the horizontal span
- --span = span + hc.get_x_span(splitpos, sl, pos_layout)
- --end
- --pos_line = pos_line + span
- --this = hc.create(splitpos, n, pos_layout, false)
- --if p.dashesonly:match(splitpos) then
- --this.variant = "separator"
- --end
- --this.span.x = span
- --last = this
- --row[pos_layout] = this
- --ignore.n = span - 1
- --ignore.parent = ignore.n > 0 and { y = rowcount, x = pos_layout } or nil
- --end
- --pos_layout = pos_layout + 1
- --print(">",this.pos.y,this.pos.x,this.span.y,this.span.x)
- --if this.span.y > 1 then
- --print(">"..this.content.."<")
- --end
- --end
- --self.rows[#self.rows+1] = row
- --print(#self.rows.."<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<")
- --for i,j in ipairs(row) do print(i,j.content) end
- --print(row.newrow)
- --else -- separator
- --next_is_new_row = true
-
- --end
- --print(string.format("[t-%2s,%2s]> %s", n, m, cell))
- --end
- --print("rc = "..rowcount, "nr = "..#self.rows)
- --self.rowcount = rowcount
-
- --if self.rowcount < #self.rows then -- some cells span vertically
- --local has_partsep = function(row)
- --for n, cell in ipairs(row) do
- --if cell.variant == "separator" then
- --return true
- --end
- --end
- --return false
- --end
-
- --local dont_do_next = false
- --for nr,row in ipairs(self.rows) do
- --local ps = has_partsep(row)
-
- --row.ignore = ps and true or false
- --if ps then
- --self.rows[nr+1].newrow = true
- --end
- --if (not row.newrow or ps) and not dont_do_next then
- --print(">>>>>>>>>> NEXT <<<<<<<<<<<<")
- --print(row.newrow and has_partsep(row))
- -- continues last row either fully or partially
- --for nc, cell in ipairs(row) do
- --print(nr, nc, cell.content)
- --if cell.content == false then
- -- empty cell
- --elseif cell.variant ~= "separator" then
- --local par_row, par_col
- --if cell.parent then
- --par_row, par_col = self.resolve_parent(cell.parent.y, cell.parent.x)
- --print("old parent: ", par_row, par_col)
- --else -- no previous span, setting parent to preceding row
- --par_row, par_col = nr -1, nc
- --print("new parent: ", par_row, par_col)
- --end
-
- --print (nr, nc, cell.content, cell.parent, par_row, par_col)
- --local parent = self.rows[par_row][par_col]
- --parent.span.y = parent.span.y + 1
- --parent.content = parent.content .. cell.content
- --parent.stripped = parent.stripped .. " " .. cell.stripped
-
- --if ps then
- --local successor = self.rows[nr+1][nc]
- --successor.parent = { x = par_col, y = par_row }
- --parent.span.y = parent.span.y + 1
- --parent.content = parent.content .. successor.content
- --parent.stripped = parent.stripped .. " " .. successor.stripped
- --dont_do_next = true
- --else
- --dont_do_next = false
- --end
- --print(cell.content, parent.content)
- --add_y(cell)
- --end
- --end
- --elseif dont_do_next then
- --row.ignore = true
- --dont_do_next = false
- --end
- --end
- --end -- vertical span handler
- --end -- end __init
-
- --self.__init()
- --return self
---end
-
helpers_debug = true
function helpers.table.create(raw)
- local self = {}
- self.rows = {}
- self.layout = set_layout(raw[1])
+ local newtab = {}
+ newtab.rows = {}
+ newtab.layout = set_layout(raw[1])
local p = helpers.patterns
- self.resolve_parent = function(row, col, array)
- local array = array or self.rows
+ newtab.resolve_parent = function(row, col, array)
+ local array = array or newtab.rows
local cell = array[row][col]
local par_row, par_col = row, col
if cell.parent then
- par_row, par_col = self.resolve_parent(cell.parent.y, cell.parent.x)
+ par_row, par_col = newtab.resolve_parent(cell.parent.y, cell.parent.x)
end
return par_row, par_col
end
- self.__init = function()
+ newtab.__init = function()
local hc = helpers.cell
local rowcount = 0
- local selflayout = self.layout
+ local newtablayout = newtab.layout
for nr, row in ipairs(raw) do
- self.rows[nr] = {}
- local this_row = self.rows[nr]
+ newtab.rows[nr] = {}
+ local this_row = newtab.rows[nr]
this_row.sepline = p.sep_line:match(row)
this_row.sephead = p.sep_head:match(row)
this_row.seppart = p.sep_part:match(row)
if this_row.sephead then
- self.has_head = true
- self.head_end = nr
+ newtab.has_head = true
+ newtab.head_end = nr
end
- local splitted = { p.cells:match(row, 1, selflayout) }
+ local splitted = { p.cells:match(row, 1, newtablayout) }
local pos_layout, pos_row = 1, 1
local make_empty = {}
make_empty.n, make_empty.parent = 0, nil
- while pos_layout <= #selflayout.widths do
+ while pos_layout <= #newtablayout.widths do
local splitpos = splitted[pos_layout]
- local layoutwidth = selflayout.widths[pos_layout]
+ local layoutwidth = newtablayout.widths[pos_layout]
local span = 1
local this
@@ -356,10 +191,10 @@ function helpers.table.create(raw)
make_empty.n = make_empty.n - 1
this = hc.create("", nr, pos_layout, make_empty.parent)
this.parent = make_empty.parent
- p_row, p_col = self.resolve_parent(this.parent.y, this.parent.x)
- local thisparent = self.rows[p_row][p_col]
+ p_row, p_col = newtab.resolve_parent(this.parent.y, this.parent.x)
+ local thisparent = newtab.rows[p_row][p_col]
if this_row.sepline or this_row.sephead or
- self.rows[p_row][p_col].variant == "separator" then
+ newtab.rows[p_row][p_col].variant == "separator" then
this.variant = "separator"
else
this.variant = "empty1"
@@ -367,7 +202,7 @@ function helpers.table.create(raw)
else
local cellwidth = utf.len(splitpos)
if cellwidth > layoutwidth then
- span = span + hc.get_x_span(splitpos, selflayout, pos_layout)
+ span = span + hc.get_x_span(splitpos, newtablayout, pos_layout)
end
pos_row = pos_row + span
this = hc.create(splitpos, nr, pos_layout, nil)
@@ -385,23 +220,18 @@ function helpers.table.create(raw)
end -- while
end -- for loop over rows
- local oldrows = self.rows
- --local newrows = {}
+ local oldrows = newtab.rows
local newrows = oldrows
- for nc, width in ipairs(selflayout.widths) do
+ for nc, width in ipairs(newtablayout.widths) do
-- this is gonna be extremely slow but at least it's readable
local newrow
- --print("next columnt <-----------------------------")
local currentrow = 1
for nr, row in ipairs(newrows) do
- --newrows[nr] = newrows[nr] or {}
local cell = row[nc]
dbg_write("nc: %s, nr:%2s | %9s | ", nc, nr,cell.variant)
if row.sepline or row.sephead
or p.dashesonly:match(cell.content)
or cell.variant == "separator" then -- separator; skipping and beginning new row
-
- --newrows[currentrow] = cell
newrows[nr][nc] = cell
currentrow = currentrow + 1
newrow = true
@@ -411,7 +241,6 @@ function helpers.table.create(raw)
dbg_write("old >%24s< ", cell.stripped)
if cell.parent then dbg_write("parent |") else dbg_write("no par |") end
if newrow then
- --newrows[currentrow] = cell
newrows[nr][nc] = cell
currentrow = currentrow + 1
else -- continuing parent
@@ -419,11 +248,10 @@ function helpers.table.create(raw)
local par_row, par_col
local parent
if cell.parent then
- --dbg_write(" use %s,%2s | ", cell.parent.x, cell.parent.y)
- par_row, par_col = self.resolve_parent(cell.parent.y, cell.parent.x, newrows)
+ par_row, par_col = newtab.resolve_parent(cell.parent.y, cell.parent.x, newrows)
dbg_write(" use %s,%2s | ", par_col, par_row)
else -- Using vertical predecessor.
- par_row, par_col = self.resolve_parent(nr-1,nc, newrows)
+ par_row, par_col = newtab.resolve_parent(nr-1,nc, newrows)
dbg_write(" new %s,%2s | ", par_col, par_row)
end
parent = newrows[par_row][par_col]
@@ -433,19 +261,10 @@ function helpers.table.create(raw)
parent.span.y = parent.span.y + 1
end
- --print(#newrows, par_row)
- --if cell.variant ~= "empty1" then
- -- Cells of type empty1 already have their content
- -- delegated onto their respective horizontal parent.
parent.content = parent.content .. cell.content
parent.stripped = parent.stripped .. " " .. cell.stripped
cell.variant = "empty2"
- --end
cell.parent = { x = par_col, y = par_row }
- --this = hc.create("", nr, nc, { x = par_col, y = par_row }, "empty2")
- --this.variant = "empty2"
- --cell = hc.create("", nr, nc, { x = par_col, y = par_row }, "empty2")
- --newrows[nr][nc] = this
end
newrow = false
end
@@ -453,29 +272,26 @@ function helpers.table.create(raw)
newrows[nr][nc] = cell
end -- for loop over rows
end -- for loop over columns
- --self.rows = oldrows
- self.rows = newrows
+ --newtab.rows = oldrows
+ newtab.rows = newrows
end
- self.__init()
-
+ newtab.__init()
- self.__draw_debug = function()
- for nr, row in ipairs(self.rows) do
+ newtab.__draw_debug = function()
+ for nr, row in ipairs(newtab.rows) do
for nc, cell in ipairs(row) do
local field = cell.variant:sub(1,7)
if cell.parent then
field = field .. string.format(" %s,%2s",cell.parent.x, cell.parent.y)
end
dbg_write("%12s | ", field)
- --dbg_write("%10s | ",(cell.parent and "true" or "false"))
end
dbg_write("\n")
end
end
- --self.__draw_debug()
- return self
+ return newtab
end