From 4cfa96175e729d50d192dcb4a88363dd502d362e Mon Sep 17 00:00:00 2001 From: urosm Date: Fri, 17 May 2024 17:15:28 +0200 Subject: [PATCH] update `pandoc` data dir --- pandoc/sitemap.lua | 114 +++++++++++++++++++++------------------------ 1 file changed, 53 insertions(+), 61 deletions(-) diff --git a/pandoc/sitemap.lua b/pandoc/sitemap.lua index bc8c960..46bae09 100644 --- a/pandoc/sitemap.lua +++ b/pandoc/sitemap.lua @@ -5,12 +5,14 @@ assert(#arg == 2, "\n" .. "[ERROR] usage: pandoc lua sitemap.lua ") local index_file, output_file = table.unpack(arg) +local node_len = 1 local node_list, node_map = {}, {} local function collect (fp) local f = assert(io.open(fp), "\n" .. "[ERROR] could not open " .. fp .. " for reading.") table.insert(node_list, fp) node_map[fp] = { order = #node_list, nodes = {} } + if fp:len() > node_len then node_len = fp:len() end -- track node len local data = f:read("a") f:close() local visited = {} @@ -34,69 +36,64 @@ local L = { SW = "'", S = "-", SE = "'", } -local arma = {} -local list = {} -local armb = {} -for i,node in ipairs(node_list) do - arma[i] = {} - list[i] = node - armb[i] = {} +local arm_a, arm_b = {}, {} +for i,_ in ipairs(node_list) do + arm_a[i], arm_b[i] = {}, {} end -local function reverse (t) - for i=1,#t//2 do - t[i],t[#t-i+1] = t[#t-i+1],t[i] - end - return t -end +local arm_row_len = 1 for _,node in ipairs(node_list) do - local a_node = node_map[node] - for _,node in ipairs(a_node["nodes"]) do - local a = a_node["order"] - local b = node_map[node]["order"] - - local i1 = 1 - local ia = math.min(a,b) - local ib = math.max(a,b) - local iz = #node_list - local wing = a < b and arma or armb + local node_a = node_map[node] + for _,node in ipairs(node_a["nodes"]) do + local a, b = node_a["order"], node_map[node]["order"] + local i_a, i_b = math.min(a,b), math.max(a,b) + local arm = a < b and arm_a or arm_b + -- find the first free column local col = 1 while true do - for i=ia,ib do - local cell = wing[i][col] + for i=i_a,i_b do + local cell = arm[i][col] if cell ~= nil and cell ~= L.X then + col = col + 1 goto continue end end break ::continue:: - col = col + 1 end - if col == 1 then col = 2 end - local a_row = wing[ia] - if a_row[1] == nil or a_row[1] == L.X then - a_row[1] = a < b and L.N or L.L + col = col == 1 and 2 or col + if col > arm_row_len then arm_row_len = col end -- track row len + + -- layout starting row + local row_a = arm[i_a] + if row_a[1] == nil or row_a[1] == L.X then + row_a[1] = a < b and L.N or L.L end - for i=1,col-1 do - if a_row[i] == nil or a_row[i] == L.X then a_row[i] = L.N end + for i=2,col-1 do + if row_a[i] == nil or row_a[i] == L.X then row_a[i] = L.N end end - a_row[col] = a < b and L.NW or L.NE - for i=ia+1,ib-1 do + row_a[col] = a < b and L.NW or L.NE + + -- layout rows between start and end + for i=i_a+1,i_b-1 do + local row_i = arm[i] for j=1,col-1 do - if wing[i][j] == nil then wing[i][j] = L.X end + if row_i[j] == nil then row_i[j] = L.X end end - wing[i][col] = L.W + row_i[col] = L.W end - local b_row = wing[ib] - if b_row[1] == nil or b_row[1] == L.X then - b_row[1] = a < b and L.R or L.S + + -- layout ending row + local row_b = arm[i_b] + if row_b[1] == nil or row_b[1] == L.X then + row_b[1] = a < b and L.R or L.S end - for i=1,col-1 do - if b_row[i] == nil or b_row[i] == L.X then b_row[i] = L.S end + for i=2,col-1 do + if row_b[i] == nil or row_b[i] == L.X then row_b[i] = L.S end end - b_row[col] = L.SW + row_b[col] = a < b and L.SW or L.SE end end @@ -108,26 +105,21 @@ table.insert(lines, "

sitemap

") table.insert(lines, "") table.insert(lines, "
")
 
--- pad right wing
-local arma_pad = 1
-for _,len in pairs(arma) do
-  if #len > arma_pad then arma_pad = #len end
-end
--- pad node names
-local node_pad = 1
-for _,s in pairs(list) do
-  if s:len() > node_pad then node_pad = s:len() end
-end
+for i,node in ipairs(node_list) do
+  local line = {}
+  local node_padded = ("%-"..node_len.."s"):format(node)
+  local node_anchor = node_padded:gsub("(.+)%.md", "%1")
+  local row_a, row_b = arm_a[i], arm_b[i]
 
-for i,v in ipairs(list) do
-  local row = {}
-  local v = ("%-"..node_pad.."s"):format(v)
-  local a = v:gsub("(.+)%.md", "%0")
-  table.insert(row, (("%"..arma_pad.."s"):format(table.concat(reverse(arma[i])))))
-  table.insert(row, ((" %s "):format(a)))
-  table.insert(row, (table.concat(armb[i])))
+  -- reverse arm a row
+  for j=1,#row_a//2 do
+    row_a[j], row_a[#row_a-j+1] = row_a[#row_a-j+1], row_a[j]
+  end
 
-  table.insert(lines, table.concat(row))
+  table.insert(line, (("%"..arm_row_len.."s"):format(table.concat(row_a))))
+  table.insert(line, ((" %s "):format(node_anchor)))
+  table.insert(line, (table.concat(row_b)))
+  table.insert(lines, table.concat(line))
 end
 table.insert(lines, "
") table.insert(lines, "") @@ -138,7 +130,7 @@ local f = io.open(output_file) local data_old if f then data_old = f:read("a"); f:close() end --- write to output_file if data changed +-- write to output_file if no output_file yet or data changed if not data_old or data ~= data_old then local f = assert(io.open(output_file, "w"), "\n" .. "[ERROR] could not open " .. output_file .. " for writing.")