Module:URL/sandbox
Appearance
From Wikipedia, the free encyclopedia
This is the module sandbox page for Module:URL (diff).
See also the companion subpage for test cases (run).
See also the companion subpage for test cases (run).
[画像:Warning] This Lua module is used in MediaWiki:Titleblacklist-custom-URL , and on approximately 644,000 pages, or roughly 1% of all pages.
Changes to it can cause immediate changes to the Wikipedia user interface.
To avoid major disruption and server load, any changes should be tested in the module's /sandbox or /testcases subpages, or in your own module sandbox. The tested changes can be added to this page in a single edit. Please discuss changes on the talk page before implementing them.
Changes to it can cause immediate changes to the Wikipedia user interface.
To avoid major disruption and server load, any changes should be tested in the module's /sandbox or /testcases subpages, or in your own module sandbox. The tested changes can be added to this page in a single edit. Please discuss changes on the talk page before implementing them.
This module is rated as ready for general use. It has reached a mature state, is considered relatively stable and bug-free, and may be used wherever appropriate. It can be mentioned on help pages and other Wikipedia resources as an option for new users. To minimise server load and avoid disruptive output, improvements should be developed through sandbox testing rather than repeated trial-and-error editing.
This module implements {{URL }} and {{URL2 }}. Please see the template page for documentation.
Lua interface
[edit ]The p._url(url, text, msg)
function may be used by other Lua modules. It returns a formatted Wikitext for the given URL, made suitable for line wrapping using . It takes the following parameters:
- url
- REQUIRED. The URL to format.
- text
- OPTIONAL. Display text to put in the Wikitext link. Defaults to a pretty version of the URL.
- msg
- OPTIONAL. String. If content is false, n or N, do not emit a help message (using
{{tlx}}
) when URL is not given.
Example
[edit ]The following module emits a prettified link to log the user out. It will wrap correctly to most widths.
localurl=require('Module:URL')._url localp={} p.main=function(frame) returnurl("https://en.wikipedia.org/wiki/Special:UserLogout") end returnp
See also
[edit ]- {{#invoke:WikidataIB|url2}} – a simpler version which only allows one value
The above documentation is transcluded from Module:URL/doc. (edit | history)
Editors can experiment in this module's sandbox (edit | diff) and testcases (edit | run) pages.
Add categories to the /doc subpage. Subpages of this module.
Editors can experiment in this module's sandbox (edit | diff) and testcases (edit | run) pages.
Add categories to the /doc subpage. Subpages of this module.
-- -- This module implements {{URL}} -- -- See unit tests at [[Module:URL/testcases]] localp={} localfunctionsafeUri(s) localsuccess,uri=pcall(function() returnmw.uri.new(s) end) ifsuccessthen returnuri end end localfunctionextractUrl(args) forname,valinpairs(args)do ifname~=2andname~="msg"then localurl=name.."="..val; url=mw.ustring.gsub(url,'^[Hh][Tt][Tt][Pp]([Ss]?):(/?)([^/])','http%1://%3') localuri=safeUri(url); ifurianduri.hostthen returnurl end end end end functionp._url(url,text,msg) url=mw.text.trim(urlor'') text=mw.text.trim(textor'') localnomsg=(msgor''):sub(1,1):lower()=="n"ormsg=='false'-- boolean: true if msg is "false" or starts with n or N ifurl==''then iftext==''then ifnomsgthen returnnil else returnmw.getCurrentFrame():expandTemplate{title='tlx',args={'URL',"''example.com''","''optional display text''"}} end else returntext 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)returnmw.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') localuri=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 ifuriand(noturi.protocolor(uri.protocolandnoturi.host))andurl:sub(1,2)~='//'then url='http://'..url uri=safeUri(url) end iftext==''then ifurithen ifuri.path=='/'thenuri.path=''end localport='' ifuri.portthenport=':'..uri.portend text=mw.ustring.lower(uri.hostor'')..port..(uri.relativePathor'') -- 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 returnmw.ustring.format('<span class="url">[%s %s]</span>',url,text) end --[[ The main entry point for calling from Template:URL. --]] functionp.url(frame) localtemplateArgs=frame.args localparentArgs=frame:getParent().args localurl=templateArgs[1]orparentArgs[1] localtext=templateArgs[2]orparentArgs[2]or'' localmsg=templateArgs.msgorparentArgs.msgor'' url=urlorextractUrl(templateArgs)orextractUrl(parentArgs)or'' returnp._url(url,text,msg) end --[[ The entry point for calling from the forked Template:URL2. This function returns no message by default. It strips out wiki-link markup, html tags, and everything after a space. --]] functionp.url2(frame) localtemplateArgs=frame.args localparentArgs=frame:getParent().args localurl=templateArgs[1]orparentArgs[1] localtext=templateArgs[2]orparentArgs[2]or'' -- default to no message localmsg=templateArgs.msgorparentArgs.msgor'no' url=urlorextractUrl(templateArgs)orextractUrl(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. localu1,penicon=mw.ustring.match(url,"(.*)( <span class='penicon.*)") ifpeniconthenurl=u1end -- strip out html tags and [ ] from url url=(urlor''):gsub("<[^>]*>",""):gsub("[%[%]]","") -- truncate anything after a space url=url:gsub("%%20"," "):gsub(" .*","") return(p._url(url,text,msg)or"")..(peniconor"") end returnp