功能:将文本文件转换成html格式的文档。

方法:

1.添加初始标签

2.智能分段

#util.py
def lines(file):
#遍历文本文件,用生成器保存每行
for
line in file:yield
line #此时获取到第一行的值后,会暂停,返回到被调用的地方,即blocks函数语句中
#在文件最后添加空行
yield
'\n'
def blocks(file):
block=[]
#lines函数返回的yield存储值,拿来每行遍历,根据是否有空行找出段落
for
line in lines(file):
#判断是否为字符串,字符串才有split()方法,如果有,追加到block里,开始回到lines中进入到下一次循环,
if
line.strip():
block.append(line)
#如果不是字符串,那么将block里的内容去空格并追加到空字符串''后,然后清空block,避免重复内容
elif
block:
yield
''.join(block).strip()
block=[]
#simple_markup.py
import sys,re
from util import *
print '...'
title=True
for block in blocks(sys.stdin):
block=re.sub(r'\*(.+?)\*',r'\1',block)
if
title:
print
'</pre>
'
print
block
print
'</h1>
'
title=False
else:
print
'
'
print
block
print
'
'
print ''

数据流是这样的:

python simple_markup.py f1output.html

回车运行,首先打印初始标签,然后进入for循环,调用到util.py里面的blocks函数,blocks函数中的循环调用到lines函数,生成一个新的文本文件(其实就是最后面加了一个空行),然而在用到yield生成器的过程中非常有意思:

首先在lines里面遍历原始文件的每行,每遍历一行后,会暂停并将值返回给blocks函数,blocks收到后进入if判断,是字符串,则追加到空列表中。否则将其字符串化”.join(block).strip()

第一次循环之后,程序回到lines函数暂停的地方,就是util.py第4行,继续遍历原始文件,从第二行开始。当遇到空行,返回值将是空,那就会进入到elif判断中,将blocks列表里的内容字符串化,并回到simple_markup.py中去。

进入simple_markup.py的循环中之后,如果原始文件还没读完,会再回去进行下一次循环,直到全部完成,最后一次循环是:yield

\n添加空行返回给blocks,由于为空,进入elif,将内容结算后,清空再次循环,再次进入到elif

判定为false不再继续,程序结束。

涉及的知识点:

1.sys.stdin

2.生成器yield

3.正则表达式的过滤

sys.stdin 标准输入,手册里没多讲,在使用使用时作为参数运行,python

simple_markup.pyfilename2,读filename1的内容写入,输出到filename2中

生成器参考这篇,写的太好了!

正则表达式,这里用到的re.sub(r’”(.*?)”‘,r’\1‘,block)

代表将block的内容里面“”之内的内容转换为加上标签的形式。\1(数字1)代表反向引用,稍后详解。

值返回给simple_markup.py中的循环判断,第一行的值作为首行

其余的为段落,最后打印结尾标签。