Mòdul:ca-pron

De Viccionari
Salta a la navegació Salta a la cerca
Icona de documentació de mòdul Documentació del mòdul[mostra] [modifica] [refresca]

A continuació es mostra la documentació transclosa de la subpàgina /ús. [salta a la caixa de codi]


Mòdul de suport per la plantilla {{ca-pron}}. Vegeu la documentació de la plantilla.

local p = {}
local utils = require('Mòdul:utilitats')

local function format_afi(text,link)
	local ret = '<span class="IPA" title="pronúncia AFI">' .. text .. '</span>'
	if link then
		if type(link) == "string" then
			ret = "[[Viccionari:Pronúncia de l'alguerès|" .. ret .. ']]'
		else
			ret = '[[Viccionari:Pronúncia del català|' .. ret .. ']]'
		end
	end
	return ret
end

-- Funció d'entrada de la plantilla:ca-pron
function p.plantilla(frame)
	local args = frame:getParent().args
	local pagename = mw.ustring.lower(mw.title.getCurrentTitle().subpageText)
	local namespace = mw.title.getCurrentTitle().nsText
	
	local pron = {}
	if args[1] and string.find(args[1], "/") then
		pron.gen = args[1]
	end
	pron.gen2 = args[2]
	pron.gen3 = args[3]
	pron.ori = args["or"]
	pron.ori2 = args["or2"]
	pron.occ = args["occ"]
	pron.occ2 = args["occ2"]
	pron.cen = args["centr"]
	pron.cen2 = args["centr2"]
	pron.bal = args["bal"]
	pron.bal2 = args["bal2"]
	pron.sep = args["sept"]
	pron.alg = args["alg"]
	pron.noc = args["n-occ"] or args["nocc"]
	pron.noc2 = args["n-occ2"] or args["nocc2"]
	pron.val = args["val"]
	pron.val2 = args["val2"]
	
	local numPron = 0
	for k, v in pairs(pron) do
		if v == "" then
			k = nil
		elseif not string.find(k, "2$") then
			numPron = numPron + 1
		end
	end
	
	if numPron == 0 then
		if namespace == "Plantilla" then
			pron.gen = "/pɾuˈnun.si.ə/"
			numPron = 1
		else
			-- pronúncia automàtica
			pron = require("Mòdul:ca-pron/AFI").show(args[1] or pagename)
			if pron == '' then
				if args.prova then
					return ':* Vocal tònica ambigua'
				else
					return '[[Categoria:Paraules en català sense transcripció fonètica]]'
				end
			end
			pron.alg = args["+alg"]
			pron.sep = args["+sept"]
			for k, v in pairs(pron) do
				if not string.find(k, "2$") then
					numPron = numPron + 1
				end
			end
		end
	end
	
	pron.inf = args["informal"]
	pron.infq = args["inf_q"]
	pron.inf2 = args["informal2"]
	pron.inf2q = args["inf2_q"]
	pron.inf3 = args["informal3"]
	pron.inf3q = args["inf3_q"]
	pron.rima = args["rima"]
	
	-- Formatació
	local ret = {}
	
	table.insert(ret, ':*<span style="font-weight: bold;">Pronúncia</span>: ')
	local dueslinies = numPron > 2 and (pron.ori or pron.cen or pron.sep or pron.bal or pron.alg) and (pron.occ or pron.noc or pron.val)
	local oriocc = pron.ori and pron.occ and not (pron.cen or pron.sep or pron.bal or pron.alg or pron.noc)
	local comma = false
	
	if pron.gen then
		table.insert(ret, format_afi(pron.gen,true))
		if pron.gen2 then
			table.insert(ret, ', ' .. format_afi(pron.gen2,true))
			if pron.gen3 then
				table.insert(ret, ', ' .. format_afi(pron.gen3,true))
			end
		end
		comma = true
	end
	
	if dueslinies then
		table.insert(ret, '\n:: Oriental: ')
		comma = false
	end
	if pron.ori then
		if dueslinies then
			table.insert(ret, format_afi(pron.ori,true))
		elseif oriocc then
			table.insert(ret, 'oriental ' .. format_afi(pron.ori,true))
		else
			table.insert(ret, (comma and ', ' or '') .. 'oriental ' .. format_afi(pron.ori,true))
		end
		if pron.ori2 then
			table.insert(ret, ', ' .. format_afi(pron.ori2,true))
		end
		comma = true
	end
	if pron.cen then
		table.insert(ret, (comma and ', ' or '') .. 'central ' .. format_afi(pron.cen,true))
		if pron.cen2 then
			table.insert(ret, ', ' .. format_afi(pron.cen2,true))
		end
		comma = true
	end
	if pron.sep then
		table.insert(ret, (comma and ', ' or '') .. 'septentrional ' .. format_afi(pron.sep,true))
		comma = true
	end
	if pron.bal then
		table.insert(ret, (comma and ', ' or '') .. 'balear ' .. format_afi(pron.bal,true))
		if pron.bal2 then
			table.insert(ret, ', ' .. format_afi(pron.bal2,true))
		end
		comma = true
	end
	if pron.alg then
		table.insert(ret, (comma and ', ' or '') .. 'alguerès ' .. format_afi(pron.alg, "alg"))
		comma = true
	end
	
	if dueslinies then
		table.insert(ret, '\n:: Occidental: ')
		comma = false
	end
	if pron.occ then
		if dueslinies then
			table.insert(ret, format_afi(pron.occ,true))
		elseif oriocc then
			table.insert(ret, (comma and ', ' or '') .. 'occidental ' .. format_afi(pron.occ,true))
		else
			table.insert(ret, (comma and ', ' or '') .. 'occidental ' .. format_afi(pron.occ,true))
		end
		if pron.occ2 then
			table.insert(ret, ', ' .. format_afi(pron.occ2,true))
		end
		comma = true
	end
	if pron.noc then
		table.insert(ret, (comma and ', ' or '') .. 'nord-occidental ' .. format_afi(pron.noc,true))
		if pron.noc2 then
			table.insert(ret, ', ' .. format_afi(pron.noc2,true))
		end
		comma = true
	end
	if pron.val then
		table.insert(ret, (comma and ', ' or '') .. 'valencià ' .. format_afi(pron.val,true))
		if pron.val2 then
			table.insert(ret, ', ' .. format_afi(pron.val2,true))
		end
		comma = true
	end
	
	if pron.inf then
		table.insert(ret, '\n:: Informal: ' .. format_afi(pron.inf, true))
		if pron.infq then
			table.insert(ret, ' (' .. pron.infq .. ')')
		end
		if pron.inf2 then
			table.insert(ret, ', ' .. format_afi(pron.inf2, true))
			if pron.inf2q then
				table.insert(ret, ' (' .. pron.inf2q .. ')')
			end
		end
		if pron.inf3 then
			table.insert(ret, ', ' .. format_afi(pron.inf3, true))
			if pron.inf3q then
				table.insert(ret, ' (' .. pron.inf3q .. ')')
			end
		end
	end

	-- Rimes
	
	-- formes generals per català occidental
	if pron.val2 and (mw.ustring.find(pron.val2, "v") or mw.ustring.find(pron.val2, "ŋk")) then
		pron.val = pron.val2
	end
	if mw.ustring.find(pron.noc or '', "ˈ.*i\.d͡z") and mw.ustring.find(pron.val or '', "ˈ.*i\.z") then
		pron.occ = pron.noc
	elseif mw.ustring.find(pron.noc or '', "ˈ.*[^͡]ʒ") and mw.ustring.find(pron.val or '', "ˈ.*d͡ʒ") then
		pron.occ = mw.ustring.gsub(pron.val, "d͡ʒ", "ʒ")
	end
	
	local pronrima = pron.rima or pron.occ2 or pron.occ or pron.val or pron.noc or pron.bal or pron.ori or pron.gen2 or pron.gen
	
	-- sense locucions ni prefixos o sufixos
	if pronrima and pronrima ~= "" and not (string.find(pagename, "[^ ]+ [^ ]+") or string.find(pagename, "^-") or string.find(pagename, "-$") or namespace ~= "") then
		pronrima = mw.ustring.gsub(pronrima, "[/\%[%]]", "")
		local pronrimaor = pron.cen or pron.ori or ''
		pronrimaor = mw.ustring.gsub(pronrimaor, "[/\%[%]]", "")
		
		if mw.ustring.find(pronrima, "[rɾ]s?$") and pronrimaor ~= "" and not mw.ustring.find(pronrimaor, "[rɾ]s?$") then
			pronrima = mw.ustring.gsub(pronrima, "[rɾ](s?)$", "(ɾ)%1")
		end
		
		-- número de síl·labes per ordenar categoria de rimes
		pronrima = mw.ustring.gsub(pronrima, "^[ˈˌ]", "")
		_, numsil = mw.ustring.gsub(pronrima, "[.ˌˈ]", "")
		numsil = numsil + 1
		
		-- inici des de l'accent
		local posaccent = mw.ustring.find(pronrima, "ˈ") or 0
		pronrima = mw.ustring.sub(pronrima, posaccent + 1)
		pronrima = mw.ustring.gsub(pronrima, "%.", "")
		
		posaccent = mw.ustring.find(pronrimaor, "ˈ") or 0
		pronrimaor = mw.ustring.sub(pronrimaor, posaccent + 1)
		
		-- inici des de la vocal accentuada
		local vocals = utils.llista({'a','e','ɛ','i','o','ɔ','u'})
		local rima = ''
		for i = 1, mw.ustring.len(pronrima) do
			if vocals[mw.ustring.sub(pronrima, i, i)] then
				rima = mw.ustring.sub(pronrima, i)
				break
			end
		end
		local rimaor = ''
		for i = 1, mw.ustring.len(pronrimaor) do
			if vocals[mw.ustring.sub(pronrimaor, i, i)] then
				rimaor = mw.ustring.sub(pronrimaor, i)
				break
			end
		end
		
		-- substitució d'aproximants
		local from_pron = 'βðɣɫ͡'
		local to_pron   = 'bdɡl'
		for j = 1, mw.ustring.len(from_pron) do
			rima = mw.ustring.gsub(rima, mw.ustring.sub(from_pron, j, j), mw.ustring.sub(to_pron, j, j) or '')
		end
		rima = mw.ustring.gsub(rima, "r([^aeiou])", "ɾ%1")
		rima = mw.ustring.gsub(rima, "r$", "ɾ")
		
		if mw.ustring.find(rima, "^e") and mw.ustring.find(rimaor, "^ɛ") then
			rima = mw.ustring.gsub(rima, "^e", "ɛ")
		end
		
		textrima = p.rima(rima, numsil)
		if textrima ~= '' then
			table.insert(ret, '\n' .. textrima)
		end
	end
	
	return table.concat(ret)
end

-- Funció d'entrada de la plantilla:ca-rima i auxiliar de ca-pron
function p.rima(rima, numsil)
	if type(rima) == "table" then
		local args = rima:getParent().args
		rima = args[1] or ''; if rima == '' then rima = '-' end
		numsil = args[2] or '0'
	end
	
	-- rimes migrades a categoria
	if mw.title.new("Categoria:Rimes en català -" .. rima).exists then
		ret = ':*<span style="font-weight: bold;">Rimes</span>: [[:Categoria:Rimes en català -' .. rima .. '|-' .. rima .. ']]'
		ret = ret .. utils.format_categories({'Rimes en català -' .. rima}, "ca", numsil)
	else
		ret = ''
		utils.track("rimes/" .. rima)
	end
	
	return ret
end

return p