Модуль:Индекс категории

Материал из Народные Сказки


Функции[править код]

three_letters[править код]

Реализация {{Индекс категории АБВ (удобный)}}.

two_letters[править код]

Реализация {{Индекс категории АБВ (детальный)}}.

only_cyrillic[править код]

Реализация {{Индекс категории АБВ}}.

only_numbers[править код]

Реализация {{Индекс категории (числовой)}}.

single_line[править код]

Реализация {{Индекс категории}}.

single_line[править код]

Реализация {{Индекс категории (числовой)}}.


local p = {}
local yesno = require('Module:Yesno')
local getArgs = require('Module:Arguments').getArgs

local lists = {
{list = {'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ы', 'Э', 'Ю', 'Я'}, depth = 0},
{list = {'Абу', 'Бар', 'Ван', 'Гам', 'Дар', 'Евл', 'Жан', 'Зай', 'Иве', 'Йем', 'Кан', 'Лал', 'Мак', 'Най', 'Обу', 'Пас', 'Рай', 'Сан', 'Так', 'Уде', 'Фак', 'Хак', 'Цар', 'Чар', 'Шап', 'Щед', 'Ыгд', 'Эвр', 'Юди', 'Ягу'}, depth = 3},
{list = {'Ада', 'Без', 'Вве', 'Гек', 'Дел', 'Его', 'Жев', 'Зан', 'Идо', 'Йес', 'Кас', 'Лас', 'Мар', 'Нат', 'Ожи', 'Пер', 'Рац', 'Сев', 'Тва', 'Уим', 'Фед', 'Хар', 'Цви', 'Чел', 'Шва', 'Щеп', 'Ыйв', 'Эйф', 'Юли', 'Яко'}, depth = 2},
{list = {'Акт', 'Бер', 'Вес', 'Геф', 'Дец', 'Ежо', 'Жен', 'Зах', 'Ико', 'Йис', 'Ким', 'Лег', 'Мау', 'Ней', 'Оку', 'Пис', 'Рел', 'Сет', 'Тер', 'Улм', 'Фид', 'Хат', 'Цен', 'Чер', 'Шен', 'Щер', 'Ыйр', 'Экт', 'Юнг', 'Яку'}, depth = 3},
{list = {'Алт', 'Бит', 'Вин', 'Гно', 'Дин', 'Ели', 'Жиг', 'Зее', 'Имп', 'Йон', 'Кож', 'Леп', 'Мер', 'Нет', 'Опо', 'Плу', 'Рич', 'Ско', 'Тих', 'Уни', 'Фин', 'Хим', 'Цер', 'Чес', 'Шин', 'Щит', 'Ылг', 'Эли', 'Юри', 'Ямб'}, depth = 1},
{list = {'Анд', 'Бол', 'Вла', 'Гон', 'Дов', 'Епи', 'Жир', 'Зен', 'Инт', 'Йоп', 'Кон', 'Лин', 'Мим', 'Нил', 'Орн', 'Пор', 'Рой', 'Сод', 'Топ', 'Урб', 'Фок', 'Хок', 'Циг', 'Чиж', 'Шма', 'Щук', 'Ымс', 'Энг', 'Юрк', 'Яно'}, depth = 3},
{list = {'Апп', 'Боя', 'Вок', 'Гра', 'Дор', 'Еро', 'Жуа', 'Зин', 'Иос', 'Йос', 'Кра', 'Лов', 'Мож', 'Нов', 'Осл', 'Пре', 'Рот', 'Спе', 'Три', 'Урю', 'Фоф', 'Хоп', 'Цин', 'Чка', 'Шта', 'Щуч', 'Ысп', 'Эпо', 'Юрь', 'Яро'}, depth = 2},
{list = {'Арх', 'Бул', 'Вос', 'Гру', 'Дув', 'Ест', 'Жуп', 'Зом', 'Исм', 'Йот', 'Кря', 'Лук', 'Мот', 'Ном', 'Отк', 'Пуг', 'Рут', 'Стр', 'Тум', 'Утр', 'Фро', 'Хре', 'Цна', 'Чум', 'Шув', 'Щёг', 'Ыты', 'Эсс', 'Юсу', 'Яст'}, depth = 3},
}

