Модуль:ChemTitle

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Документация

Реализация шаблона {{Химический заголовок}}.

Тесты[править код]

Все тесты успешно пройдены: 8

test_formatTitle
Тест Ожидаемое значение Фактическое значение
✔
✔ Гидроксид-ион Гидроксид-ион Гидроксид-ион
✔ 1,3-динитробензол 1,3-динитробензол 1,3-динитробензол
✔ Пара-метоксиметамфетамин пара-метоксиметамфетамин пара-метоксиметамфетамин
✔ Цис-1,2,3,5-транс-4,6-циклогексангексаол цис-1,2,3,5-транс-4,6-циклогексангексаол цис-1,2,3,5-транс-4,6-циклогексангексаол
✔ Октахлородиренат(III) тетра-н-бутиламмония Октахлородиренат(III) тетра-н-бутиламмония Октахлородиренат(III) тетра-н-бутиламмония
✔ (S)-1-амино-2-метоксиметилпирролидин (S)-1-амино-2-метоксиметилпирролидин (S)-1-амино-2-метоксиметилпирролидин
✔ (дикислород)бис(трифенилфосфин)платина (дикислород)бис(трифенилфосфин)платина (дикислород)бис(трифенилфосфин)платина
local p = {}

local prefixes = {
	['втор'] = true,
	['м'] = true,
	['мета'] = true,
	['н'] = true,
	['о'] = true,
	['орто'] = true,
	['п'] = true,
	['пара'] = true,
	['транс'] = true,
	['трет'] = true,
	['цис'] = true,
}

function p.formatTitle( title )
	parts = mw.text.split( title, '-' )

	local first = true
	for pos, value in ipairs( parts ) do
		if mw.ustring.match( value, '[0-9,]+' ) then
			-- pass
		elseif prefixes[ mw.ustring.lower( value ) ] then
			parts[ pos ] = "''" .. mw.ustring.lower( value ) .. "''"
		elseif first then
			local charPos = string.find( value, '[А-ЯЁа-яё]' )
			if charPos then
				local firstChar = mw.ustring.sub( value, charPos, charPos )
				if not mw.ustring.match( firstChar, '[А-ЯЁ]' ) then
					parts[ pos ] = mw.ustring.sub( value, 1, charPos - 1 )
						.. '<span style="text-transform:uppercase">' .. firstChar .. '</span>'
						.. mw.ustring.sub( value, charPos + 1 )
				end
			end
			if charPos ~= nil then
				first = false
			end
		end
	end

	return table.concat( parts, '-' )
end

function p.main( frame )
	frame = frame or mw.getCurrentFrame()
	title = mw.title.getCurrentTitle()

	niceTitle = p.formatTitle( title.fullText )

	if title ~= niceTitle then
		return frame:callParserFunction( 'DISPLAYTITLE', niceTitle, 'noerror' )
	end
end

return p