Module:Sandbox/Swpb/NPVIC chart new

p = {}

function julian(date_string) jdate = mw.getCurrentFrame:getParent:expandTemplate{ title = 'MDY to Julian', args = { date_string } } return jdate end

function year(jdate) year = mw.getCurrentFrame:getParent:expandTemplate{ title = 'JULIANDAY.YEAR', args = { jdate } } return year end

function historic_EVs(state, year) historic_EVs = tonumber(mw.getCurrentFrame:getParent:expandTemplate{ title = 'USHRseats', args = { state, year } }) + 2 return historic_EVs end

--Plots bar segments function p.bars(frame) local height = frame.args['height'] or 450 local max_tot = frame.args['max_tot'] local updated = frame.args['updated'] local parent = mw.getCurrentFrame:getParent running_dates = { julian('1/1/2011'), julian('1/1/2021') } running_EVs = { 0, 0 } --	for index,date in pairs(running_dates) do --		running_totals[index] = 0 --	end

local i = 1 local bars = '' local totals = {} while parent:expandTemplate{ title = 'component', args = { frame.args[i] , 1 } }~='' do		state = parent:expandTemplate{ title = 'component' , args = { frame.args[i] , 1 } } join1 = julian( parent:expandTemplate{ title = 'component', args = { frame.args[i] , 'start' } } ) drop1 = julian( parent:expandTemplate{ title = 'component', args = { frame.args[i] , 'end' } } ) join2 = julian( parent:expandTemplate{ title = 'component', args = { frame.args[i] , 'start2' } } ) drop2 = julian( parent:expandTemplate{ title = 'component', args = { frame.args[i] , 'end2' } } ) state_dates = {join1, drop1, join2, drop2} state_ismember = {1, 0, 1, 0} state_EVs = {} for index,state_date in pairs(state_dates) do			state_EVs[index] = 0 end if state=='DC' then state_EVs[1] = 3 state_EVs[3] = 3 else state_EVs[1] = historic_EVs(state, year(join1)) state_EVs[3] = historic_EVs(state, year(join2)) end

for running_index,running_date in pairs(running_dates) do			for state_index,state_date in pairs(state_dates) do				if running_date > state_dates[state_index] and not running_date > state_dates[state_index+1] then table.insert( state_dates, state_index+1, running_date) if state_ismember[state_index]==1 then table.insert( state_EVs, state_index+1, historic_EVs(state,running_date) ) table.insert( state_ismember, state_index+1, 1) else table.insert( state_EVs, state_index+1, 0) table.insert( state_ismember, state_index+1, 0) end end end end running_dates = state_dates for index,running_date in pairs(running_dates) do		end -- Update running_EVs array

bars = bars .. parent:expandTemplate{ title = 'User:Swpb/sandbox9', args = { size = height, max_tot = max_tot, updated = updated, new_tot = totals[i], frame.args[i] } } end

i = i+1 return bars end --		if i<num_items then --			if mw.ustring.match(state,'MD') then --				totals[i] = EVs --			else --				totals[i] = (totals[i-1] or 0) + EVs --			end --		end

--		for each date in dates: date_EV_pairs([date]) = USHRseats(date)+2 (when a member); = 0 (when not a member) --		multiply a binary array of joined status by an array of EV values on those dates

--		start1_EVs = parent:expandTemplate{ title = 'USHRseats', args = { state, mw.ustring.sub(start, -4) } } --		end1_EVs = parent:expandTemplate{ title = 'USHRseats', args = { state, mw.ustring.sub(end1, -4) } } --		start2_EVs = parent:expandTemplate{ title = 'USHRseats', args = { state, mw.ustring.sub(start2, -4) } } --		end2_EVs = parent:expandTemplate{ title = 'USHRseats', args = { state, mw.ustring.sub(end2, -4) } } --		Generate table of dates and EVs, and insert Census and other change dates --		Add any new change dates (events other than start1) and expand running_totals table --		Sort dates and totals and send to bars template

--Given a timespan from Jan 1, 2006 to a given end date "updated">, calculates the percentage of time elapsed as of a given intermediate date "date". function p.percent(frame) local parent = mw.getCurrentFrame:getParent local date = parent:expandTemplate{ title = 'MDY to Julian', frame.args['date']} local updated = parent:expandTemplate{ title = 'MDY to Julian', frame.args['updated']} local start = parent:expandTemplate{ title = 'MDY to Julian', '1/1/2006' } percent = 100 * (date - start)/(updated - start) return percent end

--Draws interior gray bars on odd years function p.stripes(frame) local parent = mw.getCurrentFrame:getParent local updated = frame.args['updated'] local year_updated = parent:expandTemplate{ title = 'str rightc', args = {updated, 4} } local stripes = '' for year = 2006, year_updated, 2 do stripes = stripes .. ' ' end

return stripes end

return p