Модуль:Вложенные кавычки
Перейти к навигации
Перейти к поиску
Для документации этого модуля может быть создана страница Модуль:Вложенные кавычки/doc
--
-- 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