Module:rad-pronunciation: Difference between revisions

From Laenkea
Jump to navigation Jump to search
(Added automatic affix recognition to turn off rhyme display)
No edit summary
 
(56 intermediate revisions by the same user not shown)
Line 1: Line 1:
local export = {}
local export = {}
local getArgs = require('Module:Arguments').getArgs
local getArgs = require("Module:Arguments").getArgs


local m_rad_IPA = require("Module:rad-IPA")
local m_rad_IPA = require("Module:rad-IPA")
Line 6: Line 6:
local m_links = require("Module:links")
local m_links = require("Module:links")
local m_languages = require("Module:languages")
local m_languages = require("Module:languages")
local m_parameters = require("Module:parameters")
local m_rhymes = require("Module:rhymes")
local m_table = require("Module:table")


function table.contains(table, element)
function export.show(frame)
  for _, value in pairs(table) do
    local args = getArgs(frame)
     if value == element then
    local word = mw.title.getCurrentTitle().subpageText
      return true
    local p = 1
 
     if args["entry"] ~= nil then
        word = args["entry"]
     end
     end
  end
  return false
end


function export.show(frame)
    -- All possible "modes":
local args = getArgs(frame)
    local parameter = {["IPA"] = "IPA", ["syllables"] = "syllables", ["homophones"] = "homophones"}
local word = mw.title.getCurrentTitle().subpageText
    local register = {["colloquial"] = "colloquial", ["formal"] = "formal", ["humorous"] = "humorous"}
local p = 1
    local dialect = {["hjádvanþs"] = "hjádvanþs", ["coastal"] = "coastal", ["insular"] = "insular"}
 
if args["entry"] ~= nil then
    -- create data arrays --
word = args["entry"]
    local IPA = {
        ["standard"] = {
            ["plain"] = {}
        }
    }
    for _, r in pairs(register) do
        IPA["standard"][r] = {}
    end
    for _, d in pairs(dialect) do
        IPA[d] = {["plain"] = {}}
        for _, r in pairs(register) do
            IPA[d][r] = {}
        end
    end -- set up IPA
 
    local rhymes = {}
    local syllables = {}
    local homophones = {}
 
    -- get data --
    local IPA_no_auto = false
    local syllables_no_auto = false
    local show_rhymes = true
    local mode = "IPA"
    local mode_dialect = "standard"
    local mode_register = "plain"
    local working_syllables = ""
    local manual_entry = false
   
    -- account for acronyms
    if mw.ustring.find(word, "[A-ZÀÁẢÂÈÌÍỈÒØÙÛÚỦÝỶỲŪ][A-ZÀÁẢÂÈÌÍỈÒØÙÛÚỦÝỶỲŪ]+") then
    syllables_no_auto = true
end
end
-- All possible "modes":
local parameter = {["IPA"] = "IPA", ["syllables"] = "syllables", ["homophones"] = "homophones"}
local register = {["colloquial"] = "colloquial", ["formal"] = "formal", ["humorous"] = "humorous"}
local dialect = {["hjádvanþs"] = "hjádvanþs", ["coastal"] = "coastal", ["insular"] = "insular"}
-- get automations --
local auto_IPA = m_rad_IPA.generate({word})
local auto_IPA_phon = m_rad_IPA.generate({word, "phon"})
local auto_IPA_hj = m_rad_IPA.generate({word, "hj"})
local auto_IPA_phon_hj = m_rad_IPA.generate({word, "hj", "phon"})
local auto_syllables = m_rad_syllables.generate({word})
-- create data arrays --
local IPA = {
["standard"] = {["plain"] = {}, ["colloquial"] = {}, ["formal"] = {}, ["humorous"] = {}, },
["hjádvanþs"] = {["plain"] = {}, ["colloquial"] = {}, ["formal"] = {}, ["humorous"] = {}, },
["coastal"] = {["plain"] = {}, ["colloquial"] = {}, ["formal"] = {}, ["humorous"] = {}, },
["insular"] = {["plain"] = {}, ["colloquial"] = {}, ["formal"] = {}, ["humorous"] = {}, },
}
local rhymes = {}
local syllables = {}
local homophones = {}


    -- turn off rhymes if affix
local function insert_rhyme(input, pos)
    if mw.ustring.find(word, "^[%-·]") or mw.ustring.find(word, "[%-·]$") then
local new_rhyme = m_rad_IPA.get_rhyme(input)
        show_rhymes = false
if not (new_rhyme == nil or table.contains(rhymes, new_rhyme)) then
    end
if pos == nil then
table.insert(rhymes, new_rhyme)
else
table.insert(rhymes, pos, new_rhyme)
end
mw.log("Rhyme registered: " .. new_rhyme)
end
end
-- get data --
local IPA_no_auto = false
local syllables_no_auto = false
local show_rhymes = true
local mode = "IPA"
local mode_dialect = "standard"
local mode_register = "plain"
local working_syllables = ""
-- turn off rhymes if affix
if mw.ustring.find(word, "^[%-·]") or mw.ustring.find(word, "[%-·]$") then
show_rhymes = false
end
local i = 1


