Редагування Модуль:Wikidata/Places

Перейти до навігації Перейти до пошуку

Увага! Ви не авторизувалися на сайті. Ваша IP-адреса буде публічно видима, якщо Ви будете вносити будь-які редагування. Якщо Ви увійдете або створите обліковий запис, редагування будуть натомість пов'язані з Вашим іменем користувача, а ще у Вас з'являться інші переваги.

Шпаргалка з форматування текстуДопомога у створенні нової статтіВимоги до стилю

Редагування може бути скасовано. Будь ласка, перевірте порівняння нижче, щоб впевнитись, що це те, що ви хочете зробити, а потім збережіть зміни, щоб закінчити скасування редагування.

Поточна версія Ваш текст
Рядок 1: Рядок 1:
local categorizeByPlace = true;
+
local categorizeByPlaceOfBirthAndDeath = true;
   
 
local WDS = require( 'Module:WikidataSelectors' );
 
local WDS = require( 'Module:WikidataSelectors' );
 
local Flags = require( 'Module:Wikidata/Flags' );
 
local Flags = require( 'Module:Wikidata/Flags' );
local p = {
+
local p = {};
  +
local project = 'ukwiki';
config = {
 
hideSameLabels = false,
 
hidePartOfLabels = false,
 
hideUnitsForCapitals = true,
 
reverseOrder = false,
 
}
 
};
 
   
 
local function min( prev, next )
 
local function min( prev, next )
if prev == nil then
+
if ( prev == nil ) then return next;
return next;
+
elseif ( prev > next ) then return next;
elseif prev > next then
+
else return prev; end
return next;
 
else
 
return prev;
 
end
 
 
end
 
end
   
 
local function max( prev, next )
 
local function max( prev, next )
if prev == nil then
+
if ( prev == nil ) then return next;
return next;
+
elseif ( prev < next ) then return next;
elseif prev < next then
+
else return prev; end
return next;
 
else
 
return prev;
 
end
 
 
end
 
end
   
 
local function getTimeBoundariesFromProperty( context, propertyId )
 
local function getTimeBoundariesFromProperty( context, propertyId )
  +
mw.log( 'Get time boundaries for ' .. propertyId .. '...');
  +
 
local dateClaims = WDS.filter( context.entity.claims, propertyId );
 
