handlers/render.lua

changeset 2
3975fa5ed630
child 3
b2df1b3f2c83
equal deleted inserted replaced
1:e2face1be50e 2:3975fa5ed630
1
2 module("handlers.render", package.seeall)
3
4 require('markdown')
5 require('etree')
6 require('err')
7 require('environment')
8 require('config')
9
10 --
11 -- Phase 1: load & markup
12 --
13
14 local phase1_cache={}
15
16 function phase1(file, env)
17 --local dir = string.match(file, "(.*)/[^/]*")
18 --local env = get_environment(dir)
19 local f = io.open(file, 'r')
20 local data = ''
21 local in_meta = false
22 local linenum=1
23
24 for l in f:lines() do
25 if string.match(l, config.meta_marker) then
26 in_meta = not in_meta
27 elseif in_meta then
28 local key, val = string.match(l, "%s*([^:]*)%s*:%s*(.*)%s*")
29 if key and val then
30 env[key] = val
31 else
32 err.file_pos(file, linenum, "meta data syntax error")
33 end
34 else
35 data = data.."\n"..l
36 end
37 linenum = linenum+1
38 end
39
40 f:close()
41
42 local data2=markdown(data)
43
44 phase1_cache[file]=data2
45 end
46
47
48 --
49 -- Phase 2: Tag processing
50 --
51
52 -- Vaiko silti toistepäin? Inlinejen tagit pitää
53 -- prosessoida ennen inlinetystä. Mutta toisaalta
54 -- templateen myös prosessointi.
55
56 local function tag_lgen_inline(env, t)
57 a.tag="div"
58 -- todo: get inlineable stuff from attrs
59 a.attr.class="lgen:inline"
60 --table.insert(a, get_inline(env, a)
61 end
62
63 local function tag_lgen_a(env, t)
64 end
65
66
67 local operations={
68 ["lgen:inline"] = tag_lgen_inline,
69 ["a"] = tag_lgen_a,
70 }
71
72 local function scan(env, et)
73 for _, v in ipairs(et) do
74 if type(v)=="table" then
75 operations[v.tag](env, v)
76 end
77 end
78 end
79
80 setmetatable(operations, { __index = function() return scan end })
81
82 function phase2(file, env)
83 local data=phase1_cache[file]
84 --print(data)
85 --print("----------")
86 local et, msg, line, col, pos = etree.fromstring([[<!DOCTYPE html
87 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
88 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html><body>]]..data..'</body></html>')
89 --local et, msg, line, col, pos = lom.parse("<foo>"..data.."</foo>")
90 if not et then
91 error(string.format("%d:%d(%d): %s", line or -1 , col or -1, pos or -1, msg))
92 end
93
94 operations[et.tag](env, et)
95
96 -- TODO: inlining
97 -- maybe
98 --phase2_cache[file]=etree.tostring(et);
99 end
100
101
102
103 function phase3(file, env)
104 end

mercurial