Module:qay-pron: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
| Line 31: | Line 31: | ||
local function same(foo, bar) | local function same(foo, bar) | ||
foo, bar = match(foo, "^."), match(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 | return foo == bar and true or false | ||
end | end | ||
| Line 43: | Line 44: | ||
local phonemic_rules = { | local phonemic_rules = { | ||
{"([tkdɡ])j", "%1ʲ"}, {"(" .. consonants .. consonants .. ")", function(c1, c2) return same(c1,c2) and c1 or c1 .. c2 end}, | {"([tkdɡ])j", "%1ʲ"}, {"(" .. consonants .. ")(" .. consonants .. ")", function(c1, c2) return same(c1,c2) and c1 or c1 .. c2 end}, | ||
} | } | ||
| Line 55: | Line 56: | ||
} | } | ||
local function syllabify(term | local function syllabify(term) | ||
term = gsub(term, "(" .. consonants .. "*)(" .. vowels .. "*)", "%1%2·") | term = gsub(term, "(" .. consonants .. "*)(" .. vowels .. "*)", "%1%2·") | ||
term = gsub(term, "··", "·"); term = gsub(term, "·$", "") | term = gsub(term, "··", "·"); term = gsub(term, "·$", "") | ||
| Line 63: | Line 64: | ||
local syll = split(term, "·"); local noa = {} | local syll = split(term, "·"); local noa = {} | ||
if #syll ~= 1 then | if #syll ~= 1 then | ||
| Line 77: | Line 76: | ||
end | end | ||
return table.concat(#noa > 1 and noa or syll, " | return table.concat(#noa > 1 and noa or syll, ".") | ||
end | end | ||
function export.phonemic(term) | function export.phonemic(term) | ||
term = mw.ustring.lower(term) | term = mw.ustring.lower(term) | ||
term = syllabify(term) | |||
for _, rule in ipairs(shared_rules) do | for _, rule in ipairs(shared_rules) do | ||
| Line 96: | Line 96: | ||
function export.phonetic(term) | function export.phonetic(term) | ||
term = mw.ustring.lower(term) | term = mw.ustring.lower(term) | ||
term = syllabify(term) | |||
for _, rule in ipairs(shared_rules) do | for _, rule in ipairs(shared_rules) do | ||
Revision as of 21:39, 20 June 2022
- 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ɾljkɡŋhxçʤʧ]"
local front = "ie"
local back = "ou"
local vowels = "[a" .. front .. back .. "ː]"
local function open_to_closed(v)
local otc = {}
local switch = {["e"] = "ɛ", ["i"] = "ɪ", ["ɔ"] = "ɔ", ["u"] = "ʊ", ["a"] = "a"}
for vc in gmatch(v, ".") do
vc = gsub(vc, vc, switch[vc])
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 shared_rules = {
{"n[kg]", {["nk"] = "ŋk", ["ng"] = "ŋ"}}, {"c", "ʧ"}, {"j", "ʤ"}, {"y", "j"}, {"g", "ɡ"},
-- Long vowels
{"ā", "aː"}, {"ē", "eː"}, {"ī", "iː"}, {"ō", "oː"}, {"ū", "uː"},
}
local phonemic_rules = {
{"([tkdɡ])j", "%1ʲ"}, {"(" .. consonants .. ")(" .. consonants .. ")", function(c1, c2) return same(c1,c2) and c1 or c1 .. c2 end},
}
local phonetic_rules = {
{"([^nŋ])[tk]j", "%1ʧ"}, {"([^nŋ])[dɡ]j", "%1ʤ"}, {"r", "ɾ"},
{"h([" .. front .. "])", "ç%1"}, {"h([" .. back .. "])", "x%1"},
--{"(" consonants .. vowel)", ""},
}
local function syllabify(term)
term = gsub(term, "(" .. consonants .. "*)(" .. vowels .. "*)", "%1%2·")
term = gsub(term, "··", "·"); term = gsub(term, "·$", "")
term = gsub(term, "·(" .. consonants .. ")(" .. consonants .. ")(" .. vowels .. "*)", "%1·%2%3")
term = gsub(term, "·(" .. consonants .. ")$", "%1")
term = gsub(term, "·(" .. consonants .. ")·", "%1·")
local syll = split(term, "·"); local noa = {}
if #syll ~= 1 then
if match(term, "[áéíóúĄ]") then
for _, s in ipairs(syll) do
s = remove_acute(s, match(s, "[áéíóúĄ]") and true or false)
table.insert(noa, s)
end
else
syll[#syll - 1] = "ˈ" .. syll[#syll - 1]
end
end
return table.concat(#noa > 1 and noa or syll, ".")
end
function export.phonemic(term)
term = mw.ustring.lower(term)
term = syllabify(term)
for _, rule in ipairs(shared_rules) do
term = gsub(term, rule[1], rule[2])
end
for _, micrule in ipairs(phonemic_rules) do
term = gsub(term, micrule[1], micrule[2])
end
return write_stress(term)
end
function export.phonetic(term)
term = mw.ustring.lower(term)
term = syllabify(term)
for _, rule in ipairs(shared_rules) do
term = gsub(term, rule[1], rule[2])
end
for _, ticrule in ipairs(phonetic_rules) do
term = gsub(term, ticrule[1], ticrule[2])
end
term = gsub(term, "a", "ä")
return write_stress(term)
end
--[=[
local function IPA_span(items)
local bits = {}
for _, item in ipairs(items) do
local bit = "<span style=\"font-size:110%;font-family:Gentium,'DejaVu Sans','Segoe UI',sans-serif>" .. item.pron .. "</span>"
table.insert(bits, bit)
end
return table.concat(bits)
end
local function format_IPA(items)
return "[[w:IPA chart|IPA]]<sup>([[IPA for High Valyrian|key]])</sup>: " .. IPA_span(items)
end
function line_format(pronunciation, register)
local IPA_args = {}
for _, arg in ipairs(args[1]) do
local phonemic = export.phonemic(arg)
local phonetic = export.phonetic(arg)
table.insert(IPA_args, {pron = '/' .. phonemic .. '/'})
if phonemic ~= phonetic then
table.insert(IPA_args, {pron = '[' .. phonetic .. ']'})
end
end
end
function separate_word(term, b)
local result = {}
for word in gsplit(term, " ") do
if b then table.insert(result, export.antique_crux(word))
else table.insert(result, export.crux(word)) end
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 phonemic = export.phonemic(term)
local phonetic = export.phonetic(term)
table.insert(IPA_args, {pron = '/' .. phonemic .. '/'})
if phonemic ~= phonetic then
table.insert(IPA_args, {pron = '[' .. phonetic .. ']'})
end
return "* " .. m_IPA.format_IPA_full(lang, IPA_args)
end
return export