模拟手写字迹
写操作系统作业的时候突发奇想,为什么要重复这种体力劳动呢,所以就有了这个东西,而当前网络上可以搜索到的模拟手写的程序都不适配 markdown 的语法,这对一个合格的 cs 学生来说是不可以忍受的,所以加上了适配 markdown 语法的功能。
一、手写模拟部分
- 使用
PIL
库,调用准备好的字库,进行书写 - 由于是模拟人的输入,所以在输出时给每个字赋上随机的偏移,更贴近实际情况
1
2
3
4
5
6# 设置字体格式大小等参数
PIL.ImageFont.truetype(font=None, size=10, index=0, encoding='', layout_engine=None)
# 创建可用于绘制给定图像的对象
PIL.ImageDraw.Draw(im, mode=None)
# 在给定位置绘制字符串
PIL.ImageDraw.ImageDraw.text(xy, text, fill=None, font=None, anchor=None, spacing=4, align="left", direction=None, features=None, language=None, stroke_width=0, stroke_fill=None)
二、markdown 的相关处理
- 使用正则表达式
re
库 - 分析需求,程序应该只需要处理标题,列表等功能,而对于超链接,插入图片,字体加粗删除斜体等功能,不是这个程序需要实现的功能
- 对于标题,先使用正则表达式检测,然后控制输出字体的大小
- 使用
re.sub()
函数,将源文件中的所有字体格式删除 - 对于列表功能,本程序使用较为笨拙的方法,在正则表达式匹配到列表相关内容时,在文本中空出相应的空格,并用特殊字符标记,以便最后输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23def translate(txt):
f = open(txt, 'r', encoding='utf-8')
string = f.read()
f.close()
if '.txt' in txt:
return string
# 直接去掉所有有标题的内容
string = re.sub(r'(#{1,6}) (.+)', tittle, string)
# 有序无序在一起会很丑陋
string = re.sub(r'[.\n][\-\+\*] (.+)', lambda x: '\n'+' ● ' + x.group(1), string)
string = re.sub(r'[.\n][\ ]{4}[\-\+\*] (.+)', lambda x: '\n '+' ○ ' + x.group (1), string)
string = re.sub(r'[.\n][\ ]{8}[\-\+\*] (.+)', lambda x: '\n '+' ■ ' + x. group(1), string)
string = re.sub(r'[.\n](\d.) (.+)', lambda x: '\n '+x.group(1)+x.group(2), string)
string = re.sub(r'[.\n][\ ]{4}(\d). (.+)', list_sub_2, string)
string = re.sub(r'[.\n][\ ]{8}(\d). (.+)', list_sub_3, string)
string = re.sub(r'[.\n][\ ]{12}(\d). (.+)', list_sub_4, string)
# 去掉链接
string = re.sub(r'\[(.+)\]\((.+)\)', lambda x: x.group(1)+'('+x.group(2)+')', string)
# 去掉text内容
for iter in text_re:
string = re.sub(iter, lambda x: x.group(1), string)
return string
三、图形化功能
- 考虑到实际使用的体验,程序应该拥有图形化界面,便于操作
- 使用
pyqt
直接拖动控件设计图形化界面,将最后的mainwindows.ui
文件导出,使用pyuic5
获得mainwindow.py
- 最后将 ui 界面的相关接口和主程序代码链接在一起