2014-10-26 03:44:40 +00:00
|
|
|
function tostr(t)
|
|
|
|
local str = ""
|
|
|
|
for k, v in next, t do
|
|
|
|
if #str > 0 then
|
|
|
|
str = str .. ", "
|
|
|
|
end
|
|
|
|
if type(k) == "number" then
|
|
|
|
str = str .. "[" .. k .. "] = "
|
|
|
|
else
|
|
|
|
str = str .. tostring(k) .. " = "
|
|
|
|
end
|
|
|
|
if type(v) == "table" then
|
|
|
|
str = str .. "{ " .. tostr(v) .. " }"
|
|
|
|
elseif type(v) == "string" then
|
|
|
|
str = str .. '"' .. v .. '"'
|
|
|
|
else
|
|
|
|
str = str .. tostring(v)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return str
|
|
|
|
end
|
|
|
|
|
|
|
|
function trim_ws(s)
|
|
|
|
return s:match("^%s*(.*)")
|
|
|
|
end
|
|
|
|
|
|
|
|
function count_hypens(s)
|
|
|
|
local leftover = s:match("^-*(.*)")
|
|
|
|
return string.len(s) - string.len(leftover)
|
|
|
|
end
|
|
|
|
|
|
|
|
function pretty_print_slide(slide)
|
|
|
|
io.write("{\n")
|
2014-10-30 03:36:05 +00:00
|
|
|
if slide.transition then
|
|
|
|
io.write(" transition = \"", slide.transition, "\",\n")
|
|
|
|
end
|
2014-10-26 03:44:40 +00:00
|
|
|
for i = 1, #slide do
|
|
|
|
local node = slide[i]
|
|
|
|
for j = 0, node.indent do
|
|
|
|
io.write(" ")
|
|
|
|
end
|
|
|
|
io.write("{ ")
|
|
|
|
io.write(tostr(node))
|
|
|
|
io.write(" },\n")
|
|
|
|
end
|
|
|
|
io.write("},\n")
|
|
|
|
end
|
|
|
|
|
|
|
|
function pretty_print_slides(slides)
|
|
|
|
io.write("gSlides = {\n")
|
|
|
|
for i = 1, #slides do
|
|
|
|
pretty_print_slide(slides[i])
|
|
|
|
end
|
|
|
|
io.write("}\n")
|
|
|
|
end
|
|
|
|
|
2014-11-04 06:32:07 +00:00
|
|
|
function parse_attr(s, lvalue)
|
|
|
|
local ts = "^<%s*" .. lvalue .. "%s*=%s*(%a+)%s*>$"
|
|
|
|
return s:match(ts)
|
2014-10-30 03:36:05 +00:00
|
|
|
end
|
|
|
|
|
2014-11-04 06:32:07 +00:00
|
|
|
function flush(slides, block)
|
|
|
|
if #block > 0 then
|
|
|
|
slides[#slides + 1] = block
|
|
|
|
return {}
|
|
|
|
end
|
|
|
|
return block
|
2014-11-03 03:19:34 +00:00
|
|
|
end
|
|
|
|
|
2014-10-30 03:36:05 +00:00
|
|
|
function parse_file(file)
|
|
|
|
local slides = {}
|
|
|
|
local block = {}
|
|
|
|
|
|
|
|
for line in file:lines() do
|
|
|
|
local s = trim_ws(line)
|
|
|
|
if #s == 0 then -- done with a block
|
2014-11-04 06:32:07 +00:00
|
|
|
block = flush(slides, block)
|
2014-10-30 03:36:05 +00:00
|
|
|
else
|
2014-11-04 06:32:07 +00:00
|
|
|
local transition_type = parse_attr(s, "transition")
|
|
|
|
local blockstyle = parse_attr(s, "blockstyle")
|
2014-10-30 03:36:05 +00:00
|
|
|
if transition_type then
|
|
|
|
block["transition"] = transition_type
|
2014-11-03 03:19:34 +00:00
|
|
|
elseif blockstyle then
|
|
|
|
block["blockstyle"] = blockstyle
|
2014-10-30 03:36:05 +00:00
|
|
|
else
|
2014-11-03 03:19:34 +00:00
|
|
|
if block.blockstyle == "code" then
|
|
|
|
block[#block + 1] = { text = line }
|
|
|
|
else
|
|
|
|
local n = count_hypens(s)
|
|
|
|
block[#block + 1] = {
|
|
|
|
indent = n,
|
|
|
|
text = trim_ws(s:sub(n + 1, -1))
|
|
|
|
}
|
|
|
|
end
|
2014-10-30 03:36:05 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2014-11-04 21:24:47 +00:00
|
|
|
flush(slides, block)
|
|
|
|
|
2014-10-30 03:36:05 +00:00
|
|
|
return slides
|
|
|
|
end
|
|
|
|
|