Module:Sandbox/PiperMcCorkle/Linguistique explained
-- Ne fonctionne qu'en français. Si besoin est, on peut s'inspirer de pour ajouter d'autres langues.
local p = local lang = 'fr'local langobj = mw.language.new(lang)
local vowels = 'aeiouyąăẵằẳặȃắâẫấầẩậãäǟāáàȁǎảẚåǻḁạǡæǣǽĕȇêễếềểệḙẽḛëēḕéḗèȅěẻẹęȩḝǝĭȋîĩḭïḯīíìȉǐỉịįıŏȏôỗốồổộõṏṍöōṑóṓòȍǒỏọǫǭơỡớờởợøǿŭȗûṷũṻṹṵüǖǘǜǚṳūúùȕǔủůụųưữứừửựŷỹÿȳýỳỷẙỵ'
-- i18nlocal 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 endend
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' endend
local function processnumber(str) if (str
'p') or (str
'plural') then return 'plural' else return 'singular' endend
function p.vowelfirst (str) if str and #str > 0 then return isin(vowels, mw.ustring.lower(mw.ustring.sub(str, 1, 1))) endend
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 .. strend
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 endend
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çaisend
function p.quickconj(args, conjtype) local separator, conjunction -- cas où separator ~= conj if type(conjtype)
'function' then conjtype = conjtype end 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 table.insert(newargs, j) 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 = 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 nilend
function p.keepcomplement(str, beginswith) -- par exemple "gare de Lyon" -> "Lyon" local main, compl = findcomplement(str, beginswith) if compl then return compl end return strend
function p.removecomplement(str, beginswith) -- par exemple "gare de Lyon" -> "gare" local main, compl = findcomplement(str, beginswith) if main then return main end return strend
--[=[
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 nilend
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 strend
function p.ucfirstE(frame) return p.ucfirst(frame.args[1])end
function p.lcfirst(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.lcfirst(texte), 1) else str = tag .. langobj:lcfirst(strTemp) end return strend
function p.lcfirstE(frame) return p.lcfirst(frame.args[1])end
---- return p