更改
Undid revision 1062166786 by Matthiaspaul (talk); should be fixed now, and if not, please ping me with examples as I couldn't reproduce the original error
local mArguments --initialize lazily
local mArguments --initialize lazily
local mFormatLink = require('Module:Format link')
local mHatnote = require('Module:Hatnote')
local mHatnote = require('Module:Hatnote')
local libraryUtil = require('libraryUtil')
local libraryUtil = require('libraryUtil')
--default options table used across the list stringification functions
--default options table used across the list stringification functions
local stringifyListDefaultOptions = {
local stringifyListDefaultOptions = {
conjunction = "和",
conjunction = "and",
separator = "、",
separator = ",",
altSeparator = ";",
altSeparator = ";",
space = "",
space = " ",
formatted = false,
formatted = false
}
}
--Searches display text only
local function searchDisp(haystack, needle)
return string.find(
string.sub(haystack, (string.find(haystack, '|') or 0) + 1), needle
)
end
-- Stringifies a list generically; probably shouldn't be used directly
-- Stringifies a list generically; probably shouldn't be used directly
function stringifyList(list, options)
local function stringifyList(list, options)
-- Type-checks, defaults, and a shortcut
-- Type-checks, defaults, and a shortcut
checkType("stringifyList", 1, list, "table")
checkType("stringifyList", 1, list, "table")
local s = options.space
local s = options.space
-- Format the list if requested
-- Format the list if requested
if options.formatted then list = mHatnote.formatPages(unpack(list)) end
if options.formatted then
list = mFormatLink.formatPages(
{categorizeMissing = mHatnote.missingTargetCat}, list
)
end
-- Set the separator; if any item contains it, use the alternate separator
-- Set the separator; if any item contains it, use the alternate separator
local separator = options.separator
local separator = options.separator
for k, v in pairs(list) do
for k, v in pairs(list) do
if searchDisp(v, separator) then
if searchDisp(v, separator) then
separator = options.altSeparator
separator = options.altSeparator
-- Set the conjunction, apply Oxford comma, and force a comma if #1 has "§"
-- Set the conjunction, apply Oxford comma, and force a comma if #1 has "§"
local conjunction = s .. options.conjunction .. s
local conjunction = s .. options.conjunction .. s
if #list == 2 and searchDisp(list[1], "§") or #list > 2 then
conjunction = separator .. conjunction
end
-- Return the formatted string
-- Return the formatted string
return mw.text.listToText(list, separator .. s, conjunction)
return mw.text.listToText(list, separator .. s, conjunction)
--DRY function
--DRY function
function p.conjList (conj, list, fmt)
function conjList (conj, list, fmt, bold, quo)
return stringifyList(list, {conjunction = conj, formatted = fmt})
return stringifyList(list, {conjunction = conj, formatted = fmt, boldfaced = bold, quotes=quo})
end
end
-- Stringifies lists with "and" or "or"
-- Stringifies lists with "and" or "or"
function p.andList (...) return p.conjList("and", ...) end
function p.andList (...) return conjList("和", ...) end
function p.orList (...) return p.conjList("or", ...) end
function p.orList (...) return conjList("或", ...) end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--default options table used across the forSee family of functions
--default options table used across the forSee family of functions
local forSeeDefaultOptions = {
local forSeeDefaultOptions = {
andKeyword = '和',
andKeyword = 'and',
title = mw.title.getCurrentTitle().text,
title = mw.title.getCurrentTitle().text,
otherText = '其他用法',
otherText = 'other uses',
forSeeForm = '关于%s,请见%s。',
forSeeForm = 'For %s, see %s.',
}
}
--Collapses duplicate punctuation
--Collapses duplicate punctuation
local function punctuationCollapse (text)
function punctuationCollapse (text)
local replacements = {
local replacements = {
["%.%.$"] = ".",
["%.%.$"] = ".",
["%.%]%]%.$"] = ".]]",
["%.%]%]%.$"] = ".]]",
["%?%]%]%.$"] = "?]]",
["%?%]%]%.$"] = "?]]",
["%!%]%]%.$"] = "!]]",
["%!%]%]%.$"] = "!]]"
}
}
for k, v in pairs(replacements) do text = string.gsub(text, k, v) end
for k, v in pairs(replacements) do text = string.gsub(text, k, v) end
for k, v in pairs(forSeeTable) do
for k, v in pairs(forSeeTable) do
local useStr = v.use or options.otherText
local useStr = v.use or options.otherText
local pagesStr =
local pagesStr = p.andList(v.pages, true, true, true) or '「\'\'\'' .. mHatnote._formatLink(mHatnote.disambiguate(options.title)) .. '\'\'\'」'
p.andList(v.pages, true) or
mFormatLink._formatLink{
categorizeMissing = mHatnote.missingTargetCat,
link = mHatnote.disambiguate(options.title)
}
local forSeeStr = string.format(options.forSeeForm, useStr, pagesStr)
local forSeeStr = string.format(options.forSeeForm, useStr, pagesStr)
forSeeStr = punctuationCollapse(forSeeStr)
forSeeStr = punctuationCollapse(forSeeStr)
if options.extratext then table.insert(strList, punctuationCollapse(options.extratext..'.')) end
if options.extratext then table.insert(strList, punctuationCollapse(options.extratext..'.')) end
-- Return the concatenated list
-- Return the concatenated list
return table.concat(strList)
return table.concat(strList, ' ')
end
end