Module:Europeana280Table

From Wikidata
Jump to navigation Jump to search
Lua
CodeDiscussionLinksLink count SubpagesDocumentationTestsResultsSandboxLive code All modules

Documentation for this module may be created at Module:Europeana280Table/doc

Code

-- Europeana280Table: builds a list of articles based on information from Wikidata
-- Sample use: {{#invoke:Europeana280Table|table|Q1|Q2|Q3|Q4|Q5}}
-- Can be used to list 400+ articles on 1 page
-- by User:Voll, with additions by Halibutt, Braveheart, Jura1
-- Original at https://meta.wikimedia.org/wiki/Module:WikimediaCEETable.
--
local langTable = { 'ar', 'ast', 'bg', 'br', 'ca', 'cs', 'cy', 'da', 'de',  'el',  'en', 'es', 'et', 'eu', 'ext', 'nl', 'fi', 'fr', 'ga', 'gsw', 'gl', 'he',  'hr', 'hu', 'it', 'lt', 'lv', 'mt', 'nn',  'no', 'oc', 'pl', 'pt', 'ro', 'se', 'sk', 'sl', 'sv', 'uk'}

local p = {}

local function def(bla)
  local zdef = {}
  for _, l in ipairs(bla) do zdef[l] = true end
  return zdef
end

function p.table(frame)
	-- header/init
	resultTable = '{| class="wikitable unsortable plainlinks" width=100%\n|-\n !! style="width:15%"|Wikidata item !! class="unsortable"| ar !! class="unsortable"| ast !! class="unsortable"| bg !! class="unsortable"| br !! class="unsortable"| ca !! class="unsortable"| cs !! class="unsortable"| cy !! class="unsortable"| da !! class="unsortable"| de !! class="unsortable"| el !! class="unsortable"| en !! class="unsortable"| es !! class="unsortable"| et !! class="unsortable"| eu !! class="unsortable"| ext !! class="unsortable"| nl !! class="unsortable"| fi !! class="unsortable"| fr !! class="unsortable"| ga !! class="unsortable"| gsw !! class="unsortable"| gl !! class="unsortable"| he !! class="unsortable"| hr !! class="unsortable"| hu !! class="unsortable"| it !! class="unsortable"| lt !! class="unsortable"| lv !! class="unsortable"| mt !! class="unsortable"| nn !! class="unsortable"| no !! class="unsortable"| oc !! class="unsortable"| pl !! class="unsortable"| pt !! class="unsortable"| ro !! class="unsortable"| se !! class="unsortable"| sk !! class="unsortable"| sl !! class="unsortable"| sv !! class="unsortable"| uk !! Σ  !! <span title="number of main statements on item">st.</span> \n|-'
	index = 1
	ctt = {}
	statementst = 0
	coords = 0
	images = 0
	wqsitems = ""
	qids = ""
	timeline = 0
	mylang = frame:preprocess('{{int:lang}}')
	for langCount = 1, #langTable do
		ctt[langCount] = 0
	end
	nolinks = false
	
	-- rows
	while frame.args[index] do
		Id = frame.args[index]
		if Id == 'nolinks' then
			nolinks = true
			index = index + 1
		else
			local entity = mw.wikibase.getEntityObject(Id)
			-- if not entity or not entity.sitelinks then
			if not entity then
				return '<b>Entity ' .. Id .. ' not found</b>'
			end
			Label = entity:getLabel( 'en' )
			if not Label then
				Label = ''
			end
	   		local ensitelink = entity:getSitelink( 'enwiki' )
			if ensitelink then
				if Label == '' then
					Label = ensitelink
				end
			end
	    	result2 = ''
	    	ct = 0
	    	wqsitems = wqsitems .. "wd%3A" .. Id .. "%20"
	    	qids = qids .. string.sub(Id, 2) .. ","
	    	idinternal = def { "P373", "P948", "P935", "P460", "P856", "P910", "P213", "P1343", "P973", "P345", "P227", "P244","P1612", "P1472", "P1325" }
	    	commonsp = def {'P18','P10','P14','P15','P41','P51','P94','P109','P117','P154','P158','P181','P207','P242','P367', 'P373','P443','P491','P692','P935','P948','P989','P990','P996','P1442','P1472','P1543','P1612','P1621','P1766','P1801','P1846','P1943','P1944'}
	    	
	    	-- columns per row
	    	for langCount = 1, #langTable do
		   		local sitelink = entity:getSitelink( langTable[langCount] .. 'wiki' )
				if sitelink then
					result2 = result2 .. '\n| style="background:#cfc;"|' .. '[[' .. ':' .. langTable[langCount] .. ':' .. sitelink .. '| √ ]]'
					ct = ct + 1
					ctt[langCount] = ctt[langCount] + 1
					if Label == '' then
						Label = sitelink
					end
				elseif nolinks then
					result2 = result2 .. '\n| -'
				else
					result2 = result2 .. '\n| [//www.wikidata.org/w/index.php?title=Wikidata:Europeana_Art_History_Challenge/Content_Translation&withJS=MediaWiki:EuropeanaContentTranslation.js&itemid=' .. Id .. '&destlang=' .. langTable[langCount] .. ' +]'
				end
			end
		
			-- first cells of row
	    	result1 = '|-\n|align=left| [[d:' .. Id .. '|' .. Label .. ']]'
			local sex = entity:formatPropertyValues( 'P21' ).value
			if sex then
				if sex == 'female' then
					result1 = result1 .. ' [[File:Female Icon.svg|18px]]'
				end
			end
			local p31 = entity:formatPropertyValues( 'P31' ).value
			if p31 then
				if p31 == 'human' then
					local yr = "%d%d%d%d$"
					local p569 = entity:formatPropertyValues( 'P569' ).value
					if p569 ~= "" then
						if p569:match(yr) ~= nil then
							p569 = p569:match(yr)
						end
						local p570 = entity:formatPropertyValues( 'P570' ).value
						if p570 ~= "" then
							if p570:match(yr) ~= nil then
								p570 = p570:match(yr)
							end
							result1 = result1 .. ' <span style="font-size:smaller;font-weight:100">(' .. p569 .. '-' .. p570 .. ')</span> '
						else
							result1 = result1 .. ' <span style="font-size:smaller;font-weight:100">(b. ' .. p569 .. ')</span>'
						end
					else
						result1 = result1 .. ' <span style="font-size:smaller;font-weight:100">(?)</span>'
					end
				end
			end
			local tl = ""
			tl = tl .. entity:formatPropertyValues( 'P580' ).value
			tl = tl .. entity:formatPropertyValues( 'P569' ).value
			tl = tl .. entity:formatPropertyValues( 'P571' ).value
			tl = tl .. entity:formatPropertyValues( 'P582' ).value
			tl = tl .. entity:formatPropertyValues( 'P576' ).value
			tl = tl .. entity:formatPropertyValues( 'P577' ).value
			if tl ~= "" then
				timeline = timeline + 1
			end 
	
			local p625 = entity:formatPropertyValues( 'P625' ).value
	 		if p625 ~= "" then
					result1 = result1 .. "&nbsp;[[File:Geographylogo.svg|18px|view on maps|link=https://tools.wmflabs.org/geohack/geohack.php?language=en&pagename=" .. mw.uri.encode( Label, "PATH" ) .. "&params=" .. entity.claims.P625[1].mainsnak.datavalue.value.latitude .. "_N_" .. entity.claims.P625[1].mainsnak.datavalue.value.longitude .. "_E]]"
					coords = coords + 1
			end
			local p18 = entity:formatPropertyValues( 'P18' ).value
	 		if p18 ~= "" then
					images = images + 1
			end
			
			-- last cells of row
			index = index + 1

			local commons = false
			local statements = 0
			if entity.claims then
				for i, statement in pairs( entity.claims ) do
					if statement then
						if statement[1].mainsnak then
							if not idinternal[i] then
								if statement[1].mainsnak.datatype ~= 'external-id' then
	                   				statements = statements+1
	                   			end
	               			end
	               			if commonsp[i] then 
	               				commons = true
	               			end
						end
					end
				end
			end
			-- local statements = #entity:getProperties()
			statementst = statementst + statements
			resultTable = resultTable .. result1 .. result2 ..'\n| align=right style="font-size:smaller;"| ' .. ct .. '\n|style="background:#cfc;font-size:smaller;" align=right title="number of main statements on Wikidata item"|'.. statements .. '\n'
		end
	end
	
	-- footer
	tline = ""
	qids = qids:sub(1, -2) -- remove dangling comma
	if timeline > 2 then
		tline = "[https://tools.wmflabs.org/wikidata-timeline/#/timeline?query=" .. mw.uri.encode("items[" .. qids .. "]", "PATH" ) .. " →&nbsp;timeline]"
	end	
	mapme = ""
	if coords > 0 or images > 0 then
		mapme = "[https://query.wikidata.org/#%23%20click%20%22Execute%22%20to%20run%20the%20query%2C%20then%20%28on%20the%20right%20side%29%20below%20%22Display%22%20select%20the%20link%20%22Map%22%20or%20%22Image%20Grid%22%0ASELECT%20%0A%09%3Fitem%20%0A%09%3FitemLabel%20%0A%09%28GROUP_CONCAT%28%3FinstanceLabel%3B%20separator%3D%22%2C%20%22%29%20as%20%3Finstance_of%29%0A%09%28SAMPLE%28%3Fcoord%29%20as%20%3Fcoordinates%29%0A%09%28SAMPLE%28%3Fimg%29%20as%20%3Fimage%29%0AWHERE%0A{%0A%09VALUES%20%3Fitem%20{%20" .. wqsitems .. "%20}%0A%09OPTIONAL%20{%3Fitem%20wdt%3AP625%20%3Fcoord%20}%20.%20%20%0A%09OPTIONAL%20{%3Fitem%20wdt%3AP31%20%3Finstance%20}%20.%20%20%20%0A%20%20%09OPTIONAL%20{%3Fitem%20wdt%3AP18%20%3Fimg%20}%20.%20%20%20%0A%09SERVICE%20wikibase%3Alabel%20{%20bd%3AserviceParam%20wikibase%3Alanguage%20%22" .. mylang .. "%2Cen%22%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.%20%3Fitem%20rdfs%3Alabel%20%3FitemLabel%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.%20%3Finstance%20rdfs%3Alabel%20%3FinstanceLabel%20}%0A}%0AGROUP%20BY%20%3Fitem%20%3FitemLabel%20 →"
		if coords > 0 then
			mapme = mapme .. "&nbsp;map"
		end
		if images > 0 then
			mapme = mapme .. "&nbsp;gallery"
		end
		mapme = mapme .. "]"
	end
	local autolist = "[https://tools.wmflabs.org/autolist/?language=" .. mylang .. "&project=wikipedia&wdq=" .. mw.uri.encode("items[" .. qids .. "]", "PATH" ) .. "&run=Run&mode_manual=or&mode_cat=or&mode_wdq=not&mode_wdqs=or&mode_find=or&chunk_size=10000 →&nbsp;Autolist]"
	result1 = '|- align=right style="font-size:smaller" class="sortbottom"\n! Σ '  .. autolist .. mapme .. tline
	result2 = ''
	ct = 0
    for langCount = 1, #langTable do
			result2 = result2 .. '\n |' .. ctt[langCount]
			ct = ct + ctt[langCount]
	end
	resultTable = resultTable .. result1 .. result2 ..'\n| ' .. ct .. '\n|' .. statementst .. '\n'

	resultTable = resultTable .. '\n|}\n'
	return resultTable
end

return p