summaryrefslogtreecommitdiff
path: root/activity.lua
blob: 55cb06135a0c853989d53cc420d79e32b847ba27 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
local dates = require "activity.dates"
local git = require "activity.git"
local activity = {}


local
function level (count)
	if 0 < count and count <= 2 then
		return 1
	end
	if 2 < count and count <= 4 then
		return 2
	end
	if 4 < count and count <= 6 then
		return 3
	end
	if 6 < count then
		return 4
	end
	return 0
end


local
function generate_rolling (lookup, format, date)
	date = date or os.date"*t"
	local rows = ""
	local weekdays = {"", "Mon", "", "Wed", "", "Fri", ""}

	local function year_and_day (week, weekday)
		local days = week * 7 + date.wday - weekday
		local at = dates.before(date, days)
		return at.year, dates.day_of_year(at)
	end

	local head = format.start_document"Activity" .. format.start_table()
	for index, weekday in pairs(weekdays) do
		rows = rows .. format.start_row() ..  format.label(weekday)
		for week=0,51 do
			rows = rows .. format.cell(level(lookup(year_and_day(52 - week, index))))
		end
		if date.wday >= index then
			rows = rows .. format.cell(level(lookup(year_and_day(0, index))))
		else
			rows = rows .. format.spot()
		end
		rows = rows .. format.end_row()
	end
	return head .. rows .. format.end_table() .. format.end_document()
end


function activity.generate_table (year, lookup, format, ...)
	if year == "rolling" then
		return generate_rolling(lookup, format, ...)
	end
	year = year or dates.this_year()

	local function day_of_year (first_weekday, week, weekday)
		return week * 7 + weekday - first_weekday + 1
	end

	local function day_level (first_weekday, week, weekday)
		return level(lookup(year, day_of_year(first_weekday, week, weekday)))
	end

	local function cell (exists)
		if not exists then
			return format.spot
		end
		return format.cell
	end

	local function row (weekday, index, start_from, first, last)
		first = cell(first)
		last = cell(last)
		local row = format.start_row() .. format.label(weekday)
		row = row .. first(day_level(start_from, 0, index))
		for week=1,51 do
			row = row .. format.cell(day_level(start_from, week, index))
		end
		row = row .. last(day_level(start_from, 52, index)) .. format.end_row()
		return row
	end

	local rows = ""
	local weekdays = {"", "Mon", "", "Wed", "", "Fri", ""}
	local start_from = dates.first_week_day(year)
	local end_at = (start_from + dates.days_in(year) - 1) % 7
	for index, weekday in pairs(weekdays) do
		rows = rows .. row(weekday, index, start_from, index >= start_from, index <= end_at)
	end
	return format.start_document"Activity" .. format.start_table() .. rows .. format.end_table() .. format.end_document()
end


return activity