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