summaryrefslogtreecommitdiff
path: root/rst_helpers.lua
diff options
context:
space:
mode:
authorPhilipp Gesang <pgesang@ix.urz.uni-heidelberg.de>2010-09-12 18:52:11 +0200
committerPhilipp Gesang <pgesang@ix.urz.uni-heidelberg.de>2010-09-12 18:52:11 +0200
commit76cf9b771dd680c4b05c2a0c59c0ec84d0f36b0d (patch)
tree38e7988d4f367243ff8c946a54d9df8ea5236a02 /rst_helpers.lua
parentf14eb1fcfb3bdac66b528d50c44003879935a5a1 (diff)
downloadcontext-rst-76cf9b771dd680c4b05c2a0c59c0ec84d0f36b0d.tar.gz
revised simple table implementation; first step
Diffstat (limited to 'rst_helpers.lua')
-rw-r--r--rst_helpers.lua114
1 files changed, 51 insertions, 63 deletions
diff --git a/rst_helpers.lua b/rst_helpers.lua
index d80fdbd..7598698 100644
--- a/rst_helpers.lua
+++ b/rst_helpers.lua
@@ -47,7 +47,8 @@ do
p.cellcontent = (1 - p.celldelim)
p.cell = p.celldelim * C((1 - p.celldelim)^1) * #p.celldelim
p.cell_line = p.plus * p.dash^1 * #p.plus
- p.dashesonly = p.dash^1 * p.last
+ p.dashesonly = p.dash^1 * p.last
+ p.spacesonly = p.space^1 * p.last
p.col_start = Cp() * p.dash_or_equals^1
p.col_stop = p.dash_or_equals^1 * Cp()
@@ -59,6 +60,7 @@ do
p.st_span_starts = Ct(Cp() * p.dash^1 * (p.space^1 * Cp() * p.dash^1)^0)
p.st_span_stops = Ct(p.dash^1 * Cp() * (p.space^1 * p.dash^1 * Cp())^0)
+
p.cells = P{
[1] = "cells",
cells = p.celldelim
@@ -500,77 +502,63 @@ function helpers.table.simple(raw)
local bounds = helpers.get_st_boundaries(raw[1])
local p = patterns
- for nr=1, #raw do
- local row = raw[nr]
- if p.st_colspan:match(row) then
- local spans = {}
- spans.starts = p.st_span_starts:match(row)
- spans.stops = p.st_span_stops :match(row)
- local all_match = true
- for n=1, #spans.starts do -- check if they match the table layout
- local start = spans.starts[n]
- local stop = spans.stops[n]
- if not bounds.starts[start] or
- not bounds.stops[stop] then
- all_match = false
- break
+ for nr, row in ipairs(raw) do
+ local newrow = {}
+ local nc = 1
+ if not p.st_headsep:match(row) and
+ not p.st_colspan:match(row) then
+ local starts, stops = {}, {}
+ local check_span = false
+ if p.st_colspan:match(raw[nr+1]) then -- expect spans over several columns
+ starts = p.st_span_starts:match(raw[nr+1])
+ stops = p.st_span_stops :match(raw[nr+1])
+ check_span = true
+ else
+ for colnr, slice in ipairs(bounds.slices) do
+ starts[colnr] = slice.start
+ stops [colnr] = slice.stop
end
end
- if all_match then
- spans.cols = {}
- for n, start in ipairs(spans.starts) do -- find the start and end columns
- local stop = spans.stops[n]
- local starts_at, stops_at
- for o=1, #bounds.slices do
- if bounds.slices[o].start == start then
- starts_at = o
+
+ for nc, start in ipairs(starts) do
+ local stop = stops[nc]
+ local cell = {
+ content = "",
+ span = { x = 1, y = 1 },
+ --ignore = false
+ }
+ cell.content = string.strip(row:sub(start, stop))
+ if check_span then
+ local start_at, stop_at
+ for colnr, slice in ipairs(bounds.slices) do
+ print(start, slice.start, stop, slice.stop)
+ if slice.start == start then
+ start_at = colnr
end
- if bounds.slices[o].stop == stop then
- stops_at = o
+ if start_at and
+ not (colnr == #bounds.slices) then
+ if slice.stop == stop then
+ stop_at = colnr
+ break
+ end
+ else -- last column, width doesn't matter
+ stop_at = colnr
end
end
- spans.cols[n] = 1 + stops_at - starts_at
+ cell.span.x = 1 + stop_at - start_at
+ print(start_at, stop_at, cell.span.x)
end
- multispans[nr-1] = spans
+ newrow[nc] = cell
end
- end
- end
-
- for nr, row in ipairs(raw) do
- local newrow = {}
- if p.st_headsep:match(row) then
- newrow.separator = true
- if nr > 1 and #raw > nr then -- Ends the header.
- rows.has_head = true
- rows.head_end = nr
- end
- elseif multispans[nr] then
- local spans = multispans[nr]
- for nc, span in ipairs(spans.cols) do
- local this = {}
- this.content = string.strip(row:sub(spans.starts[nc], spans.stops[nc]))
- this.span = span
- newrow[#newrow+1] = this
- end
- elseif multispans[nr-1] then -- some cells span columns
+ elseif p.st_colspan:match(row) then
+ newrow.ignore = true
+ elseif not rows.head_end and
+ nr > 1 and #raw > nr then -- ends the header
+ rows.head_end = nr
+ newrow.head_sep = true
newrow.ignore = true
else
- local nc = 1
- repeat
- local this = {}
- this.content = string.strip(row:sub(bounds.slices[nc].start, bounds.slices[nc].stop - 1))
- if bounds.starts[nc+1] then
- -- Only spaces allowed between columns.
- local between = s:sub(bounds.stops[nc], bounds.slices[nc+1].start)
- if not match(p.space^1 * -P(1), between) then
- -- This is probably too hard a step.
- helpers.dbg_write("[sta-h] Please revise your table boundaries.")
- os.exit(1)
- end
- end
- newrow[nc] = this
- nc = nc + 1
- until nc > #bounds.slices
+ newrow.ignore = true
end
rows[nr] = newrow
end