Module:qay-pron: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
(99 intermediate revisions by the same user not shown) | |||
Line 14: | Line 14: | ||
local export = {} | local export = {} | ||
local consonants = "[ | local consonants = "[pbmvstdnrɾlkɡŋhxçʤʧjwçx2]" | ||
local front = " | local front = "iɪeɛ" | ||
local back = " | local back = "oɔuʊ" | ||
local vowels = "[a" .. front .. back .. " | local vowels = "[a" .. front .. back .. "ː´2]" | ||
local function laxen(v) | local function laxen(v) | ||
local otc = {} | local otc = {} | ||
local switch = {["e"] = "ɛ", ["i"] = "ɪ", ["o"] = "ɔ", ["u"] = "ʊ | local switch = {["e"] = "ɛ", ["i"] = "ɪ", ["o"] = "ɔ", ["u"] = "ʊ"} | ||
for vc in gmatch(v, ".") do | for vc in gmatch(v, ".") do | ||
vc = gsub(vc, vc, switch[vc]) | if switch[vc] then vc = gsub(vc, vc, switch[vc]) end | ||
table.insert(otc, vc) | table.insert(otc, vc) | ||
end | end | ||
Line 36: | Line 36: | ||
end | end | ||
local | local first_rules = { | ||
{"n(·?)([kg])", "ŋ%1%2"}, {"ŋg", "ŋ"}, {"c", "ʧ"}, {"j", "ʤ"}, {"y", "j"}, {"g", "ɡ"}, | {"n(·?)([kg])", "ŋ%1%2"}, {"ŋg", "ŋ"}, {"c", "ʧ"}, {"j", "ʤ"}, {"y", "j"}, {"g", "ɡ"}, {"%-", ""}, | ||
-- Long vowels | -- Long vowels | ||
{"ā", "aː"}, {"ē", "eː"}, {"ī", "iː"}, {"ō", "oː"}, {"ū", "uː"}, | {"ā", "aː"}, {"ē", "eː"}, {"ī", "iː"}, {"ō", "oː"}, {"ū", "uː"}, | ||
-- Diphthongs | |||
{"au", "aʊ"}, {"[uʊ]ji", "wi"}, {"h?u([aeiouɛɪɔʊ])", "w%1"}, | |||
{" | |||
} | } | ||
local phonetic_rules = { | local phonetic_rules = { | ||
{" | {"([ˈˌ])·", "%1"}, {"·([ˈˌ])", "%1"}, {"ˈˌ", "ˌ"}, {"·ˈ´·", "ˈ"}, | ||
{"h([" .. front .. "])", "ç%1"}, {"h([" .. back .. "])", "x%1"}, | |||
{"([^nŋ]·)[tk]j", "%1ʧ"}, {"([^nŋ]·)[dɡ]j", "%1ʤ"}, {"r", "ɾ"}, {"k([·ˈ])w", "%1kw"}, {"s([·ˈ])j", "%1sj"}, | |||
-- Lax vowels in closed syllables | |||
{"([·ˈ])(" .. consonants .. "?)(" .. vowels .. "*)(" .. consonants .. ")", function(st,c1,v,c2) return st .. c1 .. laxen(v) .. c2 end}, | {"([·ˈ])(" .. consonants .. "?)(" .. vowels .. "*)(" .. consonants .. ")", function(st,c1,v,c2) return st .. c1 .. laxen(v) .. c2 end}, | ||
{"^(" .. consonants .. "?)(" .. vowels .. "*)(" .. consonants .. ")$", function(c1,v,c2) return c1 .. laxen(v) .. c2 end}, | {"^(" .. consonants .. "?)(" .. vowels .. "*)(" .. consonants .. ")$", function(c1,v,c2) return c1 .. laxen(v) .. c2 end}, | ||
{"(" .. consonants .. ")(" .. vowels .. "*)(" .. consonants .. consonants .. ")", function(c1,v,c23) return c1 .. laxen(v) .. c23 end}, | |||
-- Doubled consonants are reduced to one | |||
{"(" .. consonants .. ")(·?ˈ?)(" .. consonants .. ")", function(c1, st, c2) return same(c1,c2) and st .. c1 or c1 .. st .. c2 end}, | {"(" .. consonants .. ")(·?ˈ?)(" .. consonants .. ")", function(c1, st, c2) return same(c1,c2) and st .. c1 or c1 .. st .. c2 end}, | ||
{" | {"jj", "j"}, | ||
-- Diphthongs | |||
{"(" .. vowels .. ")j$", "%1ɪ"}, | |||
{"(·" .. consonants .. ")e$", "%1ə"}, {"a", "ä"}, | |||
{"ʤ", "d͡ʒ"}, {"ʧ", "t͡ʃ"}, | |||
} | } | ||
local function syllabify( | local function syllabify(word) | ||
word = gsub(word, "2", "ˌ") | |||
word = gsub(word, "(ː)(" .. vowels .. ")", "%1·%2") | |||
word = gsub(word, "(" .. consonants .. "*)(" .. vowels .. "*)", "%1%2·") | |||
word = gsub(word, "··", "·"); word = gsub(word, "·$", ""); word = gsub(word, "^·", "") | |||
word = gsub(word, "·(" .. consonants .. ")(" .. consonants .. ")(" .. vowels .. "*)", "%1·%2%3") | |||
word = gsub(word, "·(" .. consonants .. ")$", "%1") | |||
word = gsub(word, "·(" .. consonants .. ")·", "%1·") | |||
word = gsub(word, "(" .. consonants .. ")·(" .. consonants .. ")([pbmvstdnrɾlkɡŋhxçʤʧçx])", "%1%2·%3") | |||
word = gsub(word, "a·ʊ", "aʊ·") | |||
local | local syllables = split(word, "·"); | ||
if # | if #syllables ~= 1 then | ||
if match( | for i, syll in ipairs(syllables) do | ||
if match(word, "´") and not match(syll, "´") then | |||
break | |||
table.insert( | elseif match(syll, "´") then | ||
syll = syll:gsub("´","ˈ") | |||
return table.concat(syllables, "·") | |||
elseif match(syll, "ː") then | |||
table.insert(syllables, i, "ˈ") | |||
return table.concat(syllables, "·") | |||
elseif match(word, "ŋ$") or match(syllables[#syllables], "[aeiouɛɪɔʊ][aeiouɛɪɔʊj]") then | |||
table.insert(syllables, #syllables, "ˈ") | |||
return table.concat(syllables, "·") | |||
--[[else | |||
table.insert(syllables, #syllables-1, "ˈ") | |||
return ret]] | |||
end | end | ||
end | |||
local ret = table.concat(syllables, "·"); | |||
if not match(ret, "ˈ") then | |||
syllables = split(ret, "·") | |||
syllables[#syllables - 1] = "ˈ" .. syllables[#syllables - 1] | |||
ret = table.concat(syllables, "·") | |||
end | end | ||
end | end | ||
return table.concat( | return table.concat(syllables, "·") | ||
end | end | ||
function export. | function export.crux(term) | ||
term = mw.ustring.lower(term) | term = mw.ustring.lower(term) | ||
for _, rule in ipairs( | for _, rule in ipairs(first_rules) do | ||
term = gsub(term, rule[1], rule[2]) | term = gsub(term, rule[1], rule[2]) | ||
end | end | ||
Line 91: | Line 119: | ||
term = syllabify(term) | term = syllabify(term) | ||
for _, | for _, rule in ipairs(phonetic_rules) do | ||
term = gsub(term, | term = gsub(term, rule[1], rule[2]) | ||
end | end | ||
term = gsub(term, "·", ".") | term = gsub(term, "·", ".") | ||
term = gsub(term, "%.%.", ".") | |||
return term | return term | ||
end | end | ||
function | function separate_word(term) | ||
local result = {} | |||
for | for word in gsplit(term, " ") do | ||
table.insert(result, export.crux(word)) | |||
end | end | ||
return table.concat(result, " ") | |||
end | end | ||
Line 128: | Line 148: | ||
local IPA_args = {} | local IPA_args = {} | ||
local phonetic = separate_word(term) | |||
local phonetic = | table.insert(IPA_args, {pron = '[' .. phonetic .. ']'}) | ||
return "* " .. m_IPA.format_IPA_full(lang, IPA_args) | return "* " .. m_IPA.format_IPA_full({lang = lang, items = IPA_args}) | ||
end | end | ||
return export | return export |
Latest revision as of 15:07, 7 August 2024
- The following documentation is located at Module:qay-pron/doc.[edit]
- Useful links: subpage list • links • transclusions • testcases • sandbox
local sub = mw.ustring.sub
local find = mw.ustring.find
local gmatch = mw.ustring.gmatch
local gsub = mw.ustring.gsub
local match = mw.ustring.match
local u = mw.ustring.char
local split = mw.text.split
local gsplit = mw.text.gsplit
local lang = require("Module:languages").getByCode("qay")
local m_table = require("Module:table")
local m_IPA = require("Module:IPA")
local export = {}
local consonants = "[pbmvstdnrɾlkɡŋhxçʤʧjwçx2]"
local front = "iɪeɛ"
local back = "oɔuʊ"
local vowels = "[a" .. front .. back .. "ː´2]"
local function laxen(v)
local otc = {}
local switch = {["e"] = "ɛ", ["i"] = "ɪ", ["o"] = "ɔ", ["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
local function same(foo, bar)
foo, bar = mw.ustring.toNFD(foo), mw.ustring.toNFD(bar) -- decompose diacritics
foo, bar = match(foo, "^."), match(bar, "^.") -- sort out the letter
return foo == bar and true or false
end
local first_rules = {
{"n(·?)([kg])", "ŋ%1%2"}, {"ŋg", "ŋ"}, {"c", "ʧ"}, {"j", "ʤ"}, {"y", "j"}, {"g", "ɡ"}, {"%-", ""},
-- Long vowels
{"ā", "aː"}, {"ē", "eː"}, {"ī", "iː"}, {"ō", "oː"}, {"ū", "uː"},
-- Diphthongs
{"au", "aʊ"}, {"[uʊ]ji", "wi"}, {"h?u([aeiouɛɪɔʊ])", "w%1"},
}
local phonetic_rules = {
{"([ˈˌ])·", "%1"}, {"·([ˈˌ])", "%1"}, {"ˈˌ", "ˌ"}, {"·ˈ´·", "ˈ"},
{"h([" .. front .. "])", "ç%1"}, {"h([" .. back .. "])", "x%1"},
{"([^nŋ]·)[tk]j", "%1ʧ"}, {"([^nŋ]·)[dɡ]j", "%1ʤ"}, {"r", "ɾ"}, {"k([·ˈ])w", "%1kw"}, {"s([·ˈ])j", "%1sj"},
-- Lax vowels in closed syllables
{"([·ˈ])(" .. consonants .. "?)(" .. vowels .. "*)(" .. consonants .. ")", function(st,c1,v,c2) return st .. c1 .. laxen(v) .. c2 end},
{"^(" .. consonants .. "?)(" .. vowels .. "*)(" .. consonants .. ")$", function(c1,v,c2) return c1 .. laxen(v) .. c2 end},
{"(" .. consonants .. ")(" .. vowels .. "*)(" .. consonants .. consonants .. ")", function(c1,v,c23) return c1 .. laxen(v) .. c23 end},
-- Doubled consonants are reduced to one
{"(" .. consonants .. ")(·?ˈ?)(" .. consonants .. ")", function(c1, st, c2) return same(c1,c2) and st .. c1 or c1 .. st .. c2 end},
{"jj", "j"},
-- Diphthongs
{"(" .. vowels .. ")j$", "%1ɪ"},
{"(·" .. consonants .. ")e$", "%1ə"}, {"a", "ä"},
{"ʤ", "d͡ʒ"}, {"ʧ", "t͡ʃ"},
}
local function syllabify(word)
word = gsub(word, "2", "ˌ")
word = gsub(word, "(ː)(" .. vowels .. ")", "%1·%2")
word = gsub(word, "(" .. consonants .. "*)(" .. vowels .. "*)", "%1%2·")
word = gsub(word, "··", "·"); word = gsub(word, "·$", ""); word = gsub(word, "^·", "")
word = gsub(word, "·(" .. consonants .. ")(" .. consonants .. ")(" .. vowels .. "*)", "%1·%2%3")
word = gsub(word, "·(" .. consonants .. ")$", "%1")
word = gsub(word, "·(" .. consonants .. ")·", "%1·")
word = gsub(word, "(" .. consonants .. ")·(" .. consonants .. ")([pbmvstdnrɾlkɡŋhxçʤʧçx])", "%1%2·%3")
word = gsub(word, "a·ʊ", "aʊ·")
local syllables = split(word, "·");
if #syllables ~= 1 then
for i, syll in ipairs(syllables) do
if match(word, "´") and not match(syll, "´") then
break
elseif match(syll, "´") then
syll = syll:gsub("´","ˈ")
return table.concat(syllables, "·")
elseif match(syll, "ː") then
table.insert(syllables, i, "ˈ")
return table.concat(syllables, "·")
elseif match(word, "ŋ$") or match(syllables[#syllables], "[aeiouɛɪɔʊ][aeiouɛɪɔʊj]") then
table.insert(syllables, #syllables, "ˈ")
return table.concat(syllables, "·")
--[[else
table.insert(syllables, #syllables-1, "ˈ")
return ret]]
end
end
local ret = table.concat(syllables, "·");
if not match(ret, "ˈ") then
syllables = split(ret, "·")
syllables[#syllables - 1] = "ˈ" .. syllables[#syllables - 1]
ret = table.concat(syllables, "·")
end
end
return table.concat(syllables, "·")
end
function export.crux(term)
term = mw.ustring.lower(term)
for _, rule in ipairs(first_rules) do
term = gsub(term, rule[1], rule[2])
end
term = syllabify(term)
for _, rule in ipairs(phonetic_rules) do
term = gsub(term, rule[1], rule[2])
end
term = gsub(term, "·", ".")
term = gsub(term, "%.%.", ".")
return term
end
function separate_word(term)
local result = {}
for word in gsplit(term, " ") do
table.insert(result, export.crux(word))
end
return table.concat(result, " ")
end
function export.show(frame)
local parent_args = frame:getParent().args
local params = {
[1] = { default = mw.title.getCurrentTitle().nsText == 'Template' and "ankyu" or mw.title.getCurrentTitle().text },
}
local args = require("Module:parameters").process(parent_args, params)
local term = args[1]
local IPA_args = {}
local phonetic = separate_word(term)
table.insert(IPA_args, {pron = '[' .. phonetic .. ']'})
return "* " .. m_IPA.format_IPA_full({lang = lang, items = IPA_args})
end
return export