Siirry sisältöön

Moduli:WikidataTree

On otettu Мегавики-späi

local p = {}

--[[

 Функция для получения сущности (еntity) для текущей страницы
 Подробнее о сущностях см. d:Wikidata:Glossary/ru
 Принимает: строковый индентификатор (типа P18, Q42)
 Возвращает: объект таблицу, элементы которой индексируются с нуля

]] local function getEntityFromId( id )

   if id and id ~=  then
       return mw.wikibase.getEntity( id );
   end
   return mw.wikibase.getEntity();

end

--[[

 Функция для оформления идентификатора сущности
 Принимает: строку индентификатора (типа Q42) и таблицу параметров,
 Возвращает: строку оформленного текста

]] function p.formatEntityId( entityId, options ) -- получение локализованного названия

   local label = nil
   if ( options and options.text and options.text ~=  ) then
       label = options.text
   else

label = mw.wikibase.label( entityId )

   end

-- получение ссылки по идентификатору

   local link = mw.wikibase.sitelink( entityId )
   if link then
       if label then
           return '' .. label .. ''
       else
           return '' .. link .. ''
       end
   end
   if label then
       -- красная ссылка
       if not mw.title.new( label ).exists then
           return options.frame:expandTemplate{
               title = 'не переведено 5',
               args = { label, , 'd', entityId }
           }
       end
       -- одноимённая статья уже существует - выводится текст и ссылка на ВД
       return '' .. label
       	.. '[d]'
       	.. ''
   end
   -- сообщение об отсутвии локализованного названия
   -- not good, but better than nothing
   return '' .. entityId .. ''
   	.. '?' -- .. categoryLinksToEntitiesWithMissingLabel

end

--[[

 Выбирает свойства по property id, дополнительно фильтруя их по рангу
 
 Копия Module:Wikidata -> selectClaims( )

]] local function selectClaims( entity, propertySelector ) if ( not entity ) then error( 'entity is missing' ) end if ( not propertySelector ) then error( 'propertySelector not specified' ) end

local WDS = require( 'Module:WikidataSelectors' ) local result = WDS.filter( entity.claims, propertySelector )

   if ( not result or #result == 0 ) then
   	return nil
   end
   return result

end

--[[

 Выбирает свойства по property id, дополнительно фильтруя их по рангу
 
 Копия Module:Wikidata -> selectClaims( )

]] local function selectFirstClaim( entity, propertySelector ) local claims = selectClaims( entity, propertySelector ) if ( claims == nil ) then return nil end

   for i, claim in ipairs( claims ) do
   	return claim

end

return nil end

local function getProperty( frame, args ) local Wikidata = require( 'Module:Wikidata' )

frame.args = args frame.args.references = 'false'

return Wikidata.formatProperty( frame ) end

local function itemString( frame, entityId, formatEntityId ) return formatEntityId( entityId, { frame = frame } ) end

--[[

 Функция для формирования дерева по свойству для вышестоящего элменента для текущей страницы

]] function p.parentTree( frame ) local entity = getEntityFromId( frame.args.from );

if not entity then return ; end

local entityId = entity.id; local list = {}; local level = 1; local parentProperty = 'P279';

if frame.args.parent then parentProperty = string.upper( frame.args.parent ); end

local formatterFunction = itemString; if frame.args[ 'value-module' ] then local formatter = require( 'Module:' .. frame.args[ 'value-module' ] ); formatterFunction = formatter[ frame.args[ 'value-function' ] ]; end

while ( true ) do list[ level ] = formatterFunction( frame, entityId, p.formatEntityId ); level = level + 1;

entity = getEntityFromId( entityId ); parentClaim = selectFirstClaim( entity, parentProperty ); if ( not parentClaim or not parentClaim.mainsnak or not parentClaim.mainsnak.datavalue or not parentClaim.mainsnak.datavalue.value or not parentClaim.mainsnak.datavalue.value.id ) then break end entityId = parentClaim.mainsnak.datavalue.value.id end

local out = local maxLevel = level local tab = frame.args[ 'tab' ] if tab and tab ~= then for level, value in pairs( list ) do out = string.rep( tab, maxLevel - level ) .. value .. '\n' .. out end else for level, value in pairs( list ) do out = value .. '\n' .. out end end

local before = frame.args[ 'before' ] if before and before ~= then out = before .. out; end

local after = frame.args[ 'after' ] if after and after ~= then out = out .. after; end

return out end

return p