Модуль:Вложенные кавычки
См. документацию {{Вложенные кавычки}}. Функции:
p._main
— для вызова через иные модули.p.main
— для вызова в шаблоне {{Вложенные кавычки}}.
Прошлый код шаблона имел недостатки с точки зрения ТП:ПРЕДЕЛ (код {{Вложенные кавычки|я}}
использовал 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