文档格式化成HTML

把文档格式化成了THML,并没有处理所有thml规则,只是处理了一部分,功能不重要,重要的是复习熟悉下Python对文档的处理细节。毕竟Python大多数给我的印象都是处理文档。代码里有很多逻辑可能不严谨,这里再次强调只是为了复习字符串以及文档操作。

同时提醒一下,如果运行失败,请删除注释,我是用vs2015编写的,返现当时中文注释导致编码错误运行失败。一共四个文档:

入口文档是markup.py。

参数 python markup.py < xxx.txt > xxx.html

执行效果和代码如下:

Util.py

def lines(file):for line in file:yield lineyield '\n'def blocks(file):block = []for line in lines(file):if line.strip():   #'\n','\r','\t',' 'block.append(line);elif block:yield ''.join(block).strip()block = []

Handlers.py

class Handler:"""处理从Parser调用的方法的对象。这个解析器会在每个块的开始部分调用start()和end()方法,使用合适的块名作为参数,sub()方法会用于正则表达式替换中。当使用了'emphasis'这样的名字调用时,它会返回合适的替换函数。"""def callback(self ,prefix ,name ,*args):method = getattr(self ,prefix + name ,None)if callable(method) : return method(*agrs)def start(self ,name):self.callback('start_',name);def end(self ,name):self.callback('end_',name);def sub(self ,name):def substitution(match):result = self.callback('sub_' ,name ,match)if result is None: match.group(0)return resultreturn substitutionclass HTMLRenderer(Handler):"""用于生成HTML的具体处理程序THMLRenderer内容的方法都是可以通过超类处理程序的start()、end()和sub()方法来访问。他们实现了用于HTRML文档的基本标签。"""def start_document(self):print('<html><head><title>...</title></head><body>')def end_document(self):print('</body></html>')def start_paragraph(self):print('<p>')def end_paragraph(self):print('</p>')def start_heading(self):print('<h2>')def end_heading(self):print('</h2>')def start_list(self):print('<ul>')def end_list(self):print('</ul>')def start_listitem(self):print('<li>')def end_listitem(self):print('</li>')def start_title(self):print('<title>')def end_title(self):print('</title>')def sub_emphasis(self ,match):return ('<em>%s</em>' % match.group(1))def sub_url(self ,match):return ('<a href = "%s">%s</a>' % (match.group(1),match.group(1)))def sub_mail(self ,match):return ('<a href="mailto:%s">%s</a>' % (match.group(1),match.group(1)))def feed(self ,data):print(data)

Rules.py

class Rule:"""所有规则的基类。"""def action(self ,block ,handler):handler.start(self.type)handler.feed(block)handler.end(self.type)return Trueclass HeadingRule(Rule):"""标题占一行,最多70个字符,并且不以冒号结尾。"""type = 'heading'def condition(self ,block):return not '\n' in block and len(block) <= 70 and not block[-1] == ':'class TitleRule(HeadingRule):"""题目是文档的第一个块,但前提它是大标题。"""type = 'title'first = Truedef condition(self, block):if not self.first:return Falseself.first = HeadingRule.condition(self ,block)class ListItemRule(Rule):"""列表项是以连字符开始的段落。作为格式化的一部分,要移除连字符。"""type = 'listitem'def condition(self ,block):return block[0] == '-'def action(self, block, handler):handler.start(self.type)handler.feed(block[1:].strip())handler.end(self.type)return Trueclass ListRule(ListItemRule):"""列表从不是列表项的块和岁以后的列表项之间。在最后一个连续的列表项之后结束。"""type = 'list'inside = Falsedef condition(self ,block):return Truedef action(self, block, handler):if not self.inside and ListItemRule.condition(self ,block):handler.start(self.type)self.inside = Trueelif self.inside and not ListItemRule.condition(self ,block):handler.end(self.type)self.inside = Falsereturn Falseclass ParagraphRule(Rule):"""段落只是其他规则并没有覆盖到的块"""type = 'paragraph'def condition(self ,block):return True

Markup.py

import sys,re
from handlers import *
from util import *
from rules import *class Parser:#"""#语法分析器读取文本文件、应用规则并且控制处理程序# """def __init__(self ,handler):self.handler = handlerself.rules = []self.filters = []def addRule(self ,rule):self.rules.append(rule)def addFilter(self ,pattern ,name):def filter(bolck ,handler):return re.sub(pattern ,handler.sub(name),bolck)self.filters.append(filter)def parse(self ,file):self.handler.start('document')for block in blocks(file):for filter in self.filters:block = filter(block ,self.handler)for rule in self.rules:if rule.condition(block):last = rule.action(block ,self.handler)if last : breakself.handler.end('document')class BasicTextParser(Parser):"""在构造函数中添加规则和过滤器的具体语法分析器"""def __init__(self, handler):Parser.__init__(self ,handler)self.addRule(ListRule)self.addRule(ListItemRule)self.addRule(TitleRule)self.addRule(HeadingRule)self.addRule(ParagraphRule)self.addFilter(r'\*(.+?)\*' ,'emphasis')self.addFilter(r'(http://[\.a-zA-Z/]+)' ,'url')self.addFilter(r'([\.a-zA-Z])+@[\.a-zA-Z]+[a-zA-Z]+)' ,'mail')handler = HTMLRenderer()
parser = BasicTextParser(handler)parser.parse(sys.stdin)

Python练习1-文档格式化成html相关推荐

  1. Python修改docx文档格式

    任务:原docx文档修改标题和页面宽高. 步骤:1.原docx文档解压为document.xml(见最后) 2.通过xml解释替换标签属性值,保存为document_format.xml 3.还原do ...

  2. python实现word文档批量转成自定义格式的excel文档

    python实现word转成自定义格式的excel文档(解决思路和代码) 支持按照文件夹去批量处理,也可以单独一个文件进行处理,并且可以自定义标识符 最近在开发一个答题类的小程序,到了录入试题进行测试 ...

  3. pythonmat文件转excel_利用python将图片转换成excel文档格式详解

    本文主要介绍了关于利用python将图片转换成excel文档的相关内容,编写了一小段Python代码,将图片转为了Excel,纯属娱乐,下面这篇文章主要给大家介绍了关于利用python将图片转换成ex ...

  4. Python实现Word文档标题格式判断

    本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 引言 在日常生活里,不管是办公.学习还是制作邀请函.请柬.简历等等,我们都会使用一个软件Microso ...

  5. python处理word文档保留格式_python 处理document文档 保留原样式

    document文档格式.线段.图片.页眉页脚等都不变 # -*- coding: utf-8 -*- # @Time : 2019/5/6 11:46 # @Author : "" ...

  6. python docx修改word文档格式

    修改word文档格式,包括修改目录字体字号间距,修改一级标题字体字号间距,二级标题字体字号间距....正文字体字号间距,表格中的文字的字体字号间距,以图或表开头的图名称和表名称的字体字号间距. wor ...

  7. python下载付费文档教程-付费?是不可能的!处理 PDF 只需几行代码,彻底解放双手!...

    在日常工作中,PDF (Portable Document Format的简称,意为"可携带文档格式") 是我们比较常用的电子文档格式.PDF文件以 PostScript 语言图象 ...

  8. python如何读取公共盘的文档_如何使用 Sphinx 给 Python 代码写文档 | Linux 中国

    最好将文档作为开发过程的一部分.Sphinx 加上 Tox,让文档可以轻松书写,并且外观漂亮.-- Moshe Zadka Python 代码可以在源码中包含文档.这种方式默认依靠 docstring ...

  9. python代码_如何使用 Sphinx 给 Python 代码写文档

    最好将文档作为开发过程的一部分.Sphinx 加上 Tox,让文档可以轻松书写,并且外观漂亮.-- Moshe Zadka(作者) Python 代码可以在源码中包含文档.这种方式默认依靠 docst ...

最新文章

  1. CoreText入坑一
  2. 信息系统项目管理师-案例分析
  3. java对xml文件的解析_Java对XML文件的解析
  4. Vue.js 官方团队成员霍春阳新作,深入解析 Vue.js 设计细节【文末送书】
  5. 在JavaScript中反转字符串的三种方法
  6. 基于51的串行通讯原理及协议详解(uart)
  7. 签名证书无效”-在vCenter Server Appliance 6.5 / 6.7上使用Shell脚本重新生成和替换已过期的STS证书(76719)
  8. Python的permutations和combinations的区别
  9. ASP.NET和ASP程序防止在IE中进行缓存
  10. ARTS打卡计划第二周-Algorithm
  11. 青蓝电影质感LR预设达芬奇/PS/PR/LUT人像lightroom胶片调色滤镜插件
  12. 神经网络和机器学习基础入门分享
  13. 企业微信 网页授权登入
  14. 微型计算机的外存储器 现在普遍采用什么,当前微型计算机上大部分采用的外存储器,不包含什么? 有选择A 硬盘 B 光盘 C 软盘 D 磁带...
  15. 来看看2022年各地移动政务服务新变化
  16. 16 . USART 串口通信实验
  17. STM32F103通过M26实现远程在线IAP
  18. OOC-GCC 特性介绍
  19. Opencv 学习笔记(二)
  20. Qt调节Win屏幕亮度和声音大小

热门文章

  1. Freemarker入门小案例(生成静态网页的其中一种方式)
  2. Android Studio的git功能的使用
  3. Scott Mitchell 的ASP.NET 2.0数据教程之十一: 基于数据的自定义格式化
  4. NOIP2006提高组 能量项链
  5. Spring学习五(JDBC支持)
  6. 防雪崩利器:熔断器 Hystrix 的原理与使用
  7. Android Studio快捷键——编辑篇
  8. C# random helper class
  9. c#设置软件开机自动运行,修改注册表
  10. ListView 排序