Jump to content
Wikipedia The Free Encyclopedia

Module:Format link

From Wikipedia, the free encyclopedia
Module documentation[view] [edit] [history] [purge]
[画像:Warning] This Lua module is used in MediaWiki:Perfcachedts , and on approximately 1,460,000 pages, or roughly 2% 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.
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.
Page template-protected This module is currently protected from editing.
See the protection policy and protection log for more details. Please discuss any changes on the talk page; you may submit an edit request to ask an administrator to make an edit if it is uncontroversial or supported by consensus. You may also request that this page be unprotected.
This module depends on the following other modules:

This module, migrated from origins in Module:Hatnote, provides functionality for formatting links for display, including that powering the {{format link }} template.

It can pretty-format section links with the section symbol ("§") and appropriate whitespace, it automatically escapes category and file names with the colon trick, and includes functionality for italicizing the page or section name, and for detecting and categorizing results that produce red links.

Use from wikitext

The functions in this module cannot be used directly from #invoke, and must be used through templates instead. Please see Template:Format link for documentation on usage of that template.

Use from other Lua modules

To load this module from another Lua module, use the following code:

localmFormatLink=require('Module:Format link')

You can then use the functions as documented below.

mFormatLink._formatLink{
link='Link',
display='Display',
target='Target',
italicizePage=true,
italicizeSection=true,
categorizeMissing='Pages using formatted red links'
}

Formats link as a wikilink. Categories and files are automatically escaped with the colon trick, and links to sections are automatically formatted as page § section, rather than the MediaWiki default of page#section.

Several options modify the output:

  • If the display value is present, then it will be used as a display value. Any manual piping (using the {{!}} magic word or similar) present in link will be overridden by the display value if present.
  • If the target value is present, then it will override link as a target, but the result will still be displayed using either the value from display, or the result of formatting link.
  • If italicizePage is true, then the page portion of the link is italicized if present.
  • If italicizeSection is true, then the section portion of the link is italicized if present.
  • If categorizeMissing is a non-empty string, then that value is used as a category name, and that category will be applied if the resulting target of the link (no matter whether through link or through target) doesn't exist.
