Module:TemplateStarter: Difference between revisions
// via Wikitext Extension for VSCode |
// via Wikitext Extension for VSCode |
||
| Line 6: | Line 6: | ||
-- Required modules | -- Required modules | ||
local ConfigRepository = require('Module:ConfigRepository') | local ConfigRepository = require('Module:ConfigRepository') | ||
local ErrorHandling = require('Module:ErrorHandling') | |||
-- Cache for template lists to improve performance | |||
local templateListCache = nil | |||
local templateListCacheTime = 0 | |||
local CACHE_DURATION = 300 -- 5 minutes in seconds | |||
-- Generate empty template wikitext from template type | -- Generate empty template wikitext from template type | ||
function p.generateTemplate(templateType) | function p.generateTemplate(templateType) | ||
-- | -- Input validation and sanitization | ||
if not templateType or templateType == "" then | |||
return "Error: Template type is required" | |||
end | |||
-- | -- Sanitize input - remove any potentially harmful characters | ||
if not | templateType = mw.text.trim(tostring(templateType)) | ||
return | if not templateType:match("^[%w_%-]+$") then | ||
return "Error: Invalid template type format" | |||
end | end | ||
-- | -- Create error context for better error handling | ||
local | local errorContext = ErrorHandling.createContext() | ||
-- | -- Protected function to get configuration | ||
local function getTemplateConfig() | |||
local config = ConfigRepository.getConfig(templateType) | |||
if not | |||
if not config then | |||
ErrorHandling.addError(errorContext, 'TemplateStarter.generateTemplate', | |||
string.format("Template type '%s' not found in ConfigRepository", templateType)) | |||
return nil | |||
end | |||
if not config.fields then | |||
ErrorHandling.addError(errorContext, 'TemplateStarter.generateTemplate', | |||
string.format("Template type '%s' has no fields configuration", templateType)) | |||
return nil | |||
end | end | ||
return config | |||
end | end | ||
-- | -- Get configuration with error protection | ||
local success, config = ErrorHandling.protect(errorContext, getTemplateConfig) | |||
if not success or not config then | |||
return "Error: " .. (ErrorHandling.formatOutput(errorContext) or "Failed to load template configuration") | |||
end | |||
-- | -- Pre-allocate lines table for better performance | ||
local lines = {} | |||
lines[1] = "{{" .. templateType | |||
local lineCount = 1 | |||
local | |||
local | |||
-- | -- Process each field with error protection | ||
local function processFields() | |||
for _, field in ipairs(config.fields) do | |||
-- Skip hidden fields | |||
if not field.hidden then | |||
-- Handle fields with multiple keys (prefer single key, fallback to first of multiple) | |||
local fieldKey = field.key or (field.keys and field.keys[1]) | |||
if fieldKey and fieldKey ~= "" then | |||
lineCount = lineCount + 1 | |||
lines[lineCount] = string.format("|%s = ", fieldKey) | |||
end | |||
end | |||
end | |||
end | end | ||
if not | -- Process fields with error protection | ||
local fieldSuccess = ErrorHandling.protect(errorContext, processFields) | |||
if not fieldSuccess then | |||
ErrorHandling.addError(errorContext, 'TemplateStarter.generateTemplate', | |||
"Failed to process template fields") | |||
end | end | ||
-- | -- Close the template | ||
lineCount = lineCount + 1 | |||
lines[lineCount] = "}}" | |||
-- | -- Join with newlines (more efficient than multiple concatenations) | ||
return | return table.concat(lines, "\n") | ||
end | end | ||
-- | -- Main function to be called from wiki (for testing/preview) | ||
function p. | function p.main(frame) | ||
local | local errorContext = ErrorHandling.createContext() | ||
-- Get parameters | -- Protected function to process arguments | ||
local function processArgs() | |||
local args = frame.args | |||
local parent = frame:getParent() | |||
local pargs = parent and parent.args or {} | |||
-- Get parameters (check both direct and parent args) | |||
local articleName = args.articleName or pargs.articleName or args[1] or pargs[1] | |||
local templateType = args.templateType or pargs.templateType or args[2] or pargs[2] | |||
-- Validate inputs | |||
if not articleName or mw.text.trim(tostring(articleName)) == "" then | |||
ErrorHandling.addError(errorContext, 'TemplateStarter.main', "Article name is required") | |||
return nil | |||
end | |||
if not templateType or mw.text.trim(tostring(templateType)) == "" then | |||
ErrorHandling.addError(errorContext, 'TemplateStarter.main', "Template type is required") | |||
return nil | |||
end | |||
return { | |||
articleName = mw.text.trim(tostring(articleName)), | |||
templateType = mw.text.trim(tostring(templateType)) | |||
} | |||
end | end | ||
if not | -- Process arguments with error protection | ||
return "Error: | local success, params = ErrorHandling.protect(errorContext, processArgs) | ||
if not success or not params then | |||
return "Error: " .. (ErrorHandling.formatOutput(errorContext) or "Invalid parameters") | |||
end | end | ||
-- Generate the template content | -- Generate the template content | ||
local content = p.generateTemplate(templateType) | local content = p.generateTemplate(params.templateType) | ||
-- | -- For testing, return the generated content in a pre block | ||
return string.format('<pre>Page: %s\n\n%s</pre>', | |||
mw.text.nowiki(params.articleName), | |||
mw.text.nowiki(content)) | |||
return string.format( | |||
mw.text.nowiki(articleName) | |||
mw.text.nowiki(content) | |||
end | end | ||
-- Generate a dynamic preload template | -- Generate a dynamic preload template (main function used by JavaScript) | ||
function p.preload(frame) | function p.preload(frame) | ||
local args = frame.args | local args = frame.args | ||
local templateType = args.templateType or args[1] | local templateType = args.templateType or args[1] | ||
if not templateType then | if not templateType or mw.text.trim(tostring(templateType)) == "" then | ||
return "<!-- No template type specified -->" | return "<!-- No template type specified -->" | ||
end | end | ||
return p.generateTemplate(templateType) | return p.generateTemplate(mw.text.trim(tostring(templateType))) | ||
end | end | ||
-- | -- Get list of available templates with caching | ||
function p. | function p.getAvailableTemplates() | ||
local | local currentTime = os.time() | ||
local | |||
-- Check if cache is valid | |||
if templateListCache and (currentTime - templateListCacheTime) < CACHE_DURATION then | |||
return templateListCache | |||
end | |||
-- Create error context for template list generation | |||
local errorContext = ErrorHandling.createContext() | |||
-- | -- Protected function to get templates | ||
local | local function getTemplates() | ||
local templates = {} | |||
if not ConfigRepository.templates then | |||
ErrorHandling.addError(errorContext, 'TemplateStarter.getAvailableTemplates', | |||
"ConfigRepository.templates is not available") | |||
return {} | |||
end | |||
-- Pre-allocate table for better performance | |||
local templateCount = 0 | |||
for _ in pairs(ConfigRepository.templates) do | |||
templateCount = templateCount + 1 | |||
end | |||
local templates = {} | |||
local index = 1 | |||
for templateName, _ in pairs(ConfigRepository.templates) do | |||
if templateName and templateName ~= "" then | |||
templates[index] = templateName | |||
index = index + 1 | |||
end | |||
end | |||
table.sort(templates) | |||
return templates | |||
end | |||
-- Get templates with error protection | |||
local success, templates = ErrorHandling.protect(errorContext, getTemplates) | |||
if not success then | |||
-- Fallback to basic list if there's an error | |||
templates = {"Person", "Organization", "Event", "TLD", "Process", "Norm", "LibraryInterview"} | |||
-- | |||
end | end | ||
-- Update cache | |||
templateListCache = templates | |||
templateListCacheTime = currentTime | |||
return templates | return templates | ||
end | end | ||
| Line 172: | Line 206: | ||
function p.listTemplates(frame) | function p.listTemplates(frame) | ||
local templates = p.getAvailableTemplates() | local templates = p.getAvailableTemplates() | ||
if #templates == 0 then | |||
return "No templates available" | |||
end | |||
return "Available templates: " .. table.concat(templates, ", ") | return "Available templates: " .. table.concat(templates, ", ") | ||
end | end | ||
return p | return p | ||