Python练习1-文档格式化成html
文档格式化成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相关推荐
- Python修改docx文档格式
任务:原docx文档修改标题和页面宽高. 步骤:1.原docx文档解压为document.xml(见最后) 2.通过xml解释替换标签属性值,保存为document_format.xml 3.还原do ...
- python实现word文档批量转成自定义格式的excel文档
python实现word转成自定义格式的excel文档(解决思路和代码) 支持按照文件夹去批量处理,也可以单独一个文件进行处理,并且可以自定义标识符 最近在开发一个答题类的小程序,到了录入试题进行测试 ...
- pythonmat文件转excel_利用python将图片转换成excel文档格式详解
本文主要介绍了关于利用python将图片转换成excel文档的相关内容,编写了一小段Python代码,将图片转为了Excel,纯属娱乐,下面这篇文章主要给大家介绍了关于利用python将图片转换成ex ...
- Python实现Word文档标题格式判断
本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 引言 在日常生活里,不管是办公.学习还是制作邀请函.请柬.简历等等,我们都会使用一个软件Microso ...
- python处理word文档保留格式_python 处理document文档 保留原样式
document文档格式.线段.图片.页眉页脚等都不变 # -*- coding: utf-8 -*- # @Time : 2019/5/6 11:46 # @Author : "" ...
- python docx修改word文档格式
修改word文档格式,包括修改目录字体字号间距,修改一级标题字体字号间距,二级标题字体字号间距....正文字体字号间距,表格中的文字的字体字号间距,以图或表开头的图名称和表名称的字体字号间距. wor ...
- python下载付费文档教程-付费?是不可能的!处理 PDF 只需几行代码,彻底解放双手!...
在日常工作中,PDF (Portable Document Format的简称,意为"可携带文档格式") 是我们比较常用的电子文档格式.PDF文件以 PostScript 语言图象 ...
- python如何读取公共盘的文档_如何使用 Sphinx 给 Python 代码写文档 | Linux 中国
最好将文档作为开发过程的一部分.Sphinx 加上 Tox,让文档可以轻松书写,并且外观漂亮.-- Moshe Zadka Python 代码可以在源码中包含文档.这种方式默认依靠 docstring ...
- python代码_如何使用 Sphinx 给 Python 代码写文档
最好将文档作为开发过程的一部分.Sphinx 加上 Tox,让文档可以轻松书写,并且外观漂亮.-- Moshe Zadka(作者) Python 代码可以在源码中包含文档.这种方式默认依靠 docst ...
最新文章
- MHA管理所有数据库服务器
- mysql sleep 5908_mysql连接卡死,很多线程sleep状态,导致CPU中mysqld占用率极高(问题原因还待考证)...
- 手机MMI体系结构及其实现
- html css 前端实现消息提醒数_自学的福音,web前端学习全套视频教程+最新学习思维导图都在这里...
- package-lock.json 文件的作用
- mySQL 数据库工具问题总结
- java后端做教育视频网站源码_【Java并发面试点】看这一篇应该是够了
- steam授权_号商福利,Steam验号机器人上线,再也不用手动验号了
- 【转】还原一个真实的银行待遇
- 微弱光信号检测MATLAB,微弱信号检测笔记(更新中... 2021年3月9日)
- 英雄联盟游戏语音无法连接服务器,英雄联盟语音连不上是电脑哪里出问题了
- python 面积计算器
- 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(上)
- 欧盟GDPR通用数据保护条例-原文
- LeetCode刷题-11
- 怎么用java做全民飞机大战_基于VC++和OpenCV实现的全民飞机大战游戏
- Ubuntu16安装docker
- 关于printf与scanf的碎碎念
- 要想提高工作效率,请拒绝做这 7 种事
- 2020最新大厂内部 PHP 高级工程师面试题汇总(一)