« Module:Linguistique » : différence entre les versions

De Lagny-sur-Marne Wiki
Aller à la navigation Aller à la recherche
0x010D (discussion | contributions)
p.quickconj plus rapide
0x010D (discussion | contributions)
m A changé le niveau de protection pour « Module:Linguistique » ([Modifier=Autoriser uniquement les utilisateurs autopatrolled] (infini) [Renommer=Autoriser uniquement les administrateurs] (infini))
 
(46 versions intermédiaires par le même utilisateur 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)
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 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
 
function p.quickconj(args, conjtype) -- ne marche qui si les arguments sont une séquence Lua valide
local separator, conjunction
if conjtype == 'and' then
separator, conjunction = ', ', ' et '
elseif conjtype == 'or' then
separator, conjunction = ', ', ' ou '
elseif conjtype == 'comma' then
separator, conjunction = ', ', ', '
end
end
mw.text.listToText(args, separator, conjunction)
return p.quickconj(newargs, conjtype, lang)
end
end
function p.conjfromWiki(frame)
function p.conjfromWiki(frame)
args = frame.args
args = frame.args
Ligne 168 : Ligne 157 :
end
end
end
end
return p.conj(newargs, lang, conjtype)
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
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

Dernière version du 17 mai 2017 à 13:43

-- 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 = ' ' 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 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 = '
' 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), 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 '^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