Examples
mFormatLink._formatLink{link='Foo#Bar'} → [[:Foo#Bar|Foo § Bar]] → Foo § Bar
mFormatLink._formatLink{link='Baz',display='Qux'} → [[:Baz|Qux]] → Qux
mFormatLink._formatLink{link='Foo|Bar',display='Baz'} → [[:Foo|Baz]] → Baz
mFormatLink._formatLink{link='#Foo',target='Example#Foo'} → [[:Example#Foo|§ Foo]] → § Foo
mFormatLink._formatLink{link='The Lord of the Rings#Plot',italicizePage=true} → [[:The Lord of the Rings#Plot|''The Lord of the Rings'' § Plot]] → The Lord of the Rings § Plot
mFormatLink._formatLink{link='Cybercrime Prevention Act of 2012#Disini v. Secretary of Justice',italicizeSection=true} → [[:Cybercrime Prevention Act of 2012#Disini v. Secretary of Justice|Cybercrime Prevention Act of 2012 § ''Disini v. Secretary of Justice'']] → Cybercrime Prevention Act of 2012 § Disini v. Secretary of Justice
mFormatLink._formatLink{link='Nonexistent page',categorizeMissing='Example'} → [[:Nonexistent page]][[Category:Example]] → Nonexistent page
mFormatLink._formatLink{link='Existing',categorizeMissing='Example'} → [[:Existing]] → Existing

formatPages

mFormatLink.formatPages(options,pages)

This derived function is useful for lists that format many links. It formats an array of pages using the _formatLink function, and returns the result as an array. Options in the options table are applied, and use the same names as the options for _formatLink.

Example
mFormatLink.formatPages({categorizeMissing='Example'},{'Foo#Bar','Nonexistent page'}){'[[:Foo#Bar|Foo § Bar]]','[[:Nonexistent page]][[Category:Example]]'}

Errors

If _formatLink is used and neither a link nor a target argument is provided, then the module will produce an error message instead of its usual output, as it cannot then produce valid output.

You can solve this error by providing appropriate parameters to _formatLink, or you may want to ensure that a more descriptive error is provided by a downstream template or module when it would otherwise call _formatLink with inadequate arguments.

The above documentation is transcluded from Module:Format link/doc. (edit | history)
Editors can experiment in this module's sandbox (edit | diff) and testcases (edit | run) pages.
Subpages of this module.

 --------------------------------------------------------------------------------
 -- 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.checkType
 localcheckTypeForNamedArg=libraryUtil.checkTypeForNamedArg
 localmArguments-- 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})
 end

 localfunctionremoveInitialColon(s)
 -- Removes the initial colon from a string, if present.
 returns:match('^:?(.*)')
 end

 localfunctionmaybeItalicize(s,shouldItalicize)
 -- Italicize s if s is a string and the shouldItalicize parameter is true.
 ifsandshouldItalicizethen
 return'<i>'..s..'</i>'
 else
 returns
 end
 end

 localfunctionparseLink(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('^(.-)#(.*)$')
 localpage
 ifnotpreHashthen
 -- We have a link like [[Foo]].
 page=link
 elseifpreHash~=''then
 -- We have a link like [[Foo#Bar]].
 page=preHash
 end

 -- Find the section, if it exists.
 localsection
 ifpostHashandpostHash~=''then
 section=postHash
 end

 return{
 link=link,
 page=page,
 section=section,
 display=display,
 }
 end

 localfunctionformatDisplay(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)then
 returnpage
 elseif(notpage)then
 returnmw.ustring.format('§&nbsp;%s',section)
 else
 returnmw.ustring.format('%s §&nbsp;%s',page,section)
 end
 end

 localfunctionmissingArgError(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.link
 localtarget=args[3]orargs.target
 ifnot(linkortarget)then
 returnmissingArgError('Template:Format link')
 end

 returnp._formatLink{
 link=link,
 display=args[2]orargs.display,
 target=target,
 italicizePage=yesno(args.italicizepage),
 italicizeSection=yesno(args.italicizesection),
 categorizeMissing=args.categorizemissing
 }
 end

 functionp._formatLink(options)
 -- The formatLink export function, for use in modules.
 checkType('_formatLink',1,options,'table')
 localfunctioncheck(key,expectedType)--for brevity
 checkTypeForNamedArg(
 '_formatLink',key,options[key],expectedTypeor'string',true
 )
 end
 check('link')
 check('display')
 check('target')
 check('italicizePage','boolean')
 check('italicizeSection','boolean')
 check('categorizeMissing')

 -- Normalize link and target and check that at least one is present
 ifoptions.link==''thenoptions.link=nilend
 ifoptions.target==''thenoptions.target=nilend
 ifnot(options.linkoroptions.target)then
 returnmissingArgError('Module:Format link')
 end

 localparsed=parseLink(options.link)
 localdisplay=options.displayorparsed.display
 localcatMissing=options.categorizeMissing
 localcategory=''

 -- Find the display text
 ifnotdisplaythendisplay=formatDisplay(parsed,options)end

 -- Handle the target option if present
 ifoptions.targetthen
 localparsedTarget=parseLink(options.target)
 parsed.link=parsedTarget.link
 parsed.page=parsedTarget.page
 end

 -- Test if page exists if a diagnostic category is specified
 ifcatMissingand(mw.ustring.len(catMissing)>0)then
 localtitle=nil
 ifparsed.pagethentitle=mw.title.new(parsed.page)end
 iftitleand(nottitle.isExternal)then
 localsuccess,exists=pcall(function()returntitle.existsend)
 ifsuccessandnotexiststhen
 category=mw.ustring.format('[[Category:%s]]',catMissing)
 end
 end
 end

 -- Format the result as a link
 ifparsed.link==displaythen
 returnmw.ustring.format('[[:%s]]%s',parsed.link,category)
 else
 returnmw.ustring.format('[[:%s|%s]]%s',parsed.link,display,category)
 end
 end

 --------------------------------------------------------------------------------
 -- 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)do
 ret[i]=p._formatLink{
 link=page,
 categorizeMissing=options.categorizeMissing,
 italicizePage=options.italicizePage,
 italicizeSection=options.italicizeSection
 }
 end
 returnret
 end

 returnp

AltStyle によって変換されたページ (->オリジナル) /