local dateClaims = WDS.filter( context.entity.claims, propertyId );
if not dateClaims or #dateClaims == 0 then
+
if ( not dateClaims or #dateClaims == 0 ) then return nil; end
  +
mw.log( 'Get time boundaries for ' .. propertyId .. '... Got ' .. #dateClaims .. ' date claim(s)');
return nil;
 
end
 
   
 
-- only support exact date so far, but need improvment
 
-- only support exact date so far, but need improvment
Рядок 42: Рядок 29:
 
local right = nil;
 
local right = nil;
 
for _, claim in pairs( dateClaims ) do
 
for _, claim in pairs( dateClaims ) do
if not claim.mainsnak then return nil; end
+
if ( not claim.mainsnak ) then return nil; end
 
local boundaries = context.parseTimeBoundariesFromSnak( claim.mainsnak );
 
local boundaries = context.parseTimeBoundariesFromSnak( claim.mainsnak );
if not boundaries then return nil; end
+
if ( not boundaries ) then return nil; end
 
left = min( left, boundaries[ 1 ] );
 
left = min( left, boundaries[ 1 ] );
 
right = max( right, boundaries[ 2 ] );
 
right = max( right, boundaries[ 2 ] );
 
end
 
end
   
if not left or not right then return nil; end
+
if ( not left or not right ) then return nil; end
   
  +
mw.log( 'Time boundaries for ' .. propertyId .. ' are ' .. left .. ' and ' .. right );
 
return { left, right };
 
return { left, right };
 
end
 
end
Рядок 69: Рядок 57:
 
local left = nil;
 
local left = nil;
 
local right = nil;
 
local right = nil;
if statement.qualifiers and statement.qualifiers[qualifierId] then
+
if ( statement.qualifiers and statement.qualifiers[qualifierId] ) then
 
for _, qualifier in pairs( statement.qualifiers[qualifierId] ) do
 
for _, qualifier in pairs( statement.qualifiers[qualifierId] ) do
 
local boundaries = context.parseTimeBoundariesFromSnak( qualifier );
 
local boundaries = context.parseTimeBoundariesFromSnak( qualifier );
if not boundaries then return nil; end
+
if ( not boundaries ) then return nil; end
 
left = min( left, boundaries[1] );
 
left = min( left, boundaries[1] );
 
right = max( right, boundaries[2] );
 
right = max( right, boundaries[2] );
Рядок 78: Рядок 66:
 
end
 
end
   
if not left or not right then
+
if ( not left or not right ) then
 
return nil;
 
return nil;
 
end
 
end
Рядок 85: Рядок 73:
 
end
 
end
   
local function getParentsInBoundariesSnakImpl( context, entityId, boundaries, propertyIds, selectors )
+
local function getParentsInBoundariesSnakImpl( context, entity, boundaries, propertyIds )
 
local results = {};
 
local results = {};
   
Рядок 91: Рядок 79:
 
return results;
 
return results;
 
end
 
end
 
for _, propertyId in ipairs( propertyIds ) do
 
if (not string.match( propertyId, '^P%d+$' )) then error('Incorrect propertyId: ' + propertyId); end
 
local selector;
 
if (selectors ~= nil) then
 
selector = selectors[propertyId] or propertyId;
 
else
 
selector = propertyId;
 
end
 
   
  +
if entity.claims then
local entityClaims = {};
 
entityClaims[propertyId] = mw.wikibase.getAllStatements( entityId, propertyId );
+
for _, propertyId in ipairs( propertyIds ) do
  +
local filteredClaims = WDS.filter( entity.claims, propertyId .. '[rank:preferred, rank:normal]' );
 
  +
if filteredClaims then
local filteredClaims = WDS.filter( entityClaims, selector .. '[rank:preferred, rank:normal]' );
 
if filteredClaims then
+
for _, claim in pairs( filteredClaims ) do
  +
if not boundaries or not propertyIds or #propertyIds == 0 then
for _, claim in pairs( filteredClaims ) do
 
if not boundaries or not propertyIds or #propertyIds == 0 then
 
table.insert( results, claim.mainsnak );
 
else
 
local startBoundaries = getTimeBoundariesFromQualifiers( context, claim, 'P580' );
 
local endBoundaries = getTimeBoundariesFromQualifiers( context, claim, 'P582' );
 
 
if ( startBoundaries == nil or startBoundaries[2] <= boundaries[1] ) and
 
( endBoundaries == nil or endBoundaries[1] >= boundaries[2] )
 
then
 
 
table.insert( results, claim.mainsnak );
 
table.insert( results, claim.mainsnak );
end
+
else
  +
local startBoundaries = getTimeBoundariesFromQualifiers( context, claim, 'P580' );
  +
local endBoundaries = getTimeBoundariesFromQualifiers( context, claim, 'P582' );
  +
  +
if ( (startBoundaries == nil or startBoundaries[2] <= boundaries[1] )
  +
and ( endBoundaries == nil or endBoundaries[1] >= boundaries[2] ) ) then
  +
table.insert( results, claim.mainsnak );
  +
end
  +
end
 
end
 
end
 
end
 
end
end
 
   
if #results > 0 then
+
if #results > 0 then
break;
+
break;
  +
end
 
end
 
end
 
end
 
end
Рядок 130: Рядок 108:
 
end
 
end
   
local function getParentsInBoundariesSnak( context, entityId, boundaries )
+
local function getParentsInBoundariesSnak( context, entity, boundaries )
if not entityId then error('entityId must be specified'); end
+
if ( not entity ) then error('entity must be specified'); end
if type(entityId) ~= 'string' then error('entityId must be string'); end
+
if ( type(entity) ~= 'table' ) then error('entity must be table'); end
if not boundaries then error('boundaries must be specified'); end
+
if ( not boundaries ) then error('boundaries must be specified'); end
if type(boundaries) ~= 'table' then error('boundaries must be table'); end
+
if ( type(boundaries) ~= 'table' ) then error('boundaries must be table'); end
   
local results = getParentsInBoundariesSnakImpl( context, entityId, boundaries, {'P131'} ) -- located in
+
local results = getParentsInBoundariesSnakImpl( context, entity, boundaries, {'P17'} ) -- country
if not results or #results == 0 then
 
results = getParentsInBoundariesSnakImpl( context, entityId, boundaries, {'P17'} ) -- country
 
end
 
   
 
for r, result in pairs( results ) do
 
for r, result in pairs( results ) do
Рядок 146: Рядок 121:
 
end
 
end
 
local resultId = result.datavalue.value.id;
 
local resultId = result.datavalue.value.id;
if resultId == entityId then
+
if ( resultId == entity.id ) then
 
return nil;
 
return nil;
 
end
 
end
Рядок 168: Рядок 143:
 
local isCountry = false;
 
local isCountry = false;
 
local isUnion = false;
 
local isUnion = false;
if entity and
+
if ( entity
entity.claims and
+
and entity.claims
entity.claims.P31
+
and entity.claims.P31 ) then
then
 
 
for c, claim in pairs( entity.claims.P31 ) do
 
for c, claim in pairs( entity.claims.P31 ) do
if claim and
+
if ( claim
claim.mainsnak and
+
and claim.mainsnak
claim.mainsnak.datavalue and
+
and claim.mainsnak.datavalue
claim.mainsnak.datavalue.value and
+
and claim.mainsnak.datavalue.value
claim.mainsnak.datavalue.value.id
+
and claim.mainsnak.datavalue.value['numeric-id'] ) then
  +
local typeId = 'Q' .. claim.mainsnak.datavalue.value['numeric-id'];
then
 
  +
isCountry = isCountry or countries[typeId];
local typeId = claim.mainsnak.datavalue.value.id;
 
isCountry = isCountry or countries[ typeId ];
+
isUnion = isUnion or unions[typeId];
isUnion = isUnion or unions[ typeId ];
 
 
end
 
end
 
end
 
end
Рядок 188: Рядок 161:
 
end
 
end
   
local function isPartOfNext( prevLabel, nextLabel )
+
local function isPartOfNext(prevLabel, nextLabel)
return ( mw.ustring.len( prevLabel ) > mw.ustring.len( nextLabel ) )
+
return (mw.ustring.len(prevLabel) > mw.ustring.len(nextLabel))
and ( mw.ustring.sub( prevLabel, mw.ustring.len( prevLabel ) - mw.ustring.len( nextLabel ) + 1 ) == nextLabel );
+
and (mw.ustring.sub( prevLabel, mw.ustring.len(prevLabel) - mw.ustring.len(nextLabel) + 1 ) == nextLabel);
 
end
 
end
   
Рядок 196: Рядок 169:
 
function p.formatPlaceWithQualifiers( context, options, statement )
 
function p.formatPlaceWithQualifiers( context, options, statement )
 
local property = mw.ustring.upper( options.property );
 
local property = mw.ustring.upper( options.property );
  +
mw.log( 'formatPlaceWithQualifiers(..., ' .. property .. ')');
 
local actualDateBoundariesProperties = nil;
 
if property == 'P19' then actualDateBoundariesProperties = {'P569','P570'}; end
 
if property == 'P20' then actualDateBoundariesProperties = {'P570','P569'}; end
 
if property == 'P119' then actualDateBoundariesProperties = {'P570','P569'}; end
 
 
local boundaries = nil;
 
if actualDateBoundariesProperties ~= nil then
 
boundaries = getTimeBoundariesFromProperties( context, actualDateBoundariesProperties );
 
end
 
   
 
local entriesToLookupCategory = {};
 
local entriesToLookupCategory = {};
Рядок 212: Рядок 176:
 
local result = '';
 
local result = '';
 
local baseResult = context.formatSnak( options, statement.mainsnak, circumstances );
 
local baseResult = context.formatSnak( options, statement.mainsnak, circumstances );
if not baseResult then
 
return nil;
 
end
 
 
 
insertFromSnak( statement.mainsnak, entriesToLookupCategory )
 
insertFromSnak( statement.mainsnak, entriesToLookupCategory )
   
 
local hasAdditionalQualifiers = false;
 
local hasAdditionalQualifiers = false;
if statement.qualifiers then
+
if ( statement.qualifiers ) then
--parent divisions
 
if statement.qualifiers.P131 then
 
for i, qualifier in ipairs( statement.qualifiers.P131 ) do
 
local parentOptions = context.cloneOptions( options );
 
local qualifierEntityId = qualifier.datavalue.value.id;
 
parentOptions['text'] = getLabel( context, qualifierEntityId, boundaries );
 
local link = context.formatSnak( parentOptions, qualifier );
 
 
if p.config.reverseOrder then
 
result = link .. ', ' .. result;
 
else
 
result = result .. ', ' .. link;
 
end
 
insertFromSnak( qualifier, entriesToLookupCategory )
 
hasAdditionalQualifiers = true;
 
end
 
end
 
 
 
--country
 
--country
if statement.qualifiers.P17 then
+
if ( statement.qualifiers.P17 ) then
 
for i, qualifier in ipairs( statement.qualifiers.P17 ) do
 
for i, qualifier in ipairs( statement.qualifiers.P17 ) do
local parentOptions = context.cloneOptions( options );
+
result = result .. ', ' .. context.formatSnak( options, qualifier );
local qualifierEntityId = qualifier.datavalue.value.id;
 
parentOptions[ 'text' ] = getLabel( context, qualifierEntityId, boundaries );
 
local link = context.formatSnak( parentOptions, qualifier );
 
 
if p.config.reverseOrder then
 
result = link .. ', ' .. result;
 
else
 
result = result .. ', ' .. link;
 
end
 
 
insertFromSnak( qualifier, entriesToLookupCategory )
 
insertFromSnak( qualifier, entriesToLookupCategory )
 
hasAdditionalQualifiers = true;
 
hasAdditionalQualifiers = true;
Рядок 257: Рядок 190:
 
end
 
end
   
if statement.mainsnak and
+
if ( statement.mainsnak
statement.mainsnak.datavalue and
+
and statement.mainsnak.datavalue
statement.mainsnak.datavalue.value and
+
and statement.mainsnak.datavalue.value
statement.mainsnak.datavalue.value.id
+
and statement.mainsnak.datavalue.value['numeric-id'] ) then
  +
local entity = mw.wikibase.getEntity( 'Q' .. statement.mainsnak.datavalue.value['numeric-id'] );
then
 
local entityId = statement.mainsnak.datavalue.value.id;
 
 
local parentSnaks = { statement.mainsnak };
 
local parentSnaks = { statement.mainsnak };
local parentEntityIds = { entityId };
+
local parentEntities = { entity };
   
  +
local actualDateBoundariesProperty = nil;
if actualDateBoundariesProperties ~= nil then
 
  +
if ( property == 'P19' ) then actualDateBoundariesProperty = 'P569'; end
local filterCapitalOf = {
 
  +
if ( property == 'P20' ) then actualDateBoundariesProperty = 'P570'; end
[ entityId ] = getParentsInBoundariesSnakImpl( context, entityId, boundaries, {'P1376'} )
 
  +
if ( property == 'P119' ) then actualDateBoundariesProperty = 'P570'; end
};
 
  +
if ( actualDateBoundariesProperty ~= nil ) then
if boundaries then
 
  +
local boundaries = getTimeBoundariesFromProperty( context, actualDateBoundariesProperty );
local entityOptions = context.cloneOptions( options );
 
entityOptions['text'] = getLabel( context, entityId, boundaries );
+
if ( boundaries ) then
  +
local entityOptions = options;
  +
-- local entityOptions = mw.clone( options );
  +
entityOptions['text'] = getLabel( context, entity, boundaries );
 
baseResult = context.formatSnak( entityOptions, statement.mainsnak, circumstances );
 
baseResult = context.formatSnak( entityOptions, statement.mainsnak, circumstances );
   
local parentId = entityId;
+
local parent = entity;
while parentId ~= nil do
+
while ( parent ~= nil ) do
 
-- get parent
 
-- get parent
local newParentSnaks = getParentsInBoundariesSnak( context, parentId, boundaries );
+
local newParentSnaks = getParentsInBoundariesSnak( context, parent, boundaries );
if not newParentSnaks or #newParentSnaks == 0 then
+
if ( not newParentSnaks or #newParentSnaks == 0 ) then
parentId = nil;
+
parent = nil;
elseif #newParentSnaks == 1 then
+
elseif ( #newParentSnaks == 1 ) then
local parentSnak = newParentSnaks[ 1 ];
+
local parentSnak = newParentSnaks[1];
parentId = parentSnak.datavalue.value.id;
+
parent = mw.wikibase.getEntity( 'Q' .. parentSnak.datavalue.value['numeric-id'] );
 
 
table.insert( parentSnaks, parentSnak );
 
table.insert( parentSnaks, parentSnak );
table.insert( parentEntityIds, parentId );
+
table.insert( parentEntities, parent );
filterCapitalOf[ parentId ] = getParentsInBoundariesSnakImpl( context, parentId, boundaries, { 'P1376' } );
 
 
else
 
else
parentId = nil;
+
parent = nil;
  +
result = result .. '[[Категорія:Вікіпедія:Сторінки з неоднозначними геоланками]]';
 
end
 
end
 
end
 
end
   
if not hasAdditionalQualifiers then
+
if ( not hasAdditionalQualifiers ) then
for i = 2, #parentSnaks, 1 do
+
for i=2,#parentSnaks,1 do
local parentSnak = parentSnaks[ i ];
+
local parentSnak = parentSnaks[i];
 
insertFromSnak( parentSnak, entriesToLookupCategory )
 
insertFromSnak( parentSnak, entriesToLookupCategory )
 
end
 
end
 
end
 
end
   
  +
-- mw.logObject( parentSnaks );
 
do
 
do
 
local i = #parentSnaks;
 
local i = #parentSnaks;
while i > 1 do
+
while ( i > 1 ) do
local prevEntityId = parentEntityIds[ i - 1 ];
+
local prevEntity = parentEntities[i - 1];
 
-- TODO: use English labels, if there is no current language labels
 
-- TODO: use English labels, if there is no current language labels
local prevLabel = getLabel( context, prevEntityId, boundaries ) or '';
+
local prevLabel = getLabel( context, prevEntity, boundaries ) or '';
local nextEntityId = parentEntityIds[ i ];
+
local nextEntity = parentEntities[i];
local nextLabel = getLabel( context, nextEntityId, boundaries ) or '';
+
local nextLabel = getLabel( context, nextEntity, boundaries ) or '';
if p.config and p.config.hideSameLabels == true and prevLabel == nextLabel then
+
if ( prevLabel == nextLabel ) then
 
-- do not output same label twice (NY, NY, USA)
 
-- do not output same label twice (NY, NY, USA)
 
table.remove( parentSnaks, i );
 
table.remove( parentSnaks, i );
table.remove( parentEntityIds, i );
+
table.remove( parentEntities, i );
elseif p.config and p.config.hidePartOfLabels == true and isPartOfNext( prevLabel, ' ' .. nextLabel ) then
+
elseif ( isPartOfNext( prevLabel, ' ' .. nextLabel ) ) then
 
-- do not output same label if it's part of previos
 
-- do not output same label if it's part of previos
 
table.remove( parentSnaks, i - 1 );
 
table.remove( parentSnaks, i - 1 );
table.remove( parentEntityIds, i - 1 );
+
table.remove( parentEntities, i - 1 );
elseif p.config and p.config.hideUnitsForCapitals == true then
 
-- do not ouput items whose capital is the first item
 
local capitalId = nil;
 
for _capitalId, capitalSnaks in pairs( filterCapitalOf ) do
 
if #capitalSnaks > 0 then
 
for __, capitalSnak in pairs( capitalSnaks ) do
 
if parentSnaks[ i ].datavalue.value.id == capitalSnak.datavalue.value.id then
 
capitalId = _capitalId;
 
break;
 
end
 
end
 
end
 
end
 
if capitalId ~= nil then
 
if i == #parentSnaks then
 
i = i - 1;
 
end
 
while i > 1 and parentEntityIds[ i ] ~= capitalId do
 
table.remove( parentSnaks, i );
 
table.remove( parentEntityIds, i );
 
i = i - 1;
 
end
 
end
 
 
end
 
end
 
i = i - 1;
 
i = i - 1;
Рядок 344: Рядок 256:
 
end
 
end
   
if isSkipTopLevel( parentEntityIds[ #parentEntityIds ] ) then
+
if ( isSkipTopLevel( parentEntities[ #parentEntities ] ) ) then
table.remove( parentSnaks, #parentEntityIds );
+
table.remove( parentSnaks, #parentEntities );
table.remove( parentEntityIds, #parentEntityIds );
+
table.remove( parentEntities, #parentEntities );
 
end
 
end
   
if not hasAdditionalQualifiers then
+
if ( not hasAdditionalQualifiers ) then
for i = 2, #parentSnaks, 1 do
+
for i=2,#parentSnaks,1 do
local parentSnak = parentSnaks[ i ];
+
local parentSnak = parentSnaks[i];
   
local parentOptions = context.cloneOptions( options );
+
local parentOptions = options;
parentOptions['text'] = getLabel( context, parentEntityIds[ i ], boundaries );
+
-- local parentOptions = mw.clone( options );
  +
parentOptions['text'] = getLabel( context, parentEntities[i], boundaries );
   
  +
result = result .. ', ' .. context.formatSnak( parentOptions, parentSnak );
if p.config.reverseOrder then
 
result = context.formatSnak( parentOptions, parentSnak ) .. ', ' .. result;
 
else
 
result = result .. ', ' .. context.formatSnak( parentOptions, parentSnak );
 
end
 
 
end
 
end
 
end
 
end
Рядок 367: Рядок 276:
 
end
 
end
   
if options[ 'thisLocationOnly' ] then
+
if ( options['thisLocationOnly'] ) then
 
result = baseResult .. context.formatRefs( options, statement );
 
result = baseResult .. context.formatRefs( options, statement );
elseif p.config.reverseOrder then
 
result = result .. baseResult .. context.formatRefs( options, statement );
 
 
else
 
else
 
result = baseResult .. result .. context.formatRefs( options, statement );
 
result = baseResult .. result .. context.formatRefs( options, statement );
 
end
 
end
   
  +
if ( categorizeByPlaceOfBirthAndDeath ) then
if categorizeByPlace then
 
if property == 'P19' then result = result .. getCategory( 'P1464', entriesToLookupCategory ); end
+
if ( property == 'P19' ) then result = result .. getCategory( 'P1464', entriesToLookupCategory ); end
if property == 'P20' then result = result .. getCategory( 'P1465', entriesToLookupCategory ); end
+
if ( property == 'P20' ) then result = result .. getCategory( 'P1465', entriesToLookupCategory ); end
if property == 'P119' then result = result .. getCategory( 'P1791', entriesToLookupCategory ); end
+
if ( property == 'P119' ) then result = result .. getCategory( 'P1791', entriesToLookupCategory ); end
 
end
 
end
   
Рядок 386: Рядок 293:
 
-- append entity id from snak to result
 
-- append entity id from snak to result
 
function insertFromSnak( snak, result )
 
function insertFromSnak( snak, result )
if not categorizeByPlace then
+
if ( not categorizeByPlaceOfBirthAndDeath ) then
 
return;
 
return;
 
end
 
end
if snak and
+
if ( snak
snak.datavalue and
+
and snak.datavalue
snak.datavalue.type == 'wikibase-entityid' and
+
and snak.datavalue.type == 'wikibase-entityid'
snak.datavalue.value and
+
and snak.datavalue.value
snak.datavalue.value[ 'entity-type' ] == 'item'
+
and snak.datavalue.value['entity-type'] == 'item' ) then
  +
table.insert( result, 'Q' .. snak.datavalue.value['numeric-id'] );
then
 
table.insert( result, snak.datavalue.value.id );
 
 
end
 
end
 
end
 
end
   
function getCategory( propertyId, entriesToLookupCategoryFor )
+
function getCategory( propertyToSearch, entriesToLookupCategoryFor )
 
for _, placeId in pairs( entriesToLookupCategoryFor ) do
 
for _, placeId in pairs( entriesToLookupCategoryFor ) do
local claims = mw.wikibase.getBestStatements(placeId, propertyId);
+
local placeEntity = mw.wikibase.getEntity( placeId );
  +
local claims = WDS.filter( placeEntity.claims, propertyToSearch );
   
if claims then
+
if ( claims ) then
 
for _, claim in pairs( claims ) do
 
for _, claim in pairs( claims ) do
if claim.mainsnak and
+
if ( claim.mainsnak
claim.mainsnak and
+
and claim.mainsnak
claim.mainsnak.datavalue and
+
and claim.mainsnak.datavalue
claim.mainsnak.datavalue.type == 'wikibase-entityid'
+
and claim.mainsnak.datavalue.type == "wikibase-entityid" ) then
  +
local catEntityId = 'Q' .. claim.mainsnak.datavalue.value["numeric-id"];
then
 
local catEntityId = claim.mainsnak.datavalue.value.id;
+
local catEntity = mw.wikibase.getEntity( catEntityId );
  +
if ( catEntity and catEntity.sitelinks and catEntity.sitelinks[project] and catEntity.sitelinks[project].title ) then
local catSitelink = mw.wikibase.getSitelink(catEntityId);
 
  +
return '[[' .. catEntity.sitelinks[project].title .. ']]';
if (catSitelink) then
 
return '[[' .. catSitelink .. ']]';
 
 
end
 
end
 
end
 
end
Рядок 421: Рядок 327:
 
return '';
 
return '';
 
end
 
end
 
 
local historicNamesProperties = { 'P1813', 'P1448', 'P1705' };
 
 
local langCode = mw.language.getContentLanguage():getCode();
 
local historicNamesPropertySelectors = {
 
P1813 = 'P1813[language:' .. langCode .. ']',
 
P1448 = 'P1448[language:' .. langCode .. ']',
 
P1705 = 'P1705[language:' .. langCode .. ']'
 
};
 
   
 
-- get current of historic name of place
 
-- get current of historic name of place
function getLabel( context, entityId, boundaries )
+
function getLabel( context, entity, boundaries )
if not entityId then
+
if not entity then
 
return nil;
 
return nil;
 
end
 
end
  +
if (type(entityId) ~= 'string') then error('incorrect type of entityId argument'); end;
 
  +
local lang = mw.language.getContentLanguage();
  +
local langCode = lang:getCode();
   
 
-- name from label
 
-- name from label
  +
-- TODO: lang:getFallbackLanguages()
local label = mw.wikibase.getLabel( entityId );
 
  +
local label = nil;
  +
if entity.labels then
  +
if entity.labels[langCode] and entity.labels[langCode].value then
  +
label = entity.labels[langCode].value;
  +
elseif entity.labels.en and entity.labels.en.value then
  +
label = entity.labels.en.value;
  +
end
  +
end
   
 
-- name from properties
 
-- name from properties
local results = getParentsInBoundariesSnakImpl( context, entityId, boundaries,
+
local results = getParentsInBoundariesSnakImpl( context, entity, boundaries, {
  +
'P1813[language:' .. langCode .. ']',
historicNamesProperties, historicNamesPropertySelectors);
 
  +
'P1448[language:' .. langCode .. ']',
  +
'P1705[language:' .. langCode .. ']'
  +
} );
   
 
for r, result in pairs( results ) do
 
for r, result in pairs( results ) do
if result.datavalue and
+
if result.datavalue
result.datavalue.value and
+
and result.datavalue.value
result.datavalue.value.text
+
and result.datavalue.value.text then
then
 
 
label = result.datavalue.value.text;
 
label = result.datavalue.value.text;
 
break;
 
break;
Рядок 462: Рядок 370:
   
 
local function calculateEndDateTimestamp( context, options, statement )
 
local function calculateEndDateTimestamp( context, options, statement )
if not context then error( 'context not specified' ) end;
+
if (not context) then error('context not specified') end;
if not options then error( 'options not specified' ) end;
+
if (not options) then error('options not specified') end;
if not options.entity then error( 'options.entity missing' ) end;
+
if (not options.entity) then error('options.entity missing') end;
if not statement then error( 'statement not specified' ) end;
+
if (not statement) then error('statement not specified') end;
   
if statement.qualifiers and statement.qualifiers.P582 then
+
if ( statement.qualifiers and statement.qualifiers.P582 ) then
for i, qualifier in ipairs( statement.qualifiers.P582 ) do
+
for i, qualifier in ipairs(statement.qualifiers.P582 ) do
 
local parsedTime = context.parseTimeFromSnak( qualifier );
 
local parsedTime = context.parseTimeFromSnak( qualifier );
if parsedTime then
+
if ( parsedTime ) then
 
return parsedTime;
 
return parsedTime;
 
end
 
end
Рядок 477: Рядок 385:
   
 
-- check death day... do we have it at all?
 
-- check death day... do we have it at all?
for h, propertyId in pairs( { "P570", "P577", "P576" } ) do
+
for h, propertyId in pairs( { "P570", "P577", "P571" } ) do
 
local dateClaims = context.selectClaims( options, propertyId );
 
local dateClaims = context.selectClaims( options, propertyId );
if dateClaims then
+
if ( dateClaims ) then
 
for i, statement in ipairs( dateClaims ) do
 
for i, statement in ipairs( dateClaims ) do
 
local parsedTime = context.parseTimeFromSnak( statement.mainsnak );
 
local parsedTime = context.parseTimeFromSnak( statement.mainsnak );
if parsedTime then
+
if ( parsedTime ) then
 
return parsedTime;
 
return parsedTime;
 
end
 
end
Рядок 496: Рядок 404:
   
 
function p.formatCountryClaimWithFlag( context, options, statement )
 
function p.formatCountryClaimWithFlag( context, options, statement )
if not context then error('context not specified') end;
+
if (not context) then error('context not specified') end;
if not options then error('options not specified') end;
+
if (not options) then error('options not specified') end;
if not options.entity then error('options.entity is missing') end;
+
if (not options.entity) then error('options.entity is missing') end;
if not statement then error('statement not specified') end;
+
if (not statement) then error('statement not specified') end;
   
  +
local countryEntityId = nil;
if not statement.mainsnak or
 
  +
local countryEntity = nil;
not statement.mainsnak.datavalue or
 
not statement.mainsnak.datavalue.value or
+
if ( statement.mainsnak and statement.mainsnak.datavalue and statement.mainsnak.datavalue.value and statement.mainsnak.datavalue.value["numeric-id"] ) then
not statement.mainsnak.datavalue.value.id
+
countryEntityId = 'Q' .. statement.mainsnak.datavalue.value["numeric-id"];
  +
countryEntity = mw.wikibase.getEntity( countryEntityId );
then
 
local result = context.formatStatementDefault( context, options, statement );
 
if not result then
 
return '';
 
end
 
return '<span class="country-name">' .. result .. '</span>';
 
 
end
 
end
 
 
  +
if not countryEntity then
local countryEntityId = statement.mainsnak.datavalue.value.id;
 
  +
return '<span class="country-name">' .. context.formatStatementDefault( context, options, statement ) .. '</span>';
  +
end
  +
 
local endDateTimestamp = calculateEndDateTimestamp( context, options, statement );
 
local endDateTimestamp = calculateEndDateTimestamp( context, options, statement );
 
local boundaries = getTimeBoundariesFromProperties( context, {'P570', 'P577', 'P571'} );
 
local boundaries = getTimeBoundariesFromProperties( context, {'P570', 'P577', 'P571'} );
   
local countryOptions = context.cloneOptions( options );
+
local countryOptions = mw.clone( options );
 
if not countryOptions['text'] or countryOptions['text'] == '' then
 
if not countryOptions['text'] or countryOptions['text'] == '' then
countryOptions['text'] = getLabel( context, countryEntityId, boundaries );
+
countryOptions['text'] = getLabel( context, countryEntity, boundaries );
 
end
 
end
   
 
local flag = Flags.getFlag( context, countryEntityId, endDateTimestamp );
 
local flag = Flags.getFlag( context, countryEntityId, endDateTimestamp );
if flag then
+
if ( flag ) then
return flag .. '&nbsp;<span class="country-name">' ..
+
return flag .. '&nbsp;<span class="country-name">' .. context.formatStatementDefault( context, countryOptions, statement ) .. '</span>';
context.formatStatementDefault( context, countryOptions, statement ) ..
 
'</span>';
 
 
end
 
end
   
return '<span class="country-name">' ..
+
return '<span class="country-name">' .. context.formatStatementDefault( context, countryOptions, statement ) .. '</span>';
context.formatStatementDefault( context, countryOptions, statement ) ..
 
'</span>';
 
 
end
 
end
   

Будь ласка, зверніть увагу, що будь-які додавання й зміни у Вікіпедїї розглядаються як здійснені на умовах GNU Free Documentation License без незмінюваних секцій та Creative Commons Attribution/Share-Alike. Якщо Ви не бажаєте, щоб написане Вами безжалісно редагувалось і розповсюджувалося за бажанням будь-кого, — не пишіть тут.

Ви також гарантуєте, що написане Вами належить Вам чи взято з джерела, яке є суспільною власністю чи подібним вільним джерелом.
НЕ ПУБЛІКУЙТЕ ТУТ БЕЗ ДОЗВОЛУ ТВОРИ, ЩО Є ОБ'ЄКТОМ АВТОРСЬКОГО ПРАВА, Й ЛІЦЕНЗІЯ ЯКИХ НЕ ДОЗВОЛЯЄ ПОДІБНОЇ ПУБЛІКАЦІЇ!

Скасувати Довідка про редагування (відкривається в новому вікні)
Попередній перегляд сторінки з цим шаблоном

Шаблони, використані на цій сторінці: