বিষয়বস্তুতে চলুন

মডিউল:fo-pron

উইকিঅভিধান, মুক্ত অভিধান থেকে

এই মডিউলের জন্য মডিউল:fo-pron/নথি-এ নথিপত্র তৈরি করা হয়ে থাকতে পারে

local export = {}

local lang = require("Module:languages").getByCode("fo")
local sc = require("Module:scripts").getByCode("Latn")

function export.tag_text(text, face)
	return require("Module:script utilities").tag_text(text, lang, sc, face)
end

function export.link(term, face)
	return require("Module:links").full_link( { term = term, lang = lang, sc = sc }, face )
end

local sub = mw.ustring.sub
local find = mw.ustring.find
local gmatch = mw.ustring.gmatch
local gsub = mw.ustring.gsub

local U = require("Module:string/char")
local voiceless = U(0x325)
local habove = "ʰ"
local long = "ː"
local primary_stress = "ˈ"

local consonants = "bdðfghjklmnprstv"
local consonant = "[" .. consonants .. "]"

local vowels = "aɛeɪiʏyœøɔoʊu"
local vowel = "[" .. vowels .. "]"

data = {
	["consonants"] = {
		["b"] = "p",
		["d"] = "t",
		["dj"] = "tʃ",
		["g"] = "k",
		["gj"] = "tʃ",
		["hj"] = "j",
		["hv"] = "kv",
		["k"] = "kʰ",
		["kj"] = "tʃʰ",
		["ll"] = "tl" .. voiceless,
		["nj"] = "ɲ",
		["ng"] = "ŋk",
		["nk"] = "ŋ̊kʰ",
		["p"] = "pʰ",
		["r"] = "ɹ",
		["sj"] = "ʃ",
		["skj"] = "ʃ",
		["stj"] = "ʃ",
		["t"] = "tʰ",
		["tj"] = "tʃʰ",
		["ð"] = "",
	},
	["short_vowels"] = {
		["a"] = "a",
		["á"] = "ɔ",
		["e"] = "ɛ",
		["i"] = "ɪ",
		["í"] = "ʊi",
		["o"] = "ɔ",
		["ó"] = "œ",
		["u"] = "ʊ",
		["ú"] = "ʏ",
		["y"] = "ɪ",
		["ý"] = "ʊi",
		["æ"] = "a",
		["ø"] = "œ",
		["ei"] = "ai",
		["ey"] = "ɛi",
		["oy"] = "ɔi",
	},
	["long_vowels"] = {
		["a"] = "ɛa" .. long,
		["á"] = "ɔa" .. long,
		["e"] = "e" .. long,
		["i"] = "i" .. long,
		["í"] = "ʊi" .. long,
		["o"] = "o" .. long,
		["ó"] = "ɔu" .. long,
		["u"] = "u" .. long,
		["ú"] = "ʉu" .. long,
		["y"] = "i" .. long,
		["ý"] = "ʊi" .. long,
		["æ"] = "ɛa" .. long,
		["ø"] = "ø" .. long,
		["ei"] = "ai" .. long,
		["ey"] = "ɛi" .. long,
		["oy"] = "ɔi" .. long,
	},
}

-- Aspiration
local asp_letters = {"p", "t", "k", "kj", "tj"}

for _, letter in ipairs(asp_letters) do
	data.consonants[vowel .. letter .. "([aɛeœøɔo])"] = vowel .. habove .. letter .. "([aɛeœøɔo])"
	data.consonants[letter .. letter] = habove .. letter .. long
	data.consonants[letter .. "n"] = habove .. letter .. "n"
	data.consonants["([mnɲŋɹl])" .. letter] = "%1" .. voiceless .. letter
end

-- Glide
local glide_letters = {"ð", "g"}

for _, letter in ipairs(glide_letters) do
	data.long_vowels["([iːʊiːɛiːɔiː])" .. letter .. vowel] = "%1j%2"
	data.long_vowels["([uːɔuːʉuː])" .. letter .. vowel] = "%1w%2"
	data.long_vowels["([ɛaːɔaːeːoːøː])" .. letter .. "ɪ"] =  "%1j%2"
	data.long_vowels["([ɛaːɔaːeːoːøː])" .. letter .. "ʊ"] = "%1v%2"
	data.long_vowels["([ɛaːɔaːeːoːøː])" .. letter .. "a"] = "%1a"
