Jump to content

Editing Module:URL

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 2: Line 2:
-- This module implements {{URL}}
-- This module implements {{URL}}
--
--
-- See unit tests at [[Module:URL/tests]]
-- See unit tests at [[Module:URL/testcases]]


local p = {}
local p = {}
   
   
function trim(s)
local function safeUri(s)
    return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1"))
local success, uri = pcall(function()
return mw.uri.new(s)
end)
if success then
return uri
end
end
end


function safeUri(s)
local function extractUrl(args)
    local success, uri = pcall(function()
for name, val in pairs(args) do
        return mw.uri.new(s)
if name ~= 2 and name ~= "msg" then
    end)
local url = name .. "=" .. val;
    if success then
url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?):(/?)([^/])', 'http%1://%3')
        return uri
local uri = safeUri(url);
    end
if uri and uri.host then
return url
end
end
end
end
end


function p._url(url, text)
function p._url(url, text, msg)
    url = trim(url or '')
url = mw.text.trim(url or '')
    text = trim(text or '')
text = mw.text.trim(text or '')
   
local nomsg = (msg or ''):sub(1,1):lower() == "n" or msg == 'false' -- boolean: true if msg is "false" or starts with n or N
    if url == '' then
 
        if text == '' then
if url == '' then
            return mw.getCurrentFrame():expandTemplate{ title = 'tlx', args = { 'URL', "''example.com''", "''optional display text''" } }
if text == '' then
        else
if nomsg then
            return text
return nil
        end
else
    end
return mw.getCurrentFrame():expandTemplate{ title = 'tlx', args = { 'URL', "''example.com''", "''optional display text''" } }
   
end
    -- If the URL contains any unencoded spaces, encode them, because MediaWiki will otherwise interpret a space as the end of the URL.
else
    url = mw.ustring.gsub(url, '%s', function(s) return mw.uri.encode(s, 'PATH') end)
return text
   
end
    -- If there is an empty query string or fragment id, remove it as it will cause mw.uri.new to throw an error
end
    url = mw.ustring.gsub(url, '#$', '')
 
    url = mw.ustring.gsub(url, '%?$', '')
-- If the URL contains any unencoded spaces, encode them, because MediaWiki will otherwise interpret a space as the end of the URL.
   
url = mw.ustring.gsub(url, '%s', function(s) return mw.uri.encode(s, 'PATH') end)
    -- If it's an HTTP[S] URL without the double slash, fix it.
 
    url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?):(/?)([^/])', 'http%1://%3')
-- If there is an empty query string or fragment id, remove it as it will cause mw.uri.new to throw an error
url = mw.ustring.gsub(url, '#$', '')
url = mw.ustring.gsub(url, '%?$', '')
 
-- If it's an HTTP[S] URL without the double slash, fix it.
url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?):(/?)([^/])', 'http%1://%3')


    -- Handle URLs from Wikidata of the format http://
local uri = safeUri(url)
    url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?)://', 'http%1://')
 
   
-- Handle URL's without a protocol and URL's that are protocol-relative,  
    local uri = safeUri(url)
-- e.g. www.example.com/foo or www.example.com:8080/foo, and //www.example.com/foo
   
if uri and (not uri.protocol or (uri.protocol and not uri.host)) and url:sub(1, 2) ~= '//' then
    -- Handle URL's without a protocol and URL's that are protocol-relative,  
url = 'http://' .. url
    -- e.g. www.example.com/foo or www.example.com:8080/foo, and //www.example.com/foo
uri = safeUri(url)
    if uri and (not uri.protocol or (uri.protocol and not uri.host)) and url:sub(1, 2) ~= '//' then
end
        url = 'http://' .. url
 
        uri = safeUri(url)
if text == '' then
    end
if uri then
   
if uri.path == '/' then uri.path = '' end
    if text == '' then
 
        if uri then
local port = ''
            if uri.path == '/' then uri.path = '' end
if uri.port then port = ':' .. uri.port end
           
 
            local port = ''
text = mw.ustring.lower(uri.host or '') .. port .. (uri.relativePath or '')
            if uri.port then port = ':' .. uri.port end
           
            text = mw.ustring.lower(uri.host or '') .. port .. (uri.relativePath or '')


-- Add <wbr> before _/.-# sequences
-- Add <wbr> before _/.-# sequences
Line 68: Line 79:
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 -- URL is badly-formed, so just display whatever was passed in
else -- URL is badly-formed, so just display whatever was passed in
            text = url
text = url
        end
end
    end
end


    return mw.ustring.format('<span class="url">[%s %s]</span>', url, text)
return mw.ustring.format('<span class="url">[%s %s]</span>', url, text)
end
end


--[[
The main entry point for calling from Template:URL.
--]]
function p.url(frame)
function p.url(frame)
    local templateArgs = frame.args
local templateArgs = frame.args
local parentArgs = frame:getParent().args;
local parentArgs = frame:getParent().args
    local url = templateArgs[1] or parentArgs[1] or ''
local url = templateArgs[1] or parentArgs[1]
    local text = templateArgs[2] or parentArgs[2]
local text = templateArgs[2] or parentArgs[2] or ''
    if not text then
local msg = templateArgs.msg or parentArgs.msg or ''
    url = url or extractUrl(templateArgs) or extractUrl(parentArgs);
url = url or extractUrl(templateArgs) or extractUrl(parentArgs) or ''
end
return p._url(url, text, msg)
text = text or ''
    return p._url(url, text)
end
end
function extractUrl(args)
 
for name, val in pairs(args) do
--[[
local url = name .. "=" .. val;
The entry point for calling from the forked Template:URL2.
url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?):(/?)([^/])', 'http%1://%3')
This function returns no message by default.
local uri = safeUri(url);
It strips out wiki-link markup, html tags, and everything after a space.
if uri and uri.host then
--]]
return url
function p.url2(frame)
end
local templateArgs = frame.args
end
local parentArgs = frame:getParent().args
local url = templateArgs[1] or parentArgs[1]
local text = templateArgs[2] or parentArgs[2] or ''
-- default to no message
local msg = templateArgs.msg or parentArgs.msg or 'no'
url = url or extractUrl(templateArgs) or extractUrl(parentArgs) or ''
-- if the url came from a Wikidata call, it might have a pen icon appended
-- we want to keep that and add it back at the end.
local u1, penicon = mw.ustring.match( url, "(.*)(&nbsp;<span class='penicon.*)" )
if penicon then url = u1 end
-- strip out html tags and [ ] from url
url = (url or ''):gsub("<[^>]*>", ""):gsub("[%[%]]", "")
-- truncate anything after a space
url = url:gsub("%%20", " "):gsub(" .*", "")
return (p._url(url, text, msg) or "") .. (penicon or "")
end
end
return p
return p
Please note that all contributions to Micro Pedia may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see Micro Pedia:Copyrights for details). Do not submit copyrighted work without permission!
Cancel Editing help (opens in new window)

Template used on this page: