Pull to refresh

Comments 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={ ['<']='&lt;',['>']='&gt;',
    ['&']='&amp;',['"']='&quot;',["'"]='&apos;' }
  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=&lt;&amp;&gt;


Тут как бы дело в том, что в качестве парсера «входных данных» у меня clang frontend полным ростом. Можно было бы, конечно, сделать биндинг из него в питон или в Lua… Но таки хотелось, чтобы шаблоны выглядели шаблонами, а не программами на питоне/Lua. :)
Уважаю. У меня бы терпения не хватило. И процентах в 99 обычных скриптов хватает.
Sign up to leave a comment.

Articles