end

rules = {
	[1] = {
		["([lɹ])" .. "([ptkʃfshʂ])"] = "%1" .. voiceless .. "%2",
		["v" .. "([ptkʃfshʂ])"] = "f%2"
	},
	[2] = {
		["[k]" .. "([iːɪeːɛj])"] = "tʃ%2",
		["[kʰ]" .. "([iːɪeːɛj])"] = "tʃʰ%2",
		["[sk]" .. "([iːɪeːɛj])"] = "ʃ%2",
		[vowel .. "i" .. "s" .. consonant] = "%1ʃ%2"
	},
	[3] = {
		["r" .. "d"] = "ɻʈ",
		["r" .. "t"] = "ʂʈ",
		["r" .. "n"] = "tn" .. voiceless,
		["r" .. "l"] = "ɻɭ",
		["r" .. "s"] = "ʂː"
	},
	[4] = {
		["ó" .. "gv"] = "ɛ%2",
		["ú" .. "gv"] = "ɪ%2",
		["ey" .. "ggj"] = "ɛ" .. "tʃː",
		["í" .. "ggj"] = "ʊ" .. "tʃː",
		["ý" .. "ggj"] = "ʊ" .. "tʃː",
		["ei" .. "ggj"] = "a" .. "tʃː",
		["oy" .. "ggj"] = "ɔ" .. "tʃː",
	}
}

function export.toIPA(mode, term, accent)
	if type(term) ~= "string" then
		error('The function "toIPA" requires a string argument.')
	end
	
	local IPA = {}
	
	if accent ~= "off" then
		table.insert(IPA, primary_stress)
	end
	
	local working_string = mw.ustring.lower(term)
	local firstletter = sub(working_string, 1, 1)
	local firsttwoletters = sub(working_string, 1, 2)

	if find(firstletter, consonant) then
		if data.consonants[firsttwoletters] then
			table.insert(IPA, data.consonants[firsttwoletters])
			working_string = sub(working_string, 3)
		elseif data.consonants[firstletter] then
			table.insert(IPA, data.consonants[firstletter])
			working_string = sub(working_string, 2)
		else
			table.insert(IPA, firstletter)
			working_string = sub(working_string, 2)
		end

		while mw.ustring.len(working_string) > 0 do
			local letter = { sub(working_string, 1, 1), sub(working_string, 2, 3) }
			local twoletters = { sub(working_string, 1, 2), sub(working_string, 3, 4) }
			local threeletters = { sub(working_string, 1, 3), sub(working_string, 4, 5) }
		
			if data.short_vowels[letter[1]] then
				if data.long_vowels[letter[1]] and (not data.short_vowels[letter[2]]) and data.short_vowels[letter[3]] then
					table.insert(IPA, data.long_vowels[letter[1]])
				else
					table.insert(IPA, data.short_vowels[letter[1]])
				end
				working_string = sub(working_string, 2)
			else
				table.insert(IPA, letter[1])
				working_string = sub(working_string, 2)
			end
		end
		
		IPA = table.concat(IPA)
		
		for _, set_of_rules in ipairs(rules) do
			for regex, replacement in pairs(set_of_rules) do
				IPA = gsub(IPA, regex, replacement)
			end
		end
	end
	
	IPA = gsub(IPA, "%-", "")
	
	return IPA
end

function export.show(frame)
	local params = {
		[1] = {},
		[2] = {}
	}
	
	local title = mw.title.getCurrentTitle()
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	local term = args[1] or title.text
	local accent = args[2]

	local ipa = export.toIPA(term, accent)
	
	ipa = "[" .. ipa .. "]"
	ipa = require("Module:IPA").format_IPA_full {
		lang = require("Module:languages").getByCode("fo"),
		items = {{ pron = ipa }},
	}

	return ipa
end

return export