diff --git a/module_citeq.lua b/module_citeq.lua index ceead63..985a482 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 a table of initials +-- Split string of comma-separated first names into table of initials local function getInitials(str) local initials = {} for _, word in pairs(mw.text.split(str, ' ', true)) do @@ -92,14 +92,13 @@ local function getInitials(str) return initials end --- Return initials given a first name string and a name-list-style value --- (e.g. 'vanc' for Vancouver, or APA) +-- Return initials given a style (e.g. Vancouver or APA) local function getStyledNames(names, style) - -- Vancouver style (vanc) is handled by CS1: Doe JQ - if style == 'apa' then -- APA: Doe, J. Q. + if style == 'Vancouver' then + return table.concat(getInitials(names)) + elseif style == 'APA' then return table.concat(getInitials(names), '. ') .. '.' else - -- Otherwise, just remove any trailing commas from names return mw.text.trim(names:gsub(', ', ' ')) end end @@ -107,8 +106,6 @@ 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 @@ -125,15 +122,12 @@ 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 - -- 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 + 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) 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 @@ -150,16 +144,6 @@ 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 @@ -321,7 +305,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['name-list-style']) + maxpos = makelink(v, out, link, maxpos, wdl, args.namestyle) end end end @@ -329,7 +313,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['name-list-style']) + maxpos = makelink(v, out, link, maxpos, wdl, args.namestyle) end end end @@ -554,6 +538,7 @@ 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) @@ -1008,9 +993,8 @@ local function _cite_q (citeq_args) -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil - if citeq_args['name-list-style'] and citeq_args['name-list-style'] == 'apa' then - citeq_args['name-list-style'] = nil - end + citeq_args.namestyle = nil + citeq_args['name-style'] = nil -- render the template local lc_template = template and template:lower() or "citation"