Перейти к содержанию

Модуль:Wikidata/links

Материал из Wikivoyage

Функция getWV: берёт в качестве аргумента ID Викиданных и возвращает название путеводителя Викигида. Например:

{{#invoke:Wikidata/links|getWV|Q159}}

выдаст Россия.

Функция getWikipediaLink: берёт в качестве аргумента ID Викиданных и возвращает ссылку на Википедию (по умолчанию старается достать ссылку на русском, иначе - на родном). Например:

{{#invoke:Wikidata/links|getWikipediaLink|Q159}}

выдаст w:Россия.


local p = {};

function p.getSisterProjectLink( projectInterwikiLettter, projectName, frame )
  -- По умолчанию старается достать ссылку на русском, иначе - на en, затем на родном (P103)
  local itemID = mw.text.trim(frame.args[1] or "")
  local entity = mw.wikibase.getEntityObject(itemID)
  if entity == nil or entity.sitelinks == nil then
    return ''
  end;
  local sitelink = entity.sitelinks['ru' .. projectName]
  if sitelink ~= nil then
    return projectInterwikiLettter .. ':' .. sitelink.title
  end;
  -- tries to returns :en:w: link right after 
  sitelink = entity.sitelinks['en' .. projectName]
  if sitelink ~= nil then
    return 'en:w:' .. sitelink.title;
  end;
  if entity.claims then
    local propValues = entity.claims['P103']
    if propValues ~= nil then
      local codes = mw.loadData('Module:Wikidata:Dictionary/P424');
      for i, propClaim in pairs(propValues) do
        if propClaim.mainsnak and propClaim.mainsnak.datavalue and propClaim.mainsnak.datavalue.value and propClaim.mainsnak.datavalue.value["numeric-id"] then
          local languageWikidataId = 'Q' .. propClaim.mainsnak.datavalue.value["numeric-id"];
          local codesById = codes[languageWikidataId];
          if ( codesById ) then
            for j, code in pairs( codesById ) do
              sitelink = entity.sitelinks[code .. projectName];
              if sitelink ~= nil then
                return projectInterwikiLettter .. ':' .. code .. ':' .. sitelink.title;
              end;
            end;
          end;
        end;
      end;
    end;
  end;
  return '';
end;

function p.getWV (frame)
	local itemID = mw.text.trim(frame.args[1] or "")
	local entity = mw.wikibase.getEntityObject(itemID)
	if not entity or not entity.sitelinks then
		return ''
	end
	if entity.sitelinks['ru' .. 'wikivoyage'] then
		return entity.sitelinks['ru' .. 'wikivoyage'].title
	end
end;

function p.getWikipediaLink(frame)
  return p.getSisterProjectLink( 'w', 'wiki', frame );
end;

return p;