Difference between revisions of "Module:A or an"

From blackwiki
Jump to navigation Jump to search
blackwiki>Nardog
(mw.loadData)
blackwiki>Nardog
(tweaks)
Line 1: Line 1:
 
local p = {}
 
local p = {}
local getArgs = require('Module:Arguments').getArgs
 
 
local words = mw.loadData('Module:A or an/words')
 
local words = mw.loadData('Module:A or an/words')
  
Line 20: Line 19:
  
 
function p._main(args)
 
function p._main(args)
local s = args[1]
+
local s = args[1] and mw.text.trim(args[1])
 
local pron = 'a'
 
local pron = 'a'
 
local ret = ''
 
local ret = ''
 
 
 
if s and s ~= '' then
 
if s and s ~= '' then
s = gsub(s, '<%/?[A-Za-z]+[^>]*>', '') -- Remove HTML tags
+
local origStr = s
s = gsub(s, '%[%[[^%|]+%|(.-)%]%]', '%1') -- Remove wikilinks
+
 +
s = gsub(s, '</?[A-Za-z][^>]->', '') -- Remove HTML tags
 +
s = gsub(s, '%[%[[^%|]+%|(..-)%]%]', '%1') -- Remove wikilinks
 
s = gsub(gsub(s, '%[%[', ''), '%]%]', '')
 
s = gsub(gsub(s, '%[%[', ''), '%]%]', '')
 
s = gsub(s, '^["%$\'%(<%[%{¢-¥₠-₿]+', '') -- Strip some symbols at the beginning
 
s = gsub(s, '^["%$\'%(<%[%{¢-¥₠-₿]+', '') -- Strip some symbols at the beginning
Line 32: Line 33:
 
 
 
if find(s, '^[0-9]') then -- It begins with a number
 
if find(s, '^[0-9]') then -- It begins with a number
s = match(s, '^[0-9]*') -- Extract the number
+
s = match(s, '^[0-9]+') -- Extract the number
 
if findWord(s, words['vNums']) then -- '18' etc.
 
if findWord(s, words['vNums']) then -- '18' etc.
 
pron = 'an'
 
pron = 'an'
 
end
 
end
elseif match(s, '^[0-9%u]*$') then -- It looks like an acronym
+
elseif match(s, '^[0-9%u]+$') then -- It looks like an acronym
 
if find(s, '^[' .. ucVvChars .. ']')
 
if find(s, '^[' .. ucVvChars .. ']')
 
and not findWord(s, words['cvAcronyms']) -- Exclude 'NASA' etc.
 
and not findWord(s, words['cvAcronyms']) -- Exclude 'NASA' etc.
Line 57: Line 58:
 
end
 
end
 
end
 
end
ret = pron .. ' ' .. args[1]
+
ret = pron .. ' ' .. origStr
 
end
 
end
 
 
Line 64: Line 65:
  
 
function p.main(frame)
 
function p.main(frame)
local args = getArgs(frame)
+
return p._main(frame:getParent().args)
return p._main(args)
 
 
end
 
end
  
 
return p
 
return p

Revision as of 22:37, 30 December 2019

This module implements Template:a or an. Exception words are stored at /words.


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

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, '</?[A-Za-z][^>]->', '') -- 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