Документацію для цього модуля можна створити у Модуль: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] = '&nbsp;';
	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;