Модуль:Источники по теме/Категоризация
Документация
Выполняется из Модуль:Источники по теме на последнем этапе, работает по ранее собранным и сортированным данным объекта 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