Module:Plain sister

local p = {}

local sites = { -- interwiki prefix, parameter,    label and            site id (for Wikidata) { 'w',          'wikipedia',   'Wikipedia article', 'enwiki' }, { 'c',          'commons',     'Commons gallery',   'commonswiki' }, { 'c:Category', 'commonscat',  'Commons category',  'commonswiki' }, { 'q',          'wikiquote',   'quotes',            'enwikiquote' }, { 'n',          'wikinews',    'news',              'enwikinews' }, { 'wikt',       'wiktionary',  'definition',        'enwiktionary' }, { 'b',          'wikibooks',   'textbook',          'enwikibooks' }, { 'v',          'wikiversity', 'course',            'enwikiversity' }, { 'wikispecies', 'wikispecies', 'taxonomy',         'specieswiki' }, { 'voy',        'wikivoyage',  'travel guide',      'enwikivoyage' }, { 'd',          'wikidata',    'Wikidata item',     'wikidatawiki' }, { 'bibliowiki', 'wikilivres',  'bibliowiki',        '' }, -- wikilivres now bibliowiki { 'bibliowiki', 'bibliowiki',  'bibliowiki',        '' }, { 'm',          'meta',        'Meta',              'metawiki' } }

function p.interprojetPart( frame ) local frame = frame:getParent local item = mw.wikibase.getEntityObject local links = {}

for _, site in pairs( sites ) do		local val = frame.args[site[2]]            -- link provided as input parameter if val == '' then val = nil; end if not val and site[4] ~= '' and item then -- fetch it from wikidata val = item:getSitelink( site[4] ) if site[4] == 'wikidatawiki' then val = item.id 			elseif site[4] == 'commonswiki' and val then -- we have link to commons local catFlag = (#val>9 and string.sub(val,1,9) == 'Category:') if (site[2]=='commonscat' and catFlag==false) or (site[2]=='commons' and catFlag==true) then val = nil -- link is to a wrong namespace so let's nuke it				elseif (site[2]=='commonscat' and catFlag==true) then val = string.sub(val,10) -- trim 'Category:' from the front end end end if not val and site[2] == 'commons' and item then local statements = item:getBestStatements('P935' ) -- get commons gallery page from P935 property if statements[1] and statements[1].mainsnak.datavalue then val = statements[1].mainsnak.datavalue.value end end if not val and site[2] == 'commonscat' and item then local statements = item:getBestStatements('P373' )  -- get commons category page from P373 property if statements[1] and statements[1].mainsnak.datavalue then val = statements[1].mainsnak.datavalue.value end end

if val then table.insert( links,  .. site[3] ..  ) end end

if #links == 0 then -- links table length is zero return '' end

return ' ' .. ' '		.. 'sister projects:&#32;' .. table.concat( links, ',&#32;' ) .. '.' end

return p