Модуль:Вложенные кавычки

См. документацию {{Вложенные кавычки}}. Функции:

Прошлый код шаблона имел недостатки с точки зрения ТП:ПРЕДЕЛ (код {{Вложенные кавычки|я}} использовал 143 байта, в то время как шаблон на модуле использует 4) и некорректно обрабатывал часть ссылок. Авторы кода, на котором основан этот модуль, доступны в истории шаблона.

Примеры править


--
-- Re-implement [[Template:Вложенные кавычки]] in Lua
-- Replaces «» to „“ without touching links
--
require( 'strict' )

local getArgs
local p = {}

local function isEmpty( str )
	return str == nil or str == ''
end

local function protectLinks( str )
	local links, head = {}, 0
	while true do
		local s, e, link = str:find( '(%[%[.-%]%])', head )
		if not link then
			return str, links
		elseif link:find( '[[', 3, true ) then
			head = s + 2
		else
			-- If the alt text contains '[', it can have one final ']'.
			if link:match( '^[^|]*|.-%[', 3 ) and str:sub( e + 1, e + 1 ) == ']' then
				link = link .. ']'
			end
			table.insert( links, link )
			local placeholder = mw.ustring.char( 0xF0000 + #links )
			str = str:gsub( link:gsub( '[$%%()*+%-.?[%]^]', '%%%0' ), placeholder )
			head = str:find( placeholder ) + 1
		end
	end
end

local function unprotectLinks( str, links )
	for i, link in ipairs( links ) do
		str = str:gsub( mw.ustring.char( 0xF0000 + i ), link:gsub( '%%', '%%%%' ), 1 )
	end
	return str
end

local function replace( str )
	if isEmpty( str ) then
		return ''
	end
	
	str = mw.ustring.gsub( str, '«(.[^«»]-)»', '„%1“' )
	return str
end

function p._main( text )
	if isEmpty( text ) then
		return ''
	end
	
	local links = {}
	text, links = protectLinks( text )
	if #links == 0 then
		return replace( text )
	end
	
	-- Replace visible link text while keeping links intact
	for i, link in ipairs( links ) do
		local linkTarget = mw.text.trim( link, '%[%]' )
		local linkText = ''
		
		local pipePos = link:find( '|', 1, true )
		if pipePos ~= nil then
			local parts = mw.text.split( linkTarget, '|' )
			linkTarget = parts[ 1 ]
			linkText = replace( parts[ 2 ] )
		else
			linkText = replace( linkTarget )
		end
		
		links[ i ] = string.format( '[[%s|%s]]', linkTarget, linkText )
	end
	
	text = replace( text )
	text = unprotectLinks( text, links )
	
	return text
end

function p.main( frame )
	getArgs = require( 'Module:Arguments' ).getArgs
	local args = getArgs( frame )
	
	return p._main( args[ 1 ] )
end

return p