FANDOM


--
-- Модуль для реалізації {{URL}}
--
-- Дивіться юніт-тести на [[Module:URL/тести]]
 
local p = {}
 
--оскількі в ukwiki експортують шаблони і модулі як з enwiki, так і з ruwiki цей модуль для сумісності містить функції з обох варіантів реалізації
--функції з enwiki
function trim(s)
    return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1"))
end
 
function safeUri(s)
    local success, uri = pcall(function()
        return mw.uri.new(s)
    end)
    if success then
        return uri
    end
end
 
function p._url(url, text)
    url = trim(url or '')
    text = trim(text or '')
 
    if url == '' then
        if text == '' then
            return mw.getCurrentFrame():expandTemplate{ title = 'tlx', args = { 'URL', "''example.com''", "''необов'язковий опис''" } }
        else
            return text
        end
    end
 
    -- Якщо URL містить будь-які незакодовані пробіли, кодуємо їх, оскільки MediaWiki інакше буде інтерпретувати пробіл як кінець URL.
    url = mw.ustring.gsub(url, '%s', function(s) return mw.uri.encode(s, 'PATH') end)
 
    -- Якщо є порожній параметр чи фрагмент, вилучаємо це, так як це приведе до помилки в mw.uri.new
    url = mw.ustring.gsub(url, '#$', '')
    url = mw.ustring.gsub(url, '%?$', '')
 
    -- Якщо це URL HTTP[S] без подвійного слешу, виправляємо.
    url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?):(/?)([^/])', 'http%1://%3')
 
    local uri = safeUri(url)
 
    -- Обробляємо URL без протоколу, наприклад www.example.com/foo чи www.example.com:8080/foo
    if uri and (not uri.protocol or (uri.protocol and not uri.host)) then
        url = 'http://' .. url
        uri = safeUri(url)
    end
 
    if text == '' then
        if uri then
            if uri.path == '/' then uri.path = '' end
 
            local port = ''
            if uri.port then port = ':' .. uri.port end
 
            text = mw.ustring.lower(uri.host or '') .. port .. (uri.relativePath or '')
        else -- URL погано форматований, тому показуємо те, що було передано
            text = url
        end
    end
 
    return mw.ustring.format('<span class="url">[%s %s]</span>', url, text)
end
 
function p.url(frame)
    local templateArgs = frame.args
    local url = templateArgs[1] or ''
    local text = templateArgs[2] or ''
    return p._url(url, text)
end
--end enwiki version
 
--Версія з ruwiki
function startsWith( source, substring )
	if mw.ustring.len( substring ) > mw.ustring.len( source ) then
		return false
	end
	return mw.ustring.sub( source, 1, mw.ustring.len( substring ) ) == substring
end
 
function formatUrlImpl( source, title )
	local scheme, host, path
	local arg1, arg2 = source, title
	source = mw.text.trim( source, "%[%] " )
	local titleDelimeterPosition = mw.ustring.find( source, " ", 1 )
	if titleDelimeterPosition then
		if not title or title == "" then
			title = mw.ustring.sub( source, titleDelimeterPosition + 1 )
		end
		source = mw.ustring.sub( source, 1, titleDelimeterPosition - 1 )
	end
 
	local hostStartPosition
	local schemeDelimeterPosition = mw.ustring.find( source, "://", 1, true )
	if schemeDelimeterPosition then
		scheme = mw.ustring.sub( source, 1, schemeDelimeterPosition + 2)
		hostStartPosition = schemeDelimeterPosition + 3
	elseif mw.ustring.find( source, "^//", 1 ) then
		scheme = "//"
		hostStartPosition = 3
	else
		scheme = "http://"
		source = scheme .. source
		hostStartPosition = 8
	end
 
	if title then
		local finds = mw.ustring.find( arg1, "[", 1, true )
		if titleDelimeterPosition and finds and finds > titleDelimeterPosition + 1 then
			-- Если titleDelimeterPosition промазал мимо скобки и нашел пробел раньше неё, к примеру "a [b  c]",
			-- то свернуть всю нашу хиромантию и выдать первый аргумент без изменений.
			if arg2 == nil then
				return arg1 .. '[[Категорія:Вікіпедія:Сторінки зі складним входом в Модуль:URL]]'
			-- Если есть arg2, а мы распарсить ссылку не смогли, и значит заменить title не сможем корректно, это есть ошибка.
			-- С другой стороны, если arg2 нет, а arg1 очень сложный, то возможно это нормальный ход вещей,
			-- и на вход в модуль дана уже очень сильно оформленная ссылка.
			else
				return arg1 .. '[[Категорія:Вікіпедія:Сторінки з помилковою роботою Модуль:URL]]'
			end
		end
		return '[' .. source .. ' ' .. title .. ']'
	end
 
	local hostDelimeterPosition = mw.ustring.find( source, "/", hostStartPosition, true )
	if hostDelimeterPosition then
		host = mw.ustring.sub( source, hostStartPosition, hostDelimeterPosition - 1 )
		if hostDelimeterPosition == mw.ustring.len( source ) then
			path = nil
		else
			path = mw.ustring.sub( source, hostDelimeterPosition + 1 )
		end
	else
		host = mw.ustring.sub( source, hostStartPosition )
	end
 
	-- post-split format options
	if startsWith( host, 'www.' ) then
		host = mw.ustring.sub( host, 5 )
	end
	host = mw.language.new( 'en' ):lc( host )
 
	if path and path ~= '' and path ~= '/' then
		return '[' .. source .. ' ' .. host .. '/' .. path .. ']'
	else
		return '[' .. source .. ' ' .. host .. ']'
	end
end
 
function p.formatUrl( frame )
	local url = frame.args[1] or ''
	local title = frame.args[2] or ''
 
	url = mw.text.trim( url )
	title = mw.text.trim( title )
 
	if url == '' then
		return nil
	end
	if title == '' then
		title = nil
	end
	return formatUrlImpl( url, title )
end
 
function p.formatUrlSingle( context, options, url )
	url = mw.text.trim( url )
	if url == '' then
		return nil
	end
	local title = nil
	if ( options['text'] and options['text'] ~= '' ) then
		title = options['text']
	end
	return formatUrlImpl( url, title )
end
--end ruwiki version
 
return p

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Відвідайте інші вікіпроекти на Вікія!

Випадкова вікі