Siirry sisältöön

Moduli:Religious reference

On otettu Мегавики-späi

local p = {} -- p stands for package

function linkVerses(verses) local normalized_verses = mw.ustring.gsub(mw.ustring.gsub(verses, '%s', ), '[‐‒–—―−]', '-') -- hyphen, figure dash, en dash, em dash, horizontal bar and minus to hyphen-minus local raw_blocks = mw.text.split(normalized_verses, ';')

local linked_blocks = {} for _, raw_block in ipairs(raw_blocks) do local raw_parts = mw.text.split(raw_block, ',')

local linked_parts = {} if mw.ustring.match(raw_block, ':') then local chapter, verses, chapter_prefix for _, raw_part in ipairs(raw_parts) do -- possible forms of raw_part: 1, 1-2, 1:2, 1:2-3, 1:2-2:3

if mw.ustring.match(raw_part, ':') then chapter, verses = mw.ustring.match(raw_part, '^([0-9]+):(.*)$')

if not chapter then return nil, 'недопустимое значение ' .. raw_part end

--[[ if #linked_parts > 0 then table.insert(linked_blocks, linked_parts) linked_parts = {} end ]]

if mw.ustring.match(verses, ':') then local chapter1, verse1, chapter2, verse2 = mw.ustring.match(raw_part, '^([0-9]+):([0-9]+)-([0-9]+):([0-9]+)$') if chapter1 then -- deal with 1:2-2:3 table.insert(linked_parts, {chapter1 .. ':' .. verse1, chapter1 .. ':' .. verse1, chapter2 .. ':' .. verse2, chapter2 .. ':' .. verse2}) else return nil, 'недопустимое значение ' .. raw_part end break end chapter_prefix = chapter .. ':' -- transform 1:2 to 2 and 1:2-3 to 2-3 else if chapter == nil then return nil, 'перед стихом ' .. raw_part .. ' не указана глава' end verses = raw_part chapter_prefix = end

local verse = mw.ustring.match(verses, '^([0-9]+)$') -- deal with 1 and 1-2, but possibly with prefix if verse then table.insert(linked_parts, {chapter .. ':' .. verse, chapter_prefix .. verse}) else local verse1, verse2 = mw.ustring.match(verses, '^([0-9]+)-([0-9]+)$') if verse1 then if tonumber(verse2) - tonumber(verse1) == 1 then table.insert(linked_parts, {chapter .. ':' .. verse1, chapter_prefix .. verse1}) table.insert(linked_parts, {chapter .. ':' .. verse2, verse2}) else table.insert(linked_parts, {chapter .. ':' .. verse1, chapter_prefix .. verse1 .. '—' .. verse2}) end else return nil, 'недопустимое значение ' .. raw_part end end end else for _, raw_part in ipairs(raw_parts) do local chapter = mw.ustring.match(raw_part, '^[0-9]+$') if chapter then table.insert(linked_parts, {chapter, chapter}) else local chapter1, chapter2 = mw.ustring.match(raw_part, '^([0-9]+)-([0-9]+)$') if chapter1 then if tonumber(chapter2) - tonumber(chapter1) == 1 then table.insert(linked_parts, {chapter1, chapter1}) table.insert(linked_parts, {chapter2, chapter2}) else table.insert(linked_parts, {chapter1, chapter1 .. '—' .. chapter2}) end else return nil, 'недопустимое значение ' .. raw_part end end end end

table.insert(linked_blocks, linked_parts) end

return linked_blocks, nil end

function generateBibleError(text) return 'Библия: ' .. text .. 'Категория:Рувики:Страницы с неправильно заполненным шаблоном Библия' end

function getNotEmpty(args, arg) local val = args[arg] if val == then return nil else return val end end

function p.citeBible (frame) local args = frame:getParent().args

local book = getNotEmpty(args, 1) local verses = getNotEmpty(args, 2) local postfix = getNotEmpty(args, 3) local nobook = getNotEmpty(args, 'б') or getNotEmpty(args, 'без книги') local text = getNotEmpty(args, 'т') or getNotEmpty(args, 'текст')

if book == nil then return generateBibleError('отсутствует название книги') end if verses == nil then return generateBibleError('отсутствует последовательность стихов') end

local wikisource_link = frame:preprocess() if wikisource_link == then return generateBibleError('сокращение ' .. book .. ' неизвестно, см. список допустимых') end

local linked_blocks, error = linkVerses(verses) if error then return generateBibleError(error) end

local formatted_blocks = {} local parts_number = 0 for _, linked_parts in ipairs(linked_blocks) do local formatted_parts = {} for _, linked_part in ipairs(linked_parts) do if #linked_part == 4 then table.insert(formatted_parts, frame:preprocess( '[[:s:' .. wikisource_link .. '#' .. linked_part[1] .. '|' .. linked_part[2] .. ']] — ' .. '[[:s:' .. wikisource_link .. '#' .. linked_part[3] .. '|' .. linked_part[4] .. ']]' )) else table.insert(formatted_parts, frame:preprocess( '[[:s:' .. wikisource_link .. '#' .. linked_part[1] .. '|' .. (text or (linked_part[2] .. (postfix or ))) .. ']]' -- TODO )) parts_number = parts_number + 1 end end table.insert(formatted_blocks, table.concat(formatted_parts, ', ')) end

if text ~= nil and text ~= and parts_number > 1 then return generateBibleError('при указании текста допустимо вводить только один стих или одну главу') end

if postfix ~= nil and postfix ~= and parts_number > 1 then return generateBibleError('при указании постфикса допустимо вводить только один стих или одну главу') end

local res = table.concat(formatted_blocks, ';' .. mw.ustring.char( 0x2002 )) -- EN SPACE

-- TODO if postfix ~= nil and postfix ~= then res = res .. 'Категория:Рувики:Страницы с постфиксом в шаблоне Библия' end

if not text and not nobook then res = frame:preprocess( '[[|' .. book .. '.]] ' ) .. res end

return res end

return p