From 43bf989f9165594963776149538a913224529dcb Mon Sep 17 00:00:00 2001 From: Jonathan Harker Date: Sat, 3 Oct 2026 14:50:48 +1300 Subject: [PATCH 1/2] Use existing name-list-style 'vanc' and add 'apa' handling --- module_citeq.lua | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/module_citeq.lua b/module_citeq.lua index 985a482..219353c 100644 --- a/module_citeq.lua +++ b/module_citeq.lua @@ -80,7 +80,7 @@ local function accept_value( param_val, wd_val ) return val end --- Split string of comma-separated first names into table of initials +-- Split string of comma-separated first names into a table of initials local function getInitials(str) local initials = {} for _, word in pairs(mw.text.split(str, ' ', true)) do @@ -92,13 +92,14 @@ local function getInitials(str) return initials end --- Return initials given a style (e.g. Vancouver or APA) +-- Return initials given a first name string and a name-list-style value +-- (e.g. 'vanc' for Vancouver, or APA) local function getStyledNames(names, style) - if style == 'Vancouver' then - return table.concat(getInitials(names)) - elseif style == 'APA' then + -- Vancouver style (vanc) is handled by CS1: Doe JQ + if style == 'apa' then -- APA: Doe, J. Q. return table.concat(getInitials(names), '. ') .. '.' else + -- Otherwise, just remove any trailing commas from names return mw.text.trim(names:gsub(', ', ' ')) end end @@ -305,7 +306,7 @@ local function get_name_list (nl_type, args, qid, wdl) if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names - maxpos = makelink(v, out, link, maxpos, wdl, args.namestyle) + maxpos = makelink(v, out, link, maxpos, wdl, args['name-list-style']) end end end @@ -313,7 +314,7 @@ local function get_name_list (nl_type, args, qid, wdl) -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names - maxpos = makelink(v, out, link, maxpos, wdl, args.namestyle) + maxpos = makelink(v, out, link, maxpos, wdl, args['name-list-style']) end end end @@ -538,7 +539,6 @@ local function _cite_q (citeq_args) citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil - citeq_args.namestyle = citeq_args.namestyle or citeq_args['name-style'] or nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) @@ -993,8 +993,9 @@ local function _cite_q (citeq_args) -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil - citeq_args.namestyle = nil - citeq_args['name-style'] = nil + if citeq_args['name-list-style'] and citeq_args['name-list-style'] == 'apa' then + citeq_args['name-list-style'] = nil + end -- render the template local lc_template = template and template:lower() or "citation" From b2ab54ccb4a2c86999fa4a6e3c081ce0cfb53509 Mon Sep 17 00:00:00 2001 From: Jonathan Harker Date: Mon, 5 Oct 2026 21:42:08 +1300 Subject: [PATCH 2/2] Fix too many item lookups on items will silly amounts of authors --- module_citeq.lua | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/module_citeq.lua b/module_citeq.lua index 219353c..ceead63 100644 --- a/module_citeq.lua +++ b/module_citeq.lua @@ -107,6 +107,8 @@ end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl, namestyle) local label + local max_authors_displayed = 10 -- TODO: this is probably in CS1 config somewhere + local item_lookup = false if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id @@ -123,12 +125,15 @@ local function makelink(v, out, link, maxpos, wdl, namestyle) first_names = v.qualifiers.P9687[1].datavalue.value end -- Otherwise, get last name, first name(s) from author item properties - last_name = last_name or getValue({"P734", qid=qnumber, maxvals=1, ps=2}) - first_names = first_names or getValue({"P735", qid=qnumber, maxvals=0, ps=2}) - if first_names then - first_names = getStyledNames(first_names, namestyle) + -- but this requires a getValue WD item lookup for each author, and + -- lookups are limited to 500 per page, so do this after we have the + -- "series ordinal" order, then only do the first few since there are + -- article items out there with 400+ authors(!) + if not last_name or not first_names then + item_lookup = true end + -- use object named as for the label if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- "object named as" else @@ -145,6 +150,16 @@ local function makelink(v, out, link, maxpos, wdl, namestyle) position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) + + -- now try determining first/last names with item lookup, if needed + if item_lookup and position <= max_authors_displayed then + last_name = last_name or getValue({"P734", qid=qnumber, maxvals=1, ps=2}) + first_names = first_names or getValue({"P735", qid=qnumber, maxvals=0, ps=2}) + end + if first_names then + first_names = getStyledNames(first_names, namestyle) + end + if sitelink then -- just the plain name, -- but keep a record of the links, using the same index