<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AFootball_map</id>
	<title>Module:Football map - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AFootball_map"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Football_map&amp;action=history"/>
	<updated>2026-06-13T19:17:10Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.3</generator>
	<entry>
		<id>https://mywikibiz.com/index.php?title=Module:Football_map&amp;diff=471758&amp;oldid=prev</id>
		<title>Zoran: Pywikibot 6.4.0</title>
		<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Football_map&amp;diff=471758&amp;oldid=prev"/>
		<updated>2021-07-15T21:45:36Z</updated>

		<summary type="html">&lt;p&gt;Pywikibot 6.4.0&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--require('Module:No globals')&lt;br /&gt;
-- All Lua modules on Wikipedia must begin by defining a variable that will hold their&lt;br /&gt;
-- externally accessible functions. They can have any name and may also hold data.&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local stadiumDatabase = require( &amp;quot;Module:Football map/data&amp;quot; ) -- configuration module&lt;br /&gt;
                          &lt;br /&gt;
-- main function callable in Wikipedia via the #invoke command.&lt;br /&gt;
p.main = function(frame) &lt;br /&gt;
	str = p.getMapframeString()&lt;br /&gt;
	return frame:preprocess(str)   -- the mapframe needs to be preprocessed!!!!!&lt;br /&gt;
end  -- End the function.&lt;br /&gt;
&lt;br /&gt;
--[[ function to construct mapframe string&lt;br /&gt;
--]]&lt;br /&gt;
p.getMapframeString = function(frame) &lt;br /&gt;
&lt;br /&gt;
    --get mapframe arguments from calling templates&lt;br /&gt;
    local parent = mw.getCurrentFrame():getParent() &lt;br /&gt;
  &lt;br /&gt;
    --[[local mapParams = { width     = parent.args['width'] or &amp;quot;400&amp;quot;,&lt;br /&gt;
					    height    = parent.args['height'] or &amp;quot;300&amp;quot;,&lt;br /&gt;
					    latitude  = parent.args['latitude'] or &amp;quot;51.5&amp;quot;,&lt;br /&gt;
					    longitude = parent.args['longitude'] or &amp;quot;-0.15&amp;quot;,&lt;br /&gt;
					    align     = parent.args['align'] or &amp;quot;right&amp;quot;,&lt;br /&gt;
					    text      = parent.args['text'] or &amp;quot;&amp;quot;,&lt;br /&gt;
					    zoom      = parent.args['zoom'] or &amp;quot;9&amp;quot; }--]]&lt;br /&gt;
    &lt;br /&gt;
    -- get JSON data for features to display&lt;br /&gt;
    local mapData = p.getStadiumJSON()&lt;br /&gt;
    &lt;br /&gt;
    local mapString = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    --mapString = '&amp;lt;mapframe text=&amp;quot;London football stadia&amp;quot; width=800 height=650 align=left zoom=11 latitude=51.530 longitude=-0.16 &amp;gt;'&lt;br /&gt;
    if mapData ~= &amp;quot;&amp;quot; then&lt;br /&gt;
&lt;br /&gt;
	    mapString = '&amp;lt;mapframe' &lt;br /&gt;
	    if parent.args['frameless'] then  -- don't and text as this overrides frameless parameter&lt;br /&gt;
	    	mapString = mapString  .. ' frameless'&lt;br /&gt;
	    else&lt;br /&gt;
	    	mapString = mapString  .. ' text=&amp;quot;' .. (parent.args['text'] or &amp;quot;&amp;quot;) .. '&amp;quot;'&lt;br /&gt;
	    end&lt;br /&gt;
	    -- set width and height using noth parameters, one parameter assuming 4:3 aspect ratio, or defaults&lt;br /&gt;
	    local aspect = 4/3                                                  &lt;br /&gt;
	    local width = parent.args['width']                                  --or &amp;quot;400&amp;quot;&lt;br /&gt;
	    local height = parent.args['height'] or (width or 300)/aspect     --or &amp;quot;300&amp;quot;&lt;br /&gt;
	    width = width or height*aspect                                   -- if width null, use height&lt;br /&gt;
	    &lt;br /&gt;
	    local align = parent.args['align'] or &amp;quot;right&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	    mapString = mapString  .. ' width='     .. math.floor(width)  .. ' height='    .. math.floor(height)  .. ' align='     .. align&lt;br /&gt;
