Модуль:Author/new
Документацію для цього модуля можна створити у Модуль:Author/new/документація
local Error = require('Модуль:Error');
local Sister = require('Модуль:Plain sister');
local getArgs = require('Модуль:Arguments').getArgs
local Wikidata = require('Модуль:Wikidata/new')
local this = {};
local migrationNeeded = false;
local birthNeeded = false;
local capitalize = function(str)
if not str then
return str
end
return mw.ustring.upper(mw.ustring.sub(str, 1, 1))..mw.ustring.sub(str, 2)
end
this.capitalize = capitalize
local getLocalValue = function(args, argNames, defaultName)
for key, argName in pairs(argNames) do
local value = args[argName]
if value then
return value
end
end
return defaultName
end
-- process empty arguments as not specified
local function filterEmpty(text, defaultValue)
if text and mw.ustring.len(text) > 0 then
return text;
end
return defaultValue;
end
-- handle boolean argument (yes/no)
local function toBoolean(value, defaultValue)
if defaultValue then
-- default value is true
value = mw.ustring.lower(filterEmpty(value, 'yes'));
return value == 'yes' or value == 'так';
else
-- default value is false
value = mw.ustring.lower(filterEmpty(value, 'no'));
return not (value == 'no' or value == 'ні');
end
end
local getValue = function(args, localArgNames, wikidataValue)
local localValue = getLocalValue(args, localArgNames, nil)
if localValue then
migrationNeeded = true
else
localValue = wikidataValue
end
return localValue
end
local function parseDate(text)
local BC = mw.ustring.match(text, '^%s*%-') or mw.ustring.match(text, 'до н%.%s?е%.') or string.match(text, 'BCE$');
local date = mw.ustring.match(text, '%d+');
if not date then
return nil;
end
if BC then
return date, ' до н. е.'
else
return date, '';
end;
end
function this.main(frame)
-- parse arguments
local args = getArgs(frame);
local firstname = getValue(args, {'ім\'я', 'firstname'}, Wikidata.getRawValue({'P735'})) or '';
local lastname = getValue(args, {'прізвище', 'lastname'}, Wikidata.getRawValue({'P734'})) or '';
local fullname = firstname..(firstname and (firstname ~= '') and ' ' or '')..lastname;
if fullname == '' then
fullname = mw.wikibase.label(mw.wikibase.getEntityIdForCurrentPage());
end
fullname = getLocalValue(args, {'перевизначити_ім\'я', 'override_name'}, fullname);
-- get the initial
local initial = getLocalValue(args, {'ініціал', 'last_initial'}, nil);
if not initial then
if mw.ustring.len(lastname)>0 then
initial = mw.ustring.sub(lastname, 1, 1)
elseif mw.ustring.len(firstname)>0 then
initial = mw.ustring.sub(firstname, 1, 1)
end
end
if initial then
initial = capitalize(initial);
end;
-- get dates
local rawBirth = getValue(args, {'рік_народження', 'birthyear'}, Wikidata.getDateValue({'P569', 'y'})) or '?';
local rawDeath = getValue(args, {'рік_смерті', 'deathyear'}, Wikidata.getDateValue({'P570', 'y'})) or '';
local birth, birthSuffix = parseDate(rawBirth);
local death, deathSuffix = parseDate(rawDeath);
if not birth then
birthNeeded = true;
end
-- other params
local description = capitalize(getValue(args, {'опис', 'description'}, Wikidata.descriptionIn()) or '');
local defaultsort = getLocalValue(args, {'defaultsort'}, nil);
local image = getValue(args, {'зображення', 'image'}, Wikidata.getRawValue('P18'));
local image_caption = getLocalValue(args, {'підпис_зображення', 'image_caption'}, nil) or fullname;
if toBoolean(args['без_зображення'], false) or toBoolean(args['no_image'], false) then
image = nil;
end
-- do the main job
-- header
local result = {'{| class="authortemplate"\n|-\n| class="gen_header_backlink" |\n| class="gen_header_title" |\'\'\''};
result[#result + 1] = fullname;
result[#result + 1] = '\'\'\'<br />';
if birth or death then
result[#result + 1] = (birth and birth or '')..(birthSuffix and birthSuffix or '');
result[#result + 1] = '—';
result[#result + 1] = (death and death or '')..(deathSuffix and deathSuffix or '');
else
result[#result + 1] = ' ';
end
result[#result + 1] = '\n| class="gen_header_forelink" |\n|}\n'
-- notes
result[#result + 1] = '{| class="author_notes"\n|-\n|';
result[#result + 1] = Sister.main(frame);
result[#result + 1] = '\n'
result[#result + 1] = description;
result[#result + 1] = '\n|}'
-- image
if image then
result[#result + 1] = '[[Файл:';
result[#result + 1] = image;
result[#result + 1] = '|thumb|';
result[#result + 1] = frame:expandTemplate{ title = 'Center', args = {image_caption} };
result[#result + 1] = ']]';
end
-- DEFAULTSORT and categories
result[#result + 1] = '{{DEFAULTSORT:';
if defaultsort then
result[#result + 1] = defaultsort;
else
if lastname then
result[#result + 1] = lastname;
result[#result + 1] = ', ';
end
result[#result + 1] = firstname;
end
result[#result + 1] = '}}';
result[#result + 1] = '[[Категорія:Автори]]';
result[#result + 1] = '[[Категорія:Автори';
if initial then
result[#result + 1] = '-';
result[#result + 1] = initial;
else
result[#result + 1] = ' без ініціалів';
end
result[#result + 1] = ']]';
if birth then
result[#result + 1] = '[[Категорія:Народжені у ';
result[#result + 1] = birth;
result[#result + 1] = '-ому'
if birthSuffix then
result[#result + 1] = birthSuffix;
end
result[#result + 1] = ']]';
end
if death then
result[#result + 1] = '[[Категорія:Померлі у ';
result[#result + 1] = death;
result[#result + 1] = '-ому'
if deathSuffix then
result[#result + 1] = deathSuffix;
end
result[#result + 1] = ']]';
end
if migrationNeeded or birthNeeded then
result[#result + 1] = '[[Категорія:Дані до перенесення до Вікіданих]]';
end
if not Wikidata.pageId() then
result[#result + 1] = '[[Категорія:Сторінки авторів без прив\'язки до Вікіданих]]';
end
return frame:preprocess(table.concat(result));
end
return this;