while args[i] ~= nil or args[i+1] ~= nil do
    local function insert_rhyme(input, pos)
mw.log("Processing argument " .. i .. ".")
    if show_rhymes then
if parameter[args[i]] ~= nil then -- mode changer
        local function insert_to_rhymes(rhyme)
mode = args[i]
        if not (rhyme == nil or m_table.contains(rhymes, rhyme)) then
mode_dialect = "standard"
            if pos == nil then
mode_register = "plain"
                table.insert(rhymes, rhyme)
elseif dialect[args[i]] ~= nil then
            else
if mode ~= "IPA" then
                table.insert(rhymes, pos, rhyme)
mode = "IPA"
                pos = pos + 1
mode_dialect = "standard"
            end
mode_register = "plain"
        -- mw.log("Rhyme registered: " .. rhyme)
end
        end
mode_dialect = args[i]
        end
mode_register = "plain"
insert_to_rhymes(m_rad_IPA.get_rhyme(input))
elseif register[args[i]] ~= nil then
local weak_rhymes = m_rad_IPA.get_weak_rhyme(input)
if mode ~= "IPA" then
if weak_rhymes ~= nil and type(weak_rhymes) == "table" then
mode = "IPA"
for _, weak_rhyme in ipairs(weak_rhymes) do
mode_dialect = "standard"
insert_to_rhymes(weak_rhyme)
mode_register = "plain"
end
mode_register = args[i]
-- begin adding data to tables --
elseif mode == "IPA" then
if args[i] == "no auto" or args[i] == "noauto" then
IPA_no_auto = true
elseif args[i] ~= nil then
table.insert(IPA[mode_dialect][mode_register], args[i])
mw.log("IPA: added '" .. args[i] .. "' to IPA[" .. mode_dialect .. "][" .. mode_register .. "]")
if mode_dialect == "standard" or mode_dialect == "hjádvanþs" then
local just_phonemic = mw.ustring.match(args[i], "%/(.*)%/")
insert_rhyme(just_phonemic)
end
end
end
elseif mode == "syllables" then
if args[i] == "no auto" or args[i] == "noauto" then
syllables_no_auto = true
elseif args[i] == "" or args[i] == nil then
if mw.ustring.find(working_syllables, "(%|)") then
table.insert(syllables, working_syllables)
mw.log("Syllables: " .. working_syllables .. " registered.")
end
working_syllables = ""
elseif args[i+1] == nil then
working_syllables = working_syllables .. "|" .. args[i]
table.insert(syllables, working_syllables)
mw.log("Syllables: " .. working_syllables .. " registered.")
working_syllables = ""
else
working_syllables = working_syllables .. "|" .. args[i]
end
elseif mode == "homophones" then
if args[i] ~= nil then
table.insert(homophones, args[i])
mw.log("Homophones: " .. args[i] .. " registered.")
end
end
end
end
    end
i = i + 1
 
    local i = 1
end
 
    while args[i] ~= nil or args[i + 1] ~= nil do
i = nil
        -- mw.log("Processing argument " .. i .. ".")
        if parameter[args[i]] ~= nil then -- mode changer
            mode = args[i]
            mode_dialect = "standard"
            mode_register = "plain"
        elseif dialect[args[i]] ~= nil then
            if mode ~= "IPA" then
                mode = "IPA"
                mode_dialect = "standard"
                mode_register = "plain"
            end
            mode_dialect = args[i]
            mode_register = "plain"
        elseif register[args[i]] ~= nil then
            -- begin adding data to tables --
            if mode ~= "IPA" then
                mode = "IPA"
                mode_dialect = "standard"
                mode_register = "plain"
            end
            mode_register = args[i]
        elseif mode == "IPA" then
            if args[i] == "no auto" or args[i] == "noauto" then
                IPA_no_auto = true
            elseif args[i] ~= nil then
                local temp_arg = args[i]
               
                temp_arg = mw.ustring.gsub(temp_arg, "%*%(''(.*)''%)%*", "(%1)")
                local temp_note = mw.ustring.match(temp_arg, "%s*%*?%(.*%)%*?%s*")
                if temp_note then
                temp_arg = mw.ustring.gsub(temp_arg, "%s*%*?%(.*%)%*?%s*", "")
                temp_note = mw.ustring.match(temp_note, "%((.*)%)")
            end
 
                if not mw.ustring.find(temp_arg, "%/(.*)%/") then
                    if mw.ustring.find(temp_arg, "%[(.*)%]") then
                        if mw.ustring.find(temp_arg, "(.*) %[") then
                            temp_arg =
                                "/" ..
                                mw.ustring.match(temp_arg, "(.*) %[") .. "/ " .. mw.ustring.match(temp_arg, "(%[.*%])")
                        else
                            temp_arg = mw.ustring.match(temp_arg, "(%[.*%])")
                        end
                    elseif mw.ustring.find(temp_arg, "^%<(.*)%>$") and mode_dialect == "standard" then
                        temp_arg_match = mw.ustring.match(temp_arg, "^%<(.*)%>$")
                        temp_arg_ipa = m_rad_IPA.generate({temp_arg_match})
                        temp_arg_ipa_phon = m_rad_IPA.generate({temp_arg_match, "phon"})
                        temp_arg_ipa_hj = m_rad_IPA.generate({temp_arg_match, "hj"})
                        temp_arg_ipa_hj_phon = m_rad_IPA.generate({temp_arg_match, "hj", "phon"})
 
                        temp_arg = "/" .. temp_arg_ipa .. "/"
                        if temp_arg_ipa_phon ~= temp_arg_ipa then
                            temp_arg = temp_arg .. " [" .. temp_arg_ipa_phon .. "]"
                        end
                        if temp_arg_ipa_hj ~= temp_arg_ipa then
                            temp_arg_hj = "/" .. temp_arg_ipa_hj .. "/"
                            if temp_arg_ipa_hj_phon ~= temp_arg_hj_ipa then
                                temp_arg_hj = temp_arg_hj .. " [" .. temp_arg_ipa_hj_phon .. "]"
                            end
                            table.insert(IPA["hjádvanþs"][mode_register], temp_arg_hj)
                        end
                    else
                        temp_arg = "/" .. temp_arg .. "/"
                    end
                end