&lt;br /&gt;
	    local zoom      = parent.args['zoom'] --or &amp;quot;0&amp;quot;          -- no longer set defaults (mapframe does automatically)&lt;br /&gt;
		local latitude  = parent.args['latitude'] --or &amp;quot;0&amp;quot;&lt;br /&gt;
		local longitude = parent.args['longitude'] --or &amp;quot;0&amp;quot;&lt;br /&gt;
	    &lt;br /&gt;
	    --set if values, otherwise allow mapframe to set automatically (TODO check if longitude and latitude are independent)&lt;br /&gt;
	    if zoom      then  mapString = mapString .. ' zoom='      .. zoom      end&lt;br /&gt;
	    if latitude  then  mapString = mapString .. ' latitude='  .. latitude  end&lt;br /&gt;
	    if longitude then  mapString = mapString .. ' longitude=' .. longitude end&lt;br /&gt;
	    &lt;br /&gt;
	    mapString = mapString  .. ' &amp;gt;'  .. mapData  .. '&amp;lt;/mapframe&amp;gt;'   -- add data and close tag&lt;br /&gt;
	    &lt;br /&gt;
	    --[[mapString = mapString  &lt;br /&gt;
	                      ..' width=' .. (parent.args['width'] or &amp;quot;400&amp;quot; )&lt;br /&gt;
	                      .. ' height=' .. (parent.args['height'] or &amp;quot;300&amp;quot;)&lt;br /&gt;
	                      .. ' align=' .. (parent.args['align'] or &amp;quot;right&amp;quot;) &lt;br /&gt;
	                      .. ' zoom=' .. (parent.args['zoom'] or &amp;quot;9&amp;quot; )&lt;br /&gt;
	                      .. ' latitude=' .. (parent.args['latitude'] or &amp;quot;51.5&amp;quot;)&lt;br /&gt;
	                      .. ' longitude=' .. (parent.args['longitude'] or &amp;quot;-0.15&amp;quot;)&lt;br /&gt;
	                      .. ' &amp;gt;'&lt;br /&gt;
	                  .. mapData &lt;br /&gt;
	               .. '&amp;lt;/mapframe&amp;gt;'&lt;br /&gt;
	       ]]&lt;br /&gt;
    else&lt;br /&gt;
    	mapString = &amp;quot;No data for map&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return mapString    &lt;br /&gt;
&lt;br /&gt;
end  -- End the function.&lt;br /&gt;
&lt;br /&gt;
--[[ function to construct JSON format data for markers on map.&lt;br /&gt;
     The information for each marker (coordinate, description and image for popup, etc) &lt;br /&gt;
     can be set in several ways (in order of priority):&lt;br /&gt;
      (1) using arguments in the template (|imageN=, |descriptionN=)&lt;br /&gt;
      (2) from values in the data module (i.e. Module:Football map/data)&lt;br /&gt;
      (3) from Wikidata&lt;br /&gt;
]]&lt;br /&gt;
p.getStadiumJSON = function(frame) &lt;br /&gt;
&lt;br /&gt;
    -- now we need to iterate through the stadiumN parameters and get data for the feature markers&lt;br /&gt;
    local maxNumber = 200 -- maximum number looked for&lt;br /&gt;
    local mapData = &amp;quot;&amp;quot;&lt;br /&gt;
    local stadiumName = &amp;quot;&amp;quot;&lt;br /&gt;
    local clubName = &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
     --get mapframe arguments from calling templates&lt;br /&gt;
    local parent = mw.getCurrentFrame():getParent() &lt;br /&gt;
   &lt;br /&gt;
    --[[There are three ways of getting data about the stadium features&lt;br /&gt;
        (1) from a list in the module subpages&lt;br /&gt;
        (2) from wikidata &lt;br /&gt;
        (3) from the parameters in the template (these always override other)&lt;br /&gt;
        By default &lt;br /&gt;
        The parameters useWikiData, useModule restrict use of source&lt;br /&gt;
    --]]&lt;br /&gt;
    local useWikidata = true&lt;br /&gt;
    local useModule = true&lt;br /&gt;
    &lt;br /&gt;
    if parent.args['wikidata'] then useWikidata = true; useModule = false end -- use wikidata or template data (no module data)&lt;br /&gt;
    if parent.args['moduledata'] then useModule = true; useWikidata = false end -- use module of template data (no wikidata)&lt;br /&gt;
    if parent.args['templatedata'] then useModule = false; useWikidata = false end -- only use template data&lt;br /&gt;
    &lt;br /&gt;
    -- default parameters for marker color, size and symbol (i.e. those without index suffix)&lt;br /&gt;
    local defaultMarker ={  color = parent.args['color'] or  &amp;quot;0050d0&amp;quot;,&lt;br /&gt;
    	                    size  = parent.args['size'] or &amp;quot;medium&amp;quot;,&lt;br /&gt;
    	                    symbol = parent.args['symbol'] or &amp;quot;soccer&amp;quot;  }&lt;br /&gt;
    local index=0&lt;br /&gt;
    while index &amp;lt; maxNumber do &lt;br /&gt;
    	&lt;br /&gt;
    	index = index + 1&lt;br /&gt;
	    local stadiumID = &amp;quot;&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	    -- (1) get stadium name  &lt;br /&gt;
	    stadiumName = parent.args['stadium'..tostring(index)] --or &amp;quot;&amp;quot;&lt;br /&gt;
	    &lt;br /&gt;
	    if not stadiumName  then -- name from |stadiumN parameter,&lt;br /&gt;
	    	clubName = parent.args['club'..tostring(index)] or &amp;quot;&amp;quot;&lt;br /&gt;
	    	if clubName ~= &amp;quot;&amp;quot; then&lt;br /&gt;
	    		stadiumName, stadiumID = p.getStadiumFromClubName(clubName)&lt;br /&gt;
	    	end&lt;br /&gt;
	    end    &lt;br /&gt;
	    &lt;br /&gt;
	    -- if we have a valid stadium name (note:Lua has no continue statement)&lt;br /&gt;
	    if stadiumName then &lt;br /&gt;
	    	&lt;br /&gt;
	    	local feature = {name=&amp;quot;&amp;quot;,alias=&amp;quot;&amp;quot;,latitude=0,longitude=0,description=&amp;quot;&amp;quot;,image=&amp;quot;&amp;quot;,valid=false}&lt;br /&gt;
	    	local validFeatureData =true -- assume now and&lt;br /&gt;
	    	&lt;br /&gt;
		    -- (2) get feature parameters from module or wikidata or both&lt;br /&gt;
		    &lt;br /&gt;
	        if useModule then	-- get feature parameters from module data stadium list&lt;br /&gt;
	           feature = p.getModuleData(frame, stadiumName)&lt;br /&gt;
	        end&lt;br /&gt;
	        &lt;br /&gt;
	        if useWikidata and  feature['name'] == &amp;quot;&amp;quot; then -- get feature parameters from wikidata&lt;br /&gt;
	            feature = p.getDataFromWikiData(stadiumName,stadiumID)&lt;br /&gt;
	            if not feature['valid'] then validFeatureData =false end -- no valid coordinates&lt;br /&gt;
	        end&lt;br /&gt;
	        &lt;br /&gt;
	        ----------------------------------------------------&lt;br /&gt;
	        -- (3) data from template parameters will override those obtainied from a module table or wikidata&lt;br /&gt;
	        local templateArgs = {&lt;br /&gt;
		    		    latitude = parent.args['latitude'..tostring(index)], --or 0,&lt;br /&gt;
					    longitude= parent.args['longitude'..tostring(index)], --or 0,&lt;br /&gt;
				     	description = parent.args['description'..tostring(index)], --or &amp;quot;&amp;quot;,&lt;br /&gt;
				        image = parent.args['image'..tostring(index)] --or &amp;quot;&amp;quot; &lt;br /&gt;
				        }&lt;br /&gt;
	&lt;br /&gt;
		    if templateArgs['latitude'] and templateArgs['longitude']  then -- if both explicitly set &lt;br /&gt;
		    	feature['latitude'] = templateArgs['latitude']&lt;br /&gt;
		    	feature['longitude']= templateArgs['longitude']&lt;br /&gt;
		    	feature['name'] = stadiumName -- as we have valid coordinates&lt;br /&gt;
		    	validFeatureData =true&lt;br /&gt;
		    end&lt;br /&gt;
         &lt;br /&gt;
		    -- use specified description and image if provided&lt;br /&gt;
	    	if templateArgs['description']  then &lt;br /&gt;
	    		feature['description'] = templateArgs['description']&lt;br /&gt;
	        end&lt;br /&gt;
	    	if templateArgs['image']  then &lt;br /&gt;
	    		feature['image'] =  templateArgs['image']   -- priority for image from template argument&lt;br /&gt;
	        end &lt;br /&gt;
	    	if feature['image'] ~= &amp;quot;&amp;quot; then feature['image'] = '[[' .. mw.text.encode(feature['image']) .. ']]' end&lt;br /&gt;
	    	&lt;br /&gt;
	    	-- wikilink - use redirect if alias&lt;br /&gt;
	    	if feature['alias'] ~= '' then&lt;br /&gt;
	    		feature['name'] = '[[' .. feature['name'] .. '|'.. feature['alias'] .. ']]'&lt;br /&gt;
	    	else&lt;br /&gt;
            	feature['name'] = '[[' .. feature['name'] .. ']]'&lt;br /&gt;
            end&lt;br /&gt;
            &lt;br /&gt;
            if clubName ~= &amp;quot;&amp;quot; then &lt;br /&gt;
            	--feature['name'] = '[[' .. clubName .. ']] (' .. feature['name'] ..')'&lt;br /&gt;
            	if stadiumName ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            		feature['description'] = '[[' .. stadiumName .. ']]. ' .. feature['description'] &lt;br /&gt;
            	end&lt;br /&gt;
            	feature['name'] = '[[' .. clubName .. ']]' &lt;br /&gt;
            end&lt;br /&gt;
    		if feature['image'] ~= &amp;quot;&amp;quot; then &lt;br /&gt;
    			feature['description'] = feature['image']  .. feature['description'] &lt;br /&gt;
    	    end&lt;br /&gt;
&lt;br /&gt;
		    --check if current feature marker has specified color, size or symbol&lt;br /&gt;
	       local featureMarker ={&lt;br /&gt;
		    	color = parent.args['color'..tostring(index)] or defaultMarker['color'],&lt;br /&gt;
		    	symbol = parent.args['symbol'..tostring(index)] or defaultMarker['symbol'],&lt;br /&gt;
		    	size = parent.args['size'..tostring(index)] or defaultMarker['size']	}&lt;br /&gt;
		    	&lt;br /&gt;
	        --  if we have a stadium with valid coordinates&lt;br /&gt;
            if validFeatureData then&lt;br /&gt;
	&lt;br /&gt;
		    	--(4) construct the json for the features&lt;br /&gt;
		    	&lt;br /&gt;
		    	--mapData = mapStadium1&lt;br /&gt;
		    	featureData = '{ &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;, ' &lt;br /&gt;
		    	            .. ' &amp;quot;geometry&amp;quot;: { &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;, &amp;quot;coordinates&amp;quot;: ['&lt;br /&gt;
		    	                             .. feature['longitude'] .. ',' &lt;br /&gt;
		    	                             .. feature['latitude'] &lt;br /&gt;
		    	                             .. '] }, ' &lt;br /&gt;
		    	            .. ' &amp;quot;properties&amp;quot;: { &amp;quot;title&amp;quot;: &amp;quot;'  .. feature['name']  .. '&amp;quot;, ' &lt;br /&gt;
		    	                          .. '&amp;quot;description&amp;quot;: &amp;quot;' .. feature['description'] ..'&amp;quot;, ' &lt;br /&gt;
		    	                          .. '&amp;quot;marker-symbol&amp;quot;: &amp;quot;' .. featureMarker['symbol'] .. '&amp;quot;, '&lt;br /&gt;
		    	                          .. '&amp;quot;marker-size&amp;quot;: &amp;quot;' .. featureMarker['size'] .. '&amp;quot;, ' &lt;br /&gt;
		    	                          .. '&amp;quot;marker-color&amp;quot;: &amp;quot;' .. featureMarker['color'] .. '&amp;quot;  } ' &lt;br /&gt;
		    	            .. ' } '&lt;br /&gt;
		    	&lt;br /&gt;
		    	if index &amp;gt; 1 and mapData ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		    	    mapData = mapData .. ',' .. featureData&lt;br /&gt;
		    	else&lt;br /&gt;
		    		mapData = featureData &lt;br /&gt;
		    	end&lt;br /&gt;
		    else&lt;br /&gt;
		    	--mapData = '{  &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,  &amp;quot;geometry&amp;quot;: { &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;, &amp;quot;coordinates&amp;quot;: [-0.066417, 51.60475] }, &amp;quot;properties&amp;quot;: { &amp;quot;title&amp;quot;: &amp;quot;White Hart Lane (default)&amp;quot;,  &amp;quot;description&amp;quot;: &amp;quot;Stadium of Tottenham Hotspur F.C.&amp;quot;, &amp;quot;marker-symbol&amp;quot;: &amp;quot;soccer&amp;quot;, &amp;quot;marker-size&amp;quot;: &amp;quot;large&amp;quot;,  &amp;quot;marker-color&amp;quot;: &amp;quot;0050d0&amp;quot;   }  } '&lt;br /&gt;
			end -- if valid parameters&lt;br /&gt;
	    end -- end if stadiumName&lt;br /&gt;
	 end -- end while loop&lt;br /&gt;
	 &lt;br /&gt;
	 --[[ (5) check for external data (geoshape) &lt;br /&gt;
	        TODO add more than index=1 and generalise for any json feature&lt;br /&gt;
	 --]]&lt;br /&gt;
	 local geoshape = parent.args['geoshape'..tostring(1)] or &amp;quot;&amp;quot;&lt;br /&gt;
	 if geoshape ~= &amp;quot;&amp;quot; then &lt;br /&gt;
	 	mapData = mapData .. ',' .. geoshape -- assumes at least one stadium&lt;br /&gt;
	 end &lt;br /&gt;
	 &lt;br /&gt;
	 -- add outer bracket to json if more than one element&lt;br /&gt;
	 if index &amp;gt; 1 then&lt;br /&gt;
	 	mapData = '[' .. mapData .. ']'&lt;br /&gt;
	 end&lt;br /&gt;
     &lt;br /&gt;
     return mapData&lt;br /&gt;
     &lt;br /&gt;
end -- End the function.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[-------------------------------Retrieve information from wikidata-------------------------&lt;br /&gt;
 &lt;br /&gt;
	statements of interest (datavalue element)&lt;br /&gt;
		item = mw.wikibase.getEntity(WikidataId), &lt;br /&gt;
		statements = item:getBestStatements('P625')[1]&lt;br /&gt;
    	&amp;quot;claims&amp;quot;:&lt;br /&gt;
			P625 coordinate location (value.longitude/latitude)&lt;br /&gt;
			   &amp;quot;P625&amp;quot;:[{ &amp;quot;mainsnake&amp;quot;: { ... &amp;quot;datavalue&amp;quot;: { &amp;quot;value&amp;quot;: {&amp;quot;latitude&amp;quot;: 51.4, &amp;quot;longitude&amp;quot;: -0.19] ...&lt;br /&gt;
			   statements.mainsnak.datavalue.value.latitude&lt;br /&gt;
			P18 image on commons (value, &amp;quot;File:value&amp;quot;)&lt;br /&gt;
		   	   &amp;quot;P18&amp;quot;:[{ &amp;quot;mainsnake&amp;quot;: { ... &amp;quot;datavalue&amp;quot;: { &amp;quot;value&amp;quot;: &amp;quot;Stamford Bridge Clear Skies.JPG&amp;quot;&lt;br /&gt;
			P466 occupant (value.id) (use )&lt;br /&gt;
			P1083 capacity (value.amount)&lt;br /&gt;
			   &amp;quot;P1083&amp;quot;:[{ &amp;quot;mainsnake&amp;quot;: { ... &amp;quot;datavalue&amp;quot;: { &amp;quot;value&amp;quot;: { &amp;quot;amount&amp;quot; : &amp;quot;+41875&amp;quot; ...&lt;br /&gt;
			P571 inception (value), P576 demolished (value)&lt;br /&gt;
			P1566 GeoNames ID (value, &amp;quot;geonames.org/value&amp;quot;)&lt;br /&gt;
			P84 architect&lt;br /&gt;
			P137 operator, P127 owned by&lt;br /&gt;
			P31 (instance of) Q483110 (stadium)&lt;br /&gt;
			   &amp;quot;P18&amp;quot;:[{ &amp;quot;mainsnake&amp;quot;: { ... &amp;quot;datavalue&amp;quot;: { &amp;quot;value&amp;quot;: { &amp;quot;id&amp;quot;: &amp;quot;Q483110&amp;quot;&lt;br /&gt;
			   however also sports venue, olympic stadium, association football stadium&lt;br /&gt;
			P159 headquarters location (for football club) &lt;br /&gt;
			   e..g. London&lt;br /&gt;
			   qualifier property: coordinates(P625)&lt;br /&gt;
    page title on enwiki&lt;br /&gt;
    	mw.wikibase.getSitelink( itemId ) - gets local version&lt;br /&gt;
    	&amp;quot;sitelink&amp;quot;: { &amp;quot;enwiki&amp;quot;: { &amp;quot;title&amp;quot;: &amp;quot;Stamford Bridge (stadium)&amp;quot; &lt;br /&gt;
    	    &lt;br /&gt;
    ERROR NOTE there was an error is caused when a supposed stadium redirected to page with no coordinates&lt;br /&gt;
      e.g  Fortress Stadium, Bromley was redirecting to Bromley F.C., &lt;br /&gt;
      this had a valid Wiki ID and item but no coordinates&lt;br /&gt;
    	  1. it is handled by setting wd['valid'] when there are valid coordinates&lt;br /&gt;
    	  2. an alternative would We could check it is a stadium&lt;br /&gt;
    	       if P31 (instance of ) Q483110 (stadium)&lt;br /&gt;
--]]&lt;br /&gt;
p.getDataFromWikiData=function(stadiumName,stadiumID)&lt;br /&gt;
    &lt;br /&gt;
    local wd={name=&amp;quot;&amp;quot;,latitude=&amp;quot;&amp;quot;,longitude=&amp;quot;&amp;quot;,description=&amp;quot;&amp;quot;,image=&amp;quot;&amp;quot;,alias=&amp;quot;&amp;quot;,valid=false }&lt;br /&gt;
    &lt;br /&gt;
	-- 	get wikidata id corresponding to wikipedia stadium page&lt;br /&gt;
	local WikidataId = mw.wikibase.getEntityIdForTitle(stadiumName)&lt;br /&gt;
&lt;br /&gt;
	if WikidataId and mw.wikibase.isValidEntityId( WikidataId ) then -- valid id&lt;br /&gt;
    	&lt;br /&gt;
    	local item = mw.wikibase.getEntity(WikidataId)&lt;br /&gt;
        if not item then return wd end -- will test for wiki&lt;br /&gt;
&lt;br /&gt;
    	local enwikiTitle =	mw.wikibase.getSitelink( WikidataId ) -- name of local Wikipedia page&lt;br /&gt;
    	local wikidataTitle = mw.wikibase.getLabel( WikidataId  ) -- name of Wikidata page&lt;br /&gt;
    	if enwikiTitle and wikidataTitle and enwikiTitle ~= wikidataTitle then&lt;br /&gt;
    	    wd['alias'] = wikidataTitle&lt;br /&gt;
    		wd['name'] =stadiumName &lt;br /&gt;
	    else&lt;br /&gt;
    		wd['name'] =stadiumName &lt;br /&gt;
    	end&lt;br /&gt;
    	&lt;br /&gt;
        -- get coordinates&lt;br /&gt;
    	local statements = item:getBestStatements('P625')[1] --coordinate location &lt;br /&gt;
        if statements ~= nil then -- check cordinates available&lt;br /&gt;
	    	local coord = statements.mainsnak.datavalue.value&lt;br /&gt;
	    	if type(coord.latitude) == 'number' and type(coord.longitude) == 'number' then &lt;br /&gt;
        	    -- add coordinate data from wikidata for unindexed stadium&lt;br /&gt;
	        	wd['latitude'] = coord.latitude&lt;br /&gt;
	        	wd['longitude'] = coord.longitude&lt;br /&gt;
	            wd['valid'] = true&lt;br /&gt;
        	end&lt;br /&gt;
    	end&lt;br /&gt;
    	&lt;br /&gt;
    	--get image&lt;br /&gt;
    	statements = item:getBestStatements('P18')[1] --image&lt;br /&gt;
    	if statements ~= nil then &lt;br /&gt;
           wd['image'] = 'File:' .. statements.mainsnak.datavalue.value&lt;br /&gt;
    	end&lt;br /&gt;
    	-- get occupants  --TODO check for multi-occupancy&lt;br /&gt;
        statements = item:getBestStatements('P466')[1] --occupant (i.e football club)&lt;br /&gt;
    	if statements ~= nil then &lt;br /&gt;
    		local clubID = statements.mainsnak.datavalue.value.id&lt;br /&gt;
            if clubID then&lt;br /&gt;
            	local clubName = mw.wikibase.getLabel( clubID  )&lt;br /&gt;
            	wd['description'] = '&amp;lt;small&amp;gt;Home ground of ' .. clubName .. '&amp;lt;/small&amp;gt;'&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        -- get capacity&lt;br /&gt;
        statements = item:getBestStatements('P1083')[1] --mcapacity&lt;br /&gt;
    	if statements ~= nil then &lt;br /&gt;
    		local capacity = tonumber(statements.mainsnak.datavalue.value.amount)&lt;br /&gt;
    		if capacity then &lt;br /&gt;
    			wd['description'] = wd['description'] .. '&amp;lt;small&amp;gt; (capacity: ' .. capacity .. ')&amp;lt;/small&amp;gt;' &lt;br /&gt;
    		end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return wd&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
----------------------------------------------&lt;br /&gt;
p.getStadiumFromClubName = function(clubName)&lt;br /&gt;
	    	&lt;br /&gt;
	-- let us assume the club name has a wikipedia page with the extact same name&lt;br /&gt;
&lt;br /&gt;
	local wdId = mw.wikibase.getEntityIdForTitle(clubName)&lt;br /&gt;
	&lt;br /&gt;
	if wdId and mw.wikibase.isValidEntityId( wdId ) then -- if valid id&lt;br /&gt;
    	local item = mw.wikibase.getEntity(wdId)&lt;br /&gt;
    	mw.logObject( mw.wikibase.getBestStatements( 'Q18721', 'P115' ) )&lt;br /&gt;
    	--local statements = mw.wikibase.getBestStatements( 'Q18721', 'P115' )[1] &lt;br /&gt;
    	local statements = item:getBestStatements('P115')[1] --home venue&lt;br /&gt;
        if statements ~= nil then -- check cordinates available&lt;br /&gt;
	    	&lt;br /&gt;
			local stadiumID = statements.mainsnak.datavalue.value.id&lt;br /&gt;
            -- P115 doesn't seem to have the stadium name (P115 is type &amp;quot;Item&amp;quot;) &lt;br /&gt;
            --- other properties (e.g. stadium name) would need to be got from the ID&lt;br /&gt;
            local stadiumName = mw.wikibase.getLabel( stadiumID  )&lt;br /&gt;
            --stadiumName = clubName -- if the marker is to be labelled with club name&lt;br /&gt;
            &lt;br /&gt;
            local enwikiTitle =	mw.wikibase.getSitelink( stadiumID )&lt;br /&gt;
            &lt;br /&gt;
            return enwikiTitle, stadiumID&lt;br /&gt;
            --return stadiumName, stadiumID&lt;br /&gt;
    	end&lt;br /&gt;
    end	  	&lt;br /&gt;
    return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
p.getModuleData = function (frame, stadiumName)&lt;br /&gt;
	&lt;br /&gt;
     	local feature = {}&lt;br /&gt;
     	feature['name'] =  &amp;quot;&amp;quot;&lt;br /&gt;
	    --feature['data'] = &amp;quot;&amp;quot;&lt;br /&gt;
	    feature['alias'] = &amp;quot;&amp;quot;&lt;br /&gt;
	    feature['description'] =  &amp;quot;&amp;quot;&lt;br /&gt;
	    feature['image'] = &amp;quot;&amp;quot;&lt;br /&gt;
	    &lt;br /&gt;
		    -- check the module stadium list for name match&lt;br /&gt;
		    --  set feature parameters from the module data&lt;br /&gt;
		    for _, params in pairs( stadiumDatabase.stadia ) do&lt;br /&gt;
		    	if stadiumName == params[1] then -- if we have a match from the list&lt;br /&gt;
		    		feature['name'] = params[1]&lt;br /&gt;
		    		feature['latitude'] = params[2]&lt;br /&gt;
		    		feature['longitude'] = params[3]&lt;br /&gt;
		    		feature['alias'] = params[4]&lt;br /&gt;
		    		feature['description'] = params[5]&lt;br /&gt;
		    		feature['image'] =  params[6] &lt;br /&gt;
		    		break&lt;br /&gt;
		        end&lt;br /&gt;
		    end&lt;br /&gt;
    return feature&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- function to construct JSON string for WHL in London map&lt;br /&gt;
p.getTestJSONstring = function(frame) &lt;br /&gt;
   &lt;br /&gt;
    return '{  &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,  &amp;quot;geometry&amp;quot;: { &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;, &amp;quot;coordinates&amp;quot;: [-0.066417, 51.60475] }, &amp;quot;properties&amp;quot;: { &amp;quot;title&amp;quot;: &amp;quot;White Hart Lane&amp;quot;,  &amp;quot;description&amp;quot;: &amp;quot;Stadium of Tottenham Hotspur F.C.&amp;quot;, &amp;quot;marker-symbol&amp;quot;: &amp;quot;soccer&amp;quot;, &amp;quot;marker-size&amp;quot;: &amp;quot;large&amp;quot;,  &amp;quot;marker-color&amp;quot;: &amp;quot;0050d0&amp;quot;   }  } '&lt;br /&gt;
&lt;br /&gt;
end  -- End the function.&lt;br /&gt;
&lt;br /&gt;
-- function to construct JSON string&lt;br /&gt;
p.getJSONstring = function(frame) &lt;br /&gt;
&lt;br /&gt;
    local stadiumName = mw.getCurrentFrame():getParent().args['stadium1'] or &amp;quot;default name&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local str=stadiumName&lt;br /&gt;
    local jsonString = '{   &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;, '&lt;br /&gt;
    jsonString = jsonString .. ' &amp;quot;geometry&amp;quot;: { &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;, &amp;quot;coordinates&amp;quot;: [-0.065833, 51.603333] }, '&lt;br /&gt;
    jsonString = jsonString .. ' &amp;quot;properties&amp;quot;: {     &amp;quot;title&amp;quot;: &amp;quot;[[White Hart Lane]]&amp;quot;, '&lt;br /&gt;
    jsonString = jsonString .. ' &amp;quot;description&amp;quot;: &amp;quot;[[File:White Hart Lane Aerial.jpg|150px]]Tottenham Hotspur Football Club (1899-2017)&amp;quot;, '&lt;br /&gt;
    jsonString = jsonString .. ' &amp;quot;marker-symbol&amp;quot;: &amp;quot;-number&amp;quot;, &amp;quot;marker-size&amp;quot;: &amp;quot;small&amp;quot;, &amp;quot;marker-color&amp;quot;: &amp;quot;dd50d0&amp;quot;  } } '&lt;br /&gt;
    &lt;br /&gt;
    --mapString = mapString ..  '&amp;lt;/mapframe&amp;gt;'&lt;br /&gt;
   jsonString = '{  &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,  &amp;quot;geometry&amp;quot;: { &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;, &amp;quot;coordinates&amp;quot;: [-0.066417, 51.60475] }, &amp;quot;properties&amp;quot;: { &amp;quot;title&amp;quot;: &amp;quot;[[Northumberland Development Project]]&amp;quot;,  &amp;quot;description&amp;quot;: &amp;quot;[[File:NDProject2015.jpg|100px]]&amp;quot;, &amp;quot;marker-symbol&amp;quot;: &amp;quot;soccer&amp;quot;, &amp;quot;marker-size&amp;quot;: &amp;quot;large&amp;quot;,  &amp;quot;marker-color&amp;quot;: &amp;quot;0050d0&amp;quot;   }  } '&lt;br /&gt;
   &lt;br /&gt;
   jsonString = '{  &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,  &amp;quot;geometry&amp;quot;: { &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;, &amp;quot;coordinates&amp;quot;: [-0.066417, 51.60475] }, &amp;quot;properties&amp;quot;: { &amp;quot;title&amp;quot;: &amp;quot;title&amp;quot;,  &amp;quot;description&amp;quot;: &amp;quot;description&amp;quot;, &amp;quot;marker-symbol&amp;quot;: &amp;quot;soccer&amp;quot;, &amp;quot;marker-size&amp;quot;: &amp;quot;large&amp;quot;,  &amp;quot;marker-color&amp;quot;: &amp;quot;0050d0&amp;quot;   }  } '&lt;br /&gt;
    &lt;br /&gt;
    str = '&amp;lt;nowiki&amp;gt;' .. jsonString .. '&amp;lt;/nowiki&amp;gt;'&lt;br /&gt;
    --str =  jsonString &lt;br /&gt;
&lt;br /&gt;
    return str    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end   -- End the function.&lt;br /&gt;
&lt;br /&gt;
-- All modules end by returning the variable containing its functions to Wikipedia.&lt;br /&gt;
return p&lt;br /&gt;
&lt;br /&gt;
-- We can now use this module by calling {{#invoke: HelloWorld | hello }}.&lt;br /&gt;
-- The #invoke command begins with the module's name, in this case &amp;quot;HelloWorld&amp;quot;,&lt;br /&gt;
-- then takes the name of one of its functions as an argument, in this case &amp;quot;hello&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Zoran</name></author>
	</entry>
</feed>