Модуль:authors

Эта страница бессрочно защищена от изменения
Материал из Викисловаря
Документация

Модуль предназначен для форматирования ссылки и категории по имени автора. Этот модуль используется в шаблоне {{автор}}, который вызывается в шаблоне {{пример}}.

Описание функций и параметров

  • getAuthors — локальная функция формирования таблицы авторов с псевдонимами. Используется внутри модуля.
  • list — функция отображения таблицы авторов в виде HTML таблицы или списка. Используется в шаблоне документации.
    Принимает один параметр type=, который может иметь значения:
    • table — показать как таблицу (в колонке "Код" будут отображаться и фамилия автора и псевдонимы )
    • list — показать таблицу как список в формате код → ссылка категория
    • в остальных случаях будут отображаться код, ссылки, категория через запятую.
    • Вызов из шаблона: {{#invoke:authors|list|type=table}}
  • find — функция поиска автора в таблице. Используется в шаблоне {{автор}}. Возвращает ссылку на страницу автора в Википедии и добавляет категорию.
    Принимает один неименованный параметр — фамилию автора

Используемые модули

Таблица авторов содержится в модуле authors/data. Для каждой строки таблицы формируются псевдонимы, если заданы первое (фамилия), второе (имя) и третье (отчество) значения.

Например для следующей строки, кроме «Солж» будут сформированы псевдонимы «Солженицын», «Александр Солженицын» и «А. И. Солженицын»

 ["Солж"] = {"Солженицын", "Александр", "Исаевич"},

Категория и ссылки формируется по фамилии, имени и отчеству. Например для вышеуказанной строки будет сформированы

В случае, если ссылка в Википедии отличается от формируемой автоматически, её следует задаваться принудительно параметром link. Например:

["Обручев"] = {"Обручев", "Владимир", "Афанасьевич", link="[[w:Обручев, Владимир Афанасьевич (геолог)|В. А. Обручев]]", cat="Обручев В. А."},

Для авторов без отчества — и категории и ссылки должны задаваться принудительно параметрами link и cat. Например:

 ["Хемингуэй"] = {"Хемингуэй", "Эрнест", link="[[w:Хемингуэй, Эрнест|Э. Хемингуэй]]", cat="Хемингуэй Э."},

Дополнительные псевдонимы задаются строкой с единственным полем alias. Например:

 ["Hemingway"] = {alias="Хемингуэй"},

Подробнее о формате таблицы смотри на странице документации модуля.

local data = mw.loadData("Module:authors/data")
local p = {}

local function getAuthors ()
    local result = {};
    for key,v in pairs(data) do
        local firstname = v[1];
        local secondname = v[2];
        local thirdname = v[3];
        if v.alias ~= nil then
            result[key] = { alias = v.alias };
        else
            result[key] = { link = v.link, cat = v.cat}; 
        end
        if v.cat ~= nil then
            result[key].cat = "[[Категория:Цитаты/" .. v.cat .. "]]";
        end
        if firstname ~= nil and firstname ~= "" then
            if firstname ~= key and result[firstname] == nil then
                result[firstname] = { alias = key };
            end
            if secondname ~= nil and secondname ~= "" then
                local a = secondname .. " " .. firstname;
                if result[a] == nil then
                	result[a] = { alias = key };
                end
                if thirdname ~= nil and thirdname ~= "" then
                    local sn = mw.ustring.sub(secondname,1,1);
                    local tn = mw.ustring.sub(thirdname,1,1);
                    a = sn .. ". " .. tn .. ". " .. firstname;
                    result[a] = { alias = key };
                    if v.link == nil then
                        result[key].link =  mw.text.decode("[[w:" .. firstname .. ", " .. secondname .. " " .. thirdname .. "|" ..
                          sn ..". " .. tn .. ". " .. firstname .. "]]");
                    end
                    if v.cat == nil then
                        result[key].cat = "[[Категория:Цитаты/" .. firstname .. " " .. sn .. ". " .. tn .. ".]]";
                    end;
                end
            end
        end
    end
    return result;
end;

function p.list(frame)
    local authors = getAuthors();
    local list_type = frame.args["type"];
    local result = "";
    local names = {};
    local aliases = {};
    for key, value in pairs(authors) do
        if value.alias == nil then
            table.insert(names, key);
        else
            if aliases[value.alias] == nil then
                aliases[value.alias] = { key };
            else
                table.insert(aliases[value.alias], key);
            end
        end
    end
    table.sort(names);
    for i, key in ipairs(names) do
        local catlink = authors[key].cat; 
        if catlink ~= nil then
            catlink = mw.ustring.gsub(catlink, "Категория", ":Категория");
        else 
            catlink = "nil"
        end
        local wikilink = authors[key].link; 
        if list_type == "table" then
            local  code = "<code>{{автор|" .. key .. "}}</code>";
            if aliases[key] ~= nil then
                for j, alias in ipairs(aliases[key]) do 
                   code = code .. "<br/><code>{{автор|" .. alias .. "}}</code>" 
                end
            else
            end
            result = result .. mw.text.tag("tr", nil, 
                table.concat( 
                {   mw.text.tag("td", nil, code), 
                    mw.text.tag("td", nil, authors[key].link or "nil"), 
                    mw.text.tag("td", nil, catlink)
                }, "")) .. "\n";
        elseif list_type == "list" then
            result = result .. "* <code>{{автор|" .. key .. "}}</code> → " .. (authors[key].link or "nil") .. " - " .. catlink .. "\n";
        else
            result = result .. table.concat( {key, authors[key].link or "nil", catlink}, ", ") .. "\n";
        end
    end
    if result ~= "" and list_type == "table" then
        result = mw.text.tag("tr", nil, 
            table.concat( 
                {   mw.text.tag("th", nil, "Код"), 
                    mw.text.tag("th", nil, "Ссылка"), 
                    mw.text.tag("th", nil, "Категория")
                }, "")) .. "\n" .. result;
        result = mw.text.tag("table", {class="standard"}, result) .. "\n";
    end
    return result;
end

function p.find(frame)
    local result = frame.args[1];
    if result ~= nil and type(result)=='string' and result ~= "" then
        local authors = getAuthors();
        local name = mw.ustring.gsub(result, mw.ustring.char(160), " "); -- замена неразрывных пробелов
        local f = authors[name];
        if f ~= nil then
            if f.alias ~= nil then
                local af = authors[f.alias];
                if af ~= nil then
                    f = af
                end
            end;
            if f.link ~= nil then
                result = f.link;
            end
            if mw.title.getCurrentTitle().namespace == 0 and f.cat ~= nil then
                result = result .. f.cat;
            end    
        end;
    end
    return result;
end

--
return p;