Module:Sandbox/Seudo/Test

Lua
CodeDiscussionLinksLink count SubpagesDocumentationTestsResultsSandboxLive code All modules

Documentation for this module may be created at Module:Sandbox/Seudo/Test/doc

Code

local p = {}

local presidents_all = {
    "Q23", "Q76", "Q91", "Q207", "Q1124", 
    "Q6279", "Q8007", "Q8612", "Q9582", "Q9588", 
    "Q9640", "Q9696", "Q9916", "Q9960", "Q11613", 
   "Q11806", "Q11812",  "Q11813",  "Q11815", "Q11816",
    "Q11817", "Q11820", "Q11869", "Q11881", "Q11891",
    "Q11896", "Q12306", "Q12312", "Q12325", "Q22686", 
    "Q23505", "Q23685", "Q33866", "Q34296", "Q34597", 
    "Q34836", "Q35041", "Q35171", "Q35236", "Q35286", 
    "Q35498", "Q35648", "Q35678", "Q35686", "Q36023"
}

local presidents_tests = {
   "Q8612", "Q76"

}

function p.get_first_statement(item, pid)
	statements = item:getBestStatements(pid)
	if statements and #statements > 0 then
		return statements[1]
	end
	return nil
end

function p.parse_date(tim)
	return {
		0+string.sub(tim, 2, 5),
		0+string.sub(tim, 7, 8),
		0+string.sub(tim, 10, 11)
	}
end

function p.get_date(item, pid)
	dat = p.get_first_statement(item, pid)
	if dat then 
		tim = dat.mainsnak.datavalue.value.time
		return p.parse_date(tim)
    else 
    	return nil
	end
end

function p.add_dates_function(structure, func, libelle)
    startdate = nil
    enddate = nil
    if func.qualifiers then
	    dat = func.qualifiers["P580"]
	    if dat and #dat > 0 then
	    	startdate = p.parse_date(dat[1].datavalue.value.time)
		end
	    dat = func.qualifiers["P582"]
	    if dat and #dat > 0 then
	    	enddate = p.parse_date(dat[1].datavalue.value.time)
		end
		table.insert(structure, { 
			["type"] = libelle,
			["startdate"] = startdate,
			["enddate"] = enddate
		})
	end
end

function p.cmpdat(a, b)
	if a["startdate"][1] < b["startdate"][1] then return 1 
    elseif a["startdate"][1] > b["startdate"][1] then return -1 end
    if a["startdate"][2] < b["startdate"][2] then return 1
    elseif a["startdate"][2] > b["startdate"][2] then return -1 end
    if a["startdate"][3] < b["startdate"][3] then return 1
    elseif a["startdate"][3] > b["startdate"][3] then return -1 end
	return 0
end

function dat2json(dat)
	return "[" .. dat[1] .. ", " .. dat[2] .. ", " .. dat[3] .. "]"
end

function p.getPresidents()
	res = ""
	presidents = {}
	for _, presid in pairs(presidents_all) do
		item = mw.wikibase.getEntity(presid)
		president = {
			["name"] = item:getLabel(),
			["birth"] = p.get_date(item, "P569"),
			["death"] = p.get_date(item, "P570"),
			["dates"] = {}
		}
		-- Activités
		-- Parfois (ex. Biden), la fonction "president" est "preferred"
		functions = item:getAllStatements("P39")
	    for _,func in pairs(functions) do
            if not(func["rank"] == "deprecated") then
    	        funcid = func.mainsnak.datavalue.value.id
    	        -- funclibelle = func.mainsnak.datavalue.value.text
	            if funcid  == "Q11696" then
		            p.add_dates_function(president["dates"], func, "president")
            	elseif funcid == 'Q13218630' then
	    	        p.add_dates_function(president["dates"], func, "representative")
            	elseif funcid == 'Q11699' then
		            p.add_dates_function(president["dates"], func, "vicepresident")
                elseif funcid == 'Q889821' then
        	        p.add_dates_function(president["dates"], func, "governor")
                elseif funcid == 'Q13218630' then
            	    p.add_dates_function(president["dates"], func, "representative")
            	elseif funcid == 'Q4416090' then
            	    p.add_dates_function(president["dates"], func, "senator")
        	    else
        	    	funcitem = mw.wikibase.getEntity(funcid)
            		label = string.lower(funcitem:getLabel())
            		found = false
            		for _,elem in pairs(funcitem:getBestStatements("P361")) do
            			if elem.mainsnak.datavalue.value.id == "Q66096" then 
            				-- Sénat des États-Unis
            				p.add_dates_function(president["dates"], func, "senator")
        					found = true
        					break
            			elseif elem.mainsnak.datavalue.value.id == "Q11701" then 
		    				-- Chambre des Représentants
            				p.add_dates_function(president["dates"], func, "representative")
    	    				found = true
    	    				break
	            		end
        	    	end
        	    	for _,elem in pairs(funcitem:getBestStatements("P279")) do
        	    		if elem.mainsnak.datavalue.value.id == "Q889821" then 
        	    			-- Gouverneur d'État
            				p.add_dates_function(president["dates"], func, "governor")
    	    				found = true
    	    				break
            			end
    	    		end
            	end
            end
        end
	    --table.sort(president["dates"], p.cmpdat)
		table.insert(presidents, president)
	end
	json = '['
	for k, president in pairs(presidents) do
    	if k > 1 then json = json .. ',\n\t' end
    	json = json .. '\n{\n\t"name": "' .. president.name .. '"' 
    	if president.birth then 
    		json = json .. ',\n\t"birth": ' .. dat2json(president.birth)
    	end
    	if president.death then 
    		json = json .. ',\n\t"death": ' .. dat2json(president.death)
    	end
    	json = json .. ',\n\t"activities": [\n\t\t'
    	for k2, activity in pairs(president.dates) do
    		if k2 > 1 then json = json .. ',\n\t\t' end
    		json = json .. '{"type": "' .. activity.type .. '"'
    		if activity.startdate then
    			json = json .. ', "start": ' .. dat2json(activity.startdate) 
			end
    		if activity.enddate then
    			json = json .. ', "end": ' .. dat2json(activity.enddate) 
    		end
		    json = json .. '}'
    	end
    	json = json .. '\n\t\]\n}'
    end
    json = json .. '\n]'
	return json
end

return p