|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://anggtwu.net/LUA/ParseTimeline1.lua.html
-- http://anggtwu.net/LUA/ParseTimeline1.lua
-- (find-angg "LUA/ParseTimeline1.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- See:
-- (find-angg "bin/eevgitlib1.sh" "Time-tests")
-- (find-angg "LUA/Loeliger1.lua" "big")
-- (defun e () (interactive) (find-angg "LUA/ParseTimeline1.lua"))
-- «.test1» (to "test1")
-- «.test2» (to "test2")
require "ELpeg1" -- (find-angg "LUA/ELpeg1.lua")
BranchLine = Class {
type = "BranchLine",
from = function (li) return BranchLine {li=li} end,
__tostring = function (bl) return bl:totex() end,
__index = {
split0 = function (bl) return bl.li:match "%((.-)%) *(.*)" end,
split = function (bl)
local a,b = bl:split0()
bl.a, bl.b = bitrim(a), bitrim(b)
return bl
end,
mktex0 = function (bl)
local A = HTable {}
for s in bl.a:gmatch("([^,]+)") do
s = bitrim(s)
local c = s:match("HEAD %-> (.*)")
if c then table.insert(A, c.."\\HEAD")
elseif s == "HEAD" then table.insert(A, "\\HEAD")
else table.insert(A, s)
end
end
-- local tex0 = table.concat(A, "\\\\")
local tex0 = table.concat(sorted(A), "\\\\")
bl.tex0 = tex0
return bl
end,
mktex1 = function (bl)
bl.tex1 = format("\\drawbranch %s {%s};", bl.b, bl.tex0)
end,
totex = function (bl) bl:split():mktex0():mktex1(); return bl.tex1 end,
},
}
Block = Class {
type = "Block",
from = function (t0) return Block {t0=t0, texs=VTable{}} end,
__tostring = function (blo) return blo:loelines() end,
__index = {
add = function (blo,tex) table.insert(blo.texs, tex); return blo end,
close = function (blo,t1) blo.t1=t1; return blo end,
left = function (blo) return format('"%s"<=t and t<"%s"', blo.t0, blo.t1) end,
loeline = function (blo,i) return format(" %s :: %s", blo:left(), blo.texs[i]) end,
loelines = function (blo)
local f = function (i) return blo:loeline(i) end
return mapconcat(f, seq(1,#blo.texs), "\n")
end,
},
}
Blocks = Class {
type = "Blocks",
new = function () return Blocks {times = VTable{}} end,
__tostring = function (bls) return bls:toloelines() end,
__index = {
addtime = function (bls,time)
if #bls > 0 then bls[#bls]:close(time) end
table.insert(bls, Block.from(time))
table.insert(bls.times, time)
return bls
end,
addright = function (bls,right)
table.insert(bls[#bls].texs, right)
return bls
end,
toloelines = function (bls)
local f = function (i) return bls[i]:loelines() end
return mapconcat(f, seq(1,#bls-1), "\n")
end,
totimes = function (bls)
return table.concat(blos.times, " ", 1, #blos.times-1)
end,
addline = function (bls,li)
local time = li:match("Time: (.*)")
if time then bls:addtime(time); return end
local bl = BranchLine.from(li)
if bl:split0() then bls:addright(bl:totex()); return end
end,
addlines = function (bls,bigstr)
for _,li in ipairs(splitlines(bigstr)) do
bls:addline(li)
end
return bls
end,
},
}
bigstr0 = [=[
Time: C0
* 7226cf0 (master, brBDG) B
* a139b85 (HEAD -> brAC) A
Time: C1
* c78b23b (HEAD -> brAC) C
| * 7226cf0 (master, brBDG) B
|/
* a139b85 A
Time: D0
* c78b23b (brAC) C
| * 7226cf0 (HEAD -> brBDG, master) B
|/
* a139b85 A
]=]
-- «test1» (to ".test1")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "ParseTimeline1.lua"
-- for _,li in ipairs(splitlines(bigstr)) do
-- print(li)
-- bl = BranchLine.from(li)
-- -- if bl:split0() then print(bl:split().a) end
-- -- if bl:split0() then bl:split():mktex0(); print(bl.tex0) end
-- -- if bl:split0() then bl:split():mktex0():mktex1(); print(bl.tex1) end
-- if bl:split0() then print(bl:totex()) end
-- end
blo = Block.from("A1"):add("foo"):add("bar"):close("B0")
PPV(blo)
= blo:loelines()
= blo:loeline(1)
= blo:loeline(2)
blos = Blocks.new()
blos:addtime("B1"):addright("foo"):addright("bar")
blos:addtime("C0"):addright("plic"):addright("ploc")
blos:addtime("D0")
= blos
= blos[1]
= blos[1].texs
= blos[1]:loelines()
= blos[2]:loelines()
= blos:toloelines()
blos = Blocks.new():addlines(bigstr0):addtime("zz")
= blos
--]]
-- «test2» (to ".test2")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "ParseTimeline1.lua"
bigstr = ee_readfile "/tmp/all"
blos = Blocks.new():addlines(bigstr):addtime("zz")
= blos
= blos.times
= blos:totimes()
--]]
-- Local Variables:
-- coding: utf-8-unix
-- End: