Комментарии 3
Я бы использовл для такого шаблонизатора какой-нибудь lua. Потому как генерить boilerplate-код надо из каки-то входных данных, которые тоже надо парсить. И если это сделано на скриптовом языке это можно менять по ходу ничего не пересобирая. Да и в отличии от питона lua гораздо проще и имеет меньшие накладные расходы всего 250кб.
Примерно такой беговел вполне способен генерить большую часть boilerplat-ов
function template(G) G=G or _G return function(t)
local r=t:gsub('{{([^}]+)}}',function(v)
local g=G for i in v:gmatch("[^%.]+") do
local p,fn=i:find('|')
if p then fn=i:sub(p+1) i=i:sub(1,p-1) end
if type(g[i])=='function' then g=g[i]() else g=g[i]
if g==nil then error("no variable "..v) end
end
if p then fn:gsub('[^|]+',function(f)
if G[f]==nil then error("no function "..fn) end
g=G[f](g)
end)
end
end
return g
end)
return r
end
end
function xml_encode(x)
local tab={ ['<']='<',['>']='>',
['&']='&',['"']='"',["'"]=''' }
return x:gsub("[<>&'\"]",function(v) return tab[v] end)
end
t=template{e=xml_encode, x=10, y="<&>"}
print( t[[
x={{x}}
y={{y|e}}
]] )
x=10
y=<&>
0
Тут как бы дело в том, что в качестве парсера «входных данных» у меня clang frontend полным ростом. Можно было бы, конечно, сделать биндинг из него в питон или в Lua… Но таки хотелось, чтобы шаблоны выглядели шаблонами, а не программами на питоне/Lua. :)
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Jinja2 в мире C++, часть вторая. Рендеринг