Module:Linguistique : Différence entre versions

De Lagny-sur-Marne Wiki
Aller à : navigation, rechercher
m (A changé le niveau de protection pour « Module:Linguistique » ([Modifier=Autoriser uniquement les utilisateurs autopatrolled] (infini) [Renommer=Autoriser uniquement les administrateurs] (infini)))
 
(32 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 3 : Ligne 3 :
 
local p = {}
 
local p = {}
 
local lang = 'fr'
 
local lang = 'fr'
 +
local langobj = mw.language.new(lang)
  
 
local vowels = 'aeiouyąăẵằẳặȃắâẫấầẩậãäǟāáàȁǎảẚåǻḁạǡæǣǽĕȇêễếềểệḙẽḛëēḕéḗèȅěẻẹęȩḝǝĭȋîĩḭïḯīíìȉǐỉịįıŏȏôỗốồổộõṏṍöōṑóṓòȍǒỏọǫǭơỡớờởợøǿŭȗûṷũṻṹṵüǖǘǜǚṳūúùȕǔủůụųưữứừửựŷỹÿȳýỳỷẙỵ'
 
local vowels = 'aeiouyąăẵằẳặȃắâẫấầẩậãäǟāáàȁǎảẚåǻḁạǡæǣǽĕȇêễếềểệḙẽḛëēḕéḗèȅěẻẹęȩḝǝĭȋîĩḭïḯīíìȉǐỉịįıŏȏôỗốồổộõṏṍöōṑóṓòȍǒỏọǫǭơỡớờởợøǿŭȗûṷũṻṹṵüǖǘǜǚṳūúùȕǔủůụųưữứừửựŷỹÿȳýỳỷẙỵ'
Ligne 39 : Ligne 40 :
  
 
function p.vowelfirst (str)
 
function p.vowelfirst (str)
if str and #str > 0 then return isin(vowels, string.lower(mw.ustring.sub(str, 1, 1))) end
+
if str and #str > 0 then return isin(vowels, mw.ustring.lower(mw.ustring.sub(str, 1, 1))) end
 
end
 
end
  
function p.inparentheses(str)
+
function p.inparentheses(str, lang, space)
 
if (not str) or str == '' then
 
if (not str) or str == '' then
 
return str
 
return str
else
 
return ' (' .. str .. ')'
 
 
end
 
end
 +
str = '(' .. str .. ')'
 +
if not space then
 +
space = ' '
 +
end
 +
return space .. str
 
end
 
end
  
 
function p.of(word, gender, number, determiner, raw)  
 
function p.of(word, gender, number, determiner, raw)  
if not raw then  
+
if not word then
raw = word
+
word = ''
 +
end
 +
word = mw.text.trim( word )
 +
if not raw then --texte non mis en forme pour gérer les élisions
 +
raw = p.texteLien(word) or word
 
end
 
end
 
gender = processgender(gender)
 
gender = processgender(gender)
Ligne 98 : Ligne 106 :
 
end
 
end
 
if (separator and conjunction) then
 
if (separator and conjunction) then
return  mw.text.listToText(args, conjunction, separator)
+
return  mw.text.listToText(args, separator, conjunction)
 
end
 
end
 
-- autres cas
 
-- autres cas
 
if conjtype == 'comma' then
 
if conjtype == 'comma' then
 
separator = comma
 
separator = comma
 +
elseif conjtype == 'new line' then
 +
separator = '<br />'
 +
for i, j in pairs(args) do -- ajoute une majuscule
 +
args[i] = p.ucfirst(j)
 +
end
 
else
 
else
 
separator = conjtype
 
separator = conjtype
Ligne 110 : Ligne 123 :
  
 
function p.conj(args, conjtype)
 
function p.conj(args, conjtype)
if (not args) or (#args == 0) then
+
if (not args) then
 
return nil
 
return nil
 
end
 
end
Ligne 119 : Ligne 132 :
 
end
 
end
 
end
 
end
args = newargs
+
if #newargs == 0 then
 +
return nil
 +
end
 
return p.quickconj(newargs, conjtype, lang)
 
return p.quickconj(newargs, conjtype, lang)
 
end
 
end
Ligne 145 : Ligne 160 :
 
end
 
end
  
 +
local function findcomplement(str, beginswith) -- retourne le nom principal et le complément du nom ou nil et nil si échec
 +
local particles = {" de la ", " de l'", " des ", " de l’", " de ", " d’", " d'", " du "}
 +
if beginswith and (not mw.ustring.find(str, "^" .. beginswith)) then
 +
return nil
 +
end
 +
for i, pattern in pairs(particles) do
 +
local pos = mw.ustring.find(str, pattern)
 +
if pos then
 +
local main = mw.ustring.sub(str, 1, pos -1)
 +
local comp = mw.ustring.sub(str, pos + string.len(pattern))
 +
return main, comp
 +
end
 +
end
 +
return nil
 +
end
 +
 +
 +
function p.keepcomplement(str, beginswith) -- par exemple "gare de Lyon" -> "Lyon"
 +
local main, compl = findcomplement(str, beginswith)
 +
if compl then
 +
return compl
 +
end
 +
return str
 +
end
 +
 +
function p.removecomplement(str, beginswith) -- par exemple "gare de Lyon" -> "gare"
 +
local main, compl = findcomplement(str, beginswith)
 +
if main then
 +
return main
 +
end
 +
return str
 +
end
 +
 +
--[=[
 +
texteLien le lien intere initial '^[[lien|texte]]' de str et retourne : texte, lien
 +
Si le lien est '[[texte]]', retourne : texte, texte.
 +
Si str ne commence pas par un lien interwiki, retourne : nil
 +
]=]
 +
function p.texteLien( str )
 +
if type( str ) == 'string' then
 +
local lien, texte = str:match( '^%[%[ *([^%[%]|]*)|? *([^%[%]]*)%]%]' )
 +
if not lien then
 +
lien, texte = str:match( '^%b<>%[%[ *([^%[%]|]*)|? *([^%[%]]*)%]%]' )
 +
end
 +
if lien then
 +
local testlien = string.lower( lien )
 +
local fichier = string.match( testlien, '^fichier:' )
 +
or  string.match( testlien, '^image:' )
 +
or  string.match( testlien, '^file:' )
 +
if not fichier then
 +
texte = ( texte ~= '' and texte ) or lien
 +
return texte, lien
 +
end
 +
end
 +
end
 +
return nil
 +
end
 +
 +
function p.ucfirst(str)
 +
if (type (str ) ~= 'string') or (string == "") then
 +
return str
 +
end
 +
local strTemp, tag, tagTemp = str, ''
 +
-- sépare les balises html initiales (span ou autres)
 +
while strTemp:match( '^%b<>' ) do
 +
tagTemp, strTemp = strTemp:match( '^(%b<>)(.*)$' )
 +
tag = tag .. tagTemp
 +
end
 +
local texte = p.texteLien( strTemp )
 +
if texte then
 +
-- ajoute les crochets de fin de lien pour être sur de ne remplacer que le texte du lien
 +
texte = texte .. ']]'
 +
-- échappe les caractère magique
 +
local pattern = texte:gsub( '([$%%()*+%-.?()^])', '%%%1' )
 +
-- ajoute la majuscule au texte du lien
 +
str = str:gsub( pattern, p.ucfirst( texte ), 1 )
 +
else
 +
str = tag .. langobj:ucfirst( strTemp )
 +
end
 +
return str
 +
end
 +
 +
function p.ucfirstE(frame)
 +
return p.ucfirst(frame.args[1])
 +
end
 +
 +
--[[
 +
function p.toascii(str)
 +
local convtable = mw.loadData("Module:Linguistique/ASCII")
 +
for i, j in pairs(convtable) do -- manquent les majuscules
 +
str = mw.ustring.gsub(str, '[' .. i .. ']', j)
 +
end
 +
return str
 +
end
 +
]]--
 
return p
 
return p

Version actuelle datée du 17 mai 2017 à 13:43

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

-- Ne fonctionne qu'en français. Si besoin est, on peut s'inspirer de [[wikidata:Module:Linguistic]] pour ajouter d'autres langues.

local p = {}
local lang = 'fr'
local langobj = mw.language.new(lang)

local vowels = 'aeiouyąăẵằẳặȃắâẫấầẩậãäǟāáàȁǎảẚåǻḁạǡæǣǽĕȇêễếềểệḙẽḛëēḕéḗèȅěẻẹęȩḝǝĭȋîĩḭïḯīíìȉǐỉịįıŏȏôỗốồổộõṏṍöōṑóṓòȍǒỏọǫǭơỡớờởợøǿŭȗûṷũṻṹṵüǖǘǜǚṳūúùȕǔủůụųưữứừửựŷỹÿȳýỳỷẙỵ'

-- i18n
local wordor = ' ou '
local wordand = ' et '
local comma = ', '
local fullstop = '. '
local wordsep = ' '

local function isin(str, pattern)
	if str and pattern and mw.ustring.find(str, pattern, 1, true ) then
		return true
	end
end


local function processgender(str)
	if (str == 'f') or (str == 'fem') or (str == 'feminine') then 
		return 'feminine'
	elseif (str == 'n') or (str == 'neutral') then 
		return 'neutral'
	else
		return 'masculine'
	end
end

local function processnumber(str)
	if (str == 'p') or (str == 'plural') then
		return 'plural'
	else 
		return 'singular'
	end
end

function p.vowelfirst (str)
	if str and #str > 0 then return isin(vowels, mw.ustring.lower(mw.ustring.sub(str, 1, 1))) end
end

function p.inparentheses(str, lang, space)
	if (not str) or str == '' then
		return str
	end
	str = '(' .. str .. ')'
	if not space then
		space = '&#32;'
	end
	return space .. str
end

function p.of(word, gender, number, determiner, raw) 
	if not word then
		word = ''
	end
	word = mw.text.trim( word )
	if not raw then  --texte non mis en forme pour gérer les élisions
		raw = p.texteLien(word) or word
	end
	gender = processgender(gender)
	number = processnumber(number)
	local vowel = p.vowelfirst(raw)
	local feminine = (gender== 'feminine')
	-- raw is the string without the Wikiformatting so that it correctly analyses the string that is [[:fr:Italie|Italie]] -> 'italie'
	-- any way to automate this ?

	
	if number == 'plural' then
		return 'des ' .. word
	elseif determiner and (determiner ~= '-') then-- de la, du // determiner ~= '-' veut dire renseigné comme vide
		if vowel then
			return 'de l’' .. word
		elseif feminine then
			return 'de la ' .. word
		else
			return 'du ' .. word
		end
	else
		if vowel then
			return 'd’' .. word
		else
			return 'de ' .. word
		end
	end
end

function p.noungroup(noun, adj)
	if not noun or noun == '' then 
		return nil -- not '' so that it is not counted as a string by mw.listToText
	end
	return noun .. wordsep(lang) .. adj -- lorsque c'est en français
end

function p.quickconj(args, conjtype)
	local separator, conjunction
	
	-- cas où separator ~= conj
	if (not conjtype) or conjtype == 'and' then
		separator, conjunction = comma, wordand
	elseif conjtype == 'or' then
		separator, conjunction = comma, wordor
	end
	if (separator and conjunction) then
		return  mw.text.listToText(args, separator, conjunction)
	end
	-- autres cas
	if conjtype == 'comma' then
		separator = comma
	elseif conjtype == 'new line' then
		separator = '<br />'
		for i, j in pairs(args) do -- ajoute une majuscule
			args[i] = p.ucfirst(j)
		end
	else
		separator = conjtype
	end
	return table.concat(args, separator)
end

function p.conj(args, conjtype)
	if (not args) then
		return nil
	end
	local newargs = {}
	for i, j in pairs(args) do
		if type(j) ~= 'nil' then
			table.insert(newargs, j)
		end
	end
	if #newargs == 0 then
		return nil
	end
	return p.quickconj(newargs, conjtype, lang)
end
 
function p.conjfromWiki(frame)
	args = frame.args
	if not args or not args[1] then
		args = mw.getCurrentFrame():getParent().args
	end
	local conjtype = args.type
	newargs = {}  -- transform args metatable into a table so it can be concetenated
	for i, j in pairs(args) do
			if type(i) == 'number' then
				j = mw.text.trim(j)
				if j ~= '' then
					table.insert(newargs, j)
				end
			else 
				if i ~= 'type' and i ~= 'lang' then 
					return error('bad parameter in template:Conj:' .. i), '[[Category:Pages with incorrect template usage/Conj|A]]'
				end
			end
	end
	return p.conj(newargs, conjtype)
end

local function findcomplement(str, beginswith) -- retourne le nom principal et le complément du nom ou nil et nil si échec
	local particles = {" de la ", " de l'", " des ", " de l’", " de ", " d’", " d'", " du "}
	if beginswith and (not mw.ustring.find(str, "^" .. beginswith)) then
		return nil
	end
	for i, pattern in pairs(particles) do
		local pos = mw.ustring.find(str, pattern)
		if pos then
			local main = mw.ustring.sub(str, 1, pos -1)
			local comp = mw.ustring.sub(str, pos + string.len(pattern))
			return main, comp
		end
	end
	return nil
end


function p.keepcomplement(str, beginswith) -- par exemple "gare de Lyon" -> "Lyon"
	local main, compl = findcomplement(str, beginswith)
	if compl then
		return compl
	end
	return str
end

function p.removecomplement(str, beginswith) -- par exemple "gare de Lyon" -> "gare"
	local main, compl = findcomplement(str, beginswith)
	if main then
		return main
	end
	return str
end

--[=[
	texteLien le lien intere initial '^[[lien|texte]]' de str et retourne : texte, lien
	Si le lien est '[[texte]]', retourne : texte, texte.
	Si str ne commence pas par un lien interwiki, retourne : nil
]=]
function p.texteLien( str )
	if type( str ) == 'string' then
		local lien, texte = str:match( '^%[%[ *([^%[%]|]*)|? *([^%[%]]*)%]%]' )
		if not lien then
			lien, texte = str:match( '^%b<>%[%[ *([^%[%]|]*)|? *([^%[%]]*)%]%]' )
		end
		if lien then
			local testlien = string.lower( lien )
			local fichier = string.match( testlien, '^fichier:' ) 
				or  string.match( testlien, '^image:' )
				or  string.match( testlien, '^file:' )
			if not fichier then
				texte = ( texte ~= '' and texte ) or lien
				return texte, lien
			end
		end
	end
	return nil
end

function p.ucfirst(str)
	if (type (str ) ~= 'string') or (string == "") then
		return str
	end
	local strTemp, tag, tagTemp = str, ''
		-- sépare les balises html initiales (span ou autres)
	while strTemp:match( '^%b<>' ) do
		tagTemp, strTemp = strTemp:match( '^(%b<>)(.*)$' )
		tag = tag .. tagTemp
	end
	local texte = p.texteLien( strTemp )
	if texte then
		-- ajoute les crochets de fin de lien pour être sur de ne remplacer que le texte du lien
		texte = texte .. ']]'
		-- échappe les caractère magique
		local pattern = texte:gsub( '([$%%()*+%-.?()^])', '%%%1' )
		-- ajoute la majuscule au texte du lien
		str = str:gsub( pattern, p.ucfirst( texte ), 1 )
	else
		str = tag .. langobj:ucfirst( strTemp )
	end
	return str
end

function p.ucfirstE(frame)
	return p.ucfirst(frame.args[1])
end

--[[
function p.toascii(str)
	local convtable = mw.loadData("Module:Linguistique/ASCII")
	for i, j in pairs(convtable) do -- manquent les majuscules
		str = mw.ustring.gsub(str, '[' .. i .. ']', j)
	end
	return str
end
]]-- 
return p