Modul:Wikidata table
Belgekirina modulê[nîşan bide] [biguhêre] [dîrokê bibîne] [rojane bike]
Related pages |
---|
This module creates one or more table rows where the data in each cell is taken from Wikidata.
Usage
biguhêreFunction makerow
biguhêreThis function is under development for use in articles. It creates a single table row from one Wikidata entity using a given set of properties. The first cell is the label for the Wikidata entity and it is marked up as a row-header. An "editonwikidata" icon is appended to the first cell. The table caption, column headings and scopes, etc. should be supplied externally. See the examples for more detail.
{{#invoke:Wikidata table |makerow
|pids= P123, P234+P345, P456, P567/P580-P582, etc. (see below)
|qid = Q12345 (one entity id for the row)
|line = HTML color code for horizontal line applied to top of each row (if required)
|c1 = locally supplied value (overrides value from Wikidata for column 1)
|c2 = locally supplied value (overrides value from Wikidata for column 2)
|cN = locally supplied value (overrides value from Wikidata for column N), etc.
|c1+ = locally supplied value (appends value from Wikidata to column 1)
|c2+ = locally supplied value (appends value from Wikidata to column 2)
|cN+ = locally supplied value (appends value from Wikidata to column N), etc.
}}
Notes
biguhêre- A table cell can be made up of a combination of multiple properties, qualifiers and references.
- Whitespace is ignored in the list of pids.
- The separator for cell values is the comma
,
. - Within a cell, multiple properties are separated by the plus sign
+
. - Each property can be separated from one or more qualifiers by a forward-slash
/
. - Each qualifier is separated by a hyphen
-
(although any punctuation other than, + /
will work).
Function convert
biguhêreA convenient function to convert a list of articles into a table.
{{subst:#invoke:Wikidata table | convert
| template = name of template
| 1 = list of articles
}}
For example:
{{subst:#invoke:Wikidata table | convert | template = Wdtable row/dam | 1 =
* [[Aoyama Dam]]
* [[Apporo Dam]]
* [[Ariake Dam]]
}}
produces:
{{Wdtable row/dam|qid=Q113189811<!-- Aoyama Dam -->}} {{Wdtable row/dam|qid=Q113189827<!-- Apporo Dam -->}} {{Wdtable row/dam|qid=Q113189802<!-- Ariake Dam -->}}
Function makerows
biguhêreThis function is simple and is intended to test performance. It is unsuitable for use in articles.
{{#invoke:Wikidata table |makerows
|pids= P123, P234, P345, etc. (one property id per column)
|qids = Q12345, Q23456, Q34567, etc. (one entity id per row)
}}
See also
biguhêre- Template:Wdtable row – a wrapper template for
makerow
- Template:Wdtable row/lighthouse – a custom wrapper template for
makerow
, hard-coding the pids for lists of lighthouses - Template:Wikidata list – bot generates Wikidata tables
- Module:Tabular data – shows tabular data from Commons
local p = {}
local debugging = false
local sep = ", " -- separator for multiple values of same property, changed from "<br>"
local sep2 = "<br>" -- separator for values of different properties
local maxrefs = 3 -- maximum number of references displayed for each statement
-- Internationalisation
-- takes optional string language code (e.g. "en") and returns a language object
local findLang = function(langcode)
local langobj
langcode = mw.text.trim(langcode or "")
if mw.language.isKnownLanguageTag(langcode) then
langobj = mw.language.new( langcode )
else
langcode = mw.getCurrentFrame():callParserFunction('int', {'lang'})
if mw.language.isKnownLanguageTag(langcode) then
langobj = mw.language.new( langcode )
else
langobj = mw.language.getContentLanguage()
end
end
return langobj
end
local currentlang = findLang().code
local i18n = {
filespace = "File",
editonwikidata = "Edit this on Wikidata",
ordinal = {
[1] = "st",
[2] = "nd",
[3] = "rd",
["default"] = "th"
},
}
local months = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }
local mnths = {'kanûna paşîn', 'sibat', 'adar', 'nîsan', 'gulan', 'hezîran', 'tîrmeh', 'tebax', 'îlon', 'çiriya pêşîn', 'çiriya paşîn', 'kanûna pêşîn'}
for idx, val in ipairs(months) do
mnths[idx] = val:sub(1,3)
end
-- makeOrdinal needs to be internationalised along with the above i18n
-- takes cardinal number as a numeric and returns the ordinal as a string
-- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc.
-------------------------------------------------------------------------------
p.makeOrdinal = function(cardinal)
local card = tonumber(cardinal)
if not card then return cardinal end
local ordsuffix = i18n.ordinal.default
if card % 10 == 1 then
ordsuffix = i18n.ordinal[1]
elseif card % 10 == 2 then
ordsuffix = i18n.ordinal[2]
elseif card % 10 == 3 then
ordsuffix = i18n.ordinal[3]
end
-- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th'
-- similarly for 12 and 13, etc.
if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then
ordsuffix = i18n.ordinal.default
end
return card .. ordsuffix
end
local unitsymbol = {
Q218593 = "in",
Q3710 = "ft",
Q482798 = "yd",
Q253276 = "mi",
Q93318 = "nmi",
Q11573 = "m",
Q174728 = "cm",
Q174789 = "mm",
Q828224 = "km",
Q81292 = "acres",
Q35852 = "ha"
}
-- prefixes for particular qualifiers
local prefix = {
P580 = "ji ",
P582 = "heta ",
}
-- external ids which have a formatter url (P1630)
local formaturl = {
P3563 = "https://wikidata-externalid-url.toolforge.org/?url=https%3A%2F%2Fmsi.nga.mil%2FqueryResults%3Fpublications%2Fngalol%2Flights-buoys%3Fvolume%3D%251%26featureNumber%3D%252%26includeRemovals%3Dfalse%26output%3Dhtml&exp=(%5Cd%7B3%7D)-(.*)&id=$1", -- NGA number
P613 = "http://nearby.org.uk/coord.cgi?p=$1", -- OS grid reference
P373 = "https://commons.wikimedia.org/wiki/Category:$1", -- Commons category
P11235 = "http://damnet.or.jp/cgi-bin/binranA/enAll.cgi?db4=$1", -- Dams in Japan
P11627 = "https://www.ibiblio.org/lighthouse/$1.htm", -- Lighthouse Directory
}
-- date format default to dmy
local df = "dmy"
-- fallbacks for common properties:
-- property-to-fallback-from = "property-to-fallback-to"
local fallback = {
P276 = "P131",
P571 = "P1619",
P729 = "P1619",
P4755 = "P296",
P18 = "P8592"
}
local statedIDs = {
Q36578 = {"GND", name=1},
Q547473 = {"MacTutor", name="id"},
Q19938912 = {"BNF", name=1},
Q6973052 = {"National Heritage List for England", name="num"},
Q19842847 = {"Historic Scotland listed building number", name=1}
}
-- error messages
local function errmsg(txt)
if debugging then
return "Error: " .. txt
else
return nil
end
end
-- formats the first character of linked item to uppercase
local function ucf(lnk)
local tbl = mw.text.split( lnk, "|", true )
local ret
if tbl[2] then -- piped link
tbl[2] = tbl[2]:gsub("^(%l)", mw.ustring.upper)
ret = table.concat(tbl, "|")
elseif lnk:sub(1,2) == "[[" then -- unpiped link
ret = lnk:gsub("^(%[%[%l)", mw.ustring.upper)
else -- unlinked
ret = lnk:gsub("^(%l)", mw.ustring.upper)
end
return ret
end
-- entrypoint for invoke
function p.ucf(frame)
return ucf(frame.args.text or "")
end
-- return a number rounded to a precision
local function decimalprecision(x, prec)
local s = 1
if x < 0 then
x = -x
s = -1
end
-- if prec is not suplied, pick an arbitrary precision
if not tonumber(prec) then prec = 1e-4
elseif prec > 1 then prec = 1
elseif prec < 1e-6 then prec = 1e-6
else prec = 10 ^ math.floor(math.log10(prec))
end
x = math.floor(x / prec + 0.5) * prec * s
-- if it's integral, cast to an integer:
if x == math.floor(x) then x = math.floor(x) end
-- if it's less than 1e-4, it will be in exponent form, so return a string with 6dp
-- 9e-5 becomes 0.000090
if math.abs(x) < 1e-4 then x = string.format("%f", x) end
return x
end
-- creates an icon that links to the relevant Wikidata entity
local function createicon(entityID, propertyID, langcode)
langcode = langcode or ""
if not entityID or entityID == "" then entityID= mw.wikibase.getEntityIdForCurrentPage() end
propertyID = propertyID or ""
local icon = " <span class='penicon autoconfirmed-show'>[["
-- " <span data-bridge-edit-flow='overwrite' class='penicon'>[[" -> enable Wikidata Bridge
.. i18n.filespace
.. ":OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt="
.. i18n.editonwikidata
.. "|link=https://www.wikidata.org/wiki/" .. entityID
if langcode ~= "" then icon = icon .. "?uselang=" .. langcode end
if propertyID ~= "" then icon = icon .. "#" .. propertyID end
icon = icon .. "|" .. i18n.editonwikidata .. "]]</span>"
return icon
end
-- takes a statement tuple supplied from Wikidata and returns any references
function p._getrefs(statement, qid)
if not statement.references then return nil end
local rtbl = {}
local frm = mw.getCurrentFrame()
for idx, ref in ipairs(statement.references) do
if ref.snaks.P854 then -- reference url
local url = ref.snaks.P854[1].datavalue.value
if ref.snaks.P1476 then -- title (monolingual text)
local title
for idx1, titles in ipairs(ref.snaks.P1476) do
if titles.datavalue.value.language == currentlang then
title = titles.datavalue.value.text
local website = ""
if ref.snaks.P248 then
local rqid = ref.snaks.P248[1].datavalue.value.id
local label = mw.wikibase.label(rqid,currentlang)
if label then
local sitelink = mw.wikibase.sitelink(rqid)
if sitelink then
website = "[[" .. sitelink .. "|" .. label .. "]]"
else
website = label
end
end
end
local citeweb = frm:expandTemplate{ title = "Cite web", args = { url=url, title=title, website=website} }
local hash = "WD" .. mw.hash.hashValue("crc32", citeweb)
rtbl[#rtbl+1] = frm:callParserFunction{ name = "#tag:ref", args = { citeweb, name=hash } }
break
end
end
else
local bnf = url:match("https?://data.bnf.fr/ark:/12148/cb([0-9][a-Za-Z0-9]+)") or url:match("https?://catalogue.bnf.fr/ark:/12148/cb([0-9][a-Za-Z0-9]+)")
if bnf then
rtbl[#rtbl+1] = frm:callParserFunction{ name = "#tag:ref", args = { frm:expandTemplate{title="BNF",args={bnf}}, name="bnf"..bnf} }
else
local hash = "WD" .. mw.hash.hashValue("crc32", url)
rtbl[#rtbl+1] = frm:callParserFunction{ name = "#tag:ref", args = { url, name=hash } }
end
end
elseif ref.snaks.P248 then
local rqid = ref.snaks.P248[1].datavalue.value.id
if statedIDs[rqid] then
local template = statedIDs[rqid]
local propid = mw.wikibase.getBestStatements(rqid,"P1687")
propid = propid[1].mainsnak.datavalue.value.id
for num, propdata in ipairs(mw.wikibase.getBestStatements(qid, propid)) do
local property = propdata.mainsnak.datavalue.value
local args = {[template.name] = property}
if rqid == "Q547473" then
args.title = mw.wikibase.label(qid)
end
local result = frm:expandTemplate{title=template[1],args=args}
rtbl[#rtbl+1] = frm:callParserFunction{ name = "#tag:ref", args = { result, name=qid .. propid .. num} }
end
else
local citeq = frm:expandTemplate{ title = "Cite Q", args = { rqid } }
rtbl[#rtbl+1] = frm:callParserFunction{ name = "#tag:ref", args = { citeq, name=rqid } }
end
end
if #rtbl>=maxrefs then break end -- maximum number of references reached
end
return table.concat(rtbl)
end
-- takes a qid and attempts to return a linked name for it
-- otherwise an unlinked name; otherwise the qid
function p._getLink(qid)
local lbl = ""
local slink = mw.wikibase.sitelink(qid)
local label = mw.wikibase.getLabel(qid)
if slink and label then
if slink:lower() == label:lower() then
if label:find("^%u") then -- match label's case
lbl = "[[" .. slink:gsub("^(%l)", mw.ustring.upper) .. "]]"
else
lbl = "[[" .. slink:gsub("^(%u)", mw.ustring.lower) .. "]]"
end
else
lbl = "[[" .. slink .. "|" .. label .. "]]"
end
elseif slink then
lbl = "[[" .. slink .. "]]"
elseif label then
lbl = label
else
lbl = qid
end
return lbl
end
-- entrypoint for #invoke getLink
function p.getLink(frame)
local qid = (frame.args.qid or ""):upper()
if qid == "" then return nil end
return p._getLink(qid)
end
-- takes a snak for a time property and returns the date
local function _getDate(snak, prec)
local retval
retval = mw.wikibase.renderSnak(snak)
if prec == 7 then -- century
local num, txt = retval:match("^(%d+)%.(.+)$")
if num and txt then
retval = p.makeOrdinal(num) .. txt
else
return retval -- return original date for debugging
end
elseif prec == 10 then
local m, y, e = retval:match("^(%a+) (%d+)(.*)")
if m and y then
retval = m:sub(1, 3) .. " " .. y .. (e or "")
else
return retval -- return original date for debugging
end
elseif prec == 11 then
local d, m, y, e = retval:match("^(%d+) (%a+) (%d+)(.*)")
if d and m and y then
retval = d .. " " .. m:sub(1, 3) .. " " .. y .. (e or "")
else
return retval -- return original date for debugging
end
end
return retval
end
-- takes a qid and a property id and returns the corresponding values or nil
-- maxvals greater than zero sets the maximum number of values to return
-- the string quals contains property ids of qualifiers to be returned ('-' is the separator)
function p._getWD(qid, pid, maxvals, quals, colunit)
maxvals = maxvals or 0
local ret = {}
local sortkey
for idx, prop in ipairs(mw.wikibase.getBestStatements(qid, pid)) do
local retval
if prop.mainsnak.snaktype ~= "value" then
break
end
local dtype = prop.mainsnak.datatype
local dval = prop.mainsnak.datavalue.value
if dtype == "wikibase-item" then
retval = p._getLink(dval.id)
elseif dtype == "monolingualtext" then
retval = dval.text
elseif dtype == "commonsMedia" or dtype == "url" then
retval = dval
elseif dtype == "external-id" or dtype == "string" then
if formaturl[pid] then
retval = "[" .. mw.ustring.gsub(formaturl[pid], "$1", dval) .. " " .. dval .. "]"
else
retval = dval
end
elseif dtype == "time" then
retval = _getDate(prop.mainsnak, dval.precision)
if dval.precision == 11 and df == "mdy" then
local d, m, y, e = retval:match("^(%d+) (%a+) (%d+)(.*)")
retval = m .. " " .. d .. ", " .. y .. e
end
if not sortkey then
sortkey = prop.mainsnak.datavalue.value.time
end
elseif dtype == "quantity" then
local amount = tonumber(dval.amount)
local unit = string.match( dval.unit, "(Q%d+)" )
if unit then
if unit == colunit then -- unit matches default for this column, so do not display unit
retval = amount
else
if unitsymbol[unit] then
if colunit then -- attempt to convert to default unit
retval = mw.getCurrentFrame():expandTemplate{ title = "cvt", args = {amount, unitsymbol[unit], unitsymbol[colunit], disp='number'} }
.. mw.getCurrentFrame():expandTemplate{title="efn", args = {'Value calculated by converting '..amount..unitsymbol[unit]..' into '..unitsymbol[colunit]..'.'}}
else -- show unit and default conversion
retval = mw.getCurrentFrame():expandTemplate{ title = "cvt", args = {amount, unitsymbol[unit]} }
end
else
retval = amount .. " " .. mw.wikibase.getLabel(unit)
end
end
else
retval = amount
end
elseif dtype == "globe-coordinate" then
local lat = decimalprecision(dval.latitude, dval.precision)
local long = decimalprecision(dval.longitude, dval.precision)
retval = "<span style='font-size:90%;'>"
.. mw.wikibase.formatValue(prop.mainsnak)
.. "</span>"
else
retval = dval
end
-- get references
retval = retval .. (p._getrefs(prop, qid) or "")
-- get qualifiers
if quals and prop.qualifiers and retval then
local qtbl = {}
for qpid in quals:gmatch("P%d+") do
if prop.qualifiers[qpid] then
for i, qv in ipairs(prop.qualifiers[qpid]) do
if qv.snaktype ~= "value" then break end
local fqv
if qv.datatype == "globe-coordinate" then
fqv = mw.wikibase.formatValue(qv) -- linked
elseif qv.datatype == "time" then
fqv = _getDate(qv, qv.datavalue.value.precision)
if qv.datavalue.value.precision == 11 then -- trim to month
fqv = fqv:match("%d+ (.+)")
end
else
fqv = mw.wikibase.renderSnak(qv) -- plaintext
end
if fqv and fqv ~= "" then
qtbl[#qtbl+1] = (prefix[qpid] or "") .. fqv
end
end
end
end
if #qtbl > 0 then
retval = retval .. "<span style='font-size:90%;'> (" .. table.concat(qtbl, " ") .. ")</span>"
end
end
ret[#ret+1] = retval
if maxvals > 0 and #ret >= maxvals then break end
end
if #ret < 1 then
return nil
else
return table.concat(ret, sep),sortkey
end
end
-- entrypoint for #invoke getWD
function p.getWD(frame)
local qid = (frame.args.qid or ""):upper()
if qid == "" then return nil end
local pid = (frame.args.pid or ""):upper()
if pid == "" then return nil end
local maxvals = tonumber(frame.args.maxvals) or 0
local quals = (frame.args.quals or ""):upper()
if quals == "" then quals = nil end
return p._getWD(qid, pid, maxvals, quals)
end
-- make multiple table rows, one for each qid in args.qids,
-- with one table cell for each pid in args.pids
function p._makerows(args)
args.qids = (args.qids or ""):upper()
if args.qids == "" then return errmsg("missing qids") end
args.pids = (args.pids or ""):upper()
if args.pids == "" then return errmsg("missing pids") end
local qids, pids = {}, {}
for qid in args.qids:gmatch("Q%d+") do
qids[#qids+1] = qid
end
for pid in args.pids:gmatch("P%d+") do
pids[#pids+1] = pid
end
args.df = args.df or ""
if args.df ~= "" then df = args.df end
local out = ""
for r, qid in ipairs(qids) do
out = out .. "<tr>"
out = out .. "<th scope='row'>" .. p._getLink(qid) .. "</th>"
for c, pid in ipairs(pids) do
if pid == "P18" then -- image
local img = p._getWD(qid, pid, 1)
if img then
out = out .. '<td style="text-align:center;">[[File:' .. img .. '|100px]]</td>'
end
else
local statement,sortkey = p._getWD(qid, pid, 0)
if not statement then
statement = " "
end
if sortkey then
sortkey = 'data-sort-value="' .. sortkey .. '"'
else
sortkey = ''
end
out = out .. '<td ' .. sortkey .. 'style="text-align:center;">' .. statement .. "</td>"
end
end
out = out .. "</tr>"
end
return out
end
-- entry point for #invoke makerows
function p.makerows(frame)
local args = {}
for key, value in pairs(frame:getParent().args) do
args[key] = value
end
for key, value in pairs(frame.args) do
args[key] = value
end
return p._makerows(args)
end
-- make a single table row, one cell per value passed in args.pids
-- each value may be a combination of properties and qualifiers
function p._makerow(args)
local qid = (args.qid or ""):upper():match("Q%d+")
-- qid can be nil if we want a row without wikidata
-- remove whitespace, uppercase, trap nil
args.pids = (args.pids or ""):upper():gsub("%s", "")
if args.pids == "" then return errmsg("missing pids") end
local summary = (args.summary or "")
local linecolor = (args.line or "")
local linestyle = ''
if linecolor ~= "" then
linestyle = 'style="border-top:solid #' .. linecolor .. ';"'
end
local rows
if summary == "" then rows=1 else rows=2 end
local cols = 0
-- collect any parameters c1, c2, etc. as cell replacements; c1+, c2+, etc. as addenda
local cellrep, celladd = {}, {}
for key, value in pairs(args) do
local colr = (type(key) == "string") and tonumber(key:match("^[Cc](%d+)$"))
if colr then
cellrep[colr] = value
end
local cola = (type(key) == "string") and tonumber(key:match("^[Cc](%d+)%+$"))
if cola then
celladd[cola] = value
end
end
if args.refname and args.refname ~= "" then
local c1 = celladd[1] or ""
celladd[1] = c1 .. mw.getCurrentFrame():extensionTag{name = 'ref', args = {name = args.refname}}
end
-- set date format if passed
args.df = args.df or ""
if args.df ~= "" then df = args.df end
-- create the html to return
local out = "<tr " .. linestyle .."><th scope='row' rowspan=" .. rows .. ">"
if cellrep[1] and qid then
out = out .. cellrep[1] .. createicon(qid) .. "</th>"
elseif not qid then
out = out .. (cellrep[1] or " ") .. "</th>"
else
out = out .. ucf(p._getLink(qid)) .. (celladd[1] or "") .. createicon(qid) .. "</th>"
end
-- split args.pids at comma separators into sequence of cellpids (each may be like P12+P34/P456-P789)
local cellpids = mw.text.split(args.pids, ",+")
for c, val in ipairs(cellpids) do
cols = cols+1
if cellrep[c+1] then
out = out .. '<td>' .. cellrep[c+1] .. '</td>'
elseif not qid then
out = out .. "<td></td>"
else
-- separate multiple properties in same cell, sep=+
local ptbl = {} -- sequence of values for one cell
local sortkeyf
for propandquals in mw.text.gsplit(val, "+", true) do
-- for each property, split off property from qualifiers, sep=/
local pid = mw.text.split(propandquals, "/")[1]
local unit = pid:match("%((Q%d+)%)") -- capture unit of quantity if specified
pid = pid:match("P%d+")
local quals = mw.text.split(propandquals, "/")[2]
if pid == "P18" then -- image
local img = p._getWD(qid, "P18", 1)
if not img and fallback["P18"] then
img = p._getWD(qid, fallback["P18"], 1)
end
if img then
ptbl[#ptbl+1] = "[[File:" .. img .. "|100px]]"
end
else
local wdval,sortkey = p._getWD(qid, pid, 0, quals, unit)
if not wdval and fallback[pid] then
wdval,sortkey = p._getWD(qid, fallback[pid], 0, quals, unit)
end
if not sortkeyf then
sortkeyf = sortkey
end
ptbl[#ptbl+1] = wdval and ucf(wdval)
end
end -- of loop through multiple properties in same cell
if sortkeyf then
sortkeyf = 'data-sort-value="' .. mw.ustring.sub(sortkeyf,2) .. '"'
else
sortkeyf = ''
end
out = out .. '<td ' .. sortkeyf .. 'style="text-align:center;">' .. table.concat(ptbl, sep2) .. (celladd[c+1] or "") .. '</td>'
end
end -- of loop through all of the cells in the row
out = out .. "</tr>"
if summary ~= "" then
out = out .. "<tr><td colspan=".. cols .. ">" .. summary .. "</td></tr>"
end
return out
end
-- entry point for #invoke makerow
function p.makerow(frame)
local args = {}
for key, value in pairs(frame:getParent().args) do
args[key] = value
end
for key, value in pairs(frame.args) do
args[key] = value
end
local isdoc
if args.doc and args.doc=="no" then
isdoc = false
else
isdoc = mw.title.getCurrentTitle():inNamespace(10)
end
if isdoc then
args.qid = args.example
return p.doc(args)
else
return p._makerow(args)
end
end
function p.convert(frame)
local args = frame.args
local pargs = frame:getParent().args
local input = args[1] or pargs[1]
local template = args.template or pargs.template
if input == nil then
return nil
end
local resolveEntity = require( "Module:ResolveEntityId" )
local articlelist = mw.text.split(input,"%*%s*")
local qidlist = {}
for i,article in ipairs(articlelist) do
local rawarticle=string.match(article,'%[%[(.+)%|') or string.match(article,'%[%[(.+)%]%]')
if rawarticle then
local qid = resolveEntity._id(rawarticle)
if qid then
qidlist[#qidlist+1] = "{{" .. template .. "|qid=" .. qid.."<!-- "..rawarticle.." -->}}"
else
qidlist[#qidlist+1] = "{{" .. template .. "|qid=|c1="..rawarticle.."}}"
end
end
end
return table.concat(qidlist,"\n")
end
function p.convert2(frame)
local args = frame.args
local pargs = frame:getParent().args
local input = args[1] or pargs[1]
local template = args.template or pargs.template
if input == nil then
return nil
end
local qidlist = mw.text.split(input,"%*%s*")
local out = ""
for i,qid in ipairs(qidlist) do
qid = mw.text.trim(qid)
out = out .. "{{" .. template .. "|qid=" .. qid
local label = mw.wikibase.getLabel(qid)
if label then
out = out .. "<!-- " .. label .. " -->"
end
out = out .. "}}\n"
end
return out
end
local function proplink(pid)
local out
if pid == "P1" then
out = "Custom input"
else
out = mw.getCurrentFrame():expandTemplate{ title = 'Wikidata entity link', args = {pid} }
end
return out
end
function p.doc(args)
local pids = args.pids
local article = args.article
local qid = args.qid
local documentation = require('Module:Belgekirin').main
pids = (pids or ""):upper():gsub("%s", "")
if pids == "" then return errmsg("Missing PIDs") end
local pidtable = {}
for c1,val in ipairs(mw.text.split(pids, ",")) do
pidtable[c1] = {}
for c2,propandquals in ipairs(mw.text.split(val, "+")) do
pidtable[c1][c2] = {}
pidtable[c1][c2].property = mw.text.split(propandquals, "/")[1]
pidtable[c1][c2].unit = pidtable[c1][c2].property:match("%((Q%d+)%)")
pidtable[c1][c2].property = pidtable[c1][c2].property:match("P%d+")
local quals = mw.text.split(propandquals, "/")[2]
if quals then
pidtable[c1][c2].quals = {}
for qpid in quals:gmatch("P%d+") do
pidtable[c1][c2].quals[1] = qpid
end
end
end
end
local function unit(qid)
if qid then
local unit = mw.wikibase.sitelink(qid)
if unit then
unit = "[[" .. unit .. "|" .. unitsymbol[qid] .. "]]"
else
unit = unitsymbol[qid]
end
return " (in " .. unit .. ")"
else
return ""
end
end
local out = "This template will retrieve certain data from [[Wikidata]] for use in a table in an article. It is a wrapper template for [[Module:Wikidata table]] function ''makerow'', using predefined properties.\n\n"
if article then
out = out .. "It was designed for use on [[" .. article .. "]] but may also be used on other articles. ([[Special:WhatLinksHere/" .. mw.title.getCurrentTitle().fullText .. "|Search]])\n"
end
out = out .. "<h3>Usage</h3>"
out = out .. "The data that is displayed in each column is as follows:"
out = out .. '<table class="wikitable"><tr>'
for c = 1,#pidtable+1 do
out = out .. "<th>Column " .. c .. "</th>"
end
out = out .. "</tr><tr><td>Label</td>"
for c1 = 1,#pidtable do
out = out .. "<td>"
for c2 = 1,#pidtable[c1] do
out = out .. proplink(pidtable[c1][c2].property) .. unit(pidtable[c1][c2].unit)
if pidtable[c1][c2].quals then
out = out .. " qualified by "
for c3 = 1,#pidtable[c1][c2].quals do
out = out .. proplink(pidtable[c1][c2].quals[c3])
end
end
out = out .. "<br>"
end
out = out .. "</td>"
end
out = out .. "</tr></table>"
if qid then
local langobj = mw.language.new("en")
out = out .. "<h3>Example</h3>The Wikidata QID for "
local sitelink = mw.wikibase.getSitelink(qid)
if sitelink then
out = out .. "[[" .. sitelink .. "]]"
else
out = out .. mw.wikibase.getLabel(qid)
end
out = out .. " is [[:d:Special:EntityPage/" .. qid .. "|" .. qid .. "]]. Typing the following:\n"
out = out .. "<code>{{" .. mw.title.getCurrentTitle().text .. "|qid=" .. qid .. "}}</code>\n produces"
out = out .. '<table class="wikitable"><tr><th>Name</th>'
for c = 1,#pidtable do
local proplabel
if pidtable[c][1].property == "P1" then
proplabel = "Column " .. c+1
else
proplabel = langobj:ucfirst(mw.wikibase.getLabel(pidtable[c][1].property)) .. unit(pidtable[c][1].unit)
end
out = out .. "<th>" .. proplabel .. "</th>"
end
out = out .. "</tr>" .. p._makerow(args) .. "</table>"
end
out = out .. "<h3>Notes</h3>\n"
out = out .. "* The table caption, column headings, etc. need to be added manually.\n"
out = out .. "* Please be careful about making changes to this template, as corresponding changes will need to be made to the column headings on "
if article then
out = out .. "[[" .. article .. "]] and any other "
else
out = out .. "any "
end
out = out .. "article using it. ([[Special:WhatLinksHere/" .. mw.title.getCurrentTitle().fullText .. "|Search]])\n"
out = out .. "<h3>Overriding columns</h3>"
out = out .. "It is possible to override or append to data values obtained from Wikidata in any column in the table.\n"
out = out .. "* To completely override column ''n'' with some custom content, use parameter <code>cn=</code>\n"
out = out .. "*: For example, to replace column 5 with the number 1957 use <code>c5=1957</code>\n"
out = out .. "* To append some custom content to the end of column ''n'' use parameter <code>cn+=</code>\n"
out = out .. "*: For example, to add a footnote to column 6 use <code>c6+={{efn|This value is approximate.}}</code>\n"
out = out .. "<h3>Add named reference</h3>"
out = out .. "If you [[Help:List-defined references|define references in a list]] then you can cite one of these by using the parameter <code>refname</code>. This will add a reference to column 1 directly after the label.\n"
out = out .. 'For example you can define a reference called Smith1 by using <pre>{{reflist|refs=\n<ref name="Smith1">reference</ref>\n}}</pre>\n'
out = out .. "Then use <code>refname=Smith1</code>"
if qid then
out = out .. "<h3>References</h3>" .. mw.getCurrentFrame():expandTemplate{title='Reflist'}
end
out = out .. "<h3>TemplateData</h3>"
local td = '{"params": {"qid": {"label": "QID", "description": "Enter the Wikidata QID, which is a number beginning with Q. You can also add the name of the item as an HTML comment.","example": "'
if qid then
td = td .. qid .. '<!-- ' .. mw.wikibase.getLabel(qid) .. ' -->'
else
td = td .. 'Q1234567'
end
td = td .. '","type": "string","suggested": true}'
td = td .. ',"refname": {"label": "Add named reference","description": "Add a named reference defined in a list","type": "string","example": "ref1"}'
td = td .. ',"c1": {"label": "Override label","description": "Override the label (column 1) with this value","type": "content"}'
td = td .. ',"c1+": {"label": "Append to label","description": "Append this content to the label (column 1)","type": "content"}'
for c = 1,#pidtable do
if pidtable[c][1].property == "P1" then
td = td .. ',"c' .. c+1 .. '": {"label": "Define column ' .. c+1 .. '","description": "Define column ' .. c+1 .. ' with this content","type": "content"}'
else
local label = mw.wikibase.getLabel(pidtable[c][1].property)
td = td .. ',"c' .. c+1 .. '": {"label": "Override ' .. label .. '","description": "Override the ' .. label .. ' (column ' .. c+1 .. ') with this content","type": "content"}'
td = td .. ',"c' .. c+1 .. '+": {"label": "Append to ' .. label .. '","description": "Append this content to the ' .. label .. ' (column ' .. c+1 .. ')","type": "content"}'
end
end
td = td .. '},"description": "This template reads some data from Wikidata while also allowing an editor to override or append their own content.","format": "inline"}'
return documentation{content = out .. mw.getCurrentFrame():extensionTag{ name = 'templatedata', content = td}}
end
return p