Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file: -- http://anggtwu.net/LUA/Und2D2.lua.html -- http://anggtwu.net/LUA/Und2D2.lua -- (find-angg "LUA/Und2D2.lua") -- Author: Eduardo Ochs <eduardoochs@gmail.com> -- -- (defun u1 () (interactive) (find-angg "LUA/Und2D1.lua")) -- (defun u2 () (interactive) (find-angg "LUA/Und2D2.lua")) -- «.u8split» (to "u8split") -- «.u8split-tests» (to "u8split-tests") -- «.Grid» (to "Grid") -- «.Grid-tests» (to "Grid-tests") -- «.GRange» (to "GRange") -- «.GRange-tests» (to "GRange-tests") -- «.GrUD» (to "GrUD") -- «.GrUD-test1» (to "GrUD-test1") -- «.GrUD-test2» (to "GrUD-test2") -- ___ _ _ _ -- _ _ ( _ ) ___ _ __ | (_) |_ -- | | | |/ _ \/ __| '_ \| | | __| -- | |_| | (_) \__ \ |_) | | | |_ -- \__,_|\___/|___/ .__/|_|_|\__| -- |_| -- -- «u8split» (to ".u8split") -- (find-angg "LUA/lua50init.lua" "strlen8") -- (find-angg "LUA/lua50init.lua" "u8c_to_l1") u8split = function (str, pat) local pat = pat or ".[\128-\191]*" local result = HTable {} for s in str:gmatch(pat) do table.insert(result, s) end return result end -- «u8split-tests» (to ".u8split-tests") --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "Und2D2.lua" foo = "a·b" = foo = #foo = u8split(foo) = u8split(foo, ".") --]==] -- ____ _ _ -- / ___|_ __(_) __| | -- | | _| '__| |/ _` | -- | |_| | | | | (_| | -- \____|_| |_|\__,_| -- -- «Grid» (to ".Grid") Grid = Class { type = "Grid", from = function (lines) if type(lines) == "string" then lines = splitlines(lines) end lines = VTable(lines) local wd = 0 local ht = #lines local grid = VTable {} for y=1,ht do local linechars = u8split(lines[y]) wd = max(wd, #linechars) grid[y] = linechars end return Grid {lines=lines, wd=wd, ht=ht, grid=grid} end, __index = { yx = function (gr,y,x) return gr.grid[y][x] or "" end, yxx = function (gr,y,x0,x1) local f = function (x) return gr:yx(y,x) end return mapconcat(f, seq(x0,x1)) end, }, } -- «Grid-tests» (to ".Grid-tests") --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "Und2D2.lua" gr0 = Grid.from "abc\nd\nefgh" = gr0 = gr0.grid = gr0.wd = gr0.ht = gr0.lines PP(gr0:yx(1,1)) PP(gr0:yx(1,3)) PP(gr0:yx(1,5)) PP(gr0:yxx(3,2,3)) --]==] -- (find-angg "LUA/Pratt1.lua" "Range") -- ____ ____ -- / ___| _ \ __ _ _ __ __ _ ___ -- | | _| |_) / _` | '_ \ / _` |/ _ \ -- | |_| | _ < (_| | | | | (_| | __/ -- \____|_| \_\__,_|_| |_|\__, |\___| -- |___/ -- «GRange» (to ".GRange") GRange = Class { type = "GRange", from = function (y,x0,x1,...) return GRange {y=y, x0=x0, x1=x1, ...} end, __tostring = function (gra) local y,x0,x1 = gra.y,gra.x0,gra.x1 local s = y..":" if x0==x1 then s=s..x0 else s=s..x0.."-"..x1 end for i=1,#gra do s=s.." "..mytostring(gra[i]) end return s end, __index = { }, } -- «GRange-tests» (to ".GRange-tests") --[[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "Und2D2.lua" = GRange.from(2,3,4) = GRange.from(2,5,5) = GRange.from(2,5,5,6,"6") gras = --]] -- ____ _ _ ____ -- / ___|_ __| | | | _ \ -- | | _| '__| | | | | | | -- | |_| | | | |_| | |_| | -- \____|_| \___/|____/ -- -- «GrUD» (to ".GrUD") -- Grid with underbrace data GrUD = Class { type = "GrUD", from = function (lines) local grid = Grid.from(lines) local gras = VTable {} local top = HTable {} for x=1,grid.wd do table.insert(gras, GRange.from(1,x,x,"topc")) end for x=1,grid.wd do table.insert(top, x) end return GrUD {grid=grid, gras=gras, top=top} end, __tostring = function (grud) return grud:tostring() end, __index = { yxx = function (grud,y,x0,x1) return grud.grid:yxx(y,x0,x1) end, gra = function (grud,k) return grud.gras[k] end, kind = function (grud,k) return grud.gras[k][1] end, kyxx = function (grud,k) local gra = grud:gra(k); return gra.y,gra.x0,gra.x1 end, kyxxstr = function (grud,k) return grud:yxx(grud:kyxx(k)) end, ktostring = function (grud,k) local k_ = "k="..k..":" local gra_ = tostring(grud.gras[k]) local s_ = mytostring(grud:kyxxstr(k)) return format("%-5s %-30s %s", k_, gra_, s_) end, tostring = function (grud,i,j) local f = function (k) return grud:ktostring(k) end return mapconcat(f, seq(i or grud.grid.wd+1, j or #grud.gras), "\n") end, -- settop = function (grud,k,x0,x1) for x=x0,x1 do grud.top[x] = k end end, addgra = function (grud, ...) table.insert(grud.gras, GRange.from(...)) end, packtop = function (grud,x0,x1) grud:addgra(1,x0,x1, "top") local k = #grud.gras grud:settop(k, x0,x1) return k end, packtops = function (grud,x0,x1) local oldst,st = nil,"beg" local x2,x3 local open = function (x) x2=x; x3=x end local extend = function (x) x3=x end local close = function () grud:packtop(x2,x3) end for x=x0,x1 do oldst,st = st,grud.gras[grud.top[x]][1] if oldst ~= "topc" and st == "topc" then open(x) end if oldst == "topc" and st == "topc" then extend(x) end if oldst == "topc" and st ~= "topc" then close() end end oldst,st = st,"end" if oldst == "topc" then close() end end, getks = function (grud,x0,x1) local ks = VTable {} local lastk = function () return ks[#ks] end local addk = function (k) if k and k ~= lastk() then table.insert(ks, k) end end for x=x0,x1 do addk(grud.top[x]) end return ks end, -- addconcat = function (grud,x0,x1) grud:packtops(x0,x1) local ks = grud:getks(x0, x1) grud:addgra(1, x0,x1, "concat", unpack(ks)) -- use y=1 (fake) local k = #grud.gras grud:settop(k, x0,x1) return k end, addunder = function (grud,y,x0,x1) -- run only after an addconcat grud:addgra(y,x0,x1, "under") return #grud.gras end, addunderbrace = function (grud,y,x0,x1) grud:addgra(y,x0,x1, "underbrace", grud:addconcat(x0,x1), grud:addunder(y,x0,x1)) local k = #grud.gras grud:settop(k, x0,x1) return k end, addlastconcat = function (grud) grud:addconcat(1, grud.grid.wd) return #grud.gras end, -- addallbars_at_y = function (grud, y, verbose) local bars = grud.grid.lines[y] for x0,x1r in bars:gmatch("()%S+()") do local x1 = x1r-1 if verbose then PP(y, x0, x1) end grud:addunderbrace(y+1, x0,x1) end end, addallbars = function (grud, verbose) for y=2,grud.grid.ht,2 do grud:addallbars_at_y(y, verbose) end grud:addlastconcat(grud) return grud end, -- totex_top = function (grud,k) return grud:kyxxstr(k) end, totex_under = function (grud,k) return grud:kyxxstr(k) end, totex_underbrace = function (grud,k) local gra = grud:gra(k) local over = grud:totex(gra[2]) local under = grud:totex(gra[3]) return format("\\und{%s}{%s}", over, under) end, totex_concat = function (grud,k) local gra = grud:gra(k) local part = function (i) return grud:totex(gra[i]) end return mapconcat(part, seq(2,#gra)) end, totex = function (grud, k) k = k or #grud.gras local m = "totex_"..grud:kind(k) return grud[m](grud, k) end, -- textsfstr = function (grud,str) return format("\\textsf{%s}", str) end, totex_top_textsf = function (grud,k) return grud:textsfstr(grud:kyxxstr(k)) end, totex_under_textsf = function (grud,k) return grud:textsfstr(grud:kyxxstr(k)) end, totex_underbrace_textsf = function (grud,k) local gra = grud:gra(k) local over = grud:totex_textsf(gra[2]) local under = grud:totex_textsf(gra[3]) return format("\\und{%s}{%s}", over, under) end, totex_concat_textsf = function (grud,k) local gra = grud:gra(k) local part = function (i) return grud:totex_textsf(gra[i]) end return mapconcat(part, seq(2,#gra)) end, totex_textsf = function (grud, k) k = k or #grud.gras local m = "totex_"..grud:kind(k).."_textsf" return grud[m](grud, k) end, }, } -- «GrUD-test1» (to ".GrUD-test1") --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "Und2D2.lua" bigstr = [=[ abcdefghij -- -- kl mn ------- opqrstu ]=] grud = GrUD.from(bigstr) = grud = grud:yxx(1,2,3) -- bc = grud:gra(4) -- 1:4 "topc" = grud:kyxx(4) -- 1 4 4 = grud:kyxxstr(4) -- d = grud:ktostring(4) -- k=4: 1:4 "topc" "d" = grud:tostring(1) = grud.grid.lines = grud.top -- {1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9, 10=10} = grud:packtop(3,4) -- 11 = grud:packtop(7,8) -- 12 = grud.top -- {1=1, 2=2, 3=11, 4=11, 5=5, 6=6, 7=12, 8=12, 9=9, 10=10} = grud:packtops(2,9) = grud.top = grud = grud:getks(2,6) = grud:getks(2,7) = grud:getks(1,9) = GrUD.from("a\nbc\ndefg"):tostring() = GrUD.from("a\nbc\ndefg"):tostring(1) = GrUD.from("a\nbc\ndefg"):tostring(1,5) grud = GrUD.from("a\nbc\ndefg") --]==] -- «GrUD-test2» (to ".GrUD-test2") --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "Und2D2.lua" bigstr = [=[ abcdefghij -- -- kl mn ------- opqrstu ]=] grud = GrUD.from(bigstr) grud:addunderbrace(3,3,4) = grud grud:addunderbrace(3,7,8) = grud grud:addunderbrace(5,3,9) = grud grud:addlastconcat() = grud grud = GrUD.from(bigstr) grud:addallbars("verbose") = grud = grud:kind(11) = grud:totex(11) = grud:totex(26) = grud:totex() = grud:totex_textsf() = GrUD.from(bigstr):addallbars():totex() = GrUD.from(bigstr):addallbars():totex_textsf() --]==] -- Local Variables: -- coding: utf-8-unix -- End: