56 lines
1.4 KiB
Markdown
56 lines
1.4 KiB
Markdown
#meta
|
|
|
|
Implements useful template functions
|
|
|
|
```space-lua
|
|
-- priority: 50
|
|
-- Template API root table
|
|
template = template or {}
|
|
-- Template storage table
|
|
templates = {}
|
|
|
|
-- Iterates over a table/array and applies a function to each element,
|
|
-- concatenating the results
|
|
function template.each(tbl, fn)
|
|
local result = {}
|
|
for _, item in ipairs(tbl) do
|
|
table.insert(result, fn(item))
|
|
end
|
|
return table.concat(result)
|
|
end
|
|
|
|
-- Creates a new template function from a string template
|
|
function template.new(templateStr)
|
|
-- Preprocess: strip indentation
|
|
local lines = {}
|
|
local splitLines = string.split(templateStr, "\n")
|
|
for _, line in ipairs(splitLines) do
|
|
line = string.gsub(line, "^ ", "")
|
|
table.insert(lines, line)
|
|
end
|
|
templateStr = table.concat(lines, "\n")
|
|
return function(obj)
|
|
return spacelua.interpolate(templateStr, obj)
|
|
end
|
|
end
|
|
|
|
-- Reads a template from a page
|
|
-- Return value:
|
|
-- * The template itself
|
|
-- * The extracted frontmatter
|
|
function template.fromPage(name, raw)
|
|
local fm = index.extractFrontmatter(space.readPage(name), {
|
|
removeFrontmatterSection = true,
|
|
removeTags = true
|
|
})
|
|
|
|
local templateText = string.trimStart(fm.text)
|
|
if raw then
|
|
-- Don't actually parse this as a template, just pass it along
|
|
return function()
|
|
return templateText
|
|
end, fm.frontmatter
|
|
end
|
|
return template.new(templateText), fm.frontmatter
|
|
end
|
|
``` |