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