Fetch given/family names from author, editor, or qualifiers on name strings

This commit is contained in:
Jonathan Harker 2026-09-21 18:33:10 +12:00
parent 360f04ee8e
commit 280095ed0f

View file

@ -88,8 +88,16 @@ local function makelink(v, out, link, maxpos, wdl)
local qnumber = v.mainsnak.datavalue.value.id
local sitelink = mw.wikibase.getSitelink(qnumber)
if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors"
-- Last name, first name(s)
local last_name = getValue({"P734", qid=qnumber, maxvals=1, ps=2})
local first_names = getValue({"P735", qid=qnumber, maxvals=0, ps=2})
if first_names then
first_names = mw.text.trim(first_names:gsub(', ', ' '))
end
if v.qualifiers and v.qualifiers.P1932 then
label = v.qualifiers.P1932[1].datavalue.value -- object named as
label = v.qualifiers.P1932[1].datavalue.value -- "object named as"
else
label = mw.wikibase.getLabel(qnumber)
if label then
@ -100,14 +108,22 @@ local function makelink(v, out, link, maxpos, wdl)
end
local position = maxpos + 1 -- Default to 'next' author.
-- use P1545 (series ordinal) instead of default position.
if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then
position = tonumber(v.qualifiers["P1545"][1].datavalue.value)
if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then
position = tonumber(v.qualifiers.P1545[1].datavalue.value)
end
maxpos = math.max(maxpos, position)
if sitelink then
-- just the plain name,
-- but keep a record of the links, using the same index
out[position] = label
if last_name and first_names then
out[position] = {
label = label,
last = last_name or nil,
first = first_names or nil,
}
else
out[position] = label
end
link[position] = sitelink
else
if wdl then
@ -120,24 +136,70 @@ local function makelink(v, out, link, maxpos, wdl)
)
else
-- no Wikidata links wanted, so just give the plain label
out[position] = label
if last_name and first_names then
out[position] = {
label = label,
last = last_name or nil,
first = first_names or nil,
}
else
out[position] = label
end
end
end
elseif v.mainsnak.datatype == "string" then
local position = maxpos + 1 -- Default to 'next' author.
-- use P1545 (series ordinal) instead of default position.
if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then
position = tonumber(v.qualifiers["P1545"][1].datavalue.value)
if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then
position = tonumber(v.qualifiers.P1545[1].datavalue.value)
end
maxpos = math.max(maxpos, position)
out[position] = v.mainsnak.datavalue.value
-- Names from "author given names" and "author last names" qualifiers
local last_name
local first_names
if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then
last_name = v.qualifiers.P9688[1].datavalue.value
end
if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then
first_names = mw.text.trim(v.qualifiers.P9687[1].datavalue.value:gsub(', ', ' '))
end
if last_name and first_names then
out[position] = {
label = v.mainsnak.datavalue.value,
last = last_name or nil,
first = first_names or nil,
}
else
out[position] = v.mainsnak.datavalue.value
end
else
-- not a wikibase-item or a string!
end
else
-- code here if we want to return something when author is "unknown"
-- try the "object named as" qualifier, otherwise use the unknown author item
if v.qualifiers and v.qualifiers.P1932 then
label = v.qualifiers.P1932[1].datavalue.value
label = v.qualifiers.P1932[1].datavalue.value -- "object named as"
-- Names from "author given names" and "author last names" qualifiers
local last_name
local first_names
if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then
last_name = v.qualifiers.P9688[1].datavalue.value
end
if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then
first_names = mw.text.trim(v.qualifiers.P9687[1].datavalue.value:gsub(', ', ' '))
end
if last_name and first_names then
out[position] = {
label = label,
last = last_name or nil,
first = first_names or nil,
}
else
out[position] = label
end
else
label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or "")
end
@ -235,15 +297,27 @@ local function get_name_list (nl_type, args, qid, wdl)
end
table.sort(keys) -- as they might be out of order
for i, k in ipairs(keys) do
out[k] = out[k]:gsub (''', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character
mw.log(i .. " " .. k .. " " .. (out[k]))
local label
if out[k].label then
label = out[k].label
else
label = out[k]
end
label = label:gsub(''', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character
mw.log(i .. " " .. k .. " " .. label)
if args[nl_type .. i] then -- name gets overwritten
-- pull corresponding -link only if overwritten name is same as WD name
if link[k] and (args[nl_type .. i] == out[k]) then
if link[k] and (args[nl_type .. i] == label) then
args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn
end
else -- name does not get overwritten, so pull name from WD
args[nl_type .. i] = out[k]
if out[k].first and out[k].last then
-- First/last names were found, so add them
args[nl_type .. '-last' .. i] = args[nl_type .. '-last' .. i] or out[k].last
args[nl_type .. '-first' .. i] = args[nl_type .. '-first' .. i] or out[k].first
else
args[nl_type .. i] = label
end
if link[k] then
args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn
end
@ -273,11 +347,12 @@ end
-- gets the language codes of a Wikidata entry as a table
local function _lang_code(qid)
local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} )
-- P407 "language of work or name"
local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) -- "Wikimedia language code"
if lc then return mw.text.split( lc, "[, ]+" ) end
lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} )
lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) -- "ISO 639-1 code"
if lc then return mw.text.split( lc, "[, ]+" ) end
return _getLangOfProp(qid, "P1476")
return _getLangOfProp(qid, "P1476") -- "title"
end
local function lang_code(frame)
return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ")