Module:Country data : Différence entre versions
(getDemonym : c'est l'adjectif qui doit être mis en majuscule, le gentilé devrait déjà y être) |
|||
(36 révisions intermédiaires par 5 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
− | + | --[[ | |
− | + | This module is intended to replace the functionality of {{drapeau2}} and related | |
+ | templates. It provides several methods, including | ||
+ | ]] | ||
− | local function | + | local p = {}; |
− | -- | + | |
− | + | local gdata = mw.loadData ("Module:Country data/liste" ) | |
− | -- | + | local dates = require "Module:date complexe" |
− | + | local linguistic = require "Module:Linguistique" | |
− | + | ||
+ | local function _getCompetition(c,aaaa) | ||
+ | local gdomain = mw.loadData ( "Module:Drapeau/Domaine" ) -- chargé seulement sur les articles où ça sert, ça prend un peu de place | ||
+ | |||
+ | local symbs = { | ||
+ | ['cm'] = "à la Coupe du monde", | ||
+ | ['coupedumonde'] = "à la Coupe du monde", | ||
+ | ['ce'] = "au championnat d'Europe", | ||
+ | ['euro'] = "au championnat d'Europe", | ||
+ | ['chm'] = "au championnat du monde", | ||
+ | ['can'] = "à la Coupe des Confédérations", | ||
+ | ['coupedesconfederations'] = "à la Coupe des Confédérations", | ||
+ | ['en'] = "en", | ||
+ | ['jo'] = "aux Jeux olympiques", | ||
+ | ['jp'] = "aux Jeux paralympiques", | ||
+ | } | ||
+ | |||
+ | local str = symbs[string.lower(c or '')] or "" | ||
+ | |||
+ | --edition | ||
+ | if(aaaa ~= nil and aaaa ~= "") then | ||
+ | if(c=="jo" or c=="jp" ) then | ||
+ | local o=gdomain.jo["_"..aaaa]; | ||
+ | if(o ~= nil) then | ||
+ | str = str .." "..o | ||
+ | end | ||
+ | else | ||
+ | str = str .." "..aaaa | ||
+ | end | ||
end | end | ||
− | return | + | |
+ | return str | ||
end | end | ||
− | function | + | local function printFlag(flagfile, alt, displayformat) |
− | local | + | |
− | if not | + | displayformat = displayformat or {} |
− | + | local size = displayformat.size or '20x15' | |
+ | local border = 'border|' | ||
+ | |||
+ | if displayformat.border == '-' then | ||
+ | border = '' | ||
+ | end | ||
+ | |||
+ | if not alt then | ||
+ | alt = '' | ||
end | end | ||
− | if not | + | return '<span class="flagicon">' .. |
− | + | '[[Fichier:' .. flagfile .. '|' .. size ..'px|' .. border .. alt ..']]' .. | |
+ | '</span>'; | ||
+ | end | ||
+ | |||
+ | local function bestfordate(data, period) -- data contient une table dont les clés sont des dates au format ['2010'] = ou ['2010-05-04'] = | ||
+ | if type(data) == 'string' then | ||
+ | return data | ||
+ | end | ||
+ | |||
+ | -- très artisanal, à améliorer | ||
+ | if (not period) or (period == 'default') then | ||
+ | return data.default | ||
end | end | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | if | + | local val = data.default |
− | + | local bestdate = '-1000-01-01' | |
+ | for i, j in pairs(data) do | ||
+ | if j ~= 'default' and dates.before(period, i) and dates.before(i, bestdate) then -- si la valeur est plus récente que period moins récente que la best trouvée | ||
+ | val = j | ||
+ | bestdate = i | ||
+ | end | ||
+ | end | ||
+ | return val | ||
+ | end | ||
+ | |||
+ | |||
+ | local function valueAtDate(data, period, topic) -- topic: type de drapeau, genre de l'adjectif, etc. | ||
+ | if type(data) == 'string' or type(data) == 'nil' then | ||
+ | return data | ||
+ | end | ||
+ | if type(data) ~= 'table' then | ||
+ | return error('bad datatabpe ' .. type(data)) | ||
+ | end | ||
+ | topic = topic or "default" | ||
+ | if data[topic] then | ||
+ | return bestfordate(data[topic], period) | ||
else | else | ||
− | flag = '' | + | return bestfordate(data, period) |
+ | end | ||
+ | return error() | ||
+ | end | ||
+ | |||
+ | local function getData(datatable, typedata, topic, period) -- récupère la chaîne de caractère la plus appropriée dans la datatable | ||
+ | -- datatable: la table de sous module par exemple [[Module:Country data/grenade]] | ||
+ | -- typedata: "flag" / "name" / "adjective" | ||
+ | -- period: data in ISO format | ||
+ | -- topic: for instance "navy" for naval ensign | ||
+ | local val = datatable[typedata] | ||
+ | |||
+ | if not val then -- error handling ? | ||
+ | return nil | ||
+ | end | ||
+ | |||
+ | local val = valueAtDate(val, period, topic) | ||
+ | |||
+ | if type(val) ~= 'string' then -- error handling ? | ||
+ | return error(val) | ||
end | end | ||
− | return | + | return val |
end | end | ||
+ | |||
+ | local function getAdjective(data, gender, number) | ||
+ | if not gender then | ||
+ | gender = 'm' | ||
+ | end | ||
+ | if not number then | ||
+ | number = 's' | ||
+ | end | ||
+ | if (gender ~= 'm' and gender ~= 'f') then | ||
+ | return error('gender should be m or f is ' .. gender) | ||
+ | end | ||
+ | if (number ~= 's' and number ~= 'p') then | ||
+ | return error('number should be s or p is ' .. number) | ||
+ | end | ||
+ | return getData(data, 'adjective', (gender .. number)) | ||
+ | end | ||
+ | |||
+ | local function getDemonym (data, gender, number) | ||
+ | if data.demonym == nil then | ||
+ | return linguistic.ucfirst( getAdjective(data, gender, number) ) | ||
+ | end | ||
+ | gender = gender or 'm' | ||
+ | number = number or 's' | ||
+ | if (gender ~= 'm' and gender ~= 'f') then | ||
+ | return error('gender should be m or f is ' .. gender) | ||
+ | end | ||
+ | if (number ~= 's' and number ~= 'p') then | ||
+ | return error('number should be s or p is ' .. number) | ||
+ | end | ||
+ | return getData(data, 'demonym', (gender .. number)) | ||
+ | end | ||
+ | |||
+ | local function getLabel(data, topic, period, form) | ||
+ | local label | ||
+ | if (not form) or form == 'short' then | ||
+ | label = getData(data, 'shortname', topic, period) | ||
+ | end | ||
+ | if not label then | ||
+ | label = getData(data, 'name') | ||
+ | end | ||
+ | if (not label) and data.item then | ||
+ | label = mw.wikibase.label(getData(data, 'item')) | ||
+ | end | ||
+ | return label | ||
+ | end | ||
+ | |||
+ | local function getLink(data, topic, period) | ||
+ | local link = getData(data, 'link', topic, period) | ||
+ | if (not link) and data.item then | ||
+ | link = mw.wikibase.label(getData(data, 'item')) | ||
+ | end | ||
+ | return link | ||
+ | end | ||
+ | |||
+ | local function applyregex(str, areadata) | ||
+ | local cio = 'code CIO (en attente)' --require('Module:Wikidata')._formatStatements({entity= areadata.item, property= 'P984'}) or '??' | ||
+ | |||
+ | local label = getData(areadata, 'name') | ||
+ | local of = linguistic.of(label, areadata.genre) | ||
+ | |||
+ | str = mw.ustring.gsub(str, '$de$label', of) | ||
+ | str = mw.ustring.gsub(str, '$label', label) | ||
+ | str = mw.ustring.gsub(str, '$cio', 'cio') | ||
+ | |||
+ | if string.find(str, '$gentile') then | ||
+ | local function get(genre) return getData(areadata, 'adjective', genre) end | ||
+ | local gentileMS, gentileFS, gentileMP, gentileFP = get('ms'), get('fs'), get('mp'), get('fp') | ||
+ | str = mw.ustring.gsub(str, '$gentileMS', gentileMS) | ||
+ | str = mw.ustring.gsub(str, '$gentileFS', gentileFS) | ||
+ | str = mw.ustring.gsub(str, '$gentileMP', gentileMP) | ||
+ | str = mw.ustring.gsub(str, '$gentileFP', gentileFP) | ||
+ | end | ||
+ | return str | ||
+ | end | ||
+ | |||
+ | local function getDatatable(zone) | ||
+ | zone = mw.ustring.lower(zone) | ||
+ | if gdata[zone] then | ||
+ | return require('Module:Country data/' .. gdata[zone]) | ||
+ | else -- si le module existe mais n'est pas dans la liste | ||
+ | return require('Module:Country data/' .. zone) | ||
+ | end | ||
+ | end | ||
+ | |||
+ | |||
+ | local function flagIcon(data, flagtype, period, displayformat) | ||
+ | local flagimage = getData(data, 'flag', flagtype, period) | ||
+ | if flagimage then | ||
+ | return printFlag(flagimage, '', displayformat) | ||
+ | end | ||
+ | end | ||
+ | |||
+ | function p.standarddisplay(zone, args) | ||
+ | if not zone then | ||
+ | return nil | ||
+ | end | ||
+ | -- nettoyage des paramètres | ||
+ | if not args then | ||
+ | args = {} | ||
+ | end | ||
+ | for i, j in pairs(args) do | ||
+ | args[i] = mw.text.trim(j) -- remove whitespaces | ||
+ | if args[i] == '' then args[i] = nil end | ||
+ | end | ||
+ | |||
+ | -- ajout des valeurs par défaut | ||
+ | local size = args.flagsize or '20x15' | ||
+ | local flagtype = args.type | ||
+ | |||
+ | local align = args.align or 'left' | ||
+ | local link = args.link | ||
+ | local period = args.date | ||
+ | local competition = args.competition | ||
+ | local edition = args.edition | ||
+ | local extra = '' | ||
+ | |||
+ | local success, data = pcall(getDatatable, zone) | ||
+ | if not success then | ||
+ | if args.strict then | ||
+ | return error('lieu non reconnu') | ||
+ | end | ||
+ | return nil | ||
+ | end | ||
+ | |||
+ | -- image | ||
+ | local flag = flagIcon(data, flagtype, period) | ||
+ | if (args.label == '-') then | ||
+ | return flag, true | ||
+ | end | ||
+ | |||
+ | -- text | ||
+ | local text | ||
+ | local label = getLabel(data, flagtype) | ||
+ | local link = getLink(data, flagtype) | ||
+ | |||
+ | if competition then | ||
+ | competition = _getCompetition(linguistic.toascii(competition),args["édition"]) | ||
+ | end | ||
+ | if link and competition then | ||
+ | link = link .. ' ' .. competition | ||
+ | end | ||
+ | |||
+ | if link then | ||
+ | text = '[[' .. link .. '|' .. label .. ']]' | ||
+ | end | ||
+ | |||
+ | -- si les données sont extraites d'un formulaire standard comme module:Drapeau/domain, appliquer des regex | ||
+ | if string.match(text, '%$') then | ||
+ | text = applyregex(text, data) | ||
+ | end | ||
+ | |||
+ | local val | ||
+ | if align == 'right' then | ||
+ | val = text .. ' ' .. flag | ||
+ | else | ||
+ | val = flag .. ' ' .. text | ||
+ | end | ||
+ | |||
+ | return val, true -- true indique le succès | ||
+ | end | ||
+ | |||
+ | function p.nationality(zone, gender, number, topic, period) | ||
+ | local success, data = pcall(getDatatable, zone) | ||
+ | if not success then return | ||
+ | zone | ||
+ | end | ||
+ | |||
+ | local str = getDemonym(data, gender, number) | ||
+ | if not str then | ||
+ | return zone | ||
+ | end | ||
+ | local link = getLink(data, topic, period) | ||
+ | if link then | ||
+ | str = '[[' .. link .. '|' .. str .. ']]' | ||
+ | end | ||
+ | return str, true-- true indique le succès | ||
+ | end | ||
+ | |||
+ | |||
+ | function p.getNationality(args) -- pour obtenir la nationalité d'une personne sur Wikidata sous forme d'adjectifs | ||
+ | if not args then | ||
+ | return nil | ||
+ | end | ||
+ | local wikidata = require "Module:Interface Wikidata".fromLua | ||
+ | local complexdate = require "Module:Date complexe" | ||
+ | |||
+ | if type(args) == 'string' then -- si un seul argument, c'est l'entité à utiliser | ||
+ | args {item = args} | ||
+ | end | ||
+ | if args.args then -- si vient de frame | ||
+ | args = args.args | ||
+ | end | ||
+ | local item = args.item or args[1] | ||
+ | |||
+ | -- établit la variable gender pour l'élément | ||
+ | local vals = { | ||
+ | ['Q6581072'] = 'f', | ||
+ | ['Q6581097'] = 'm', | ||
+ | default = '?' | ||
+ | } | ||
+ | local gender = args.gender | ||
+ | if not gender then | ||
+ | gender = wikidata.formatStatements{entity = item, property = 'P21', displayformat = 'raw'} | ||
+ | gender = vals[gender] or vals.default | ||
+ | end | ||
+ | -- désactivation si date de naissance avant l'Ère contemporaine : trop d'imprécisions et d'anachronismes | ||
+ | local mindate = args.mindate or '1789' | ||
+ | if mindate ~= "-" then | ||
+ | local birthdate = wikidata.formatStatements{entity = item, property = 'P569', displayformat = 'raw', numval = 1} | ||
+ | if (not birthdate) or complexdate.before(mindate, birthdate) then | ||
+ | return nil | ||
+ | end | ||
+ | end | ||
+ | return wikidata.formatStatements{ | ||
+ | property = 'P27', | ||
+ | vals = statements, | ||
+ | showdate = true, | ||
+ | entity = item, | ||
+ | conjtype = 'and', | ||
+ | removedupes = true, | ||
+ | linktopic = '-', | ||
+ | displayformat = | ||
+ | function(snak) | ||
+ | local g = gender -- genre de la personne, pour affichage du gentilé | ||
+ | if g == '?' then -- si inconnu, au masculin | ||
+ | g = 'm' | ||
+ | end | ||
+ | local val, success = p.nationality(wikidata.getid(snak), g) | ||
+ | if not success then | ||
+ | val = wikidata.formatSnak(snak) | ||
+ | end | ||
+ | return val | ||
+ | end | ||
+ | } | ||
+ | end | ||
+ | |||
return p | return p |
Version actuelle datée du 30 novembre 2016 à 10:32
La documentation pour ce module peut être créée à Module:Country data/doc
--[[ This module is intended to replace the functionality of {{drapeau2}} and related templates. It provides several methods, including ]] local p = {}; local gdata = mw.loadData ("Module:Country data/liste" ) local dates = require "Module:date complexe" local linguistic = require "Module:Linguistique" local function _getCompetition(c,aaaa) local gdomain = mw.loadData ( "Module:Drapeau/Domaine" ) -- chargé seulement sur les articles où ça sert, ça prend un peu de place local symbs = { ['cm'] = "à la Coupe du monde", ['coupedumonde'] = "à la Coupe du monde", ['ce'] = "au championnat d'Europe", ['euro'] = "au championnat d'Europe", ['chm'] = "au championnat du monde", ['can'] = "à la Coupe des Confédérations", ['coupedesconfederations'] = "à la Coupe des Confédérations", ['en'] = "en", ['jo'] = "aux Jeux olympiques", ['jp'] = "aux Jeux paralympiques", } local str = symbs[string.lower(c or '')] or "" --edition if(aaaa ~= nil and aaaa ~= "") then if(c=="jo" or c=="jp" ) then local o=gdomain.jo["_"..aaaa]; if(o ~= nil) then str = str .." "..o end else str = str .." "..aaaa end end return str end local function printFlag(flagfile, alt, displayformat) displayformat = displayformat or {} local size = displayformat.size or '20x15' local border = 'border|' if displayformat.border == '-' then border = '' end if not alt then alt = '' end return '<span class="flagicon">' .. '[[Fichier:' .. flagfile .. '|' .. size ..'px|' .. border .. alt ..']]' .. '</span>'; end local function bestfordate(data, period) -- data contient une table dont les clés sont des dates au format ['2010'] = ou ['2010-05-04'] = if type(data) == 'string' then return data end -- très artisanal, à améliorer if (not period) or (period == 'default') then return data.default end local val = data.default local bestdate = '-1000-01-01' for i, j in pairs(data) do if j ~= 'default' and dates.before(period, i) and dates.before(i, bestdate) then -- si la valeur est plus récente que period moins récente que la best trouvée val = j bestdate = i end end return val end local function valueAtDate(data, period, topic) -- topic: type de drapeau, genre de l'adjectif, etc. if type(data) == 'string' or type(data) == 'nil' then return data end if type(data) ~= 'table' then return error('bad datatabpe ' .. type(data)) end topic = topic or "default" if data[topic] then return bestfordate(data[topic], period) else return bestfordate(data, period) end return error() end local function getData(datatable, typedata, topic, period) -- récupère la chaîne de caractère la plus appropriée dans la datatable -- datatable: la table de sous module par exemple [[Module:Country data/grenade]] -- typedata: "flag" / "name" / "adjective" -- period: data in ISO format -- topic: for instance "navy" for naval ensign local val = datatable[typedata] if not val then -- error handling ? return nil end local val = valueAtDate(val, period, topic) if type(val) ~= 'string' then -- error handling ? return error(val) end return val end local function getAdjective(data, gender, number) if not gender then gender = 'm' end if not number then number = 's' end if (gender ~= 'm' and gender ~= 'f') then return error('gender should be m or f is ' .. gender) end if (number ~= 's' and number ~= 'p') then return error('number should be s or p is ' .. number) end return getData(data, 'adjective', (gender .. number)) end local function getDemonym (data, gender, number) if data.demonym == nil then return linguistic.ucfirst( getAdjective(data, gender, number) ) end gender = gender or 'm' number = number or 's' if (gender ~= 'm' and gender ~= 'f') then return error('gender should be m or f is ' .. gender) end if (number ~= 's' and number ~= 'p') then return error('number should be s or p is ' .. number) end return getData(data, 'demonym', (gender .. number)) end local function getLabel(data, topic, period, form) local label if (not form) or form == 'short' then label = getData(data, 'shortname', topic, period) end if not label then label = getData(data, 'name') end if (not label) and data.item then label = mw.wikibase.label(getData(data, 'item')) end return label end local function getLink(data, topic, period) local link = getData(data, 'link', topic, period) if (not link) and data.item then link = mw.wikibase.label(getData(data, 'item')) end return link end local function applyregex(str, areadata) local cio = 'code CIO (en attente)' --require('Module:Wikidata')._formatStatements({entity= areadata.item, property= 'P984'}) or '??' local label = getData(areadata, 'name') local of = linguistic.of(label, areadata.genre) str = mw.ustring.gsub(str, '$de$label', of) str = mw.ustring.gsub(str, '$label', label) str = mw.ustring.gsub(str, '$cio', 'cio') if string.find(str, '$gentile') then local function get(genre) return getData(areadata, 'adjective', genre) end local gentileMS, gentileFS, gentileMP, gentileFP = get('ms'), get('fs'), get('mp'), get('fp') str = mw.ustring.gsub(str, '$gentileMS', gentileMS) str = mw.ustring.gsub(str, '$gentileFS', gentileFS) str = mw.ustring.gsub(str, '$gentileMP', gentileMP) str = mw.ustring.gsub(str, '$gentileFP', gentileFP) end return str end local function getDatatable(zone) zone = mw.ustring.lower(zone) if gdata[zone] then return require('Module:Country data/' .. gdata[zone]) else -- si le module existe mais n'est pas dans la liste return require('Module:Country data/' .. zone) end end local function flagIcon(data, flagtype, period, displayformat) local flagimage = getData(data, 'flag', flagtype, period) if flagimage then return printFlag(flagimage, '', displayformat) end end function p.standarddisplay(zone, args) if not zone then return nil end -- nettoyage des paramètres if not args then args = {} end for i, j in pairs(args) do args[i] = mw.text.trim(j) -- remove whitespaces if args[i] == '' then args[i] = nil end end -- ajout des valeurs par défaut local size = args.flagsize or '20x15' local flagtype = args.type local align = args.align or 'left' local link = args.link local period = args.date local competition = args.competition local edition = args.edition local extra = '' local success, data = pcall(getDatatable, zone) if not success then if args.strict then return error('lieu non reconnu') end return nil end -- image local flag = flagIcon(data, flagtype, period) if (args.label == '-') then return flag, true end -- text local text local label = getLabel(data, flagtype) local link = getLink(data, flagtype) if competition then competition = _getCompetition(linguistic.toascii(competition),args["édition"]) end if link and competition then link = link .. ' ' .. competition end if link then text = '[[' .. link .. '|' .. label .. ']]' end -- si les données sont extraites d'un formulaire standard comme module:Drapeau/domain, appliquer des regex if string.match(text, '%$') then text = applyregex(text, data) end local val if align == 'right' then val = text .. ' ' .. flag else val = flag .. ' ' .. text end return val, true -- true indique le succès end function p.nationality(zone, gender, number, topic, period) local success, data = pcall(getDatatable, zone) if not success then return zone end local str = getDemonym(data, gender, number) if not str then return zone end local link = getLink(data, topic, period) if link then str = '[[' .. link .. '|' .. str .. ']]' end return str, true-- true indique le succès end function p.getNationality(args) -- pour obtenir la nationalité d'une personne sur Wikidata sous forme d'adjectifs if not args then return nil end local wikidata = require "Module:Interface Wikidata".fromLua local complexdate = require "Module:Date complexe" if type(args) == 'string' then -- si un seul argument, c'est l'entité à utiliser args {item = args} end if args.args then -- si vient de frame args = args.args end local item = args.item or args[1] -- établit la variable gender pour l'élément local vals = { ['Q6581072'] = 'f', ['Q6581097'] = 'm', default = '?' } local gender = args.gender if not gender then gender = wikidata.formatStatements{entity = item, property = 'P21', displayformat = 'raw'} gender = vals[gender] or vals.default end -- désactivation si date de naissance avant l'Ère contemporaine : trop d'imprécisions et d'anachronismes local mindate = args.mindate or '1789' if mindate ~= "-" then local birthdate = wikidata.formatStatements{entity = item, property = 'P569', displayformat = 'raw', numval = 1} if (not birthdate) or complexdate.before(mindate, birthdate) then return nil end end return wikidata.formatStatements{ property = 'P27', vals = statements, showdate = true, entity = item, conjtype = 'and', removedupes = true, linktopic = '-', displayformat = function(snak) local g = gender -- genre de la personne, pour affichage du gentilé if g == '?' then -- si inconnu, au masculin g = 'm' end local val, success = p.nationality(wikidata.getid(snak), g) if not success then val = wikidata.formatSnak(snak) end return val end } end return p