Editing Module:Hatnote

From Georgia Tech Student Wiki

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.

Latest revision Your text
Line 12: Line 12:
 
local mArguments -- lazily initialise [[Module:Arguments]]
 
local mArguments -- lazily initialise [[Module:Arguments]]
 
local yesno -- lazily initialise [[Module:Yesno]]
 
local yesno -- lazily initialise [[Module:Yesno]]
local formatLink -- lazily initialise [[Module:Format link]] ._formatLink
 
   
 
local p = {}
 
local p = {}
Line 19: Line 18:
 
-- Helper functions
 
-- Helper functions
 
--------------------------------------------------------------------------------
 
--------------------------------------------------------------------------------
 
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
 
   
 
local function getArgs(frame)
 
local function getArgs(frame)
Line 56: Line 49:
 
end
 
end
 
return 0
 
return 0
  +
end
  +
  +
function p.formatPages(...)
  +
-- Formats a list of pages using formatLink and returns it as an array. Nil
  +
-- values are not allowed.
  +
local pages = {...}
  +
local ret = {}
  +
for i, page in ipairs(pages) do
  +
ret[i] = p._formatLink{link = page}
  +
end
  +
return ret
  +
end
  +
  +
function p.formatPageTables(...)
  +
-- Takes a list of page/display tables and returns it as a list of
  +
-- formatted links. Nil values are not allowed.
  +
local pages = {...}
  +
local links = {}
  +
for i, t in ipairs(pages) do
  +
checkType('formatPageTables', i, t, 'table')
  +
local link = t[1]
  +
local display = t[2]
  +
links[i] = p._formatLink{link = link, display = display}
  +
end
  +
return links
 
end
 
end
   
Line 81: Line 99:
 
then
 
then
 
category = 'Hatnote templates with errors'
 
