Modulo:Grafikaĵo de nombro de loĝantoj

El Vikipedio, la libera enciklopedio
Dokumentado Dokumentado


Ŝablona programado Diskutoj Lua Testoj Subpaĝoj
Modulo Esperanto English

de nombro de loĝantoj&namespace=828 Modulo: de nombro de loĝantoj&namespace=4 Dokumentado


Se vi havas demandon pri ĉi tiu Lua-modulo, tiam vi povas demandi en la diskutejo pri Lua-moduloj. La Intervikiaj ligiloj estu metataj al Vikidatumoj. (Vidu Helpopaĝon pri tio.)
local lang = mw.language.getContentLanguage()
local getArgs = require('Modulo:Arguments').getArgs
local p = {}

function p.main(frame)

local args
if type(frame) ~= 'table' then
	args = { id = frame }
else
	args = getArgs(frame)
end
local property = args["property"] or 'P1082'
local from = tonumber(args["from"])
local to = tonumber(args["to"])
local skip = tonumber(args["skip"]) or 1
local width = tonumber(args["width"]) or 430
local height = tonumber(args["height"]) or 200
local zalamovat = tonumber(args["rompi"])
local output = {}
output[1] = args["surskribo"] or '<div style="font-weight:bold">Evoluo de nombro de loĝantoj</div><div><small>La datoj devenas el datumbazo de Vikidatumoj</small></div>'
local graphPos,tabPos = 2
if (args["tabelo"] == "super") then
	output[3] = "<br/>"
	tabPos=2
	graphPos=4
elseif (args["tabelo"] == "sub") then
	output[3] = "<br/>"
	tabPos=4
elseif (args["tabelo"] == "antaŭ") then
	tabPos=2
	graphPos=3
elseif (args["tabelo"] == "malantaŭ") then
	tabPos=3
end
local function getStatements(id)
	id = id or mw.wikibase.getEntityIdForCurrentPage()
	return mw.wikibase.getAllStatements(id, property)
end

local function prepareStatements(statements)
	local numbers_raw = {}
	local function processStatement(i, statement)
		local snak = statement.mainsnak
		if not snak or snak.snaktype ~= 'value' then
			statements[i] = nil
			return
		end
		local n = tonumber(snak.datavalue.value.amount)
		local d = nil
		if statement.qualifiers and statement.qualifiers.P585 then  -- dátum
			d = require('Modulo:Time').newFromWikidataValue(statement.qualifiers.P585[1].datavalue.value)
		end
		if d and d.year
		 and (not(from) or (d.year >= from) )
		 and (not(to) or (d.year <= to) ) then
			statements[i] = { d.year, n }
			numbers_raw[d.year] = n
			return
		else
			statements[i] = nil
			return
		end
	end
	for n, statement in pairs(statements) do
		processStatement(n, statement)
	end
	local dates = {}
	for d, v in pairs(statements) do
		table.insert(dates, v[1])
	end
	if #dates < 1 then
		return nil
	end
	table.sort(dates)
	local numbers = {}
	local last
	for n, v in pairs(dates) do
		if not(last) or ((v-last)>=skip) then
			table.insert(numbers, { v, numbers_raw[v] } )
			last=v
		end
	end
	return numbers
end

local function setTable(data,sep)
	local popTables={}
	local divided={}
	local i,j=0,sep
	for _,v in pairs(data) do
		if j == sep then 
			i=i+1
			divided[i]={}
			j=0
		end
		j=j+1
		divided[i][j] = v
	end
	for _, t in pairs(divided) do
		local popTable = mw.html.create( 'table' )
			popTable
				:css( 'display', 'inline-block' )
				:css( 'vertical-align', 'top' )
				:addClass( 'wikitable' )
				:tag( 'tr' )
				:tag( 'th' )
				:wikitext( 'Jaro' )
				:done()
				:tag( 'th' )
				:wikitext( 'Loĝantoj' )
				:done()
		for _, v in pairs(t) do
			local tr = popTable:tag( 'tr' )
			tr:tag( 'th' )
			  :wikitext( v[1] )
			  :done()
			tr:tag( 'td' )
			  :css( 'text-align', 'right' )
			  :wikitext( lang:formatNum(tonumber(v[2])) )
			:done()
		end
		table.insert(popTables,tostring(popTable))
	end
	return table.concat(popTables)
end

local function drawGraph(data)
	local json = {
		version = 2,
		width = width, height = height,
		data = {
			{
				name = "table",
				values = {}
			}
		},
		scales = {
			{
				name = "x",
				type = "linear",
				domain = { data = "table", field= "x" },
				range = "width",
				zero = false,
				nice = true
			},
			{
				name = "y",
				range = "height",
				nice = true,
				domain = { data = "table", field = "y" }
			}
		},
		axes = {
			{ type = "x", scale = "x", tickcount = 20, format = "d", grid = true },
			{ type = "y", scale = "y", format = "2d", grid = true }
		},
		marks = {
			{
				type = "line",
				from = { data = "table" },
				properties = {
					enter = {
						x = { scale = "x", field = "x" },
						y = { scale = "y", field = "y" },
						strokeWidth = { value = 5 },
						stroke = { value = "steelblue" }
					}
				}
			}
		}
	}
	if args["labels"] == "jes" then
		table.insert(json["marks"],
			{
				type = "text",
				from = { data = "table" },
				properties = {
					enter = {
						x = { scale = "x", field = "x" },
						y = { scale = "y", field = "y" },
						fill = { value = "#000" },
						align = { value = "left" },
						baseline = { value = "top" },
						dy = { value = -13 },
						text = { field = "y" }
					}
				}
			}
		)
	end
	for _, v in pairs(data) do
		local d, n = v[1], v[2]
		table.insert(json.data[1].values, { x = d, y = n })
	end
	return tostring(mw.html.create("div")
		:css("display","inline-block")
		:css("vertical-align","top")
		:wikitext(mw.getCurrentFrame():extensionTag("graph", mw.text.jsonEncode(json))))
end

	local statements = getStatements(args.id)
	if type(statements) ~= 'table' then
		return ''
	end
	statements = prepareStatements(statements)
	if type(statements) ~= 'table' then
		return ''
	end
	output[graphPos] = drawGraph(statements)
	if tabPos then output[tabPos] = setTable(statements,zalamovat) end
	return table.concat(output)
end

return p