|
|
Línea 1: |
Línea 1: |
| --
| | local z = {} |
| -- This module implements {{URL}}
| |
| --
| |
| -- See unit tests at [[Module:URL/testcases]]
| |
|
| |
|
| local p = {}
| | function z.enlazar(url, texto) |
|
| | --if true then return 'url: ' .. (url or '') .. ' texto: ' .. (texto or '') end |
| local function safeUri(s)
| | if not url or |
| local success, uri = pcall(function() | | url:match('^%s*$') then |
| return mw.uri.new(s) | | return |
| end)
| | elseif url:find('%[') or |
| if success then | | url:match('^{{{.*}}}$') then -- Por ejemplo, un parámetro de una plantilla, {{{página web|}}} |
| return uri | | return url |
| | elseif z.esValida(url) then |
| | urlCorregida = url |
| | else |
| | urlCorregida = 'http://' .. url |
| end | | end |
| end
| | |
| | | if texto then |
| local function extractUrl(args)
| | return '[' .. urlCorregida .. ' ' .. texto .. ']' |
| for name, val in pairs(args) do | | else |
| if name ~= 2 and name ~= "msg" then
| | textoCorregido = urlCorregida:match('^http://(.+)') or |
| local url = name .. "=" .. val;
| | urlCorregida:match('^https://(.+)') or |
| url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?):(/?)([^/])', 'http%1://%3')
| | urlCorregida |
| local uri = safeUri(url);
| | |
| if uri and uri.host then
| | -- Eliminar la / al final |
| return url
| | textoCorregido = textoCorregido:match('(.+)/$') or textoCorregido |
| end
| | |
| end
| | return '[' .. urlCorregida .. ' ' .. textoCorregido .. ']' |
| end | | end |
| end | | end |
|
| |
|
| function p._url(url, text, msg) | | function z.url(frame) |
| url = mw.text.trim(url or '')
| | if not frame or not frame.args then |
| text = mw.text.trim(text or '')
| | return |
| 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 nomsg then
| |
| return nil
| |
| else
| |
| return mw.getCurrentFrame():expandTemplate{ title = 'tlx', args = { 'URL', "''example.com''", "''optional display text''" } }
| |
| end
| |
| else | |
| return text
| |
| end
| |
| end | | end |
| | | |
| -- If the URL contains any unencoded spaces, encode them, because MediaWiki will otherwise interpret a space as the end of the URL. | | return z.enlazar(frame.args[1], frame.args[2]) |
| 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 '')
| |
| | |
| -- Add <wbr> before _/.-# sequences
| |
| text = mw.ustring.gsub(text,"(/+)","<wbr/>%1") -- This entry MUST be the first. "<wbr/>" has a "/" in it, you know.
| |
| text = mw.ustring.gsub(text,"(%.+)","<wbr/>%1")
| |
| -- text = mw.ustring.gsub(text,"(%-+)","<wbr/>%1") -- DISABLED for now
| |
| 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
| |
| text = url
| |
| end
| |
| end
| |
| | |
| return mw.ustring.format('<span class="url">[%s %s]</span>', url, text)
| |
| end | | end |
|
| |
|
| --[[ | | --function z.enlacePlano |
| The main entry point for calling from Template:URL.
| | -- Ver la plantilla Enlace plano |
| --]] | | -- return |
| function p.url(frame)
| | --end |
| local templateArgs = frame.args
| |
| local parentArgs = frame:getParent().args
| |
| local url = templateArgs[1] or parentArgs[1]
| |
| local text = templateArgs[2] or parentArgs[2] or ''
| |
| local msg = templateArgs.msg or parentArgs.msg or ''
| |
| url = url or extractUrl(templateArgs) or extractUrl(parentArgs) or ''
| |
| return p._url(url, text, msg)
| |
| end | |
|
| |
|
| --[[ | | -- Ver la función checkurl del módulo de citas. |
| The entry point for calling from the forked Template:URL2.
| | function z.esValida(url) |
| This function returns no message by default.
| | return url:sub(1,2) == "//" or url:match( "^[^/]*:" ) |
| It strips out wiki-link markup, html tags, and everything after a space.
| |
| --]]
| |
| function p.url2(frame) | |
| local templateArgs = frame.args | |
| 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, "(.*)( <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 z |
La documentación para este módulo puede ser creada en Módulo:URL/doc
local z = {}
function z.enlazar(url, texto)
--if true then return 'url: ' .. (url or '') .. ' texto: ' .. (texto or '') end
if not url or
url:match('^%s*$') then
return
elseif url:find('%[') or
url:match('^{{{.*}}}$') then -- Por ejemplo, un parámetro de una plantilla, {{{página web|}}}
return url
elseif z.esValida(url) then
urlCorregida = url
else
urlCorregida = 'http://' .. url
end
if texto then
return '[' .. urlCorregida .. ' ' .. texto .. ']'
else
textoCorregido = urlCorregida:match('^http://(.+)') or
urlCorregida:match('^https://(.+)') or
urlCorregida
-- Eliminar la / al final
textoCorregido = textoCorregido:match('(.+)/$') or textoCorregido
return '[' .. urlCorregida .. ' ' .. textoCorregido .. ']'
end
end
function z.url(frame)
if not frame or not frame.args then
return
end
return z.enlazar(frame.args[1], frame.args[2])
end
--function z.enlacePlano
-- Ver la plantilla Enlace plano
-- return
--end
-- Ver la función checkurl del módulo de citas.
function z.esValida(url)
return url:sub(1,2) == "//" or url:match( "^[^/]*:" )
end
return z