A functional library for HTML and XML generation in Lua.
Because HTML sucks and most existing templating systems end up being glorified string interpolation. This means you're still writing HTML at the end of the day.
Additionally, HTML and XML are not trivial to parse, so transforming it is a lot easier with a simplified DOM-like tree structure than in text form.
Skooma is dead simple: every function returns a tree. No side effects.
After you're done applying whatever transformations to the ast, another function serializes it into HTML, which you can then use however you want.
Whenever you:
- Want to avoid writing actual HTML at all costs
- Want to further transform your HTML structure before sending it to a user
- Want to build small re-usable components close to where they're used
If you want
- Logic-less templating that you can trust your users with
- A simple and close-to-html templating language that you can learn easily
- Pain
Then you'd probably be better off with a more traditional templating solution. A few recommendations in this case would be Lustache, Cosmo and etLua
A simple example in Yuescript
skooma = require 'skooma'
html = skooma.env 'html'
link = => html.a @, href: "/#{@lower!}"
list = => html.ul [html.li link item for item in *@]
tree = html.html list
* "Foo"
* "Bar"
* "Baz"
print tree
A similar snippet in Lua:
local skooma = require 'skooma'
local html = skooma.env 'html'
local function map(fn, tab)
local new = {}
for i, value in ipairs(tab) do
new[i]=fn(value)
end
return new
end
local tree do
local function link(text)
return html.a(text, {href="/"..string.lower(text)})
end
local function list(items)
return html.ul(
map(html.li, map(link, items))
)
end
tree = html.html(list{"Foo", "Bar", "Baz"})
end
print(tree)
The resulting HTML, formatted a bit, should look something like this:
<html>
<ul>
<li>
<a href="/foo">Foo</a>
</li>
<li>
<a href="/bar">Bar</a>
</li>
<li>
<a href="/baz">Baz</a>
</li>
</ul>
</html>