Modul:Nıfus
Seba na module şıma şenê yû pela dokumani vırazê Modul:Nıfus/dok
require('strict')
local getArgs = require('Modul:Arguments').getArgs
local p = {}
local property = 'P1082'
local function getStatements(id)
local entity = mw.wikibase.getEntity(id)
if not entity then
return nil
end
if not entity.claims or not entity.claims[property] then
return nil
end
local statements = entity.claims[property]
return statements
end
local function prepareStatements(statements, args)
local numbers_raw = {}
local ranks = { normal = 1, preferred = 2 }
local function processStatement(i, statement)
local snak = statement.mainsnak
if not snak or snak.snaktype ~= 'value' then
statements[i] = nil
return
end
local rank = ranks[statement.rank]
if not rank 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
for _, snak in ipairs(statement.qualifiers.P585) do
if snak.snaktype == 'value' then
d = require('Modul:Time').newFromWikidataValue(snak.datavalue.value)
break
end
end
end
if d and d.year and (not numbers_raw[d.year] or numbers_raw[d.year].rank <= rank) then
statements[i] = { d.year, n }
numbers_raw[d.year] = { number = n, rank = rank }
else
statements[i] = nil
end
end
for n, statement in pairs(statements) do
processStatement(n, statement)
end
local years = {}
local dates = {}
for _, v in pairs(statements) do
years[v[1]] = true
end
for y, _ in pairs(years) do
table.insert(dates, y)
end
if #dates < 1 then
return nil
end
table.sort(dates)
local numbers = {}
local maxLength = tonumber(args.maxLength) or 10
if maxLength < 3 or maxLength > 20 then
maxLength = 10
end
if #dates <= maxLength then
for _, v in ipairs(dates) do
table.insert(numbers, { tostring(v), numbers_raw[v].number } )
end
else
local n = #dates - 1
maxLength = maxLength - 1
for i = 0, maxLength do
local j = math.floor(i * n / maxLength + 0.5) + 1
local year = dates[j]
table.insert(numbers, {tostring(year), numbers_raw[year].number})
end
-- if numbers_raw[dates[n + 1]].number >= 1000000 then
-- json.marks[2].properties.enter.angle = { value = -45 }
-- end
end
return numbers
end
local function drawGraph(data, float)
local lang = mw.language.getContentLanguage()
for _, v in pairs(data) do
local d, n = v[1], v[2]
local n_form = tostring(n)
if n >= 10000 then
n_form = lang:formatNum(n)
end
table.insert(json.data[1].values, { x = d, y = n, y_form = n_form })
end
return tostring(mw.html.create("div")
:css("display", "inline-block") -- style hotfix
:css("max-width", "100%")
:css("overflow-x", "auto") -- too wide on mobile
:css("float", float) -- optional
:wikitext(mw.getCurrentFrame():extensionTag("graph", mw.text.jsonEncode(json)))
)
end
local max_visina = 8 -- 8 em; podesiti i visinu ćelije u css-u predloška
function p.dijagram(data, args)
local targs = args
local podatci_max = 0
for _, v in ipairs(data) do
podatci_max = math.max(podatci_max, v[2])
end
--html tablica u kojoj će svaka ćelija sadržavati jedan stupac (div) stupčastog dijagrama
--ovdje stvaramo ćelije u dvama retcima
local tr1 = mw.html.create( 'tr' )
tr1 : tag("td") : addClass("kbs_ordinata")
: tag("span") : addClass("kbs_ordinata") : wikitext(targs.yAxisTitle or "Amarê nıfus") : done()
local tr2 = mw.html.create( 'tr' )
tr2 : tag("td") : done()
local lang = mw.language.getContentLanguage()
local prva, zadnja
for _, v in ipairs(data) do
if true then --ne prikazuj lijevo i desno od jedinih poznatih, ali prikaži između
prva = prva or v[1]
zadnja = v[1]
local podatak = v[2] or 0
local biljeg = (podatak>0 and podatak) or "" -- do not show 0 or Nil
if v[2] >= 10000 then
biljeg = lang:formatNum(v[2])
end
tr1 : tag("td") : addClass("kbs_za_stupce")
: tag("div") : addClass("kbs_podatci") : wikitext(biljeg) : done()
: tag("div") : addClass("kbs_stupci")
: cssText("height:"..0.01*math.floor(100*podatak*max_visina/podatci_max).."em;") : done()
tr2 : tag("td") : addClass("kbs_godine") : wikitext(v[1]) : done()
end
end
-- naslov iznad tablice s dijagramom
-- u predlošku: Naselje X ili Općina Y ili Grad Z
local podatci_za = targs["područje"] and (targs["područje"] ~= "") and ("'''" .. targs["područje"] .. "''': ")
or ""
local kbs = " " .. prva .. " ra heta " .. zadnja .. " nıfus"
local naslov = podatci_za .. (targs["naslov"] and (targs["naslov"] ~= "") and targs["naslov"] or kbs)
-- tablica za stupčasti dijagram
local tbl = mw.html.create( 'table' )
tbl : addClass("kbs_tablica")
: node(tr1)
: node(tr2)
local ttl = mw.html.create( 'div' )
ttl : addClass("kbs_naslov") : wikitext(naslov)
local tbl_ttl = mw.html.create( 'div' )
tbl_ttl : addClass("kbs_tablica_scrollable")
: tag("div") : addClass("kbs_tablica")
: node(ttl)
: node(tbl)
: done()
-- Napomena:… i Izvori:… ispod dijagrama
local napomena = targs["napomena"] or ""
local izvori = ""
if targs["popisi"] == "HRV" then
izvori = izvori_hr
end
izvori = targs["izvori"] or "Çıme: [[d:" .. args.entityId .. "#" .. args.property:upper() .. "|Wikidata]]"
local nte = mw.html.create( 'div' ) : addClass("kbs_napomena")
if napomena ~="" then
nte : wikitext("'''Napomena''': " .. napomena .. " ")
end
if izvori ~= "" then
nte : wikitext(izvori)
end
local nap_izv = mw.html.create( 'div' )
nap_izv : addClass("kbs_napomena_nonscrollable")
: node(nte)
local sve = mw.html.create() : node(tbl_ttl) : node(nap_izv)
return tostring(sve)
end
local function wikitable(frame, data)
local ret = '{| class="wikitable"\n'
for _, v in ipairs(data) do
ret = ret .. '|-\n|' .. v[1] .. '||' .. frame:expandTemplate { title = 'számt', args = { v[2] }} .. '\n'
end
ret = ret .. '|}'
return ret
end
function p.main(frame)
local args = {}
if type(frame) ~= 'table' then
args = { id = frame }
else
args = getArgs(frame)
end
if args.property then
property = args.property
end
local statements = getStatements(args.id)
if type(statements) ~= 'table' then
return nil
end
statements = prepareStatements(statements, args)
if type(statements) ~= 'table' then
return nil
end
if #statements < 3 then
return wikitable(frame, statements)
end
args.property = args.property or property
args.entityId = args.id or mw.wikibase.getEntityIdForCurrentPage()
return p.dijagram(statements, args)
end
return p