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