Modul:Sandlådan/GunnarLarsson/test2

Från Wikipedia

Dokumentationen för denna modul kan skapas på Modul:Sandlådan/GunnarLarsson/test2/dok

local p = {}
local wd = require( 'Modul:Wikidata2' )

p.helloworld = function(frame)
	return "Hello world!"
end

p.resultat = function(frame)
	sap=mw.wikibase.getEntity( 'Q3486827') 
	iRefcounter=0
	local d={}
	local t={}
    local claims = sortbyqualifier( sap:getBestStatements( 'P1344' ), { ['sortbytime'] = 'inverted',['sortingproperty'] ='P580',['modifytime']='Y'} )
	local all={}
    for key, value in pairs( claims ) do
    	local id = value['mainsnak']['datavalue']['value']['id']
    	local tmp={}
		txtLeague,txtDate,txtSeason=sasongsinfo_local(id)
		tmp.txtLeague=txtLeague
		tmp.txtDate=txtDate
		tmp.txtSeason=txtSeason
		if value['qualifiers']['P1352'] then
			local placering=mw.wikibase.renderSnak( value['qualifiers']['P1352'][1] )
			tmp.placering='(' ..placering ..  ')'
			else
			tmp.placering=''
		end
		refparts=getReference(value['references'][1])
		if refparts then 
			iRefcounter=iRefcounter+1
			bNotInTable=true
			iIdInTable=k
		    if d[refparts]~=nil then
		    	bNotInTable=false
					result =  frame:extensionTag("ref", refparts,{ name = 'wikidata'..d[refparts] }) 
		    else
				result =  frame:extensionTag("ref", refparts,{ name = 'wikidata'..iRefcounter }) 
				d[refparts]=iRefcounter
		    end
			tmp.result=result
			else
			tmp.result=''
			end
		table.insert(all,tmp)
    end
    table.sort(all, function(a, b) return a.txtDate > b.txtDate end)
	txt='<table class="wikitable sortable"><tr><th>Liga</th><th>Säsong</th><th>Resultat</th><th>Referens</th></tr>'
	txtOldLeague=''
    for i = 1,#all do
		txt=txt .. "<tr>"
		if (all[i].txtLeague==txtOldLeague) then
			txt=txt .. '<td></td>'
			else
			txt=txt .. '<td>' .. all[i].txtLeague  .. '</td>'
			end
		txtOldLeague=all[i].txtLeague
		txt=txt .. "<td>" .. all[i].txtSeason  .. '</td>'
		txt = txt .. '<td>' ..all[i].placering ..  '</td>'
		txt=txt.. '<td>' .. all[i].result .. '</td>'
		txt=txt ..  '</tr>'
	end
    txt=txt .. '</table>'
--    txt=txt..tprint(all)
	return txt
end

sasongsinfo_local= function(txtId)
	nla2021=mw.wikibase.getEntity(txtId) 
	
    local formatedLeague= nla2021:formatPropertyValues( 'P3450' )
    local claimsLiga = nla2021:getAllStatements( 'P3450' )
    idSerie=claimsLiga[1]['mainsnak']['datavalue']['value']['id']

	nla=mw.wikibase.getEntity(idSerie):getSitelink( 'svwiki' )
    local txtLeague = '[[' .. nla .. '|' .. formatedLeague['value'] .. ']]'
	
    local formatedStartYear= nla2021:formatPropertyValues( 'P580' )
    local formatedEndYear= nla2021:formatPropertyValues( 'P582' )

	txtDate=nla2021:getAllStatements( 'P580' )[1].mainsnak.datavalue.value.time
	txtYearFrom=string.sub(nla2021:getAllStatements( 'P580' )[1].mainsnak.datavalue.value.time,2,5)
	txtYearTo=string.sub(nla2021:getAllStatements( 'P582' )[1].mainsnak.datavalue.value.time,2,5)
    
    txtSitelink = nla2021:getSitelink( 'svwiki' )
    if (txtSitelink==nil) then
			txtLink=nla2021:getLabel('sv')
	    else
	    	txtLink=txtSitelink
		end
		txtSeason=' [[' .. txtLink .. '|' .. txtYearFrom .. ' - ' .. txtYearTo .. ']]'
	return txtLeague,txtDate,txtSeason
end

-- the "qualifiers" and "snaks" field have a respective "qualifiers-order" and "snaks-order" field
-- use these as the second parameter and this function instead of the built-in "pairs" function
-- to iterate over all qualifiers and snaks in the intended order.
local function orderedpairs(array, order)
	if not order then return pairs(array) end

	-- return iterator function
	local i = 0
	return function()
		i = i + 1
		if order[i] then
			return order[i], array[order[i]]
		end
	end
end

local function getSnakValue(snak, parameter)
	if snak.snaktype == "value" then
		-- call the respective snak parser
		if snak.datavalue.type == "string" then return snak.datavalue.value
		elseif snak.datavalue.type == "globecoordinate" then return printDatavalueCoordinate(snak.datavalue.value, parameter)
		elseif snak.datavalue.type == "quantity" then return printDatavalueQuantity(snak.datavalue.value, parameter)
		elseif snak.datavalue.type == "time" then return printDatavalueTime(snak.datavalue.value, parameter)
		elseif snak.datavalue.type == "wikibase-entityid" then return printDatavalueEntity(snak.datavalue.value, parameter)
		elseif snak.datavalue.type == "monolingualtext" then return printDatavalueMonolingualText(snak.datavalue.value, parameter)
		end
	end
	return mw.wikibase.renderSnak(snak)
end


