Jump to content

Module:Format link

Permanently protected module
From Wikipedia, the free encyclopedia

---------------------------------------------------------------------------------- Format link---- Makes a wikilink from the given link and display values. Links are escaped-- with colons if necessary, and links to sections are detected and displayed-- with " § " as a separator rather than the standard MediaWiki "#". Used in-- the {{format link}} template.--------------------------------------------------------------------------------locallibraryUtil=require('libraryUtil')localcheckType=libraryUtil.checkTypelocalcheckTypeForNamedArg=libraryUtil.checkTypeForNamedArglocalmArguments-- lazily initialise [[Module:Arguments]]localmError-- lazily initialise [[Module:Error]]localyesno-- lazily initialise [[Module:Yesno]]localp={}---------------------------------------------------------------------------------- Helper functions--------------------------------------------------------------------------------localfunctiongetArgs(frame)-- Fetches the arguments from the parent frame. Whitespace is trimmed and-- blanks are removed.mArguments=require('Module:Arguments')returnmArguments.getArgs(frame,{parentOnly=true})endlocalfunctionremoveInitialColon(s)-- Removes the initial colon from a string, if present.returns:match('^:?(.*)')endlocalfunctionmaybeItalicize(s,shouldItalicize)-- Italicize s if s is a string and the shouldItalicize parameter is true.ifsandshouldItalicizethenreturn'<i>'..s..'</i>'elsereturnsendendlocalfunctionparseLink(link)-- Parse a link and return a table with the link's components.-- These components are:-- - link: the link, stripped of any initial colon (always present)-- - page: the page name (always present)-- - section: the page name (may be nil)-- - display: the display text, if manually entered after a pipe (may be nil)link=removeInitialColon(link)-- Find whether a faux display value has been added with the {{!}} magic-- word.localprePipe,display=link:match('^(.-)|(.*)$')link=prePipeorlink-- Find the page, if it exists.-- For links like [[#Bar]], the page will be nil.localpreHash,postHash=link:match('^(.-)#(.*)$')localpageifnotpreHashthen-- We have a link like [[Foo]].page=linkelseifpreHash~=''then-- We have a link like [[Foo#Bar]].page=preHashend-- Find the section, if it exists.localsectionifpostHashandpostHash~=''thensection=postHashendreturn{link=link,page=page,section=section,display=display,}endlocalfunctionformatDisplay(parsed,options)-- Formats a display string based on a parsed link table (matching the-- output of parseLink) and an options table (matching the input options for-- _formatLink).localpage=maybeItalicize(parsed.page,options.italicizePage)localsection=maybeItalicize(parsed.section,options.italicizeSection)if(notsection)thenreturnpageelseif(notpage)thenreturnmw.ustring.format('§&nbsp;%s',section)elsereturnmw.ustring.format('%s §&nbsp;%s',page,section)endendlocalfunctionmissingArgError(target)mError=require('Module:Error')returnmError.error{message='Error: no link or target specified! ([['..target..'#Errors|help]])'}end---------------------------------------------------------------------------------- Main functions--------------------------------------------------------------------------------functionp.formatLink(frame)-- The formatLink export function, for use in templates.yesno=require('Module:Yesno')localargs=getArgs(frame)locallink=args[1]orargs.linklocaltarget=args[3]orargs.targetifnot(linkortarget)thenreturnmissingArgError('Template:Format link')endreturnp._formatLink{link=link,display=args[2]orargs.display,target=target,italicizePage=yesno(args.italicizepage),italicizeSection=yesno(args.italicizesection),categorizeMissing=args.categorizemissing}endfunctionp._formatLink(options)-- The formatLink export function, for use in modules.checkType('_formatLink',1,options,'table')localfunctioncheck(key,expectedType)--for brevitycheckTypeForNamedArg('_formatLink',key,options[key],expectedTypeor'string',true)endcheck('link')check('display')check('target')check('italicizePage','boolean')check('italicizeSection','boolean')check('categorizeMissing')-- Normalize link and target and check that at least one is presentifoptions.link==''thenoptions.link=nilendifoptions.target==''thenoptions.target=nilendifnot(options.linkoroptions.target)thenreturnmissingArgError('Module:Format link')endlocalparsed=parseLink(options.link)localdisplay=options.displayorparsed.displaylocalcatMissing=options.categorizeMissinglocalcategory=''-- Find the display textifnotdisplaythendisplay=formatDisplay(parsed,options)end-- Handle the target option if presentifoptions.targetthenlocalparsedTarget=parseLink(options.target)parsed.link=parsedTarget.linkparsed.page=parsedTarget.pageend-- Test if page exists if a diagnostic category is specifiedifcatMissingand(mw.ustring.len(catMissing)>0)thenlocaltitle=nilifparsed.pagethentitle=mw.title.new(parsed.page)endiftitleand(nottitle.isExternal)thenlocalsuccess,exists=pcall(function()returntitle.existsend)ifsuccessandnotexiststhencategory=mw.ustring.format('[[Category:%s]]',catMissing)endendend-- Format the result as a linkifparsed.link==displaythenreturnmw.ustring.format('[[:%s]]%s',parsed.link,category)elsereturnmw.ustring.format('[[:%s|%s]]%s',parsed.link,display,category)endend---------------------------------------------------------------------------------- Derived convenience functions--------------------------------------------------------------------------------functionp.formatPages(options,pages)-- Formats an array of pages using formatLink and the given options table,-- and returns it as an array. Nil values are not allowed.localret={}fori,pageinipairs(pages)doret[i]=p._formatLink{link=page,categorizeMissing=options.categorizeMissing,italicizePage=options.italicizePage,italicizeSection=options.italicizeSection}endreturnretendreturnp
close