Модуль:Источники по теме/Категоризация

Материал из Викитеки — свободной библиотеки
Документация Документация

Выполняется из Модуль:Источники по теме на последнем этапе, работает по ранее собранным и сортированным данным объекта page.

Кроме данных объекта page, используются некоторые переменные-флаги:

  • page.is_author_page

Ставятся в Модуль:Источники по теме/wikidata:

  • page.has_encyclopedic_article_status_in_wd
  • page.has_topic_property
local RU = 'ru'
local WIKISOURCE = 'wikisource'
local RUWIKISOURCE = 'ruwikisource'

local p = {}
local page

local function categorization_wikiprojects(source)
	-- Для страниц авторов категории дальше меняются в Модуль:Обавторе в change_wd_categories()
	-- переделать сюда
    mw.logObject(source, "source")
	-- википроекты
	for _, d in pairs(source or page.projects) do
		local project = d.project
		local prj_name = project.name

		if d.manual_link and not string.match(d.manual_link, 'Special:Search') then
			page:add_category_raw('Ручная ссылка:' .. prj_name)
		end

		if d.wd_link then
			local is_author_page_ws_replaced = page.is_author_page and project.project == WIKISOURCE
			if d.wd_lang == nil then
				page:add_category_raw('Ссылка из Викиданных:' .. prj_name)
			elseif d.wd_lang == RU then
				if not d.manual_link and not is_author_page_ws_replaced then
					page:add_category_raw('Ссылка из Викиданных:' .. prj_name)
				end
			else
				if not d.manual_link and not is_author_page_ws_replaced then
					page:add_category_raw('Ссылка из Викиданных на интервики:' .. prj_name .. ':язык:' .. d.wd_lang)
				end
			end
		end

		if d.manual_link and d.wd_link and d.wd_lang then
			if d.manual_link == d.wd_link then
				page:add_category_raw('Ручная ссылка совпадает со ссылкой из Викиданных:' .. prj_name)
			else
				page:add_category_raw('Ручная ссылка отличается от ссылки из Викиданных:' .. prj_name)
			end
		end
	end
end


-- энциклопедии
local function categorization_dicts()
	for dictArgName, lists in pairs(page.enc_links_raw) do
		local manual_links, wd_links, enc = lists.manual_links, lists.wd_links, lists.enc

		for _, link in pairs(manual_links) do
			page:add_category_raw('Ручная ссылка:' .. dictArgName)
			if mw.ustring.match(link, '^(.+)#') then
				page:add_category_raw('Якорь в ручной ссылке')
			end
			for _, wd_link in pairs(wd_links) do
				if wd_link == link then
					page:add_category_raw('Ручная ссылка совпадает со ссылкой из Викиданных:' .. dictArgName)
				end
			end
			
			if not enc.projectCode and not mw.title.new(link).exists then
				page:add_category_raw('Ручная ссылка на несуществующую словарную статью:' .. dictArgName)
			end
		end

		for _, lnk in pairs(wd_links) do
			page:add_category_raw('Ссылка из Викиданных:' .. dictArgName)
		end
	end
end


-- общие категории
local function categorization_general()
	if page.is_author_page then
		if page.entity then
			page:add_category_raw('Авторы:Викиданные:Страницы с элементами|' .. page.title)
		end

	else
		if page.entity then
			page:add_category_raw('Викиданные:Страницы с элементами|' .. page.title)

			-- эти флаги ставятся в подмодуле wikidata: .has_encyclopedic_article_status_in_wd, .has_topic_property, .has_backlink, .has_xref_property
			if page.has_encyclopedic_article_status_in_wd then
				if page.has_topic_property then
					if page.sitelinks and #page.sitelinks > 1 then
						page:add_category_raw('Викиданные:Страницы с несколькими указанными элементами темы|' .. page.title)
					else
						page:add_category_raw('Викиданные:Страницы с указанным элементом темы|' .. page.title)
					end
					if not page.has_backlink then 
						if page.has_xref_property then
							page:add_category_raw('Викиданные:Перекрёстные ссылки') 
						else
							page:add_category_raw('Викиданные:Страницы с указанным элементом темы без обратной ссылки') 
						end
					end
				else
					page:add_category_raw('Викиданные:Страницы с элементами без указания элемента темы|' .. page.title)
				end
			end
		end
	end
end


-- Переименование категорий для странци авторов
local function rename_categories_for_authors()
	local cats = {}
	for _, c in pairs(page.categories_raw) do
		if not mw.ustring.find(c, ':Викиданные$') then
			c = c:gsub('^Ссылка из Викиданных:', 'Авторы:Ссылка из Викиданных:')
			c = c:gsub('^Ручная ссылка:', 'Авторы:Ручная ссылка:')
			c = c:gsub('^Ручная ссылка совпадает со ссылкой из Викиданных:([^%]]+)', 'Авторы:Ручная ссылка:%1:Совпадает со ссылкой из Викиданных')
		end
		table.insert(cats, c)
	end
	page.categories_raw = cats
	-- mw.logObject(cats, "cats")
end


function p.get_categories(_page)
	page = _page
	function page:add_category_raw(s) table.insert(self.categories_raw, s) end
	function page:wikify_categories() for _, s in pairs(self.categories_raw) do table.insert(self.categories, '[[Категория:' .. s .. ']]') end end
	
	if #page.projects > 0 then
		for _, v in ipairs(page.projects) do
			categorization_wikiprojects(v.links)
		end
	else
		categorization_wikiprojects()
	end
	categorization_dicts()
	categorization_general()
	if page.is_author_page then rename_categories_for_authors() end  -- переименование некоторых категорий для страниц авторов
	page:wikify_categories()
	
	-- mw.logObject(page, "page")
	return page
end


return p