Module:Linguistique : Différence entre versions

De Lagny-sur-Marne Wiki
Aller à : navigation, rechercher
m
Ligne 5 : Ligne 5 :
  
 
local vowels = 'aeiouyąăẵằẳặȃắâẫấầẩậãäǟāáàȁǎảẚåǻḁạǡæǣǽĕȇêễếềểệḙẽḛëēḕéḗèȅěẻẹęȩḝǝĭȋîĩḭïḯīíìȉǐỉịįıŏȏôỗốồổộõṏṍöōṑóṓòȍǒỏọǫǭơỡớờởợøǿŭȗûṷũṻṹṵüǖǘǜǚṳūúùȕǔủůụųưữứừửựŷỹÿȳýỳỷẙỵ'
 
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
+
-- i18n
return ' '
+
local wordor = ' ou '
end
+
local wordand = ' et '
 +
local comma = ', '
 +
local fullstop = '. '
 +
local wordsep = ' '
  
 
local function isin(str, pattern)
 
local function isin(str, pattern)
Ligne 114 : Ligne 102 :
 
end
 
end
  
function p.conj(args, conjtype, lang)
+
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, conjunction, separator)
 +
end
 +
-- autres cas
 +
if conjtype == 'comma' then
 +
separator = comma
 +
else
 +
separator = conjtype
 +
end
 +
return table.concat(args, separator)
 +
end
 +
 
 +
function p.conj(args, conjtype)
 
if (not args) or (#args == 0) then
 
if (not args) or (#args == 0) then
 
return nil
 
return nil
Ligne 125 : Ligne 134 :
 
end
 
end
 
args = newargs
 
args = newargs
if conjtype == 'comma' then
+
return p.quickconj(newargs, conjtype, lang)
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
 
end
 +
 
function p.conjfromWiki(frame)
 
function p.conjfromWiki(frame)
 
args = frame.args
 
args = frame.args

Version du 29 septembre 2014 à 19:03

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

-- 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 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.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, conjunction, separator)
	end
	-- autres cas
	if conjtype == 'comma' then
		separator = comma
	else
		separator = conjtype
	end
	return table.concat(args, separator)
end

function p.conj(args, conjtype)
	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
	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, lang, conjtype)
end

return p