26 Jan, 2024
HTMLString = {}
HTMLString.__index = HTMLString
function HTMLString:new(s)
local newObj = setmetatable({}, self)
newObj.str = s or ""
return newObj
end
function escape_html(str)
local map = {["&"] = "&", ["<"] = "<", [">"] = ">", ['"'] = """, ["'"] = "'"}
return (str:gsub('[&<>"\']', map))
end
function HTMLString:__concat(other)
if getmetatable(other) ~= HTMLString then
other = escape_html(tostring(other))
else
other = other.str
end
if getmetatable(self) ~= HTMLString then
self = escape_html(tostring(self))
else
self = self.str
end
return HTMLString:new(self .. other)
end
function HTMLString:render()
return self.str
end
local myHtml1 = HTMLString:new("<p>")
local myHtml2 = HTMLString:new("</p>")
local content = "This is <b>bold</b> text"
local finalHtml = myHtml1 .. content .. myHtml2
print(finalHtml:render())
BaseTemplate = {}
BaseTemplate.__index = BaseTemplate
function BaseTemplate:new()
local newObj = setmetatable({}, self)
return newObj
end
function BaseTemplate:header()
return HTMLString:new("<header>Default Header</header>")
end
function BaseTemplate:footer()
return HTMLString:new("<footer>Default Footer</footer>")
end
function BaseTemplate:body()
return HTMLString:new("Default Body")
end
function BaseTemplate:render()
return (self:header() .. self:body() .. self:footer()):render()
end
ChildTemplate = setmetatable({}, BaseTemplate)
function ChildTemplate:new()
local newObj = setmetatable(BaseTemplate:new(), self)
self.__index = self
return newObj
end
function ChildTemplate:header()
return HTMLString:new("<header>Custom Header</header>")
end
function ChildTemplate:body()
return HTMLString:new("Custom Body")
end
local baseTemplate = BaseTemplate:new()
local childTemplate = ChildTemplate:new()
print(baseTemplate:render())
print(childTemplate:render())
Gives:
<p>This is <b>bold</b> text</p>
<header>Default Header</header>Default Body<footer>Default Footer</footer>
<header>Custom Header</header>Custom Body<footer>Default Footer</footer>
Copyright James Gardner 1996-2020 All Rights Reserved. Admin.
k