[go: up one dir, main page]

Мазмунга өтүү

Модуль:syllables

Wiktionary дан

Сыноо иштери

[түзөтүү]
{{#invoke:syllables|countVowels|/ɛː.e.lí.o͜i.o/}}
{{#invoke:syllables|countVowels|/ˈhaɪweɪ/}}
{{#invoke:syllables|countVowels|/ˈloʊɚ/}}
{{#invoke:syllables|countVowels|/ænˈdreɪə/}}
{{#invoke:syllables|countVowels|/ˈbaɪəʊ/}}
{{#invoke:syllables|countVowels|/ˈɑːmiɑi̯sˌmɑjoi̯tus/}}
{{#invoke:syllables|countVowels|/vr̩x/}}
{{#invoke:syllables|countVowels|/vl̩k/}}
{{#invoke:syllables|countVowels|/ˈvr̩ːba/}}
{{#invoke:syllables|countVowels|/ˈɛi̯ərə(n)/}}
{{#invoke:syllables|countVowels|/ˈleːu̯ə(n)/}}
  • "/ɛː.e.lí.o͜i.o/" тексти 6 үндүү, 0 үн тизмеги жана 5 үндүү же үндүү тыбыштарды жана дифтонгдорду камтыйт.
  • "/ˈhaɪweɪ/" текстинде 4 үндүү, 0 үн тизмеги жана 4 үндүү же үндүү жана дифтонг бар.
  • "/ˈloʊɚ/" текстинде 3 үндүү, 0 үн тизмеги жана 3 үндүү же үндүү тыбыштар жана дифтонгдор бар.
  • "/ænˈdreɪə/" текстинде 4 үндүү, 0 үн тизмеги жана 4 үндүү же үндүү жана дифтонг бар.
  • "/ˈbaɪəʊ/" текстинде 4 үндүү, 0 үн тизмеги жана 4 үндүү же үндүү жана дифтонг бар.
  • "/ˈɑːmiɑi̯sˌmɑjoi̯tus/" тексти 8 үндүү, 0 үн тизмеги жана 6 үндүү же үндүү тыбыштарды жана дифтонгдорду камтыйт.
  • "/vr̩x/" текстинде 0 үндүү, 0 үн тизмеги жана 0 үндүү тыбыштар же үндүү тыбыштар жана дифтонгдор бар.
  • "/vl̩k/" текстинде 0 үндүү, 0 үн тизмеги жана 0 үндүү же үндүү тыбыштар жана дифтонгдор бар.
  • "/ˈvr̩ːba/" тексти 1 үндүү, 0 үн тизмеги жана 1 үндүү же үндүү тыбыштарды жана дифтонгдорду камтыйт.
  • "/ˈɛi̯ərə(n)/" текстинде 4 үндүү, 0 үн тизмеги жана 3 үндүү же үндүү жана дифтонг бар.
  • "/ˈleːu̯ə(n)/" тексти 3 үндүү, 0 үн тизмеги жана 2 үндүү тыбыштарды же үндүүлөрдү жана дифтонгдорду камтыйт.
{{#invoke:syllables|countVowelsDiphthongs|en|/ˈhaɪweɪ/}}
{{#invoke:syllables|countVowelsDiphthongs|en|/ˈloʊɚ/}}
{{#invoke:syllables|countVowelsDiphthongs|en|/aɪˈdiə/}}
{{#invoke:syllables|countVowelsDiphthongs|en|/ænˈdreɪə/}}
{{#invoke:syllables|countVowelsDiphthongs|en|/ˈbaɪəʊ/}}
{{#invoke:syllables|countVowelsDiphthongs|fi|/ˈɑːmiɑi̯sˌmɑjoi̯tus/}}
{{#invoke:syllables|countVowelsDiphthongs|sk|/vr̩x/}}
{{#invoke:syllables|countVowelsDiphthongs|sk|/vl̩k/}}
{{#invoke:syllables|countVowelsDiphthongs|sk|/ˈvr̩ːba/}}
{{#invoke:syllables|countVowelsDiphthongs|nl|/ˈɛi̯ərə(n)/}}
{{#invoke:syllables|countVowelsDiphthongs|nl|/ˈleːu̯ə(n)/}}
  • "/ˈhaɪweɪ/" текстинде 2 үндүү же дифтонг бар.
  • "/ˈloʊɚ/" текстинде 2 үндүү же дифтонг бар.
  • "/aɪˈdiə/" текстинде 2 үндүү же дифтонг бар. – /iə/ GA-да диссиллабикалык ырааттуулук, ал эми NZде дифтонг; тилекке каршы, диалект үчүн тил коду жок.
  • "/ænˈdreɪə/" текстинде 2 үндүү же дифтонг бар.
  • "/ˈbaɪəʊ/" текстинде 0 үндүү же дифтонг бар.
  • "/ˈɑːmiɑi̯sˌmɑjoi̯tus/" текстинде 8 үндүү же дифтонг бар.
  • "/vr̩x/" текстинде 0 үндүү же дифтонг бар.
  • "/vl̩k/" текстинде 0 үндүү же дифтонг бар.
  • "/ˈvr̩ːba/" текстинде 1 үндүү же дифтонг бар.
  • "/ˈɛi̯ərə(n)/" текстинде 4 үндүү же дифтонг бар.
  • "/ˈleːu̯ə(n)/" текстинде 3 үндүү же дифтонг бар.
{{#invoke:syllables|countVowels2Test|en|/ˈhaɪweɪ/}}
{{#invoke:syllables|countVowels2Test|en|/ˈloʊɚ/}}
{{#invoke:syllables|countVowels2Test|en|/aɪˈdiə/}}
{{#invoke:syllables|countVowels2Test|en|/ænˈdreɪə/}}
{{#invoke:syllables|countVowels2Test|en|/ˈbaɪəʊ/}}
{{#invoke:syllables|countVowels2Test|en|/avə(ʊ)ˈkeɪʃən/}}
{{#invoke:syllables|countVowels2Test|en|/ˈflaʊə/}}
{{#invoke:syllables|countVowels2Test|en|/ˈfaɪ̯ə/}}
{{#invoke:syllables|countVowels2Test|fi|/ˈɑːmiɑi̯sˌmɑjoi̯tus/}}
{{#invoke:syllables|countVowels2Test|sk|/vr̩x/}}
{{#invoke:syllables|countVowels2Test|sk|/vl̩k/}}
{{#invoke:syllables|countVowels2Test|sk|/ˈvr̩ːba/}}
{{#invoke:syllables|countVowels2Test|nl|/ˈɛi̯ərə(n)/}}
{{#invoke:syllables|countVowels2Test|nl|/ˈleːu̯ə(n)/}}
  • "/ˈhaɪweɪ/" текстинде 2 үндүү тыбыш бар.
  • "/ˈloʊɚ/" текстинде 2 үндүү тыбыш бар.
  • "/aɪˈdiə/" текстинде 2 үндүү тыбыш бар. – /iə/ GA-да диссиллабикалык ырааттуулук, ал эми NZде дифтонг; тилекке каршы, диалект үчүн тил коду жок.
  • "/ænˈdreɪə/" текстинде 3 үндүү тыбыш бар.
  • "/ˈbaɪəʊ/" текстинде 2 үндүү тыбыш бар.
  • "/avə(ʊ)ˈkeɪʃən/" текстинде 4 үндүү тыбыш бар.
  • "/ˈflaʊə/" текстинде 2 үндүү тыбыш бар.
  • "/ˈfaɪ̯ə/" текстинде 2 үндүү тыбыш бар.
  • "/ˈɑːmiɑi̯sˌmɑjoi̯tus/" текстинде 6 үндүү тыбыш бар.
  • "/vr̩x/" текстинде 1 үндүү тыбыш бар.
  • "/vl̩k/" текстинде 1 үндүү тыбыш бар.
  • "/ˈvr̩ːba/" текстинде 2 үндүү тыбыш бар.
  • "/ˈɛi̯ərə(n)/" текстинде 3 үндүү тыбыш бар.
  • "/ˈleːu̯ə(n)/" текстинде 2 үндүү тыбыш бар.

local export = {}

local m_str_utils = require("Module:string utilities")

local gsub = m_str_utils.gsub
local match = m_str_utils.match
local toNFD = mw.ustring.toNFD
local U = m_str_utils.char

local diphthongs = mw.loadData("Module:IPA/data").diphthongs
local vowels = mw.loadData("Module:IPA/data/symbols").vowels .. "ᵻ" .. "ᵿ"

--[[ Бул кызыктуу каталог болсо да, учурда бул үчүн эч кандай пайдасы жок.
  Бул фонетикалык транскрипциялар үчүн колдонулушу мүмкүн.
  Үндүүлөргө кошулган диакритиктер:
  үстү тескери бреве, төмөндө тескери бреве,
  өйдө, ылдый чап,
  сол так, оң так,
  диэрезис (жогоруда), диаэрис төмөндө,
  оң жарым шакек, сол жарым шакек,
  төмөндө плюс белгиси, төмөндө минус белгиси,
  жогоруда x бириктирүү, ротикалык илмек,
  тильда (жогоруда), ылдыйда тильда
  лигатура галстук (кош бреваны айкалыштыруу), ылдый байлоо
	]]
local diacritics = U(
	0x311, 0x32F,
	0x31D, 0x31E,
	0x318, 0x319,
	0x308, 0x324,
	0x339, 0x31C,
	0x31F, 0x320,
	0x33D, 0x2DE,
	0x303, 0x330,
	0x361, 0x35C
)

--[[
combining acute and grave tone marks, circumflex
]]--
local tone = "[" .. U(0x341, 0x340, 0x302) .. "]"
local nonsyllabicDiacritics = U(0x311, 0x32F)
local syllabicDiacritics = U(0x0329, 0x030D)
local ties = U(0x361, 0x35C)

-- long, half-long, extra short
local lengthDiacritics = U(0x2D0, 0x2D1, 0x306)
local vowel = "[" .. vowels .. "]" .. tone .. "?"
local tie = "[" .. ties .. "]"
local nonsyllabicDiacritic = "[" .. nonsyllabicDiacritics .. "]"
local syllabicDiacritic = "[" .. syllabicDiacritics .. "]"

local UTF8Char = "[\1-\127\194-\244][\128-\191]*"


function export.getVowels(remainder, lang)
	if string.find(remainder, "^[%[/]?%-") or string.find(remainder, "%-[%[/]?$") then
		return nil
	end	-- If a hyphen is at the beginning or end of the transcription, do not count syllables.
	
	local count = 0
	local diphs = diphthongs[lang:getCode()] or {}
	
	remainder = toNFD(remainder)
	remainder = string.gsub(remainder, "%((.*)%)", "%1") -- Remove parentheses.

	while remainder ~= "" do
		-- Ignore nonsyllabic vowels
		remainder = gsub(remainder, "^" .. vowel .. nonsyllabicDiacritic, "")
		
		local m =
			match(remainder, "^." .. syllabicDiacritic) or  -- Syllabic consonant
			match(remainder, "^" .. vowel .. tie .. vowel)  -- Tie bar
		
		-- Starts with a recognised diphthong?
		for _, diph in ipairs(diphs) do
			if m then
				break
			end
			
			m = m or match(remainder, "^" .. diph)
		end
		
		-- If we haven't found anything yet, just match on a single vowel
		m = m or match(remainder, "^" .. vowel)
		
		if m then
			-- Found a vowel, add it
			count = count + 1
			remainder = string.sub(remainder, #m + 1)
		else
			-- Found a non-vowel, skip it
			remainder = string.gsub(remainder, "^" .. UTF8Char, "")
		end
	end
	
	if count ~= 0 then return count end
	
	return nil
	
end


function export.countVowels2Test(frame)
	local params = {
		[1] = {required = true},
		[2] = {default = ""},
	}
	
	local args = require("Module:parameters").process(frame.args, params)
	
	local lang = require("Module:languages").getByCode(args[1]) or require("Module:languages").err(args[1], 1)
	
	local count = export.getVowels(args[2], lang)
	
	return 'The text "' .. args[2] .. '" contains ' .. count .. ' vowels.'
end


local function countVowels(text)
	text = toNFD(text) or error("Invalid UTF-8")
	
	local _, count = gsub(text, vowel, "")
	local _, sequenceCount = gsub(text, vowel.."+", "")
	local _, nonsyllabicCount = gsub(text, vowel .. nonsyllabicDiacritic, "")
	local _, tieCount = gsub(text, vowel .. tie .. vowel, "")
	
	local diphthongCount = count - (nonsyllabicCount + tieCount)
	
	return count, sequenceCount, diphthongCount
end


local function countDiphthongs(text, lang)
	text = toNFD(text) or error("Invalid UTF-8")
	
	local diphthongs = diphthongs[lang:getCode()] or {}
	
	local _, count
	local total = 0
	
	if diphthongs then
		for i, diphthong in pairs(diphthongs) do
			_, count = gsub(text, diphthong, "")
			total = total + count
		end
	end
	
	return total
end

function export.countVowels(frame)
	local params = {
		[1] = {default = ""},
	}
	
	local args = require("Module:parameters").process(frame.args, params)
	
	local count, sequenceCount, diphthongCount = countVowels(args[1])
	
	local outputs = {}
	table.insert(outputs, (count or 'an unknown number of') .. ' vowels')
	table.insert(outputs, (sequenceCount or 'an unknown number of') .. ' vowel sequences')
	table.insert(outputs, (diphthongCount or 'an unknown number of') .. ' vowels or vowels and diphthongs')
	
	return 'The text "' .. args[1] .. '" contains ' .. mw.text.listToText(outputs) .. "."
end


function export.countVowelsDiphthongs(frame)
	local params = {
		[1] = {required = true},
		[2] = {default = ""},
	}
	
	local args = require("Module:parameters").process(frame.args, params)
	
	local lang = require("Module:languages").getByCode(args[1]) or require("Module:languages").err(args[1], 1)
	
	local vowels = countVowels(args[2])
	local count = vowels - countDiphthongs(args[2], lang) or 0
	
	local out = 'The text "' .. args[2] .. '" contains ' .. (count or 'an unknown number of')
	
	if count == 1 then
		out = out .. ' vowel or diphthong.'
	else
		out = out .. ' vowels or diphthongs.'
	end
	
	return out
end

return export