...
This commit is contained in:
parent
888b2372fa
commit
473c48689d
18 changed files with 965 additions and 2 deletions
58
tools/autowidth.lua
Normal file
58
tools/autowidth.lua
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
-- Verteilt Tabellenspalten proportional zur Inhaltslänge (statt gleicher
|
||||
-- Breiten aus der Markdown-Trennzeile). Für Tabellen mit langer
|
||||
-- Beschreibungsspalte (typisch bei RPG-Tabellen) deutlich besser lesbar.
|
||||
--
|
||||
-- Die Breite einer Spalte = max. Zeichenlänge ihrer Zellen (Header + Rumpf),
|
||||
-- normalisiert auf Anteile. Mindestbreite 12 %, um schmale Kennspalten
|
||||
-- (z. B. "d6") nicht zu erdrücken.
|
||||
|
||||
local FLOOR = 0.08
|
||||
|
||||
local function strlen(s)
|
||||
local ok, n = pcall(utf8.len, s)
|
||||
if ok then return n end
|
||||
return #s
|
||||
end
|
||||
|
||||
local function celltext(blocks)
|
||||
return pandoc.utils.stringify(blocks)
|
||||
end
|
||||
|
||||
function Table(tbl)
|
||||
local ncols = #tbl.colspecs
|
||||
if ncols < 1 then return tbl end
|
||||
|
||||
local lens = {}
|
||||
for i = 1, ncols do lens[i] = 1 end
|
||||
|
||||
local function measure(cells)
|
||||
for i, cell in ipairs(cells) do
|
||||
local l = strlen(celltext(cell.contents))
|
||||
if l > lens[i] then lens[i] = l end
|
||||
end
|
||||
end
|
||||
|
||||
if tbl.head and tbl.head.rows then
|
||||
for _, row in ipairs(tbl.head.rows) do measure(row.cells) end
|
||||
end
|
||||
for _, body in ipairs(tbl.bodies) do
|
||||
for _, row in ipairs(body.body) do measure(row.cells) end
|
||||
end
|
||||
|
||||
local total = 0
|
||||
for i = 1, ncols do
|
||||
lens[i] = math.sqrt(lens[i])
|
||||
total = total + lens[i]
|
||||
end
|
||||
|
||||
if total > 0 then
|
||||
for i = 1, ncols do
|
||||
local w = lens[i] / total
|
||||
if w < FLOOR then w = FLOOR end
|
||||
-- ColSpec ist positionsbasiert: [1]=align, [2]=width
|
||||
tbl.colspecs[i][2] = w
|
||||
end
|
||||
end
|
||||
|
||||
return tbl
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue