<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ARexxS</id>
	<title>Module:RexxS - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ARexxS"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:RexxS&amp;action=history"/>
	<updated>2026-04-20T05:11:36Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:RexxS&amp;diff=144660&amp;oldid=prev</id>
		<title>imported&gt;Izno: rm vendor specifics</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:RexxS&amp;diff=144660&amp;oldid=prev"/>
		<updated>2022-11-02T17:49:08Z</updated>

		<summary type="html">&lt;p&gt;rm vendor specifics&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- &lt;br /&gt;
-- Lua functions for personal use&lt;br /&gt;
-- &lt;br /&gt;
&lt;br /&gt;
p = {}&lt;br /&gt;
&lt;br /&gt;
-- carousel returns one of a list of image filenames&lt;br /&gt;
-- the index of the one chosen increments every &amp;#039;switchsecs&amp;#039;&lt;br /&gt;
-- which is a parameter giving the number of seconds between switches&lt;br /&gt;
-- 3600 would switch every hour&lt;br /&gt;
-- 43200 would be every 12 hours (the default)&lt;br /&gt;
-- 86400 would be daily&lt;br /&gt;
-- {{#invoke:RexxS|carousel|switchsecs=&amp;lt;number-of-seconds&amp;gt;}}&lt;br /&gt;
-- {{#invoke:RexxS|carousel}} for 12 hours between switches&lt;br /&gt;
p.carousel = function(frame)&lt;br /&gt;
	local switchtime = tonumber(frame.args.switchsecs) or 43200&lt;br /&gt;
	if switchtime &amp;lt; 1 then switchtime = 43200 end&lt;br /&gt;
	local imgs = {&lt;br /&gt;
		&amp;quot;Pelicans 11.3.2007.jpg&amp;quot;,&lt;br /&gt;
        &amp;quot;Little Chief Mountain.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Great Blue Heron and immature Bald Eagle on the Platte River.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Green Heron4.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Canada Goose mating ritual2.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;North Swiftcurrent Glacier (2).jpg&amp;quot;, &lt;br /&gt;
		&amp;quot;Adhela and Guy Fawkes 1873.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Flock of Cedar Waxwings3.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Fusillade Peak 2.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Lightning 7.11.2008.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Ursus americanus.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Jackson Glacier 7.2017.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Stone Creek Nebraska.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Grus canadensis2.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Scaphirhynchus platorynchus 6.14.2014a.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Painted Tepee.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Bison Bull in Nebraska.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Horses and thunderstorm1.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Going to the Sun Falls.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Lillypads at Desoto.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Steamboat Geyser.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Fusillade Mountain.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Lake view from Beartooth Pass.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Tetons from Togwotee Pass.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Inspiration Point.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Flowers b grow to 6 feet.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Storm Front2.jpg&amp;quot;,&lt;br /&gt;
		&amp;quot;Bird Woman Falls 2017.jpg&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	local numimgs = #imgs&lt;br /&gt;
	local now = math.floor(os.time()/switchtime)&lt;br /&gt;
	local idx = now % numimgs +1&lt;br /&gt;
	return imgs[idx]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- wobble returns CSS which rotates the container&lt;br /&gt;
-- possible angles are -4, -2, 0, 2, 4 degrees&lt;br /&gt;
-- they may be changed by the |tilt parameter (defaults to 2)&lt;br /&gt;
-- a different angle is selected every &amp;lt;switchtime&amp;gt; seconds - default is 4&lt;br /&gt;
-- {{#invoke:RexxS|wobble|switchsecs=&amp;lt;number-of-seconds&amp;gt;}}&lt;br /&gt;
-- {{#invoke:RexxS|wobble}} for 4 seconds between switches&lt;br /&gt;
p.wobble = function(frame)&lt;br /&gt;
	local tilt = tonumber(frame.args.tilt) or 2&lt;br /&gt;
	local switchtime = tonumber(frame.args.switchsecs) or 4&lt;br /&gt;
	if switchtime &amp;lt; 1 then switchtime = 4 end&lt;br /&gt;
	local now = math.floor(os.time()/switchtime)&lt;br /&gt;
	local angle = tilt * (now % 5 - 2)&lt;br /&gt;
	return &amp;quot;transform:rotate(&amp;quot; .. angle .. &amp;quot;deg);&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- prevwarn returns a hatnote-style warning message in red&lt;br /&gt;
-- the customisable text of the warning is passed in the parameter &amp;#039;message&amp;#039;&lt;br /&gt;
-- it only returns the warning in preview mode&lt;br /&gt;
-- note that a blank {{REVISIONID}} is a way of identifying preview mode.&lt;br /&gt;
-- {{#invoke:RexxS|prevwarn|message=the religion parameter will be removed soon.}}&lt;br /&gt;
p.prevwarn = function(frame)&lt;br /&gt;
	local msg = frame.args.message&lt;br /&gt;
	if frame:preprocess( &amp;quot;{{REVISIONID}}&amp;quot; ) == &amp;quot;&amp;quot; then&lt;br /&gt;
		return &amp;#039;&amp;lt;div class=&amp;quot;hatnote&amp;quot; style=&amp;quot;color:red&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Warning:&amp;lt;/strong&amp;gt; &amp;#039; .. msg .. &amp;#039; (this message is shown only in preview).&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- sandyrock returns a pseudo-random message inline&lt;br /&gt;
-- the style is customisable with the &amp;#039;style&amp;#039; parameter&lt;br /&gt;
-- other messages may be added or substituted, just separate with a comma&lt;br /&gt;
-- {{#invoke:RexxS|sandyrock|style=color:#C00;}}&lt;br /&gt;
p.sandyrock = function(frame)&lt;br /&gt;
	local style = frame.args.style or &amp;quot;&amp;quot;&lt;br /&gt;
	local msgs = {&lt;br /&gt;
		&amp;quot;You make [[Vogon]]s look frivolous&amp;quot;,&lt;br /&gt;
		&amp;quot;You&amp;#039;re the poster-child for the phrase &amp;#039;bureaucratic nightmare&amp;#039;&amp;quot;,&lt;br /&gt;
		&amp;quot;How much did they pay for your life-story when they were filming [[Brazil]]?&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;#039;&amp;#039;Discretion&amp;#039;&amp;#039;-ary sanctions? You are to &amp;#039;discretion&amp;#039; what &amp;#039;bull&amp;#039; is to &amp;#039;china-shop&amp;#039;.&amp;quot;,&lt;br /&gt;
		&amp;quot;Using you for Arbitration Enforcement is like employing King Herod as a baby-sitter.&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	local idx = os.time() % #msgs +1&lt;br /&gt;
	return &amp;#039;&amp;lt;span style=&amp;quot;&amp;#039;.. style .. &amp;#039;&amp;quot;&amp;gt;&amp;#039; .. msgs[idx] .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- getLink returns the label for a Qid linked to the article&lt;br /&gt;
p.getLink = function(frame)&lt;br /&gt;
	local itemID = mw.text.trim(frame.args[1] or &amp;quot;&amp;quot;)&lt;br /&gt;
	if itemID == &amp;quot;&amp;quot; then return end&lt;br /&gt;
	local sitelink = mw.wikibase.getSitelink(itemID)&lt;br /&gt;
	local label = mw.wikibase.getLabel(itemID)&lt;br /&gt;
	if not label then label = itemID end&lt;br /&gt;
	if sitelink then&lt;br /&gt;
		return &amp;quot;[[&amp;quot; .. sitelink .. &amp;quot;|&amp;quot; .. label .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		return label&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- getTitle returns the label for a Qid linked to the article, without the link that getLink returns&lt;br /&gt;
p.getTitle = function(frame)&lt;br /&gt;
    local itemID = mw.text.trim(frame.args[1] or &amp;quot;&amp;quot;)&lt;br /&gt;
    if itemID == &amp;quot;&amp;quot; then return end&lt;br /&gt;
    local label = mw.wikibase.getLabel(itemID)&lt;br /&gt;
    if not label then label = itemID end&lt;br /&gt;
    return label&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- getAT returns the article title for a Qid&lt;br /&gt;
p.getAT = function(frame)&lt;br /&gt;
	local itemID = mw.text.trim(frame.args[1] or &amp;quot;&amp;quot;)&lt;br /&gt;
	if itemID == &amp;quot;&amp;quot; then return end&lt;br /&gt;
	return mw.wikibase.getSitelink(itemID)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- getDescription returns the Wikidata item description for a Qid&lt;br /&gt;
p.getDescription = function(frame)&lt;br /&gt;
	local qid = frame.args.qid&lt;br /&gt;
	if qid and (#qid == 0) then qid = nil end&lt;br /&gt;
	local desc = mw.wikibase.getDescription(qid)&lt;br /&gt;
	if desc then return mw.text.nowiki(desc) else return nil end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- getIdentifierQualifier returns the value of a qualifier for an Identifier&lt;br /&gt;
-- such as &amp;#039;Art UK artist ID&amp;#039;, P1367&lt;br /&gt;
-- the assumption is that one value exists for the property&lt;br /&gt;
-- and only one qualifier exists for that value&lt;br /&gt;
-- Constraint violations for P1367 are at:&lt;br /&gt;
-- https://www.wikidata.org/wiki/Wikidata:Database_reports/Constraint_violations/P1367#Single_value&lt;br /&gt;
-- Now in [[Module:WikidataIdentifiers]]&lt;br /&gt;
p.getIdentifierQualifier = function(frame)&lt;br /&gt;
	local propertyID = mw.text.trim(frame.args[1] or &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- The PropertyID of the qualifier&lt;br /&gt;
	-- whose value is to be returned is passed in named parameter |qual=&lt;br /&gt;
	local qualifierID = frame.args.qual&lt;br /&gt;
	&lt;br /&gt;
	-- Can take a named parameter |qid which is the Wikidata ID for the article.&lt;br /&gt;
	-- This will not normally be used because it&amp;#039;s an expensive call.&lt;br /&gt;
	local qid = frame.args.qid&lt;br /&gt;
	if qid and (#qid == 0) then qid = nil end&lt;br /&gt;
&lt;br /&gt;
	local entity = mw.wikibase.getEntity(qid)&lt;br /&gt;
	local props&lt;br /&gt;
	if entity and entity.claims then&lt;br /&gt;
		props = entity.claims[propertyID]&lt;br /&gt;
	end&lt;br /&gt;
	if props then&lt;br /&gt;
		-- Check that the first value of the property is an external id&lt;br /&gt;
		if props[1].mainsnak.datatype == &amp;quot;external-id&amp;quot; then&lt;br /&gt;
			-- get any qualifiers of the first value of the property&lt;br /&gt;
			local quals = props[1].qualifiers&lt;br /&gt;
			if quals and quals[qualifierID] then&lt;br /&gt;
				-- check what the dataype of the first qualifier value is&lt;br /&gt;
				-- if it&amp;#039;s quantity return the amount&lt;br /&gt;
				if quals[qualifierID][1].datatype == &amp;quot;quantity&amp;quot; then&lt;br /&gt;
					return tonumber(quals[qualifierID][1].datavalue.value.amount)&lt;br /&gt;
				end&lt;br /&gt;
				-- checks for other datatypes go here:&lt;br /&gt;
			end&lt;br /&gt;
			return &amp;quot;no qualifier&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;quot;not external id&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		return &amp;quot;no property&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;no claims&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- getValueIndirect returns the value of a property of a value of a property&lt;br /&gt;
-- for example the &amp;#039;headquarters location property, P159&amp;#039; (property1) may be a city (value 1)&lt;br /&gt;
-- that city should be a wikibase-entity with its own entry&lt;br /&gt;
-- that entry should have a &amp;#039;country property, P17&amp;#039; (property2), which will have a value which is the country (value2)&lt;br /&gt;
-- the assumption is that one value (value1) exists for property1&lt;br /&gt;
-- and only one value exists for that property2 of value1&lt;br /&gt;
-- Constraint violations for P17 are at:&lt;br /&gt;
-- https://www.wikidata.org/wiki/Wikidata:Database_reports/Constraint_violations/P17#Single_value&lt;br /&gt;
-- This is intrinsically an expensive call&lt;br /&gt;
p.getValueIndirect = function(frame)&lt;br /&gt;
	local property1 = mw.text.trim(frame.args[1] or &amp;quot;&amp;quot;)&lt;br /&gt;
	local property2 = mw.text.trim(frame.args[2] or &amp;quot;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	-- Can take a named parameter |qid which is the Wikidata ID for the article.&lt;br /&gt;
	-- This will not normally be used because it&amp;#039;s an expensive call.&lt;br /&gt;
	local qid1 = frame.args.qid&lt;br /&gt;
	if qid1 and (#qid1 == 0) then qid1 = nil end&lt;br /&gt;
&lt;br /&gt;
	local entity1 = mw.wikibase.getEntity(qid1)&lt;br /&gt;
	local props1&lt;br /&gt;
	if entity1 and entity1.claims then&lt;br /&gt;
		props1 = entity1.claims[property1]&lt;br /&gt;
	end&lt;br /&gt;
	if props1 then&lt;br /&gt;
		-- Check that the first value of the property is a wikibase-item&lt;br /&gt;
		if props1[1].mainsnak.datatype == &amp;quot;wikibase-item&amp;quot; then&lt;br /&gt;
			local qid2 = props1[1].mainsnak.datavalue.value.id&lt;br /&gt;
			local entity2 = mw.wikibase.getEntity(qid2)&lt;br /&gt;
			if entity2.claims then&lt;br /&gt;
				-- only need props2 if we want a more sophisticated parsing, e.g. mdy dates&lt;br /&gt;
				-- local props2 = entity2.claims[property2]&lt;br /&gt;
				return entity2:formatPropertyValues(property2).value&lt;br /&gt;
			else&lt;br /&gt;
				return qid2 .. &amp;quot; has no claims.&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;quot;not wikibase-item: &amp;quot; .. props1[1].mainsnak.datatype --debug&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;no claims&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- checkPage creates a &amp;quot;title object&amp;quot; for the given title and namespace&lt;br /&gt;
-- named parameters:&lt;br /&gt;
-- art = title of article/page&lt;br /&gt;
-- ns = namespace number - defaults to 0 (mainspace) if omitted&lt;br /&gt;
-- returns 0 if page does not exist or a positive number if it does&lt;br /&gt;
-- {{#invoke:RexxS|checkPage|art=&amp;lt;pagename&amp;gt;}}&lt;br /&gt;
-- {{#invoke:RexxS|checkPage|art=&amp;lt;pagename&amp;gt;|ns=&amp;lt;number&amp;gt;}}&lt;br /&gt;
p.checkPage = function(frame)&lt;br /&gt;
	local article = mw.text.trim(frame.args.art or &amp;quot;&amp;quot;)&lt;br /&gt;
	local ns = tonumber(frame.args.ns or 0)&lt;br /&gt;
	if mw.site.namespaces[ns] then&lt;br /&gt;
		if article&amp;gt;&amp;quot;&amp;quot; then&lt;br /&gt;
			local t = mw.title.new(article, ns)&lt;br /&gt;
			return t.id&lt;br /&gt;
		end&lt;br /&gt;
		return &amp;quot;No article name given&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;Invalid namespace&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- checkRedirect creates a &amp;quot;title object&amp;quot; for the given title and namespace&lt;br /&gt;
-- named parameters:&lt;br /&gt;
-- art = title of article/page&lt;br /&gt;
-- ns = namespace number - defaults to 0 (mainspace) if omitted&lt;br /&gt;
-- returns Redirect / Not Redirect / Does not exist&lt;br /&gt;
-- {{#invoke:RexxS|checkPage|art=&amp;lt;pagename&amp;gt;}}&lt;br /&gt;
-- {{#invoke:RexxS|checkPage|art=&amp;lt;pagename&amp;gt;|ns=&amp;lt;number&amp;gt;}}&lt;br /&gt;
p.checkRedirect = function(frame)&lt;br /&gt;
	local article = mw.text.trim(frame.args.art or &amp;quot;&amp;quot;)&lt;br /&gt;
	local ns = tonumber(frame.args.ns or 0)&lt;br /&gt;
	if mw.site.namespaces[ns] then&lt;br /&gt;
		if article &amp;gt; &amp;quot;&amp;quot; then&lt;br /&gt;
			local t = mw.title.new(article, ns)&lt;br /&gt;
			if t.id &amp;gt; 0 then&lt;br /&gt;
				if t.isRedirect then&lt;br /&gt;
					return &amp;quot;Redirect&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				return &amp;quot;Not Redirect&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			return &amp;quot;Does not exist&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		return &amp;quot;No article name given&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;Invalid namespace&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- getAuthors for Andy &lt;br /&gt;
-- pass the Q-id of the source (book, etc.) in qid&lt;br /&gt;
-- returns a list in the form |author1=firstname secondname |author2= ...&lt;br /&gt;
p.getAuthors = function(frame)&lt;br /&gt;
	local propertyID = &amp;quot;P50&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local qid = frame.args.qid&lt;br /&gt;
	if qid and (#qid == 0) then qid = nil end&lt;br /&gt;
	&lt;br /&gt;
	-- wdlinks is a boolean passed to enable links to Wikidata when no article exists&lt;br /&gt;
	-- if &amp;quot;false&amp;quot; or &amp;quot;no&amp;quot; or &amp;quot;0&amp;quot; is passed set it false&lt;br /&gt;
	-- if nothing or an empty string is passed set it false&lt;br /&gt;
	local wdl = frame.args.wdlinks&lt;br /&gt;
	if wdl and (#wdl &amp;gt; 0) then&lt;br /&gt;
		wdl = wdl:lower()&lt;br /&gt;
		if (wdl == &amp;quot;false&amp;quot;) or (wdl == &amp;quot;no&amp;quot;) or (wdl == &amp;quot;0&amp;quot;) then&lt;br /&gt;
			wdl = false&lt;br /&gt;
		else&lt;br /&gt;
			wdl = true&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		-- wdl is empty, so&lt;br /&gt;
		wdl = false&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local entity, props&lt;br /&gt;
	local entity = mw.wikibase.getEntity(qid)&lt;br /&gt;
	if entity and entity.claims then&lt;br /&gt;
		props = entity.claims[propertyID]&lt;br /&gt;
	else&lt;br /&gt;
		-- there&amp;#039;s no such entity or no claims for the entity&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Make sure it actually has the property requested&lt;br /&gt;
	if not props or not props[1] then &lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- So now we have something to return:&lt;br /&gt;
	-- table &amp;#039;out&amp;#039; is going to to store the return value(s):&lt;br /&gt;
	local out = {}&lt;br /&gt;
	if props[1].mainsnak.datavalue.type == &amp;quot;wikibase-entityid&amp;quot; then&lt;br /&gt;
		-- it&amp;#039;s wiki-linked value, so output as link if possible&lt;br /&gt;
		for k, v in pairs(props) do&lt;br /&gt;
			local qnumber = &amp;quot;Q&amp;quot; .. v.mainsnak.datavalue.value[&amp;quot;numeric-id&amp;quot;]&lt;br /&gt;
			local sitelink = mw.wikibase.getSitelink(qnumber)&lt;br /&gt;
			local label = mw.wikibase.getLabel(qnumber)&lt;br /&gt;
			if label then&lt;br /&gt;
				label = mw.text.nowiki(label)&lt;br /&gt;
			else&lt;br /&gt;
				label = qnumber&lt;br /&gt;
			end&lt;br /&gt;
			if sitelink then&lt;br /&gt;
				out[#out + 1] = &amp;quot;[[&amp;quot; .. sitelink .. &amp;quot;|&amp;quot; .. label .. &amp;quot;]]&amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				-- no sitelink, so check first for a redirect with that label&lt;br /&gt;
				local artitle = mw.title.new(label, 0)&lt;br /&gt;
				if artitle.id &amp;gt; 0 then&lt;br /&gt;
					if artitle.isRedirect then&lt;br /&gt;
						-- no sitelink, but there&amp;#039;s a redirect with the same title as the label; let&amp;#039;s link to that&lt;br /&gt;
						out[#out + 1] = &amp;quot;[[&amp;quot; .. label .. &amp;quot;]]&amp;quot;&lt;br /&gt;
					else&lt;br /&gt;
						-- no sitelink and not a redirect but an article exists with the same title as the label&lt;br /&gt;
						-- that&amp;#039;s probably a dab page, so output the plain label&lt;br /&gt;
						out[#out + 1] = label&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					-- no article or redirect with the same title as the label&lt;br /&gt;
					if wdl then&lt;br /&gt;
						-- show that there&amp;#039;s a Wikidata entry available&lt;br /&gt;
						out[#out + 1] = &amp;quot;[[:d:Special:EntityPage/Q&amp;quot; .. v.mainsnak.datavalue.value[&amp;quot;numeric-id&amp;quot;] .. &amp;quot;|&amp;quot; .. label .. &amp;quot;]]&amp;amp;nbsp;&amp;lt;span title=&amp;#039;&amp;quot; .. i18n[&amp;quot;errors&amp;quot;][&amp;quot;local-article-not-found&amp;quot;] .. &amp;quot;&amp;#039;&amp;gt;[[File:Wikidata-logo.svg|16px|alt=|link=]]&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
					else&lt;br /&gt;
						-- no wikidata links wanted, so just give the plain label&lt;br /&gt;
						out[#out + 1] = label&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		-- not a linkable article title&lt;br /&gt;
		out[#out+1] = entity:formatPropertyValues(propertyID).value&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- if there&amp;#039;s anything to return, then return a list&lt;br /&gt;
	-- in the form |author1=firstname secondname |author2= ...&lt;br /&gt;
	if #out &amp;gt; 0 then&lt;br /&gt;
		-- construct the list in the format we want&lt;br /&gt;
		for k,v in ipairs(out) do&lt;br /&gt;
			out[k] = &amp;quot;|author&amp;quot; .. k .. &amp;quot;=&amp;quot; .. v&lt;br /&gt;
		end&lt;br /&gt;
		return table.concat(out, &amp;quot; &amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.checkBlacklist = function(frame)&lt;br /&gt;
	local blacklist = frame.args.suppressfields&lt;br /&gt;
	local fieldname = frame.args.name&lt;br /&gt;
	if blacklist and fieldname then&lt;br /&gt;
		if blacklist:find(fieldname) then return nil end&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- anytext returns nil if its argument is just punctuation, whitespace or html tags&lt;br /&gt;
-- otherwise it returns the argument&lt;br /&gt;
p.anytext = function(frame)&lt;br /&gt;
	local s = frame.args[1]&lt;br /&gt;
	if not s or #s == 0 then return nil end&lt;br /&gt;
	sx = s:gsub(&amp;quot;&amp;lt;%w*&amp;gt;&amp;quot;, &amp;quot;&amp;quot;):gsub(&amp;quot;&amp;lt;/%w*&amp;gt;&amp;quot;, &amp;quot;&amp;quot;):gsub(&amp;quot;%p&amp;quot;, &amp;quot;&amp;quot;):gsub(&amp;quot;%s&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	if #sx == 0 then&lt;br /&gt;
		return nil&lt;br /&gt;
	else &lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- getValueQualIndirect scans a property prop1 in the current page (or another page if qid is given)&lt;br /&gt;
-- for each value of the property that is a wikibase item, it fetches all of the values of prop2&lt;br /&gt;
-- and for each value of prop2 it also retrieves each qualifier and its value&lt;br /&gt;
p.getValueQualIndirect = function(frame)&lt;br /&gt;
	local qid = frame.args.qid or &amp;quot;&amp;quot;&lt;br /&gt;
	if qid == &amp;quot;&amp;quot; then qid = nil end&lt;br /&gt;
	local prop1 = frame.args.prop1 or &amp;quot;&amp;quot;&lt;br /&gt;
	if prop1 == &amp;quot;&amp;quot; then return &amp;quot;No prop1&amp;quot; end&lt;br /&gt;
	local prop2 = frame.args.prop2 or &amp;quot;&amp;quot;&lt;br /&gt;
	if prop2 == &amp;quot;&amp;quot; then return &amp;quot;No prop2&amp;quot; end&lt;br /&gt;
	&lt;br /&gt;
	local ent1 = mw.wikibase.getEntity(qid)&lt;br /&gt;
	if not ent1 then return &amp;quot;No Wikidata entry&amp;quot; end&lt;br /&gt;
	if not ent1.claims then return &amp;quot;No claims&amp;quot; end&lt;br /&gt;
	&lt;br /&gt;
	local props1 = ent1.claims[prop1]&lt;br /&gt;
	if not props1 then return &amp;quot;No properties&amp;quot; end&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	for k1, v1 in pairs(props1) do&lt;br /&gt;
		if v1.mainsnak.datatype  == &amp;quot;wikibase-item&amp;quot; then&lt;br /&gt;
			local qval1 = v1.mainsnak.datavalue.value.id&lt;br /&gt;
			local label1 = mw.wikibase.getLabel(qval1)&lt;br /&gt;
			if label1 then&lt;br /&gt;
				label1 = mw.text.nowiki(label1)&lt;br /&gt;
			else&lt;br /&gt;
				label1 = qval1&lt;br /&gt;
			end&lt;br /&gt;
			-- start building an output string&lt;br /&gt;
			out = out .. &amp;quot;&amp;lt;br&amp;gt;&amp;quot; .. label1 .. &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
			-- look at entry for qval and get its prop2 values&lt;br /&gt;
			local ent2 = mw.wikibase.getEntity(qval1)&lt;br /&gt;
			if ent2.claims and ent2.claims[prop2] then&lt;br /&gt;
				for k2, v2 in pairs(ent2.claims[prop2]) do&lt;br /&gt;
					if v2.mainsnak.datatype  == &amp;quot;wikibase-item&amp;quot; then&lt;br /&gt;
						local qval2 = v2.mainsnak.datavalue.value.id&lt;br /&gt;
						local label2 = mw.wikibase.getLabel(qval2)&lt;br /&gt;
						if label2 then&lt;br /&gt;
							label2 = mw.text.nowiki(label2)&lt;br /&gt;
						else&lt;br /&gt;
							label2 = qval2&lt;br /&gt;
						end&lt;br /&gt;
						out = out .. &amp;quot;+ &amp;quot; .. label2 .. &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
						-- scan through qualifiers&lt;br /&gt;
						if v2.qualifiers then&lt;br /&gt;
							for k3, v3 in pairs(v2.qualifiers) do&lt;br /&gt;
								for k4, v4 in pairs(v3) do&lt;br /&gt;
									local val = &amp;quot;&amp;quot;&lt;br /&gt;
									-- handler for wikibase-item&lt;br /&gt;
									if v4.datatype == &amp;quot;wikibase-item&amp;quot; then&lt;br /&gt;
										val = v4.datavalue.value.id&lt;br /&gt;
										val = mw.wikibase.getLabel(val) or val&lt;br /&gt;
									else&lt;br /&gt;
										val = mw.wikibase.renderSnak(v4)&lt;br /&gt;
									end&lt;br /&gt;
									-- assemble qualifiers&lt;br /&gt;
									out = out .. &amp;quot;++ &amp;quot; .. (mw.wikibase.getLabel(k3) or k3) .. &amp;quot; = &amp;quot; .. val .. &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
								end -- loop through posible multiple qual values&lt;br /&gt;
							end -- loop through qualifiers&lt;br /&gt;
						end -- test for qualifiers&lt;br /&gt;
					end -- test for wikibase item&lt;br /&gt;
				end -- loop through props2 values&lt;br /&gt;
			end -- test for claims in indirect item&lt;br /&gt;
		end -- test for wikibase item&lt;br /&gt;
	end -- loop through props1 values&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- nowiki ensures that a string of text is treated by the MediaWiki software as just a string&lt;br /&gt;
-- it takes an unnamed parameter and trims whitespace&lt;br /&gt;
p.nowiki = function(frame)&lt;br /&gt;
	local str = mw.text.trim(frame.args[1] or &amp;quot;&amp;quot;)&lt;br /&gt;
	return mw.text.nowiki(str)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.stripApost = function(frame)&lt;br /&gt;
	txt = frame.args[1] or &amp;quot;&amp;quot;&lt;br /&gt;
	txt = txt:gsub(&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;quot;, &amp;quot;&amp;quot;):gsub(&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;quot;, &amp;quot;&amp;quot;):gsub(&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot;, &amp;quot;&amp;quot;):gsub(&amp;quot;&amp;#039;&amp;#039;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	return txt&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- mwlangs examines all the fallback languages set in MediaWiki&lt;br /&gt;
-- outputs the sizes of all the longest chains&lt;br /&gt;
p.mwlangs = function(frame)&lt;br /&gt;
	thold = tonumber(frame.args[1]) or 2&lt;br /&gt;
	local langtbl = mw.language.fetchLanguageNames()&lt;br /&gt;
	local sizetbl = {}&lt;br /&gt;
	out = &amp;quot;&amp;quot;&lt;br /&gt;
	for code, name in pairs(langtbl) do&lt;br /&gt;
		local fbtbl = mw.language.getFallbacksFor(code)&lt;br /&gt;
		local num = #fbtbl&lt;br /&gt;
		if num &amp;gt; thold then&lt;br /&gt;
			sizetbl[code] = num&lt;br /&gt;
			out = out .. code .. &amp;quot; -- &amp;quot; .. num .. &amp;quot; -- &amp;quot; .. table.concat(fbtbl, &amp;quot;, &amp;quot;) .. &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- getSitelinks returns the collection of sitelinks for qid and the number of sitelinks&lt;br /&gt;
local _getsitelinks = function(qid)&lt;br /&gt;
	local ent = mw.wikibase.getEntity(qid)&lt;br /&gt;
	if not ent then return {}, -1 end&lt;br /&gt;
	local slinks = ent.sitelinks&lt;br /&gt;
	if not slinks then return {}, 0 end&lt;br /&gt;
	local out = {}&lt;br /&gt;
	local count = 0&lt;br /&gt;
	for k, v in pairs( slinks ) do&lt;br /&gt;
		out[k] = v.title&lt;br /&gt;
		count = count + 1&lt;br /&gt;
	end&lt;br /&gt;
	return out, count&lt;br /&gt;
end&lt;br /&gt;
p.getSitelinks = function(frame)&lt;br /&gt;
	local qid = (frame.args[1] or frame.args.qid or &amp;quot;&amp;quot;):upper()&lt;br /&gt;
	if qid == &amp;quot;&amp;quot; then qid = nil end&lt;br /&gt;
	local sltbl, sizesltbl = _getsitelinks(qid)&lt;br /&gt;
	if sizesltbl == -1 then return &amp;quot;No Wikidata entry&amp;quot; end&lt;br /&gt;
	if sizesltbl == 0 then return &amp;quot;No sitelinks&amp;quot; end&lt;br /&gt;
	return mw.dumpObject( sltbl )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- just a placeholder for doing tests&lt;br /&gt;
p.test = function(frame)&lt;br /&gt;
	local thisTitle = mw.title.getCurrentTitle().text&lt;br /&gt;
	return thisTitle&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- cvt2m takes a string containing a number and some length symbol&lt;br /&gt;
-- and converts it into metres, returning just the plain number of metres&lt;br /&gt;
p.cvt2m = function(frame)&lt;br /&gt;
	local len = mw.text.trim(frame.args[1] or &amp;quot;&amp;quot;)&lt;br /&gt;
	if len == &amp;quot;&amp;quot; then len = &amp;quot;0 m&amp;quot; end&lt;br /&gt;
	local amt = len:match(&amp;quot;([%d%.%,]+)&amp;quot;) or &amp;quot;0&amp;quot;&lt;br /&gt;
	local unit = len:match(&amp;quot;(%w+)$&amp;quot;) or &amp;quot;m&amp;quot;&lt;br /&gt;
	local conv = frame:expandTemplate{ title = &amp;quot;Cvt&amp;quot;, args = {amt, unit, &amp;quot;m&amp;quot;} }&lt;br /&gt;
	return conv:match(&amp;quot;%(([%d%.%,]+)&amp;quot;) or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Izno</name></author>
	</entry>
</feed>