local digraphs = {
{'Ав', 'Бв', 'Вв', 'Гв', 'Дв', 'Ев', 'Жв', 'Зв', 'Ив', 'Йв', 'Кв', 'Лв', 'Мв', 'Нв', 'Ов', 'Пв', 'Рв', 'Св', 'Тв', 'Ув', 'Фв', 'Хв', 'Цв', 'Чв', 'Шв', 'Щв', 'Ыв', 'Эв', 'Юв', 'Яв'},
{'Ад', 'Бд', 'Вд', 'Гд', 'Дд', 'Ед', 'Жд', 'Зд', 'Ид', 'Йд', 'Кд', 'Лд', 'Мд', 'Нд', 'Од', 'Пд', 'Рд', 'Сд', 'Тд', 'Уд', 'Фд', 'Хд', 'Цд', 'Чд', 'Шд', 'Щд', 'Ыд', 'Эд', 'Юд', 'Яд'},
{'Аж', 'Бж', 'Вж', 'Гж', 'Дж', 'Еж', 'Жж', 'Зж', 'Иж', 'Йж', 'Кж', 'Лж', 'Мж', 'Нж', 'Ож', 'Пж', 'Рж', 'Сж', 'Тж', 'Уж', 'Фж', 'Хж', 'Цж', 'Чж', 'Шж', 'Щж', 'Ыж', 'Эж', 'Юж', 'Яж'},
{'Аи', 'Би', 'Ви', 'Ги', 'Ди', 'Еи', 'Жи', 'Зи', 'Ии', 'Йи', 'Ки', 'Ли', 'Ми', 'Ни', 'Ои', 'Пи', 'Ри', 'Си', 'Ти', 'Уи', 'Фи', 'Хи', 'Ци', 'Чи', 'Ши', 'Щи', 'Ыж', 'Эи', 'Юи', 'Яи'},
{'Ал', 'Бл', 'Вл', 'Гл', 'Дл', 'Ел', 'Жл', 'Зл', 'Ил', 'Йл', 'Кл', 'Лл', 'Мл', 'Нл', 'Ол', 'Пл', 'Рл', 'Сл', 'Тл', 'Ул', 'Фл', 'Хл', 'Цл', 'Чл', 'Шл', 'Щл', 'Ыл', 'Эл', 'Юл', 'Ял'},
{'Ан', 'Бн', 'Вн', 'Гн', 'Дн', 'Ен', 'Жн', 'Зн', 'Ин', 'Йн', 'Кн', 'Лн', 'Мн', 'Нн', 'Он', 'Пн', 'Рн', 'Сн', 'Тн', 'Ун', 'Фн', 'Хн', 'Цн', 'Чн', 'Шн', 'Щн', 'Ын', 'Эн', 'Юн', 'Ян'},
{'Ап', 'Бп', 'Вп', 'Гп', 'Дп', 'Еп', 'Жп', 'Зп', 'Ип', 'Йп', 'Кп', 'Лп', 'Мп', 'Нп', 'Оп', 'Пп', 'Рп', 'Сп', 'Тп', 'Уп', 'Фп', 'Хп', 'Цп', 'Чп', 'Шп', 'Щп', 'Ып', 'Эп', 'Юп', 'Яп'},
{'Ас', 'Бс', 'Вс', 'Гс', 'Дс', 'Ес', 'Жс', 'Зс', 'Ис', 'Йс', 'Кс', 'Лс', 'Мс', 'Нс', 'Ос', 'Пс', 'Рс', 'Сс', 'Тс', 'Ус', 'Фс', 'Хс', 'Цс', 'Чс', 'Шс', 'Щс', 'Ыс', 'Эс', 'Юс', 'Яс'},
{'Ау', 'Бу', 'Ву', 'Гу', 'Ду', 'Еу', 'Жу', 'Зу', 'Иу', 'Йу', 'Ку', 'Лу', 'Му', 'Ну', 'Оу', 'Пу', 'Ру', 'Су', 'Ту', 'Уу', 'Фу', 'Ху', 'Цу', 'Чу', 'Шу', 'Щу', 'Ыу', 'Эу', 'Юу', 'Яу'},
{'Ах', 'Бх', 'Вх', 'Гх', 'Дх', 'Ех', 'Жх', 'Зх', 'Их', 'Йх', 'Кх', 'Лх', 'Мх', 'Нх', 'Ох', 'Пх', 'Рх', 'Сх', 'Тх', 'Ух', 'Фх', 'Хх', 'Цх', 'Чх', 'Шх', 'Щх', 'Ых', 'Эх', 'Юх', 'Ях'},
{'Ач', 'Бч', 'Вч', 'Гч', 'Дч', 'Еч', 'Жч', 'Зч', 'Ич', 'Йч', 'Кч', 'Лч', 'Мч', 'Нч', 'Оч', 'Пч', 'Рч', 'Сч', 'Тч', 'Уч', 'Фч', 'Хч', 'Цч', 'Чч', 'Шч', 'Щч', 'Ыч', 'Эч', 'Юч', 'Яч'},
{'Ащ', 'Бщ', 'Вщ', 'Гщ', 'Дщ', 'Ещ', 'Жщ', 'Зщ', 'Ищ', 'Йщ', 'Кщ', 'Лщ', 'Мщ', 'Нщ', 'Ощ', 'Пщ', 'Рщ', 'Сщ', 'Тщ', 'Ущ', 'Фщ', 'Хщ', 'Цщ', 'Чщ', 'Шщ', 'Щщ', 'Ыщ', 'Эщ', 'Ющ', 'Ящ'},
{'Аю', 'Бю', 'Вю', 'Гю', 'Дю', 'Ею', 'Жю', 'Зю', 'Ию', 'Йю', 'Кю', 'Лю', 'Мю', 'Ню', 'Ою', 'Пю', 'Рю', 'Сю', 'Тю', 'Ую', 'Фю', 'Хю', 'Цю', 'Чю', 'Шю', 'Щю', 'Ыю', 'Эю', 'Юю', 'Яю'},
}

