--functions -- 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","m"} 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 mod_convertToHeonian(text) local step = true -- this is set to false when a conclusion has been reached local transcribed = false local transcribed_text = "" local debug = false local autocopy = false for _, v in pairs(arg) do if v == "-v" or v == "--verbose" then debug = true end if v == "-c" or v == "--copy" then autocopy = true end end -- if its necessary to run the script, then we continue :D if step then -- prepare text -- 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") -- 4. turn [j] into [y] text = string.gsub(text,"j","y") -- read input and transcribe -- 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 local pos = i -- know current pos, since we will be modifying i but still evaluating from the position local char_step = true -- this is false when a conclusion has been reached about what symbol does the next segment correspond to local debug_s = "" -- debug string local new_syllable = false -- this is true when a new syllable begins, and is used to distinguish normal vowels and consonants from trailing ones if i == 1 then new_syllable = true end if string.sub(text,i,i) == "\t" or string.sub(text,i,i) == "-" then -- check if its an unsupported symbol to skip it. -- adjust i i = i + 1 pos = i char_step = false end -- init checkup if string.sub(text,i,i) == "." or string.sub(text,i,i) == "'" or string.sub(text,i,i) == " " or string.sub(text,i,i) == "’" then -- this forces the new syllable, since . is the syllable separator, also skips the symbol and repositions if string.sub(text,i,i) == " " then -- spaces are exception transcribed_text = transcribed_text .. " " new_syllable = true end -- 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 -- debug print positional info -- 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, and just be confused. prints ? 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 .. string.sub(text,i,i) i = i + 1 -- debug log if debug then print(" >>> adjusting by (1) from [".. pos .. "] to [".. i .. "]" ) end end end return transcribed_text end end