Module:qlu-pron: Difference between revisions

no edit summary
No edit summary
No edit summary
 
(35 intermediate revisions by the same user not shown)
Line 27: Line 27:
local function dediacv(str, diacritic)
local function dediacv(str, diacritic)
return gsub(mw.ustring.toNFD(str), diacritic, "")
return gsub(mw.ustring.toNFD(str), diacritic, "")
end
local function laxen(v)
local otc = {}
local switch = {["e"] = "i", ["i"] = "ɪ", ["u"] = "ʊ"}
for vc in gmatch(v, ".") do
if switch[vc] then vc = gsub(vc, vc, switch[vc]) end
table.insert(otc, vc)
end
return table.concat(otc)
end
end


Line 63: Line 52:
{"qu?", "ḱ"}, {"þ", "θ"}, {"v", "β"},
{"qu?", "ḱ"}, {"þ", "θ"}, {"v", "β"},
{"%-", ""},
--{"%-", ""},
}
}


Line 89: Line 78:
local phonetic_rules = {
local phonetic_rules = {
-- Gorgia Toscana
-- Gorgia Toscana
{"(" .. vowels .. "·)p(" .. vowels .. ")", "%1ɸ%2"},
{"(" .. vowels .. "·)p(" .. vowels .. ")", "%1ɸ%2"}, {"p$", "ɸ"},
{"(" .. vowels .. "·)b(" .. vowels .. ")", "%1β%2"},
{"(" .. vowels .. "·)b(" .. vowels .. ")", "%1β%2"}, {"b$", "β"},
{"(" .. vowels .. "·)t(" .. vowels .. ")", "%1θ%2"},
{"(" .. vowels .. "·)t(" .. vowels .. ")", "%1θ%2"}, {"t$", "θ"},
{"(" .. vowels .. "·)d(" .. vowels .. ")", "%1ð%2"},
{"(" .. vowels .. "·)d(" .. vowels .. ")", "%1ð%2"}, {"d$", "ð"},
{"(" .. vowels .. "·)k(" .. vowels .. ")", "%1x%2"},
{"(" .. vowels .. "·)k(" .. vowels .. ")", "%1x%2"}, {"k$", "x"},
{"(" .. vowels .. "·)g(" .. vowels .. ")", "%1ɣ%2"},
{"(" .. vowels .. "·)g(" .. vowels .. ")", "%1ɣ%2"}, {"g$", "ɣ"},
{"I", "i"},
{"I", "i"},
{"^ɸ", "f"}, {"(" .. consonants .. ")([·ˈˌ]?)ɸ", "%1%2f"},
{"^ɸ", "f"}, {"(" .. consonants .. ")([·ˈˌ]?)ɸ", "%1%2f"},
{"^β", "v"}, {"(" .. consonants .. ")([·ˈˌ]?)β", "%1%2v"},
{"^β", "v"}, {"(" .. consonants .. ")([·ˈˌ]?)β", "%1%2v"},
{"ḱ", "kʷ"}, {"ǵ", "ɡʷ"},  
{"ḱ", "kʷ"}, {"ǵ", ""},  
{"k([ieɛj])", "k" .. advanced .. "%1"}, {"g([ieɛj])", "g˖%1"},
{"k([ieɛj])", "k" .. advanced .. "%1"}, {"g([ieɛj])", "g˖%1"},
{"k([oɔu])", "q%1"}, {"g([oɔu])", "ɢ%1"},
{"k([oɔu])", "q%1"}, {"g([oɔu])", "ɢ%1"},
Line 112: Line 101:
-- consonants
-- consonants
{"ʈ", "t"}, {"ʦ", "t͡s"}, {"ʣ", "d͡z"},
{"ʈ", "t"},
{"[ʤʧʃ]", "%1ʷ"},  
{"[ʤʧʃ]", "%1ʷ"},  
}
}
Line 122: Line 111:
{"ɐj", "ɔ" .. raised .. "j"}, {"aj", "a" .. c.diaer .. raised .. "j"},
{"ɐj", "ɔ" .. raised .. "j"}, {"aj", "a" .. c.diaer .. raised .. "j"},
    {"ʦ", "t͡s"}, {"ʣ", "d͡z"},
{"([ntdszl])", "%1" .. laminal}, {"(͡[sz])" .. laminal, "%1" .. dental},  
{"([ntdszl])", "%1" .. laminal}, {"(͡[sz])" .. laminal, "%1" .. dental},  
}
}
Line 127: Line 117:
local upper_rules = {
local upper_rules = {
{"a", "ɐ"}, {"ɸ", "f"}, {"β", "v"}, {"θ", "t"}, {"ð", "d"},
{"a", "ɐ"}, {"ɸ", "f"}, {"β", "v"}, {"θ", "t"}, {"ð", "d"},
{"^[ˌˈ]", ""}, {"[ˌˈ]", "·"}, {"ju", "y"}, {"ew", "y"}, {"[ɛI]", "ɐj"}, {"ɔ", "aw"},
{"^[ˌˈ]+", ""}, {"[ˌˈ]+", "·"}, {"··", "·"}, {"ju", "y"}, {"ew", "y"}, {"[ɛI]", "ɐj"}, {"ɔ", "aw"},
{"r", "ɾ"}, {"r·r", "ʀ"}, {"d·([ʣʤ])", "·%1"}, {"t·([ʦʧ])", "·%1"},
{"r", "ɾ"}, {"r·r", "ʀ"}, {"d·([ʣʤ])", "·%1"}, {"t·([ʦʧ])", "·%1"},
{"ʣ", "z"}, {"ʦ", "s"}, {"ʧ", "ʃ"}, {"ʤ", "ʒ"},
{"ʣ", "z"}, {"ʦ", "s"}, {"ʧ", "ʃ"}, {"ʤ", "ʒ"},
Line 157: Line 147:


local paulistan_rules = {
local paulistan_rules = {
{"^([ˈˌ]?)s", "%1es"}, {"r", "ɾ"}, {"d·([ʣʤ])", "·%1"}, {"t·([ʦʧ])", "·%1"},
{"^([ˈˌ]?)s(" .. consonants .. ")", "es%1%2"}, {"r", "ɾ"}, {"d·([ʣʤ])", "·%1"}, {"t·([ʦʧ])", "·%1"}, {"[ʧʦ]", "s"}, {"ʤ", "ʒ"}, 
{"(" .. consonants .. ")·%1", "·%1"}, {"ð", "d"}, {"d([iĩj])", "ʤ%1"}, {"t([iĩj])", "ʧ%1"},
{"(" .. consonants .. ")([ˈ·ˌ])%1", "%2%1"}, {"ð", "d"}, {"d([iĩjɪ])", "ʤ%1"}, {"t([iĩjɪ])", "ʧ%1"},
{"^([ˈˌ]?)ɾ", "%1ʁ"}, {"ɾ([ˈˌ·]?)(" .. consonants .. ")", "ɹ%1%2"}, {"([pbtdkg])$", "%1ĭ"},
{"^([ˈˌ]?)ɾ", "%1ʁ"}, {"ɾ([ˈˌ·]?)(" .. consonants .. ")", "ɹ%1%2"}, {"([pbtdkg])$", "%1ĭ"},
--{"([mnŋɲ])(" .. vowels .. ")([ˈˌ·]?)([mnŋɲ])", "%1%2" .. c.tilde .. "%3%4"},
{"([mnŋɲ])(" .. vowels .. ")([ˈˌ·]?)([mnŋɲ])", "%1%2" .. c.tilde .. "%3%4"},
{"ḱ", "kw"}, {"ǵ", "gw"}, --{"(" .. vowels .. ")([ˈˌ·]?)ɲ", "%1" .. c.tilde .. "%2j̃"},
{"ḱ", "kw"}, {"ǵ", "gw"}, {"(" .. vowels .. ")([ˈˌ·]?)ɲ", "%1" .. c.tilde .. "%2j̃"},
{"(·[^·]*)j", "%1ɪ̯"}, {"^(·[^·]*)j", "%1ɪ̯"},   
{"(·[^·ˈˌ]*)j", "%1ɪ̯"}, {"^(·[^·ˈˌ]*)j", "%1ɪ̯"},   
{"(·[^·]*)w", "%1ʊ̯"}, {"^(·[^·]*)w", "%1ʊ̯"},   
{"(·[^·ˈˌ]*)w", "%1ʊ̯"}, {"^(·[^·ˈˌ]*)w", "%1ʊ̯"},   
{"(·[^·]*)i", "%1ɪ"}, {"^(·[^·]*)i", "%1ɪ"},   
{"(·[^·ˈˌ]*)i", "%1ɪ"}, {"^(·[^·ˈˌ]*)i", "%1ɪ"},   
{"(·[^·]*)u", "%1ʊ"}, {"^(·[^·]*)u", "%1ʊ"},   
{"(·[^·ˈˌ]*)u", "%1ʊ"}, {"^(·[^·ˈˌ]*)u", "%1ʊ"},   
{"(·[^·]*)e", "%1i"}, {"^(·[^·]*)e", "%1i"},  
{"(·[^·ˈˌ]*)e", "%1i"}, {"^(·[^·ˈˌ]*)e", "%1i"},  
--{"(" .. vowels .. ")([ˈˌ·]?)ŋ", "%1" .. c.tilde .. "%2w" .. c.tilde},
{"(" .. vowels .. ")([ˈˌ·]?)ŋ", "%1" .. c.tilde .. "%2w" .. c.tilde},
{"ẽ", "ẽj" .. c.tilde}, {"õw" .. c.tilde}, {c.tilde .. c.tilde, c.tilde},
{"ẽ", "ẽj" .. c.tilde}, {"õ", "õw" .. c.tilde}, {c.tilde .. c.tilde, c.tilde},
}
}


Line 175: Line 165:
-- Escaped characters
-- Escaped characters
{"ʤ", "d͡ʒ"}, {"ʧ", "t͡ʃ"}, {"ʈ", "t"}, {"ʦ", "t͡s"}, {"ʣ", "d͡z"},
{"ʤ", "d͡ʒ"}, {"ʧ", "t͡ʃ"}, {"ʈ", "t"}, {"ʦ", "t͡s"}, {"ʣ", "d͡z"},
{"g", "ɡ"}, {"ḱ", "kʷ"}, {"ǵ", "ɡʷ"}, {"I", "i"},
{"g", "g"}, {"ḱ", "kʷ"}, {"ǵ", ""}, {"I", "i"},
{"·", "."},
{"·?ˈ·?", "ˈ"}, {"·", "."},
}
}


