含有章节索引的 *PUG 文章通用模板 ::-- ["hf_linux"] [DateTime(2008-09-28T07:07:21Z)] TableOfContents

Include(CPUGnav)

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

2. 反馈

PageComment2 [:/PageCommentData:PageCommentData]