Modulo:Demografia: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Moroboshi (discussione | contributi)
r
Moroboshi (discussione | contributi)
fix posizione modulo
 
(14 versioni intermedie di 2 utenti non mostrate)
Riga 1:
local mWikidata = require('Modulo:Wikidata')
local mChart = require('Modulo:Graph/sandbox')
 
local p = {}
Riga 8 ⟶ 9:
table.insert(t, s)
end
end
 
local function max_pop(data)
local max = 0
for _,d in ipairs(data) do
if d.population > max then max = d.population end
end
return max
end
 
Riga 13 ⟶ 22:
-- Eventuali valori non numerici sono ignorati
local function read_array(args)
local yearsraw_data = {}
if args.anni and args.popolazione then
local populations = {}
if local years = mw.text.split(args.anni, then",")
local listpopulations = mw.text.split(string.gsub(args.annipopolazione, "%s", ""), ",")
forif _,s#years in== ipairs(list)#populations dothen
years[#years+1]for i = tonumber(s)1, or#years 0do
raw_data[i] = {year=string.gsub(years[i], "%s", "") , population = tonumber(populations[i]) or 0 }
end
if args.popolazione then
local list = mw.text.split(string.gsub(args.popolazione, "%s", ""), ",")
for _,s in ipairs(list) do
populations[#populations+1] = tonumber(s) or 0
end
end
end
else -- vecchio metodo di inserimento
if #raw_data == 0 then -- vecchio metodo di inserimento
for i=1,20 do
local index = tonumber(i)
local year = tonumber(args['a' .. index])
if year then
yearsraw_data[#yearsraw_data+1] = { year = year, population = tonumber(args['p' .. index]) or 0 }
populations[#populations+1] = tonumber(args['p' .. index]) or 0
end
end
end
return years, populationsraw_data
end
 
local function comp_year(d1, d2)
return d1.year < d2.year
end
 
local function get_wikidata(from)
local claims
local populations_raw = mWikidata._getProperty({'P1082', from=from, rank='normal'}, true)
local populations_reverseraw_data = {}
 
local years = {}
claims = mWikidata._getClaims('P1082', { from = from, rank = 'normal' }) or {}
for i =1, #populations_raw do -- per il momento inserisco come anni una sequenza numerica
for _, claim in ipairs(claims) do
populations_reverse[i] = populations_raw[#populations_raw-i+1]
yearsraw_data[i#raw_data + 1] = i{
population = tonumber(mWikidata._formatStatement(claim)) or 0,
year = mWikidata._formatQualifiers(claim, 'P585')
}
end
table.sort(raw_data, comp_year)
return years,populations_reverse
 
return raw_data
end
 
local function p._demografiadefault_table(argspopmax, n)
local years,populationsdefault = read_array(args){}
local log_p = math.ceil(math.log10(popmax))
if #years == 0 then
if log_p == 0 then log_p = 1 end
years,populations = get_wikidata(args.from)
local first_digit = math.floor(popmax / 10 ^ (log_p - 1))
if first_digit == 9 then
default.popmax = 10 ^ (log_p)
else
default.popmax = (first_digit +1 ) * 10 ^ (log_p-1)
end
localif graphlog_p < 2 then log_p = {}2 end
localif popmaxfirst_digit <=5 0then
default.passo1 = (10 ^ (log_p-1)) / 2
for _,p in ipairs(populations) do
ifdefault.passo2 p= > popmax then popmax =10 p^ end(log_p-2)
else
default.passo1 = (10 ^ (log_p-1))
default.passo2 = 2 * 10 ^ (log_p-2)
end
default.dimx = 488
if n > 15 then default.dimx = 488 + (n-15) * 20 end
return default
end
 
local function draw_graph(raw_data, args, default)
local populations = {}
local years = {}
for i,d in ipairs(raw_data) do
years[i], populations[i] = d.year, d.population
end
local graph = {
graphwidth = tonumber(args.dimx) or default.dimx,
graphheight = tonumber(args.dimy) or 280,
ygrid = true,
ymax = args.popmax or tostring(default.popmax),
xtitle = 'anni',
ytitle = 'popolazione',
y = { populations },
x = years,
graph_type = 'rect',
seriesTitles = {'Popolazione'},
colors = {'#4682B4'},
showValue = true
}
local graph_json = mChart.chart_json(graph)
if args.raw then return graph_json end
return mw.getCurrentFrame():extensionTag('graph', graph_json)
end
 
local function draw_timeline(raw_data, args, default)
local graph = {}
dump(graph, 'Colors=\n id:lightgrey value:gray(0.9)\n id:darkgrey value:gray(0.7)\n id:sfondo value:rgb(1,1,1)\n id:barra value:rgb(0.6,0.7,0.8)\n\n')
dump(graph, 'ImageSize = width:', args.dimx or '455'tostring(default.dimx), ' height:', args.dmydimy or '373', '\n')
dump(graph, 'PlotArea = left:50 bottom:50 top:30 right:30\nDateFormat = x.y\n')
dump(graph, 'Period = from:0 till:', args.popmax or tostring(default.popmax), '\n')
dump(graph, 'TimeAxis = orientation:vertical\nAlignBars = justify\n')
dump(graph, 'ScaleMajor = gridcolor:darkgrey increment:', args.passo1 or '10000'tostring(default.passo1), ' start:0\n' )
dump(graph, 'ScaleMinor = gridcolor:lightgrey increment:', args.passo2 or '1000'tostring(default.passo2), ' start:0\n')
dump(graph, 'BackgroundColors = canvas:sfondo\n')
dump(graph, 'BarData=\n')
for _,yeardata in ipairs(yearsraw_data) do
dump(graph, string.format(' bar: %ds text:%ds\n', data.year, data.year))
end
dump(graph, '\n')
dump(graph, 'PlotData=\n color:barra width:20 align:left\n\n')
for i =1_,#yearsdata in ipairs(raw_data) do
dump(graph, string.format(' bar:%ds from:0 till:%d\n', years[i]data.year, populations[i]data.population))
end
dump(graph, '\n')
local lang = mw.language.new('it')
dump(graph, 'PlotData=\n')
for i=1_,#yearsdata in ipairs(raw_data) do
local p_formatted = lang:formatNum(math.floor(tonumber(populations[i])data.population + 0,5) )
dump(graph, string.format(' bar: %ds at: %d fontsize:S text: %s shift:(-10,5)|n.d. shift:(-8,5)\n',
years[i]data.year, populations[i]data.population, p_formatted))
end
dump(graph, '\n')
Riga 95 ⟶ 149:
draw_graph = mw.getCurrentFrame():extensionTag('timeline', table.concat(graph))
end
return draw_graph
local titolo = "''Abitanti censiti''\n"
end
 
function p._demografia(args)
local graph
local raw_data = read_array(args)
local from_wikidata = false
if #raw_data == 0 then
raw_data = get_wikidata(args.from)
from_wikidata = true
-- if true then return mw.text.jsonEncode(raw_data, mw.text.JSON_PRETTY) end
end
if #raw_data == 0 then return '' end
local popmax = max_pop(raw_data)
local is_thousand = false
if from_wikidata and popmax >= 900000 then
popmax = popmax / 1000
for i,data in ipairs(raw_data) do
raw_data[i].population = raw_data[i].population / 1000
is_thousand = true
end
end
-- calcolo default per la popolazione
local default = default_table(popmax, #raw_data)
-- generazione del grafico
local titolo = "''Abitanti censiti''<br />"
if is_thousand then
titolo = "''Abitanti censiti (migliaia)''<br />"
end
if args.titolo then
titolo = "''" .. args.titolo .. "''\n<br />"
end
if args.graph then
graph = draw_graph(raw_data, args, default)
else
graph = draw_timeline(raw_data, args, default)
end
return titolo .. draw_graphgraph
end