Модуль:Индекс категории
Функции[править код]
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