tags: Un pequeño DSL para construir documentos HTML
Instalación
Si no has configurado la suscripción al repositorio RPM, regístrate. Luego puedes proceder con los siguientes pasos.
CentOS/RHEL 7 o Amazon Linux 2
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-tags
CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-tags
Para usar esta biblioteca Lua con NGINX, asegúrate de que nginx-module-lua esté instalado.
Este documento describe lua-resty-tags v1.0 lanzado el 06 de julio de 2016.
Un pequeño DSL para construir documentos HTML
Sinopsis
Aquí definimos algunas funciones locales:
local tags = require "resty.tags"
local html, head, script, body, h1, p, table, tr, th, img, br = tags(
"html", "head", "script", "body", "h1", "p", "table", "tr", "th", "img", "br")
print(
html { lang = "en" } (
head (
script { src = "main.js" }
),
body (
h1 { class = 'title "is" bigger than you think', "selected" } "Hello",
h1 "Another Headline",
p (
"<Beautiful> & <Strange>",
br,
{ Car = "Was Stolen" },
"Weather"
),
p "A Dog",
img { src = "logo.png" },
table(
tr (
th { class = "selected" } "'Headline'",
th "Headline 2",
th "Headline 3"
)
)
)
)
)
Lo anterior generará HTML similar a:
<html lang="en">
<head>
<script src="main.js"></script>
</head>
<body>
<h1 class="title "is" bigger than you think" selected>
Hello
</h1>
<h1>
Another Headline
</h1>
<p>
<Beautiful> & <Strange>
<br>
table: 0x0004c370Weather
</p>
<p>
A Dog
</p>
<img src="logo.png">
<table>
<tr>
<th class="selected">
'Headline'
</th>
<th>
Headline 2
</th>
<th>
Headline 3
</th>
</tr>
</table>
</body>
</html>
Aquí pasamos una función:
local tags = require "resty.tags"
local html = tags(function()
return html { lang = "en"} (
head (
script { src = "main.js" }
),
body (
h1 { class = 'title "is" bigger than you think', "selected" } "Hello",
h1 "Another Headline",
p (
"<Beautiful> & <Strange>",
br,
{ Car = "Was Stolen" },
"Weather"
),
p "A Dog",
img { src = "logo.png" },
table(
tr (
th { class = "selected" } "'Headline'",
th "Headline 2",
th "Headline 3"
)
)
)
)
end)
print(html())
Y la salida es similar:
<html lang="en">
<head>
<script src="main.js"></script>
</head>
<body>
<h1 class="title "is" bigger than you think" selected>
Hello
</h1>
<h1>
Another Headline
</h1>
<p>
<Beautiful> & <Strange>
<br>
table: 0x00054ce0Weather
</p>
<p>
A Dog
</p>
<img src="logo.png">
<table>
<tr>
<th class="selected">
'Headline'
</th>
<th>
Headline 2
</th>
<th>
Headline 3
</th>
</tr>
</table>
</body>
</html>
En este ejemplo creamos un fragmento de tabla:
local tags = require "resty.tags"
local table = tags(function(rows)
local table = table
for _, row in ipairs(rows) do
local tr = tr
for _, col in ipairs(row) do
tr(td(col))
end
table(tr)
end
return table
end)
print(table{
{ "A", 1, 1 },
{ "B", 2, 2 },
{ "C", 3, 3 }
})
Y aquí está la salida de esto:
<table>
<tr>
<td>A</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>B</td>
<td>2</td>
<td>2</td>
</tr>
<tr>
<td>C</td>
<td>3</td>
<td>3</td>
</tr>
</table>
Se realiza un tratamiento especial a las etiquetas <script> y <style>:
local tags = require "resty.tags"
local script = tags("script")
print(script[[
function hello() {
alert("<strong>Hello World</strong>");
}
hello();
]])
Como puedes ver, no codificamos en HTML la salida:
<script>
function hello() {
alert("<strong>Hello World</strong>");
}
hello();
</script>
GitHub
Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-tags.