La documentation pour ce module peut être créée à Module:locution/doc

local p = {}

local loc_langues = mw.loadData('Module:locution/data')

function p.contient_espaces(mot)
    if mot==nil then return nil end
    if (mw.ustring.find(mot, ". .") ~= nil) then
        return true
    else
        return false
    end
end

function p.is_locution(args, article, lang)
	if article == nil or article.text == nil or args == nil then return false end
	local titre = article.text
	
	-- Annexe ? Ne garde que la dernière sous-page
	if article.namespace==100 then
		titre = mw.ustring.gsub(titre, ".+\/", "")
	end
	
    -- Forcé par un paramètre
    if args['locution'] then
    	_ajoute_categorie('Wiktionnaire:Sections de type avec locution forcée')
 
    	if args['locution'] == 'oui' then
    		return true
    	elseif args['locution'] == 'non' then
    		return false
    	else
	    	_ajoute_categorie('Wiktionnaire:Sections avec paramètre locution invalide')
    	end
	end
	
	-- Liste blanche : on peut deviner automatiquement
	if loc_langues[lang] then
		return p.devine_locution(args, article, lang)
	else
		return false
	end
end

function p.devine_locution(args, article, lang)
	if article == nil or article.text == nil or args == nil then return false end
	local titre = article.text
	
    -- Cas spéciaux (par langue)
	if args[1] ~= nil and args[2] ~= nil then
		-- Verbes pronominaux français
		if args[2] == 'fr' and typ.get_nom_singulier(args[1]) == 'verbe' and mw.ustring.find(titre, "^se ") then
			if mw.ustring.find(titre, "^se [^ ]+ ") then
				return true
			else
				return false
			end
		-- Verbes pronominaux bretons
		-- https://fr.wiktionary.org/wiki/Wiktionnaire:Wikid%C3%A9mie/mars_2018#Verbes_pronominaux_en_breton
		elseif args[2] == 'br' and typ.get_nom_singulier(args[1]) == 'verbe' and mw.ustring.find(titre, "^en em ") then
			if mw.ustring.find(titre, "^en em [^ ]+ ") then
					return true
				else
					return false
				end
		-- Verbes pronominaux néerlandais
		elseif args[2] == 'nl' and typ.get_nom_singulier(args[1]) == 'verbe' and mw.ustring.find(titre, "^zich ") then
			if mw.ustring.find(titre, "^zich [^ ]+ ") then
					return true
				else
					return false
				end
		-- Verbes à particule néerlandais
		elseif args[2] == 'nl' and typ.get_nom_singulier(args[1]) == 'verbe'
		-- est-ce que le verbe finit par " aan", " achter", " af", etc ?
		and (mw.ustring.find(titre, " aan$")
		or mw.ustring.find(titre, " aaneen$")
		or mw.ustring.find(titre, " achter") 
		or mw.ustring.find(titre, " achterna$")
		or mw.ustring.find(titre, " achterover$")
		or mw.ustring.find(titre, " achteruit$")
		or mw.ustring.find(titre, " achteruit$")
		or mw.ustring.find(titre, " af$")
		or mw.ustring.find(titre, " beet$")
		or mw.ustring.find(titre, " bij$")  
		or mw.ustring.find(titre, " bijeen$")
		or mw.ustring.find(titre, " binnen$")
		or mw.ustring.find(titre, " bloot$")
		or mw.ustring.find(titre, " boven$")
		or mw.ustring.find(titre, " buiten$")
		or mw.ustring.find(titre, " deel$")
		or mw.ustring.find(titre, " dicht$")
		or mw.ustring.find(titre, " dood$")
		or mw.ustring.find(titre, " door$")
		or mw.ustring.find(titre, " droog$")
		or mw.ustring.find(titre, " fijn$")
		or mw.ustring.find(titre, " gaar$")
		or mw.ustring.find(titre, " gelijk$")
		or mw.ustring.find(titre, " glad$")
		or mw.ustring.find(titre, " goed$")
		or mw.ustring.find(titre, " groot$")
		or mw.ustring.find(titre, " hard$")
		or mw.ustring.find(titre, " in$")
		or mw.ustring.find(titre, " ineen$")
		or mw.ustring.find(titre, " klein$")
		or mw.ustring.find(titre, " kort$")
		or mw.ustring.find(titre, " kwijt$")
		or mw.ustring.find(titre, " lang$")
		or mw.ustring.find(titre, " langs$")
		or mw.ustring.find(titre, " leeg$")
		or mw.ustring.find(titre, " los$")
		or mw.ustring.find(titre, " mede$")
		or mw.ustring.find(titre, " mee$")
		or mw.ustring.find(titre, " mis$")
		or mw.ustring.find(titre, " na$")
		or mw.ustring.find(titre, " neer$")
		or mw.ustring.find(titre, " om$")
		or mw.ustring.find(titre, " omver$")
		or mw.ustring.find(titre, " onder$")
		or mw.ustring.find(titre, " op$")
		or mw.ustring.find(titre, " open$")
		or mw.ustring.find(titre, " opeen$")
		or mw.ustring.find(titre, " over$")
		or mw.ustring.find(titre, " raak$")
		or mw.ustring.find(titre, " recht$")
		or mw.ustring.find(titre, " rond$")
		or mw.ustring.find(titre, " samen$")
		or mw.ustring.find(titre, " scheef$")
		or mw.ustring.find(titre, " schoon$")
		or mw.ustring.find(titre, " stil$")
		or mw.ustring.find(titre, " stuk$")
		or mw.ustring.find(titre, " tegen$")
		or mw.ustring.find(titre, " terecht$")
		or mw.ustring.find(titre, " terug$")
		or mw.ustring.find(titre, " toe$")
		or mw.ustring.find(titre, " uit$")
		or mw.ustring.find(titre, " vast$")
		or mw.ustring.find(titre, " vlak$")
		or mw.ustring.find(titre, " vol$")
		or mw.ustring.find(titre, " voor$")
		or mw.ustring.find(titre, " voort$")
		or mw.ustring.find(titre, " voorbij$")
		or mw.ustring.find(titre, " vooruit$")
		or mw.ustring.find(titre, " vrij$")
		or mw.ustring.find(titre, " weg$")
		or mw.ustring.find(titre, " warm$")
		or mw.ustring.find(titre, " zwart$")) then
			-- On teste la présence d'une seule espace
			if mw.ustring.find(titre, "^[^ ]+ [^ ]+$") then
				return false
			else
				return true
			end
		end
	end
	
    -- Par défaut : espaces = locution
    if p.contient_espaces(titre) then
        return true
    else
    	return false
    end
end

return p