Module:Linguistique : Différence entre versions
m (plus pratique sur un site monolingue) |
m (A changé le niveau de protection pour « Module:Linguistique » ([Modifier=Autoriser uniquement les utilisateurs autopatrolled] (infini) [Renommer=Autoriser uniquement les administrateurs] (infini))) |
||
(47 révisions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
− | -- | + | -- 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ąăẵằẳặȃắâẫấầẩậãäǟāáàȁǎảẚåǻḁạǡæǣǽĕȇêễếềểệḙẽḛëēḕéḗèȅěẻẹęȩḝǝĭȋîĩḭïḯīíìȉǐỉịįıŏȏôỗốồổộõṏṍöōṑóṓòȍǒỏọǫǭơỡớờởợøǿŭȗûṷũṻṹṵüǖǘǜǚṳūúùȕǔủůụųưữứừửựŷỹÿȳýỳỷẙỵ' | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | -- i18n | |
− | + | local wordor = ' ou ' | |
− | + | 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 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 | + | 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) |
− | + | if (not str) or str == '' then | |
− | if str == '' then | ||
return str | return str | ||
− | |||
− | |||
− | |||
− | |||
end | end | ||
+ | str = '(' .. str .. ')' | ||
+ | if not space then | ||
+ | space = ' ' | ||
+ | end | ||
+ | return space .. str | ||
end | end | ||
− | function p.of(word | + | function p.of(word, gender, number, determiner, raw) |
− | + | 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 ? | ||
+ | |||
− | + | 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 | ||
− | elseif | ||
return 'de la ' .. word | return 'de la ' .. word | ||
− | + | 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 | + | 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 | + | return noun .. wordsep(lang) .. adj -- lorsque c'est en français |
− | then return | + | 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 | ||
− | -- | + | -- autres cas |
− | if | + | if conjtype == 'comma' then |
− | + | separator = comma | |
− | + | elseif conjtype == 'new line' then | |
− | elseif | + | separator = '<br />' |
− | + | for i, j in pairs(args) do -- ajoute une majuscule | |
+ | args[i] = p.ucfirst(j) | ||
+ | end | ||
else | else | ||
− | + | separator = conjtype | |
end | end | ||
+ | return table.concat(args, separator) | ||
end | end | ||
− | function p.conj(args, conjtype | + | function p.conj(args, conjtype) |
− | if (not args | + | if (not args) then |
return nil | return nil | ||
end | end | ||
Ligne 124 : | Ligne 132 : | ||
end | end | ||
end | end | ||
− | + | if #newargs == 0 then | |
− | + | return nil | |
− | |||
− | |||
− | return | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end | end | ||
+ | return p.quickconj(newargs, conjtype, lang) | ||
end | end | ||
− | + | ||
function p.conjfromWiki(frame) | function p.conjfromWiki(frame) | ||
args = frame.args | args = frame.args | ||
Ligne 157 : | Ligne 157 : | ||
end | end | ||
end | end | ||
− | return p.conj(newargs, | + | 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 | 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 | return p |
Version actuelle datée du 17 mai 2017 à 13:43
La documentation pour ce module peut être créée à Module:Linguistique/doc
-- 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 [[:fr:Italie|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 = '<br />' 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), '[[Category:Pages with incorrect template usage/Conj|A]]' 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 '^[[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) 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