Modulo:Grafikaĵo de nombro de loĝantoj
[antaŭrigardi] [redakti] [historio] [renovigi]
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