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

De Lagny-sur-Marne Wiki
Aller à la navigation Aller à la recherche
0x010D (discussion | contributions)
mAucun résumé des modifications
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))
 
(21 versions intermédiaires par le même utilisateur 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 47 : Ligne 48 :
end
end
str = '(' .. str .. ')'
str = '(' .. str .. ')'
if space then
if not space then
return ' ' .. str
space = ' '
end
end
return str
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 108 : Ligne 113 :
elseif conjtype == 'new line' then
elseif conjtype == 'new line' then
separator = '<br />'
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 152 : Ligne 160 :
end
end


function p.keepcomplement(oldstr, firstword) -- par exemple "gare de Lyon" -> "Lyon"
local function findcomplement(str, beginswith) -- retourne le nom principal et le complément du nom ou nil et nil si échec
local str = mw.ustring.gsub(oldstr, '^' .. firstword .. ' ', '')
local particles = {" de la ", " de l'", " des ", " de l’", " de ", " d’", " d'", " du "}
if str == oldstr then
if beginswith and (not mw.ustring.find(str, "^" .. beginswith)) then
return oldstr
return nil
end
end
local throwable = {"de la ", "de l'", "des ", "de l’", "de ", "d’ ", "d'", "du "}
for i, pattern in pairs(particles) do
for i, j in pairs(throwable) do
local pos = mw.ustring.find(str, pattern)
if mw.ustring.sub(str, 1, #j) == j then
if pos then
str = mw.ustring.gsub(str, j, "")
local main = mw.ustring.sub(str, 1, pos -1)
return str
local comp = mw.ustring.sub(str, pos + string.len(pattern))
return main, comp
end
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
end
return str
return str
end
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)
function p.toascii(str)
local convtable = mw.loadData("Module:Linguistique/ASCII")
local convtable = mw.loadData("Module:Linguistique/ASCII")
Ligne 174 : Ligne 254 :
return str
return str
end
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