-- add auto values --
if temp_note then
if IPA_no_auto == false then
temp_arg = temp_arg .. " *(''" .. temp_note .. "'')*"
table.insert(IPA["standard"]["plain"], 1, "/" .. auto_IPA .. "/")
insert_rhyme(auto_IPA, 1)
if auto_IPA_phon ~= auto_IPA then
IPA["standard"]["plain"][1] = IPA["standard"]["plain"][1] .. " [" .. auto_IPA_phon .. "]"
end
if auto_IPA_hj ~= auto_IPA then
table.insert(IPA["hjádvanþs"]["plain"], 1, "/" .. auto_IPA_hj .. "/")
insert_rhyme(auto_IPA_hj, 2)
if auto_IPA_phon_hj ~= auto_IPA_hj then
IPA["hjádvanþs"]["plain"][1] = IPA["hjádvanþs"]["plain"][1] .. " [" .. auto_IPA_phon_hj .. "]"
end
end
end
if syllables_no_auto == false and mw.ustring.find(auto_syllables, "(%|)") then
table.insert(syllables, 1, auto_syllables)
end
-- format --
if #IPA["standard"]["plain"] == 0 then
error("Missing IPA input")
end
local args_temp = {}
local accent_temp = {}
args_temp = IPA["standard"]["plain"]
table.insert(args_temp, 1, "rad")
local IPA_show = "* " .. frame:expandTemplate{ title = "IPA", args = args_temp }
for r, _ in pairs(register) do
if #IPA["standard"][r] > 0 then
args_temp = IPA["standard"][r]
table.insert(args_temp, 1, "")
IPA_show = IPA_show .. "\n** (<i>" .. r .. "</i>) " .. frame:expandTemplate{ title = "IPA", args = args_temp }
end
end
if #IPA["hjádvanþs"]["plain"] > 0 then
args_temp = IPA["hjádvanþs"]["plain"]
table.insert(args_temp, 1, "")
IPA_show = IPA_show .. "\n** " .. frame:expandTemplate{ title = "accent", args = { "rad", "hjádvanþs" } } .. " " .. frame:expandTemplate{ title = "IPA", args = args_temp }
end
for r, _ in pairs(register) do
if #IPA["hjádvanþs"][r] > 0 then
args_temp = IPA["hjádvanþs"][r]
table.insert(args_temp, 1, "")
IPA_show = IPA_show .. "\n** " .. frame:expandTemplate{ title = "accent", args = { "rad", "hjádvanþs", r } } .. " " .. frame:expandTemplate{ title = "IPA", args = args_temp }
end
end
dialect["hjádvanþs"] = nil
for d, _ in pairs(dialect) do
if #IPA[d]["plain"] > 0 then
args_temp = IPA[d]["plain"]
table.insert(args_temp, 1, "")
IPA_show = IPA_show .. "\n** " .. frame:expandTemplate{ title = "accent", args = { "rad", d } } .. " " .. frame:expandTemplate{ title = "IPA", args = args_temp }
end
for r, _ in pairs(register) do
if #IPA[d][r] > 0 then
args_temp = IPA[d][r]
table.insert(args_temp, 1, "")
IPA_show = IPA_show .. "\n** " .. frame:expandTemplate{ title = "accent", args = { "rad", d, r } } .. " " .. frame:expandTemplate{ title = "IPA", args = args_temp }
end
end
end
end
                table.insert(IPA[mode_dialect][mode_register], temp_arg)
                -- mw.log("IPA: added '" .. temp_arg .. "' to IPA[" .. mode_dialect .. "][" .. mode_register .. "]")
local homophones_show = ""
                manual_entry = true
 
if #homophones > 0 then
                if mode_dialect == "standard" or mode_dialect == "hjádvanþs" then
homophones_show = "\n* Homophones:"
                    local just_phonemic = mw.ustring.match(temp_arg, "%/(.*)%/")
table.sort(homophones)
                    insert_rhyme(just_phonemic)
for _, item in ipairs(homophones) do
                end
homophones_show = homophones_show .. ", " .. m_links.full_link{ term = item, language = m_languages.get_by_code("rad") }
            end
end
        elseif mode == "syllables" then
homophones_show = mw.ustring.gsub(homophones_show, "(%:%,)", ":")
            if args[i] == "no auto" or args[i] == "noauto" then
end
                syllables_no_auto = true
            elseif args[i] == "" or args[i] == nil then
local rhymes_show = ""
                if mw.ustring.find(working_syllables, "(%|)") then
                    table.insert(syllables, working_syllables)
if #rhymes > 0 and show_rhymes then
                    -- mw.log("Syllables: " .. working_syllables .. " registered.")
rhymes_show = "\n* Rhymes:"
                end
                working_syllables = ""
for num, rhyme in ipairs(rhymes) do
            elseif args[i + 1] == nil then
if num > 1 then
                working_syllables = working_syllables .. "|" .. args[i]
rhymes_show = rhymes_show .. ","
                table.insert(syllables, working_syllables)
end
                -- mw.log("Syllables: " .. working_syllables .. " registered.")
rhymes_show = rhymes_show .. " <span class=\"IPA\">[[:Category:Rhymes:Radestrian/" .. rhyme .. "|-" .. rhyme .. "]]</span>"
                working_syllables = ""
if args["entry"] == nil then
            else
rhymes_show = rhymes_show .. "[[Category:Rhymes:Radestrian/" .. rhyme .. "]]"
                working_syllables = working_syllables .. "|" .. args[i]
end
            end
end
        elseif mode == "homophones" then
end
            if args[i] ~= nil then
                table.insert(homophones, args[i])
local syllables_show = ""
                mw.log("Homophones: " .. args[i] .. " registered.")
            end
