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