Module:Linguistique

De Lagny-sur-Marne Wiki
Révision datée du 29 septembre 2014 à 17:35 par Zolo (discussion)
Aller à : navigation, rechercher

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

-- module d'origine multilingue (voir [[wikidata:Module:Linguistic]], d'où une structure d'apparence un peu comple

local p = {}
local lang = 'fr'

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

local function comma(lang)
	return ', '
end

function p.fullstop(lang)
	return '. '
end

local function wordand(lang)
	return ' et '
end

local function wordsep(lang) -- default separator between words
	return ' '
end	

local function isin(str, pattern)
	if str and pattern and mw.ustring.find(str, pattern, 1, true ) then
		return true
	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)
	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 then return isin(vowels, str[1]) end
end

function p.inparentheses(str, lang)
	--todo: define language with exotic parentheses
	if str == '' then
		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

function p.of(word, lang, raw, gender, number, determiner) -- rough translation of "of" in various languages
-- 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 raw then 
		raw = word
	end
	gender = processgender(gender)
	number = processnumber(number)
	-- 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 ?
	
	-- todo: ca to replace Template:Of/ca
	
	if lang == 'fr' then 
		if number == 'plural' then
			return 'des ' .. word
		elseif p.vowelfirst(raw) then
			return 'de l\'' .. word
		elseif gender == 'feminine' then
			return 'de la ' .. word
		elseif derterminer then
			return 'du ' .. word
		else
			return 'de ' .. word
		end
	end	

end

function p.noungroup(noun, adj, lang)
	if not noun or noun == '' then 
		return nil -- not '' so that it is not counted as a string by mw.listToText
	end
	if not adj or adj == ''
		then return noun
	end
	-- adjective before the noun
	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
		return adj .. wordsep(lang) .. noun
	-- adjective after the noun
	elseif langisin('fr fr-ca es it') then
		return noun .. wordsep(lang) .. adj
	else
		return noun ' (' .. adj .. ')'
	end
end

function p.conj(args, conjtype, lang)
	if (not args) or (#args == 0) then
		return nil
	end
	local newargs = {}
	for i, j in pairs(args) do
		if type(j) ~= 'nil' then
			table.insert(newargs, j)
		end
	end
	args = newargs
	if conjtype == 'comma' then
		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

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)
	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, lang, conjtype)
end

return p