Модуль:Картка автора

Матеріал з Вікіджерел

Документацію для цього модуля можна створити у Модуль:Картка автора/документація

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]]&nbsp;"..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;