Модуль:authors
Модуль предназначен для форматирования ссылки и категории по имени автора. Этот модуль используется в шаблоне {{автор}}, который вызывается в шаблоне {{пример}}.
Описание функций и параметров
getAuthors
— локальная функция формирования таблицы авторов с псевдонимами. Используется внутри модуля.list
— функция отображения таблицы авторов в виде HTML таблицы или списка. Используется в шаблоне документации.- Принимает один параметр
type=
, который может иметь значения:table
— показать как таблицу (в колонке "Код" будут отображаться и фамилия автора и псевдонимы )list
— показать таблицу как список в формате код → ссылка категория- в остальных случаях будут отображаться код, ссылки, категория через запятую.
- Вызов из шаблона:
{{#invoke:authors|list|type=table}}
- Принимает один параметр
find
— функция поиска автора в таблице. Используется в шаблоне {{автор}}. Возвращает ссылку на страницу автора в Википедии и добавляет категорию.- Принимает один неименованный параметр — фамилию автора
- Вызов из шаблона:
{{#invoke:authors|find|Пушкин}}
→ А. С. Пушкин
- Вызов из шаблона:
- Принимает один неименованный параметр — фамилию автора
Используемые модули
Таблица авторов содержится в модуле authors/data. Для каждой строки таблицы формируются псевдонимы, если заданы первое (фамилия), второе (имя) и третье (отчество) значения.
Например для следующей строки, кроме «Солж» будут сформированы псевдонимы «Солженицын», «Александр Солженицын» и «А. И. Солженицын»
["Солж"] = {"Солженицын", "Александр", "Исаевич"},
Категория и ссылки формируется по фамилии, имени и отчеству. Например для вышеуказанной строки будет сформированы
- категория — Категория:Цитаты/Солженицын А. И..
- ссылка —
[[w:Солженицын, Александр Исаевич|А. И. Солженицын]]
→ А. И. Солженицын
В случае, если ссылка в Википедии отличается от формируемой автоматически, её следует задаваться принудительно параметром 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;