227 lines
7.6 KiB
Lua
227 lines
7.6 KiB
Lua
--functions
|
|
function PrintPosition(string)
|
|
local print_text = ""
|
|
for i = 1, string.len(string) do
|
|
while i >= 10 do i = i - 10 end
|
|
print_text = print_text .. tostring(i)
|
|
end
|
|
print("pos: " .. print_text)
|
|
print_text = ""
|
|
for i = 1, string.len(string) do
|
|
i = math.floor(i/10)
|
|
while i >= 10 do i = i - 10 end
|
|
if i == 0 then i = " " end
|
|
print_text = print_text .. tostring(i)
|
|
end
|
|
print(" " ..print_text)
|
|
end
|
|
|
|
-- DATA
|
|
-- vowels
|
|
vowel_table = {"a","e","i","o","u"}
|
|
symbol_vowel = {"","","","",""}
|
|
symbol_extending_vowel = {"","","","",""}
|
|
-- consonants
|
|
consonant_table = {"g","sh","r","ny","ch","n","y","f","t","k","w","l","p","b","d","h"}
|
|
symbol_consonant = {"","","","","","","","","","","","","","","",""}
|
|
symbol_extending_consonant = {"","","","","","","","","","","","","","","",""}
|
|
-- composites
|
|
composing_consonant_table = {"g","sh","r","ny","ch","m","y","f","t","k","w","l","p","b","d","h"}
|
|
symbol_composite = {
|
|
{"","","","","","","","","","","","","","","",""},
|
|
{"","","","","","","","","","","","","","","",""},
|
|
{"","","","","","","","","","","","","","","",""},
|
|
{"","","","","","","","","","","","","","","",""},
|
|
{"","","","","","","","","","","","","","","",""}
|
|
}
|
|
|
|
-- program start
|
|
function convertToHeonian(text, ...)
|
|
local step = true -- this is set to false when a conclusion has been reached
|
|
local transcribed = false
|
|
local transcribed_text = ""
|
|
|
|
-- verbose?
|
|
local debug = false
|
|
|
|
for _, v in pairs(arg) do
|
|
if v == "-v"
|
|
or v == "--verbose"
|
|
then
|
|
debug = true
|
|
end
|
|
end
|
|
|
|
-- we check if it's necessary to check anything at all
|
|
if text == "" then
|
|
step = false
|
|
end
|
|
|
|
-- prepare text
|
|
if step ~= false then
|
|
-- 1. add syllable marker at start if it isn't already present.
|
|
if string.sub(text,1,1) ~= "." then text = "." .. text end
|
|
-- 2. turn [x] into [ksh]
|
|
text = string.gsub(text,"x","ksh")
|
|
-- 3. turn [z] into [dsh]
|
|
text = string.gsub(text,"z","d.sh")
|
|
end
|
|
|
|
-- read input and transcribe
|
|
if step == true then
|
|
|
|
-- debug log
|
|
if debug then print("") end
|
|
if debug then print("src: ".. text) end
|
|
if debug then PrintPosition(text) end
|
|
|
|
-- sort through all the letters
|
|
local i = 1
|
|
while i < string.len(text)+1 do
|
|
-- know current pos
|
|
local char_step = true -- this is false when a conclusion has been reached
|
|
local pos = i
|
|
local debug_s = ""
|
|
local new_syllable = false
|
|
|
|
if string.sub(text,i,i) == " "
|
|
or string.sub(text,i,i) == "\t"
|
|
or string.sub(text,i,i) == "-" then
|
|
-- adjust i
|
|
i = i + 1
|
|
pos = i
|
|
char_step = false
|
|
end
|
|
-- init checkup
|
|
if string.sub(text,i,i) == "." then
|
|
-- debug log
|
|
if debug then print("") end
|
|
if debug then print(" @[".. tostring(i).."]"..debug_s.." new syllable MARKER found") end
|
|
-- start syllable
|
|
new_syllable = true
|
|
debug_s = ""
|
|
-- adjust i
|
|
i = i + 1
|
|
-- debug log
|
|
if debug then print(" >>> adjusting by (1) from [".. pos .. "] to [".. i .. "]" ) end
|
|
-- adjust pos
|
|
pos = i
|
|
end
|
|
|
|
-- debug log
|
|
if debug then print("") end
|
|
if debug then print(" @[".. tostring(i).."]"..debug_s.." checking string: ".. string.sub(text,i,i)) end
|
|
|
|
-- lets check if it is a composite
|
|
if char_step == true then
|
|
local cons_id = 0
|
|
local length = 0
|
|
-- check if its valid consonant for a composite
|
|
for _, consonant in pairs(composing_consonant_table) do
|
|
cons_id = cons_id + 1
|
|
-- get consonant length its checking against, so we can properly compare.
|
|
length = string.len(consonant)
|
|
-- debug log
|
|
--if debug then print(" checking composite consonant: " .. composing_consonant_table[cons_id]) end
|
|
if string.sub(text,i,i+length-1) == consonant then
|
|
-- debug log
|
|
if debug then print(" (!) valid consonant: " .. composing_consonant_table[cons_id]) end
|
|
-- check if its a valid vowel AFTER the valid consonant, while sorting through all vowels
|
|
local vowel_id = 0
|
|
for _, vowel in pairs(vowel_table) do
|
|
vowel_id = vowel_id + 1
|
|
--if debug then print(" checking composite: " .. composing_consonant_table[cons_id]..vowel_table[vowel_id]) end
|
|
if string.sub(text,i+length,i+length) == vowel then
|
|
-- adjust by consonant length + vowel
|
|
i = i + string.len(consonant) + 1
|
|
-- debug log
|
|
if debug then print(" (!) valid composite: " .. consonant .. vowel ..", length: "..length+1) end
|
|
if debug then print(" >>> adjusting by (" .. tostring(length+1) .. ") from [".. pos .. "] to [".. i .. "]" ) end
|
|
-- transcribe; conclude;
|
|
transcribed_text = transcribed_text .. symbol_composite[vowel_id][cons_id]
|
|
char_step = false
|
|
break
|
|
end
|
|
end
|
|
-- no need to check for more consonants if one is valid
|
|
break
|
|
end
|
|
end
|
|
if debug then if char_step ~= false then print(" [!] invalid composite") end end
|
|
end
|
|
|
|
-- lets check if it is a non composite vowel
|
|
if char_step == true then
|
|
local id = 0
|
|
local length = 0
|
|
for _, vowel in pairs(vowel_table) do
|
|
id = id+ 1
|
|
-- get vowel length its checking against, so we can properly compare.
|
|
length = string.len(vowel)
|
|
-- debug log
|
|
--if debug then print(" checking standalone vowel: " .. vowel_table[id]) end
|
|
if string.sub(text,i,i+length-1) == vowel then
|
|
i = i + string.len(vowel)
|
|
-- debug log
|
|
if debug then print(" (!) valid vowel: " .. vowel_table[id]) end
|
|
if debug then print(" >>> adjusting by (" .. tostring(length) .. ") from [".. pos .. "] to [".. i .. "]" ) end
|
|
-- transcribe; conclude;
|
|
local table = nil
|
|
if new_syllable then
|
|
table = symbol_vowel
|
|
else
|
|
table = symbol_extending_vowel
|
|
end
|
|
transcribed_text = transcribed_text .. table[id]
|
|
char_step = false
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
-- lets check if it is a non composite consonant
|
|
if char_step == true then
|
|
local id = 0
|
|
local length = 0
|
|
for _, consonant in pairs(consonant_table) do
|
|
id = id+ 1
|
|
-- get consonant length its checking against, so we can properly compare.
|
|
length = string.len(consonant)
|
|
-- debug log
|
|
--if debug then print(" checking standalone consonant: " .. consonant_table[id]) end
|
|
if string.sub(text,i,i+length-1) == consonant then
|
|
i = i + string.len(consonant)
|
|
-- debug log
|
|
if debug then print(" (!) valid consonant: " .. consonant_table[id]) end
|
|
if debug then print(" >>> adjusting by (" .. tostring(length) .. ") from [".. pos .. "] to [".. i .. "]" ) end
|
|
-- transcribe; conclude;
|
|
local table = nil
|
|
if new_syllable then
|
|
table = symbol_consonant
|
|
else
|
|
table = symbol_extending_consonant
|
|
end
|
|
transcribed_text = transcribed_text .. table[id]
|
|
char_step = false
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
-- if no idea, move on
|
|
if char_step == true then
|
|
-- debug log
|
|
if debug then print(" [!] no idea; moving on to next [".. pos + 1 .."]") end
|
|
-- no idea
|
|
transcribed_text = transcribed_text .. "?"
|
|
i = i + 1
|
|
-- debug log
|
|
if debug then print(" >>> adjusting by (1) from [".. pos .. "] to [".. i .. "]" ) end
|
|
end
|
|
end
|
|
|
|
-- output
|
|
return transcribed_text
|
|
end
|
|
end |