Module:ElectoralCalendarMap: Difference between revisions

From Elections Wiki
Jump to navigation Jump to search
Created page with "local p = {} function p.load(frame) -- i understand chocolateman now, we can't fetch data from an outside source due to mediawiki's stupid restrictions local dataPage = "Data:Election_Data.json" local dataTitle = mw.title.new(dataPage) if not dataTitle then return "could not find data page '" .. dataPage .. "'!" end local dataContent = dataTitle:getContent() if not dataContent then return "could not retrieve content..."
 
No edit summary
Tag: Reverted
Line 15: Line 15:
     end
     end
      
      
    -- Parse the JSON data
     local APIData = mw.text.jsonDecode(dataContent)
     local APIData = mw.text.jsonDecode(dataContent)
     if not APIData then
     if not APIData then
Line 28: Line 27:
     }
     }
      
      
    -- get date
     local allElections = {}
     local currentDate = os.date("!%Y-%m-%dT%H:%M:%S")
    local combinedJSON = {}
      
      
     -- i'll try to clean up older elections of course,
     for region, elections in pairs(APIData) do
    -- but a function to remove old ones is a good idea.
         for _, election in ipairs(elections) do
    local function isNewElection(electionDate)
            table.insert(allElections, {
         -- make it consistent with our format
                region = region,
        local formattedDate = mw.ustring.gsub(electionDate, "[-:T]", ""):sub(1, 14)  
                election = election
        local formattedCurrentDate = mw.ustring.gsub(currentDate, "[-:T]", ""):sub(1, 14)
            })
         return formattedDate > formattedCurrentDate
         end
     end
     end
      
      
     local function generateDescription(elections)
     table.sort(allElections, function(a, b)
    local descriptionBits = {}
        return a.election.date > b.election.date
    for _, election in ipairs(elections) do
    end)
    table.insert(descriptionBits, string.format(
   
    "<b>%s</b><br>%s<br>%s",
    local recentElections = {}
    election.election_name,
    for i = 1, math.min(7, #allElections) do
    election.date,
        table.insert(recentElections, allElections[i])
    election.description
    ))
    end
    return table.concat(descriptionBits, "<br><br>")
     end
     end
      
      
     for region, elections in pairs(APIData) do
    local combinedJSON = {}
     for _, entry in ipairs(recentElections) do
        local region = entry.region
        local election = entry.election
         local mapDataTitle = mw.title.new("MapData:" .. region .. ".map")
         local mapDataTitle = mw.title.new("MapData:" .. region .. ".map")
       
 
         if mapDataTitle then
         if mapDataTitle then
             local content = mapDataTitle:getContent()
             local content = mapDataTitle:getContent()
Line 63: Line 59:
                 if parsedContent and type(parsedContent.features) == "table" then
                 if parsedContent and type(parsedContent.features) == "table" then
                     for _, feature in ipairs(parsedContent.features) do
                     for _, feature in ipairs(parsedContent.features) do
                         local validElections = {}
                         feature.properties.title = string.gsub(region, "_", " ")
                        for _, election in ipairs(elections) do
                        feature.properties.description = string.format(
                            if isNewElection(election.date) then
                             "<b>%s</b><br>%s<br>%s",
table.insert(validElections, election)
                            election.election_name,
                            end
                            election.date,
                        end
                             election.description
                       
                        )
                        if #validElections > 0 then
 
                        feature.properties.title = string.gsub(region, "_", " ")
                        local fillColor = electionColors[election.election_type] or "#404040"
                            feature.properties.description = generateDescription(validElections)
                        feature.properties.fill = fillColor
                              
                        feature.properties["fill-opacity"] = 0.8
                             local fillColor = electionColors[validElections[1].election_type] or "#404040"
 
                            feature.properties.fill = fillColor
                        table.insert(combinedJSON, feature)
                            feature.properties["fill-opacity"] = 0.8
                         
                            -- filter out "invalid" elections for now
                            if feature.properties.fill ~= "#555555" then
                                table.insert(combinedJSON, feature)
                            end
                        else
                        mw.log("election date passed for '" .. region .. "'!")
                        end
                     end
                     end
                 else
                 else
Line 96: Line 83:
         end
         end
     end
     end
   
 
     local combinedMapData = mw.text.jsonEncode({
     local combinedMapData = mw.text.jsonEncode({
         type = "FeatureCollection",
         type = "FeatureCollection",
         features = combinedJSON
         features = combinedJSON
     })
     })
   
 
     local mapFrame = '<mapframe width="100%" height="400" zoom="3" longitude="0" latitude="0">' .. combinedMapData .. '</mapframe>'
     local mapFrame = '<mapframe width="100%" height="400" zoom="3" longitude="0" latitude="0">' .. combinedMapData .. '</mapframe>'
    --local mapFrame = '' .. combinedMapData .. ''
 
   
     return frame:preprocess(mapFrame)
     return frame:preprocess(mapFrame)
end
end


return p
return p

Revision as of 20:41, 26 January 2025

Documentation for this module may be created at Module:ElectoralCalendarMap/doc

local p = {}

function p.load(frame)
    -- i understand chocolateman now, we can't fetch data from an outside source due to mediawiki's stupid restrictions
    local dataPage = "Data:Election_Data.json"
    
    local dataTitle = mw.title.new(dataPage)
    if not dataTitle then
        return "could not find data page '" .. dataPage .. "'!"
    end
    
    local dataContent = dataTitle:getContent()
    if not dataContent then
        return "could not retrieve content from '" .. dataPage .. "'!"
    end
    
    local APIData = mw.text.jsonDecode(dataContent)
    if not APIData then
        return "invalid JSON content in '" .. dataPage .. "'!"
    end
    
    local electionColors = {
        General = "#4682b4", -- blue
        Local = "#8a2be2", -- purple
        Statewide = "#008000", -- green
        Referendum = "#ffa500" -- orange
    }
    
    local allElections = {}
    
    for region, elections in pairs(APIData) do
        for _, election in ipairs(elections) do
            table.insert(allElections, {
                region = region,
                election = election
            })
        end
    end
    
    table.sort(allElections, function(a, b)
        return a.election.date > b.election.date
    end)
    
    local recentElections = {}
    for i = 1, math.min(7, #allElections) do
        table.insert(recentElections, allElections[i])
    end
    
    local combinedJSON = {}
    for _, entry in ipairs(recentElections) do
        local region = entry.region
        local election = entry.election
        local mapDataTitle = mw.title.new("MapData:" .. region .. ".map")

        if mapDataTitle then
            local content = mapDataTitle:getContent()
            if content then
                local parsedContent = mw.text.jsonDecode(content)
                if parsedContent and type(parsedContent.features) == "table" then
                    for _, feature in ipairs(parsedContent.features) do
                        feature.properties.title = string.gsub(region, "_", " ")
                        feature.properties.description = string.format(
                            "<b>%s</b><br>%s<br>%s",
                            election.election_name,
                            election.date,
                            election.description
                        )

                        local fillColor = electionColors[election.election_type] or "#404040"
                        feature.properties.fill = fillColor
                        feature.properties["fill-opacity"] = 0.8

                        table.insert(combinedJSON, feature)
                    end
                else
                    mw.log("invalid or missing features in mapdata for region '" .. region .. "'!")
                end
            else
                mw.log("warning: couldn't fetch mapdata for region '" .. region .. "'!")
            end
        else
            mw.log("warning: couldn't create title object for region '" .. region .. "'!")
        end
    end

    local combinedMapData = mw.text.jsonEncode({
        type = "FeatureCollection",
        features = combinedJSON
    })

    local mapFrame = '<mapframe width="100%" height="400" zoom="3" longitude="0" latitude="0">' .. combinedMapData .. '</mapframe>'

    return frame:preprocess(mapFrame)
end

return p