Module:Detect singular: Difference between revisions
Jump to navigation
Jump to search
wp>Hike395 implement named arguments: singular, plural, link |
m 1 revision imported |
||
(2 intermediate revisions by 2 users not shown) | |||
Line 14: | Line 14: | ||
return count | return count | ||
end | end | ||
local singular = 1 | |||
local likelyPlural = 2 | |||
local plural = 3 | |||
-- Determine whether a string is singular or plural (i.e., it represents one | -- Determine whether a string is singular or plural (i.e., it represents one | ||
Line 21: | Line 25: | ||
-- origArgs.no_comma: if false, use commas to detect plural (default false) | -- 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) | -- origArgs.parse_links: if false, treat wikilinks as opaque singular objects (default false) | ||
-- Returns: | |||
-- singular, likelyPlural, or plural (see constants above), or nil for completely unknown | |||
function p._main(origArgs) | function p._main(origArgs) | ||
origArgs = type(origArgs) == 'table' and origArgs or {} | origArgs = type(origArgs) == 'table' and origArgs or {} | ||
Line 41: | Line 47: | ||
end | end | ||
s = tostring(s) | s = tostring(s) | ||
if plainFind(s,' | s = mw.text.decode(s,true) --- replace HTML entities (to avoid spurious semicolons) | ||
return | if plainFind(s,'data-plural="0"') then -- magic data string to return true | ||
return singular | |||
end | end | ||
if plainFind(s,' | if plainFind(s,'data-plural="1"') then -- magic data string to return false | ||
return | return plural | ||
end | end | ||
-- count number of list items | -- count number of list items | ||
Line 51: | Line 58: | ||
-- if exactly one, then singular, if more than one, then plural | -- if exactly one, then singular, if more than one, then plural | ||
if numListItems == 1 then | if numListItems == 1 then | ||
return | return singular | ||
end | end | ||
if numListItems > 1 then | if numListItems > 1 then | ||
return | return plural | ||
end | end | ||
-- if "list of" occurs inside of wlink, then it's plural | -- if "list of" occurs inside of wlink, then it's plural | ||
if mw.ustring.find(s:lower(), '%[%[[^%]]*list of[^%]]+%]%]') then | if mw.ustring.find(s:lower(), '%[%[[^%]]*list of[^%]]+%]%]') then | ||
return | return plural | ||
end | end | ||
-- fix for trailing br tags passed through [[template:marriage]] | |||
s = mw.ustring.gsub(s, '<%s*br[^>]*>%s*(</div>)', '%1') | |||
-- replace all wikilinks with fixed string | -- replace all wikilinks with fixed string | ||
if rewriteLinks then | if rewriteLinks then | ||
s = mw.ustring.gsub(s,'%b[]','WIKILINK') | s = mw.ustring.gsub(s,'%b[]','WIKILINK') | ||
end | end | ||
-- Five conditions: any one of them can make the string a plural | -- Five conditions: any one of them can make the string a likely plural or plural | ||
local hasBreak = mw.ustring.find(s,'<%s*br') | local hasBreak = mw.ustring.find(s,'<%s*br') | ||
-- 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 hasBullets = countMatches(s,'%*+') > 1 | |||
local multipleQids = mw.ustring.find(s,'Q%d+[%p%s]+Q%d+') -- has multiple QIDs in a row | |||
if hasBullets or multipleQids then | |||
return plural | |||
end | |||
local commaPattern = anyComma and '[,;]' or '%D[,;]%D' -- semi-colon similar to comma | local commaPattern = anyComma and '[,;]' or '%D[,;]%D' -- semi-colon similar to comma | ||
local hasComma = checkComma and mw.ustring.find(s, commaPattern) | local hasComma = checkComma and mw.ustring.find(s, commaPattern) | ||
local hasAnd = checkAnd and mw.ustring.find(s,'[,%s]and%s') | local hasAnd = checkAnd and mw.ustring.find(s,'[,%s]and%s') | ||
if hasBreak or hasComma or hasAnd then | |||
return likelyPlural | |||
end | |||
return singular | |||
end | end | ||
Line 81: | Line 95: | ||
local singularForm = args[3] or args.singular or "" | local singularForm = args[3] or args.singular or "" | ||
local pluralForm = args[4] or args.plural or "" | local pluralForm = args[4] or args.plural or "" | ||
local likelyForm = args.likely or pluralForm | |||
local link = args[5] or args.link | local link = args[5] or args.link | ||
if link then | if link then | ||
Line 86: | Line 101: | ||
singularForm = '[['..link..'|'..singularForm..']]' | singularForm = '[['..link..'|'..singularForm..']]' | ||
pluralForm = '[['..link..'|'..pluralForm..']]' | pluralForm = '[['..link..'|'..pluralForm..']]' | ||
likelyForm = '[['..link..'|'..likelyForm..']]' | |||
end | end | ||
if args[2] then | if args[2] then | ||
Line 94: | Line 110: | ||
return "" -- return blank on complete failure | return "" -- return blank on complete failure | ||
end | end | ||
return detect | if detect == singular then | ||
return singularForm | |||
elseif detect == likelyPlural then | |||
return likelyForm | |||
else | |||
return pluralForm | |||
end | |||
end | end | ||
Line 104: | Line 126: | ||
return 1 | return 1 | ||
end | end | ||
return result and 1 or "" | return result == singular and 1 or "" | ||
end | end | ||