Module:Hatnote list: Difference between revisions

m
1 revision imported from wikipedia:Module:Hatnote_list
m (1 revision imported from templatewiki:Module:Hatnote_list)
m (1 revision imported from wikipedia:Module:Hatnote_list)
 
(One intermediate revision by one other user not shown)
Line 9:
 
local mArguments --initialize lazily
local mFormatLink = require('Module:Format link')
local mHatnote = require('Module:Hatnote')
local libraryUtil = require('libraryUtil')
Line 29 ⟶ 30:
formatted = false
}
 
--searchesSearches display text only
local function searchDisp(thaystack, fneedle)
return string.find(
return string.find(string.sub(thaystack, (string.find(thaystack, '|') or 0) + 1), f)needle
})
end
 
-- Stringifies a list generically; probably shouldn't be used directly
local function stringifyList(list, options)
-- Type-checks, defaults, and a shortcut
checkType("stringifyList", 1, list, "table")
Line 42 ⟶ 50:
local s = options.space
-- Format the list if requested
if options.formatted then list = mHatnote.formatPages(unpack(list)) end
list = mFormatLink.formatPages(
{categorizeMissing = mHatnote.missingTargetCat}, list
)
end
-- Set the separator; if any item contains it, use the alternate separator
local separator = options.separator
--searches display text only
local function searchDisp(t, f)
return string.find(string.sub(t, (string.find(t, '|') or 0) + 1), f)
end
for k, v in pairs(list) do
if searchDisp(v, separator) then
Line 65 ⟶ 73:
 
--DRY function
function p.conjList (conj, list, fmt)
return stringifyList(list, {conjunction = conj, formatted = fmt})
end
 
-- Stringifies lists with "and" or "or"
function p.andList (...) return p.conjList("and", ...) end
function p.orList (...) return p.conjList("or", ...) end
 
--------------------------------------------------------------------------------
Line 88 ⟶ 96:
}
 
--Collapses duplicate punctuation at end of string, ignoring italics and links
local function punctuationCollapse (text)
return text:match("[.?!]('?)%1(%]?)%2%.$") and text:sub(1, -2) or text
local replacements = {
["%.%.$"] = ".",
["%?%.$"] = "?",
["%!%.$"] = "!",
["%.%]%]%.$"] = ".]]",
["%?%]%]%.$"] = "?]]",
["%!%]%]%.$"] = "!]]"
}
for k, v in pairs(replacements) do text = string.gsub(text, k, v) end
return text
end
 
Line 142 ⟶ 141:
-- until the "and"'s stop. Blanks are ignored: "1|and||and|3" → {1, 3}
while args[i + 2] == options.andKeyword do
if args[i + 3] then
table.insert(forRow.pages, args[i + 3])
end
Line 153 ⟶ 152:
table.insert(forTable, forRow)
until terminated or i > maxArg
 
return forTable
end
Line 171 ⟶ 170:
for k, v in pairs(forSeeTable) do
local useStr = v.use or options.otherText
local pagesStr =
local pagesStr = p.andList(v.pages, true) or mHatnote._formatLink{link = mHatnote.disambiguate(options.title)}
p.andList(v.pages, true) or
mFormatLink._formatLink{
categorizeMissing = mHatnote.missingTargetCat,
local pagesStr = p.andList(v.pages, true) or mHatnote._formatLink{ link = mHatnote.disambiguate(options.title)}
}
local forSeeStr = string.format(options.forSeeForm, useStr, pagesStr)
forSeeStr = punctuationCollapse(forSeeStr)