Interested Article - Religious reference

Документация

Реализация Шаблон:Библия и, как планируется, Шаблон:Коран .

См. также

Тесты Шаблон:Библия

Код Результат
{{Библия|Быт|1:31}} Быт.
{{Библия|Быт|1:31, 32}} Быт. ,
{{Библия|Быт|1:31-33}} Быт.
{{Библия|Быт|1:31-32}} (sic!) Быт. , (sic!)
{{Библия|Быт|1:31-33, 35}} Быт. ,
{{Библия|Быт|1:31, 33-35}} Быт. ,
{{Библия|Быт|1:31-33, 35-37}} Быт. ,
{{Библия|Быт|1:31-33, 35-37, 2:11}} (sic!) Быт. , , (sic!)
{{Библия|Быт|1:31-2:11}} Быт.
{{Библия|Быт|5}} Быт.
{{Библия|Быт|5, 7}} Быт. ,
{{Библия|Быт|5-7}} Быт.
{{Библия|Быт|5-6}} (sic!) Быт. , (sic!)
{{Библия|Быт|1:31; 2:11}} Быт. ;
{{Библия|Быт|1:31, 2:11}} (sic!) Быт. , (sic!)
{{Библия|Быт|1:31;5}} Быт. ;
{{Библия|Быт|1:31, 34-36; 5, 7}} Быт. , ; ,
{{Библия|Быт|1, 3; 5:31, 34-36}} Быт. , ; ,
{{Библия|Быт|1:31a}} Библия: недопустимое значение 1:31a
{{Библия|Быт|1:31-33a}} Библия: недопустимое значение 1:31-33a
{{Библия|Быт|1:31a-33}} Библия: недопустимое значение 1:31a-33
{{Библия|Быт|1:31a-33b}} Библия: недопустимое значение 1:31a-33b
{{Библия|Исх|1:31}} Исх.
{{Библия|1Кор|1:31}} 1Кор.
Нестандартное оформление
{{Библия|Быт|1:31—33}} Быт.
{{Библия|Быт|1:31,32}} Быт. ,
{{Библия|Быт|1:31 - 32}} Быт. ,
{{Библия|Быт|1:31;2:11}} Быт. ;
{{Библия|Быт|1:31|б=1}}
{{Библия|Быт|1:31|без книги=1}}
{{Библия|Быт|1:31|без книги=}} Быт.
{{Библия|Быт|1:6|т=шестой стих}}
{{Библия|Быт|1:6|текст=шестой стих}}
{{Библия|Быт|1:6|текст=}} Быт.
Устаревшее
{{Библия|Быт|1:31|—31}} Быт.
{{Библия|Быт|1:31|, 31}} Быт.
{{Библия|Быт|1:31, 34|}} Быт. ,
{{Библия|Быт|1:31|a}} Быт.
{{Библия|Быт|1:31-33|a}} Быт.
{{Библия|Быт|1:31|a-33}} Быт.
Ошибки
{{Библия}} Библия: отсутствует название книги
{{Библия|}} Библия: отсутствует название книги
{{Библия|Быт}} Библия: отсутствует последовательность стихов
{{Библия|Быт|}} Библия: отсутствует последовательность стихов
{{Библия|Бум|1:31}} Библия: сокращение Бум неизвестно, см. список допустимых
{{Библия|1 Кор|1:31}} Библия: сокращение 1 Кор неизвестно, см. список допустимых
{{Библия|Быт|1:31, 32|т=текст}} Библия: при указании текста допустимо вводить только один стих или одну главу
{{Библия|Быт|1:31, 32|, 33}} Библия: при указании постфикса допустимо вводить только один стих или одну главу
{{Библия|Быт|31, 1:32}} Библия: перед стихом 31 не указана глава
{{Библия|Быт|1:31; 33, 1:35}} Библия: перед стихом 33 не указана глава
{{Библия|Быт|1-5:11}} Библия: недопустимое значение 1-5:11

Замечания

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 .. '.]]&nbsp;'
		) .. res
	end
	
	return res
end

return p
Источник —

Same as Religious reference