<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://moasspedia.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AWikidata_table</id>
	<title>Module:Wikidata table - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://moasspedia.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AWikidata_table"/>
	<link rel="alternate" type="text/html" href="https://moasspedia.org/w/index.php?title=Module:Wikidata_table&amp;action=history"/>
	<updated>2026-04-16T04:37:51Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.2</generator>
	<entry>
		<id>https://moasspedia.org/w/index.php?title=Module:Wikidata_table&amp;diff=3759&amp;oldid=prev</id>
		<title>Wikipedia&gt;MSGJ: update to allow for unitless quanities</title>
		<link rel="alternate" type="text/html" href="https://moasspedia.org/w/index.php?title=Module:Wikidata_table&amp;diff=3759&amp;oldid=prev"/>
		<updated>2022-01-24T21:00:56Z</updated>

		<summary type="html">&lt;p&gt;update to allow for unitless quanities&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[&lt;br /&gt;
	version dated 2021-02-22&lt;br /&gt;
	Module:Wikidata table&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local debugging = false&lt;br /&gt;
&lt;br /&gt;
local sep = &amp;quot;, &amp;quot; -- separator for multiple values of same property, changed from &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
local sep2 = &amp;quot;&amp;lt;br&amp;gt;&amp;quot; -- separator for values of different properties&lt;br /&gt;
&lt;br /&gt;
-- Internationalisation&lt;br /&gt;
&lt;br /&gt;
-- takes optional string language code (e.g. &amp;quot;en&amp;quot;) and returns a language object&lt;br /&gt;
local findLang = function(langcode)&lt;br /&gt;
	local langobj&lt;br /&gt;
	langcode = mw.text.trim(langcode or &amp;quot;&amp;quot;)&lt;br /&gt;
	if mw.language.isKnownLanguageTag(langcode) then&lt;br /&gt;
		langobj = mw.language.new( langcode )&lt;br /&gt;
	else&lt;br /&gt;
		langcode = mw.getCurrentFrame():preprocess( &amp;#039;{{int:lang}}&amp;#039; )&lt;br /&gt;
		if mw.language.isKnownLanguageTag(langcode) then&lt;br /&gt;
			langobj = mw.language.new( langcode )&lt;br /&gt;
		else&lt;br /&gt;
			langobj = mw.language.getContentLanguage()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return langobj&lt;br /&gt;
end&lt;br /&gt;
local currentlang = findLang().code&lt;br /&gt;
&lt;br /&gt;
local i18n = {&lt;br /&gt;
	filespace = &amp;quot;File&amp;quot;,&lt;br /&gt;
	editonwikidata = &amp;quot;Edit this on Wikidata&amp;quot;,&lt;br /&gt;
	ordinal = {&lt;br /&gt;
		[1] = &amp;quot;st&amp;quot;,&lt;br /&gt;
		[2] = &amp;quot;nd&amp;quot;,&lt;br /&gt;
		[3] = &amp;quot;rd&amp;quot;,&lt;br /&gt;
		[&amp;quot;default&amp;quot;] = &amp;quot;th&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local months = { &amp;quot;January&amp;quot;, &amp;quot;February&amp;quot;, &amp;quot;March&amp;quot;, &amp;quot;April&amp;quot;, &amp;quot;May&amp;quot;, &amp;quot;June&amp;quot;, &amp;quot;July&amp;quot;, &amp;quot;August&amp;quot;, &amp;quot;September&amp;quot;, &amp;quot;October&amp;quot;, &amp;quot;November&amp;quot;, &amp;quot;December&amp;quot; }&lt;br /&gt;
local mnths = {}&lt;br /&gt;
for idx, val in ipairs(months) do&lt;br /&gt;
	mnths[idx] = val:sub(1,3)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- makeOrdinal needs to be internationalised along with the above i18n&lt;br /&gt;
-- takes cardinal number as a numeric and returns the ordinal as a string&lt;br /&gt;
-- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc.&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
p.makeOrdinal = function(cardinal)&lt;br /&gt;
	local card = tonumber(cardinal)&lt;br /&gt;
	if not card then return cardinal end&lt;br /&gt;
	local ordsuffix = i18n.ordinal.default&lt;br /&gt;
	if card % 10 == 1 then&lt;br /&gt;
		ordsuffix = i18n.ordinal[1]&lt;br /&gt;
	elseif card % 10 == 2 then&lt;br /&gt;
		ordsuffix = i18n.ordinal[2]&lt;br /&gt;
	elseif card % 10 == 3 then&lt;br /&gt;
		ordsuffix = i18n.ordinal[3]&lt;br /&gt;
	end&lt;br /&gt;
	-- In English, 1, 21, 31, etc. use &amp;#039;st&amp;#039;, but 11, 111, etc. use &amp;#039;th&amp;#039;&lt;br /&gt;
	-- similarly for 12 and 13, etc.&lt;br /&gt;
	if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then&lt;br /&gt;
		ordsuffix = i18n.ordinal.default&lt;br /&gt;
	end&lt;br /&gt;
	return card .. ordsuffix&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local unitsymbol = {&lt;br /&gt;
	inch = &amp;quot;in&amp;quot;,&lt;br /&gt;
	foot = &amp;quot;ft&amp;quot;,&lt;br /&gt;
	yard = &amp;quot;yd&amp;quot;,&lt;br /&gt;
	mile = &amp;quot;mi&amp;quot;,&lt;br /&gt;
	[&amp;quot;nautical mile&amp;quot;] = &amp;quot;nmi&amp;quot;,&lt;br /&gt;
	metre = &amp;quot;m&amp;quot;,&lt;br /&gt;
	centimetre = &amp;quot;cm&amp;quot;,&lt;br /&gt;
	millimetre = &amp;quot;mm&amp;quot;,&lt;br /&gt;
	kilometre = &amp;quot;km&amp;quot;,&lt;br /&gt;
	acre = &amp;quot;acres&amp;quot;,&lt;br /&gt;
	hectare = &amp;quot;ha&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- prefixes for particular qualifiers&lt;br /&gt;
local prefix = {&lt;br /&gt;
	P580 = &amp;quot;from &amp;quot;,&lt;br /&gt;
	P582 = &amp;quot;until &amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- external ids which have a formatter url (P1630)&lt;br /&gt;
local formaturl = {&lt;br /&gt;
	P3563 = &amp;quot;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&amp;amp;exp=(%5Cd%7B3%7D)-(.*)&amp;amp;id=$1&amp;quot;, -- NGA number&lt;br /&gt;
	P613 = &amp;quot;http://nearby.org.uk/coord.cgi?p=$1&amp;quot;, -- OS grid reference&lt;br /&gt;
	P373 = &amp;quot;https://commons.wikimedia.org/wiki/Category:$1&amp;quot;, -- Commons category&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- date format default to dmy&lt;br /&gt;
local df = &amp;quot;dmy&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- fallbacks for common properties:&lt;br /&gt;
-- property-to-fallback-from = &amp;quot;property-to-fallback-to&amp;quot;&lt;br /&gt;
local fallback = {&lt;br /&gt;
	P276 = &amp;quot;P131&amp;quot;,&lt;br /&gt;
	P571 = &amp;quot;P1619&amp;quot;,&lt;br /&gt;
	P729 = &amp;quot;P571&amp;quot;,&lt;br /&gt;
	P4755 = &amp;quot;P296&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- error messages&lt;br /&gt;
local function errmsg(txt)&lt;br /&gt;
	if debugging then&lt;br /&gt;
		return &amp;quot;Error: &amp;quot; .. txt&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- formats the first character of linked item to uppercase&lt;br /&gt;
local function ucf(lnk)&lt;br /&gt;
	local tbl = mw.text.split( lnk, &amp;quot;|&amp;quot;, true )&lt;br /&gt;
	local ret&lt;br /&gt;
	if tbl[2] then -- piped link&lt;br /&gt;
		tbl[2] = tbl[2]:gsub(&amp;quot;^(%l)&amp;quot;, mw.ustring.upper)&lt;br /&gt;
		ret = table.concat(tbl, &amp;quot;|&amp;quot;)&lt;br /&gt;
	elseif lnk:sub(1,2) == &amp;quot;[[&amp;quot; then -- unpiped link&lt;br /&gt;
		ret = lnk:gsub(&amp;quot;^(%[%[%l)&amp;quot;, mw.ustring.upper)&lt;br /&gt;
	else -- unlinked&lt;br /&gt;
		ret = lnk:gsub(&amp;quot;^(%l)&amp;quot;, mw.ustring.upper)&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
-- entrypoint for invoke&lt;br /&gt;
function p.ucf(frame)&lt;br /&gt;
	return ucf(frame.args.text or &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- return a number rounded to a precision&lt;br /&gt;
local function decimalprecision(x, prec)&lt;br /&gt;
	local s = 1&lt;br /&gt;
	if x &amp;lt; 0 then&lt;br /&gt;
		x = -x&lt;br /&gt;
		s = -1&lt;br /&gt;
	end&lt;br /&gt;
	-- if prec is not suplied, pick an arbitrary precision&lt;br /&gt;
	if not tonumber(prec) then prec = 1e-4&lt;br /&gt;
	elseif prec &amp;gt; 1 then prec = 1&lt;br /&gt;
	elseif prec &amp;lt; 1e-6 then prec = 1e-6&lt;br /&gt;
	else prec = 10 ^ math.floor(math.log10(prec))&lt;br /&gt;
	end&lt;br /&gt;
	x = math.floor(x / prec + 0.5) * prec * s&lt;br /&gt;
	-- if it&amp;#039;s integral, cast to an integer:&lt;br /&gt;
	if  x == math.floor(x) then x = math.floor(x) end&lt;br /&gt;
	-- if it&amp;#039;s less than 1e-4, it will be in exponent form, so return a string with 6dp&lt;br /&gt;
	-- 9e-5 becomes 0.000090&lt;br /&gt;
	if math.abs(x) &amp;lt; 1e-4 then x = string.format(&amp;quot;%f&amp;quot;, x) end&lt;br /&gt;
	return x&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- creates an icon that links to the relevant Wikidata entity&lt;br /&gt;
local function createicon(entityID, propertyID, langcode)&lt;br /&gt;
	langcode = langcode or &amp;quot;&amp;quot;&lt;br /&gt;
	if not entityID or entityID == &amp;quot;&amp;quot; then entityID= mw.wikibase.getEntityIdForCurrentPage() end&lt;br /&gt;
	propertyID = propertyID or &amp;quot;&amp;quot;&lt;br /&gt;
	local icon = &amp;quot;&amp;amp;nbsp;&amp;lt;span class=&amp;#039;penicon autoconfirmed-show&amp;#039;&amp;gt;[[&amp;quot;&lt;br /&gt;
	-- &amp;quot;&amp;amp;nbsp;&amp;lt;span data-bridge-edit-flow=&amp;#039;overwrite&amp;#039; class=&amp;#039;penicon&amp;#039;&amp;gt;[[&amp;quot; -&amp;gt; enable Wikidata Bridge&lt;br /&gt;
	.. i18n.filespace&lt;br /&gt;
	.. &amp;quot;:OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt=&amp;quot;&lt;br /&gt;
	.. i18n.editonwikidata&lt;br /&gt;
	.. &amp;quot;|link=https://www.wikidata.org/wiki/&amp;quot; .. entityID&lt;br /&gt;
	if langcode ~= &amp;quot;&amp;quot; then icon = icon .. &amp;quot;?uselang=&amp;quot; .. langcode end&lt;br /&gt;
	if propertyID ~= &amp;quot;&amp;quot; then icon = icon .. &amp;quot;#&amp;quot; .. propertyID end&lt;br /&gt;
	icon = icon .. &amp;quot;|&amp;quot; .. i18n.editonwikidata .. &amp;quot;]]&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
	return icon&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- takes a statement tuple supplied from Wikidata and returns any references&lt;br /&gt;
function p._getrefs(statement)&lt;br /&gt;
	if not statement.references then return nil end&lt;br /&gt;
	local rtbl = {}&lt;br /&gt;
	local frm = mw.getCurrentFrame()&lt;br /&gt;
	for idx, ref in ipairs(statement.references) do&lt;br /&gt;
		if ref.snaks.P854 then -- reference url&lt;br /&gt;
			local url = ref.snaks.P854[1].datavalue.value&lt;br /&gt;
			if ref.snaks.P1476 then -- title (monolingual text)&lt;br /&gt;
				local title&lt;br /&gt;
				for idx1, titles in ipairs(ref.snaks.P1476) do&lt;br /&gt;
					if titles.datavalue.value.language == currentlang then&lt;br /&gt;
						title = titles.datavalue.value.text&lt;br /&gt;
						local citeweb = frm:expandTemplate{ title = &amp;quot;Cite web&amp;quot;, args = { url=url, title=title } }&lt;br /&gt;
						local hash = &amp;quot;WD&amp;quot; .. mw.hash.hashValue(&amp;quot;crc32&amp;quot;, citeweb)&lt;br /&gt;
						rtbl[#rtbl+1] = frm:callParserFunction{ name = &amp;quot;#tag:ref&amp;quot;, args = { citeweb, name=hash } }&lt;br /&gt;
						break&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				local hash = &amp;quot;WD&amp;quot; .. mw.hash.hashValue(&amp;quot;crc32&amp;quot;, url)&lt;br /&gt;
				rtbl[#rtbl+1] = frm:callParserFunction{ name = &amp;quot;#tag:ref&amp;quot;, args = { url, name=hash } }&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if ref.snaks.P248 then -- stated in&lt;br /&gt;
			local rqid = ref.snaks.P248[1].datavalue.value.id&lt;br /&gt;
			local citeq = frm:expandTemplate{ title = &amp;quot;Cite Q&amp;quot;, args = { rqid } }&lt;br /&gt;
			rtbl[#rtbl+1] = frm:callParserFunction{ name = &amp;quot;#tag:ref&amp;quot;, args = { citeq, name=rqid } }&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(rtbl)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- takes a qid and attempts to return a linked name for it&lt;br /&gt;
-- otherwise an unlinked name; otherwise the qid&lt;br /&gt;
function p._getLink(qid)&lt;br /&gt;
	local lbl = &amp;quot;&amp;quot;&lt;br /&gt;
	local slink = mw.wikibase.sitelink(qid)&lt;br /&gt;
	local label = mw.wikibase.getLabel(qid)&lt;br /&gt;
	if slink and label then&lt;br /&gt;
		if slink:lower() == label:lower() then&lt;br /&gt;
			if label:find(&amp;quot;^%u&amp;quot;) then -- match label&amp;#039;s case&lt;br /&gt;
				lbl = &amp;quot;[[&amp;quot; .. slink:gsub(&amp;quot;^(%l)&amp;quot;, mw.ustring.upper) .. &amp;quot;]]&amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				lbl = &amp;quot;[[&amp;quot; .. slink:gsub(&amp;quot;^(%u)&amp;quot;, mw.ustring.lower) .. &amp;quot;]]&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			lbl = &amp;quot;[[&amp;quot; .. slink .. &amp;quot;|&amp;quot; .. label .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	elseif slink then&lt;br /&gt;
		lbl = &amp;quot;[[&amp;quot; .. slink .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	elseif label then&lt;br /&gt;
		lbl = label&lt;br /&gt;
	else&lt;br /&gt;
		lbl = qid&lt;br /&gt;
	end&lt;br /&gt;
	return lbl&lt;br /&gt;
end&lt;br /&gt;
-- entrypoint for #invoke getLink&lt;br /&gt;
function p.getLink(frame)&lt;br /&gt;
	local qid = (frame.args.qid or &amp;quot;&amp;quot;):upper()&lt;br /&gt;
	if qid == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	return p._getLink(qid)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- takes a snak for a time property and returns the date&lt;br /&gt;
local function _getDate(snak, prec)&lt;br /&gt;
	local retval&lt;br /&gt;
	retval = mw.wikibase.renderSnak(snak)&lt;br /&gt;
	if prec == 7 then -- century&lt;br /&gt;
		local num, txt = retval:match(&amp;quot;^(%d+)%.(.+)$&amp;quot;)&lt;br /&gt;
		retval = p.makeOrdinal(num) .. txt&lt;br /&gt;
	elseif prec == 10 then&lt;br /&gt;
		local m, y, e = retval:match(&amp;quot;^(%a+) (%d+)(.*)&amp;quot;)&lt;br /&gt;
		retval = m:sub(1,3) .. &amp;quot; &amp;quot; .. y .. e&lt;br /&gt;
	elseif prec == 11 then&lt;br /&gt;
		local d, m, y, e = retval:match(&amp;quot;^(%d+) (%a+) (%d+)(.*)&amp;quot;)&lt;br /&gt;
		retval = d .. &amp;quot; &amp;quot; .. m:sub(1,3) .. &amp;quot; &amp;quot; .. y .. e&lt;br /&gt;
	end&lt;br /&gt;
	return retval&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- takes a qid and a property id and returns the corresponding values or nil&lt;br /&gt;
-- maxvals greater than zero sets the maximum number of values to return&lt;br /&gt;
-- the string quals contains property ids of qualifiers to be returned (&amp;#039;-&amp;#039; is the separator)&lt;br /&gt;
function p._getWD(qid, pid, maxvals, quals)&lt;br /&gt;
	maxvals = maxvals or 0&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for idx, prop in ipairs(mw.wikibase.getBestStatements(qid, pid)) do&lt;br /&gt;
		local retval&lt;br /&gt;
		if prop.mainsnak.snaktype ~= &amp;quot;value&amp;quot; then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
		local dtype = prop.mainsnak.datatype&lt;br /&gt;
		local dval = prop.mainsnak.datavalue.value&lt;br /&gt;
		if dtype == &amp;quot;wikibase-item&amp;quot; then&lt;br /&gt;
			retval = p._getLink(dval.id)&lt;br /&gt;
		elseif dtype == &amp;quot;monlingualtext&amp;quot; then&lt;br /&gt;
			for idx1, vals in ipairs(dval) do&lt;br /&gt;
				if vals.language == currentlang then&lt;br /&gt;
					retval = vals.text&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		elseif dtype == &amp;quot;commonsMedia&amp;quot; or dtype == &amp;quot;url&amp;quot; then&lt;br /&gt;
			retval = dval&lt;br /&gt;
		elseif dtype == &amp;quot;external-id&amp;quot; or dtype == &amp;quot;string&amp;quot; then&lt;br /&gt;
			if formaturl[pid] then&lt;br /&gt;
				retval = &amp;quot;[&amp;quot; .. mw.ustring.gsub(formaturl[pid], &amp;quot;$1&amp;quot;, dval) .. &amp;quot; &amp;quot; .. dval .. &amp;quot;]&amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				retval = dval&lt;br /&gt;
			end&lt;br /&gt;
		elseif dtype == &amp;quot;time&amp;quot; then&lt;br /&gt;
			retval = _getDate(prop.mainsnak, dval.precision)&lt;br /&gt;
			if dval.precision == 11 and df == &amp;quot;mdy&amp;quot; then&lt;br /&gt;
				local d, m, y, e = retval:match(&amp;quot;^(%d+) (%a+) (%d+)(.*)&amp;quot;)&lt;br /&gt;
				retval = m .. &amp;quot; &amp;quot; .. d .. &amp;quot;, &amp;quot; .. y  .. e&lt;br /&gt;
			end&lt;br /&gt;
		elseif dtype == &amp;quot;quantity&amp;quot; then&lt;br /&gt;
			local amount = tonumber(dval.amount)&lt;br /&gt;
			local unitqid = string.match( dval.unit, &amp;quot;(Q%d+)&amp;quot; )&lt;br /&gt;
			if unitqid then&lt;br /&gt;
				local unit = mw.wikibase.getLabel(unitqid)&lt;br /&gt;
				local symbol = unitsymbol[unit]&lt;br /&gt;
				if symbol then&lt;br /&gt;
					retval = mw.getCurrentFrame():expandTemplate{ title = &amp;quot;cvt&amp;quot;, args = {amount, symbol} }&lt;br /&gt;
				else&lt;br /&gt;
					retval = amount  .. &amp;quot; &amp;quot; .. unit&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				retval = amount&lt;br /&gt;
			end&lt;br /&gt;
		elseif dtype == &amp;quot;globe-coordinate&amp;quot; then&lt;br /&gt;
			local lat = decimalprecision(dval.latitude, dval.precision)&lt;br /&gt;
			local long = decimalprecision(dval.longitude, dval.precision)&lt;br /&gt;
			retval = &amp;quot;&amp;lt;span style=&amp;#039;font-size:90%;&amp;#039;&amp;gt;&amp;quot;&lt;br /&gt;
			.. mw.wikibase.formatValue(prop.mainsnak)&lt;br /&gt;
			.. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			retval = dval&lt;br /&gt;
		end&lt;br /&gt;
		-- get references&lt;br /&gt;
		retval = retval .. (p._getrefs(prop) or &amp;quot;&amp;quot;)&lt;br /&gt;
		-- get qualifiers&lt;br /&gt;
		if quals and prop.qualifiers and retval then&lt;br /&gt;
			local qtbl = {}&lt;br /&gt;
			for qpid in quals:gmatch(&amp;quot;P%d+&amp;quot;) do&lt;br /&gt;
				if prop.qualifiers[qpid] then&lt;br /&gt;
					for i, qv in ipairs(prop.qualifiers[qpid]) do&lt;br /&gt;
						local fqv&lt;br /&gt;
						if qv.datatype == &amp;quot;globe-coordinate&amp;quot; then&lt;br /&gt;
							fqv = mw.wikibase.formatValue(qv) -- linked&lt;br /&gt;
						elseif qv.datatype == &amp;quot;time&amp;quot; then&lt;br /&gt;
							fqv = _getDate(qv, qv.datavalue.value.precision)&lt;br /&gt;
							if qv.datavalue.value.precision == 11 then -- trim to month&lt;br /&gt;
								fqv = fqv:match(&amp;quot;%d+ (.+)&amp;quot;)&lt;br /&gt;
							end&lt;br /&gt;
						else&lt;br /&gt;
							fqv = mw.wikibase.renderSnak(qv) -- plaintext&lt;br /&gt;
						end&lt;br /&gt;
						if fqv and fqv ~= &amp;quot;&amp;quot; then&lt;br /&gt;
							qtbl[#qtbl+1] = (prefix[qpid] or &amp;quot;&amp;quot;) .. fqv&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if #qtbl &amp;gt; 0 then&lt;br /&gt;
				retval = retval .. &amp;quot;&amp;lt;span style=&amp;#039;font-size:90%;&amp;#039;&amp;gt; (&amp;quot; .. table.concat(qtbl, &amp;quot;&amp;amp;nbsp;&amp;quot;) .. &amp;quot;)&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		ret[#ret+1] = retval&lt;br /&gt;
		if maxvals &amp;gt; 0 and #ret &amp;gt;= maxvals then break end&lt;br /&gt;
	end&lt;br /&gt;
	if #ret &amp;lt; 1 then&lt;br /&gt;
		return nil&lt;br /&gt;
	else&lt;br /&gt;
		return table.concat(ret, sep)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
-- entrypoint for #invoke getWD&lt;br /&gt;
function p.getWD(frame)&lt;br /&gt;
	local qid = (frame.args.qid or &amp;quot;&amp;quot;):upper()&lt;br /&gt;
	if qid == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	local pid = (frame.args.pid or &amp;quot;&amp;quot;):upper()&lt;br /&gt;
	if pid == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	local maxvals = tonumber(frame.args.maxvals) or 0&lt;br /&gt;
	local quals = (frame.args.quals or &amp;quot;&amp;quot;):upper()&lt;br /&gt;
	if quals == &amp;quot;&amp;quot; then quals = nil end&lt;br /&gt;
	return p._getWD(qid, pid, maxvals, quals)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- make multiple table rows, one for each qid in args.qids,&lt;br /&gt;
-- with one table cell for each pid in args.pids&lt;br /&gt;
function p._makerows(args)&lt;br /&gt;
	args.qids = (args.qids or &amp;quot;&amp;quot;):upper()&lt;br /&gt;
	if args.qids == &amp;quot;&amp;quot; then return errmsg(&amp;quot;missing qids&amp;quot;) end&lt;br /&gt;
	args.pids = (args.pids or &amp;quot;&amp;quot;):upper()&lt;br /&gt;
	if args.pids == &amp;quot;&amp;quot; then return errmsg(&amp;quot;missing pids&amp;quot;) end&lt;br /&gt;
	local qids, pids = {}, {}&lt;br /&gt;
	for qid in args.qids:gmatch(&amp;quot;Q%d+&amp;quot;) do&lt;br /&gt;
		qids[#qids+1] = qid&lt;br /&gt;
	end&lt;br /&gt;
	for pid in args.pids:gmatch(&amp;quot;P%d+&amp;quot;) do&lt;br /&gt;
		pids[#pids+1] = pid&lt;br /&gt;
	end&lt;br /&gt;
	args.df = args.df or &amp;quot;&amp;quot;&lt;br /&gt;
	if args.df ~= &amp;quot;&amp;quot; then df = args.df end&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	for r, qid in ipairs(qids) do&lt;br /&gt;
		out = out .. &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
		out = out .. &amp;quot;&amp;lt;th scope=&amp;#039;row&amp;#039;&amp;gt;&amp;quot; .. p._getLink(qid) .. &amp;quot;&amp;lt;/th&amp;gt;&amp;quot;&lt;br /&gt;
		for c, pid in ipairs(pids) do&lt;br /&gt;
			if pid == &amp;quot;P18&amp;quot; then -- image&lt;br /&gt;
				local img = p._getWD(qid, pid, 1)&lt;br /&gt;
				if img then&lt;br /&gt;
					out = out .. &amp;quot;&amp;lt;td&amp;gt;[[File:&amp;quot; .. img .. &amp;quot;|100px]]&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				out = out .. &amp;quot;&amp;lt;td&amp;gt;&amp;quot; .. (p._getWD(qid, pid, 0) or &amp;quot; &amp;quot;) .. &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		out = out .. &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
-- entry point for #invoke makerows&lt;br /&gt;
function p.makerows(frame)&lt;br /&gt;
	local args = {}&lt;br /&gt;
	for key, value in pairs(frame:getParent().args) do&lt;br /&gt;
		args[key] = value&lt;br /&gt;
	end&lt;br /&gt;
	for key, value in pairs(frame.args) do&lt;br /&gt;
		args[key] = value&lt;br /&gt;
	end&lt;br /&gt;
	return p._makerows(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- make a single table row, one cell per value passed in args.pids&lt;br /&gt;
-- each value may be a combination of properties and qualifiers&lt;br /&gt;
function p._makerow(args)&lt;br /&gt;
	local qid = (args.qid or &amp;quot;&amp;quot;):upper():match(&amp;quot;Q%d+&amp;quot;)&lt;br /&gt;
	-- qid can be nil if we want a row without wikidata&lt;br /&gt;
	-- remove whitespace, uppercase, trap nil&lt;br /&gt;
	args.pids = (args.pids or &amp;quot;&amp;quot;):upper():gsub(&amp;quot;%s&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	if args.pids == &amp;quot;&amp;quot; then return errmsg(&amp;quot;missing pids&amp;quot;) end&lt;br /&gt;
	-- collect any parameters c1, c2, etc. as cell replacements; c1+, c2+, etc. as addenda&lt;br /&gt;
	local cellrep, celladd = {}, {}&lt;br /&gt;
	for key, value in pairs(args) do&lt;br /&gt;
		local col = (type(key) == &amp;quot;string&amp;quot;) and tonumber(key:match(&amp;quot;^[Cc](%d+)$&amp;quot;))&lt;br /&gt;
		if col then&lt;br /&gt;
			cellrep[col] = value&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for key, value in pairs(args) do&lt;br /&gt;
		local col = (type(key) == &amp;quot;string&amp;quot;) and tonumber(key:match(&amp;quot;^[Cc](%d+)%+$&amp;quot;))&lt;br /&gt;
		if col then&lt;br /&gt;
			celladd[col] = value&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- set date format if passed&lt;br /&gt;
	args.df = args.df or &amp;quot;&amp;quot;&lt;br /&gt;
	if args.df ~= &amp;quot;&amp;quot; then df = args.df end&lt;br /&gt;
	-- create the html to return&lt;br /&gt;
	local out = &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
	if cellrep[1] and qid then&lt;br /&gt;
		out = out .. &amp;quot;&amp;lt;th scope=&amp;#039;row&amp;#039;&amp;gt;&amp;quot; .. cellrep[1] .. createicon(qid) .. &amp;quot;&amp;lt;/th&amp;gt;&amp;quot;&lt;br /&gt;
	elseif not qid then&lt;br /&gt;
		out = out .. &amp;quot;&amp;lt;th&amp;gt;&amp;quot; .. (cellrep[1] or &amp;quot; &amp;quot;) .. &amp;quot;&amp;lt;/th&amp;gt;&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		out = out .. &amp;quot;&amp;lt;th scope=&amp;#039;row&amp;#039;&amp;gt;&amp;quot; .. ucf(p._getLink(qid)) .. (celladd[1] or &amp;quot;&amp;quot;) .. createicon(qid) .. &amp;quot;&amp;lt;/th&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	-- split args.pids at comma separators into sequence of cellpids (each may be like P12+P34/P456-P789)&lt;br /&gt;
	local cellpids = mw.text.split(args.pids, &amp;quot;,+&amp;quot;)&lt;br /&gt;
	for c, val in ipairs(cellpids) do&lt;br /&gt;
		if cellrep[c+1] then&lt;br /&gt;
			out = out .. &amp;quot;&amp;lt;td&amp;gt;&amp;quot; .. cellrep[c+1] .. &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
		elseif not qid then&lt;br /&gt;
			out = out .. &amp;quot;&amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			-- separate multiple properties in same cell, sep=+&lt;br /&gt;
			local ptbl = {} -- sequence of values for one cell&lt;br /&gt;
			for propandquals in mw.text.gsplit(val, &amp;quot;+&amp;quot;, true) do&lt;br /&gt;
				-- for each property, split off property from qualifiers, sep=/&lt;br /&gt;
				local pid = mw.text.split(propandquals, &amp;quot;/&amp;quot;)[1]:match(&amp;quot;P%d+&amp;quot;)&lt;br /&gt;
				local quals = mw.text.split(propandquals, &amp;quot;/&amp;quot;)[2]&lt;br /&gt;
				if pid == &amp;quot;P18&amp;quot; then -- image&lt;br /&gt;
					local img = p._getWD(qid, pid, 1)&lt;br /&gt;
					if img then&lt;br /&gt;
						ptbl[#ptbl+1] = &amp;quot;[[File:&amp;quot; .. img .. &amp;quot;|100px]]&amp;quot;&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					local wdval = p._getWD(qid, pid, 0, quals)&lt;br /&gt;
					if not wdval and fallback[pid] then&lt;br /&gt;
						wdval = p._getWD(qid, fallback[pid], 0, quals)&lt;br /&gt;
					end&lt;br /&gt;
					ptbl[#ptbl+1] = wdval and ucf(wdval)&lt;br /&gt;
				end&lt;br /&gt;
			end -- of loop through multiple properties in same cell&lt;br /&gt;
			out = out .. &amp;quot;&amp;lt;td&amp;gt;&amp;quot; .. table.concat(ptbl, sep2) .. (celladd[c+1] or &amp;quot;&amp;quot;) .. &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end -- of loop through all of the cells in the row&lt;br /&gt;
	out = out .. &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
-- entry point for #invoke makerow&lt;br /&gt;
function p.makerow(frame)&lt;br /&gt;
	local args = {}&lt;br /&gt;
	for key, value in pairs(frame:getParent().args) do&lt;br /&gt;
		args[key] = value&lt;br /&gt;
	end&lt;br /&gt;
	for key, value in pairs(frame.args) do&lt;br /&gt;
		args[key] = value&lt;br /&gt;
	end&lt;br /&gt;
	return p._makerow(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wikipedia&gt;MSGJ</name></author>
	</entry>
</feed>