Python练习1-文档格式化成html
生活随笔
收集整理的這篇文章主要介紹了
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 TrueMarkup.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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows PE变形练手3-把通用模
- 下一篇: Python练习2-基本聊天程序-虚拟茶