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 = |
+ | 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 |
+ | 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 |
+ | 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('§ %s', section) |
||
+ | elseif section then |
||
+ | display = string.format('%s § %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, { |
||
− | + | 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 |
+ | local selfref = options.selfref |
− | if type( |
+ | if type(extraclasses) == 'string' then |
− | + | 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 |
||