Home | History | Annotate | Download | only in lua
      1 function 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
     21 end
     22 
     23 function trim_ws(s)
     24     return s:match("^%s*(.*)")
     25 end
     26 
     27 function count_hypens(s)
     28     local leftover = s:match("^-*(.*)")
     29     return string.len(s) - string.len(leftover)
     30 end
     31 
     32 function 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")
     47 end
     48 
     49 function 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")
     55 end
     56 
     57 function parse_attr(s, lvalue)
     58     local ts = "^<%s*" .. lvalue .. "%s*=%s*(%a+)%s*>$"
     59     return s:match(ts)
     60 end
     61 
     62 function flush(slides, block)
     63     if #block > 0 then
     64         slides[#slides + 1] = block
     65         return {}
     66     end
     67     return block
     68 end
     69 
     70 function 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
    101 end
    102 
    103