Files
journal/generate.py
2021-06-21 17:30:14 +03:00

151 lines
3.9 KiB
Python

from common import format_timestamp
import json
import textwrap
def wrap_text(text):
return textwrap.fill(text, 80,
replace_whitespace=False,
break_on_hyphens=False,
break_long_words=False)
def generate_godword(value):
return f"{' '.join(value[:10])}\n{' '.join(value[10:])}"
def generate_habits(value):
return '\n'.join(f'[{"x" if v else "-"}] {k}' for k,v in value.items())
def generate_notifications(value):
return '\n'.join(f'[[{n["source"]}]] {n["message"]}' for n in value)
def generate_tasks(value):
return '\n'.join(f'[{"x" if v else "-"}] {k}' for k,v in value.items())
header_modules = {
'godword': generate_godword,
'habits': generate_habits,
'notifications': generate_notifications,
'tasks': generate_tasks,
}
def generate_diet(block):
_, amount, food = block.values()
return f'@diet {amount}g {food}'
def generate_exercise(block):
if block['kind'] == 'walk':
return f'@exercise walk {block["minutes"]}min {block["distance"]}km {block["steps"]}steps'
elif block['kind'] == 'calisthenics':
return f'@exercise calisthenics {block["sets"]}x{block["reps"]} {block["exercise"]}'
assert False
def generate_default(block):
return f'@{block["type"]} {block["value"]}'
def generate_post(block):
result = '@post'
if ts := block.get('timestamp'):
result += f' {format_timestamp(ts)}'
if content := block.get('content'):
result += f' {content}'
return wrap_text(result)
def generate_timer(block):
parts = [f'@{block["type"]}']
if name := block.get('name'):
parts.append(name)
if ts := block.get('timestamp'):
parts.append(format_timestamp(ts))
return ' '.join(parts)
def generate_info(block):
return wrap_text(f'@info {block["value"]}')
def generate_notes(block):
parts = ['@notes']
if source := block.get('source'):
parts.append(source)
if title := block.get('title'):
parts.append(title)
return '\n'.join(parts)
def generate_notify(block):
return f'@notify {block["day"]} {block["message"]}'
entry_modules = {
'diet': generate_diet,
'exercise': generate_exercise,
'hide': lambda _: '@hide',
'post': generate_post,
'info': generate_info,
'notes': generate_notes,
'behavior': generate_default,
'task': generate_default,
'start': generate_timer,
'stop': generate_timer,
'done': generate_timer,
'notify': generate_notify,
}
def generate_page(day, header, entries):
result = f'# {day}'
for name, value in header.items():
result += f'\n\n{name.title()}:\n'
result += header_modules[name](value)
def format_block(block, is_first):
def format_text(text):
if all(c == '\n' for c in block):
return text
DUMMY_TS = '2020-02-02 02:02:02 '
if is_first:
text = DUMMY_TS + text
length = len(text)
if length > 80:
text = wrap_text(text)
if is_first:
text = text.removeprefix(DUMMY_TS)
return text
def format_module(module):
return entry_modules[module['type']](module)
formatted = format_text(block) if isinstance(block, str) else format_module(block)
if result[-1] != '\n' and not all(c == '\n' for c in formatted):
formatted = ' ' + formatted
return formatted
for entry in entries:
result += f'\n\n{format_timestamp(entry["timestamp"])}'
for i, block in enumerate(entry['blocks']):
result += format_block(block, i == 0)
result += '\n'
return result
if __name__ == '__main__':
journal = json.load(open('journal.json'))
for curr_day in journal:
header, entries = journal[curr_day].values()
page = generate_page(curr_day, header, entries)
print(page)