local function syllabify(word)
local function syllabify(word, no_stress)
local clusters = m_table.listToSet({
local clusters = m_table.listToSet({
"s[ptʈkfɸ]", "z[bdgβʤmnlr]",
"s[ptʈkfɸ]", "z[bdgβʤmnlr]",
Line 199: Line 189:
word = gsub(word, "··", "·"); word = gsub(word, "·$", ""); word = gsub(word, "^·", "")
word = gsub(word, "··", "·"); word = gsub(word, "·$", ""); word = gsub(word, "^·", "")
word = gsub(word, "(" .. consonants .. ")·(" .. vowels .. ")", "·%1%2")
word = gsub(word, "(" .. consonants .. ")·(" .. vowels .. ")", "·%1%2")
word = gsub(word, "·?(" .. consonants .. ")%1(" .. vowels .. "*)", "%%1%2")
word = gsub(word, "(·?)(" .. consonants .. ")%2(" .. vowels .. "*)", "%2%1%2%3")
word = gsub(word, "·(" .. consonants .. ")$", "%1"); word = gsub(word, "^(" .. consonants .. ")·", "%1")
word = gsub(word, "·(" .. consonants .. ")$", "%1"); word = gsub(word, "^(" .. consonants .. ")·", "%1")
word = gsub(word, "·(.)·", "%1·")
word = gsub(word, "·(.)·", "%1·")
--word = gsub(word, "·s(" .. voiceless .. ")", "s·%1")
word = gsub(word, "·s(" .. voiceless .. ")", "s·%1")
--word = gsub(word, "(" .. consonants .. ")s·(" .. voiceless .. ")", "%1·s%2")
word = gsub(word, "(" .. consonants .. ")s·(" .. voiceless .. ")", "%1·s%2")
word = gsub(word, "ï(" .. vowels .. ")", "i·%1")
word = gsub(word, "ï(" .. vowels .. ")", "i·%1"); word = gsub(word, "ḱ·ḱ", "k·ḱ")
word = gsub(word, "·?d([ʤʣ])", "d·%1"); word = gsub(word, "·tʦ", "t·ʦ")
word = gsub(word, "·?d([ʤʣ])", "d·%1"); word = gsub(word, "·tʦ", "t·ʦ")
word = gsub(word, "·?ŋg", "ŋ·g"); word = gsub(word, "··", "·")
word = gsub(word, "·?ŋg", "ŋ·g"); word = gsub(word, "··", "·")
for cluster, _ in pairs(clusters) do
word = gsub(word, "(" .. consonants .. "+)·(" .. consonants .. "+)", function(c1,c2) return match(c1 .. c2, cluster) and "·" .. c1 .. c2 or c1 .. "·" .. c2 end)
end
word = gsub(word, "%-", "·"); word = gsub(word, "··", "·")
end
end
local syllables = split(word, "·");
local syllables = split(word, "·");
if #syllables == 1 then return table.concat(syllables) end -- account for monosyllables
if no_stress or (#syllables == 1 and not match(word, "[" .. c.acute .. c.circ .. "]")) then
return dediacv(word, "[" .. c.acute .. c.circ .. "]")
end
local first_stress = "[âêîôû]"
local first_stress = "[âêîôû]"
Line 240: Line 238:
end
end


function export.crux(term, outputs)
function export.crux(term, no_stress, outputs)
local ret, dialects = {}, {}
local ret, dialects = {}, {}
term = mw.ustring.lower(term)
term = mw.ustring.lower(term)
Line 248: Line 246:
end
end
term = syllabify(term)
term = syllabify(term, no_stress)
term = term:gsub("·([ˈˌ])", "%1")
term = term:gsub("·?([ˈˌ])·?", "%1")
term = term:gsub("ˌˌ", "ˌ")
term = term:gsub("ˌˌ", "ˌ")
Line 262: Line 260:
end
end
local upper, bolognese, paulistan = phonemic, phonetic, phonetic
local upper, bolognese, paulistan = phonemic, phonetic, phonemic
for _, rule in ipairs(upper_rules) do
for _, rule in ipairs(upper_rules) do
upper = gsub(upper, rule[1], rule[2])
upper = gsub(upper, rule[1], rule[2])
Line 327: Line 325:




function separate_word(term)
function separate_word(term, no_stress)
     local phonemic, phonetic, dialects = {}, {}, {}
     local phonemic, phonetic, dialects = {}, {}, {}
local m, t, d = "", "", {}
local m, t, d = "", "", {}
Line 333: Line 331:
if match(term, " ") then
if match(term, " ") then
    for word in gsplit(term, " ") do
    for word in gsplit(term, " ") do
        local ret, d = export.crux(word)
        local ret, d = export.crux(word, no_stress)
        m = ret[1]; t = ret[2]
        m = ret[1]; t = ret[2]
         
         
Line 345: Line 343:
    end
    end
     else
     else
     return export.crux(term)
     return export.crux(term, no_stress)
     end
     end


Line 354: Line 352:
     local parent_args = frame:getParent().args
     local parent_args = frame:getParent().args
     local params = {
     local params = {
         [1] = { default = mw.title.getCurrentTitle().nsText == 'Template' and "rasda" or mw.title.getCurrentTitle().text },
         [1] = { default = mw.title.getCurrentTitle().nsText == 'Template' and "agghiu" or mw.title.getCurrentTitle().text },
        ["rs"] = {type = 'boolean'},
     }
     }
     local args = require("Module:parameters").process(parent_args, params)
     local args = require("Module:parameters").process(parent_args, params)
     local term = args[1]
     local term = args[1]; local no_stress = args.rs
local ret, dialects = separate_word(term)
local ret, dialects = separate_word(term, no_stress)
     local phonemic = ret[1]; local phonetic = ret[2]
     local phonemic = ret[1]; local phonetic = ret[2]
      
      
     local IPA_args = {{pron = '/' .. (phonemic or "test") .. '/', a = "Standard Ravennese"}, {pron = '[' .. (phonetic or "test2") .. ']'}}
     local IPA_args = {{pron = '/' .. (phonemic or "test") .. '/', a = {"Standard Ravennese"}}, {pron = '[' .. (phonetic or "test2") .. ']'}}
     for key, value in pairs(dialects) do
     for key, value in pairs(dialects) do
     if value ~= phonemic then
     if value ~= phonemic and value ~= phonetic  then
     table.insert(IPA_args, {pron = '[' .. value .. ']', a = {sub(key,1,1)}, separator = "\n** "})
     table.insert(IPA_args, {pron = '[' .. value .. ']', a = {sub(key,1,1)}, separator = "\n** "})
     end
     end