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