|
w>Primefac |
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> |
| -- Labelled list --
| |
| -- --
| |
| -- This module does the core work of creating a hatnote composed of a list --
| |
| -- prefixed by a colon-terminated label, i.e. "LABEL: [andList of pages]", --
| |
| -- for {{see also}} and similar templates. --
| |
| --------------------------------------------------------------------------------
| |
|
| |
|
| local mHatnote = require('Module:Hatnote')
| | {{Documentation}} |
| local mHatlist = require('Module:Hatnote list')
| | <!-- Add categories and interwikis to the /doc subpage, not here! --> |
| local mArguments --initialize lazily
| | </noinclude> |
| local yesno --initialize lazily
| |
| local p = {}
| |
| | |
| -- Defaults global to this module
| |
| local defaults = {
| |
| label = 'See also', --Final fallback for label argument
| |
| labelForm = '%s: %s',
| |
| prefixes = {'label', 'label ', 'l'},
| |
| template = 'Module:Labelled list hatnote'
| |
| } | |
| | |
| -- Localizable message strings | |
| local msg = {
| |
| errorSuffix = '#Errors',
| |
| noInputWarning = 'no page names specified',
| |
| noOutputWarning =
| |
| "'''[[%s]] — no output: none of the target pages exist.'''"
| |
| }
| |
| | |
| -- Helper function that pre-combines display parameters into page arguments.
| |
| -- Also compresses sparse arrays, as a desirable side-effect.
| |
| function p.preprocessDisplays (args, prefixes)
| |
| -- Prefixes specify which parameters, in order, to check for display options
| |
| -- They each have numbers auto-appended, e.g. 'label1', 'label 1', & 'l1'
| |
| prefixes = prefixes or defaults.prefixes
| |
| local indices = {}
| |
| local sparsePages = {}
| |
| for k, v in pairs(args) do
| |
| if type(k) == 'number' then
| |
| indices[#indices + 1] = k
| |
| local display
| |
| for i = 1, #prefixes do
| |
| display = args[prefixes[i] .. k]
| |
| if display then break end
| |
| end
| |
| sparsePages[k] = display and
| |
| string.format('%s|%s', string.gsub(v, '|.*$', ''), display) or v
| |
| end
| |
| end
| |
| table.sort(indices)
| |
| local pages = {}
| |
| for k, v in ipairs(indices) do pages[#pages + 1] = sparsePages[v] end
| |
| return pages
| |
| end
| |
| | |
| --Helper function to get a page target from a processed page string
| |
| --e.g. "Page|Label" → "Page" or "Target" → "Target"
| |
| local function getTarget(pagename)
| |
| local pipe = string.find(pagename, '|')
| |
| return string.sub(pagename, 0, pipe and pipe - 1 or nil)
| |
| end
| |
| | |
| -- Produces a labelled pages-list hatnote.
| |
| -- The main frame (template definition) takes 1 or 2 arguments, for a singular
| |
| -- and (optionally) plural label respectively:
| |
| -- * {{#invoke:Labelled list hatnote|labelledList|Singular label|Plural label}}
| |
| -- The resulting template takes pagename & label parameters normally.
| |
| function p.labelledList (frame)
| |
| mArguments = require('Module:Arguments')
| |
| yesno = require('Module:Yesno')
| |
| local labels = {frame.args[1] or defaults.label}
| |
| labels[2] = frame.args[2] or labels[1]
| |
| labels[3] = frame.args[3] --no defaulting
| |
| labels[4] = frame.args[4] --no defaulting
| |
| local template = frame:getParent():getTitle()
| |
| local args = mArguments.getArgs(frame, {parentOnly = true})
| |
| local pages = p.preprocessDisplays(args)
| |
| local options = {
| |
| category = yesno(args.category),
| |
| extraclasses = frame.args.extraclasses,
| |
| ifexists = yesno(frame.args.ifexists),
| |
| namespace = frame.args.namespace or args.namespace,
| |
| selfref = yesno(frame.args.selfref or args.selfref),
| |
| template = template
| |
| }
| |
| return p._labelledList(pages, labels, options)
| |
| end
| |
| | |
| function p._labelledList (pages, labels, options)
| |
| if options.ifexists then
| |
| for k = #pages, 1, -1 do --iterate backwards to allow smooth removals
| |
| local v = pages[k]
| |
| local title = mw.title.new(getTarget(v), namespace)
| |
| if (v == '') or title == nil or not title.exists then
| |
| table.remove(pages, k)
| |
| end
| |
| end
| |
| end
| |
| labels = labels or {}
| |
| label = (#pages == 1 and labels[1] or labels[2]) or defaults.label
| |
| for k, v in pairs(pages) do
| |
| if mHatnote.findNamespaceId(v) ~= 0 then
| |
| label =
| |
| (
| |
| #pages == 1 and
| |
| (labels[3] or labels[1] or defaults.label) or
| |
| (labels[4] or labels[2] or defaults.label)
| |
| ) or defaults.label
| |
| end
| |
| end
| |
| if #pages == 0 then
| |
| if options.ifexists then
| |
| mw.addWarning(
| |
| string.format(
| |
| msg.noOutputWarning, options.template or defaults.template
| |
| )
| |
| )
| |
| return ''
| |
| else
| |
| return mHatnote.makeWikitextError(
| |
| msg.noInputWarning,
| |
| (options.template or defaults.template) .. msg.errorSuffix,
| |
| options.category
| |
| )
| |
| end
| |
| end
| |
| local text = string.format(
| |
| options.labelForm or defaults.labelForm,
| |
| label,
| |
| mHatlist.andList(pages, true)
| |
| )
| |
| local hnOptions = {
| |
| extraclasses = options.extraclasses,
| |
| selfref = options.selfref
| |
| }
| |
| return mHatnote._hatnote(text, hnOptions)
| |
| end
| |
| | |
| return p
| |