1function tostr(t) 2 local str = "" 3 for k, v in next, t do 4 if #str > 0 then 5 str = str .. ", " 6 end 7 if type(k) == "number" then 8 str = str .. "[" .. k .. "] = " 9 else 10 str = str .. tostring(k) .. " = " 11 end 12 if type(v) == "table" then 13 str = str .. "{ " .. tostr(v) .. " }" 14 elseif type(v) == "string" then 15 str = str .. '"' .. v .. '"' 16 else 17 str = str .. tostring(v) 18 end 19 end 20 return str 21end 22 23function trim_ws(s) 24 return s:match("^%s*(.*)") 25end 26 27function count_hypens(s) 28 local leftover = s:match("^-*(.*)") 29 return string.len(s) - string.len(leftover) 30end 31 32function pretty_print_slide(slide) 33 io.write("{\n") 34 if slide.transition then 35 io.write(" transition = \"", slide.transition, "\",\n") 36 end 37 for i = 1, #slide do 38 local node = slide[i] 39 for j = 0, node.indent do 40 io.write(" ") 41 end 42 io.write("{ ") 43 io.write(tostr(node)) 44 io.write(" },\n") 45 end 46 io.write("},\n") 47end 48 49function pretty_print_slides(slides) 50 io.write("gSlides = {\n") 51 for i = 1, #slides do 52 pretty_print_slide(slides[i]) 53 end 54 io.write("}\n") 55end 56 57function parse_attr(s, lvalue) 58 local ts = "^<%s*" .. lvalue .. "%s*=%s*(%a+)%s*>$" 59 return s:match(ts) 60end 61 62function flush(slides, block) 63 if #block > 0 then 64 slides[#slides + 1] = block 65 return {} 66 end 67 return block 68end 69 70function parse_file(file) 71 local slides = {} 72 local block = {} 73 74 for line in file:lines() do 75 local s = trim_ws(line) 76 if #s == 0 then -- done with a block 77 block = flush(slides, block) 78 else 79 local transition_type = parse_attr(s, "transition") 80 local blockstyle = parse_attr(s, "blockstyle") 81 if transition_type then 82 block["transition"] = transition_type 83 elseif blockstyle then 84 block["blockstyle"] = blockstyle 85 else 86 if block.blockstyle == "code" then 87 block[#block + 1] = { text = line } 88 else 89 local n = count_hypens(s) 90 block[#block + 1] = { 91 indent = n, 92 text = trim_ws(s:sub(n + 1, -1)) 93 } 94 end 95 end 96 end 97 end 98 flush(slides, block) 99 100 return slides 101end 102 103