Skip to content

Commit ac97ef6

Browse files
Add journal pages (#14)
This PR adds journal pages in a full page, half page, or quarter page format. Journals per page can be specified in the CLI as ``` --journals-per-page=0 # No journal pages --journals-per-page=1 # Full page journal --journals-per-page=2 # Half page journal --journals-per-page=4 # Quarter page journal ``` ## Full Page ![image](https://user-images.githubusercontent.com/8276147/204025241-d678551f-60c1-42c1-b2be-83bbd148d732.png) ## Half Page ![image](https://user-images.githubusercontent.com/8276147/204025392-3a94023c-2af3-459a-bc9d-04f1f7f4a0fc.png) ## Quarter Page ![image](https://user-images.githubusercontent.com/8276147/204025462-51ae1e44-1878-4df4-b08a-f5d2a4c336ae.png) Signed-off-by: Georgia Stuart <[email protected]>
1 parent 04f32c7 commit ac97ef6

File tree

8 files changed

+157
-26
lines changed

8 files changed

+157
-26
lines changed

.github/workflows/release.yml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ jobs:
2424
work-goals: [{arg: "--work-goals", suffix: ""}, {arg: "--no-work-goals", suffix: "-no-work-goals"}]
2525
daily-pages: [{arg: "--daily-pages", suffix: ""}, {arg: "--no-daily-pages", suffix: "-no-daily"}]
2626
weekly-pages: [{arg: "--weekly-pages", suffix: ""}, {arg: "--no-weekly-pages", suffix: "-no-weekly"}]
27+
journal-pages:
28+
- {arg: "--journals-per-page=0", suffix: ""}
29+
- {arg: "--journals-per-page=1", suffix: "-full-pg-journal"}
30+
- {arg: "--journals-per-page=2", suffix: "-half-pg-journal"}
31+
- {arg: "--journals-per-page=4", suffix: "-quarter-pg-journal"}
2732
steps:
2833
- name: Checkout
2934
uses: actions/checkout@v3
@@ -42,12 +47,12 @@ jobs:
4247
- name: Install playwright browsers
4348
run: playwright install
4449
- name: Build planner pages
45-
run: npm run build -- ${{ matrix.date-ranges.arg }} ${{ matrix.personal-goals.arg }} ${{ matrix.work-goals.arg }} ${{ matrix.daily-pages.arg }} ${{ matrix.weekly-pages.arg }} --file-suffix="-${{ matrix.date-ranges.suffix }}${{ matrix.daily-pages.suffix }}${{ matrix.weekly-pages.suffix }}${{ matrix.personal-goals.suffix }}${{ matrix.work-goals.suffix }}"
50+
run: npm run build -- ${{ matrix.date-ranges.arg }} ${{ matrix.personal-goals.arg }} ${{ matrix.work-goals.arg }} ${{ matrix.daily-pages.arg }} ${{ matrix.weekly-pages.arg }} ${{ matrix.journal-pages.arg }} --file-suffix="-${{ matrix.date-ranges.suffix }}${{ matrix.daily-pages.suffix }}${{ matrix.weekly-pages.suffix }}${{ matrix.personal-goals.suffix }}${{ matrix.work-goals.suffix }}${{ matrix.journal-pages.suffix }}"
4651
- name: Upload planner pdf to artifacts
4752
uses: actions/upload-artifact@v3
4853
with:
49-
name: planner-${{ matrix.date-ranges.suffix }}${{ matrix.daily-pages.suffix }}${{ matrix.weekly-pages.suffix }}${{ matrix.personal-goals.suffix }}${{ matrix.work-goals.suffix }}.pdf
50-
path: dest/planner-${{ matrix.date-ranges.suffix }}${{ matrix.daily-pages.suffix }}${{ matrix.weekly-pages.suffix }}${{ matrix.personal-goals.suffix }}${{ matrix.work-goals.suffix }}.pdf
54+
name: planner-${{ matrix.date-ranges.suffix }}${{ matrix.daily-pages.suffix }}${{ matrix.weekly-pages.suffix }}${{ matrix.personal-goals.suffix }}${{ matrix.work-goals.suffix }}${{ matrix.journal-pages.suffix }}.pdf
55+
path: dest/planner-${{ matrix.date-ranges.suffix }}${{ matrix.daily-pages.suffix }}${{ matrix.weekly-pages.suffix }}${{ matrix.personal-goals.suffix }}${{ matrix.work-goals.suffix }}${{ matrix.journal-pages.suffix }}.pdf
5156
deploy:
5257
needs: build
5358
runs-on: ubuntu-latest

.github/workflows/test.yml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ jobs:
1616
work-goals: [{arg: "--work-goals", suffix: ""}, {arg: "--no-work-goals", suffix: "-no-work-goals"}]
1717
daily-pages: [{arg: "--daily-pages", suffix: ""}, {arg: "--no-daily-pages", suffix: "-no-daily"}]
1818
weekly-pages: [{arg: "--weekly-pages", suffix: ""}, {arg: "--no-weekly-pages", suffix: "-no-weekly"}]
19+
journal-pages:
20+
- {arg: "--journals-per-page=0", suffix: ""}
21+
- {arg: "--journals-per-page=1", suffix: "-full-pg-journal"}
22+
- {arg: "--journals-per-page=2", suffix: "-half-pg-journal"}
23+
- {arg: "--journals-per-page=4", suffix: "-quarter-pg-journal"}
1924
steps:
2025
- name: Checkout
2126
uses: actions/checkout@v3
@@ -34,9 +39,9 @@ jobs:
3439
- name: Install playwright browsers
3540
run: playwright install
3641
- name: Build planner pages
37-
run: npm run build -- ${{ matrix.date-ranges.arg }} ${{ matrix.personal-goals.arg }} ${{ matrix.work-goals.arg }} ${{ matrix.daily-pages.arg }} ${{ matrix.weekly-pages.arg }} --file-suffix="-${{ matrix.date-ranges.suffix }}${{ matrix.daily-pages.suffix }}${{ matrix.weekly-pages.suffix }}${{ matrix.personal-goals.suffix }}${{ matrix.work-goals.suffix }}"
42+
run: npm run build -- ${{ matrix.date-ranges.arg }} ${{ matrix.personal-goals.arg }} ${{ matrix.work-goals.arg }} ${{ matrix.daily-pages.arg }} ${{ matrix.weekly-pages.arg }} ${{ matrix.journal-pages.arg }} --file-suffix="-${{ matrix.date-ranges.suffix }}${{ matrix.daily-pages.suffix }}${{ matrix.weekly-pages.suffix }}${{ matrix.personal-goals.suffix }}${{ matrix.work-goals.suffix }}${{ matrix.journal-pages.suffix }}"
3843
- name: Upload planner pdf to artifacts
3944
uses: actions/upload-artifact@v3
4045
with:
41-
name: planner-${{ matrix.date-ranges.suffix }}${{ matrix.daily-pages.suffix }}${{ matrix.weekly-pages.suffix }}${{ matrix.personal-goals.suffix }}${{ matrix.work-goals.suffix }}.pdf
42-
path: dest/planner-${{ matrix.date-ranges.suffix }}${{ matrix.daily-pages.suffix }}${{ matrix.weekly-pages.suffix }}${{ matrix.personal-goals.suffix }}${{ matrix.work-goals.suffix }}.pdf
46+
name: planner-${{ matrix.date-ranges.suffix }}${{ matrix.daily-pages.suffix }}${{ matrix.weekly-pages.suffix }}${{ matrix.personal-goals.suffix }}${{ matrix.work-goals.suffix }}${{ matrix.journal-pages.suffix }}.pdf
47+
path: dest/planner-${{ matrix.date-ranges.suffix }}${{ matrix.daily-pages.suffix }}${{ matrix.weekly-pages.suffix }}${{ matrix.personal-goals.suffix }}${{ matrix.work-goals.suffix }}${{ matrix.journal-pages.suffix }}.pdf

README.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ iPad app goodnotes 5.
1414
- Daily pages with a hyperlinked mini calendar and week.
1515
- Annual/Monthly/Weekly personal goals (hyperlinked on each page with the target symbol in the bottom right corner).
1616
- Monthly/Weekly work goals (hyperlinked with briefcase symbol in bottom right corner of monthly/weekly pages).
17+
- Journal pages that can be a full page, half page, or quarter page.
1718
- Lots of hyperlinking. If it seems like it should direct to another page, it probably does.
1819

1920
### Screen shots
@@ -51,6 +52,10 @@ iPad app goodnotes 5.
5152

5253
![Weekly work goals](https://user-images.githubusercontent.com/8276147/203632936-8860454b-5de8-4c1d-9826-5b426bd2bee1.png)
5354

55+
#### Journal pages
56+
57+
![Quarter sized pages](https://user-images.githubusercontent.com/8276147/204024505-c29a0b34-8696-42ab-adcd-89d52204c3bb.png)
58+
5459
## Using the generator locally
5560

5661
### Prerequisites
@@ -84,8 +89,8 @@ technique, set margins to none and enable background images.
8489
#### Optional Arguments
8590

8691
```
87-
usage: Python Planner Generator [-h] [--start-time START_TIME] [--end-time END_TIME] [--file-suffix FILE_SUFFIX] [--work-goals | --no-work-goals]
88-
[--personal-goals | --no-personal-goals] [--daily-pages | --no-daily-pages] [--weekly-pages | --no-weekly-pages]
92+
usage: Python Planner Generator [-h] [--start-time START_TIME] [--end-time END_TIME] [--file-suffix FILE_SUFFIX] [--work-goals | --no-work-goals] [--personal-goals | --no-personal-goals]
93+
[--daily-pages | --no-daily-pages] [--weekly-pages | --no-weekly-pages] [--journals-per-page {0,1,2,4}]
8994
start end
9095
9196
GoodNotes 5 Optimized PDF Planner
@@ -105,4 +110,5 @@ options:
105110
--personal-goals, --no-personal-goals
106111
--daily-pages, --no-daily-pages
107112
--weekly-pages, --no-weekly-pages
113+
--journals-per-page {0,1,2,4}
108114
```

src/generator.py

Lines changed: 66 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def build_planner(pages, j2_env: j2.Environment):
4545
return j2_env.get_template('full_planner.html.j2') \
4646
.render(pages=pages)
4747

48-
def build_daily_pages(start: date, end: date, start_t: datetime, end_t: datetime, j2_env: j2.Environment):
48+
def build_daily_pages(start: date, end: date, start_t: datetime, end_t: datetime, goals, j2_env: j2.Environment):
4949
def build_daily_page(inp_date, j2_template: j2.Template, times):
5050
mini_cal = mini_calendar_dates(inp_date.month, inp_date.year)
5151
return j2_template.render(date=inp_date, times=times, mini_cal=mini_cal)
@@ -58,17 +58,24 @@ def build_daily_page(inp_date, j2_template: j2.Template, times):
5858

5959
times = [(start_t + timedelta(hours=i)).strftime('%-I %p').lower() for i in range(num_hours)]
6060

61+
journal_link = False
62+
6163
for i in range(num_days + 1):
6264
cur_date = start + timedelta(days=i)
65+
66+
if goals['journal'] > 0:
67+
journal_link = cur_date.strftime('%Y-%m-%d-journal')
68+
6369
content = build_daily_page(cur_date, daily_template, times)
6470
day_templates[cur_date.strftime('%Y-%m-%d')] = frame_template.render(
6571
content=content,
66-
id=cur_date.strftime('%Y-%m-%d')
72+
id=cur_date.strftime('%Y-%m-%d'),
73+
journal_link=journal_link
6774
)
6875

6976
return day_templates
7077

71-
def build_weekly_pages(start: date, end: date, start_t: datetime, end_t: datetime, work_goals: bool, personal_goals: bool, j2_env: j2.Environment):
78+
def build_weekly_pages(start: date, end: date, start_t: datetime, end_t: datetime, goals, j2_env: j2.Environment):
7279
def build_weekly_page(inp_monday, j2_template: j2.Template, times):
7380
days = []
7481
for i in range(7):
@@ -85,26 +92,31 @@ def build_weekly_page(inp_monday, j2_template: j2.Template, times):
8592

8693
goal_link = False
8794
work_goal_link = False
95+
journal_link = False
8896

8997
while cur_monday < end:
90-
if work_goals:
98+
if goals['work']:
9199
work_goal_link = f"{cur_monday.strftime('%Y-W%W')}-work-goals"
92100

93-
if personal_goals:
101+
if goals['personal']:
94102
goal_link = f"{cur_monday.strftime('%Y-W%W')}-goals"
95103

104+
if goals['journal'] > 0:
105+
journal_link = f"{max(cur_monday, start).strftime('%Y-%m-%d')}-journal"
106+
96107
content = build_weekly_page(cur_monday, weekly_template, times)
97108
week_templates[cur_monday.strftime('%Y-W%W')] = frame_template.render(
98109
content=content,
99110
id=cur_monday.strftime('%Y-W%W'),
100111
goal_link=goal_link,
101-
work_goal_link=work_goal_link
112+
work_goal_link=work_goal_link,
113+
journal_link=journal_link
102114
)
103115
cur_monday += timedelta(days=7)
104116

105117
return week_templates
106118

107-
def build_monthly_pages(start: date, end: date, work_goals: bool, personal_goals: bool, j2_env: j2.Environment):
119+
def build_monthly_pages(start: date, end: date, goals, j2_env: j2.Environment):
108120
def build_monthly_page(cur_month, j2_template: j2.Template):
109121
return j2_template.render(month=cur_month, mini_cal=mini_calendar_dates(cur_month.month, cur_month.year))
110122

@@ -115,26 +127,31 @@ def build_monthly_page(cur_month, j2_template: j2.Template):
115127

116128
work_goal_link = False
117129
goal_link = False
130+
journal_link = False
118131

119132
while cur_month <= end:
120-
if work_goals:
133+
if goals['work']:
121134
work_goal_link = f"{cur_month.strftime('%Y-%m')}-work-goals"
122135

123-
if personal_goals:
136+
if goals['personal']:
124137
goal_link = f"{cur_month.strftime('%Y-%m')}-goals"
138+
139+
if goals['journal'] > 0:
140+
journal_link = f"{cur_month.strftime('%Y-%m-%d-journal')}"
125141

126142
content = build_monthly_page(cur_month, monthly_template)
127143
month_templates[cur_month.strftime('%Y-%m')] = frame_template.render(
128144
content=content,
129145
id=cur_month.strftime('%Y-%m'),
130146
goal_link=goal_link,
131-
work_goal_link=work_goal_link
147+
work_goal_link=work_goal_link,
148+
journal_link=journal_link
132149
)
133150
cur_month += relativedelta(months=+1)
134151

135152
return month_templates
136153

137-
def build_annual_pages(start_year, end_year, work_goals: bool, personal_goals: bool, j2_env: j2.Environment):
154+
def build_annual_pages(start_year, end_year, goals, j2_env: j2.Environment):
138155
def build_annual_page(year, j2_template: j2.Template):
139156
mini_cal_list = []
140157
for i in range(12):
@@ -149,12 +166,12 @@ def build_annual_page(year, j2_template: j2.Template):
149166
goal_link = False
150167

151168
for year in range(start_year, end_year + 1):
152-
if work_goals:
169+
if goals['work']:
153170
# placeholder for when annual goals are implemented
154171
# work_goal_link = f'{year}-work-goals'
155172
work_goal_link = False
156173

157-
if personal_goals:
174+
if goals['personal']:
158175
goal_link = f'{year}-goals'
159176

160177
content = build_annual_page(year, annual_template)
@@ -266,6 +283,28 @@ def build_weekly_work_goal_page(first, j2_template: j2.Template):
266283

267284
return weekly_templates
268285

286+
def build_daily_journal(start: date, end: date, journals_per_page: int, j2_env: j2.Environment):
287+
def build_journal_page(inp_date, j2_template: j2.Template):
288+
days = []
289+
for i in range(journals_per_page):
290+
days.append(inp_date + timedelta(days=i))
291+
return j2_template.render(days=days, journals_per_page=journals_per_page, lines={1: 24, 2: 24, 4: 10})
292+
293+
num_days = (end - start).days
294+
journal_templates = {}
295+
daily_template = j2_env.get_template('journal_pages.html.j2')
296+
frame_template = j2_env.get_template('frame.html.j2')
297+
298+
for i in range(0, num_days + 1, journals_per_page):
299+
cur_date = start + timedelta(days=i)
300+
content = build_journal_page(cur_date, daily_template)
301+
journal_templates[cur_date.strftime('%Y-%m-%d-journal-page')] = frame_template.render(
302+
content=content,
303+
id=cur_date.strftime('%Y-%m-%d-journal-page')
304+
)
305+
306+
return journal_templates
307+
269308
if __name__ == "__main__":
270309
parser = ArgumentParser(prog='Python Planner Generator',
271310
description='GoodNotes 5 Optimized PDF Planner')
@@ -279,6 +318,7 @@ def build_weekly_work_goal_page(first, j2_template: j2.Template):
279318
parser.add_argument('--personal-goals', action=BooleanOptionalAction, default=True)
280319
parser.add_argument('--daily-pages', action=BooleanOptionalAction, default=True)
281320
parser.add_argument('--weekly-pages', action=BooleanOptionalAction, default=True)
321+
parser.add_argument('--journals-per-page', default=0, type=int, choices=[0, 1, 2, 4])
282322

283323
args = parser.parse_args()
284324

@@ -295,16 +335,22 @@ def build_weekly_work_goal_page(first, j2_template: j2.Template):
295335
start_time = datetime(2022, 12, 26, args.start_time, 0, 0)
296336
end_time = datetime(2022, 12, 26, args.end_time, 0, 0)
297337

338+
goals = {
339+
'work': args.work_goals,
340+
'personal': args.personal_goals,
341+
'journal': args.journals_per_page
342+
}
343+
298344
pages = []
299345

300-
pages.extend(build_annual_pages(start_date.year, end_date.year, args.work_goals, args.personal_goals, env).values())
301-
pages.extend(build_monthly_pages(start_date, end_date, args.work_goals, args.personal_goals, env).values())
346+
pages.extend(build_annual_pages(start_date.year, end_date.year, goals, env).values())
347+
pages.extend(build_monthly_pages(start_date, end_date, goals, env).values())
302348

303349
if args.weekly_pages:
304-
pages.extend(build_weekly_pages(start_date, end_date, start_time, end_time, args.work_goals, args.personal_goals, env).values())
350+
pages.extend(build_weekly_pages(start_date, end_date, start_time, end_time, goals, env).values())
305351

306352
if args.daily_pages:
307-
pages.extend(build_daily_pages(start_date, end_date, start_time, end_time, env).values())
353+
pages.extend(build_daily_pages(start_date, end_date, start_time, end_time, goals, env).values())
308354

309355
if args.personal_goals:
310356
pages.extend(build_annual_goal_pages(start_date.year, end_date.year, env).values())
@@ -319,6 +365,9 @@ def build_weekly_work_goal_page(first, j2_template: j2.Template):
319365
if args.weekly_pages:
320366
pages.extend(build_weekly_work_goal_pages(start_date, end_date, env).values())
321367

368+
if args.journals_per_page > 0:
369+
pages.extend(build_daily_journal(start_date, end_date, args.journals_per_page, env).values())
370+
322371
planner = build_planner(pages, env)
323372

324373
generate_html(planner, f'./dest/index{args.file_suffix}.html')

src/templates/daily.html.j2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858

5959
<div class="flex flex-col">
6060
<div class="daily-heading"><div class="mx-auto">notes</div></div>
61-
{% for i in range(15 - ((mini_cal|length) // 7 % 5)) %}
61+
{% for i in range(14 - ((mini_cal|length) // 7 % 5)) %}
6262
<div class="h-5mm border-b border-slate-800"></div>
6363
{% endfor %}
6464
<div class="daily-heading"><div class="mx-auto">

src/templates/frame.html.j2

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
{{ content|safe }}
44
</div>
55
<div class="absolute bottom-0 right-0 text-slate-300 text-2xl pr-6">
6+
{% if journal_link %}
7+
<a href="#{{ journal_link }}"><i class="fa-solid fa-book pl-2"></i></a>
8+
{% endif %}
69
{% if goal_link %}
710
<a href="#{{ goal_link }}"><i class="fa-solid fa-bullseye pl-2"></i></a>
811
{% endif %}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<div>
2+
{% if journals_per_page == 1 %}
3+
<div class="grid grid-cols-2 gap-4">
4+
<div class="flex flex-col" id="{{ days[0].strftime('%Y-%m-%d-journal') }}">
5+
<div class="h-10mm pl-4 flex items-end">
6+
<div class="text-4xl font-playfair font-bold flex justify-between flex-grow pb-2 items-end">
7+
<a href="#{{ days[0].strftime('%Y-%m-%d')}}">{{ days[0].strftime('%-d %B %Y, %A').lower() }}</a>
8+
<a href="#{{ days[0].strftime('%Y-W%W')}}">{{ days[0].strftime('W%-W').lower() }}</a>
9+
</div>
10+
</div>
11+
<div class="border-y border-slate-800 h-5mm flex items-center">
12+
{% include "snippets/journal_icons.html" %}
13+
</div>
14+
{% for i in range(lines[journals_per_page]) %}
15+
<div class="border-b border-slate-800 h-5mm"></div>
16+
{% endfor %}
17+
</div>
18+
<div>
19+
<div class="h-5mm"></div>
20+
{% for i in range(lines[journals_per_page] + 2) %}
21+
<div class="border-b border-slate-800 h-5mm"></div>
22+
{% endfor %}
23+
</div>
24+
</div>
25+
{% elif journals_per_page == 2 or journals_per_page == 4 %}
26+
<div class="grid grid-cols-2 gap-4">
27+
{% for day in days %}
28+
<div class="flex flex-col" id="{{ day.strftime('%Y-%m-%d-journal') }}">
29+
<div class="h-10mm pl-4 flex items-end">
30+
<div class="text-4xl font-playfair font-bold flex justify-between flex-grow pb-2 items-end">
31+
<a href="#{{ day.strftime('%Y-%m-%d')}}">{{ day.strftime('%-d %B %Y, %A').lower() }}</a>
32+
<a href="#{{ day.strftime('%Y-W%W')}}">{{ day.strftime('W%-W').lower() }}</a>
33+
</div>
34+
</div>
35+
<div class="border-y border-slate-800 h-5mm flex items-center">
36+
{% include "snippets/journal_icons.html" %}
37+
</div>
38+
{% for i in range(lines[journals_per_page]) %}
39+
<div class="border-b border-slate-800 h-5mm"></div>
40+
{% endfor %}
41+
</div>
42+
{% endfor %}
43+
</div>
44+
{% endif %}
45+
</div>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<div class="flex-grow grid grid-cols-2">
2+
<div class="flex-grow flex justify-around border-r-2 border-slate-800 text-xl">
3+
<i class="fa-regular fa-face-smile"></i>
4+
<i class="fa-regular fa-face-grin-beam"></i>
5+
<i class="fa-regular fa-face-grimace"></i>
6+
<i class="fa-regular fa-face-tired"></i>
7+
<i class="fa-regular fa-face-frown"></i>
8+
<i class="fa-regular fa-face-sad-cry"></i>
9+
</div>
10+
<div class="flex-grow flex justify-around text-xl">
11+
<i class="fa-solid fa-sun"></i>
12+
<i class="fa-solid fa-cloud-sun"></i>
13+
<i class="fa-solid fa-cloud"></i>
14+
<i class="fa-solid fa-cloud-showers-heavy"></i>
15+
<i class="fa-solid fa-cloud-bolt"></i>
16+
<i class="fa-solid fa-snowflake"></i>
17+
</div>
18+
</div>

0 commit comments

Comments
 (0)