Модуль:Delink
Зовнішній вигляд
| Цей модуль позначений як К:реліз, готовий до загального вжитку (278). Він досягнув стадії готовності й вважається, що вільний від помилок і може використовуватись всюди, де знадобиться. Його можна згадувати на довідкових сторінках та інших сторінках Вікіпедії як можливість для навчання новачків. Аби зменшити навантаження на сервери та некоректний показ сторінок, його потрібно вдосконалювати через тестування у пісочниці[en], а не через застосування спроб і помилок. |
| Цей модуль позначено як К:такий, що потребує захищеного статусу (135). Завершені модулі використовуються в дуже великій кількості статей, або часто використовуються як підстановки. Позаяк акти вандалізму або помилки можуть вплинути на багато сторінок і навіть незначне редагування призведе до істотного навантаження на сервери, вони підлягають захисту від редагувань. |
| Цей модуль Lua використовується в системних повідомленнях, and на близько 238 000 сторінках або близько 4% всіх сторінок. Його зміни можуть призвести до миттєвих змін у користувацькому інтерфейсі Вікіпедія. Для уникнення великомасштабних збоїв та непотрібного навантаження на сервер, будь-які зміни спочатку потрібно перевірити на підсторінках /пісочниці та /тестів цього модуля, або у вашій пісочниці модуля. Потім перевірені зміни можуть бути впроваджені на цій сторінці єдиним редагуванням. Будь ласка, обговорюйте будь-які зміни на сторінці обговорення перед їхнім впровадженням. |
| Цей модуль залежить від наступних модулів: |
{{Модуль:Delink}} (обг. · викор. · ред.)
Модуль реалізує {{Delink}}.
Документація вище включена з Модуль:Delink/документація. (ред. | історія)
Дописувачі можуть експериментувати на підсторінках пісочниці (ред. | різн.) та протестувати зміни (ред.) цього модуля.
Будь ласка, додавайте категорії до підсторінки /документація. Підсторінки цієї сторінки.
Дописувачі можуть експериментувати на підсторінках пісочниці (ред. | різн.) та протестувати зміни (ред.) цього модуля.
Будь ласка, додавайте категорії до підсторінки /документація. Підсторінки цієї сторінки.
-- Вилучає з вікітексту внутрішні і зовнішні посилання.
require('strict')
local yesno = require('Модуль:Yesno')
local p = {}
local getArgs
local function delinkReversePipeTrick(s)
if s:match("^%[%[|.*[|\n]") then -- Перевірити наявність нових рядків або багаторазових пайпів.
return s
else
return s:match("%[%[|(.*)%]%]")
end
end
local function delinkPipeTrick(s)
-- Необхідно опрацювати двокрапки, дужки і коми.
-- Спочатку видаляємо текст перед першою двокрапкою, якщо вона є.
if s:match(":") then
s = s:match("%[%[.-:(.*)|%]%]")
-- Якщо двокрапок немає, залишити весь текст, крім квадратних дужок і пайпа.
else
s = s:match("%[%[(.*)|%]%]")
end
-- Наступна стадія — дужки і коми.
if s:match("%(.-%)$") then -- У дужок пріоритет над комами.
s = s:match("(.-) ?%(.-%)$")
elseif s:match(",") then -- Якщо дужок немає, вивести тільки текст перед першою комою.
s = s:match("(.-),.*$")
end
return s
end
-- Return wikilink target |wikilinks=target
local function getDelinkedTarget(s)
local result = s
-- Опрацювати трюк зі зворотним пайпом.
if result:match("%[%[|") then
return delinkReversePipeTrick(result)
end
result = mw.uri.decode(result, "PATH") -- Декодувати сутності, кодовані знаком відсотку. Залишити підкреслювання і плюси.
result = mw.text.decode(result, true) -- Декодувати сутності HTML
-- Перевірити некоректні заголовки. Для цього потрібно визначити
-- область посилання, тобто частину перед пайпом.
local target_area
if result:match("|") then -- Перевірити, чи маємо справу з пайп-посиланням.
target_area = result:match("^%[%[(.-)|.*%]%]")
else
target_area = result:match("^%[%[(.-)%]%]")
end
-- Перевірити наявність некоректних символів.
if mw.ustring.match(target_area, "[%[%]<>{}%%%c\n]") and mw.ustring.match(target_area, "[%[%]<>{}%%%c\n]") ~= "?" then
return s
end
return target_area
end
-- Return wikilink target |wikilinks=target
local function getDelinkedLabel(s)
local result = s
-- Опрацювати трюк зі зворотним пайпом.
if result:match("%[%[|") then
return delinkReversePipeTrick(result)
end
result = mw.uri.decode(result, "PATH") -- Декодувати сутності, кодовані знаком відсотку. Залишити підкреслювання і плюси.
result = mw.text.decode(result, true) -- Декодувати сутності HTML.
-- Перевірити некоректні заголовки. Для цього потрібно визначити
-- область посилання, тобто частину перед пайпом.
local target_area
if result:match("|") then -- Перевірити, чи маємо справу з пайп-посиланням.
target_area = result:match("^%[%[(.-)|.*%]%]")
else
target_area = result:match("^%[%[(.-)%]%]")
end
-- Перевірити наявність некоректних символів.
if mw.ustring.match(target_area, "[%[%]<>{}%%%c\n]") and mw.ustring.match(target_area, "[%[%]<>{}%%%c\n]") ~= "?" then
return s
end
-- Перевірити наявність категорій, інтервікі і файлів.
local colonprefix = result:match("%[%[(.-):.*%]%]") or "" -- Отримати текст перед першою двокрапкою.
local ns = mw.site.namespaces[colonprefix] -- Пересвідчитися, що зазначено відомий простір імен.
if mw.language.isKnownLanguageTag(colonprefix) or ( ns and ( ns.canonicalName == "File" or ns.canonicalName == "Category" ) ) then
return ""
end
-- Видалити двокрапку, якщо посилання містить трюк з двокрапкою.
if result:match("%[%[:") then
result = "[[" .. result:match("%[%[:(.*%]%])")
end
-- Опрацювати посилання, які містять трюк з пайпом.
if mw.ustring.match(result, "^%[%[[^|]*|%]%]") then
return delinkPipeTrick(result)
end
-- Знайти область відображення вікі-посилання
if result:match("|") then -- Визначити, чи посилання містить пайп.
result = result:match("^%[%[.-|(.+)%]%]")
-- Не відображати нові рядки багаторядкових пайп-посилань,
-- де яких пайп стоїть перед першим новим рядком.
result = result:gsub("\n", "")
else
result = result:match("^%[%[(.-)%]%]")
end
return result
end
local function delinkURL(s)
-- Припустимо, що внутрішні посилання вже прибрані,
-- після чого залишився текст між двома квдратними дужками [foo].
-- Якщо текст містить розрив рядка, він не відформатований як веб-адреса, незалежно від іншого вмісту.
if s:match("\n") then
return s
end
-- Перевірити наявність валідного URL-префіксу і принаймні одного валідного URL-символу.
local valid_url_prefixes = {"//", "http://", "https://", "ftp://", "gopher://", "mailto:", "news:", "irc://"}
local url_prefix
for _,v in ipairs(valid_url_prefixes) do
if mw.ustring.match(s, '^%[' .. v ..'[^"%s].*%]' ) then
url_prefix = v
break
end
end
-- Отримати текст для виводу
if not url_prefix then
return s
end
s = s:match("^%[" .. url_prefix .. "(.*)%]") -- Забрати весь текст після префіксу в веб-адресі і перед останньою квадратною дужкою.
s = s:match('^.-(["<> ].*)') or "" -- Забрати весь текст після першого символу-роздільника в веб-адресі ("<> ).
s = mw.ustring.match(s, "^%s*(%S.*)$") or "" -- Якщо символ-роздільник — пробіл, прибрати його.
local s_decoded = mw.text.decode(s, true)
if mw.ustring.match(s_decoded, "%c") then
return s
else
return s_decoded
end
end
local function delinkLinkClass(text, pattern, delinkFunction)
if type(text) ~= "string" then
error("Спроба прибрати посилання з нерядкового вводу.", 2)
end
if type(pattern) ~= "string" or mw.ustring.sub(pattern, 1, 1) ~= "^" then
error('Виявлено некоректний патерн. Патерни повинні починатися з "^".', 2)
end
-- Повторити для текстового рядка з заміною необхідного тексту, застосовуючи
-- функцію видалення посилань. Необхідно опрацьовувати текст символ за символом, а не
-- через gsub, інакше вкладені посилання не виявляються належним чином.
local result = ""
while text ~= "" do
-- Замінити текст, використовуючи одну ітерацію gsub.
text = mw.ustring.gsub(text, pattern, delinkFunction, 1)
-- Приєднати крайній символ зліва до похідного рядка.
result = result .. mw.ustring.sub(text, 1, 1)
text = mw.ustring.sub(text, 2, -1)
end
return result
end
function p._delink(args)
local text = args[1] or ""
args.refs = args.refs or args['прим']
args.comments = args.comments or args['коментарі']
args.wikilinks = args.wikilinks or args['вікіпосилання']
args.whitespace = args.whitespace or args['пробіли']
if yesno(args.refs) then
-- Прибрати усі стріп-маркери, що репрезентують теги ref. Може привести до
-- небажаних результатів — використовуйте тільки тоді, коли точно знаєте, що робите!
text = mw.ustring.gsub(text, "UNIQ%w*%-ref%-%d*%-QINU", "")
end
if not (yesno(args.comments) == false) then
text = text:gsub("<!%-%-.-%-%->", "") -- Прибрати коментарі html.
end
if not (yesno(args.wikilinks) == false) and args.wikilinks ~= "target" and args.wikilinks ~= "ціль" then
-- Прибрати внутрішні посилання та повернути назву посилання
text = delinkLinkClass(text, "^%[%[.-%]%]", getDelinkedLabel)
elseif args.wikilinks == "target" or args.wikilinks == "ціль" then
-- Прибрати внутрішні посилання та повернути ціль посилання
text = delinkLinkClass(text, "^%[%[.-%]%]", getDelinkedTarget)
end
if not (yesno(args.urls) == false) then
text = delinkLinkClass(text, "^%[.-%]", delinkURL) -- Прибрати зовнішні посилання.
end
if not (yesno(args.whitespace) == false) then
-- Замінити одиночні нові рядки одним пробілом, але залишити подвійні нові рядки
-- і нові рядки, які містять тільки пробіли або символи табуляції перед другим новим рядком.
text = mw.ustring.gsub(text, "([^\n \t][ \t]*)\n([ \t]*[^\n \t])", "%1 %2")
text = text:gsub("[ \t]+", " ") -- Прибрати додаткові символи табуляції і пробіли.
end
return text
end
function p.delink(frame)
if not getArgs then
getArgs = require('Модуль:Arguments').getArgs
end
return p._delink(getArgs(frame, {wrappers = 'Шаблон:Delink'}))
end
return p