Module:A or an
Documentation for this module may be created at Module:A or an/doc
local p = {} local getArgs = require('Module:Arguments').getArgs local words = require('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à-æè-ïò-öø-üāăąēĕėęěĩīĭįıijōŏőœũūŭůűų' local ucVvChars = 'AEFHILMNORSXÀ-ÆÈ-ÏÒ-ÖØĀĂĄĒĔĖĘĚĨĪĬĮıIJŌŎŐŒÑĤĦĹĻĽĿŁŃŅŇŊŔŖŘŚŜŞ' local function findWord(s, t) for i, v in ipairs(t) do if match(s, '^' .. v .. '$') then return true end end end function p._main(args) local s = args[1] local pron = 'a' local ret = '' if s and s ~= '' then s = gsub(s, '<%/?[A-Za-z]+[^>]*>', '') -- Remove HTML tags s = gsub(s, '%[%[[^%|]+%|(.-)%]%]', '%1') -- Remove wikilinks s = gsub(gsub(s, '%[%[', ''), '%]%]', '') s = gsub(s, '^["%$\'%(<%[%{¢-¥₠-B]+', '') -- 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 .. ' ' .. args[1] end return ret end function p.main(frame) local args = getArgs(frame) return p._main(args) end return p