Модуль:Religious reference
Материал из Occultica
Версия от 03:44, 5 мая 2022; ru>Mikhail Ryazanov (ВП:Типографика)
Для документации этого модуля может быть создана страница Модуль:Religious reference/doc
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 '<span class="error">Библия: ' .. text .. '</span>[[Категория:Википедия:Страницы с неправильно заполненным шаблоном Библия]]' 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('{{Библия/сокращение книги|' .. book .. '|s}}') 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 .. '}}|' .. book .. '.]] ' ) .. res end return res end return p