Module:Arbre généalogique Wikidata/Rendu HTML
La documentation de ce module est générée par le modèle {{Documentation module}}.
Les éditeurs peuvent travailler dans le bac à sable (créer).
Voir les statistiques d'appel depuis le wikicode sur l'outil wstat et les appels depuis d'autres modules.
local p = {}
local function formatCentury( year )
local moduleRoman = require( "Module:RomanNumber" )
if ( year < 0 ) then
local century = math.floor( (math.abs( year ) - 1) / 100 ) + 1;
local infix = ' в ';
if century == 2 then infix = ' во '; end;
if ( moduleRoman ) then
century = moduleRoman.toRomanNumber( century );
end
return century .. '<sup>e</sup> siècle av. J.-C.'
else
local century = math.floor( ( year - 1) / 100 ) + 1;
local infix = ' в ';
if (century == 2) then infix = ' во ' end;
if ( moduleRoman ) then
century = moduleRoman.toRomanNumber( century );
end
return century .. ' в.'
end
end
local function formatParsedTimeValue( parsedValue )
if ( parsedValue == nil ) then
return nil;
elseif ( parsedValue.precision > 8 ) then
if ( parsedValue.year >= 0 ) then
return parsedValue.year;
else
return ( 0 - parsedValue.year ) .. ' av. J.-C.';
end
return parsedValue.year;
elseif ( parsedValue.precision == 8) then
if ( parsedValue.year >= 0 ) then
return (parsedValue.left - 1) .. '-е';
else
return (0 - (parsedValue.left - 1) ) .. '-е av. J.-C.';
end
elseif ( parsedValue.precision == 7) then
return formatCentury( parsedValue.year );
else
mw.log( 'Unsupported precision: ' .. parsedValue.precision );
mw.log( parsedValue );
return 'unsupported';
end
end
local function compareAsStrings( a, b )
return ('' .. a) < ('' .. b);
end
local function concat( parsedTimeValuesTable )
local tmp = {};
for _, value in pairs( parsedTimeValuesTable ) do
table.insert( tmp , formatParsedTimeValue(value) );
end
table.sort( tmp, compareAsStrings );
return table.concat( tmp, ' / ' );
end
local function printLifespan( entityId )
local birth = parseTimeValues( entityId, 'P569' );
local death = parseTimeValues( entityId, 'P570' );
if (birth == nil and death == nil) then return nil end
if (birth ~= nil and death == nil) then return '°' .. concat( birth ) end
if (birth == nil and death ~= nil) then return '? - ' .. concat( death ) end
if (birth ~= nil and death ~= nil) then
local bString = concat( birth );
local dString = concat( death );
if (bString == dString) then
return bString;
else
return bString .. ' — ' .. dString;
end
end
return nil;
end
local function printEntity( options, entityId )
local html = printEntityLabel( entityId );
if ( options.years == "label-line" ) then
local lifespan = printLifespan( entityId );
if ( lifespan ~= nil) then html = html .. ' <span class="years">(' .. lifespan .. '</span>)' end
end
if ( options.descriptions ) then
local description = mw.wikibase.getDescription( entityId );
if ( description ) then
if ( options.descriptions == true or options.descriptions == "next-line" or options.descriptions == "new-line" ) then
html = html .. '<br>'
else
html = html .. ', ';
end
html = html .. '<span class="descriptions">' .. description .. '</span>';
end
end
if ( options.years == true or options.years == "next-line" or options.years == "new-line" ) then
local lifespan = printLifespan( entityId );
if ( lifespan ~= nil) then html = html .. '<br><div class="years">' .. lifespan .. '</div>' end
end
return html;
end
local function printEntityCell( options, attrs, node )
local entityId = node.entityId;
local generation = node.generation;
return '<td class="Q gen' .. generation ..'" ' .. attrs .. '>'.. printEntity( options, entityId ) ..'</td>';
end
local ROTATE = {W="N",S="E",E="S",N="W"};
local INVERT_HORIZONTAL = {W="E",S="S",E="W",N="N"};
function p.renderHtmlHorizontal( options, node )
local invert = options.invert;
local resultHeight = node.resultHeight;
local resultWidth = node.resultWidth;
if (type(resultHeight) ~= 'number') then error("node.resultHeight expected to be number"); end
if (type(resultWidth) ~= 'number') then error("node.resultWidth expected to be number"); end
local renderResult = node.renderResult;
local yStart = invert and resultHeight or 1;
local yEnd = invert and 1 or resultHeight;
local yStep = invert and -1 or 1;
local html = '<div class="wikidata-familyTree wikidata-familyTree-horizontal wikidata-familyTree-decorate-' .. options.decorate .. '"><table>\n'
for x=1,resultWidth do
html = html .. '<tr><td></td>\n'
for y=yStart,yEnd,yStep do
local cell = renderResult[y][x];
if (cell == nil) then
if ( y ~= yStart and renderResult[y - yStep][x] == nil ) then
-- skip, because handled by next block
elseif ( renderResult[y][x] == nil ) then
local colspan = 0;
for yToSpan = y, yEnd, yStep do
if ( renderResult[ yToSpan ][x] == nil ) then
colspan = colspan + 1;
else
break;
end
end
if (colspan == 1) then
html = html .. '<td class=Z ></td>\n';
else
html = html .. '<td colspan=' .. colspan .. ' class=Z ></td>\n';
end
end
elseif ( cell == BUSY ) then
-- just skip
elseif ( cell ~= nil and cell.entityId ) then
html = html .. printEntityCell( options, 'colspan=' .. ELEMENT_HEIGHT .. ' rowspan=' .. ELEMENT_WIDTH, cell ) .. '\n';
else
html = html .. '<td class="line ' .. cell .. '">';
for p = 1,string.len(cell) do
local lineClass = ROTATE[string.sub(cell, p, p)];
if ( invert ) then lineClass = INVERT_HORIZONTAL[lineClass] end
html = html .. '<span class=' .. lineClass .. '></span>';
end
html = html .. '</td>\n';
end
end
html = html .. '<td></td></tr>\n'
end
html = html .. '</table></div>'
return html;
end
function p.renderHtmlVertical( options, node )
local resultHeight = node.resultHeight;
local resultWidth = node.resultWidth;
if (type(resultHeight) ~= 'number') then error("node.resultHeight expected to be number"); end
if (type(resultWidth) ~= 'number') then error("node.resultWidth expected to be number"); end
local renderResult = node.renderResult;
local html = '<div class="wikidata-familyTree wikidata-familyTree-vertical wikidata-familyTree-decorate-' .. options.decorate .. '"><table>\n'
for y=1,resultHeight do
local renderLine = renderResult[y];
html = html .. '<tr>\n'
for x=1,resultWidth do
local cell = renderLine[x];
if (cell == nil) then
html = html .. '<td class=Z></td>\n';
elseif ( cell == BUSY ) then
-- just skip;
elseif ( cell ~= nil and cell.entityId ) then
html = html .. printEntityCell( options, 'colspan=' .. ELEMENT_WIDTH .. ' rowspan=' .. ELEMENT_HEIGHT, cell ) .. '\n';
else
html = html .. '<td class="line ' .. cell .. '">';
for p = 1,string.len(cell) do
html = html .. '<span class=' .. string.sub(cell, p, p) .. '></span>';
end
html = html .. '</td>\n';
end
end
html = html .. '</tr>\n'
end
html = html .. '</table></div>'
return html;
end
return p