Module:Engvar Explained

-- This module implements Template:Engvar.-- Template:Engvar is to be build into the template (like an infobox), with default & variant spellings defined.-- That template should also allow parameter '|engvar=' for the editor (article page).-- The module/template Engvar then returns the spelling variant as is set in that article (for example '|engvar=en-GB').-- The defaultWord is returned, unless the engvar input hits on a defined (en-XX) variant word.local p = local getArgs = require('Module:Arguments').getArgslocal yesno = require('Module:Yesno')local gsub = string.gsublocal lower = string.lowerlocal upper = string.upper

function p.variants(frame) local args = getArgs(frame) return p._variants(args)end

local function fallback(args, useLang) local cwealthLangs = if (useLang

'en-IUPAC' or useLang

'en-OED') and (args['en-OED'] or args['en-CA']) then return args['en-OED'] or args['en-CA'] elseif useLang

'en-CA' and (args['en-OED'] or args['en-US']) then return args['en-OED'] or args['en-US'] elseif cwealthLangs[useLang] and args['en-GB'] then return args['en-GB'] end return args.defaultWord or end

function p._variants(args) local returnWord = nil local auto = false local defaultWord = args.defaultWord or local engvar = args.engvar

if (lower(engvar or )

'auto') then engvar = require('Module:Engvar/detect').detect auto = true end

if engvar

nil then -- Nothing to look for; use defaultWord right away returnWord = defaultWord elseif args.defaultLang

gsub(lower(engvar), '^en%-(%w%w)$', formatISO) then -- By the defaultLang, the defaultWord is asked returnWord = defaultWord else returnWord = args[gsub(lower(engvar), '^en%-(%w%w)$', formatISO)] end

if returnWord

nil then -- No hit so far. Search by words in the engvar entered, checking the list local useLang = engvarLang(engvar) if useLang

nil then returnWord = defaultWord .. addMaintCat(args) elseif args[useLang] then returnWord = args[useLang] elseif yesno(args.fallback or auto, auto) then --default to fallback if auto, otherwise default to no fallback returnWord = fallback(args, useLang) else returnWord = defaultWord end end

return returnWordend

-- Returns arguments and intermediate result. Plus the template result, in front.function p.explain(frame) local args = getArgs(frame) local ret = local engvar = args.engvar or table.insert(ret, '\n\n: Settings:') table.insert(ret, 'defaultWord=' .. (args.defaultWord or ) .. '; ') table.insert(ret, 'defaultLang=' .. (args.defaultLang or ) .. '; ') table.insert(ret, 'engvarCat=' .. (args.engvarCat or '[default:yes]') .. '; ') table.insert(ret, 'engvarCatSort=' .. (args.engvarCatSort or )) table.insert(ret, 'fallback=' .. (args.fallback or )) table.insert(ret, '\n\n: engvar=' .. engvar .. ' [input] ') if (lower(engvar)

'auto') then engvar = require('Module:Engvar/detect').detect or table.insert(ret, 'engvar=' .. engvar .. ' [detected] ') end local useLang = engvarLang(engvar) table.insert(ret, ' => Engvar code [used]: >' .. (useLang or ) .. '<.') for k, v in pairs(args) do if k

'en-UK' then table.insert(ret, k .. ' ? better: use "en-GB"; ') elseif k

'en-SA' then table.insert(ret, k .. ' ? misleading; use "en-ZA"; ') end if k

'defaultWord' then elseif k

'defaultLang' then elseif k

'engvar' then elseif k

'engvarcat' then elseif k

gsub(lower(k), '^en%-(%w%w)$', formatISO) then table.insert(ret, k .. '=' .. v .. '; ') else table.insert(ret, k .. ' [not standard:]=' .. v .. '; ') end

end return engvar .. ' => ' .. p._variants(args) .. table.concat(ret, ' ')end

-- Turn a match into pattern 'en-XX'function formatISO(country) return ('en-' .. upper(country) or )end

function engvarLang(searchEngvar)-- Search verbose language identifiers to ISO-format 'en-XX'-- Assumed: not a blank string to search local match = string.match local langs = ; searchEngvar = gsub(searchEngvar, '^%s*en%-(.*)', '%1') -- rm any opening 'en-'. searchEngvar = gsub(lower(searchEngvar), '[%s%(%)%-]', ) -- To lc, remove all:, ws, hyphen. --normalize language codes so we don't trigger the maintenence category on valid codes local useLang = langs[searchEngvar] if useLang then return 'en-'..useLang --Special codes elseif match(searchEngvar, 'oxford') then useLang = 'OED' -- 'oxford' to catch before anyting 'british' elseif match(searchEngvar, 'iupac') then useLang = 'IUPAC' -- chemistry -- Very often used elseif match(searchEngvar, 'british') then useLang = 'GB' elseif match(searchEngvar, 'unitedstates') or match(searchEngvar, 'american') then useLang = 'US' elseif match(searchEngvar, 'australia') then useLang = 'AU' -- Often used elseif match(searchEngvar, 'india') then useLang = 'IN' elseif match(searchEngvar, 'newzealand') then useLang = 'NZ' elseif match(searchEngvar, 'southafrica') then -- not: SA useLang = 'ZA' elseif match(searchEngvar, 'canad') then --'canada' or 'canadian' useLang = 'CA' elseif match(searchEngvar, 'hiberno') or match(searchEngvar, 'ireland') or match(searchEngvar, 'irish') then useLang = 'EI' elseif match(searchEngvar, 'hongkong') then useLang = 'HK' -- Less often used elseif match(searchEngvar, 'jamaica') then useLang = 'JM' elseif match(searchEngvar, 'malawi') then useLang = 'MW' elseif match(searchEngvar, 'nigeria') then useLang = 'NG' elseif match(searchEngvar, 'pakistan') then useLang = 'PK' elseif match(searchEngvar, 'philippine') then useLang = 'PH' elseif match(searchEngvar, 'scotland') or match(searchEngvar, 'scottish') then useLang = 'SCO' -- Has no alpha-2 code; not 'scotch' elseif match(searchEngvar, 'singapore') then useLang = 'SG' elseif match(searchEngvar, 'trinidad') or match(searchEngvar, 'tobago') then useLang = 'TT' end return useLang and 'en-'..useLangend

function addMaintCat(args) local catMaintenance if args.engvarCat ~= 'no' then local title = mw.title.getCurrentTitle if title:inNamespaces(0) then -- 0=main, 10=templ, 828=module if args.engvarCatSort then catMaintenance = '|' .. args.engvarCatSort .. ', ' .. title.text end catMaintenance = '' end end return catMaintenance or end

return p