文档格式化成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. MHA管理所有数据库服务器
  2. mysql sleep 5908_mysql连接卡死,很多线程sleep状态,导致CPU中mysqld占用率极高(问题原因还待考证)...
  3. 手机MMI体系结构及其实现
  4. html css 前端实现消息提醒数_自学的福音,web前端学习全套视频教程+最新学习思维导图都在这里...
  5. package-lock.json 文件的作用
  6. mySQL 数据库工具问题总结
  7. java后端做教育视频网站源码_【Java并发面试点】看这一篇应该是够了
  8. steam授权_号商福利,Steam验号机器人上线,再也不用手动验号了
  9. 【转】还原一个真实的银行待遇
  10. 微弱光信号检测MATLAB,微弱信号检测笔记(更新中... 2021年3月9日)
  11. 英雄联盟游戏语音无法连接服务器,英雄联盟语音连不上是电脑哪里出问题了
  12. python 面积计算器
  13. 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(上)
  14. 欧盟GDPR通用数据保护条例-原文
  15. LeetCode刷题-11
  16. 怎么用java做全民飞机大战_基于VC++和OpenCV实现的全民飞机大战游戏
  17. Ubuntu16安装docker
  18. 关于printf与scanf的碎碎念
  19. 要想提高工作效率,请拒绝做这 7 种事
  20. 2020最新大厂内部 PHP 高级工程师面试题汇总(一)

热门文章

  1. 调研:移动OA受热捧 企业更关注协同办公
  2. 【数据蒋堂】第15期:开放的计算能力为数据库瘦身
  3. 大型企业云化2.0的深度思考与展望
  4. 傲笑九天志在必得,卧薪尝胆勇者无畏.
  5. Unix时间戳转换(python)
  6. oracle定时任务失效
  7. linux 如何查看服务和端口
  8. 《浪潮之巅》读书笔记汇总
  9. git的团队协作开发
  10. jqGrid edit总结