Module:URL

From Zoophilia Wiki
Revision as of 00:36, 27 February 2013 by meta>Dcoetzee (Modify to access module's frame args instead of parent's, and have the template pass them through - this is the conventional way of writing modules and makes them more reusable and easier to test)
Jump to navigationJump to search

Documentation for this module may be created at Module:URL/doc

--
-- This module implements {{URL}}
--
-- See unit tests at [[Module:URL/tests]]

local p = {}
 
function trim(s)
    return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1"))
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)
    
    local uri = mw.uri.new(url)
    
    -- Handle URL's without a protocol, e.g. www.example.com/foo or www.example.com:8080/foo
    if not uri.protocol or (uri.protocol and not uri.host) then
        url = 'http://' .. url
        uri = mw.uri.new(url)
    end
    
    if text == '' 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
    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

return p