Module:rad-pronunciation

Revision as of 20:35, 6 August 2024 by TheNightAvl (talk | contribs)

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]
                
                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"}})
]]