-- Shamelessly copied from :m:Module:WikimediaCEETable: builds a list of articles based on information from Wikidata -- Sample use:  -- 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. Please contribute amendments there and keep copies in sync with that version. -- local langTable = {'en', 'bn'}  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 sortable" width=100%\n|-\n! নং !! style="width:18%"|নিবন্ধ !! class="sortable" | ইংরেজি !! class="sortable" | বাংলা !! class="sortable" | Σ  !! উইকিউপাত্ত !! সাইটলিংক !! \n|-' 	index = 1 	ctt = {} 	statementst = 0 	coords = 0 	images = 0 	wqsitems = "" 	qids = "" 	timeline = 0 	mylang = frame:preprocess('') 	for langCount = 1, #langTable do 		ctt[langCount] = 0 	end 	 	-- rows 	while frame.args[index] do 		Id = frame.args[index] 		local entity = mw.wikibase.getEntityObject(Id) 		-- if not entity or not entity.sitelinks then 		if not entity then 			return 'Entity ' .. Id .. ' not found' 		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 				iw = langTable[langCount] 				if iw == "be_x_old" then iw = "be-tarask" end 				result2 = result2 .. '\n| style="background:#cfc;"|' .. ' ✔️' 				ct = ct + 1 				ctt[langCount] = ctt[langCount] + 1 				if Label ==  then 					Label = sitelink 				end 			else 				result2 = result2 .. '\n| -' 			end 		end 	 		-- first cells of row     	result1 = '|-\n|align=right|' .. index .. '\n|'     	if ensitelink then     		result1 = result1 .. '' .. Label ..''     	else     		result1 = result1 .. Label     	end  		-- icon for females (Q6581072 & Q1052281) 		local claims 		if entity.claims then 			claims = entity.claims["P21"] 		end 		if (claims and claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid" and claims[1].mainsnak.datavalue.value["numeric-id"] and (claims[1].mainsnak.datavalue.value["numeric-id"] == 6581072 or claims[1].mainsnak.datavalue.value["numeric-id"] == 1052281)) then 			result1 = result1 .. ' 18px' 		end    	  		-- years for humans (Q5) 		local claims 		if entity.claims then 			claims = entity.claims["P31"] 		end 		if (claims and claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid" and claims[1].mainsnak.datavalue.value["numeric-id"] and claims[1].mainsnak.datavalue.value["numeric-id"] == 5) 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 .. ' (' .. p569 .. '-' .. p570 .. ') ' 					else 						result1 = result1 .. ' (b. ' .. p569 .. ')' 					end 				else 					result1 = result1 .. ' (?)' 				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 .. " 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()  		-- todo : check for Commons sitelinks 		local commonsstr = "" 		if commons then 			commonsstr = '+' 			-- commonsstr = "".. mw.uri.encode( Label, "PATH" ) .. " +" 		end 		statementst = statementst + statements 		if statements == 0 then 			bgcolor = 		else 			bgcolor = 'background:#cfc;' 		end 		resultTable = resultTable .. result1 .. result2 ..'\n| align=right style="font-size:smaller;"| ' .. ct .. '\n| style="background:#cfc;" data-sort-value="' .. string.sub(Id, 2) .. '"|' .. Id .. ' \n|style="' .. bgcolor .. 'font-size:smaller;" align=right title="number of main statements on Wikidata item"|'.. statements .. '\n|style="background:#cfc;"|' .. commonsstr .. '\n' 	end 	 	-- footer 	tline = "" 	if timeline > 2 then 		tline = "" .. mw.uri.encode("items[" .. qids .. "", "PATH" ) .. " → 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%28DISTINCT%28%3FinstanceLabel%29%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}%09OPTIONAL%20{%3Fitem%20wdt%3AP625%20%3Fcoord1%20}%20.%0A%20%20%09OPTIONAL%20{%3Fitem%20wdt%3AP131%2Fwdt%3AP625%20%3Fcoord2%20}%20.%0A%20%20%09OPTIONAL%20{%3Fitem%20wdt%3AP276%2Fwdt%3AP625%20%3Fcoord3%20}%20.%0A%09BIND%28IF%28!BOUND%28%3Fcoord1%29%2C%28IF%28!BOUND%28%3Fcoord2%29%2C%3Fcoord3%2C%3Fcoord2%29%29%2C%3Fcoord1%29%20as%20%3Fcoord%29%0A%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 .. " map" 		end 		if images > 0 then 			mapme = mapme .. " gallery" 		end 		mapme = mapme .. "]" 	end 	local autolist = "" .. 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 → Autolist]" 	result1 = '|- align=right style="font-size:smaller" class="sortbottom"\n! Σ \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| data-sort-value="999999999999"| avg: ' .. math.floor(ct/(index-1)+0.5) .. '\\' .. math.floor(ct / #langTable + 0.5) .. '\\' .. math.floor( ct / #langTable / (index-1)*100 + 0.5) .. '%\n|' .. statementst .. '\n| 16px|Wikimedia Commons'  	resultTable = resultTable .. '\n|}\n' 	return resultTable end  -- WikimediaCEETable.count: counts articles from the list in certain wiki -- Sample use:  -- based on previous "table" function stripped from all the table formatting.  function p.count(frame)         resultText = '' 	anum = 2         wikianum = 0 	ctt = {}  	for langCount = 1, #langTable do 		ctt[langCount] = 0           	end 	 	while frame.args[anum] do           		Id = frame.args[anum]                 anum = anum + 1 		local entity = mw.wikibase.getEntityObject(Id)  		-- if not entity or not entity.sitelinks then    		if not entity then 			return 'Entity ' .. Id .. ' not found' 		end      	for langCount = 1, #langTable do 	   		local sitelink = entity:getSitelink( langTable[langCount] .. 'wiki' ) 			if sitelink then 				iw = langTable[langCount] 				if iw == "be_x_old" then iw = "be-tarask" end 				ctt[langCount] = ctt[langCount] + 1 			end 		end         end          anum = anum - 2                                  -- number of articles in certain wiki. Straight...         for langCount = 1, #langTable do                 if langTable[langCount] == frame.args[1] then wikianum = ctt[langCount] end         end  	resultText = wikianum .. '/' .. anum              -- result is two numbers with '/' separator  	return resultText end  return p