Modul:WikidataIB: Perbedaan antara revisi

Konten dihapus Konten ditambahkan
Farras (bicara | kontrib)
k translate
k ~ perbarui kode
Baris 1:
-- Version: 2020-11-08
-- Module to implement use of a blacklist and whitelist for infobox fields
-- Can take a named parameter |qid which is the Wikidata ID for the article
Baris 80 ⟶ 81:
}
}
-- This allows aan internationisation module to override the above table
if 'en' ~= mw.getContentLanguage():getCode() then
require("Module:i18n").loadI18n("Module:WikidataIB/i18n", i18n)
Baris 113 ⟶ 114:
-------------------------------------------------------------------------------
-- makeOrdinal needs to be internationalised along with the above:
-- takes cardinal numernumber as a numeric and returns the ordinal as a string
-- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc.
-------------------------------------------------------------------------------
Baris 328 ⟶ 329:
-- dateFormat is the handler for properties that are of type "time"
-- It takes timestamp, precision (6 to 11 per mediawiki), dateformat (y/dmy/mdy), BC format (BC/BCE),
-- a plaindate switch (yes/no/adj) to en/disable "sourcing cirumstancescircumstances"/use adjectival form,
-- any qualifiers for the property, the language, and any adjective to use like 'before'.
-- It passes the date through the "complex date" function
Baris 336 ⟶ 337:
-------------------------------------------------------------------------------
local dateFormat = function(timestamp, dprec, df, bcf, pd, qualifiers, lang, adj, model)
-- output formatting according to preferences (y/dmy/mdy/ymd)
df = (df or ""):lower()
-- if ymd is required, return the part of the timestamp in YYYY-MM-DD form
-- but apply Year zero#Astronomers fix: 1 BC = 0000; 2 BC = -0001; etc.
if df == "ymd" then
if timestamp:sub(1,1) == "+" then
return timestamp:sub(2,11)
else
local yr = tonumber(timestamp:sub(2,5)) - 1
yr = ("000" .. yr):sub(-4)
if yr ~= "0000" then yr = "-" .. yr end
return yr .. timestamp:sub(6,11)
end
end
-- A year can be stored like this: "+1872-00-00T00:00:00Z",
-- which is processed here as if it were the day before "+1872-01-01T00:00:00Z",
Baris 341 ⟶ 356:
-- So fix the month 0, day 0 timestamp to become 1 January instead:
timestamp = timestamp:gsub("%-00%-00T", "-01-01T")
-- output formatting according to preferences (y/dmy/mdy)
df = (df or ""):lower()
-- just in case date precision is missing
dprec = dprec or 11
Baris 383 ⟶ 396:
-- no point in saying that dates before 1582 are Julian - they are by default
-- doesn't make sense for dates less precise than year
-- we can supresssuppress it by setting |plaindate, e.g. for use in constructing categories.
local calendarmodel = ""
if tonumber(year) > 1582
Baris 428 ⟶ 441:
-- it makes the empty string and nil into the (boolean) value passed as default
-- allowing the parameter to be true or false by default.
-- It returns a boolean.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local parseParam = function(param, default)
if type(param) == "boolean" then param = tostring(param) end
if param and param ~= "" then
param = param:lower()
Baris 461 ⟶ 476:
local sitelink
if wiki == "" then
sitelink = mw.wikibase.sitelinkgetSitelink(qid)
else
sitelink = mw.wikibase.sitelinkgetSitelink(qid, wiki)
end
return sitelink
Baris 529 ⟶ 544:
label = mw.wikibase.getLabelByLang(id, lang)
else
label = mw.wikibase.labelgetLabel(id)
end
if label then
Baris 550 ⟶ 565:
-- shortname is boolean switch to use P1813 (short name) instead of label if true.
-- lang is the current language code.
-- uselbl is boolean switch to display the label
-------------------------------------------------------------------------------
-- Dependencies: labelOrId(); donotlink[]
-------------------------------------------------------------------------------
local linkedItem = function(id, lprefix, lpostfix, prefix, postfix, dtxt, shortname, lang, uselbl)
lprefix = lprefix or "" -- toughen against nil values passed
lpostfix = lpostfix or ""
Baris 568 ⟶ 584:
end
local disp
local sitelink = mw.wikibase.sitelinkgetSitelink(id)
local label, islabel
if dtxt then
Baris 591 ⟶ 607:
if sitelink then
if not (dtxt or shortname) then
-- if sitelink and label are the same except for case, no need to process further
-- strip any namespace or dab from the sitelink
localif possitelink:lower() ~= sitelinklabel:findlower(":") or 0then
-- strip any namespace or dab from the sitelink
local slink = sitelink:sub(pos+1):gsub("%s%(.+%)$", ""):gsub(",.+$", "")
local pos = sitelink:find(":") or 0
-- use that as label, preserving label case - find("^%u") is true for 1st char uppercase
local slink = sitelink
if label:find("^%u") then
if pos > 0 then
label = slink:gsub("^(%l)", string.upper)
local prefix = sitelink:sub(1,pos-1)
else
if mw.site.namespaces[prefix] then -- that prefix is a valid namespace, so remove it
label = slink:gsub("^(%u)", string.lower)
slink = sitelink:sub(pos+1)
end
end
-- remove stuff after commas or inside parentheses - ie. dabs
slink = slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")
-- if uselbl is false, use sitelink instead of label
if not uselbl then
-- use slink as display, preserving label case - find("^%u") is true for 1st char uppercase
if label:find("^%u") then
label = slink:gsub("^(%l)", string.upper)
else
label = slink:gsub("^(%u)", string.lower)
end
end
end
end
Baris 608 ⟶ 638:
elseif islabel then
-- no sitelink, label exists, so check if a redirect with that title exists
local artitle = mw.title.new(label, 0) -- only nil if label has invalid chars
if artitlenot donotlink[label] and artitle.redirectTarget and not donotlink[label]artitle.redirectTarget then
-- there's a redirect with the same title as the label, so let's link to that
disp = "[[".. lprefix .. label .. lpostfix .. "|" .. prefix .. fmt .. label .. fmt .. postfix .. "]]"
else
-- either (donotlink is true) or (no sitelink, label exists, not redirect (or donotlink) so output plain label
-- so output unlinked label with italics or quotes as needed
disp = prefix .. fmt .. label .. fmt .. postfix
end -- test if article title exists as redirect on current Wiki
Baris 619 ⟶ 650:
-- no sitelink and no label, so return whatever was returned from labelOrId for now
-- add tracking category [[Category:Articles with missing Wikidata information]]
-- for enwiki, just return the tracking category
disp = prefix .. label .. postfix .. i18n.missinginfocat
if mw.wikibase.getGlobalSiteId() == "enwiki" then
disp = i18n.missinginfocat
else
disp = prefix .. label .. postfix .. i18n.missinginfocat
end
end
else
Baris 640 ⟶ 676:
-------------------------------------------------------------------------------
-- sourced takes a table representing a statement that may or may not have references
-- it countslooks howfor manya references arereference sourced to something not containing the word "wikipedia"
-- it returns a boolean = true if thereit arefinds anya sourced referencesreference.
-------------------------------------------------------------------------------
-- Dependencies: none
Baris 649 ⟶ 685:
for kr, vr in pairs(claim.references) do
local ref = mw.wikibase.renderSnaks(vr.snaks)
if not ref:find("WikipediaWiki") then
return true
end
Baris 701 ⟶ 737:
input_parm = mw.text.trim(input_parm or "")
if input_parm == "" then input_parm = nil end
 
-- return nil if Wikidata is not available
if not mw.wikibase then return false, input_parm end
 
local args = frame.args
Baris 712 ⟶ 751:
 
-- The blacklist is passed in named parameter |suppressfields
local blacklist = args.suppressfields or args.spf or ""
 
-- The whitelist is passed in named parameter |fetchwikidata
local whitelist = args.fetchwikidata or args.fwd or ""
if not whitelist or whitelist == "" then whitelist = "NONE" end
 
-- The name of the field that this function is called from is passed in named parameter |name
local fieldname = args.name or ""
 
if blacklist ~= "" then
-- The name is compulsory when blacklist is used, so return nil if it is not supplied
if not fieldname or fieldname == "" then return false, nil end
-- If this field is on the blacklist, then return nil
if blacklist:find(fieldname) then return false, nil end
Baris 762 ⟶ 801:
-------------------------------------------------------------------------------
-- createicon assembles the "Edit at Wikidata" pen icon.
-- It returns a wikitext string. inside a span class="penicon"
-------------------------------------------------------------------------------
-- Dependencies: i18n[];
-------------------------------------------------------------------------------
local createicon = function(langcode, entityID, propertyID)
local icon = "&nbsp;<span class='penicon'>[[" .. i18n["filespace"]
-- "&nbsp;<span data-bridge-edit-flow='overwrite' class='penicon'>[[" -> enable Wikidata Bridge
icon = icon .. ":OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt="
icon = icon .. i18n["editonwikidatafilespace"]
.. ":OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt="
icon = icon .. "|link=https://www.wikidata.org/wiki/" .. entityID
.. i18n["editonwikidata"]
icon = icon .. "?uselang=" .. langcode
.. "|link=https://www.wikidata.org/wiki/" .. entityID
.. "?uselang=" .. langcode
if propertyID then icon = icon .. "#" .. propertyID end
icon = icon .. "|" .. i18n["editonwikidata"] .. "]]</span>"
return icon
end
Baris 818 ⟶ 859:
-- Zero or not a number result in no collapsing (default becomes 0).
local collapse = tonumber(args.collapse) or 0
 
-- replacetext (rt) is a string that is returned instead of any non-empty Wikidata value
-- this is useful for tracking and debugging
local replacetext = mw.text.trim(args.rt or args.replacetext or "")
 
-- if there's anything to return, then return a list
Baris 825 ⟶ 870:
if #out > 0 then
if sorted then table.sort(out) end
-- if there's something to display and a pen icon is wanted, add it the end of the last value
local hasdisplay = false
if not noic then
for i, v in ipairs(out) do
if v ~= i18n.missinginfocat then
hasdisplay = true
break
end
end
if not noic and hasdisplay then
out[#out] = out[#out] .. createicon(args.langobj.code, entityID, propertyID)
end
Baris 842 ⟶ 894:
strout = nil -- no items had valid reference
end
if replacetext ~= "" and strout then strout = replacetext end
return strout
end
Baris 874 ⟶ 927:
local shortname = args.shortname or args.sn
shortname = parseParam(shortname, false)
local uselbl = args.uselabel or args.uselbl
uselbl = parseParam(uselbl, false)
local snak = propval.mainsnak or propval
local dtype = snak.datatype
Baris 893 ⟶ 948:
local qnumber = dv.id
if linked then
val = linkedItem(qnumber, lpre, lpost, pre, post, dtxt, shortname, args.lang, uselbl)
else -- no link wanted so check for display-text, otherwise test for lang code
local label, islabel
Baris 1.033 ⟶ 1.088:
if uabbr then
-- see if there's a unit symbol (P5061)
local unitsymbols = mw.wikibase.getAllStatementsgetBestStatements(unitqid, "P5061")
-- construct fallback table, add local lang and multiple languages
local fbtbl = mw.language.getFallbacksFor( args.lang )
table.insert( fbtbl, 1, args.lang )
table.insert( fbtbl, 1, "mul" )
local found = false
for idx1, us in ipairs(unitsymbols) do
Baris 1.204 ⟶ 1.260:
 
local lang = args.lang or findlang().code
 
-- qualID is a string list of wanted qualifiers or "ALL"
qualID = qualID or ""
-- capitalise list of wanted qualifiers and substitute "DATES"
qualID = qualID:upper():gsub("DATES", "P580, P582")
local allflag = (qualID == "ALL")
-- create table of wanted qualifiers as key
local qwanted = {}
-- create sequence of wanted qualifiers
local qorder = {}
for q in mw.text.gsplit(qualID, "%p") do -- split at punctuation and iterate
local qtrim = mw.text.trim(q)
if qtrim ~= "" then
qwanted[mw.text.trim(q)] = true
qorder[#qorder+1] = qtrim
end
end
-- qsep is the output separator for rendering qualifier list
local qsep = (args.qsep or ""):gsub('"', '')
-- qargs are the arguments to supply to assembleoutput()
local qargs = {
["osd"] = "false",
["linked"] = tostring(linked),
["prefix"] = args.qprefix,
["postfix"] = args.qpostfix,
["linkprefix"] = args.qlinkprefix or args.qlp,
["linkpostfix"] = args.qlinkpostfix,
["wdl"] = "false",
["unitabbr"] = tostring(uabbr),
["maxvals"] = 0,
["sorted"] = tostring(args.qsorted),
["noicon"] = "true",
["list"] = args.qlist,
["sep"] = qsep,
["langobj"] = args.langobj,
["lang"] = args.langobj.code,
["df"] = args.qdf,
["sn"] = parseParam(args.qsn or args.qshortname, false),
}
 
-- all proper values of a Wikidata property will be the same type as the first
-- qualifiers don't have a mainsnak, properties do
 
local datatype = objproperty[1].datatype or objproperty[1].mainsnak.datatype
 
-- out[] holds the values for this property
-- out[] holds the a list of returned values for this property
-- mlt[] holds the language code if the datatype is monolingual text
local out = {}
local mlt = {}
 
for k, v in ipairs(objproperty) do
local hasvalue = true
Baris 1.230 ⟶ 1.327:
-- See if qualifiers are to be returned:
local snak = v.mainsnak or v
if hasvalue and v.qualifiers and qualID ~= "" and snak.snaktype~="novalue" then
-- collect all wanted qualifier values returned in qlist, indexed by propertyID
local qsep = (args.qsep or ""):gsub('"', '')
local qargs = {
["osd"] = "false",
["linked"] = tostring(linked),
["prefix"] = args.qprefix,
["postfix"] = args.qpostfix,
["linkprefix"] = args.qlinkprefix or args.qlp,
["linkpostfix"] = args.qlinkpostfix,
["wdl"] = "false",
["unitabbr"] = tostring(uabbr),
["maxvals"] = 0,
["sorted"] = tostring(args.qsorted),
["noicon"] = "true",
["list"] = args.qlist,
["sep"] = qsep,
["langobj"] = args.langobj,
["lang"] = args.langobj.code,
["df"] = args.qdf
}
local qlist = {}
local t1timestart, t2timeend = "", ""
-- see if we want all -- loop through qualifiers
for k1, v1 in pairs(v.qualifiers) do
if qualID == "ALL" then
if allflag or qwanted[k1] then
if v["qualifiers-order"] then
if k1 == "P1326" then
-- the values in the order table are the keys for the qualifiers table:
local ts = v1[1].datavalue.value.time
for k1, v1 in ipairs(v["qualifiers-order"]) do
local dp = v1[1].datavalue.value.precision
if v1 == "P1326" then
qlist[k1] = dateFormat(ts, dp, args.qdf, args.bc, pd, "", lang, "before")
local ts = v.qualifiers[v1][1].datavalue.value.time
elseif k1 == "P1319" then
local dp = v.qualifiers[v1][1].datavalue.value.precision
local ts = v1[1].datavalue.value.time
qlist[#qlist + 1] = dateFormat(ts, dp, args.qdf, args.bc, pd, "", lang, "before")
local dp = v1[1].datavalue.value.precision
elseif v1 == "P1319" then
qlist[k1] = dateFormat(ts, dp, args.qdf, args.bc, pd, "", lang, "after")
local ts = v.qualifiers[v1][1].datavalue.value.time
elseif k1 == "P580" then
local dp = v.qualifiers[v1][1].datavalue.value.precision
timestart = propertyvalueandquals(v1, qargs)[1] or "" -- treat only one start time as valid
qlist[#qlist + 1] = dateFormat(ts, dp, args.qdf, args.bc, pd, "", lang, "after")
elseif k1 == "P582" then
else
local q timeend = assembleoutput(propertyvalueandquals(v.qualifiers[v1], qargs),[1] qargs)or "" -- treat only one end time as valid
else
-- we already deal with circa via 'sourcing circumstances'
local q = assembleoutput(propertyvalueandquals(v1, qargs), qargs)
-- either linked or unlinked *** internationalise later ***
-- we already deal with circa via 'sourcing circumstances' if the datatype was time
if q ~= "circa" and not (type(q) == "string" and q:find("circa]]")) then
-- circa may be either linked or unlinked *** internationalise later ***
qlist[#qlist + 1] = q
if datatype ~= "time" or q ~= "circa" and not (type(q) == "string" and q:find("circa]]")) then
end
qlist[k1] = q
end
end
end
end
else
end -- of test for wanted
-- are there cases where qualifiers-order doesn't exist?
end -- of loop through qualifiers
local ql = propertyvalueandquals(v.qualifiers, qargs)
-- set date separator
for k1, v1 in ipairs(ql) do
local t = timestart .. timeend
-- we already deal with circa via 'sourcing circumstances'
-- either linked or unlinked *** internationalise later ***
if v1 ~= "circa" and not (type(v1) == "string" and v1:find("circa]]")) then
qlist[#qlist + 1] = v1
end
end
end
-- see if we want date/range
elseif qualID == "DATES" then
qargs.maxvals = 1
for k1, v1 in pairs(v.qualifiers) do
if k1 == "P580" then -- P580 is "start time"
t1 = propertyvalueandquals(v1, qargs)[1] or ""
elseif k1 == "P582" then -- P582 is "end time"
t2 = propertyvalueandquals(v1, qargs)[1] or ""
end
end
-- otherwise process qualID as a list of qualifiers
else
for q in mw.text.gsplit(qualID, "%p") do -- split at punctuation and iterate
q = mw.text.trim(q):upper() -- remove whitespace and capitalise
if q == "P1326" then
-- latest date, so supply 'before' as well. Assume one date value.
for k1, v1 in pairs(v.qualifiers) do
if k1 == "P1326" then
local ts = v1[1].datavalue.value.time
local dp = v1[1].datavalue.value.precision
qlist[#qlist + 1] = dateFormat(ts, dp, args.qdf, args.bc, pd, "", lang, "before")
end
end
else
for k1, v1 in pairs(v.qualifiers) do
if k1 == q then
local ql = propertyvalueandquals(v1, qargs)
for k2, v2 in ipairs(ql) do
qlist[#qlist + 1] = v2
end
end
end
end
end -- of loop through list of qualifiers in qualID
end -- of testing for what qualID is
local t = t1 .. t2
-- *** internationalise date separators later ***
local dsep = "&ndash;"
if t:find("%s") or t:find("&nbsp;") then dsep = " &ndash; " end
-- set the order for the list of qualifiers returned; start time and end time go last
if #qlist > 0 then
localif qstr = assembleoutputnext(qlist,) qargs)then
local qlistout = {}
if allflag then
for k2, v2 in pairs(qlist) do
qlistout[#qlistout+1] = v2
end
else
for i2, v2 in ipairs(qorder) do
qlistout[#qlistout+1] = qlist[v2]
end
end
if t ~= "" then
qlistout[#qlistout+1] = timestart .. dsep .. timeend
end
local qstr = assembleoutput(qlistout, qargs)
if qualsonly then
out[#out+1] = qstr
Baris 1.331 ⟶ 1.382:
out[#out] = out[#out] .. " (" .. qstr .. ")"
end
elseif t >~= "" then
if qualsonly then
out[#out+1] = t1timestart .. dsep .. t2timeend
else
out[#out] = out[#out] .. " (" .. t1timestart .. dsep .. t2timeend .. ")"
end
end
Baris 1.513 ⟶ 1.564:
end
 
-- check if it's an instance of (P31) a country (Q6256) or sovereign state (Q3624078)
-- and terminate the chain if it is
local inst = mw.wikibase.getAllStatements(qid, "P31")
if #inst > 0 then
Baris 1.519 ⟶ 1.571:
local instid = v.mainsnak.datavalue.value.id
-- stop if it's a country (or a country within the United Kingdom if skip is true)
if instid == "Q6256" or instid == "Q3624078" or (skip and instid == "Q3336843") then
prop = nil -- this will ensure this is treated as top-level location
break
Baris 1.571 ⟶ 1.623:
until finished or count >= 10 -- limit to 10 levels to avoid infinite loops
 
-- remove the first location if not quiredrequired
if not first then table.remove(out, 1) end
 
Baris 1.687 ⟶ 1.739:
 
args.reqranks = setRanks(args.rank)
 
-- replacetext (rt) is a string that is returned instead of any non-empty Wikidata value
-- this is useful for tracking and debugging, so we set fetchwikidata=ALL to fill the whitelist
local replacetext = mw.text.trim(args.rt or args.replacetext or "")
if replacetext ~= "" then
args.fetchwikidata = "ALL"
end
 
local f = {}
Baris 2.033 ⟶ 2.092:
return props -- no property or local parameter supplied
end -- of test for success
end
 
 
-------------------------------------------------------------------------------
-- getPropertyIDs takes most of the usual parameters.
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented.
-- It returns the Entity-IDs (Qids) of the values of a property if it is a Wikibase-Entity.
-- Otherwise it returns nothing.
-------------------------------------------------------------------------------
-- Dependencies: parseParam; setRanks; parseInput; sourced; propertyvalueandquals assembleoutput;
-------------------------------------------------------------------------------
p.getPropertyIDs = function(frame)
local args = frame.args
args.reqranks = setRanks(args.rank)
args.langobj = findLang(args.lang)
args.lang = args.langobj.code
-- change default for noicon to true
args.noicon = tostring(parseParam(args.noicon or "", true))
local f = {}
f.args = args
local pid = mw.text.trim(args[1] or ""):upper()
 
-- get the qid and table of claims for the property, or nothing and the local value passed
local qid, props = parseInput(f, args[2], pid)
if not qid then return props end
if not props[1] then return nil end
local onlysrc = parseParam(args.onlysourced or args.osd, true)
local maxvals = tonumber(args.maxvals) or 0
 
out = {}
for i, v in ipairs(props) do
local snak = v.mainsnak
if ( snak.datatype == "wikibase-item" )
and ( v.rank and args.reqranks[v.rank:sub(1, 1)] )
and ( snak.snaktype == "value" )
and ( sourced(v) or not onlysrc )
then
out[#out+1] = snak.datavalue.value.id
end
if maxvals > 0 and #out >= maxvals then break end
end
 
return assembleoutput(out, args, qid, pid)
end
 
 
-------------------------------------------------------------------------------
-- getQualifierIDs takes most of the usual parameters.
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented.
-- It takes a property-id as the first unnamed parameter, and an optional parameter qlist
-- which is a list of qualifier property-ids to search for (default is "ALL")
-- It returns the Entity-IDs (Qids) of the values of a property if it is a Wikibase-Entity.
-- Otherwise it returns nothing.
-------------------------------------------------------------------------------
-- Dependencies: parseParam; setRanks; parseInput; sourced; propertyvalueandquals assembleoutput;
-------------------------------------------------------------------------------
p.getQualifierIDs = function(frame)
local args = frame.args
args.reqranks = setRanks(args.rank)
args.langobj = findLang(args.lang)
args.lang = args.langobj.code
-- change default for noicon to true
args.noicon = tostring(parseParam(args.noicon or "", true))
local f = {}
f.args = args
local pid = mw.text.trim(args[1] or ""):upper()
 
-- get the qid and table of claims for the property, or nothing and the local value passed
local qid, props = parseInput(f, args[2], pid)
if not qid then return props end
if not props[1] then return nil end
-- get the other parameters
local onlysrc = parseParam(args.onlysourced or args.osd, true)
local maxvals = tonumber(args.maxvals) or 0
local qlist = args.qlist or ""
if qlist == "" then qlist = "ALL" end
qlist = qlist:gsub("[%p%s]+", " ") .. " "
 
out = {}
for i, v in ipairs(props) do
local snak = v.mainsnak
if ( v.rank and args.reqranks[v.rank:sub(1, 1)] )
and ( snak.snaktype == "value" )
and ( sourced(v) or not onlysrc )
then
if v.qualifiers then
for k1, v1 in pairs(v.qualifiers) do
if qlist == "ALL " or qlist:match(k1 .. " ") then
for i2, v2 in ipairs(v1) do
if v2.datatype == "wikibase-item" and v2.snaktype == "value" then
out[#out+1] = v2.datavalue.value.id
end -- of test that id exists
end -- of loop through qualifier values
end -- of test for kq in qlist
end -- of loop through qualifiers
end -- of test for qualifiers
end -- of test for rank value, sourced, and value exists
if maxvals > 0 and #out >= maxvals then break end
end -- of loop through property values
 
return assembleoutput(out, args, qid, pid)
end
 
Baris 2.044 ⟶ 2.204:
-- Dependencies: parseParam; setRanks; parseInput; sourced; propertyvalueandquals assembleoutput;
-------------------------------------------------------------------------------
p.getPropOfProp_getPropOfProp = function(frameargs)
-- parameter sets for commonly used groups of parameters
frame.args.reqranks = setRanks(frame.args.rank)
local paraset = tonumber(args.ps or args.parameterset or 0)
frame.args.langobj = findLang(frame.args.lang)
if paraset == 1 then
frame.args.lang = frame.args.langobj.code
-- a common setting
local args = frame.args
args.rank = "best"
args.fetchwikidata = "ALL"
args.onlysourced = "no"
args.noicon = "true"
elseif paraset == 2 then
-- equivalent to raw
args.rank = "best"
args.fetchwikidata = "ALL"
args.onlysourced = "no"
args.noicon = "true"
args.linked = "no"
args.pd = "true"
elseif paraset == 3 then
-- third set goes here
end
 
args.reqranks = setRanks(args.rank)
args.langobj = findLang(args.lang)
args.lang = args.langobj.code
local pid1 = args.prop1 or args.pid1 or ""
local pid2 = args.prop2 or args.pid2 or ""
local localval = mw.text.trim(args[1] or "")
if pid1 == "" or pid2 == "" then return nil end
 
local qid1, statements1 = parseInput(frame, localval, pid1)
local f = {}
f.args = args
local qid1, statements1 = parseInput(f, localval, pid1)
if not qid1 then return localval end
 
local onlysrc = parseParam(args.onlysourced or args.osd, true)
local maxvals = tonumber(args.maxvals) or 0
Baris 2.080 ⟶ 2.263:
end -- of loop through values of property1
return assembleoutput(out, args, qid1, pid1)
end
 
p.getPropOfProp = function(frame)
local args= frame.args
if not args.prop1 and not args.pid1 then
args = frame:getParent().args
if not args.prop1 and not args.pid1 then return i18n.errors["No property supplied"] end
end
 
return p._getPropOfProp(args)
end
 
Baris 2.115 ⟶ 2.308:
local p734 = mw.wikibase.getBestStatements(qid1, "P734")[1]
local p734id = p734 and p734.mainsnak.snaktype == "value" and p734.mainsnak.datavalue.value.id or ""
famname = mw.wikibase.sitelinkgetSitelink(p734id) or ""
-- strip namespace and disambigation
local pos = famname:find(":") or 0
famname = famname:sub(pos+1):gsub("%s%(.+%)$", "")
if famname == "" then
local lbl = mw.wikibase.labelgetLabel(p734id)
famname = lbl and mw.text.nowiki(lbl) or ""
end
Baris 2.142 ⟶ 2.335:
if statements2[1] and statements2[1].mainsnak.snaktype == "value" then
local qid3 = statements2[1].mainsnak.datavalue.value.id
local sitelink = mw.wikibase.sitelinkgetSitelink(qid3)
-- if there's no local sitelink, create the sitelink from English label
if not sitelink then
Baris 2.214 ⟶ 2.407:
local p734 = mw.wikibase.getBestStatements(qid, "P734")[1]
local p734id = p734 and p734.mainsnak.snaktype == "value" and p734.mainsnak.datavalue.value.id or ""
famname = mw.wikibase.sitelinkgetSitelink(p734id) or ""
-- strip namespace and disambigation
local pos = famname:find(":") or 0
famname = famname:sub(pos+1):gsub("%s%(.+%)$", "")
if famname == "" then
local lbl = mw.wikibase.labelgetLabel(p734id)
famname = lbl and mw.text.nowiki(lbl) or ""
end
Baris 2.234 ⟶ 2.427:
local tmcID = p910.mainsnak.datavalue.value.id
-- use sitelink or the English label for the cat
local cat = mw.wikibase.sitelinkgetSitelink(tmcID)
if not cat then
local lbl = mw.wikibase.getLabelByLang(tmcID, "en")
Baris 2.337 ⟶ 2.530:
qtype = vqualifiers[v1][1].datatype
if qtype == "time" then
qvif = mw.wikibase.renderSnak(vqualifiers[v1][1]).snaktype == "value" then
qv = mw.wikibase.renderSnak(vqualifiers[v1][1])
qv = frame:expandTemplate{title="dts", args={qv}}
qv = frame:expandTemplate{title="dts", args={qv}}
else
qv = "?"
end
elseif qtype == "url" then
qvif = mw.wikibase.renderSnak(vqualifiers[v1][1]).snaktype == "value" then
qv = mw.wikibase.renderSnak(vqualifiers[v1][1])
local display = qv:match("([%w_]+)$"):gsub("_", " ")
local display = mw.ustring.match( mw.uri.decode(qv, "WIKI"), "([%w ]+)$" )
if display then
if display then
qv = "[" .. qv .. " " .. display .. "]"
end
end
else
Baris 2.426 ⟶ 2.625:
local itemID = mw.text.trim(frame.args[1] or frame.args.qid or "")
if itemID == "" then return end
local sitelink = mw.wikibase.sitelinkgetSitelink(itemID)
local label = labelOrId(itemID)
if sitelink then
Baris 2.450 ⟶ 2.649:
local label = labelOrId(itemID, lang)
return label
end
 
 
-------------------------------------------------------------------------------
-- label has the qid of a Wikidata entity passed as the first unnamed parameter or as |qid=
-- if no qid is supplied, it uses the qid associated with the current page.
-- It returns the Wikidata label for the local language as plain text.
-- If there is no label in the local language, it returns nil.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.label = function(frame)
local qid = mw.text.trim(frame.args[1] or frame.args.qid or "")
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return end
local lang = frame.args.lang or ""
if lang == "" then lang = nil end
local label, success = labelOrId(qid, lang)
if success then return label end
end
 
Baris 2.457 ⟶ 2.675:
-- has the qid of a Wikidata entity passed as the first unnamed parameter or as |qid=
-- If there is a sitelink to an article on the local Wiki, it returns the sitelink as plain text.
-- If there is no sitelink or qid supplied, it returns nothing.
-------------------------------------------------------------------------------
-- Dependencies: none
Baris 2.464 ⟶ 2.682:
local itemID = mw.text.trim(frame.args[1] or frame.args.qid or "")
if itemID == "" then return end
return mw.wikibase.sitelinkgetSitelink(itemID)
end
 
Baris 2.483 ⟶ 2.701:
if itemID == "" then itemID = nil end
if desc:lower() == 'wikidata' then
return mw.wikibase.descriptiongetDescription(itemID)
elseif desc:lower() == 'none' then
return nil
Baris 2.654 ⟶ 2.872:
-------------------------------------------------------------------------------
p.labelorid = function(frame)
return (labelOrId( frame.args.qid or frame.args[1] ))
end
 
Baris 2.740 ⟶ 2.958:
-- Dependencies: parseParam()
-------------------------------------------------------------------------------
p.followQid_followQid = function(frameargs)
local qid = (frame.args.qid or ""):upper()
local all = parseParam(frame.args.all, false)
if qid == "" then
qid = mw.wikibase.getEntityIdForCurrentPage()
Baris 2.748 ⟶ 2.966:
if not qid then return nil end
local out = {}
local props = (frame.args.props or ""):upper()
if props ~= "" then
for p in mw.text.gsplit(props, "%p") do -- split at punctuation and iterate
Baris 2.769 ⟶ 2.987:
return qid
end
end
 
p.followQid = function(frame)
return p._followQid(frame.args)
end
 
 
-------------------------------------------------------------------------------
-- globalSiteID returns the globalSiteID for the current wiki
-- e.g. returns "enwiki" for the English Wikipedia, "enwikisource" for English Wikisource, etc.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.globalSiteID = function(frame)
return mw.wikibase.getGlobalSiteId()
end
 
Baris 2.861 ⟶ 3.094:
if pid == "" then pid = par[1] end
if qid == "" then qid = par[2] end
local q1 = qid:sub(1,1)
if pid:sub(1,1) ~= "P" then return "No property supplied" end
if qid:sub(1,1)q1 ~= "Q" and q1 ~= "M" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return "No item for this page" end
return "<pre>" .. mw.dumpObject( mw.wikibase.getAllStatements( qid, pid ) ) .. "</pre>"
Baris 2.872 ⟶ 3.106:
-- from the item given by the parameter 'qid'
-- or from the Wikidata item associated with the current page if qid is not supplied.
-- It only checks ranks that are requested (preferred and normal by default)
-- If property is not supplied, then P31 (instance of) is assumed.
-- It returns val if found or nothing if not found.
Baris 2.895 ⟶ 3.130:
if qid:sub(1,1) ~= "Q" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return nil end
ranks = setRanks(args.rank)
local stats = mw.wikibase.getAllStatements( qid, pid )
local stats = {}
if ranks.b then
stats = mw.wikibase.getBestStatements(qid, pid)
else
stats = mw.wikibase.getAllStatements( qid, pid )
end
if not stats[1] then return nil end
if stats[1].mainsnak.datatype == "wikibase-item" then
for k, v in pairs( stats ) do
ms = v.mainsnak
if v.mainsnak.snaktype == "value" and v.mainsnak.datavalue.value.id == val then
if ranks[v.rank:sub(1,1)] and ms.snaktype == "value" and ms.datavalue.value.id == val then
return val
end
Baris 2.914 ⟶ 3.156:
-- but it keeps the "edit at Wikidata" pen icon out of the microformat.
-- Usually it will take its url parameter directly from a Wikidata call:
-- e.g. {{#invoke:WikidataIB |url2 |url={{wdib |P856 |qid=Q23317 |fwd=ALL |osd=no}} }}
-------------------------------------------------------------------------------
-- Dependencies: none
Baris 2.927 ⟶ 3.169:
prot = prot or url
addr = addr or ""
-- strip trailing / from end of domain-only url and add <wbr/> before . and /
local disp, n = addr:gsub("%.", "<wbr/>%.")
local disp, n = addr:gsub( "^([^/]+)/$", "%1" ):gsub("%/", "<wbr/>/"):gsub("%.", "<wbr/>.")
return '<span class="url">[' .. prot .. addr .. " " .. disp .. "]</span>&nbsp;" .. icon
end
Baris 3.141 ⟶ 3.384:
end
end
end
 
 
-------------------------------------------------------------------------------
-- getDatePrecision returns the number representing the precision of the first best date value
-- for the given property.
-- It takes the qid and property ID
-- The meanings are given at https://www.mediawiki.org/wiki/Wikibase/DataModel#Dates_and_times
-- 0 = 1 billion years .. 6 = millennium, 7 = century, 8 = decade, 9 = year, 10 = month, 11 = day
-- Returns 0 (or the second unnamed parameter) if the Wikidata does not exist.
-------------------------------------------------------------------------------
-- Dependencies: parseParam; sourced;
-------------------------------------------------------------------------------
function p.getDatePrecision(frame)
local args=frame.args
if not args[1] then args=frame:getParent().args end
local default = tonumber(args[2] or args.default) or 0
local prop = mw.text.trim(args[1] or "")
if prop == "" then return default end
local qid = args.qid or ""
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return default end
local onlysrc = parseParam(args.onlysourced or args.osd, true)
local stat = mw.wikibase.getBestStatements(qid, prop)
for i, v in ipairs(stat) do
local prec = (onlysrc == false or sourced(v))
and v.mainsnak.datavalue
and v.mainsnak.datavalue.value
and v.mainsnak.datavalue.value.precision
if prec then return prec end
end
return default
end
 
Baris 3.160 ⟶ 3.435:
getValueByLang
getValueByRefSource
getPropertyIDs
getQualifierIDs
getPropOfProp
getAwardCat
Baris 3.168 ⟶ 3.445:
getLink
getLabel
label
getAT
getDescription
Baris 3.182 ⟶ 3.460:
getQID
followQid
globalSiteID
siteID
projID
Baris 3.195 ⟶ 3.474:
checkValidity
getEntityFromTitle
getDatePrecision
--]]
-------------------------------------------------------------------------------