Module:Item

Définition, traduction, prononciation, anagramme et synonyme sur le dictionnaire libre Wiktionnaire.

La documentation pour ce module peut être créée à Module:Item/Documentation

local p = {}
-- mot vedette, stocké dans une variable globale
-- certes un peu grouik mais évite le passage intempestif en paramètre
-- Utiliser uniquement `definir_vedette` pour assigner une valeur
local vedette = ''

-- Assigne à vedette le nom de l'article appelant le modèle qui invoque se module
-- Si le nom contient des barres obliques, seules la partie après la dernière barre oblique est conservée
-- Logiquement cette fonction devrait être appelé une seule fois par invocation du module.
-- Sa valeur devrait ensuite être directement récupéré par la variable globale `vedette`
function definir_vedette()
	-- les opérations sur mw.title sont assez gourmandes, si la valeur a déjà été définie, inutile de la recalculer
	if vedette ~= '' then
		return vedette
	end
	-- récupération du dernier élément de la scission de la chaîne là où apparaît une barre oblique
	-- ceci est fait pour éviter de se retrouver avec des valeurs comme Utilisateur:Psychoslave/accommodation
	-- dans les tableaux de flexion.
	vedette = table.remove(mw.text.split(mw.title.getCurrentTitle().text, '/'))
end

-- mise en emphase du mot vedette
function emphase_vedette(texte)
	emphase = "%1'''%2'''%3"
	-- seul les occurences précédées et suivies d'une espace ou d'une ponctuation sont prises en compte
	cible = '([%s%p’])(' .. vedette .. ')([%s%p])'
	return string.gsub(texte, cible, emphase)
end

-- renvoie le mot vedette
function p.mot_vedette(frame)
	definir_vedette()
	return vedette
end

-- retourne le code langue associé à args.langue
-- en l'état de protypage ne prend en compte que le français
function code_langue(args)
	local langue = args.langue
	if langue == 'français' then
		return 'fr'
	end
	return 'farenda: code_langue'
end

-- retourne la prononciation api
function prononciation(args)
	return args.prononciation_api
end

-- retourne le type de paradigme associé au mot
function paradigme(args)
	local param = args.paradigme_flexionnel
	if param == 'régulier' then
		return 'rég'
	end
	return 'farenda: paradigme'
end

-- renvoie le modèle de flexion
function p.paradigme(frame)
	definir_vedette()
	local args = frame:getParent().args
	local lang = code_langue(args)
	local paradigme = paradigme(args)
	local pron = prononciation(args)
	 -- Exemple {{fr-rég|a.kɔ.mɔ.da.sjɔ̃}}
	local title = table.concat( {lang, '-', paradigme})
	return frame:expandTemplate{ title = title, args = {pron, s = vedette} } 
end

-- Crée le tableau des définitions, ordonné en arborescence à partir de l’ensemble plat des paramètres
--
-- Ainsi pour un tableau avec une entrée comme args['définition.8.exemple.3.description']
-- la fonction renvoie le tableau avec le tableau avec l’entrée defs[8]['exemple'][3]['description']
function gendef(args)
	local defs = {}
	for clef, desc in pairs(args) do
		-- si clef contient qqc comme définition.8.exemple.3.description
		if string.match(clef, 'définition.') then
			composantes = mw.text.split(clef, '%.')
			table.remove(composantes, 1) -- supprime "définition"
			local subtable = defs
			-- pour chaque composante `id`.
			-- Donc dans l’exemple successivement "8", "exemple", "3", "description"
			for i, id in ipairs(composantes) do
				-- convertir la composante en entier si possible, pour avoir une liste ordonnée
				local num = tonumber(id)
				if num then
					id = num
				end
				-- si c’est le dernier élément des composantes, lui affecter la description
				if i == #composantes then
					subtable[id] = desc
					break;
				end
				-- sinon c’est un tableau, éventuellement à créer, dont la clé `id` sera
				-- assigné par la prochaine itération
				if  subtable[id] == nil then
					subtable[id] = {}
				end
				subtable = subtable[id]
			end
		end
	end
	return defs
end

-- formatage d’une description définitionnelle
function formater_desc(description, niveau)
	return table.concat({"\n", string.rep('#', niveau), ' ', description})
end

-- formatage des exemples liés à une définition
-- `terme` est le tableau contenant les exemples
-- `niveau` est un entier qui indique le niveau de profondeur de la définition
function formater_exemples(terme, niveau)
	local description = ''
	local rang = string.rep('#', niveau) .. '*'
	for i, panel in ipairs(terme['exemple']) do
		description = table.concat(
			{
				description, "\n",
				rang,
				" ''",
				emphase_vedette(panel['description']),
				"''"
			}
		)
		-- traitement des sous-éléments d’un exemple, tel qu’une explication de texte ou une 
		-- modernisation de l’orthographe.
		for i, commentaire in ipairs(panel) do
			description = table.concat(
				{
					description,
					'\n',
					rang,
					': ',
					emphase_vedette(commentaire['description'])
				}
			)
		end
	end
	return description
end

-- formatage des définitions en wikitext
function formater(defs, profondeur)
	local niveau = profondeur or 1
	local texte = ""
	for lieu, matos in ipairs(defs) do
		texte = table.concat(
			{
				texte,
				formater_desc(matos["description"], niveau),
				formater_exemples(matos, niveau),
				formater(matos, niveau + 1)
			}
		)
	end
	return texte
end

-- renvoie les définitions formatés en wikitexte
function p.definitions(frame)
	definir_vedette()
	local args = frame:getParent().args
	local defs = gendef(args)
	return formater(defs)
end

return p