Modul:Detect singular: Unterschied zwischen den Versionen
(fix detect return for blank input, also) |
(add any_comma and no_and flags) |
||
Zeile 25: | Zeile 25: | ||
local args = {} | local args = {} | ||
-- canonicalize boolean arguments | -- canonicalize boolean arguments | ||
for key, default in pairs({no_comma=false,parse_links=false}) do | for key, default in pairs({no_comma=false,parse_links=false,any_comma=false,no_and=false}) do | ||
if origArgs[key] == nil then | if origArgs[key] == nil then | ||
args[key] = default | args[key] = default | ||
Zeile 33: | Zeile 33: | ||
end | end | ||
local checkComma = not args.no_comma | local checkComma = not args.no_comma | ||
local checkAnd = not args.no_and | |||
local rewriteLinks = not args.parse_links | local rewriteLinks = not args.parse_links | ||
local anyComma = args.any_comma | |||
local s = origArgs[1] -- the input string | local s = origArgs[1] -- the input string | ||
if not s then | if not s then | ||
Zeile 66: | Zeile 68: | ||
-- For the last 4, evaluate on string stripped of wikimarkup | -- For the last 4, evaluate on string stripped of wikimarkup | ||
s = getPlain(s) | s = getPlain(s) | ||
local | local commaPattern = anyComma and '[,;]' or '%D[,;]%D' -- semi-colon similar to comma | ||
local hasAnd = mw.ustring.find(s,'[,%s]and%s') | local hasComma = checkComma and mw.ustring.find(s, commaPattern) | ||
local hasAnd = checkAnd and mw.ustring.find(s,'[,%s]and%s') | |||
local hasBullets = countMatches(s,'%*+') > 1 | local hasBullets = countMatches(s,'%*+') > 1 | ||
local multipleQids = mw.ustring.find(s,'Q%d+[%p%s]+Q%d+') -- has multiple QIDs in a row | local multipleQids = mw.ustring.find(s,'Q%d+[%p%s]+Q%d+') -- has multiple QIDs in a row |
Version vom 15. Januar 2022, 08:25 Uhr
Die Dokumentation für dieses Modul kann unter Modul:Detect singular/doc erstellt werden
local p = {} local getArgs = require('Module:Arguments').getArgs local yesNo = require('Module:Yesno') local getPlain = require('Module:Text').Text().getPlain -- function to determine whether "sub" occurs in "s" local function plainFind(s, sub) return mw.ustring.find(s, sub, 1, true) end -- function to count the number of times "pattern" (a regex) occurs in "s" local function countMatches(s, pattern) local _, count = mw.ustring.gsub(s, pattern, '') return count end -- Determine whether a string is singular or plural (i.e., it represents one -- item or many) -- Arguments: -- origArgs[1]: string to process -- origArgs.no_comma: if false, use commas to detect plural (default false) -- origArgs.parse_links: if false, treat wikilinks as opaque singular objects (default false) function p._main(origArgs) origArgs = type(origArgs) == 'table' and origArgs or {} local args = {} -- canonicalize boolean arguments for key, default in pairs({no_comma=false,parse_links=false,any_comma=false,no_and=false}) do if origArgs[key] == nil then args[key] = default else args[key] = yesNo(origArgs[key],default) end end local checkComma = not args.no_comma local checkAnd = not args.no_and local rewriteLinks = not args.parse_links local anyComma = args.any_comma local s = origArgs[1] -- the input string if not s then return nil -- empty input returns nil end s = tostring(s) if plainFind(s,'forcedetectsingular') then -- magic data string to return true return true end if plainFind(s,'forcedetectplural') then -- magic data string to return false return false end -- count number of list items local numListItems = countMatches(s,'<%s*li') -- if exactly one, then singular, if more than one, then plural if numListItems == 1 then return true end if numListItems > 1 then return false end -- if "list of" occurs inside of wlink, then it's plural if mw.ustring.find(s:lower(), '%[%[[^%]]*list of[^%]]+%]%]') then return false end -- replace all wikilinks with fixed string if rewriteLinks then s = mw.ustring.gsub(s,'%b[]','WIKILINK') end -- Five conditions: any one of them can make the string a plural local hasBreak = mw.ustring.find(s,'<%s*br') -- For the last 4, evaluate on string stripped of wikimarkup s = getPlain(s) local commaPattern = anyComma and '[,;]' or '%D[,;]%D' -- semi-colon similar to comma local hasComma = checkComma and mw.ustring.find(s, commaPattern) local hasAnd = checkAnd and mw.ustring.find(s,'[,%s]and%s') local hasBullets = countMatches(s,'%*+') > 1 local multipleQids = mw.ustring.find(s,'Q%d+[%p%s]+Q%d+') -- has multiple QIDs in a row -- return bool: is it singular? return not (hasComma or hasAnd or hasBreak or hasBullets or multipleQids) end function p._pluralize(args) args = type(args) == 'table' and args or {} local singularForm = args[3] or "" local pluralForm = args[4] or "" if args[5] then link = tostring(args[5]) singularForm = '[['..link..'|'..singularForm..']]' pluralForm = '[['..link..'|'..pluralForm..']]' end if args[2] then return pluralForm end local detect = p._main(args) if detect == nil then return "" -- return blank on complete failure end return detect and singularForm or pluralForm end function p.main(frame) local args = getArgs(frame) -- For template, return 1 if singular, blank if plural or empty local result = p._main(args) if result == nil then return 1 end return result and 1 or "" end function p.pluralize(frame) local args = getArgs(frame) return p._pluralize(args) end return p