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)))
 
(44 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
-- module d'origine multilingue (voir [[wikidata:Module:Linguistic]], d'où une structure d'apparence un peu comple
+
-- 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 p = {}
 
local lang = 'fr'
 
local lang = 'fr'
 +
local langobj = mw.language.new(lang)
  
 
local vowels = 'aeiouyąăẵằẳặȃắâẫấầẩậãäǟāáàȁǎảẚåǻḁạǡæǣǽĕȇêễếềểệḙẽḛëēḕéḗèȅěẻẹęȩḝǝĭȋîĩḭïḯīíìȉǐỉịįıŏȏôỗốồổộõṏṍöōṑóṓòȍǒỏọǫǭơỡớờởợøǿŭȗûṷũṻṹṵüǖǘǜǚṳūúùȕǔủůụųưữứừửựŷỹÿȳýỳỷẙỵ'
 
local vowels = 'aeiouyąăẵằẳặȃắâẫấầẩậãäǟāáàȁǎảẚåǻḁạǡæǣǽĕȇêễếềểệḙẽḛëēḕéḗèȅěẻẹęȩḝǝĭȋîĩḭïḯīíìȉǐỉịįıŏȏôỗốồổộõṏṍöōṑóṓòȍǒỏọǫǭơỡớờởợøǿŭȗûṷũṻṹṵüǖǘǜǚṳūúùȕǔủůụųưữứừửựŷỹÿȳýỳỷẙỵ'
local function wordor(lang)
 
return 'ou'
 
end
 
  
local function comma(lang)
+
-- i18n
return ', '
+
local wordor = ' ou '
end
+
local wordand = ' et '
 
+
local comma = ', '
function p.fullstop(lang)
+
local fullstop = '. '
return '. '
+
local wordsep = ' '
end
 
 
 
local function wordand(lang)
 
return ' et '
 
end
 
 
 
local function wordsep(lang) -- default separator between words
 
return ' '
 
end
 
  
 
local function isin(str, pattern)
 
local function isin(str, pattern)
Ligne 31 : Ligne 20 :
 
end
 
end
  
local function langisin(str, lang)
 
return isin(str, lang .. ' ') -- space is necessary to avoid false positives like zh in zh-hans
 
end
 
  
 
local function processgender(str)
 
local function processgender(str)
Ligne 54 : Ligne 40 :
  
 
function p.vowelfirst (str)
 
function p.vowelfirst (str)
if str then return isin(vowels, str[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, lang)
+
function p.inparentheses(str, lang, space)
--todo: define language with exotic parentheses
+
if (not str) or str == '' then
if str == '' then
 
 
return str
 
return str
else
 
return ' (' .. str .. ')'
 
-- needs internationalization.
 
--Needs leading space in Enlgish because as some languages do not use it, it is part of the formatting
 
 
end
 
end
 +
str = '(' .. str .. ')'
 +
if not space then
 +
space = ' '
 +
end
 +
return space .. str
 
end
 
end
  
function p.of(word, lang, raw, gender, number, determiner) -- rough translation of "of" in various languages
+
function p.of(word, gender, number, determiner, raw)  
-- note that the cases when on "of" is employed varies a lot among languages, so it is more prudent to call this from lang specific function only
+
if not word then
if not raw then  
+
word = ''
raw = 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)
 
number = processnumber(number)
 
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'
 
-- 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 ?
 
-- any way to automate this ?
 +
 
 
-- todo: ca to replace Template:Of/ca
+
if number == 'plural' then
+
return 'des ' .. word
if lang == 'fr' then
+
elseif determiner and (determiner ~= '-') then-- de la, du // determiner ~= '-' veut dire renseigné comme vide
if number == 'plural' then
+
if vowel then
return 'des ' .. word
+
return 'de l’' .. word
elseif p.vowelfirst(raw) then
+
elseif feminine then
return 'de l\'' .. word
 
elseif gender == 'feminine' then
 
 
return 'de la ' .. word
 
return 'de la ' .. word
elseif derterminer then
+
else
 
return 'du ' .. word
 
return 'du ' .. word
 +
end
 +
else
 +
if vowel then
 +
return 'd’' .. word
 
else
 
else
 
return 'de ' .. word
 
return 'de ' .. word
 
end
 
end
end
+
end
 
 
 
end
 
end
  
function p.noungroup(noun, adj, lang)
+
function p.noungroup(noun, adj)
 
if not noun or noun == '' then  
 
if not noun or noun == '' then  
 
return nil -- not '' so that it is not counted as a string by mw.listToText
 
return nil -- not '' so that it is not counted as a string by mw.listToText
 
end
 
end
if not adj or adj == ''
+
return noun .. wordsep(lang) .. adj -- lorsque c'est en français
then return noun
+
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
 
end
-- adjective before the noun
+
-- autres cas
if langisin('de de-at de-ch en en-ca en-gb pl zh zh-hans zh-hant zh-my zh-cn zh-sg zh-tw ', lang) then
+
if conjtype == 'comma' then
return adj .. wordsep(lang) .. noun
+
separator = comma
-- adjective after the noun
+
elseif conjtype == 'new line' then
elseif langisin('fr fr-ca es it') then
+
separator = '<br />'
return noun .. wordsep(lang) .. adj
+
for i, j in pairs(args) do -- ajoute une majuscule
 +
args[i] = p.ucfirst(j)
 +
end
 
else
 
else
return noun ' (' .. adj .. ')'
+
separator = conjtype
 
end
 
end
 +
return table.concat(args, separator)
 
end
 
end
  
function p.conj(args, conjtype, lang)
+
function p.conj(args, conjtype)
if (not args) or (#args == 0) then
+
if (not args) then
 
return nil
 
return nil
 
end
 
end
Ligne 124 : Ligne 132 :
 
end
 
end
 
end
 
end
args = newargs
+
if #newargs == 0 then
if conjtype == 'comma' then
+
return nil
return mw.text.listToText(args, comma(lang), comma(lang))
 
elseif conjtype == 'or' then  
 
return mw.text.listToText(args, comma(lang), wordor(lang)  .. wordsep(lang))
 
elseif conjtype == 'explicit or' then -- adds "or" betwen all words when the context can be confusing
 
return mw.text.listToText(args, wordor(lang) .. wordsep(lang), wordor(lang)  .. wordsep(lang))
 
elseif conjtype then
 
return mw.text.listToText(args, conjtype, conjtype)
 
else
 
return mw.text.listToText(args, comma(lang), wordand(lang) .. wordsep(lang))
 
 
end
 
end
 +
return p.quickconj(newargs, conjtype, lang)
 
end
 
end
 
+
function p.quickconj(args, conjtype) -- ne marche qui si les arguments sont une séquence Lua valide
 
local separator, conjunction
 
if (not conjtype) or conjtype == 'and' then
 
separator, conjunction = ', ', ' et '
 
elseif conjtype == 'or' then
 
separator, conjunction = ', ', ' ou '
 
elseif conjtype == 'comma' then
 
separator, conjunction = ', ', ', '
 
else
 
separator, conjunction = conjtype, conjtype
 
end
 
return mw.text.listToText(args, separator, conjunction)
 
end
 
 
function p.conjfromWiki(frame)
 
function p.conjfromWiki(frame)
 
args = frame.args
 
args = frame.args
Ligne 170 : Ligne 157 :
 
end
 
end
 
end
 
end
return p.conj(newargs, lang, conjtype)
+
return p.conj(newargs, conjtype)
 
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