Size: 647
Comment:
|
Size: 2957
Comment:
|
Deletions are marked like this. | Additions are marked like this. |
Line 14: | Line 14: |
OtTool.py 为主程序。我先用它生成了一个输出结果,以便进行对照。 | * OtTool.py 为主程序。我先用它生成了一个输出结果,以便进行对照。 |
Line 16: | Line 16: |
分析OtTool.py 的执行过程,先进行文件处理,再根据输入的XML文档进行解析,然后根据提供的模板生成程序。 | * 分析OtTool.py 的执行过程:先进行文件处理,再根据输入的XML文档进行解析,然后根据提供的模板生成程序。 |
Line 18: | Line 18: |
对于我感兴趣的模板替换处理阅读小新编写的OtTDict.py。 | * 对于我感兴趣的模板替换处理阅读小新编写的OtTDict.py。 |
Line 20: | Line 20: |
2. 得到结果如下: | 2. 分析结果如下: |
Line 22: | Line 22: |
* 整个模板数据只有一个,而meteor对于每一个模板均需要一个数据字典。当然是可以考虑共用一个。 * OtTDict.py 确如Zoom.quiet所讲是一个体力活,它完成XML数据字典转换为模板变量值的过程,替换过程是一个通用的方法。不过一些模板的循环处理都是要通过程序才可以实现。编程量相对大。 3. 测试准备: * 只对pcon-pmsg.py进行测试,因此先要将其改成meteor要求的格式。因为在原模板中不能定义子模板,因此还要分离相应的子模板。文件查看:attachment:pcon-pmsg_tmpl.py 下面只显示主要部分,注释什么地去掉了。同时模板变量的定义保持原样。 {{{#!python #coding=utf-8 from Template import T main=T("""# -*- coding: utf-8 -*- #...略去注释 from ###Lprotoname###.message import ###MsgBase### import struct class ###Uprotoname###PMessage(###MsgBase###.ByteMessage): \"\"\"二进制流连接消息基类\"\"\" def __init__(self): # 消息头 self.head = ###MsgBase###.ByteMessageHead(self) # 消息体 self.body = ###MsgBase###.ByteMessageBody(self) # 消息工具 self.msgutilcls = ###Uprotoname###PMessageUtil # 协议名称 self.protocolname = '###Lprotoname###p' # 当前的消息名称 self.msgname = '' ###Commands### class ###Uprotoname###PMessageUtil(###MsgBase###.ByteMessageUtil): \"\"\"二进制长连接消息处理工具类\"\"\" def __init__(self): pass # 消息定义 ###Uprotoname###PMessageUtil.commandinfo = { ###Commandsinfo### } # 通过名称查出消息ID的结构定义 ###Uprotoname###PMessageUtil.nametoid = {} for k in ###Uprotoname###PMessageUtil.commandinfo.keys(): ###Uprotoname###PMessageUtil.nametoid[###Uprotoname###PMessageUtil.commandinfo[k]] = k """) Commands = T(""" def pack_###Lprotoname###p_###commandname###(self, fields): ###packcontent### def unpack_###Lprotoname###p_###commandname###(self, fields): ###unpackcontent### """) Lprotoname = T("###lpname###") Uprotoname = T("###upname###") packcontent = T('') unpackcontent = T('') Commandsinfo=T(" ###flag### : '###name###',\n") }}} |
含有章节索引的中文 文章模板
-- limodou [DateTime(2004-08-27T01:30:31Z)] TableOfContents
Otter模板测试记录
这是我记录使用meteor生成Otter模板的记录
测试准备
- 分析Otter模板的整体框架
- 分析结果如下:
- 整个模板数据只有一个,而meteor对于每一个模板均需要一个数据字典。当然是可以考虑共用一个。
- OtTDict.py 确如Zoom.quiet所讲是一个体力活,它完成XML数据字典转换为模板变量值的过程,替换过程是一个通用的方法。不过一些模板的循环处理都是要通过程序才可以实现。编程量相对大。
- 测试准备:
- 只对pcon-pmsg.py进行测试,因此先要将其改成meteor要求的格式。因为在原模板中不能定义子模板,因此还要分离相应的子模板。文件查看:attachment:pcon-pmsg_tmpl.py
- 下面只显示主要部分,注释什么地去掉了。同时模板变量的定义保持原样。
- 只对pcon-pmsg.py进行测试,因此先要将其改成meteor要求的格式。因为在原模板中不能定义子模板,因此还要分离相应的子模板。文件查看:attachment:pcon-pmsg_tmpl.py
1 #coding=utf-8
2 from Template import T
3
4 main=T("""# -*- coding: utf-8 -*-
5 #...略去注释
6
7 from ###Lprotoname###.message import ###MsgBase###
8 import struct
9
10 class ###Uprotoname###PMessage(###MsgBase###.ByteMessage):
11 \"\"\"二进制流连接消息基类\"\"\"
12 def __init__(self):
13 # 消息头
14 self.head = ###MsgBase###.ByteMessageHead(self)
15 # 消息体
16 self.body = ###MsgBase###.ByteMessageBody(self)
17 # 消息工具
18 self.msgutilcls = ###Uprotoname###PMessageUtil
19 # 协议名称
20 self.protocolname = '###Lprotoname###p'
21 # 当前的消息名称
22 self.msgname = ''
23
24 ###Commands###
25
26 class ###Uprotoname###PMessageUtil(###MsgBase###.ByteMessageUtil):
27 \"\"\"二进制长连接消息处理工具类\"\"\"
28 def __init__(self):
29 pass
30
31 # 消息定义
32 ###Uprotoname###PMessageUtil.commandinfo = {
33 ###Commandsinfo###
34 }
35
36 # 通过名称查出消息ID的结构定义
37 ###Uprotoname###PMessageUtil.nametoid = {}
38 for k in ###Uprotoname###PMessageUtil.commandinfo.keys():
39 ###Uprotoname###PMessageUtil.nametoid[###Uprotoname###PMessageUtil.commandinfo[k]] = k
40
41 """)
42
43 Commands = T(""" def pack_###Lprotoname###p_###commandname###(self, fields):
44 ###packcontent###
45
46 def unpack_###Lprotoname###p_###commandname###(self, fields):
47 ###unpackcontent###
48
49 """)
50
51 Lprotoname = T("###lpname###")
52 Uprotoname = T("###upname###")
53 packcontent = T('')
54 unpackcontent = T('')
55 Commandsinfo=T(" ###flag### : '###name###',\n")