Module:rad-IPA: Difference between revisions
Jump to navigation
Jump to search
TheNightAvl (talk | contribs) mNo edit summary |
TheNightAvl (talk | contribs) mNo edit summary |
||
Line 1: | Line 1: | ||
local export = {} | local export = {} | ||
function export.main(frame) | |||
local args = getArgs(frame) | |||
local | return export.generate(args) | ||
end | |||
local data = { | local data = { | ||
Line 120: | Line 118: | ||
end | end | ||
-- BEGIN BASE GENERATION -- | -- BEGIN BASE GENERATION -- | ||
function | function generate_IPA(s) | ||
local s_len = | local s_len = utf8.len(s) | ||
IPA = {} | IPA = {} | ||
local split_s = {} | local split_s = {} | ||
for i = 1, s_len do | for i = 1, s_len do | ||
split_s[i] = | split_s[i] = string.sub(s, i,i) | ||
end | end | ||
if s_len == 0 then | if s_len == 0 then | ||
error("Empty input.") | error("Empty input.") | ||
end | end | ||
while s_len > 0 do | while s_len > 0 do | ||
local getData = {} | local getData = {} | ||
local multiMatch = false | local multiMatch = false | ||
local i_iteration = -2 | local i_iteration = -2 | ||
print("\n=========================\n\nCURRENT TEST STRING: <".. s:upper() .. ">") | |||
if s_len < 3 then | if s_len < 3 then | ||
i_iteration = 1 - s_len | i_iteration = 1 - s_len | ||
end | end | ||
for i = i_iteration, 0 do | for i = i_iteration, 0 do | ||
print("————— <" .. split_s[s_len + i] .. "> selected. (i = " .. i .. ") —————") | |||
getData = data[split_s[s_len + i]] | getData = data[split_s[s_len + i]] | ||
local deadEnd = false | local deadEnd = false | ||
if data[split_s[s_len + i]] == nil then | if data[split_s[s_len + i]] == nil then | ||
error("'" .. split_s[s_len + i] .. "' is an invalid character.") | error("'" .. split_s[s_len + i] .. "' is an invalid character.") | ||
end | end | ||
while type(getData) == "table" do | while type(getData) == "table" do | ||
if i == 0 then | if i == 0 then | ||
if getData[false] then | if getData[false] then | ||
print("Singular index recognised.") | |||
getData = getData[false] | getData = getData[false] | ||
print("Index acquired: " .. getData) | |||
else | else | ||
error(split_s[s_len] .. " is an invalid character.") | error(split_s[s_len] .. " is an invalid character.") | ||
end | end | ||
else | else | ||
print("Tabular index recognised.") | |||
for j = 1, 0 - i do | for j = 1, 0 - i do | ||
-- DEBUG PRINT ONLY | -- DEBUG PRINT ONLY | ||
Line 160: | Line 171: | ||
end | end | ||
-- END OF DEBUG PRINT | -- END OF DEBUG PRINT | ||
print("Testing " .. currentCombo) | |||
if getData[split_s[s_len + i + j]] then | if getData[split_s[s_len + i + j]] then | ||
getData = getData[split_s[s_len + i + j]] | getData = getData[split_s[s_len + i + j]] | ||
print("Combination recognised: " .. currentCombo .. " (j = " .. j .. ")") | |||
if type(getData) == "string" then | if type(getData) == "string" then | ||
if j + i == 0 then | if j + i == 0 then | ||
print("Index acquired: " .. getData) | |||
multiMatch = true | multiMatch = true | ||
break | break | ||
else | else | ||
print('Non-final index: dead end.') | |||
getData = {} | getData = {} | ||
deadEnd = true | deadEnd = true | ||
break | break | ||
end | end | ||
elseif j + i == 0 and getData[false] then | elseif j + i == 0 and getData[false] then | ||
getData = getData[false] | getData = getData[false] | ||
print("Index acquired: " .. getData) | |||
multiMatch = true | multiMatch = true | ||
break | break | ||
Line 178: | Line 196: | ||
error("data[" .. table.concat(getData, "][") .. "][false] is missing." ) | error("data[" .. table.concat(getData, "][") .. "][false] is missing." ) | ||
else | else | ||
print("Target still tabular: reiterating.") | |||
end | end | ||
else | else | ||
print('Dead end.') | |||
getData = {} | getData = {} | ||
deadEnd = true | deadEnd = true | ||
Line 189: | Line 209: | ||
end | end | ||
if type(getData) == "string" and (i == 0 or multiMatch == true) then | if type(getData) == "string" and (i == 0 or multiMatch == true) then | ||
print("Target acquired of length " .. 1 - i .. ", converting to [" .. getData .. "].") | |||
append_IPA(getData) | append_IPA(getData) | ||
s = | s = string.sub(s, 1, s_len + i - 1) | ||
s_len = | s_len = string.len(s) | ||
break | break | ||
elseif deadEnd == false then | elseif deadEnd == false then | ||
print('Non-final index: dead end.') | |||
end | end | ||
end | end | ||
end | end | ||
print('\n————— STRING EXHAUSTED —————') | |||
return table.concat(IPA) | return table.concat(IPA) | ||
-- END OF BASE GENERATION -- | -- END OF BASE GENERATION -- | ||
end | end | ||
function export.generate(frame) | function export.generate(frame) | ||
local args = | local args = frame:getParent().args | ||
return export.generate_IPA | return export.generate_IPA(args[1]) | ||
end | end | ||
return export | return export |
Revision as of 16:26, 17 August 2023
See {{rad-IPA}}
.
local export = {}
function export.main(frame)
local args = getArgs(frame)
return export.generate(args)
end
local data = {
["a"] = {
["i"] = "ai",
["o"] = {
["i"] = "ɔi",
[false] = "ɔː",
},
["u"] = "au",
[false] = "a",
},
["á"] = "aː",
["ả"] = "aːː",
["â"] = "ɤ",
["âi"] = "ɤi",
["b"] = "b",
["c"] = "ts",
["d"] = {
["x"] = "dʒ",
["z"] = "dz",
[false] = "d",
},
["ð"] = "ð",
["e"] = {
["a"] = "æː",
["i"] = "ei",
[false] = "ɛ",
},
["f"] = "f",
["g"] = "ɡ",
["h"] = "h",
["ħ"] = "ɣ",
["i"] = {
["e"] = {
["a"] = "ia",
[false] = "ie",
},
[false] = "i",
},
["í"] = "iː",
["ỉ"] = {
["e"] = "iːe",
[false] = "iːː",
},
["j"] = "j",
["ĵ"] = "ĵ",
["k"] = "k",
["ķ"] = "tʃ",
["l"] = "l",
["m"] = "m",
["n"] = "n",
["ņ"] = "ŋ",
["o"] = {
["a"] = "ɔa",
[false] = "ɔ",
},
["ø"] = {
["a"] = "œa",
["i"] = "ei",
[false] = "œ",
},
["p"] = "p",
["q"] = "k",
["r"] = "r",
["s"] = "s",
["ș"] = "ʃ",
["t"] = "t",
["u"] = {
["i"] = "ɤi",
["o"] = {
["a"] = "ua",
[false] = "uo",
},
[false] = "u",
},
["û"] = "ɤ",
["ú"] = "uː",
["ủ"] = {
["o"] = "uːo",
[false] = "uːː",
},
["ū"] = "ū",
["v"] = "v",
["w"] = "w",
["x"] = "ʒ",
["ỳ"] = "ỳ",
["z"] = "z",
["þ"] = "θ",
["·"] = "·",
[" "] = " ",
["."] = "|",
}
data["à"] = data["a"]
data["è"] = data["e"]
data["ì"] = data["i"]
data["ò"] = data["o"]
data["y"] = data["i"]
data["ý"] = data["í"]
data["ỷ"] = data["ỉ"]
data[","] = data["."]
data["!"] = data["."]
data["?"] = data["."]
IPA = {}
function append_IPA (working_IPA)
local IPA_size = #IPA --This variable needs to be set before the function or it breaks.
if IPA_size > 0 then
for i=1, IPA_size do
IPA[IPA_size - i + 2] = IPA[IPA_size - i + 1]
end
end
IPA[1] = working_IPA
end
-- BEGIN BASE GENERATION --
function generate_IPA(s)
local s_len = utf8.len(s)
IPA = {}
local split_s = {}
for i = 1, s_len do
split_s[i] = string.sub(s, i,i)
end
if s_len == 0 then
error("Empty input.")
end
while s_len > 0 do
local getData = {}
local multiMatch = false
local i_iteration = -2
print("\n=========================\n\nCURRENT TEST STRING: <".. s:upper() .. ">")
if s_len < 3 then
i_iteration = 1 - s_len
end
for i = i_iteration, 0 do
print("————— <" .. split_s[s_len + i] .. "> selected. (i = " .. i .. ") —————")
getData = data[split_s[s_len + i]]
local deadEnd = false
if data[split_s[s_len + i]] == nil then
error("'" .. split_s[s_len + i] .. "' is an invalid character.")
end
while type(getData) == "table" do
if i == 0 then
if getData[false] then
print("Singular index recognised.")
getData = getData[false]
print("Index acquired: " .. getData)
else
error(split_s[s_len] .. " is an invalid character.")
end
else
print("Tabular index recognised.")
for j = 1, 0 - i do
-- DEBUG PRINT ONLY
local currentCombo = ""
if i == -2 and j == 2 then
currentCombo = split_s[s_len + i + j - 2] .. " + " .. split_s[s_len + i + j - 1] .. " + " .. split_s[s_len + i + j]
else
currentCombo = split_s[s_len + i + j - 1] .. " + " .. split_s[s_len + i + j]
end
-- END OF DEBUG PRINT
print("Testing " .. currentCombo)
if getData[split_s[s_len + i + j]] then
getData = getData[split_s[s_len + i + j]]
print("Combination recognised: " .. currentCombo .. " (j = " .. j .. ")")
if type(getData) == "string" then
if j + i == 0 then
print("Index acquired: " .. getData)
multiMatch = true
break
else
print('Non-final index: dead end.')
getData = {}
deadEnd = true
break
end
elseif j + i == 0 and getData[false] then
getData = getData[false]
print("Index acquired: " .. getData)
multiMatch = true
break
elseif j + i == 0 and not getData[false] then
error("data[" .. table.concat(getData, "][") .. "][false] is missing." )
else
print("Target still tabular: reiterating.")
end
else
print('Dead end.')
getData = {}
deadEnd = true
break
end
end
if type(getData) == "table" then break end
end
end
if type(getData) == "string" and (i == 0 or multiMatch == true) then
print("Target acquired of length " .. 1 - i .. ", converting to [" .. getData .. "].")
append_IPA(getData)
s = string.sub(s, 1, s_len + i - 1)
s_len = string.len(s)
break
elseif deadEnd == false then
print('Non-final index: dead end.')
end
end
end
print('\n————— STRING EXHAUSTED —————')
return table.concat(IPA)
-- END OF BASE GENERATION --
end
function export.generate(frame)
local args = frame:getParent().args
return export.generate_IPA(args[1])
end
return export