category = 'Hatnote templates with errors'
category = mw.ustring.format(
+
category = string.format(
 
'[[%s:%s]]',
 
'[[%s:%s]]',
 
mw.site.namespaces[14].name,
 
mw.site.namespaces[14].name,
Line 89: Line 107:
 
category = ''
 
category = ''
 
end
 
end
return mw.ustring.format(
+
return string.format(
 
'<strong class="error">Error: %s%s.</strong>%s',
 
'<strong class="error">Error: %s%s.</strong>%s',
 
msg,
 
msg,
Line 103: Line 121:
 
checkType('disambiguate', 2, disambiguator, 'string', true)
 
checkType('disambiguate', 2, disambiguator, 'string', true)
 
disambiguator = disambiguator or 'disambiguation'
 
disambiguator = disambiguator or 'disambiguation'
return mw.ustring.format('%s (%s)', page, disambiguator)
+
return string.format('%s (%s)', page, disambiguator)
  +
end
  +
  +
--------------------------------------------------------------------------------
  +
-- 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.
  +
--------------------------------------------------------------------------------
  +
  +
function p.formatLink(frame)
  +
-- The formatLink export function, for use in templates.
  +
yesno = require('Module:Yesno')
  +
local args = getArgs(frame)
  +
local link = args[1]
  +
if not link then
  +
return p.makeWikitextError(
  +
'no link specified',
  +
'Template:Format link#Errors',
  +
args.category
  +
)
  +
end
  +
return p._formatLink{
  +
link = link,
  +
display = args[2],
  +
italicizePage = yesno(args.italicizepage),
  +
italicizeSection = yesno(args.italicizesection),
  +
}
  +
end
  +
  +
local function italicize(s)
  +
-- Italicize a string.
  +
return '<i>' .. s .. '</i>'
  +
end
  +
  +
local function maybeItalicize(s, shouldItalicize)
  +
-- italicize s if s is a string and the shouldItalicize parameter is true.
  +
if s and shouldItalicize then
  +
return italicize(s)
  +
else
  +
return s
  +
end
  +
end
  +
  +
local function parseLink(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.
  +
local prePipe, display = link:match('^(.-)|(.*)$')
  +
link = prePipe or link
  +
  +
-- Find the page, if it exists.
  +
-- For links like [[#Bar]], the page will be nil.
  +
local preHash, postHash = link:match('^(.-)#(.*)$')
  +
local page
  +
if not preHash then
  +
-- We have a link like [[Foo]].
  +
page = link
  +
elseif preHash ~= '' then
  +
-- We have a link like [[Foo#Bar]].
  +
page = preHash
  +
end
  +
  +
-- Find the section, if it exists.
  +
local section
  +
if postHash and postHash ~= '' then
  +
section = postHash
  +
end
  +
  +
return {
  +
link = link,
  +
page = page,
  +
section = section,
  +
display = display,
  +
}
  +
end
  +
  +
function p._formatLink(options)
  +
-- The formatLink export function, for use in modules.
  +
checkType('_formatLink', 1, options, 'table')
  +
checkTypeForNamedArg('_formatLink', 'link', options.link, 'string', false)
  +
checkTypeForNamedArg(
  +
'_formatLink',
  +
'display',
  +
options.display,
  +
'string',
  +
true
  +
)
  +
checkTypeForNamedArg(
  +
'_formatLink',
  +
'italicizePage',
  +
options.italicizePage,
  +
'boolean',
  +
true
  +
)
  +
checkTypeForNamedArg(
  +
'_formatLink',
  +
'italicizeSection',
  +
options.italicizeSection,
  +
'boolean',
  +
true
  +
)
  +
  +
local parsed = parseLink(options.link)
  +
local display = options.display or parsed.display
  +
  +
-- Deal with the case where we don't have to pipe the link
  +
if not display and not parsed.section and not options.italicizePage then
  +
return string.format('[[:%s]]', parsed.link)
  +
end
  +
  +
-- Find the display text for piped links
  +
if not display then
  +
local page = maybeItalicize(parsed.page, options.italicizePage)
  +
local section = maybeItalicize(parsed.section, options.italicizeSection)
  +
if not page then
  +
display = string.format('§&nbsp;%s', section)
  +
elseif section then
  +
display = string.format('%s §&nbsp;%s', page, section)
  +
else
  +
display = page
  +
end
  +
end
  +
  +
return string.format('[[:%s|%s]]', parsed.link, display)
 
end
 
end
   
Line 115: Line 266:
 
local args = getArgs(frame)
 
local args = getArgs(frame)
 
local s = args[1]
 
local s = args[1]
  +
local options = {}
 
if not s then
 
if not s then
 
return p.makeWikitextError(
 
return p.makeWikitextError(
Line 122: Line 274:
 
)
 
)
 
end
 
end
  +
options.extraclasses = args.extraclasses
return p._hatnote(s, {
 
extraclasses = args.extraclasses,
+
options.selfref = args.selfref
  +
return p._hatnote(s, options)
selfref = args.selfref
 
})
 
 
end
 
end
   
Line 132: Line 283:
 
checkType('_hatnote', 2, options, 'table', true)
 
checkType('_hatnote', 2, options, 'table', true)
 
options = options or {}
 
options = options or {}
  +
local classes = {'hatnote', 'navigation-not-searchable'}
local inline = options.inline
 
  +
local extraclasses = options.extraclasses
local hatnote = mw.html.create(inline == 1 and 'span' or 'div')
 
local extraclasses
+
local selfref = options.selfref
if type(options.extraclasses) == 'string' then
+
if type(extraclasses) == 'string' then
extraclasses = options.extraclasses
+
classes[#classes + 1] = extraclasses
 
end
 
end
  +
if selfref then
 
  +
classes[#classes + 1] = 'selfref'
hatnote
 
  +
end
:attr('role', 'note')
 
  +
return string.format(
:addClass(inline == 1 and 'hatnote-inline' or 'hatnote')
 
  +
'%s<div role="note" class="%s">%s</div>',
:addClass('navigation-not-searchable')
 
  +
mw.getCurrentFrame():extensionTag{
:addClass(extraclasses)
 
  +
name = 'templatestyles', args = { src = 'Module:Hatnote/styles.css' }
:addClass(options.selfref and 'selfref')
 
  +
},
:wikitext(s)
 
  +
table.concat(classes, ' '),
 
  +
s
return mw.getCurrentFrame():extensionTag{
 
  +
)
name = 'templatestyles', args = { src = 'Module:Hatnote/styles.css' }
 
} .. tostring(hatnote)
 
 
end
 
end
   

Please note that all contributions to Georgia Tech Student Wiki are considered to be released under the Creative Commons Attribution-ShareAlike (see GT Student Wiki:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!

Cancel Editing help (opens in new window)

Template used on this page: