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