含有章节索引的 *PUG 文章通用模板 ::-- ["hf_linux"] [DateTime(2008-09-28T07:07:21Z)] TableOfContents
1. 文章大标
用python生成xtree树形菜单
1.1. 模型
1.1.1. 模型代码
1 #coding=utf-8
2 class TreeObject(object):
3 def __init__(self,name="",action="",xmlSrc=""):
4 self.name = name
5 if action:
6 self.action = "\""+action+"\""
7 else:
8 self.action = "null"
9 self.__xmlSrc = xmlSrc #tree.xmlSrc="/getNOde ?...."
10 self.icon = "null"
11 self.openIcon = "null"
12 self.parent = ""
13 self.spanLevel = 1
14 self.subTreeItems = []
15
16 def addSubTreeItem(self,treeItem):
17 self.subTreeItems.append(treeItem)
18 treeItem.parent = self
19 #TODO :escape
20 def setXmlSrc(self,xmlSrc):
21 self.__xmlSrc = xmlSrc
22 def getXmlSrc(self):
23 return self.__xmlSrc
24 xmlSrc = property(getXmlSrc,setXmlSrc)
25
26 def toXml(self):
27 buf = ""
28 buf += "<tree>\n"
29 i=0
30 for item in self.subTreeItems:
31 tmp = item.itemToXml(i)
32 buf += tmp
33 i+=1
34 buf += "</tree>\n"
35 return buf
36
37
38
39
40 class JsTree(TreeObject):
41 #static variable
42 idxGenerator = ""
43 def __init__(self,name="",action="",xmlSrc=""):
44 if name == "":
45 name = "jsTree"
46 super(JsTree, self).__init__(name,action,xmlSrc)
47 self.rootName = ""
48 self.behavior = "classic"
49
50
51 def getJsTreeStr(self):
52
53 buf= "<script language=\"JavaScript\">" + "\n"
54 if not self.rootName:
55 self.rootName = "root"+ str(JsTree.getJsVariableIndex())
56 #TODO :escapeJavaScript
57 treeRootName = self.rootName
58
59 if not self.xmlSrc:
60 buf += "\tvar "+treeRootName+" = new WebFXTree('" + self.name +"',"+\
61 self.action+",null,"+self.icon +\
62 ","+self.openIcon+");"+"\n";
63 else:
64 buf += "\tvar "+treeRootName+" = new WebFXTree('" + self.name +"',"+\
65 self.xmlSrc + "\",\"" +\
66 self.action+",null,"+self.icon +\
67 ","+self.openIcon+");"+"\n";
68 buf += "\t"+treeRootName+".setBehavior('" + self.behavior + "');" + "\n";
69 for treeItem in self.subTreeItems:
70 tmp = treeItem.buildJsTreeStr(treeRootName,2)
71 buf += tmp
72 # buf += treeItem.buildJsTreeStr(treeRootName,2)
73 buf += "\tdocument.write(" + treeRootName + ");" + "\n"+"</script>\n"
74 return buf
75
76 @staticmethod
77 def indexGenerator():
78 i = 0
79 while True:
80 i = i+1
81 yield i
82
83 @staticmethod
84 def getJsVariableIndex():
85 if not JsTree.idxGenerator:
86 JsTree.idxGenerator = JsTree.indexGenerator()
87 return JsTree.idxGenerator.next()
88
89
90 class TreeItem(TreeObject):
91 def __init__(self,name="",action="",xmlSrc=""):
92 if name == "":
93 name = "TreeItem"
94 super(TreeItem, self).__init__(name,action,xmlSrc)
95
96 def buildJsTreeStr(self,parent,indent):
97 prefix = ""
98 buf = ""
99 try:
100 indent = int(indent)
101 except:
102 indent = 0
103 for i in range(indent):
104 prefix = prefix+"\t"
105
106 item = "tree" + str(JsTree.getJsVariableIndex())
107 buf += prefix + "var " + item
108 if not self.xmlSrc:
109 buf += " = new WebFXTreeItem('"
110 else:
111 buf += " = new WebFXLoadTreeItem('"
112 buf += self.name + "',"
113
114 if self.xmlSrc:
115 buf += "\"" + self.xmlSrc + "\","
116 buf += self.action
117 buf += ",null,"
118 buf += self.icon+","+self.openIcon+");\n"
119 for treeItem in self.subTreeItems:
120 buf += treeItem.buildJsTreeStr(item,indent+1)
121 buf += prefix
122 buf += parent
123 buf += ".add("+item+");\n"
124 return buf
125
126 def itemToXml(self,indent=0):
127 prefix = ""
128 buf=""
129 try:
130 indent = int(indent)
131 except:
132 indent = 0
133 for i in range(indent):
134 prefix = prefix+"\t"
135 buf += prefix+ "<tree text=\""+self.name+"\" "
136 buf += " spanLevel=\""+str(self.spanLevel)+"\" "
137 if self.xmlSrc:
138 # TODO:ESCAPE XML
139 buf += " src=\""+self.xmlSrc+"\" "
140 if self.action:
141 buf += " action=\""+ self.action+"\" "
142 if self.icon:
143 buf += " icon=\""+ self.icon+"\" "
144 if self.openIcon:
145 buf += " openIcon=\""+ self.openIcon+"\" "
146
147 if self.subTreeItems:
148 buf += "/>\n"
149 for treeItem in self.subTreeItems:
150 tmp = treeItem.itemToXml(indent+1)
151 buf += tmp
152 buf += prefix+"</tree>\n"
153 else:
154 buf += "/>\n"
155 return buf
156
157
158
159 class InputTreeItem(TreeItem):
160 def __init__(self,name="",action="",xmlSrc=""):
161 super(InputTreeItem, self).__init__(name,action,xmlSrc)
162 self.fieldName = ""
163 self.fieldValue = ""
164 self.checked = False
165 self.inputType = "checkbox"
166
167 self.js_cls = "WebFXCheckBoxTreeItem"
168 self.js_xload_cls = "WebFXCheckBoxLoadTreeItem"
169
170 def buildJsTreeStr(self,parent,indent):
171 if not self.fieldName:
172 raise ValueError("fieldName can't be null")
173 if not self.fieldValue:
174 raise ValueError("fieldValue can't be null")
175
176 try:
177 indent = int(indent)
178 except:
179 indent = 0
180
181 buf = ""
182 prefix = ""
183 for i in range(int(indent)):
184 prefix += "\t"
185 treeItem = "tree" + str(JsTree.getJsVariableIndex())
186 buf += prefix + "var " + treeItem
187 if self.xmlSrc:
188 buf += " = new " +self.js_xload_cls +"('"
189 else:
190 buf += " = new "+ self.js_cls+" ('"
191 buf += self.name + "',"
192 if self.xmlSrc:
193 buf += "\""+self.xmlSrc+"\","
194 buf += "' " + self.fieldName + "','"+self.fieldValue
195 if self.checked:
196 booleanStr = "true"
197 else:
198 booleanStr = "false"
199 buf += "' , "+self.action+","+booleanStr+",null,"
200 buf += self.icon + "," + self.openIcon+");\n"
201 for curItem in self.subTreeItems:
202 tmp = curItem.buildJsTreeStr(treeItem,indent+1)
203 buf += tmp
204 buf += prefix + parent+".add("+treeItem+");\n"
205 return buf
206
207 def itemToXml(self,indent):
208 prefix = ""
209 buf=""
210 try:
211 indent = int(indent)
212 except:
213 indent = 0
214 for i in range(indent):
215 prefix = prefix+"\t"
216 buf += prefix+ "<tree text=\""+self.name+"\" "
217 buf += " inputType=\""+self.inputType+"\" "
218
219 buf += " spanLevel=\""+str(self.spanLevel)+"\" "
220 if self.xmlSrc:
221 buf += " src=\""+self.xmlSrc+"\" "
222
223 if self.fieldName:
224 buf += " fieldName=\""+self.fieldName+"\" "
225 if self.fieldValue:
226 buf += " fieldValue=\""+self.fieldValue+"\" "
227
228 if self.checked:
229 booleanStr = "true"
230 else:
231 booleanStr = "false"
232 buf += " checked=\""+booleanStr+"\" "
233
234 if self.action:
235 buf += " action=\""+ self.action+"\" "
236 if self.icon:
237 buf += " icon=\""+ self.icon+"\" "
238 if self.openIcon:
239 buf += " openIcon=\""+ self.openIcon+"\" "
240
241 if self.subTreeItems:
242 buf += "/>\n"
243 for treeItem in self.subTreeItems:
244 tmp = treeItem.itemToXml(indent+1)
245 buf += tmp
246 buf += prefix+"</tree>\n"
247 else:
248 buf += "/>\n"
249 return buf
250
251 class CheckboxTreeItem(InputTreeItem):
252 def __init__(self,name="",action="",xmlSrc=""):
253 super(CheckboxTreeItem, self).__init__(name,action,xmlSrc)
254 self.inputType = "checkbox"
255 self.js_cls = "WebFXCheckBoxTreeItem"
256 self.js_xload_cls = "WebFXCheckBoxLoadTreeItem"
257
258 class RadioTreeItem(InputTreeItem):
259 def __init__(self,name="",action="",xmlSrc=""):
260 super(RadioTreeItem, self).__init__(name,action,xmlSrc)
261 self.inputType = "radio"
262 self.js_cls = "WebFXRadioTreeItem"
263 self.js_xload_cls = "WebFXRadioLoadTreeItem"
264
265
266 if __name__ == "__main__":
267 tree = JsTree()
268 tree1 = TreeItem('tree1')
269 tree2 = TreeItem('tree2')
270 tree3 = TreeItem('tree3')
271 tree2.addSubTreeItem(tree3)
272 tree1.addSubTreeItem(tree2)
273 tree.addSubTreeItem(tree1)
274
275
276 input1 = RadioTreeItem('input1')
277 input1.fieldName = "input1"
278 input1.fieldValue = "input1"
279
280
281 input2 = RadioTreeItem('input2')
282 input2.fieldName = "input2"
283 input2.fieldValue = "input2"
284 input2.xmlSrc = "dddd"
285
286
287 input3 = RadioTreeItem('input3')
288 input3.fieldName = "input3"
289 input3.fieldValue = "input3"
290
291 input2.addSubTreeItem(input3)
292 input1.addSubTreeItem(input2)
293 tree.addSubTreeItem(input1)
294 tree1.addSubTreeItem(input1)
295
296 print tree.getJsTreeStr()
297 print tree1.itemToXml()
1.1.1.1. 次节标题1
xxx
1.2. 章标题2
1.2.1. 小节标题2
其它 代码引用
1.2.1.1. 次节标题2
yyy
