Module:URL

From TSG Doc
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

-- -- This module implements {{URL|example.com|optional display text}} -- -- See unit tests at Module:URL/tests

local p = {}

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", "optional display text" } }
       else
           return text
       end
   end
   
   -- 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 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://
   url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?)://', 'http%1://')
   
   local uri = safeUri(url)
   
   -- Handle URL's without a protocol and URL's that are protocol-relative, 
   -- 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
       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 is badly-formed, so just display whatever was passed in
           text = url
       end
   end

-- Add before _/.-# sequences text = mw.ustring.gsub(text,"(/+)","%1") -- This entry MUST be the first. "" has a "/" in it, you know. text = mw.ustring.gsub(text,"(%.+)","%1") -- text = mw.ustring.gsub(text,"(%-+)","%1") -- DISABLED for now text = mw.ustring.gsub(text,"(%#+)","%1") text = mw.ustring.gsub(text,"(_+)","%1")

   return mw.ustring.format('[%s %s]', 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

return p