local function split_syllables(input)
        end
 
        i = i + 1
    end
 
    -- get automations --
    local auto_IPA = IPA_no_auto == false and m_rad_IPA.generate({word})
    local auto_IPA_phon = IPA_no_auto == false and m_rad_IPA.generate({word, "phon"})
    local auto_IPA_hj = IPA_no_auto == false and m_rad_IPA.generate({word, "hj"})
    local auto_IPA_phon_hj = IPA_no_auto == false and m_rad_IPA.generate({word, "hj", "phon"})
    local auto_syllables = syllables_no_auto == false and m_rad_syllables.generate({word})
 
    -- add auto values --
    if IPA_no_auto == false then
        table.insert(IPA["standard"]["plain"], 1, "/" .. auto_IPA .. "/")
        insert_rhyme(auto_IPA, 1)
 
        if auto_IPA_phon ~= auto_IPA then
            IPA["standard"]["plain"][1] = IPA["standard"]["plain"][1] .. " [" .. auto_IPA_phon .. "]"
        end
 
        if auto_IPA_hj ~= auto_IPA then
            table.insert(IPA["hjádvanþs"]["plain"], 1, "/" .. auto_IPA_hj .. "/")
            insert_rhyme(auto_IPA_hj, 2)
 
            if auto_IPA_phon_hj ~= auto_IPA_hj then
                IPA["hjádvanþs"]["plain"][1] = IPA["hjádvanþs"]["plain"][1] .. " [" .. auto_IPA_phon_hj .. "]"
            end
        end
    end
 
    if syllables_no_auto == false and mw.ustring.find(auto_syllables, "(%|)") then
        table.insert(syllables, 1, auto_syllables)
    end
 
    -- format --
 
    if #IPA["standard"]["plain"] == 0 then
        error("Missing IPA input")
    end
 
    local args_temp = {}
    local accent_temp = {}
 
    args_temp = IPA["standard"]["plain"]
    table.insert(args_temp, 1, "rad")
    local IPA_show = "* " .. frame:expandTemplate {title = "IPA", args = args_temp}
    if manual_entry == true then
        IPA_show = IPA_show .. "[[Category:Radestrian terms with manually entered pronunciation]]"
    end
 
    for r, _ in pairs(register) do
        if #IPA["standard"][r] > 0 then
            args_temp = IPA["standard"][r]
            table.insert(args_temp, 1, "rad")
            args_temp["nopre"] = 1
            IPA_show =
                IPA_show .. "\n** (<i>" .. r .. "</i>) " .. frame:expandTemplate {title = "IPA", args = args_temp}
        end
    end
 
    if #IPA["hjádvanþs"]["plain"] > 0 then
        args_temp = IPA["hjádvanþs"]["plain"]
        table.insert(args_temp, 1, "rad")
        args_temp["nopre"] = 1
        IPA_show =
            IPA_show ..
            "\n** " ..
                frame:expandTemplate {title = "accent", args = {"rad", "hjádvanþs"}} ..
                    " " ..
                        frame:expandTemplate {title = "IPA", args = args_temp} ..
                            "[[Category:Radestrian terms with hjádvanþs dialect pronunciation]]"
    end
    for r, _ in pairs(register) do
        if #IPA["hjádvanþs"][r] > 0 then
            args_temp = IPA["hjádvanþs"][r]
            table.insert(args_temp, 1, "rad")
            args_temp["nopre"] = 1
            IPA_show =
                IPA_show ..
                "\n** " ..
                    frame:expandTemplate {title = "accent", args = {"rad", "hjádvanþs", r}} ..
                        " " ..
                            frame:expandTemplate {title = "IPA", args = args_temp} ..
                                "[[Category:Radestrian terms with hjádvanþs dialect pronunciation]]"
        end
    end
 
    dialect["hjádvanþs"] = nil
 
    for d, _ in pairs(dialect) do
        if #IPA[d]["plain"] > 0 then
            args_temp = IPA[d]["plain"]
            table.insert(args_temp, 1, "rad")
            args_temp["nopre"] = 1
            IPA_show =
                IPA_show ..
                "\n** " ..
                    frame:expandTemplate {title = "accent", args = {"rad", d}} ..
                        " " ..
                            frame:expandTemplate {title = "IPA", args = args_temp} ..
                                "[[Category:Radestrian terms with " .. d .. " dialect pronunciation]]"
        end
 
        for r, _ in pairs(register) do
            if #IPA[d][r] > 0 then
                args_temp = IPA[d][r]
                table.insert(args_temp, 1, "rad")
                args_temp["nopre"] = 1
                IPA_show =
                    IPA_show ..
                    "\n** " ..
                        frame:expandTemplate {title = "accent", args = {"rad", d, r}} ..
                            " " ..
                                frame:expandTemplate {title = "IPA", args = args_temp} ..
                                    "[[Category:Radestrian terms with " .. d .. " dialect pronunciation]]"
            end
        end
    end
 
    if mw.ustring.match(IPA_show, "%>%, ") or mw.ustring.match(IPA_show, "%*.*%*") then
        IPA_show = IPA_show .. "[[Category:Radestrian terms with multiple pronunciations]]"
    end
 
    local homophones_show = ""
 
    if #homophones > 0 then
        homophones_show = "\n* Homophones:"
        table.sort(homophones)
        for _, item in ipairs(homophones) do
            homophones_show =
                homophones_show .. ", " .. m_links.full_link {term = item, language = m_languages.get_by_code("rad")}
        end
        homophones_show = mw.ustring.gsub(homophones_show, "(%:%,)", ":") .. "[[Category:Radestrian homophones]]"
    end
 
    local rhymes_show = ""
 
    if #rhymes > 0 and show_rhymes then
    rhymes_show = "\n* " .. m_rhymes.generate("rad", rhymes)
    end
 
    local syllables_show = ""
 
    local function split_syllables(input)
         local syllables = {}
         local syllables = {}
         for syl in mw.ustring.gmatch(input, "([^%|]+)") do
         for syl in mw.ustring.gmatch(input, "([^%|]+)") do
                table.insert(syllables, syl)
            table.insert(syllables, syl)
         end
         end
         return syllables
         return syllables
end
    end
 
if #syllables > 0 then
    if #syllables > 0 then
syllables_show = "\n* "
        syllables_show = "\n* "
args_temp = { "rad" }
        args_temp = {"rad"}
for set = 1, #syllables do
        for set = 1, #syllables do
if set > 1 then
            if set > 1 then
table.insert(args_temp, "")
                table.insert(args_temp, "")
end
            end
local working_syllables = split_syllables(syllables[set])
            local working_syllables = split_syllables(syllables[set])
for syl = 1, #working_syllables do
            for syl = 1, #working_syllables do
table.insert(args_temp, working_syllables[syl])
                table.insert(args_temp, working_syllables[syl])
end
            end
end
        end
args_temp["delimiter"] = "|"
        args_temp["delimiter"] = ""
 
syllables_show = syllables_show .. frame:expandTemplate{ title = "syllables", args = args_temp }
        syllables_show = syllables_show .. frame:expandTemplate {title = "syllables", args = args_temp}
end
    end
 
return IPA_show .. homophones_show .. rhymes_show .. syllables_show
    local to_Return = IPA_show .. homophones_show .. rhymes_show .. syllables_show
 
    if args["entry"] ~= nil then
        to_Return = mw.ustring.gsub(to_Return, "%[%[Category[^%]]+%]%]", "")
    end
 
    return to_Return
end
end



Latest revision as of 01:03, 19 August 2024

This module automatically formats the Radestrian pronunciation section. To use it, add the {{rad-pr}} template to the section.


local export = {}
local getArgs = require("Module:Arguments").getArgs

local m_rad_IPA = require("Module:rad-IPA")
local m_rad_syllables = require("Module:rad-syllables")
local m_links = require("Module:links")
local m_languages = require("Module:languages")
local m_rhymes = require("Module:rhymes")
local m_table = require("Module:table")

function export.show(frame)
    local args = getArgs(frame)
    local word = mw.title.getCurrentTitle().subpageText
    local p = 1

    if args["entry"] ~= nil then
        word = args["entry"]
    end

    -- All possible "modes":
    local parameter = {["IPA"] = "IPA", ["syllables"] = "syllables", ["homophones"] = "homophones"}
    local register = {["colloquial"] = "colloquial", ["formal"] = "formal", ["humorous"] = "humorous"}
    local dialect = {["hjádvanþs"] = "hjádvanþs", ["coastal"] = "coastal", ["insular"] = "insular"}

    -- create data arrays --
    local IPA = {
        ["standard"] = {
            ["plain"] = {}
        }
    }
    for _, r in pairs(register) do
        IPA["standard"][r] = {}
    end
    for _, d in pairs(dialect) do
        IPA[d] = {["plain"] = {}}
        for _, r in pairs(register) do
            IPA[d][r] = {}
        end
    end -- set up IPA

    local rhymes = {}
    local syllables = {}
    local homophones = {}

    -- get data --
    local IPA_no_auto = false
    local syllables_no_auto = false
    local show_rhymes = true
    local mode = "IPA"
    local mode_dialect = "standard"
    local mode_register = "plain"
    local working_syllables = ""
    local manual_entry = false
    
    -- account for acronyms
    if mw.ustring.find(word, "[A-ZÀÁẢÂÈÌÍỈÒØÙÛÚỦÝỶỲŪ][A-ZÀÁẢÂÈÌÍỈÒØÙÛÚỦÝỶỲŪ]+") then
    	syllables_no_auto = true
	end

    -- turn off rhymes if affix
    if mw.ustring.find(word, "^[%-·]") or mw.ustring.find(word, "[%-·]$") then
        show_rhymes = false
    end

    local function insert_rhyme(input, pos)
    	if show_rhymes then
	        local function insert_to_rhymes(rhyme)
	        	if not (rhyme == nil or m_table.contains(rhymes, rhyme)) then
		            if pos == nil then
		                table.insert(rhymes, rhyme)
		            else
		                table.insert(rhymes, pos, rhyme)
		                pos = pos + 1
		            end
		        -- mw.log("Rhyme registered: " .. rhyme)
		        end	
	        end
			insert_to_rhymes(m_rad_IPA.get_rhyme(input))
			local weak_rhymes = m_rad_IPA.get_weak_rhyme(input)
			if weak_rhymes ~= nil and type(weak_rhymes) == "table" then
				for _, weak_rhyme in ipairs(weak_rhymes) do
					insert_to_rhymes(weak_rhyme)
				end
			end
		end
    end

    local i = 1

    while args[i] ~= nil or args[i + 1] ~= nil do
        -- mw.log("Processing argument " .. i .. ".")
        if parameter[args[i]] ~= nil then -- mode changer
            mode = args[i]
            mode_dialect = "standard"
            mode_register = "plain"
        elseif dialect[args[i]] ~= nil then
            if mode ~= "IPA" then
                mode = "IPA"
                mode_dialect = "standard"
                mode_register = "plain"
            end
            mode_dialect = args[i]
            mode_register = "plain"
        elseif register[args[i]] ~= nil then
            -- begin adding data to tables --
            if mode ~= "IPA" then
                mode = "IPA"
                mode_dialect = "standard"
                mode_register = "plain"
            end
            mode_register = args[i]
        elseif mode == "IPA" then
            if args[i] == "no auto" or args[i] == "noauto" then
                IPA_no_auto = true
            elseif args[i] ~= nil then
                local temp_arg = args[i]
                
                temp_arg = mw.ustring.gsub(temp_arg, "%*%(''(.*)''%)%*", "(%1)")
                local temp_note = mw.ustring.match(temp_arg, "%s*%*?%(.*%)%*?%s*")
                if temp_note then
                	temp_arg = mw.ustring.gsub(temp_arg, "%s*%*?%(.*%)%*?%s*", "")
                	temp_note = mw.ustring.match(temp_note, "%((.*)%)")
            	end

                if not mw.ustring.find(temp_arg, "%/(.*)%/") then
                    if mw.ustring.find(temp_arg, "%[(.*)%]") then
                        if mw.ustring.find(temp_arg, "(.*) %[") then
                            temp_arg =
                                "/" ..
                                mw.ustring.match(temp_arg, "(.*) %[") .. "/ " .. mw.ustring.match(temp_arg, "(%[.*%])")
                        else
                            temp_arg = mw.ustring.match(temp_arg, "(%[.*%])")
                        end
                    elseif mw.ustring.find(temp_arg, "^%<(.*)%>$") and mode_dialect == "standard" then
                        temp_arg_match = mw.ustring.match(temp_arg, "^%<(.*)%>$")
                        temp_arg_ipa = m_rad_IPA.generate({temp_arg_match})
                        temp_arg_ipa_phon = m_rad_IPA.generate({temp_arg_match, "phon"})
                        temp_arg_ipa_hj = m_rad_IPA.generate({temp_arg_match, "hj"})
                        temp_arg_ipa_hj_phon = m_rad_IPA.generate({temp_arg_match, "hj", "phon"})

                        temp_arg = "/" .. temp_arg_ipa .. "/"
                        if temp_arg_ipa_phon ~= temp_arg_ipa then
                            temp_arg = temp_arg .. " [" .. temp_arg_ipa_phon .. "]"
                        end
                        if temp_arg_ipa_hj ~= temp_arg_ipa then
                            temp_arg_hj = "/" .. temp_arg_ipa_hj .. "/"
                            if temp_arg_ipa_hj_phon ~= temp_arg_hj_ipa then
                                temp_arg_hj = temp_arg_hj .. " [" .. temp_arg_ipa_hj_phon .. "]"
                            end
                            table.insert(IPA["hjádvanþs"][mode_register], temp_arg_hj)
                        end
                    else
                        temp_arg = "/" .. temp_arg .. "/"
                    end
                end

				if temp_note then
					temp_arg = temp_arg .. " *(''" .. temp_note .. "'')*"	
				end
				
                table.insert(IPA[mode_dialect][mode_register], temp_arg)
                -- mw.log("IPA: added '" .. temp_arg .. "' to IPA[" .. mode_dialect .. "][" .. mode_register .. "]")
                manual_entry = true

                if mode_dialect == "standard" or mode_dialect == "hjádvanþs" then
                    local just_phonemic = mw.ustring.match(temp_arg, "%/(.*)%/")
                    insert_rhyme(just_phonemic)
                end
            end
        elseif mode == "syllables" then
            if args[i] == "no auto" or args[i] == "noauto" then
                syllables_no_auto = true
            elseif args[i] == "" or args[i] == nil then
                if mw.ustring.find(working_syllables, "(%|)") then
                    table.insert(syllables, working_syllables)
                    -- mw.log("Syllables: " .. working_syllables .. " registered.")
                end
                working_syllables = ""
            elseif args[i + 1] == nil then
                working_syllables = working_syllables .. "|" .. args[i]
                table.insert(syllables, working_syllables)
                -- mw.log("Syllables: " .. working_syllables .. " registered.")
                working_syllables = ""
            else
                working_syllables = working_syllables .. "|" .. args[i]
            end
        elseif mode == "homophones" then
            if args[i] ~= nil then
                table.insert(homophones, args[i])
                mw.log("Homophones: " .. args[i] .. " registered.")
            end
        end

        i = i + 1
    end

    -- get automations --
    local auto_IPA = IPA_no_auto == false and m_rad_IPA.generate({word})
    local auto_IPA_phon = IPA_no_auto == false and m_rad_IPA.generate({word, "phon"})
    local auto_IPA_hj = IPA_no_auto == false and m_rad_IPA.generate({word, "hj"})
    local auto_IPA_phon_hj = IPA_no_auto == false and m_rad_IPA.generate({word, "hj", "phon"})
    local auto_syllables = syllables_no_auto == false and m_rad_syllables.generate({word})

    -- add auto values --
    if IPA_no_auto == false then
        table.insert(IPA["standard"]["plain"], 1, "/" .. auto_IPA .. "/")
        insert_rhyme(auto_IPA, 1)

        if auto_IPA_phon ~= auto_IPA then
            IPA["standard"]["plain"][1] = IPA["standard"]["plain"][1] .. " [" .. auto_IPA_phon .. "]"
        end

        if auto_IPA_hj ~= auto_IPA then
            table.insert(IPA["hjádvanþs"]["plain"], 1, "/" .. auto_IPA_hj .. "/")
            insert_rhyme(auto_IPA_hj, 2)

            if auto_IPA_phon_hj ~= auto_IPA_hj then
                IPA["hjádvanþs"]["plain"][1] = IPA["hjádvanþs"]["plain"][1] .. " [" .. auto_IPA_phon_hj .. "]"
            end
        end
    end

    if syllables_no_auto == false and mw.ustring.find(auto_syllables, "(%|)") then
        table.insert(syllables, 1, auto_syllables)
    end

    -- format --

    if #IPA["standard"]["plain"] == 0 then
        error("Missing IPA input")
    end

    local args_temp = {}
    local accent_temp = {}

    args_temp = IPA["standard"]["plain"]
    table.insert(args_temp, 1, "rad")
    local IPA_show = "* " .. frame:expandTemplate {title = "IPA", args = args_temp}
    if manual_entry == true then
        IPA_show = IPA_show .. "[[Category:Radestrian terms with manually entered pronunciation]]"
    end

    for r, _ in pairs(register) do
        if #IPA["standard"][r] > 0 then
            args_temp = IPA["standard"][r]
            table.insert(args_temp, 1, "rad")
            args_temp["nopre"] = 1
            IPA_show =
                IPA_show .. "\n** (<i>" .. r .. "</i>) " .. frame:expandTemplate {title = "IPA", args = args_temp}
        end
    end

    if #IPA["hjádvanþs"]["plain"] > 0 then
        args_temp = IPA["hjádvanþs"]["plain"]
        table.insert(args_temp, 1, "rad")
        args_temp["nopre"] = 1
        IPA_show =
            IPA_show ..
            "\n** " ..
                frame:expandTemplate {title = "accent", args = {"rad", "hjádvanþs"}} ..
                    " " ..
                        frame:expandTemplate {title = "IPA", args = args_temp} ..
                            "[[Category:Radestrian terms with hjádvanþs dialect pronunciation]]"
    end
    for r, _ in pairs(register) do
        if #IPA["hjádvanþs"][r] > 0 then
            args_temp = IPA["hjádvanþs"][r]
            table.insert(args_temp, 1, "rad")
            args_temp["nopre"] = 1
            IPA_show =
                IPA_show ..
                "\n** " ..
                    frame:expandTemplate {title = "accent", args = {"rad", "hjádvanþs", r}} ..
                        " " ..
                            frame:expandTemplate {title = "IPA", args = args_temp} ..
                                "[[Category:Radestrian terms with hjádvanþs dialect pronunciation]]"
        end
    end

    dialect["hjádvanþs"] = nil

    for d, _ in pairs(dialect) do
        if #IPA[d]["plain"] > 0 then
            args_temp = IPA[d]["plain"]
            table.insert(args_temp, 1, "rad")
            args_temp["nopre"] = 1
            IPA_show =
                IPA_show ..
                "\n** " ..
                    frame:expandTemplate {title = "accent", args = {"rad", d}} ..
                        " " ..
                            frame:expandTemplate {title = "IPA", args = args_temp} ..
                                "[[Category:Radestrian terms with " .. d .. " dialect pronunciation]]"
        end

        for r, _ in pairs(register) do
            if #IPA[d][r] > 0 then
                args_temp = IPA[d][r]
                table.insert(args_temp, 1, "rad")
                args_temp["nopre"] = 1
                IPA_show =
                    IPA_show ..
                    "\n** " ..
                        frame:expandTemplate {title = "accent", args = {"rad", d, r}} ..
                            " " ..
                                frame:expandTemplate {title = "IPA", args = args_temp} ..
                                    "[[Category:Radestrian terms with " .. d .. " dialect pronunciation]]"
            end
        end
    end

    if mw.ustring.match(IPA_show, "%>%, ") or mw.ustring.match(IPA_show, "%*.*%*") then
        IPA_show = IPA_show .. "[[Category:Radestrian terms with multiple pronunciations]]"
    end

    local homophones_show = ""

    if #homophones > 0 then
        homophones_show = "\n* Homophones:"
        table.sort(homophones)
        for _, item in ipairs(homophones) do
            homophones_show =
                homophones_show .. ", " .. m_links.full_link {term = item, language = m_languages.get_by_code("rad")}
        end
        homophones_show = mw.ustring.gsub(homophones_show, "(%:%,)", ":") .. "[[Category:Radestrian homophones]]"
    end

    local rhymes_show = ""

    if #rhymes > 0 and show_rhymes then
    	rhymes_show = "\n* " .. m_rhymes.generate("rad", rhymes)
    end

    local syllables_show = ""

    local function split_syllables(input)
        local syllables = {}
        for syl in mw.ustring.gmatch(input, "([^%|]+)") do
            table.insert(syllables, syl)
        end
        return syllables
    end

    if #syllables > 0 then
        syllables_show = "\n* "
        args_temp = {"rad"}
        for set = 1, #syllables do
            if set > 1 then
                table.insert(args_temp, "")
            end
            local working_syllables = split_syllables(syllables[set])
            for syl = 1, #working_syllables do
                table.insert(args_temp, working_syllables[syl])
            end
        end
        args_temp["delimiter"] = "–"

        syllables_show = syllables_show .. frame:expandTemplate {title = "syllables", args = args_temp}
    end

    local to_Return = IPA_show .. homophones_show .. rhymes_show .. syllables_show

    if args["entry"] ~= nil then
        to_Return = mw.ustring.gsub(to_Return, "%[%[Category[^%]]+%]%]", "")
    end

    return to_Return
end

return export

--[[
Debug console test string:
=p.show(mw.getCurrentFrame():newChild{title="whatever",args={["entry"] = "rjaovs"}})
]]