local NS_CAT = mw.site.namespaces[14].name
local CONTENT = 'Оглавление:'
local TO_START = '…в начало'
local START = 'Начало'
local BULL = '•'

local function bold(t)
	return "'''" .. t .. "'''"
end

local function italic(t)
	return "''" .. t .. "''"
end

local function link(name, text, par)
	return '[' .. tostring(mw.uri.fullUrl(NS_CAT .. ':' .. name, par)) .. ' ' .. text .. ']'
end

local function check_i_template(i, letter_10, letter_27)
	if i == 10 then
		return letter_10
	end
	if i == 27 then
		return letter_27
	end
	return true
end

local function td_link_template(pagename, td, v, text)
		td:wikitext(link(pagename, text or v, {from = v}))
	end

function p.three_letters(frame)
	local args = getArgs(frame)
	local wt = mw.html.create('table'):addClass('plainlinks'):css('border', '1px solid #a2a9b1'):css('background-color', '#f8f9fa'):css('padding', '5px'):css('font-size', '95%'):css('margin-left', 'auto'):css('margin-right', 'auto')
	local letter_10 = yesno(args['Й'])
	local letter_27 = yesno(args['Ы'])
	local depth = tonumber(args.depth or 0)
	local nocyr = yesno(args.nocyr)
	local lat = (yesno(args.lat) or depth >=3) and not yesno(args.nolat)
	local smallat = yesno(args.smallat)
	local pagename = args.name or args['имя'] or mw.title.getCurrentTitle().text
	local row = wt:tag('tr')
	local td = row:tag('td'):css('text-align', 'left')
	td:attr('colspan', 14 + (letter_10 and 1 or 0))
	td:wikitext(bold(CONTENT))
	td = row:tag('td'):css('text-align', 'right')
	td:attr('colspan', 14 + (letter_27 and 1 or 0))
	td:wikitext(italic(link(pagename, TO_START, {})))
	local function check_i(i) 
		return check_i_template(i, letter_10, letter_27)
	end
	local function td_link(td, v)
		td_link_template(pagename, td, v)
	end
	if not nocyr then
		for _, data in ipairs(lists) do
			if data.depth <= depth then
				row = wt:tag('tr')
				for i, v in ipairs(data.list) do
					if check_i(i) then
						td_link(row:tag('td'), v)
					end
				end
			end
		end
	end
	local function latin_row(a, z)
		local upA = mw.ustring.codepoint(a)
		local upZ = mw.ustring.codepoint(z)
		row = wt:tag('tr')
		row:tag('td') -- 26 букв против 28+ букв кириллицы
		if letter_10 then row:tag('td') end
		for i = upA, upZ do
			td_link(row:tag('td'), mw.ustring.char(i))
		end
		row:tag('td')
		if letter_27 then row:tag('td') end
	end
	if lat then
		latin_row('A','Z')
	end
	if smallat then
		latin_row('a', 'z')
	end
	return tostring(wt)
