Module:Main: Difference between revisions

From Zoophilia Wiki
Jump to navigationJump to search
meta>Nihiltres
(Tweaked tracking to make exclusive to mainspace)
m (1 revision imported)
 
(6 intermediate revisions by 5 users not shown)
Line 4: Line 4:
--  
--  
-- If the module is used in category or category talk space, it produces "The
-- If the module is used in category or category talk space, it produces "The
-- main article for this category is xxx". Otherwise, it produces
-- main article for this category is xxx." Otherwise, it produces
-- "Main article: xxx".
-- "Main article: xxx".
--]]
--]]


local mHatnote = require('Module:Hatnote')
local mHatnote = require('Module:Hatnote')
local mTableTools -- lazily initialise
local mHatlist = require('Module:Hatnote list')
local mArguments -- lazily initialise
local mArguments -- lazily initialise
local p = {}
local p = {}


function p.main(frame)
function p.main(frame)
mTableTools = require('Module:TableTools')
mArguments = require('Module:Arguments')
mArguments = require('Module:Arguments')
local args = mArguments.getArgs(frame, {parentOnly = true})
local args = mArguments.getArgs(frame, {parentOnly = true})
Line 21: Line 19:
for k, v in pairs(args) do
for k, v in pairs(args) do
if type(k) == 'number' then
if type(k) == 'number' then
local display = args['l' .. tostring(k)]
local display = args['label ' .. k] or args['l' .. k]
local page = {v, display}
local page = display and
pages[k] = page
string.format('%s|%s', string.gsub(v, '|.*$', ''), display) or v
pages[#pages + 1] = page
end
end
end
end
pages = mTableTools.compressSparseArray(pages)
if #pages == 0 and mw.title.getCurrentTitle().namespace == 0 then
return mHatnote.makeWikitextError(
'no page names specified',
'Template:Main#Errors',
args.category
)
end
local options = {
local options = {
selfref = args.selfref
selfref = args.selfref
}
}
return p._main(options, unpack(pages))
return p._main(pages, options)
end
end


function p._main(options, ...)
function p._main(args, options)
-- Get the list of pages. If no first page was specified we use the current
-- Get the list of pages. If no first page was specified we use the current
-- page name.
-- page name.
local pages = {...}
local currentTitle = mw.title.getCurrentTitle()
local currentTitle = mw.title.getCurrentTitle()
local firstPageTable = pages[1]
if #args == 0 then args = {currentTitle.text} end
local firstPage
local firstPage = string.gsub(args[1], '|.*$', '')
local emptyArgs = ((mw.title.getCurrentTitle().namespace == 0) and
not firstPageTable) and
'[[Category:Hatnote templates using unusual parameters]]' or ''
if firstPageTable then
firstPage = firstPageTable[1]
else
firstPage = currentTitle.text
firstPageTable = {firstPage}
pages[1] = firstPageTable
end
 
-- Find the pagetype.
-- Find the pagetype.
local firstPageNs = mHatnote.findNamespaceId(firstPage)
local pageType = mHatnote.findNamespaceId(firstPage) == 0 and 'article' or 'page'
local pagetype = firstPageNs == 0 and 'article' or 'page'
pagetype = pagetype .. emptyArgs
 
-- Make the formatted link text
-- Make the formatted link text
local links = mHatnote.formatPageTables(unpack(pages))
list = mHatlist.andList(args, true)
links = mw.text.listToText(links)
 
-- Build the text.
-- Build the text.
local isPlural = #pages > 1
local isPlural = #args > 1
local currentNs = currentTitle.namespace
local mainForm
local isCategoryNamespace = currentNs - currentNs % 2 == 14
local curNs = currentTitle.namespace
local stringToFormat
if (curNs == 14) or (curNs == 15) then --category/talk namespaces
if isCategoryNamespace then
mainForm = isPlural and
if isPlural then
'The main %ss for this [[Help:Categories|category]] are %s.'
stringToFormat = 'The main %ss for this'
or
.. ' [[Wikipedia:Categorization|category]] are %s'
'The main %s for this [[Help:Categories|category]] is %s.'
else
stringToFormat = 'The main %s for this'
.. ' [[Wikipedia:Categorization|category]] is %s'
end
else
else
if isPlural then
mainForm = isPlural and 'Main %ss: %s' or 'Main %s: %s'
stringToFormat = 'Main %ss: %s'
else
stringToFormat = 'Main %s: %s'
end
end
end
local text = string.format(stringToFormat, pagetype, links)
local text = string.format(mainForm, pageType, list)
 
-- Process the options and pass the text to the _rellink function in
-- Process the options and pass the text to the _rellink function in
-- [[Module:Hatnote]].
-- [[Module:Hatnote]].
options = options or {}
options = options or {}
local hnOptions = {
local hnOptions = {
extraclasses = 'relarticle mainarticle',
selfref = options.selfref
selfref = options.selfref
}
}

Latest revision as of 22:13, 6 June 2021

This module produces a link to a main article or articles. It implements the {{main}} template. Normally, it produces a link like "Main article: A". If used in the category namespace, it produces a link like "The main article for this category is A". It is possible to specify multiple articles, and in this case plural wording is used automatically. If the first link is not an article, the module uses the wording "Main page" instead of "Main article".

Usage from wikitext

This module cannot be accessed directly from #invoke. Instead, it can only be used through the {{main}} template. Please see the template page for documentation.

Usage from other Lua modules

Load the module:

<syntaxhighlight lang="lua"> local mMain = require('Module:Main') </syntaxhighlight>

You can then use the _main function like this:

<syntaxhighlight lang="lua"> mMain._main(args, options) </syntaxhighlight>

The args parameter following options are a list of page link strings; if they use custom display values, each string should be preprocessed into a single piped string (e.g. page|display value). Category or file links are automatically escaped using the colon trick. If a link includes a section name, and no display value is set, links are automatically formatted as page § section, rather than the MediaWiki default of page#section.

The optional options table can be used to configure the function's output. At present, the only option available is "selfref", which is used when the output is a self-reference to Wikipedia. to set this option, use <syntaxhighlight lang="lua" class="" id="" style="" inline="1">{selfref = true}</syntaxhighlight>. (See the {{selfref}} template for more details on self-references.)

Example 1

<syntaxhighlight lang="lua"> mMain._main({'A'}) </syntaxhighlight>

Produces:

<div role="note" class="hatnote navigation-not-searchable">Main article: [[A]]</div>

Displays as:

Example 2

<syntaxhighlight lang="lua"> mMain._main({'Wikipedia:Categorization', 'Help:Category', 'Category:Wikipedia categories'}) </syntaxhighlight>

Produces:

<div role="note" class="hatnote navigation-not-searchable">Main pages: [[Wikipedia:Categorization]], [[Help:Category]] and [[:Category:Wikipedia categories]]</div>

Displays as:

Example 3

<syntaxhighlight lang="lua"> mMain._main({'A|the letter "A"', 'B|the letter "B"', 'C|the letter "C"'}) </syntaxhighlight>

Produces:

<div role="note" class="hatnote navigation-not-searchable">Main articles: [[A|the letter "A"]], [[B|the letter "B"]] and [[C|the letter "C"]]</div>

Displays as:

Example 4

<syntaxhighlight lang="lua"> mMain._main({'Wikipedia:Verifiability#Burden'}, {selfref = true}) </syntaxhighlight>

Produces:

<div role="note" class="hatnote navigation-not-searchable selfref">Main article: [[Wikipedia:Verifiability#Burden|Wikipedia:Verifiability § Burden]]</div>

Displays as:

Example 5 (if used in the category namespace)

<syntaxhighlight lang="lua"> mMain._main({'A'}) </syntaxhighlight>

Produces:

<div role="note" class="hatnote navigation-not-searchable">The main article for this [[Wikipedia:Categorization|category]] is [[A]]</div>

Displays as:

Technical details

This module uses Module:Hatnote to format the hatnote text, Module:Hatnote list to process the list of links, and Module:Arguments to fetch the arguments from wikitext.


--[[
-- This module produces a link to a main article or articles. It implements the
-- template {{main}}.
-- 
-- If the module is used in category or category talk space, it produces "The
-- main article for this category is xxx." Otherwise, it produces
-- "Main article: xxx".
--]]

local mHatnote = require('Module:Hatnote')
local mHatlist = require('Module:Hatnote list')
local mArguments -- lazily initialise
local p = {}

function p.main(frame)
	mArguments = require('Module:Arguments')
	local args = mArguments.getArgs(frame, {parentOnly = true})
	local pages = {}
	for k, v in pairs(args) do
		if type(k) == 'number' then
			local display = args['label ' .. k] or args['l' .. k]
			local page = display and
				string.format('%s|%s', string.gsub(v, '|.*$', ''), display) or v
			pages[#pages + 1] = page
		end
	end
	if #pages == 0 and mw.title.getCurrentTitle().namespace == 0 then
		return mHatnote.makeWikitextError(
			'no page names specified',
			'Template:Main#Errors',
			args.category
		)
	end
	local options = {
		selfref = args.selfref
	}
	return p._main(pages, options)
end

function p._main(args, options)
	-- Get the list of pages. If no first page was specified we use the current
	-- page name.
	local currentTitle = mw.title.getCurrentTitle()
	if #args == 0 then args = {currentTitle.text} end
	local firstPage = string.gsub(args[1], '|.*$', '')
	-- Find the pagetype.
	local pageType = mHatnote.findNamespaceId(firstPage) == 0 and 'article' or 'page'
	-- Make the formatted link text
	list = mHatlist.andList(args, true)
	-- Build the text.
	local isPlural = #args > 1
	local mainForm
	local curNs = currentTitle.namespace
	if (curNs == 14) or (curNs == 15) then --category/talk namespaces
		mainForm = isPlural and
			'The main %ss for this [[Help:Categories|category]] are %s.'
			or
			'The main %s for this [[Help:Categories|category]] is %s.'
	else
		mainForm = isPlural and 'Main %ss: %s' or 'Main %s: %s'
	end
	local text = string.format(mainForm, pageType, list)
	-- Process the options and pass the text to the _rellink function in
	-- [[Module:Hatnote]].
	options = options or {}
	local hnOptions = {
		selfref = options.selfref
	}
	return mHatnote._hatnote(text, hnOptions)
end

return p