w>Nihiltres |
|
Line 1: |
Line 1: |
| --------------------------------------------------------------------------------
| | <includeonly>{{#if:{{{1|}}}|{{#switch:{{MONTHNUMBER|{{{1}}}}}|1=January|2=February|3=March|4=April|5=May|6=June|7=July|8=August|9=September|10=October|11=November|12=December|Incorrect required parameter 1=''month''!}}|Missing required parameter 1=''month''!}}</includeonly><noinclude> |
| -- Module:Hatnote --
| |
| -- --
| |
| -- This module produces hatnote links and links to related articles. It --
| |
| -- implements the {{hatnote}} and {{format link}} meta-templates and includes --
| |
| -- helper functions for other Lua hatnote modules. --
| |
| --------------------------------------------------------------------------------
| |
|
| |
|
| local libraryUtil = require('libraryUtil')
| | {{Documentation}} |
| local checkType = libraryUtil.checkType
| | <!-- Add categories and interwikis to the /doc subpage, not here! --> |
| local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
| | </noinclude> |
| local mArguments -- lazily initialise [[Module:Arguments]]
| |
| local yesno -- lazily initialise [[Module:Yesno]]
| |
| local formatLink -- lazily initialise [[Module:Format link]] ._formatLink
| |
| | |
| local p = {}
| |
| | |
| --------------------------------------------------------------------------------
| |
| -- Helper functions
| |
| --------------------------------------------------------------------------------
| |
| | |
| local function getArgs(frame)
| |
| -- Fetches the arguments from the parent frame. Whitespace is trimmed and
| |
| -- blanks are removed.
| |
| mArguments = require('Module:Arguments')
| |
| return mArguments.getArgs(frame, {parentOnly = true})
| |
| end
| |
| | |
| local function removeInitialColon(s)
| |
| -- Removes the initial colon from a string, if present.
| |
| return s:match('^:?(.*)')
| |
| end
| |
| | |
| function p.defaultClasses(inline)
| |
| -- Provides the default hatnote classes as a space-separated string; useful
| |
| -- for hatnote-manipulation modules like [[Module:Hatnote group]].
| |
| return
| |
| (inline == 1 and 'hatnote-inline' or 'hatnote') .. ' ' ..
| |
| 'navigation-not-searchable'
| |
| end
| |
| | |
| function p.disambiguate(page, disambiguator)
| |
| -- Formats a page title with a disambiguation parenthetical,
| |
| -- i.e. "Example" → "Example (disambiguation)".
| |
| checkType('disambiguate', 1, page, 'string')
| |
| checkType('disambiguate', 2, disambiguator, 'string', true)
| |
| disambiguator = disambiguator or 'disambiguation'
| |
| return mw.ustring.format('%s (%s)', page, disambiguator)
| |
| end
| |
| | |
| function p.findNamespaceId(link, removeColon)
| |
| -- Finds the namespace id (namespace number) of a link or a pagename. This
| |
| -- function will not work if the link is enclosed in double brackets. Colons
| |
| -- are trimmed from the start of the link by default. To skip colon
| |
| -- trimming, set the removeColon parameter to false.
| |
| checkType('findNamespaceId', 1, link, 'string')
| |
| checkType('findNamespaceId', 2, removeColon, 'boolean', true)
| |
| if removeColon ~= false then
| |
| link = removeInitialColon(link)
| |
| end
| |
| local namespace = link:match('^(.-):')
| |
| if namespace then
| |
| local nsTable = mw.site.namespaces[namespace]
| |
| if nsTable then
| |
| return nsTable.id
| |
| end
| |
| end
| |
| return 0
| |
| end
| |
| | |
| function p.makeWikitextError(msg, helpLink, addTrackingCategory, title)
| |
| -- Formats an error message to be returned to wikitext. If
| |
| -- addTrackingCategory is not false after being returned from
| |
| -- [[Module:Yesno]], and if we are not on a talk page, a tracking category
| |
| -- is added.
| |
| checkType('makeWikitextError', 1, msg, 'string')
| |
| checkType('makeWikitextError', 2, helpLink, 'string', true)
| |
| yesno = require('Module:Yesno')
| |
| title = title or mw.title.getCurrentTitle()
| |
| -- Make the help link text.
| |
| local helpText
| |
| if helpLink then
| |
| helpText = ' ([[' .. helpLink .. '|help]])'
| |
| else
| |
| helpText = ''
| |
| end
| |
| -- Make the category text.
| |
| local category
| |
| if not title.isTalkPage -- Don't categorise talk pages
| |
| and title.namespace ~= 2 -- Don't categorise userspace
| |
| and yesno(addTrackingCategory) ~= false -- Allow opting out
| |
| then
| |
| category = 'Hatnote templates with errors'
| |
| category = mw.ustring.format(
| |
| '[[%s:%s]]',
| |
| mw.site.namespaces[14].name,
| |
| category
| |
| )
| |
| else
| |
| category = ''
| |
| end
| |
| return mw.ustring.format(
| |
| '<strong class="error">Error: %s%s.</strong>%s',
| |
| msg,
| |
| helpText,
| |
| category
| |
| )
| |
| end
| |
| | |
| local curNs = mw.title.getCurrentTitle().namespace
| |
| p.missingTargetCat =
| |
| --Default missing target category, exported for use in related modules
| |
| ((curNs == 0) or (curNs == 14)) and
| |
| 'Articles with hatnote templates targeting a nonexistent page' or nil
| |
| | |
| function p.quote(title)
| |
| --Wraps titles in quotation marks. If the title starts/ends with a quotation
| |
| --mark, kerns that side as with {{-'}}
| |
| local quotationMarks = {
| |
| ["'"]=true, ['"']=true, ['“']=true, ["‘"]=true, ['”']=true, ["’"]=true
| |
| }
| |
| local quoteLeft, quoteRight = -- Test if start/end are quotation marks
| |
| quotationMarks[string.sub(title, 1, 1)],
| |
| quotationMarks[string.sub(title, -1, -1)]
| |
| if quoteLeft or quoteRight then
| |
| title = mw.html.create("span"):wikitext(title)
| |
| end
| |
| if quoteLeft then title:css("padding-left", "0.15em") end
| |
| if quoteRight then title:css("padding-right", "0.15em") end
| |
| return '"' .. tostring(title) .. '"'
| |
| end
| |
| | |
| --------------------------------------------------------------------------------
| |
| -- Hatnote
| |
| --
| |
| -- Produces standard hatnote text. Implements the {{hatnote}} template.
| |
| --------------------------------------------------------------------------------
| |
| | |
| function p.hatnote(frame)
| |
| local args = getArgs(frame)
| |
| local s = args[1]
| |
| if not s then
| |
| return p.makeWikitextError(
| |
| 'no text specified',
| |
| 'Template:Hatnote#Errors',
| |
| args.category
| |
| )
| |
| end
| |
| return p._hatnote(s, {
| |
| extraclasses = args.extraclasses,
| |
| selfref = args.selfref
| |
| })
| |
| end
| |
| | |
| function p._hatnote(s, options)
| |
| checkType('_hatnote', 1, s, 'string')
| |
| checkType('_hatnote', 2, options, 'table', true)
| |
| options = options or {}
| |
| local inline = options.inline
| |
| local hatnote = mw.html.create(inline == 1 and 'span' or 'div')
| |
| local extraclasses
| |
| if type(options.extraclasses) == 'string' then
| |
| extraclasses = options.extraclasses
| |
| end
| |
| | |
| hatnote
| |
| :attr('role', 'note')
| |
| :addClass(p.defaultClasses(inline))
| |
| :addClass(extraclasses)
| |
| :addClass(options.selfref and 'selfref' or nil)
| |
| :wikitext(s)
| |
| | |
| return mw.getCurrentFrame():extensionTag{
| |
| name = 'templatestyles', args = { src = 'Module:Hatnote/styles.css' }
| |
| } .. tostring(hatnote)
| |
| end
| |
| | |
| return p
| |