Модуль:Картка автора
Документацію для цього модуля можна створити у Модуль:Картка автора/документація
local p = {}
--Функція яка перевіряє чи є значення порожнім (nil, порожній рядок або дефіс)
function is_empty(ie_val)
if(ie_val) then --якщо не nil, перевірити на порожній рядок
if(string.len(ie_val)>0) then return false; --довжина значення не нуль, значить не порожнє
else return true; end --порожній рядок значить порожнє
else return true; end --nil значить порожнє
end
--Функція отримує номер елемента у Вікіданих і повертає посилання на відповідну сторінку
--у Вікіджерелах або у Вікіпедії, а за відсутності таких просто текстову позначку (label)
function title_for(stat_value, default)
if(not default) then default = "''невідомо''"; end
if(stat_value.snaktype=="somevalue") then return default; end
tf_item = mw.wikibase.getEntity(stat_value.datavalue.value.id);
if(tf_item.sitelinks and tf_item.sitelinks.ukwikisource) then --знайдено сторінку у Вікіджерелах
page = tf_item.sitelinks.ukwikisource.title;
return "[["..page.."|"..mw.text.split(page, " %(")[1].."]]";
elseif(tf_item.sitelinks and tf_item.sitelinks.ukwiki) then --знайдено сторінку у Вікіпедії
page = tf_item.sitelinks.ukwiki.title;
return "[[:w:"..page.."|"..mw.text.split(page, " %(")[1].."]]";
elseif(tf_item.labels.uk) then return tf_item.labels.uk.value; --знайдено текстову позначку українською
else return ""; end --якщо нічого з переліченого вище не знайдено, повернути порожній рядок
end
--Функція перетворює позначку часу із Вікіданих у форматі +yyyy-mm-ddThh:mm:ss/pp на людиночитабельну дату
function timestamp_to_text(time_object)
if(time_object.snaktype=="somevalue") then return "''дата невідома''"; end
time_object = time_object.datavalue.value;
era = mw.text.truncate(time_object.time, 1, ""); --знак "+" якщо наша ера, знак "-" якщо до н.е.
if(era=="-") then date_suffix = " до н.е."; else date_suffix = ""; end
months_nom = {"січень", "лютий", "березень", "квітень", "травень", "червень",
"липень", "серпень", "вересень", "жовтень", "листопад", "грудень"};
months_gen = {"січня", "лютого", "березня", "квітня", "травня", "червня",
"липня", "серпня", "вересня", "жовтня", "листопада", "грудня"};
ttt_res = string.sub(time_object.time, 2); --прибрати "+" або "-" спереду
ttt_res = mw.text.split(ttt_res, "T")[1]; --прибрати частину після "T" (час доби)
ttt_res = mw.text.split(ttt_res, "-"); --те що залишило розділити на рік, місяць та день
local y = tonumber(ttt_res[1]);
local m = tonumber(ttt_res[2]);
local d = tonumber(ttt_res[3]);
if(time_object.precision>=11) then return d.." "..months_gen[m].." "..y..date_suffix; --точність до дня або більше
elseif(time_object.precision==10) then return months_nom[m].." "..y..date_suffix; --точність до місяця
elseif(time_object.precision==9) then return y..date_suffix; --точність до року
elseif(time_object.precision==8) then return (math.floor(y/10)*10).."-ті"..date_suffix; --точність до десятириччя
elseif(time_object.precision==7) then return math.ceil(y/100).."-те ст."..date_suffix; --точність до сторіччя
else return "?"; end
end
--Головна функція
function p.main(frame)
parent = frame:getParent();
args = parent.args;
item = mw.wikibase.getEntity(mw.wikibase.getEntityIdForCurrentPage()); --отримання елементу вікіданих
res = {'{| class="infobox" style="width: 250px; font-size: 90%;"'}; --таблиця результатів
--Ім'я
if(is_empty(args["ім'я"])) then args["ім'я"] = "{{PAGENAME}}"; end --якщо аргумент "ім'я" не задано, використати назву сторінки
table.insert(res, '\n|- style="font-size:120%; text-align:center; background-color:#C1D8FF"\n| colspan="2" style="padding:5px" | '
.."<big>'''"..args["ім'я"].."'''</big>");
--Портрет
if(is_empty(args["портрет"]) and item and item.claims and item.claims["P18"])
then --якщо аргумент "портрет" не задано, взяти значення із Вікіданих
args["портрет"] = item:getBestStatements('P18')[1].mainsnak.datavalue.value;
elseif(is_empty(args["портрет"])) then --якщо зображення нема, використати зображення-заставку
args["портрет"] = "Gray - replace this image male.svg";
end
if(is_empty(args["портрет_ширина"])) then args["портрет_ширина"] = "240x300px"; end --якщо ширину портрета не задано, використати значення за замовчуванням
table.insert(res, '\n|-\n| align="center" colspan="2" | [[Файл:'..
args["портрет"].."|"..args["портрет_ширина"].."|center|"..args["ім'я"].."]]");
--Місце та час народження
if(is_empty(args["місце_народження"]) and item and item.claims and item.claims["P19"]) then
args["місце_народження"] = title_for(item:getBestStatements('P19')[1].mainsnak, "''невідоме місце''"); end
if(is_empty(args["дата_народження"]) and item and item.claims and item.claims["P569"]) then
args["дата_народження"] = timestamp_to_text(item:getBestStatements('P569')[1].mainsnak); end
if(args["місце_народження"] or args["дата_народження"]) then table.insert(res, "\n|-\n| Народження || "); end
if(args["місце_народження"]) then table.insert(res, args["місце_народження"]); end
if(args["місце_народження"] and args["дата_народження"]) then table.insert(res, ", <br/>"); end
if(args["дата_народження"]) then table.insert(res, args["дата_народження"]); end
--Місце та час смерті
if(is_empty(args["місце_смерті"]) and item and item.claims and item.claims["P20"]) then
args["місце_смерті"] = title_for(item:getBestStatements('P20')[1].mainsnak, "''невідоме місце''"); end
if(is_empty(args["дата_смерті"]) and item and item.claims and item.claims["P570"]) then
args["дата_смерті"] = timestamp_to_text(item:getBestStatements('P570')[1].mainsnak); end
if(args["місце_смерті"] or args["дата_смерті"]) then table.insert(res, "\n|-\n| Смерть || "); end
if(args["місце_смерті"]) then table.insert(res, args["місце_смерті"]); end
if(args["місце_смерті"] and args["дата_смерті"]) then table.insert(res, ",<br/>"); end
if(args["дата_смерті"]) then table.insert(res, args["дата_смерті"]); end
--Псевдонім
if(is_empty(args["псевдонім"]) and args["псевдонім"]~="-" and item and item.claims and item.claims["P742"]) then
pseudo_list = {};
--може бути багато значень P742, треба додати кожне до таблиці
for i = 1,#item.claims["P742"],1 do
table.insert(pseudo_list, item.claims["P742"][i].mainsnak.datavalue.value); end
args["псевдонім"] = table.concat(pseudo_list, ", <br/>"); --результатом є об'єднана таблиця, з комою і переносом рядка і якості розділювача
end
if( (not is_empty(args["псевдонім"])) and args["псевдонім"]~="-") then
table.insert(res, "\n|-\n| [[w:Псевдонім|Псевдонім]] || "..args["псевдонім"]); end
--Громадянство
if(is_empty(args["громадянство"]) and item and item.claims and item.claims["P27"]) then
args["громадянство"] = title_for(item:getBestStatements('P27')[1].mainsnak, "''невідоме''");
country_item = mw.wikibase.getEntity(item:getBestStatements('P27')[1].mainsnak.datavalue.value.id);
if(country_item and country_item.claims["P41"]) then
args["громадянство"] = "[[Файл:"..
country_item:getBestStatements('P41')[1].mainsnak.datavalue.value..
"|20x13px]] "..args["громадянство"]; end
end
if(not is_empty(args["громадянство"])) then
table.insert(res, "\n|-\n| Громадянство || "..args["громадянство"]); end
--Жанри
if(is_empty(args["жанри"]) and item and item.claims and item.claims["P136"]) then
genre_list = {};
--може бути багато значень P136, треба додати кожне до таблиці
for i = 1,#item.claims["P136"],1 do
table.insert(genre_list, title_for(item.claims["P136"][i].mainsnak, "''невідомі''")); end
args["жанри"] = table.concat(genre_list, ", <br/>"); --результатом є об'єднана таблиця, з комою і переносом рядка і якості розділювача
end
if(not is_empty(args["жанри"])) then
table.insert(res, "\n|-\n| Жанри || "..args["жанри"]); end
--Мови творів
if(is_empty(args["мови"]) and item and item.claims and item.claims["P6886"]) then
language_list = {};
--може бути багато значень P6886, треба додати кожне до таблиці
for i = 1,#item.claims["P6886"],1 do
language_entry = item.claims["P6886"][i].mainsnak;
language_entry = title_for(language_entry, "''невідома мова''");
language_entry = string.gsub(language_entry," мова]]", "]]")
table.insert(language_list, language_entry); end
args["мови"] = table.concat(language_list, ", <br/>");
end
if(not is_empty(args["мови"])) then
table.insert(res, "\n|-\n| Мови творів || "..args["мови"]); end
--Роботи
if(is_empty(args["роботи"]) and item and item.claims and item.claims["P800"]) then
werken_list = {};
--може бути багато значень P800, треба додати кожне до таблиці
for i = 1,#item.claims["P800"],1 do
table.insert(werken_list, title_for(item.claims["P800"][i].mainsnak, "''невідомі''")); end
args["роботи"] = table.concat(werken_list, ", <br/>");
end
if(not is_empty(args["роботи"])) then
table.insert(res, "\n|-\n| Основні роботи || "..args["роботи"]); end
--Посилання на статтю у Вікіпедії
if(item and item.sitelinks and item.sitelinks.ukwiki) then
table.insert(res, '\n|-\n| colspan="2" | <hr/>\n|-\n| colspan="2" | [[Файл:Wikipedia-logo.png|20px|left]]'..
" '''[[:w:"..item.sitelinks.ukwiki.title.."|Більше про автора]] у [[w:Головна сторінка|Вікіпедії]]'''");
end
return frame:preprocess(table.concat(res)..'\n|}'); --остаточним результатом є об'єднана таблиця
end
return p;