end

function p.two_letters(frame)
	local args = getArgs(frame)
	local wt = mw.html.create('table'):addClass('plainlinks'):css('border', '1px solid #aaa'):css('background-color', '#f9f9f9'):css('padding', '5px'):css('font-size', '95%'):css('margin-left', 'auto'):css('margin-right', 'auto')
	local letter_10 = yesno(args['Й'])
	local letter_27 = yesno(args['Ы'])
	local use_digits = yesno(args['NN'])
	local pagename = args.name or args['имя'] or mw.title.getCurrentTitle().text

	local row = wt:tag('tr')
	local td = row:tag('td'):css('text-align', 'left')
	td:attr('colspan', 14 + (letter_10 and 1 or 0) + (use_digits and 1 or 0))
	td:wikitext(bold(CONTENT))
	td = row:tag('td'):css('text-align', 'right')
	td:attr('colspan', 14 + (letter_27 and 1 or 0))
	td:wikitext(italic(link(pagename, TO_START, {})))
	local function check_i(i) 
		return check_i_template(i, letter_10, letter_27)
	end
	local function td_link(td, v)
		td_link_template(pagename, td, v)
	end
	row = wt:tag('tr')
	if use_digits then
		row:tag('td'):wikitext(bold(link(pagename, '0—9', {from='0'})))
	end
	for i, v in ipairs(lists[1].list) do
		if check_i(i) then
			td = row:tag('td')
			td_link(td, v)
			td:css('font-weight', 'bold')
		end
	end
	for j, list in ipairs(digraphs) do
		row = wt:tag('tr')
		if use_digits then
			td = row:tag('td')
			if j <= 10 then
				td_link(td, tostring(j-1))
			end
		end
		for i, v in ipairs(list) do
			if check_i(i) then
				td_link(row:tag('td'), v)
			end
		end
	end
	return tostring(wt)
end

function p.only_cyrillic(frame)
	local args = getArgs(frame)
	local wt = mw.html.create('table'):addClass('plainlinks'):css('border', '1px solid #aaaaaa'):css('background-color', '#f9f9f9'):css('padding', '5px'):css('font-size', '95%'):attr('align', 'center')
	--  в отличие от двух предыдущих реализаций здесь используется Ё, поэтому приходится отдельно задавать алфавит для наглядности
	local letter_28 = yesno(args['Ы'])
	local pagename = args.name or args['имя'] or mw.title.getCurrentTitle().text
	local row = wt:tag('tr')
	row:tag('td'):css('text-align', 'left'):wikitext(bold(CONTENT))
	row:tag('td'):wikitext(link(pagename, '*', {}))
	local cyr_letters = {'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Э', 'Ю', 'Я'}
	if letter_28 then
		table.insert(cyr_letters, 28, 'Ы')
	end
	for _, v in ipairs(cyr_letters) do
		td_link_template(pagename, row:tag('td'), v)
	end
	return tostring(wt)
end

function p.only_numbers(frame)
	local args = getArgs(frame)
	local wt = mw.html.create('table'):addClass('plainlinks'):css('border', '1px solid #aaaaaa'):css('background-color', '#f9f9f9'):css('padding', '5px'):css('font-size', '95%'):attr('align', 'center')
	local step = tonumber(args.step or args['шаг'] or 100)
	local max_val = tonumber(args.max or args['макс'] or 1000)
	local pagename = args.name or args['имя'] or mw.title.getCurrentTitle().text
	local use_letters = yesno(args.letters or args['А']) --русская А
	local row = wt:tag('tr')
	row:tag('td'):wikitext(link(pagename, START, {}))
	local i = 0
	repeat
		td_link_template(pagename, row:tag('td'), tostring(i))
		i = i + step
	until i > max_val
	if use_letters then
		td_link_template(pagename, row:tag('td'), 'А')
	end
	return tostring(wt)
end


local function yesno_from_arg_or_true(args, en, ru)
	local raw = args[en] or args[ru]
	if raw then
		return yesno(raw)
	else
		return true
	end
end

function p.single_line(frame)
	local args = getArgs(frame)
	local pagename = args.name or args['имя'] or mw.title.getCurrentTitle().text
	local num = mw.site.stats.pagesInCategory(pagename)
	local force = yesno(args.force or args['всегда'])
	if num > 200 or force then 
		local wt = mw.html.create('table'):addClass('plainlinks'):css('border', '1px solid #aaaaaa'):css('background-color', '#f9f9f9'):css('padding', '5px'):css('font-size', '95%'):attr('align', 'center')
		local row = wt:tag('tr')
		row:tag('td'):wikitext(link(pagename, START, {}))
		if yesno_from_arg_or_true(args, 'numerals', 'числа') then
			row:tag('td'):wikitext(BULL)
			td_link_template(pagename, row:tag('td'), '0', '0–9')
		end
		-- латинские имена параметров из совместимости, рекомендуется использовать кириллические
		if yesno_from_arg_or_true(args, 'up', 'кир') then
			row:tag('td'):wikitext(BULL)
			local cyr_letters = {'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Э', 'Ю', 'Я'}
			for _, v in ipairs(cyr_letters) do
				td_link_template(pagename, row:tag('td'), v)
			end
		end
		if yesno_from_arg_or_true(args, 'up-lat', 'лат') then
			row:tag('td'):wikitext(BULL)
			local upA = mw.ustring.codepoint('A')
			local upZ = mw.ustring.codepoint('Z')
			for i = upA, upZ do
				td_link_template(pagename, row:tag('td'), mw.ustring.char(i))
			end
		end
		return tostring(wt)
	else
		-- 200 страниц и так умещаются на одном экране
		return ''
	end
end

function p.custom(frame)
	local args = getArgs(frame)
	local pagename = args.name or args['имя'] or mw.title.getCurrentTitle().text
	local num = mw.site.stats.pagesInCategory( 'Незавершённые статьи по химии')
	local div = mw.html.create('div'):addClass('plainlinks'):css('border', '1px solid #aaaaaa'):css('background-color', '#f9f9f9'):css('padding', '5px'):css('font-size', '95%'):attr('align', 'center')
	local class = args.class or 'hlist'
	div:addClass(class)
	local n = require('Module:TableTools').length(args)
	local res = {'\n*' ..  link(pagename, START, {})}
	local function add_link(v)
		table.insert(res, link(pagename, v, {from = v}))
	end
	for i = 1, n do
		add_link(args[i])
	end
	if yesno(args.cyr or args['кир']) then
		local cyr_letters = {'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Э', 'Ю', 'Я'}
		for _, v in ipairs(cyr_letters) do
			add_link(v)
		end
	end
	if yesno(args.lat or args['лат']) then
		local upA = mw.ustring.codepoint('A')
		local upZ = mw.ustring.codepoint('Z')
		for i = upA, upZ do
			add_link(mw.ustring.char(i))
		end
	end
	div:wikitext(table.concat(res, '\n*'))
	return tostring(div)
end

return p