Module:auto cat: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
local export = {} | local export = {} | ||
local d_languages = mw.loadData("Module:languages/data") | |||
-- Alternative to mw.ustring.gsub that is neater to call in code | |||
-- and can handle multiple replacements at once. | |||
local function replace(str, patt, rpl, patt2, rpl2, patt3, rpl3) | |||
local res = tostring(mw.ustring.gsub(str, patt, rpl)) | |||
if patt2 then | |||
res = tostring(mw.ustring.gsub(res, patt2, rpl2)) | |||
end | |||
if patt3 then | |||
res = tostring(mw.ustring.gsub(res, patt3, rpl3)) | |||
end | |||
return res | |||
end | |||
-- Sanitizes a string containing hyphens so that the hyphens | |||
-- do not count as Lua pattern special characters | |||
local function sanitize(str) | |||
return tostring(mw.ustring.gsub(str, "%-", "%-")) | |||
end | |||
-- Takes a Lua pattern and a table of categories and returns | |||
-- the auto-cat-style table format required, containing the | |||
-- given data | |||
local function to_pattern(pattern, categories) | |||
return {"^" .. pattern .. "$", categories} | |||
end | |||
-- Expands a pattern containing %l (and optionally %u), adding versions | |||
-- of the pattern for each possible language | |||
local function hydrate_pattern_l(out_patterns, p_lua, p_categories, also_u) | |||
for _, l_data in pairs(d_languages) do | |||
if also_u then | |||
for _, l2_data in pairs(d_languages) do | |||
if l2_data.code ~= l_data.code then | |||
local p_out_cats = {} | |||
for _, p_cat in ipairs(p_categories) do | |||
table.insert(p_out_cats, replace(p_cat, "%%l", l_data.name, "%%u", l2_data.name)) | |||
end | |||
table.insert(out_patterns, to_pattern(replace(p_lua, "%%l", sanitize(l_data.name), "%%u", sanitize(l2_data.name)), p_out_cats)) | |||
end | |||
end | |||
else | |||
local p_out_cats = {} | |||
for _, p_cat in ipairs(p_categories) do | |||
table.insert(p_out_cats, replace(p_cat, "%%l", l_data.name)) | |||
end | |||
table.insert(out_patterns, to_pattern(replace(p_lua, "%%l", sanitize(l_data.name)), p_out_cats)) | |||
end | |||
end | |||
end | |||
local function hydrate_pattern_c(out_patterns, p_lua, p_categories) | |||
for l_code, l_data in pairs(d_languages) do | |||
local p_out_cats = {} | |||
for _, p_cat in ipairs(p_categories) do | |||
table.insert(p_out_cats, replace(p_cat, "%%l", l_data.name, "%%c", l_code)) | |||
end | |||
table.insert(out_patterns, to_pattern(replace(p_lua, "%%c", l_code), p_out_cats)) | |||
end | |||
end | |||
local function hydrate_patterns() | local function hydrate_patterns() | ||
local out_patterns = {} | local out_patterns = {} | ||
for _, p_data in ipairs(mw.loadData("Module:auto cat/data")) do | for _, p_data in ipairs(mw.loadData("Module:auto cat/data")) do | ||
local p_template, | local p_template, p_categories = p_data[1], p_data[2] | ||
local p_lua = | local p_lua = replace(sanitize(p_template), "%%s", "(..-)") | ||
if mw.ustring.find(p_template, "%%l") ~= nil then | if mw.ustring.find(p_template, "%%l") ~= nil then | ||
hydrate_pattern_l(out_patterns, p_lua, p_categories, mw.ustring.find(p_template, "%%u") ~= nil) | |||
elseif mw.ustring.find(p_template, "%%c") ~= nil then | elseif mw.ustring.find(p_template, "%%c") ~= nil then | ||
hydrate_pattern_c(out_patterns, p_lua, p_categories) | |||
else | else | ||
table.insert(out_patterns, | table.insert(out_patterns, to_pattern(p_lua, p_categories)) | ||
end | end | ||
end | end | ||
Line 30: | Line 80: | ||
local function process_category(category_name, p_lua, p_categories) | local function process_category(category_name, p_lua, p_categories) | ||
local out = "" | local out = "" | ||
local is_s = mw.ustring.find( | local is_s = mw.ustring.find(p_lua, "%(%.%.%-%)") ~= nil | ||
local _, _, s_match = mw.ustring.find(category_name, p_lua) | local _, _, s_match = mw.ustring.find(category_name, p_lua) | ||
for _, p_category in ipairs(p_categories) do | for _, p_category in ipairs(p_categories) do | ||
out = out .. "[[Category:" .. (is_s and | out = out .. "[[Category:" .. (is_s and replace(p_category, "%%s", s_match) or p_category) .. "]]" | ||
end | end | ||
return out | return out | ||
Line 46: | Line 96: | ||
end | end | ||
end | end | ||
return "[[Category:Category pages not matched by auto cat]]" | return "[[Category:Category pages not matched by auto cat]]" | ||
end | end |
Revision as of 18:23, 26 February 2024
local export = {}
local d_languages = mw.loadData("Module:languages/data")
-- Alternative to mw.ustring.gsub that is neater to call in code
-- and can handle multiple replacements at once.
local function replace(str, patt, rpl, patt2, rpl2, patt3, rpl3)
local res = tostring(mw.ustring.gsub(str, patt, rpl))
if patt2 then
res = tostring(mw.ustring.gsub(res, patt2, rpl2))
end
if patt3 then
res = tostring(mw.ustring.gsub(res, patt3, rpl3))
end
return res
end
-- Sanitizes a string containing hyphens so that the hyphens
-- do not count as Lua pattern special characters
local function sanitize(str)
return tostring(mw.ustring.gsub(str, "%-", "%-"))
end
-- Takes a Lua pattern and a table of categories and returns
-- the auto-cat-style table format required, containing the
-- given data
local function to_pattern(pattern, categories)
return {"^" .. pattern .. "$", categories}
end
-- Expands a pattern containing %l (and optionally %u), adding versions
-- of the pattern for each possible language
local function hydrate_pattern_l(out_patterns, p_lua, p_categories, also_u)
for _, l_data in pairs(d_languages) do
if also_u then
for _, l2_data in pairs(d_languages) do
if l2_data.code ~= l_data.code then
local p_out_cats = {}
for _, p_cat in ipairs(p_categories) do
table.insert(p_out_cats, replace(p_cat, "%%l", l_data.name, "%%u", l2_data.name))
end
table.insert(out_patterns, to_pattern(replace(p_lua, "%%l", sanitize(l_data.name), "%%u", sanitize(l2_data.name)), p_out_cats))
end
end
else
local p_out_cats = {}
for _, p_cat in ipairs(p_categories) do
table.insert(p_out_cats, replace(p_cat, "%%l", l_data.name))
end
table.insert(out_patterns, to_pattern(replace(p_lua, "%%l", sanitize(l_data.name)), p_out_cats))
end
end
end
local function hydrate_pattern_c(out_patterns, p_lua, p_categories)
for l_code, l_data in pairs(d_languages) do
local p_out_cats = {}
for _, p_cat in ipairs(p_categories) do
table.insert(p_out_cats, replace(p_cat, "%%l", l_data.name, "%%c", l_code))
end
table.insert(out_patterns, to_pattern(replace(p_lua, "%%c", l_code), p_out_cats))
end
end
local function hydrate_patterns()
local out_patterns = {}
for _, p_data in ipairs(mw.loadData("Module:auto cat/data")) do
local p_template, p_categories = p_data[1], p_data[2]
local p_lua = replace(sanitize(p_template), "%%s", "(..-)")
if mw.ustring.find(p_template, "%%l") ~= nil then
hydrate_pattern_l(out_patterns, p_lua, p_categories, mw.ustring.find(p_template, "%%u") ~= nil)
elseif mw.ustring.find(p_template, "%%c") ~= nil then
hydrate_pattern_c(out_patterns, p_lua, p_categories)
else
table.insert(out_patterns, to_pattern(p_lua, p_categories))
end
end
return out_patterns
end
local function process_category(category_name, p_lua, p_categories)
local out = ""
local is_s = mw.ustring.find(p_lua, "%(%.%.%-%)") ~= nil
local _, _, s_match = mw.ustring.find(category_name, p_lua)
for _, p_category in ipairs(p_categories) do
out = out .. "[[Category:" .. (is_s and replace(p_category, "%%s", s_match) or p_category) .. "]]"
end
return out
end
function export.auto_cat(category_name)
local lua_patterns = hydrate_patterns()
for _, p_data in ipairs(lua_patterns) do
local p_lua, p_categories = p_data[1], p_data[2]
if mw.ustring.find(category_name, p_lua) ~= nil then
return process_category(category_name, p_lua, p_categories)
end
end
return "[[Category:Category pages not matched by auto cat]]"
end
function export.show(frame)
local title_obj = mw.title.getCurrentTitle()
if title_obj.nsText ~= "Category" then
error("{{auto cat}} can only be used on pages in the Category namespace")
end
return export.auto_cat(title_obj.text)
end
return export