python代码重复输出文本,有没帅哥美女看看。
Welcome to a simple file.
there are not many things to say.
just one thing is exact that is "feigou Linfan".web is 'www.4399.com' and email is feigou@2003.com
上面三行英文是我文本的内容,我期待输出三行,结果
下面给出全部代码
这个是H5文本块生成器.py
import logging
logging.basicConfig(level=logging.INFO, filename='H7mylog.log')
def lines(file):
for line in file:
yield line
yield '\n'
def blocks(file):
block = []
logging.info('www circulation www')
for line in lines(file):
if line.strip():
block.append(line)
logging.info('read line')
elif block:
yield ''.join(block).strip()
logging.info('write block')
block = []
这个是H9handlers.py
class Handler:
def callback(self, prefix, name, *args):
method = getattr(self, prefix + name, None)
if callable(method):
return method(*args)
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 result
return substitution
class HTMLRenderer(Handler):
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('<h1>')
def end_title(self):
print('</h1>')
def sub_emphasis(self, match):
return '<em>{}</em>'.format(match.group(1))
def sub_url(self, match):
return '<a href="{}">{}</a>'.format(match.group(1), match.group(1))
def sub_mail(self, match):
return '<a href="mailto:{}">{}</a>'.format(match.group(1), match.group(1))
def feed(self, data):
print(data)
这个是H91rules.py
class Rule:
def action(self, block, handler):
handler.start(self.type)
handler.feed(block)
handler.end(self.type)
return True
class HeadingRule(Rule):
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 = True
def condition(self, block):
if not self.first:
return False
return 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 True
class ListRule(ListItemRule):
type = 'list'
inside = False
def condition(self, block):
return True
def action(self, block, handler):
if not self.inside and ListItemRule.condition(self, block):
handler.start(self.type)
self.inside = True
elif self.inside and not ListItemRule.condition(self, block):
handler.end(self.type)
self.inside = False
return False
class ParagraphRule(Rule):
type = 'paragraph'
def condition(self, block):
return True
最后是主程序H92markup.py
import re
from H5文本块生成器 import *
from H9handlers import *
from H91rules import *
f = open(r'C:\Users\a\Desktop\纯文本文档.txt')
class Parser:
def __init__(self, handler):
self.handler = handler
self.rules = []
self.filters = []
def addRule(self, rule):
self.rules.append(rule)
def addFilter(self, pattern, name):
def filter(block, handler):
return re.sub(pattern, handler.sub(name), block)
self.filters.append(filter)
def parser(self, file):
self.handler.start('document')
for block in blocks(file): # 第一次仅读取了一行文本, 并没有变成块
logging.info('@@@@@@@@@@circulation@@@@@@@@@@@@')
for filter in self.filters:
logging.info('use filter') # 字符串中的部分字符被指定方式handler替换
block = filter(block, self.handler)
for rule in self.rules: # 自动添加标签
logging.info('use rule')
if rule.condition(block):
logging.info('print 3 lines')
last = rule.action(block, self.handler) # 三行字符串
if last: # 这里有问题,不知道为什么不执行这个判断语句,直到第二次循环
logging.info('-------------------break-------------------')
break
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.parser(f)