getReference=function(thisref)
	local refparts=thisref.snaks
--	table.sort(refparts, function(a, b) return a.txtDate > b.txtDate end)
	table.sort(refparts)

	txt='{{webbref'
	for key, value in orderedPairs( refparts) do
		if (key=='P123') then 
			iPublisher=value[1].datavalue.value.id
			txt=txt .. '|utgivare=[[' ..  getLabelByEntity( iPublisher ) .. ']]'
			end
		if (key=='P813') then 
			txt = txt .. '|hämtdatum='.. string.sub(value[1].datavalue.value.time,2,11) 
			end
		if (key=='P854') then 
			txt = txt .. '|url='.. value[1].datavalue.value
			end
		if (key=='P1476') then 
			txt = txt .. '|språk='.. value[1].datavalue.value.language
--			txt = txt .. '|språk='.. regexEscape(value[1].datavalue.value.language,"|"," ")
			txt = txt .. '|titel='.. string.gsub(value[1].datavalue.value.text,"|"," - ")
			end
		end
	txt=txt .. '}}'
--	return txt
	return txt 

--	for snakkey, snakval in orderedpairs(thisref.snaks or {}, thisref["snaks-order"]) do
--		if refparts then refparts = refparts .. ", " else refparts = "" end
--		-- output the label of the property of the reference part, e.g. "imported from" for P143
--		refparts = refparts .. tostring(mw.wikibase.getLabel(snakkey)) .. ": "
--		-- output all values of this reference part, e.g. "German Wikipedia" and "English Wikipedia" if the referenced claim was imported from both sites
--		for snakidx = 1, #snakval do
--			if snakidx > 1 then refparts = refparts .. ", " end
--			refparts = refparts .. getSnakValue(snakval[snakidx])
--		end
--	end
--	return refparts
end

p.sasongsinfo= function(frame)
	txt= tprint(frame)
	local out = {}
	nla2021=mw.wikibase.getEntity('Q110474763')
	local tmp=nla2021:getLabel('sv')

    local formatedLeague= nla2021:formatPropertyValues( 'P3450' )
    local claimsLiga = nla2021:getAllStatements( 'P3450' )
    idSerie=claimsLiga[1]['mainsnak']['datavalue']['value']['id']

	nla=mw.wikibase.getEntity(idSerie):getSitelink( 'svwiki' )
    txt = txt .. '[[' .. nla .. '|' .. formatedLeague['value'] .. ']]'
	
    local formatedStartYear= nla2021:formatPropertyValues( 'P580' )
    local formatedEndYear= nla2021:formatPropertyValues( 'P582' )
    txtSitelink = nla2021:getSitelink( 'svwiki' )
    if (txtSitelink==nil) then
	    txt = txt ..' [[' .. formatedStartYear['value'] .. ' - ' .. formatedEndYear['value'] .. ']]'
	    else
		txt = txt ..' [[' .. txtSitelink .. '|' .. formatedStartYear['value'] .. ' - ' .. formatedEndYear['value'] .. ']]'
		end
	return txt
end

function isClub( id )
	local isClub = false
    for key, value in pairs( mw.wikibase.getEntity( id ):getBestStatements( 'P3450' ) ) do
    	if value['mainsnak']['datavalue']['value']['id'] == 'Q15720476' then
    		isClub = true
    	end
    end
	return isClub
end

function getLabelByEntity( id )
	return mw.wikibase.getEntity( id ):getLabel( 'sv' )
end

-- Funktion från https://stackoverflow.com/questions/41942289/display-contents-of-tables-in-lua
function tprint (tbl, indent)
  if not indent then indent = 0 end
  local toprint = string.rep(" ", indent) .. "{\r\n"
  indent = indent + 2 
  for k, v in pairs(tbl) do
    toprint = toprint .. string.rep(" ", indent)
    if (type(k) == "number") then
      toprint = toprint .. "[" .. k .. "] = "
    elseif (type(k) == "string") then
      toprint = toprint  .. k ..  "= "   
    end
    if (type(v) == "number") then
      toprint = toprint .. v .. ",\r\n"
    elseif (type(v) == "string") then
      toprint = toprint .. "\"" .. v .. "\",\r\n"
    elseif (type(v) == "table") then
      toprint = toprint .. tprint(v, indent + 2) .. ",\r\n"
    else
      toprint = toprint .. "\"" .. tostring(v) .. "\",\r\n"
    end
  end
  toprint = toprint .. string.rep(" ", indent-2) .. "}"
  return toprint
end

function __genOrderedIndex( t )
    local orderedIndex = {}
    for key in pairs(t) do
        table.insert( orderedIndex, key )
    end
    table.sort( orderedIndex )
    return orderedIndex
end

function orderedNext(t, state)
    -- Equivalent of the next function, but returns the keys in the alphabetic
    -- order. We use a temporary ordered key table that is stored in the
    -- table being iterated.

    local key = nil
    --print("orderedNext: state = "..tostring(state) )
    if state == nil then
        -- the first time, generate the index
        t.__orderedIndex = __genOrderedIndex( t )
        key = t.__orderedIndex[1]
    else
        -- fetch the next value
        for i = 1,table.getn(t.__orderedIndex) do
            if t.__orderedIndex[i] == state then
                key = t.__orderedIndex[i+1]
            end
        end
    end

    if key then
        return key, t[key]
    end

    -- no more value to return, cleanup
    t.__orderedIndex = nil
    return
end

function orderedPairs(t)
    -- Equivalent of the pairs() function on tables. Allows to iterate
    -- in order
    return orderedNext, t, nil
end

return p