Модуль:Вложенные кавычки
Из Википедии, бесплатной энциклопедии
См. документацию {{Вложенные кавычки}}. Функции:
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