<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://safernicotine.wiki/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AInformation</id>
	<title>Module:Information - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://safernicotine.wiki/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AInformation"/>
	<link rel="alternate" type="text/html" href="https://safernicotine.wiki/mediawiki/index.php?title=Module:Information&amp;action=history"/>
	<updated>2026-04-24T14:09:40Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://safernicotine.wiki/mediawiki/index.php?title=Module:Information&amp;diff=12032&amp;oldid=prev</id>
		<title>Richardpruen: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://safernicotine.wiki/mediawiki/index.php?title=Module:Information&amp;diff=12032&amp;oldid=prev"/>
		<updated>2021-11-23T12:11:19Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en-GB&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 13:11, 23 November 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;en-GB&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key uk_vapewiki:diff:1.41:old-12031:rev-12032 --&gt;
&lt;/table&gt;</summary>
		<author><name>Richardpruen</name></author>
	</entry>
	<entry>
		<id>https://safernicotine.wiki/mediawiki/index.php?title=Module:Information&amp;diff=12031&amp;oldid=prev</id>
		<title>Wikimedia+Commons&gt;Jarekt: allow &quot;strict=false&quot; in lua-only mode</title>
		<link rel="alternate" type="text/html" href="https://safernicotine.wiki/mediawiki/index.php?title=Module:Information&amp;diff=12031&amp;oldid=prev"/>
		<updated>2021-01-23T03:51:55Z</updated>

		<summary type="html">&lt;p&gt;allow &amp;quot;strict=false&amp;quot; in lua-only mode&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[  &lt;br /&gt;
  __  __           _       _        ___        __                            _   _             &lt;br /&gt;
 |  \/  | ___   __| |_   _| | ___ _|_ _|_ __  / _| ___  _ __ _ __ ___   __ _| |_(_) ___  _ __  &lt;br /&gt;
 | |\/| |/ _ \ / _` | | | | |/ _ (_)| || &amp;#039;_ \| |_ / _ \| &amp;#039;__| &amp;#039;_ ` _ \ / _` | __| |/ _ \| &amp;#039;_ \ &lt;br /&gt;
 | |  | | (_) | (_| | |_| | |  __/_ | || | | |  _| (_) | |  | | | | | | (_| | |_| | (_) | | | |&lt;br /&gt;
 |_|  |_|\___/ \__,_|\__,_|_|\___(_)___|_| |_|_|  \___/|_|  |_| |_| |_|\__,_|\__|_|\___/|_| |_|&lt;br /&gt;
                                                                                               &lt;br /&gt;
This module is intended to be the engine behind &amp;quot;Template:Information&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Please do not modify this code without applying the changes first at&lt;br /&gt;
&amp;quot;Module:Information/sandbox&amp;quot; and testing at &amp;quot;Module:Information/testcases&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Authors and maintainers:&lt;br /&gt;
* User:Jarekt - original version &lt;br /&gt;
]]&lt;br /&gt;
-- =======================================&lt;br /&gt;
-- === Dependencies ======================&lt;br /&gt;
-- =======================================&lt;br /&gt;
require(&amp;#039;Module:No globals&amp;#039;) -- used for debugging purposes as it detects cases of unintended global variables&lt;br /&gt;
local ISOdate = require(&amp;#039;Module:ISOdate&amp;#039;)._ISOdate -- date localization&lt;br /&gt;
local core    = require(&amp;#039;Module:Core&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
-- ==================================================&lt;br /&gt;
-- === Internal functions ===========================&lt;br /&gt;
-- ==================================================&lt;br /&gt;
&lt;br /&gt;
local function langWrapper(text, textLang) &lt;br /&gt;
-- code equivalent to https://commons.wikimedia.org/wiki/Template:Description&lt;br /&gt;
	local language = mw.language.new( textLang )&lt;br /&gt;
	local dir      = language:getDir()  &lt;br /&gt;
	local LangName = language:ucfirst(mw.language.fetchLanguageName( textLang, textLang))&lt;br /&gt;
	local str = mw.ustring.format(&amp;#039;&amp;lt;span class=&amp;quot;language %s&amp;quot;&amp;gt;&amp;lt;b&amp;gt;%s:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&amp;#039;, textLang, LangName)&lt;br /&gt;
    return mw.ustring.format(&amp;#039;&amp;lt;div class=&amp;quot;description mw-content-%s&amp;quot; dir=&amp;quot;%s&amp;quot; lang=&amp;quot;%s&amp;quot;&amp;gt;%s %s&amp;lt;/div&amp;gt;&amp;#039;, dir, dir, textLang, str, text)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
local function getBareLabel(id, userLang) &lt;br /&gt;
-- code equivalent to require(&amp;quot;Module:Wikidata label&amp;quot;)._getLabel with Wikidata=- option&lt;br /&gt;
	local label, link&lt;br /&gt;
	-- build language fallback list&lt;br /&gt;
	local langList = mw.language.getFallbacksFor(userLang)&lt;br /&gt;
	table.insert(langList, 1, userLang)&lt;br /&gt;
	for _, lang in ipairs(langList) do  -- loop over language fallback list looking for label in the specific language&lt;br /&gt;
		label = mw.wikibase.getLabelByLang(id, lang)&lt;br /&gt;
		if label then break end                    -- label found and we are done&lt;br /&gt;
	end	&lt;br /&gt;
	return label or id&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
local function message(name, lang)&lt;br /&gt;
	return mw.message.new( &amp;#039;wm-license-information-&amp;#039;..name ):inLanguage(lang):plain()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ====================================================================&lt;br /&gt;
-- === This function is just responsible for producing HTML of the  ===&lt;br /&gt;
-- === template. At this stage all the fields are already filed     ===&lt;br /&gt;
-- ====================================================================&lt;br /&gt;
local function Build_html(args)&lt;br /&gt;
	local lang = args.lang -- user&amp;#039;s language&lt;br /&gt;
	local dir  = mw.language.new( lang ):getDir()    -- get text direction&lt;br /&gt;
	local desTag = mw.ustring.format(&amp;#039;&amp;lt;span class=&amp;quot;summary fn&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&amp;#039;, args.pagename)&lt;br /&gt;
	local prmTag = mw.ustring.format(&amp;quot;&amp;lt;br /&amp;gt;&amp;lt;small&amp;gt;([[%s|%s]])&amp;lt;/small&amp;gt;&amp;quot;, message(&amp;#039;permission-reusing-link&amp;#039;, lang), &lt;br /&gt;
								 message(&amp;#039;permission-reusing-text&amp;#039;, lang))&lt;br /&gt;
&lt;br /&gt;
	-- field specific preferences&lt;br /&gt;
	local params = {&lt;br /&gt;
		{field=&amp;#039;description&amp;#039;    , id=&amp;#039;fileinfotpl_desc&amp;#039;, tag2=desTag, td=&amp;#039;class=&amp;quot;description&amp;quot;&amp;#039;},&lt;br /&gt;
		{field=&amp;#039;other_fields_1&amp;#039;},&lt;br /&gt;
		{field=&amp;#039;date&amp;#039;           , id=&amp;#039;fileinfotpl_date&amp;#039;, td=mw.ustring.format(&amp;#039;lang=&amp;quot;%s&amp;quot;&amp;#039;, lang)},&lt;br /&gt;
		{field=&amp;#039;source&amp;#039;         , id=&amp;#039;fileinfotpl_src&amp;#039;}, &lt;br /&gt;
		{field=&amp;#039;author&amp;#039;         , id=&amp;#039;fileinfotpl_aut&amp;#039;},&lt;br /&gt;
		{field=&amp;#039;permission&amp;#039;     , id=&amp;#039;fileinfotpl_perm&amp;#039;, tag2=prmTag },&lt;br /&gt;
		{field=&amp;#039;other_versions&amp;#039; , id=&amp;#039;fileinfotpl_ver&amp;#039;,  tag=&amp;#039;other-versions&amp;#039;}, &lt;br /&gt;
		{field=&amp;#039;other_fields&amp;#039;},&lt;br /&gt;
	}&lt;br /&gt;
	local results = {}&lt;br /&gt;
	for _, param in ipairs(params) do&lt;br /&gt;
		local field, tag, cell1, cell2, id&lt;br /&gt;
		field = args[param.field]&lt;br /&gt;
		if param.id then -- skip &amp;quot;other fields&amp;quot; parameter&lt;br /&gt;
			if type(field) == &amp;#039;string&amp;#039; then  -- add &amp;quot;id&amp;quot; to first &amp;lt;td&amp;gt; cell only if the field is present&lt;br /&gt;
				id = mw.ustring.format(&amp;#039;id=&amp;quot;%s&amp;quot; &amp;#039;, param.id)&lt;br /&gt;
			elseif type(field) == &amp;#039;table&amp;#039; then&lt;br /&gt;
				-- the field was initially not present, it contains only our&lt;br /&gt;
				-- warning text; flatten it so that mw.ustring.format() gets a string&lt;br /&gt;
				field = field.missing&lt;br /&gt;
			end&lt;br /&gt;
			if field or (args.demo and param.tag) then  -- skip the row if still no field&lt;br /&gt;
				tag   = message(param.tag or param.field, lang) .. (param.tag2 or &amp;#039;&amp;#039;)&lt;br /&gt;
				cell1 = mw.ustring.format(&amp;#039;&amp;lt;td %sclass=&amp;quot;fileinfo-paramfield&amp;quot; lang=&amp;quot;%s&amp;quot;&amp;gt;%s&amp;lt;/td&amp;gt;\n&amp;#039;, id or &amp;#039;&amp;#039;, lang, tag)&lt;br /&gt;
				cell2 = mw.ustring.format(&amp;#039;&amp;lt;td %s&amp;gt;\n%s&amp;lt;/td&amp;gt;&amp;#039;, param.td or &amp;#039;&amp;#039;, field or &amp;#039;&amp;#039;)&lt;br /&gt;
				field = mw.ustring.format(&amp;#039;&amp;lt;tr style=&amp;quot;vertical-align: top&amp;quot;&amp;gt;\n%s%s\n&amp;lt;/tr&amp;gt;\n\n&amp;#039;, cell1, cell2)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(results, field)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- add table and outer layers&lt;br /&gt;
	local style = mw.ustring.format(&amp;#039;class=&amp;quot;fileinfotpl-type-information toccolours vevent &amp;#039;..&lt;br /&gt;
		&amp;#039;mw-content-%s&amp;quot; style=&amp;quot;width: 100%%; direction: %s;&amp;quot; cellpadding=&amp;quot;4&amp;quot;&amp;#039;, dir, dir)&lt;br /&gt;
	results = mw.ustring.format(&amp;#039;&amp;lt;table %s&amp;gt;\n\n%s\n&amp;lt;/table&amp;gt;\n&amp;#039;, style, table.concat(results))&lt;br /&gt;
	results = mw.ustring.format(&amp;#039;&amp;lt;div class=&amp;quot;hproduct commons-file-information-table&amp;quot;&amp;gt;\n%s\n&amp;lt;/div&amp;gt;&amp;#039;, results)&lt;br /&gt;
	return results&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==================================================&lt;br /&gt;
-- === External functions ===========================&lt;br /&gt;
-- ==================================================&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
-- === Version of the function to be called from other LUA codes&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- _information function creates a wikicode for {{Information}} template based on&lt;br /&gt;
-- passed arguments (through &amp;quot;args&amp;quot;) and data extracted from SDC. Allowed fields of &lt;br /&gt;
-- &amp;quot;args&amp;quot; are : &amp;#039;description&amp;#039;, &amp;#039;date&amp;#039;, &amp;#039;permission&amp;#039;, &amp;#039;author&amp;#039;, &amp;#039;other_versions&amp;#039;,  &lt;br /&gt;
-- &amp;#039;source&amp;#039;,&amp;#039;other_fields&amp;#039;, &amp;#039;other_fields_1&amp;#039;, &amp;#039;demo&amp;#039; and &amp;#039;lang&amp;#039;&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Dependencies: p._SDC_Description, p._SDC_Source, p._SDC_Author, p._SDC_Date, &lt;br /&gt;
--    Build_html, Module:ISOdate (_date)&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
function p._information(args)&lt;br /&gt;
&lt;br /&gt;
	local cats = &amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	-- ============================================================================================&lt;br /&gt;
	-- === add [[Category:Pages using Information template with incorrect parameter]] if needed ===&lt;br /&gt;
	-- ============================================================================================&lt;br /&gt;
	local page = mw.title.getCurrentTitle()&lt;br /&gt;
	local lang = args.lang&lt;br /&gt;
	local namespace = page.namespace   -- get page namespace&lt;br /&gt;
	if namespace==6 or namespace==10 then&lt;br /&gt;
		local allowedFields = {&amp;#039;description&amp;#039;, &amp;#039;date&amp;#039;, &amp;#039;permission&amp;#039;, &amp;#039;author&amp;#039;, &amp;#039;other_versions&amp;#039;,  &lt;br /&gt;
				&amp;#039;source&amp;#039;,&amp;#039;other_fields&amp;#039;, &amp;#039;other_fields_1&amp;#039;, &amp;#039;demo&amp;#039;, &amp;#039;lang&amp;#039;, &amp;#039;strict&amp;#039;}&lt;br /&gt;
		local set, badField = {}, {}&lt;br /&gt;
		for _, field in ipairs(allowedFields) do set[field] = true end&lt;br /&gt;
		for field, _ in pairs( args ) do &lt;br /&gt;
			if not set[field] then&lt;br /&gt;
				table.insert(badField, field)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if #badField&amp;gt;0 then&lt;br /&gt;
			cats = mw.ustring.format(&amp;#039;\n;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Error in [[Template:Information|{{Information}}&amp;#039;..&lt;br /&gt;
				&amp;#039; template]]: unknown parameter &amp;quot;%s&amp;quot;.&amp;lt;/span&amp;gt;&amp;#039;,  table.concat(badField,&amp;#039;&amp;quot;, &amp;quot;&amp;#039;))&lt;br /&gt;
			cats = cats .. &amp;#039;\n[[Category:Pages using Information template with incorrect parameter]]&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if args.date then&lt;br /&gt;
		-- apply ISODate to function to date string to convert date in ISO format to translated date string&lt;br /&gt;
		args.date = ISOdate(args.date, lang, &amp;#039;&amp;#039;, &amp;#039;dtstart&amp;#039;, &amp;#039;100-999&amp;#039;)      &lt;br /&gt;
	end &lt;br /&gt;
	args.pagename = page.text&lt;br /&gt;
&lt;br /&gt;
	-- ====================================================&lt;br /&gt;
	-- === harvest structured data                      === &lt;br /&gt;
	-- ====================================================&lt;br /&gt;
	local entity = mw.wikibase.getEntity()&lt;br /&gt;
	if namespace==6 and entity then -- file namespace&lt;br /&gt;
		-- call SDC functions only when needed&lt;br /&gt;
		local icon = true&lt;br /&gt;
		-- local field is missing -&amp;gt; get it from SDC&lt;br /&gt;
		args.description = args.description or p._SDC_Description(entity, lang, icon)  &lt;br /&gt;
		args.source      = args.source      or p._SDC_Source(entity, lang, icon)&lt;br /&gt;
		args.author      = args.author      or p._SDC_Author(entity, lang, icon) &lt;br /&gt;
		args.date        = args.date        or p._SDC_Date(entity, lang, icon)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- ====================================================&lt;br /&gt;
	-- === add tracking templates and categories        === &lt;br /&gt;
	-- ====================================================&lt;br /&gt;
	-- add the template tag (all official infoboxes transclude {{Infobox template tag}} so files without that tag do not have an infobox&lt;br /&gt;
	mw.getCurrentFrame():expandTemplate{ title = &amp;#039;Infobox template tag&amp;#039; } &lt;br /&gt;
&lt;br /&gt;
	-- files are required to have at least the 3 fields below&lt;br /&gt;
	if args.strict~=false then&lt;br /&gt;
		local reqFields = {description=&amp;#039;Media lacking a description&amp;#039;, author=&amp;#039;Media lacking author information&amp;#039;, source=&amp;#039;Images without source&amp;#039;}&lt;br /&gt;
		for field, errCat in pairs(reqFields) do &lt;br /&gt;
			if args[field] and mw.ustring.match(args[field],&amp;quot;^[%s%p]+$&amp;quot;) then &lt;br /&gt;
				args[field]=nil; &lt;br /&gt;
			end -- ignore punctuation only fields&lt;br /&gt;
			if not args[field] then&lt;br /&gt;
				-- code equivalent to Template:Source missing, Template:Author missing, Template:Description missing&lt;br /&gt;
				local tag1 = &amp;#039;class=&amp;quot;boilerplate metadata&amp;quot; id=&amp;quot;cleanup&amp;quot; style=&amp;quot;text-align: center; background: #ffe; &amp;#039;..&lt;br /&gt;
					&amp;#039;margin: .75em 15%; padding: .5em; border: 1px solid #e3e3b0;&amp;#039;&lt;br /&gt;
				local tag2 = message(field..&amp;#039;-missing&amp;#039;, lang)&lt;br /&gt;
				local tag3 = message(field..&amp;#039;-missing-request&amp;#039;, lang)&lt;br /&gt;
				local dir  = mw.language.new( lang ):getDir()    -- get text direction&lt;br /&gt;
				args[field] = {missing =  mw.ustring.format(&amp;#039;&amp;lt;div %s direction: %s;&amp;quot; lang=&amp;quot;%s&amp;quot;&amp;gt;%s\n%s\n&amp;lt;/div&amp;gt;&amp;#039;, tag1, dir, lang, tag2, tag3)}&lt;br /&gt;
				cats = cats .. &amp;#039;\n[[Category:&amp;#039;.. errCat ..&amp;#039;]]&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if namespace~=6  then &lt;br /&gt;
		cats = &amp;#039;&amp;#039; -- categories are added only to files&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return Build_html(args) .. cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- interface for other Lua codes to 5 functions for extracting description, source,&lt;br /&gt;
-- author, date and location information from SDC. &lt;br /&gt;
-- INPUTS:&lt;br /&gt;
--  - &amp;quot;entity&amp;quot; - structure created by mw.wikibase.getEntity function&lt;br /&gt;
--  - &amp;quot;lang&amp;quot;  - users language&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Dependencies: langWrapper&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
function p._SDC_Description(entity, lang, icon)&lt;br /&gt;
	-- create {{en|1=...}} template with SDC&amp;#039;s caption&lt;br /&gt;
	local description, _&lt;br /&gt;
	if entity and entity.labels then -- get label in users language or one of that language fallback list&lt;br /&gt;
		local label = core.langSwitch(entity.labels, lang) &lt;br /&gt;
		local labels, D = {}, {}&lt;br /&gt;
		if label then -- show either matching language&lt;br /&gt;
			labels[lang] = label&lt;br /&gt;
		else -- or if missing then show all&lt;br /&gt;
			labels = entity.labels&lt;br /&gt;
		end&lt;br /&gt;
		for _, label in pairs(labels) do -- add {{en|1=....}} like wrapper&lt;br /&gt;
			if icon and #D==0 then -- add editAtSDC icon to the first description&lt;br /&gt;
				label.value = label.value .. core.editAtSDC(&amp;#039;ooui-php-4&amp;#039;, lang)&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(D, langWrapper(label.value, label.language, lang))&lt;br /&gt;
		end &lt;br /&gt;
		description = table.concat(D, &amp;#039;\n&amp;#039;) &lt;br /&gt;
	end&lt;br /&gt;
	return description&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Dependencies: Module:Wikidata_date &amp;quot;_date&amp;quot; function, Module:ISOdate &amp;quot;_ISOdate&amp;quot; function&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
function p._SDC_Date(entity, lang, icon)&lt;br /&gt;
	-- get creation date from  P571 (inception)&lt;br /&gt;
	-- Code can handle YYYY-MM-DD, YYYY-MM, and YYYY dates without any additional resources&lt;br /&gt;
	-- But can load [[Module:Wikidata date]] if needed&lt;br /&gt;
	local Date&lt;br /&gt;
	if entity and entity.claims and entity.claims.P571 then&lt;br /&gt;
		local snak = entity.claims.P571[1].mainsnak&lt;br /&gt;
		if (snak.snaktype == &amp;quot;value&amp;quot;) then &lt;br /&gt;
			local v = snak.datavalue.value&lt;br /&gt;
			if v and (v.calendarmodel==&amp;#039;http://www.wikidata.org/entity/Q1985727&amp;#039;) and (mw.ustring.sub(v.time,1,1)==&amp;#039;+&amp;#039;) then &lt;br /&gt;
				if v.precision &amp;gt;= 11 then            -- day&lt;br /&gt;
					Date = mw.ustring.sub(v.time,2,11)   -- date in YYYY-MM-DD format&lt;br /&gt;
				elseif v.precision == 10 then        -- month&lt;br /&gt;
					Date = mw.ustring.sub(v.time,2,8)    -- date in YYYY-MM format&lt;br /&gt;
				elseif v.precision == 9 then         -- year&lt;br /&gt;
					Date = mw.ustring.sub(v.time,2,5)    -- date in YYYY format&lt;br /&gt;
				end&lt;br /&gt;
				if Date then -- translate&lt;br /&gt;
					Date = ISOdate(Date, lang, &amp;#039;&amp;#039;, &amp;#039;dtstart&amp;#039;, &amp;#039;100-999&amp;#039;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if entity.claims.P571[1].qualifiers then                  -- non-trivial case: call heavy cavalery&lt;br /&gt;
			local getDate = require(&amp;quot;Module:Wikidata date&amp;quot;)._date -- lazy loading: load only if needed&lt;br /&gt;
			local result  = getDate(entity, &amp;#039;P571&amp;#039;, lang)         -- display the date in user&amp;#039;s language&lt;br /&gt;
			Date = result.str&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if icon and Date then&lt;br /&gt;
		Date = Date .. core.editAtSDC(&amp;#039;P571&amp;#039;, lang)&lt;br /&gt;
	end&lt;br /&gt;
	return Date&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Dependencies: none&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
function p._SDC_Source(entity, lang, icon)&lt;br /&gt;
	-- get source from P7482 (source of file)&lt;br /&gt;
	-- Code can handle {{Own}} template and URLs &lt;br /&gt;
	local source, label&lt;br /&gt;
	if entity and entity.claims and entity.claims.P7482 then&lt;br /&gt;
		local statement = entity.claims.P7482[1]&lt;br /&gt;
		-- get URL is source  is &amp;quot; file available on the internet (Q74228490) &amp;quot; &lt;br /&gt;
		if statement.mainsnak.datavalue.value.id==&amp;#039;Q74228490&amp;#039; and statement.qualifiers and statement.qualifiers.P973 then&lt;br /&gt;
			source = statement.qualifiers.P973[1].datavalue.value -- described at URL&lt;br /&gt;
			if statement.qualifiers.P137 then -- &amp;quot;operator&amp;quot;&lt;br /&gt;
				local id = statement.qualifiers.P137[1].datavalue.value.id&lt;br /&gt;
				label = getBareLabel(id, lang)&lt;br /&gt;
				source  = &amp;#039;[&amp;#039; .. source ..&amp;#039; &amp;#039; .. label ..&amp;#039;]&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- add {{tl|own}} if source is &amp;quot;original creation by uploader (Q66458942)&amp;quot; &lt;br /&gt;
		if statement.mainsnak.datavalue.value.id==&amp;#039;Q66458942&amp;#039; then&lt;br /&gt;
			label = mw.message.new( &amp;#039;Wm-license-own-work&amp;#039;):inLanguage(lang):plain()&lt;br /&gt;
			source = mw.ustring.format(&amp;#039;&amp;lt;span class=&amp;quot;int-own-work&amp;quot; lang=&amp;quot;%s&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&amp;#039;,lang, label)&lt;br /&gt;
		end&lt;br /&gt;
		-- add {{tl|Own work by the original uploader}} if source is &amp;quot; Own work by the original uploader (Q87402110)&amp;quot; &lt;br /&gt;
		if statement.mainsnak.datavalue.value.id==&amp;#039;Q87402110&amp;#039; then&lt;br /&gt;
			label  = getBareLabel(&amp;#039;Q87402110&amp;#039;, lang)&lt;br /&gt;
			source = mw.ustring.format(&amp;#039;&amp;lt;span class=&amp;quot;int-own-work&amp;quot; lang=&amp;quot;%s&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&amp;#039;,lang, label)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if icon and source then&lt;br /&gt;
		source = source .. core.editAtSDC(&amp;#039;P7482&amp;#039;, lang)&lt;br /&gt;
	end&lt;br /&gt;
	return source&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Dependencies: Module:Core &amp;quot;getLabel&amp;quot; function&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
function p._SDC_Author(entity, lang, icon)&lt;br /&gt;
	-- get author from P170 (creator)&lt;br /&gt;
	-- Code can handle usuall cases of &amp;quot;[[User:Example|Example]]&amp;quot; as well as users with Wikidata Item IDs&lt;br /&gt;
	local author&lt;br /&gt;
	if entity and entity.claims and entity.claims.P170 then&lt;br /&gt;
		local creators = {}&lt;br /&gt;
		for _,statement in ipairs(entity.claims.P170) do&lt;br /&gt;
			if statement.mainsnak.snaktype == &amp;quot;value&amp;quot; then  -- Creator has item ID    &lt;br /&gt;
				local val = statement.mainsnak.datavalue.value.id&lt;br /&gt;
				table.insert(creators, core.getLabel(val, lang))&lt;br /&gt;
			elseif statement.mainsnak.snaktype == &amp;quot;somevalue&amp;quot; then -- Creator defined by username&lt;br /&gt;
				if statement.qualifiers then -- author name string (P2093) &lt;br /&gt;
				    local qual = {}&lt;br /&gt;
					local properties = {P2093=&amp;#039;authorStr&amp;#039;, P4174=&amp;#039;username&amp;#039;, P3831=&amp;#039;role&amp;#039;, P2699=&amp;#039;url&amp;#039;}&lt;br /&gt;
					for prop, field in pairs( properties ) do&lt;br /&gt;
						if statement.qualifiers[prop] then&lt;br /&gt;
							qual[field] = statement.qualifiers[prop][1].datavalue.value&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					local role = &amp;#039;&amp;#039;&lt;br /&gt;
					if qual.role and entity.claims.P170[2] then -- add role only is multiple creators&lt;br /&gt;
						role = &amp;#039;&amp;amp;nbsp;(&amp;#039; .. core.getLabel(qual.role.id, lang) .. &amp;#039;)&amp;#039;&lt;br /&gt;
					end&lt;br /&gt;
					if qual.username and qual.authorStr then         --    author name string (P2093) &amp;amp; Wikimedia username (P4174) &lt;br /&gt;
						table.insert(creators, &amp;#039;[[User:&amp;#039;..qual.username..&amp;#039;|&amp;#039;..qual.authorStr..&amp;#039;]]&amp;#039;..role)&lt;br /&gt;
					elseif qual.username and not qual.authorStr then -- no author name string (P2093) &amp;amp; Wikimedia username (P4174) &lt;br /&gt;
						table.insert(creators, &amp;#039;[[User:&amp;#039;..qual.username..&amp;#039;|&amp;#039;..qual.username..&amp;#039;]]&amp;#039;..role)&lt;br /&gt;
					elseif qual.url and qual.authorStr then          --    author name string (P2093) &amp;amp; URL (P2699) &lt;br /&gt;
						table.insert(creators, &amp;#039;[&amp;#039;..qual.url..&amp;#039; &amp;#039;..qual.authorStr..&amp;#039;]&amp;#039;..role)&lt;br /&gt;
					elseif qual.url and not qual.authorStr then      -- no author name string (P2093) &amp;amp; URL (P2699) &lt;br /&gt;
						table.insert(creators, qual.url..role)&lt;br /&gt;
					elseif  qual.authorStr then                      --    author name string (P2093) &lt;br /&gt;
						table.insert(creators, qual.authorStr..role)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end -- end for&lt;br /&gt;
		author = table.concat(creators, &amp;#039;, &amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if icon and author then&lt;br /&gt;
		author = author .. core.editAtSDC(&amp;#039;P170&amp;#039;, lang)&lt;br /&gt;
	end&lt;br /&gt;
	return author&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Dependencies: Module:Code &amp;quot;getLabel&amp;quot; function&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
function p._SDC_Location(entity, lang, icon)&lt;br /&gt;
	-- get location  P276 (location)&lt;br /&gt;
	local location, prop&lt;br /&gt;
	if entity and entity.claims and entity.claims.P1071 then&lt;br /&gt;
		local snak = entity.claims.P1071[1].mainsnak&lt;br /&gt;
		if (snak.snaktype == &amp;quot;value&amp;quot;) then &lt;br /&gt;
			location = core.getLabel(snak.datavalue.value.id, lang)&lt;br /&gt;
			prop = &amp;#039;P1071&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if entity and entity.claims and entity.claims.P276 then&lt;br /&gt;
		local snak = entity.claims.P276[1].mainsnak&lt;br /&gt;
		if (snak.snaktype == &amp;quot;value&amp;quot;) then &lt;br /&gt;
			location = core.getLabel(snak.datavalue.value.id, lang)&lt;br /&gt;
			prop = &amp;#039;P276&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if icon and location then&lt;br /&gt;
		location = location .. core.editAtSDC(prop, lang)&lt;br /&gt;
	end&lt;br /&gt;
	return location&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
-- === Version of the functions to be called from template namespace&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- information function creates a wikicode for {{Information}} template based on&lt;br /&gt;
-- passed arguments (through &amp;quot;frame&amp;quot;) and data extracted from SDC. Allowed template&lt;br /&gt;
-- arguments are : &amp;#039;description&amp;#039;, &amp;#039;date&amp;#039;, &amp;#039;permission&amp;#039;, &amp;#039;author&amp;#039;, &amp;#039;other_versions&amp;#039;,  &lt;br /&gt;
-- &amp;#039;source&amp;#039;,&amp;#039;other_fields&amp;#039;, &amp;#039;other_fields_1&amp;#039;, &amp;#039;demo&amp;#039; and &amp;#039;lang&amp;#039;. All inputs do not &lt;br /&gt;
-- depend on capitalization and all &amp;quot;_&amp;quot; can be replaced with spaces.&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Dependencies: p._information&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
function p.information(frame)&lt;br /&gt;
	local args = core.getArgs(frame)&lt;br /&gt;
	args.strict = true&lt;br /&gt;
	return p._information(args)	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- interface for templates to 5 functions for extracting description, source,&lt;br /&gt;
-- author, date and location information from SDC. &lt;br /&gt;
-- INPUTS (templaate parameters):&lt;br /&gt;
--  * &amp;quot;mid&amp;quot;   - pageID defining a file. Optional, defaulting to the current file.&lt;br /&gt;
--  * &amp;quot;lang&amp;quot;  - users language. Optional defaulting to the language of the user&lt;br /&gt;
--  * &amp;quot;icon&amp;quot;  - add &amp;quot;Edit this at Wikidata&amp;quot; icon? boolean ( &amp;#039;true&amp;#039;/&amp;#039;false&amp;#039;, &amp;#039;yes&amp;#039;/&amp;#039;no&amp;#039;, 1/0&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Dependencies: getEntity&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
local function parseFrame(frame)&lt;br /&gt;
	local args = core.getArgs(frame)&lt;br /&gt;
	local entity = mw.wikibase.getEntity( args.mid )&lt;br /&gt;
	local icon   = core.yesno(args.icon, true)&lt;br /&gt;
	return {entity, args.lang, icon}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.SDC_Description(frame)&lt;br /&gt;
	return p._SDC_Description(unpack(parseFrame(frame)))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.SDC_Source(frame)&lt;br /&gt;
	return p._SDC_Source(unpack(parseFrame(frame)))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.SDC_Author(frame)&lt;br /&gt;
	return p._SDC_Author(unpack(parseFrame(frame)))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.SDC_Date(frame)&lt;br /&gt;
	return p._SDC_Date(unpack(parseFrame(frame)))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.SDC_Location(frame)&lt;br /&gt;
	return p._SDC_Location(unpack(parseFrame(frame)))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- List of exported functions&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- information&lt;br /&gt;
-- SDC_Description&lt;br /&gt;
-- SDC_Source&lt;br /&gt;
-- SDC_Author&lt;br /&gt;
-- SDC_Date&lt;br /&gt;
-- SDC_Location&lt;/div&gt;</summary>
		<author><name>Wikimedia+Commons&gt;Jarekt</name></author>
	</entry>
</feed>