Jump to content

Module:Engvar

Permanently protected module
From Wikipedia, the free encyclopedia

-- 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').getArgs
local yesno = require('Module:Yesno')
local gsub = string.gsub
local lower = string.lower
local upper = string.upper

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

local function fallback(args, useLang)
	local cwealthLangs = { ['en-OED'] = 1, ['en-IUPAC'] = 1,
		['en-AU'] = 1, ['en-CA'] = 1, ['en-EI'] = 1, ['en-HK'] = 1,
		['en-IN'] = 1, ['en-JM'] = 1, ['en-NZ'] = 1, ['en-PK'] = 1,
		['en-SCO'] = 1,	['en-SG'] = 1, ['en-ZA'] = 1 }
	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 returnWord
end

-- 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 = {
		us = 'US', usa = 'US',
		au = 'AU', aus = 'AU',
		gb = 'GB', gbr = 'GB', uk = 'GB',
		ca = 'CA', can = 'CA',
		ei = 'EI', irl = 'EI',
		hk = 'HK', hkg = 'HK',
		['in'] = 'IN', ind = 'IN', --'in' is a reserved keyword and needs to be in quotes
		jm = 'JM', jam = 'JM',
		mw = 'MW', mwi = 'MW',
		nz = 'NZ', nzl = 'NZ',
		ng = 'NG', nga = 'NG',
		pk = 'PK', pak = 'PK',
		ph = 'PH', phl = 'PH',
		sco = 'SCO',
		sg = 'SG', sgp = 'SG',
		za = 'ZA', zaf = 'ZA',
		tt = 'TT', tto = 'TT',
		oed = 'OED'};
	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-'..useLang
end

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 = '[[Category:Articles using an unknown Template:Engvar option' .. (catMaintenance or '') .. ']]'
		end
	end
	return catMaintenance or ''
end

return p
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy