正文

源代码分析:python源程序转换为html页面 2007-02-05 00:01:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/python/23120.html

分享到:

#源代码分析:python源程序转换为html页面 #此文件由 limodou 分析,如果转载请保留此信息 """ MoinMoin - Python Source Parser """ #文档字符串。 每个模块文件都可以有自已的文档字符串 # Imports import cgi, string, sys, cStringIO import keyword, token, tokenize ############################################################################# ### Python Source Parser (does Hilighting) ############################################################################# #token.NT_OFFSET为终结符结束标记,即小于它的都是终结符, #_KEYWORD,_TEXT不是终结符,故要大于它 _KEYWORD = token.NT_OFFSET + 1 _TEXT = token.NT_OFFSET + 2 _colors = { token.NUMBER: '#0080C0', #对分析出的特定单词设定相应的颜色 token.OP: '#0000FF', #NUMBER 数值 OP 操作符 STRING 字符串 token.STRING: '#004080', #COMMENT 注释,在tokenize中才定义了COMMENT tokenize.COMMENT: '#008000', #NAME 标识符 ERRORTOKEN 错误的单词 token.NAME: '#000000', #_KEYWORD 关键字 _TEXT 文本 token.ERRORTOKEN: '#FF8080', _KEYWORD: '#FF0000', _TEXT: '#000000', } class Parser: #定义Parser类 """ Send colored python source. """ #文档字符串 def __init__(self, raw, out = sys.stdout): #初始化函数,输出到标准输出 """ Store the source text. """ self.raw = string.strip(string.expandtabs(raw)) #expandtabs意为将raw中的制表符进行扩展,可以带第二个参数,不带表示一个制表符 #替换成8个空格 #strip是去掉首尾空白,包括回车,所以文件最后如果有回车符,也会去掉的 self.out = out #给实例属性out赋值 def format(self, formatter, form): #格式化处理函数 """ Parse and send the colored source. """ # store line offsets in self.lines #保存每行的偏移量在实例的lines属性中 self.lines = [0, 0] #数据是从0下标开如,而行是从1开始,故放入两个0 pos = 0 while 1: pos = string.find(self.raw, '\n', pos) + 1 #find是从行首开始查找指定字符串,此处查找回车符,pos表示起始位置。 #指定这个参数,可以不从行首开始进行查找 #如果没有找到则返回-1,加1后,如果没有找到pos值为0 if not pos: break #没找到,说明没有回车符了 self.lines.append(pos) #找到了,则将此位置追加到lines后 self.lines.append(len(self.raw)) #将文件最后结束的长度也追加到lines中 # parse the source and write it self.pos = 0 #记录处理的当前位置 text = cStringIO.StringIO(self.raw) #cStringIO是象StringIO一样的类,主要是想提高处理速度,而且处理时,可以象处理 #文件一样,使用文件处理函数 self.out.write('') #输出开始标记 try: tokenize.tokenize(text.readline, self) #进行词法分析,第一个参数为一个对象,它是一个象readline一样的函数 #用来读出一行字符串。在Python中函数也是对象 #text是一个cStringIO对象,可以象文件一样操作,故有readline函数 #第二个参数也为一个对象,它是一个有5个元素的函数,因为传入了self,则需要 #在parser类中定义__call__方法,使self可以象函数一样 except tokenize.TokenError, ex: #如果分析出错产生TokenError异常 msg = ex[0] #出错消息 line = ex[1][0] #出错行 self.out.write("ERROR: %s%s\n" % ( #输出错误信息 msg, self.raw[self.lines[line]:])) self.out.write('') #输出结束标记 def __call__(self, toktype, toktext, (srow,scol), (erow,ecol), line): #可以让对象象函数一样被调用,这个函数将用于tokenize中 #toktype 单词类型 #toktext 单词内容 #(srow,scol)开始行列 #(erow,ecol)结束行列 #line 找到单词的行 """ Token handler. """ if 0: print "type", toktype, token.tok_name[toktype], "text", toktext,"start",\ srow,scol, "end", erow,ecol, "" #调试语句,输出分析过程 # calculate new positions oldpos = self.pos #保存旧位置 newpos = self.lines[srow] + scol #根据保存的行位置计算新位置 self.pos = newpos + len(toktext) #保存下一个要处理的位置 # handle newlines #处理回车 if toktype in [token.NEWLINE, tokenize.NL]: #判断单词是否为回车符 self.out.write('\n') #输出\n,为了保证原格式不变 return # send the original whitespace, if needed # 如果需要输出原始的空白 if newpos > oldpos: self.out.write(self.raw[oldpos:newpos]) # skip indenting tokens # 跳过缩近单词 if toktype in [token.INDENT, token.DEDENT]: self.pos = newpos #调整处理位置 return # map token type to a color group #映射单词类型到相应的颜色 if token.LPAR <= toktype and toktype <= token.OP: #确认操作符范围 toktype = token.OP elif toktype == token.NAME and keyword.iskeyword(toktext): #确认关键字 toktype = _KEYWORD color = _colors.get(toktype, _colors[_TEXT]) #得到颜色,如果不存在,则使用缺省值 style = '' #处理样式 if toktype == token.ERRORTOKEN: style = ' style="border: solid 1.5pt #FF0000;"' # send text self.out.write('' % (color, style)) #输出处理结果 self.out.write(cgi.escape(toktext)) #escape会将特殊字符转变成html实体 #其实只转换了&,<,>,如果第二个参数指定了,表示还要转换" self.out.write('') if __name__ == "__main__": import os, sys if(len(sys.argv)!=3): #判断参数个数,如果不为3,则读入文件名 f1=input("inputfilename:") #输入要处理的.py文件,记住要输入双引号,如:"a.txt" f2=input("outputfilename:") else: f1=sys.argv[1] f2=sys.argv[2] print "Formatting..." #读出要处理的文件内容 source = open(f1).read() #处理第一个文件内容,并写入第二个文件 Parser(source, open(f2, 'wt')).format(None, None) print "Finished"

阅读(5141) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册