-- External scripts are resolved relative to the HTML file that includes them :) local function element(tag, attributes, children) return { tag = tag, attributes = attributes or {}, children = children or {} } end local function find_by_class(node, wanted) if type(node) ~= "table" then return nil end local classes = node.attributes and node.attributes.class or "" if (" " .. classes .. " "):find(" " .. wanted .. " ", 1, true) then return node end for _, child in ipairs(node.children or {}) do local match = find_by_class(child, wanted) if match then return match end end end local features = { "inline Lua", "external Lua", "DOM updates", "directory walking", "logging", "mixed content" } local feature_list = assert(find_by_class(page, "feature-list")) for _, feature in ipairs(features) do table.insert(feature_list.children, element("li", {}, { feature })) end local entries = {} for entry in fs.walk(".") do table.insert(entries, entry) end table.sort(entries, function(left, right) return left.path < right.path end) local summary = assert(find_by_class(page, "file-summary")) summary.text = tostring(#entries) .. " entries" local file_list = assert(find_by_class(page, "file-list")) for _, entry in ipairs(entries) do table.insert(file_list.children, element("li", {}, { element("code", {}, { entry.path }), " (", entry.type, ")" })) end local build_summary = assert(find_by_class(page, "build-summary")) build_summary.text = "Built with " .. site.name .. " " .. site.version local mixed = assert(find_by_class(page, "mixed-content")) mixed.children = { { kind = "comment", text = "generated by Lua" }, "Text with ", element("strong", {}, { "an element" }), "." } table.insert(page.head.children, 1, { kind = "processing_instruction", target = "yapssg", text = "generated" }) page.attributes["data-entry-count"] = tostring(#entries) log.info("generated", #features, "feature items") log.debug("walked", #entries, "entries")