模拟手写字迹

       写操作系统作业的时候突发奇想,为什么要重复这种体力劳动呢,所以就有了这个东西,而当前网络上可以搜索到的模拟手写的程序都不适配 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
    23
    def 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 界面的相关接口和主程序代码链接在一起

四、源代码

      戳这里