- [!] VersionNotice: The below code pertains to an older Lua version, Lua 4. Certain features used like tag methods (
settagmethod
) are no longer present in Lua 5 but have been replaced with metamethods.
Go back to TextTemplate
1
2 local ENVPAT="%$(%w+)"
3 local DOTPAT="|((%a%w*)[.:][.:%w]+)|"
4 local TABPAT="@((%a%w*)[.:%w]*%s*%b{})"
5 local FUNPAT="@((%a%w*)[.:%w]*%s*%b())"
6 local ANYPAT="@(%b{})"
7 local VARPAT="((\n?) *)|(%w+)|"
8
9 local sharedvars = {
10 DATE=date("%d/%m/%Y %T"),
11 }
12
13 function share(t)
14 for n,v in t do sharedvars[n]=v end
15 end
16
17 local push, pop, join = tinsert, tremove, concat
18 local getn, call, unpack, globals, rawget, concat, getglobal, gsub, type =
19 getn, call, unpack, globals, rawget, concat, getglobal, gsub, type
20
21 local indent = function( sp, cr, var )
22 local val = getglobal(var)
23 if cr and sp ~= cr then val = gsub( val, '\n([^\n])', sp.."%1" ) end
24 return sp .. val
25 end
26
27 local tagnil = tag(nil)
28
29 function fillin( s, pat )
30 pat = pat or s.template or "*** WARNING: nil pattern ***"
31 local g = globals()
32 s._ERRORMESSAGE = function(x) globals(g) _ERRORMESSAGE(x) end
33 local tm = gettagmethod( tagnil, 'getglobal' )
34 settagmethod( tagnil, 'getglobal', function( name, value )
35 local v
36 v = s[name] if v then return v end -- support delegation via index
37 v = sharedvars[name] if v then return v end
38 v = rawget( g, name ) if v then -- rawget must be local
39 if type(v) == 'magic' then return v[name]() end
40 --? local tm = gettagmethod( tag(v), 'getglobal' )
41 --? if tm then return tm(name,v) end
42 return v
43 end
44 if tm then return tm( name, value ) end
45 return "*** WARNING: '".. name .."' == nil ***"
46 end )
47 globals( s )
48 local n repeat pat,n = gsub( pat, VARPAT, indent ) until n==0
49 globals( g )
50 settagmethod( tagnil, 'getglobal', tm )
51 return pat
52 end
53
54 local fcnt = 0
55 local uniq_id = function( x )
56 fcnt = fcnt + 1
57 return fcnt .. x
58 end
59
60 function template( pat )
61 pat = gsub( pat, ENVPAT, getenv )
62 local mfc = { [[
63 local Magic = settype( {}, newtype'magic' )
64 ]] }
65 local add = function(fc,name)
66 name = uniq_id(name)
67 push( mfc, [[
68 Magic[']].. name ..[['] = function()
69 local self=globals()
70 return ]].. fc ..[[ --
71 end
72 setglobal(']].. name ..[[', Magic )
73 ]] )
74 return '|'.. name ..'|'
75 end -- add
76 local doo = function(fc)
77 local name = uniq_id'ANY'
78 push( mfc, [[
79 Magic[']].. name ..[['] = function()
80 local OUT=''
81 local self=globals()
82 do ]].. strsub(fc,2,-2) ..[[ end
83 return OUT
84 end
85 setglobal(']].. name ..[[', Magic )
86 ]] )
87 return '|'.. name ..'|'
88 end -- doo
89 pat = gsub( pat, DOTPAT, add )
90 pat = gsub( pat, TABPAT, add )
91 pat = gsub( pat, FUNPAT, add )
92 pat = gsub( pat, ANYPAT, doo )
93 -- write( _STDERR, pat )
94 local ds = concat( mfc )
95 --? ds = ds .. [[
96 --? settagmethod( tag(Magic), 'getglobal', function( name, magic )
97 --? local f = rawget( magic, name ) return f()
98 --? end )
99 --? ]]
100 -- write( _STDERR, ds )
101 local _,msg = dostring( ds, 'Make Magic' )
102 if msg then error( msg .." with\n".. ds ) end
103 return pat
104 end
105
106
107 function map( t, fun, ... )
108 local r = {}
109 for i = 1, getn(t) do
110 local v = fun( t[i], unpack(arg) )
111 push(r,v)
112 end
113 return r
114 end
115
116 function grep( t, fun, ... )
117 local r = {}
118 for i = 1, getn(t) do
119 local v = t[i]
120 if fun( v, unpack(arg) ) then push(r,v) end
121 end
122 return r
123 end
124
125 function filleachi( t, sep, pat )
126 return concat( map( t, fillin, pat ), sep )
127 end
128
Go back to TextTemplate
RecentChanges · preferences
edit · history
Last edited December 30, 2006 10:43 pm GMT (diff)