恪別𡧲版𢯢𢷮𧵑「模庉:Hatnote list」

造張㵋貝內容「-------------------------------------------------------------------------------- -- Module:Hatnote list -- -- -- -- This module produces and formats lists for use in hatnotes. In particular, -- -- it implements the for-see list, i.e. lists of "For X, see Y" statements, -- -- as used in {{about}}, {{redirect}}, and their variants. Also in…」
 
空固縿略𢯢𢷮
𣳔9: 𣳔9:


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')
𣳔18: 𣳔19:
--
--
-- These functions are used for stringifying lists, usually page lists inside
-- These functions are used for stringifying lists, usually page lists inside
-- the "Y" portion of "Đối với X, xem Y" for-see items.
-- the "Y" portion of "For X, see Y" for-see items.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------


𣳔29: 𣳔30:
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")
𣳔42: 𣳔50:
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
--searches display text only
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
for k, v in pairs(list) do
if searchDisp(v, separator) then
if searchDisp(v, separator) then
𣳔65: 𣳔73:


--DRY function
--DRY function
function conjList (conj, list, fmt)
function p.conjList (conj, list, fmt)
return stringifyList(list, {conjunction = conj, formatted = fmt})
return stringifyList(list, {conjunction = conj, formatted = fmt})
end
end


-- Stringifies lists with "and" or "or"
-- Stringifies lists with "and" or "or"
function p.andList (...) return conjList("và", ...) end
function p.andList (...) return p.conjList("và", ...) end
function p.orList (...) return conjList("hoặc", ...) end
function p.orList (...) return p.conjList("hoặc", ...) end


--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- For see
-- For see
--
--
-- Makes a "Đối với X, xem [[Y]]." list from raw parameters. Intended for the
-- Makes a "For X, see [[Y]]." list from raw parameters. Intended for the
-- {{about}} and {{redirect}} templates and their variants.
-- {{about}} and {{redirect}} templates and their variants.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
𣳔88: 𣳔96:
}
}


--Collapses duplicate punctuation
--Collapses duplicate punctuation at end of string, ignoring italics and links
function punctuationCollapse (text)
local function punctuationCollapse (text)
local replacements = {
return text:match("[.?!]('?)%1(%]?)%2%.$") and text:sub(1, -2) or text
["%.%.$"] = ".",
["%?%.$"] = "?",
["%!%.$"] = "!",
["%.%]%]%.$"] = ".]]",
["%?%]%]%.$"] = "?]]",
["%!%]%]%.$"] = "!]]"
}
for k, v in pairs(replacements) do text = string.gsub(text, k, v) end
return text
end
end


𣳔126: 𣳔125:
local terminated = false
local terminated = false
-- If there is extra text, and no arguments are given, give nil value
-- If there is extra text, and no arguments are given, give nil value
-- to not produce default of "Đối với các định nghĩa khác, xem foo (định hướng)"
-- to not produce default of "For other uses, see foo (disambiguation)"
if options.extratext and i > maxArg then return nil end
if options.extratext and i > maxArg then return nil end
-- Loop to generate rows
-- Loop to generate rows
𣳔142: 𣳔141:
-- until the "and"'s stop. Blanks are ignored: "1|and||and|3" → {1, 3}
-- until the "and"'s stop. Blanks are ignored: "1|and||and|3" → {1, 3}
while args[i + 2] == options.andKeyword do
while args[i + 2] == options.andKeyword do
if args[i + 3] then  
if args[i + 3] then
table.insert(forRow.pages, args[i + 3])
table.insert(forRow.pages, args[i + 3])
end
end
𣳔153: 𣳔152:
table.insert(forTable, forRow)
table.insert(forTable, forRow)
until terminated or i > maxArg
until terminated or i > maxArg
 
return forTable
return forTable
end
end
𣳔171: 𣳔170:
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 = p.andList(v.pages, true) or mHatnote._formatLink(mHatnote.disambiguate(options.title))
local pagesStr =
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)
𣳔182: 𣳔186:
end
end


-- Produces a "Đối với X, xem [[Y]]" string from arguments. Expects index gaps
-- Produces a "For X, see [[Y]]" string from arguments. Expects index gaps
-- but not blank/whitespace values. Ignores named args and args < "from".
-- but not blank/whitespace values. Ignores named args and args < "from".
function p._forSee (args, from, options)
function p._forSee (args, from, options)
𣳔191: 𣳔195:
-- As _forSee, but uses the frame.
-- As _forSee, but uses the frame.
function p.forSee (frame, from, options)
function p.forSee (frame, from, options)
mArguments = require('模庉:Arguments')
mArguments = require('Module:Arguments')
return p._forSee(mArguments.getArgs(frame), from, options)
return p._forSee(mArguments.getArgs(frame), from, options)
end
end


return p
return p