Документация Документация
local p = {}

local bukvi_toma = {
        { 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж', 'З' },
        { 'И', 'І', 'К', 'Л', 'М', 'Н', 'О' },
        { 'П' },
        { 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Ѣ', 'Э', 'Ю', 'Ѧ', 'Я', 'Ѳ', 'Ѵ' }
    }  -- в ТСД-3 буква 'Р' в 3-м томе
local god_toma = { { 1863, 1865, 1865, 1866 }, { 1880, 1881, 1882, 1882 }, { 1903, 1905, 1907, 1909 } }
   

-- helper
-- проверка переменной, возврат её или nil если пустая
function is(var)
	if (var == '' or var == nil) then return nil  else return var end
end

function make_link(prefix, pagename, text)
    return '[[' .. prefix .. pagename .. '|' .. text .. ']]'
end

----------------

--[=[ перенесено в Модуль:Header

-- Расчитывает страницу скана по странице книге, добавляя смещение.  Возврат: стр.скана.
function pagecalc(izdanie, tom, pagebook, pagination)
    local izdanie, tom, pagination = tonumber(izdanie), tonumber(tom), tonumber(pagination)
    local poffset1, chet
    local pb = tonumber(mw.ustring.match(tostring(pagebook), '%d+')) --только первые цифры диапазона страниц
    if not is(pb) or pb <= 0 then return end

    if izdanie == 1 then
        local offset = { 2, -626, 1, 1 } -- смещение в ТСД-1, в 4 томах
        --в 4 томе ошибка: номера 467-468 у двух пар страниц, этим сбита последующая пагинация
        if (tom == 4 and ((pb >= 469) or ((pb == 467 or pb == 468) and pagination == 2))) then poffset1 = 3 else poffset1 = offset[tom] end
        return pb + poffset1
    end
    if izdanie == 2 then
        local offset = { 90, 9, 8, 8 }
        return pb + offset[tom]
    end
    if izdanie == 3 then
        -- в ТСД-3 нумеруются колонки, а не страницы; по 2 на страницу, из них первая - нечётная
        local _, x = math.modf(pb / 2) -- проверка что чётная
        if x ~= 0 then chet = 1 else chet = 0 end
        local offset = { 17, 2, 2, 4 }
        return (pb + chet) / 2 + offset[tom]
    end
end
function p.pagecalc(frame) return pagecalc(frame.args[1], frame.args[2], frame.args[3], frame.args[4]) end
--]=]


-----------
--[=[
-- Возврат: первая буква слова статьи ({{SUBPAGE}}) в верхнем регистре. Иначе если подан входной параметр слово, то возврат его первой буквы.
function p.first_letter_subpage(frame) return first_letter_subpage(frame.args[1]) end
function first_letter_subpage(pagename)
	if not is(pagename) then return end
	local nameparts = mw.text.split(pagename, "/")
	return first_letter_uppercase(nameparts[2])
end

function p.first_letter_uppercase(frame) return first_letter_uppercase(frame.args[1]) end
function first_letter_uppercase(word)
    local fb = mw.ustring.sub(word, 1, 1)
    if (fb == 'і' or fb == 'І' or fb == 'i' or fb == 'I') then return 'І' end --баг Lua с распознаванием буквы
    local _, _, b = mw.ustring.find(word, '([а-яёѣѵіѳА-ЯЁѢѴІѲѦ])')
    return mw.ustring.upper(b)
end
--]=]
-----------

--[=[ перенесено в Модуль:Header

-- Номер тома по первой букве названия статьи. На вход: 1) номер издания, 2) слово - название статьи в ДО, при умолчании берётся {{SUBPAGE}}; может даваться номер тома из [[шаблон:Tom]], который возвращается.
function tomcalc(izdanie, nazvanie)
    local str = mw.text.trim(nazvanie);
    local bukva
    if (#str == 1 and string.match(str, '%d+')) then return str --если на входе цифра возвращаем её как номер тома и выход
    else 
    	if nazvanie then  --если дано название то его первая буква, иначе - названия статьи
    		bukva = first_letter_uppercase(nazvanie)
    	else
    		bukva = first_letter_subpage(str)  
    	end
    end
    if (bukva == 'І' or bukva == 'I') then return '2' end --Добавлена латин.'I', ибо из-за бага Lua славян. 'І' может не распознаваться.
    if (tostring(izdanie) == '3' and bukva == 'Р') then return '3' end --в ТСД-3 буква 'Р' в 3-м томе
    for tom, bukvi in pairs(bukvi_toma) do
        for _, bukva_toma in pairs(bukvi) do
            if (bukva == bukva_toma) then return tom end
        end
    end
end
-- Возвращает номер тома. Параметры: номер издания, название в ДО или номер тома.
function p.tomcalc(frame) return tomcalc(frame.args[1], frame.args[2]) end
--]=]

--[=[
-- Возвращает год издания тома Словаря Даля. Входные параметры: номер издания (1—3), том или название в ДО (если отлично от названия статьи) иначе не надо.
function p.god_toma(frame)
    local izdanie = tonumber(frame.args[1])
    local tom = tonumber(tomcalc(izdanie, frame.args[2]))
    return god_toma[izdanie][tom]
end
--]=]

--[=[ перенесено в Модуль:ТСД

-- Возвращает ссылку на индекс 1—3-го издания. Параметры: номер издания (1—3), том, nazvanie_DO, страница скана, страницы книги. При неуказанной странице скана вернёт ссылку на индекс тома, при указаной — на страницу в индексе.
function p.indexlink(frame) return indexlink(frame.args[1], frame.args[2], frame.args[3], frame.args[4], frame.args['linkonly']) end
function indexlink(izdanie, tom, pagescan, pagebook, linkonly)
    local izdanie, tom = tonumber(izdanie), tostring(tom)
    local god = god_toma[izdanie][tonumber(tom)]

    if (izdanie == 1) then
        if (pagescan ~= nil) then
            if (linkonly == nil) then
                return '[[Страница:Толковый словарь Даля (1-е издание). Часть ' .. tom .. ' (' .. god .. ').pdf/' .. pagescan .. '|ТСД-1 (' .. god .. ') т. ' .. tom .. ', с. ' .. pagebook .. ']]'
            else
                return 'Страница:Толковый словарь Даля (1-е издание). Часть ' .. tom .. ' (' .. god .. ').pdf/' .. pagescan
            end
        else
            if (linkonly == nil) then
                return '[[Индекс:Толковый словарь Даля (1-е издание). Часть ' .. tom .. ' (' .. god .. ').pdf|ТСД-1 (' .. god .. ') т. ' .. tom .. ']]'
            else
                return 'Индекс:Толковый словарь Даля (1-е издание). Часть ' .. tom .. ' (' .. god .. ').pdf'
            end
        end
    elseif (izdanie == 2) then
        if (pagescan ~= nil) then
            if (linkonly == nil) then
                return '[[Страница:Толковый словарь Даля (2-е издание). Том ' .. tom .. ' (' .. god .. ').pdf/' .. pagescan .. '|ТСД-2 (' .. god .. ') т. ' .. tom .. ', с. ' .. pagebook .. ']]'
            else
                return 'Страница:Толковый словарь Даля (2-е издание). Том ' .. tom .. ' (' .. god .. ').pdf/' .. pagescan
            end
        else
            if (linkonly == nil) then
                return '[[Индекс:Толковый словарь Даля (2-е издание). Том ' .. tom .. ' (' .. god .. ').pdf|ТСД-2 (' .. god .. ') т. ' .. tom .. ']]'
            else
                return 'Индекс:Толковый словарь Даля (2-е издание). Том ' .. tom .. ' (' .. god .. ').pdf'
            end
        end
    elseif (izdanie == 3) then
        if (pagescan ~= nil) then
            if (linkonly == nil) then
                return '[[Страница:Толковый словарь. Том ' .. tom .. ' (Даль ' .. god .. ').djvu/' .. pagescan .. '|ТСД-3 (' .. god .. ') т. ' .. tom .. ', с. ' .. pagebook .. ']]'
            else
                return 'Страница:Толковый словарь. Том ' .. tom .. ' (Даль ' .. god .. ').djvu/' .. pagescan
            end
        else
            if (linkonly == nil) then
                return '[[Индекс:Толковый словарь. Том ' .. tom .. ' (Даль ' .. god .. ').djvu|ТСД-3 (' .. god .. ') т. ' .. tom .. ']]'
            else
                return 'Индекс:Толковый словарь. Том ' .. tom .. ' (Даль ' .. god .. ').djvu'
            end
        end
    end
end

--]=]

return p