含有章节索引的 *PUG 文章通用模板 ::-- hf_linux [2008-09-28 07:07:21]

CPUG联盟::

CPUG::门户plone

BPUG

SPUG

ZPUG

SpreadPython Python宣传

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

目标效 果 52358ed7193247e197b29d5d8565ed92

1.2. 章标题2

1.2.1. 小节标题2

其它
代码引用

1.2.1.1. 次节标题2

2. 反馈

Name Password4deL ;) :( X-( B-)
PageCommentData