中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > 综合其它
python源程序转换为html页面
作者:未知 时间:2005-09-13 23:34 出处:Blog.ChinaUnix.net 责编:chinaitpower
              摘要:python源程序转换为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"
Edited by limodou on
04/12/01 08:15 PM.

 

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有