From a12122b03ffd268a22fc9ccde38ff13dec435d01 Mon Sep 17 00:00:00 2001 From: Jonathan Harker Date: Tue, 20 Oct 2026 12:34:18 +1300 Subject: [PATCH] Refactor tracking categories to a set-like table, separate from error output --- module_citeq.lua | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/module_citeq.lua b/module_citeq.lua index b731e1f..1ae2e63 100644 --- a/module_citeq.lua +++ b/module_citeq.lua @@ -9,7 +9,8 @@ local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed local cs1_cfg = mw.loadData('Module:Citation/CS1/Configuration') -local opt_cat = '' +local opt_cat = {} +local cq_errors = '' local max_authors_displayed = 10 -- Don't look up all 500+ author items (is this in CS1 config somewhere?) @@ -59,6 +60,14 @@ local function in_array( needle, haystack ) return false end +--[[--------------------------< T A B L E S E T _ A D D >------------------------------------------------------ +Add needle to the haystack if it's not already there. +]] +local function tableset_add(haystack, needle) + if needle == nil or in_array(needle, haystack) then return false end + table.insert(haystack, needle) + return true +end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. @@ -252,8 +261,9 @@ local function makelink(v, out, maxpos, wdl, namestyle) } else -- use anonymous + tableset_add(opt_cat, cfg.i18n_t.trackingcats["unknown-author"]) label = { - label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or ""), + label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), qid = 'Q4233718', } end @@ -886,11 +896,10 @@ local function _cite_q (citeq_args) end -- add category and display error if name errors found - local name_cat = cfg.i18n_t.trackingcats['missing-author-first-last-names'] - if #missing_names > 0 and not string.find(opt_cat, name_cat, 1, true) then - opt_cat = opt_cat .. name_cat + if #missing_names > 0 and not in_array('missing-author-first-last-names', opt_cat) then + tableset_add(opt_cat, cfg.i18n_t.trackingcats['missing-author-first-last-names']) -- TODO: format and i18n this string - opt_cat = opt_cat .. ' {{[[Template:Cite Q|Cite Q]]}}: Missing first/last names in Wikidata for ' .. table.concat(missing_names, ', ') .. ' ([[Template:Cite Q#Error messages|help]]) ' + cq_errors = cq_errors .. ' {{[[Template:Cite Q|Cite Q]]}}: Missing first/last names in Wikidata for ' .. table.concat(missing_names, ', ') .. ' ([[Template:Cite Q#Error messages|help]]) ' end -- change edition to ordinal if it's set and numeric @@ -913,7 +922,7 @@ local function _cite_q (citeq_args) else local tpara = frame:expandTemplate{ title = 'para', args = {'ref', citeq_args.ref} } -- TODO: format and i18n this string - opt_cat = opt_cat .. ' {{[[Template:Cite Q|Cite Q]]}}: supplied ' .. tpara .. ' does not match value generated from Wikidata: ' .. citeref .. ' ([[Template:Cite Q#Error messages|help]]) ' + cq_errors = cq_errors .. ' {{[[Template:Cite Q|Cite Q]]}}: supplied ' .. tpara .. ' does not match value generated from Wikidata: ' .. citeref .. ' ([[Template:Cite Q#Error messages|help]]) ' end end @@ -978,7 +987,7 @@ local function _cite_q (citeq_args) -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then - opt_cat = opt_cat .. cfg.i18n_t.trackingcats.retracted + tableset_add(opt_cat, cfg.i18n_t.trackingcats.retracted) local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', @@ -1033,7 +1042,7 @@ local function _cite_q (citeq_args) -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then - opt_cat = opt_cat .. cfg.i18n_t.trackingcats.erratum + tableset_add(opt_cat, cfg.i18n_t.trackingcats.erratum) local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ @@ -1059,7 +1068,7 @@ local function _cite_q (citeq_args) -- Indicator if item has an expression of concern notice (P14891) local eoc = "" if citeq_args['expression-of-concern'] then - opt_cat = opt_cat .. cfg.i18n_t.trackingcats['expression-of-concern'] + tableset_add(opt_cat, cfg.i18n_t.trackingcats['expression-of-concern']) local eoc_params = { citeq = 'yes', id = frame:expandTemplate{ @@ -1083,11 +1092,11 @@ local function _cite_q (citeq_args) citeq_args['eoc-intentional'] = nil if citeq_args.replaced_by then - opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced + tableset_add(opt_cat, cfg.i18n_t.trackingcats.replaced) citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title - opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; + tableset_add(opt_cat, cfg.i18n_t.trackingcats['no-label-or-title']) end -- Disable CiteSeerX IDs for now @@ -1108,9 +1117,10 @@ local function _cite_q (citeq_args) else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args - } .. cfg.i18n_t.trackingcats["unknown-template"] + } + tableset_add(opt_cat, cfg.i18n_t.trackingcats["unknown-template"]) end - return output .. erratumid .. eoc .. retract .. opt_cat + return output .. erratumid .. eoc .. retract .. table.concat(opt_cat, ' ') .. cq_errors end local function cite_q (frame)