基于表格的周报及项目总结生成器
python
def read_file(filename):
with open(filename, 'r', encoding='utf-8') as fp:
return fp.read()
def write_file(filename, content):
with open(filename, 'w', encoding='utf-8') as fp:
fp.write(content)
class MarkdownParser:
def __init__(self, content: str):
self.content = content
def parse_md_table(self, md_table_text: str) -> list:
lines = md_table_text.split('\n')
ks = lines[0].strip(' | ').split(' | ')
l = []
for line in lines[2:-1]:
d = dict()
line_items = line.strip(' | ').split(' | ')
for i, e in enumerate(line_items):
d[ks[i]] = e
l.append(d)
return l
def get_structure_data(self) -> list:
day_items = self.content.split("## ")[1:]
l = list()
for day_item in day_items:
day, item = day_item.split('\n', 1)
d = dict()
d['date_range'] = day.split('-')
d['item'] = self.parse_md_table(item)
l.append(d)
return l
def parse_as_tree(self, newest_items: dict) -> dict:
task_dict = dict()
def add_task(key, item):
key_a, key_b = key
if key_a not in task_dict:
task_dict[key_a] = {key_b: [item]}
else:
if key_b not in task_dict[key_a]:
task_dict[key_a][key_b] = [item]
else:
task_dict[key_a][key_b].append(item)
for item in newest_items:
project = item['项目名']
title = item['做了什么']
task = item['具体任务']
add_task((project, title), task)
return task_dict
# weekly report
def get_report(self, tree_data: dict) -> str:
text = []
for i, (ka, kb) in enumerate(tree_data.items()):
text.append(f'[{i+1}]{ka}')
for j, (la, lb) in enumerate(kb.items()):
text.append(f' ({j+1}){la}')
for k, b in enumerate(lb):
text.append(f' {k+1}.{b};')
return '\n'.join(text)
def markdown_to_report_text(self) -> str:
t = []
for newest_items in self.get_structure_data():
date_f = '-'.join(newest_items["date_range"])
t.append(f'## {date_f}')
tree_data = self.parse_as_tree(newest_items['item'])
report_text = self.get_report(tree_data)
t.append(report_text+'\n')
return '\n'.join(t)
# year report
def get_year_report(self, tree_data: dict) -> str:
text = []
for i, (ka, kb) in enumerate(tree_data.items()):
text.append(f'[{i+1}]{ka}')
for j, (la, lb) in enumerate(kb.items()):
text.append(f' ({j+1}){la}')
return '\n'.join(text)
def markdown_to_year_report_text(self) -> str:
xx = []
for newest_items in self.get_structure_data():
xx.extend(newest_items['item'])
tree_data = self.parse_as_tree(xx)
report_text = self.get_year_report(tree_data)
return report_text+'\n'
content = read_file('1.表格记录.md')
parser = MarkdownParser(content)
write_file('2.文字记录.md', parser.markdown_to_report_text())
write_file('3.年终总结.md', parser.markdown_to_year_report_text())