Module:A or an

local p = {} local words = mw.loadData('Module:A or an/words')

local find = mw.ustring.find local gsub = mw.ustring.gsub local lower = mw.ustring.lower local match = mw.ustring.match

local lcVChars = 'aeiouà-æè-ïò-öø-üāăąēĕėęěĩīĭįıĳōŏőœũūŭůűų' local ucVvChars = 'AEFHILMNORSXÀ-ÆÈ-ÏÒ-ÖØĀĂĄĒĔĖĘĚĨĪĬĮıĲŌŎŐŒÑĤĦĹĻĽĿŁŃŅŇŊŔŖŘŚŜŞ'

local function findWord(s, t)	for i, v in ipairs(t) do if find(s, '^' .. v .. '$') then return true end end end

function p._main(args) local s = args[1] and mw.text.trim(args[1]) local pron = 'a'	local ret = '' if s and s ~= '' then local origStr = s		s = gsub(s, ']->', '') -- Remove HTML tags s = gsub(s, '%[%[[^%|]+%|(..-)%]%]', '%1') -- Remove wikilinks		s = gsub(gsub(s, '%[%[', ), '%]%]', )		s = gsub(s, '^["%$\'%(<%[%{¢-¥₠-₿]+', '') -- Strip some symbols at the beginning		s = match(s, '^%.?[0-9%u%l]+') or s -- Extract the first word		if find(s, '^[0-9]') then -- It begins with a number			s = match(s, '^[0-9]+') -- Extract the number			if findWord(s, words['vNums']) then -- '18' etc.				pron = 'an'			end		elseif match(s, '^[0-9%u]+$') then -- It looks like an acronym			if find(s, '^[' .. ucVvChars .. ']')				and not findWord(s, words['cvAcronyms']) -- Exclude 'NASA' etc.			then				pron = 'an'			end		else			s = lower(s) -- Uncapitalize			if find(s, '^['.. lcVChars .. ']') then -- It begins with a vowel				if not findWord(s, words['vcWords']) -- Exclude 'euro' etc.					or findWord(s, words['vvWords']) -- But not 'Euler' etc.				then					pron = 'an'				end			elseif args.variety and lower(args.variety) == 'us' -- 'herb' etc.				and findWord(s, words['cvWordsUS'])				or findWord(s, words['cvWords']) -- 'hour' etc.			then				pron = 'an'			end		end		ret = pron .. ' ' .. origStr	end	return ret end

function p.main(frame) return p._main(frame:getParent.args) end

return p