跳转到内容

Module:URL

轻之舟百科,让知识轻装启航

此模块的文档可以在Module:URL/doc创建

-- 该模块实现 {{URL}}
local p = {}

local 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 = mw.text.trim(url or '')
    text = mw.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 = mw.ustring.gsub(url, '%s', function(s) return mw.uri.encode(s, 'PATH') end)

    url = mw.ustring.gsub(url, '#$', '')
    url = mw.ustring.gsub(url, '%?$', '')

    url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?):(/?)([^/])', 'http%1://%3')

    url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?)://', 'http%1://')

    local uri = safeUri(url)

    if uri and (not uri.protocol or (uri.protocol and not uri.host)) and url:sub(1, 2) ~= '//' 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 '')

			text = mw.ustring.gsub(text, "(/+)", "<wbr/>%1")
			text = mw.ustring.gsub(text, "(%.+)", "<wbr/>%1")
			text = mw.ustring.gsub(text, "(%#+)", "<wbr/>%1")
			text = mw.ustring.gsub(text, "(_+)", "<wbr/>%1")
        else
            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 parentArgs = frame:getParent().args;
    local url = templateArgs[1] or parentArgs[1] or ''
    local text = templateArgs[2] or parentArgs[2]
    if not text then
    	url = url or extractUrl(templateArgs) or extractUrl(parentArgs);
	end
	text = text or ''
    return p._url(url, text)
end
function extractUrl(args)
	for name, val in pairs(args) do
		local url = name .. "=" .. val;
		url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?):(/?)([^/])', 'http%1://%3')
		local uri = safeUri(url);
		if uri and uri.host then
			return url
		end
	end
end
return p