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

-- Module de démonstration de construction d'une page de thesaurus à partir de données lua
local p = {}
local cadre = {}

-- renvoie le wikicode du lien vers la page de `entree` si il s’agit d’un titre
-- valide, ou le texte brut sinon
function wikifier(entree)
	local code = ''
	local page = mw.title.new(entree)
	if not page or page.exits == false then
		return entree
		--return cadre:expandTemplate{ title = entree } -- 
	end
	local valeurs = {lien = page.prefixedText, label = entree}
	return formater('[[${lien}|${label}]]', valeurs)
end

-- Renvoie une version formaté en wikicode de liste aborescente des entrées founies
function lister(entrees, profondeur)
	local code = ''
	local indenteur = string.rep('*', profondeur)
	for entree, valeur in pairs(entrees) do
		if type( entree ) == 'number' then
			-- simple entrée sans sous-entrée
			code = string.format('%s%s %s\n', code, indenteur, wikifier(valeur))
		else
			-- entrée avec des sous entrées
			code = string.format('%s%s %s\n%s', code, indenteur, wikifier(entree), lister(valeur, profondeur + 1))
		end
	end
	return code
end

-- Renvoie l’interpolation de la chaîne `texte` avec les variable nommé de `tableau`
--cf : http://lua-users.org/wiki/StringInterpolation
function formater(texte, tableau)
  return (texte:gsub('($%b{})', function(mot) return tableau[mot:sub(3, -2)] or mot end))
end

-- Renvoie le patron de wikitexte à utiliser pour formater chaque section
function formatage_html_section()
	-- à noter que ${liste} n'est pas indenté pour que le wikicode soit convenablement
	-- interprété
	return [==[
== ${titre} ==
<div class="boite">
	<div class="liste-colonnes" style="column-width: 26em; -webkit-column-width: 26em; -moz-column-width: 26em; vertical-align: top; text-align: left;">
${liste}
	<div style="clear:both"></div>
	</div>
</div>
]==]
end

-- Renvoie une version formaté en sections et listes de wikicode du `thesaurus`
function sectionner(thesaurus)
	local format = formatage_html_section()
	local sections = {}
	for section, entrees in pairs(thesaurus) do
		local valeurs = {titre = section, liste = lister(entrees, 1)}
		local texte = formater(format, valeurs)
		table.insert(sections, texte)
	end
	return table.concat(sections)
end

-- Renvoie le titre du module où devraient être stocker les données du thésaurus
-- pour le `theme` et la `langue` fournie
function titre_module(theme, langue)
	return string.format('Module:Thésaurus:%s/%s/données', theme, langue )
end

-- Renvoie une version formaté en wikicode du thesaurus demandé
function p.wikicode(frame)
	cadre = frame
	local contexte = frame:getParent()
	local theme = contexte.args[1]
	local langue = contexte.args[2] or 'français'
	local titre = titre_module(theme, langue)
	local donnees = mw.loadData(titre)
	local entete = frame:expandTemplate{ title = 'en-tête thésaurus', args = { theme }}
	return string.format('%s\n%s', entete, sectionner(donnees.thesaurus))
end

return p