local p = {} local function getEntityFromId( id ) if id and id ~= then return mw.wikibase.getEntity( id ); end return mw.wikibase.getEntity; end 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 = 'tərcüməsiz 5', args = { label, , 'd', entityId } } end -- одноимённая статья уже существует - выводится текст и ссылка на ВД return end -- not good, but better than nothing return .. entityId .. .. -- .. categoryLinksToEntitiesWithMissingLabel end 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 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:Wikidata2' ) 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