# -*- coding: utf-8 -*- # # This file is a part of Fedora-tour http://fedoraproject.org/wiki/Fedora-tour # # Copyright (c) 2009 Ryan Rix and Ankur Sinha # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # import io import os.path import xml.parsers.expat import sys class MenuNode: parent = 0 class MenuObject: isValid = True currenElement = False rootNode = False activeNode = False Icon = False DocRoot = False Locale = False Priority = False def __init__(self,package): if not os.path.isfile(package): self.isValid = False return None self.parser = xml.parsers.expat.ParserCreate() self.parser.CharacterDataHandler = self.parserCharData self.parser.StartElementHandler = self.parserStartElement self.parser.EndElementHandler = self.parserEndElement self.parser.ParseFile(open(package,"r")) def addNode(self,parent,nodeType): node = MenuNode() node.nodes = list() node.parent = False node.nodeType = nodeType if parent != False: node.parent = parent parent.nodes.append(node) return node def parserCharData(self, data): if self.currenElement == False: pass elif self.currentElement == "DisplayName": self.activeNode.displayName = data elif self.currentElement == "Icon": self.activeNode.icon = findIcon(data) elif self.currentElement == "DocRoot": self.activeNode. def parserStartElement(self, name, attrs): print "Encountered "+name+" node Start" self.currentElement = name if name == "Package": self.rootNode = self.addNode(False,"Package") self.activeNode = self.rootNode elif name == "Page": self.activeNode = self.addNode(self.activeNode, "Page") elif name == "DisplayName": self.currentElement = "DisplayName" elif name == "Icon" or name == "DocRoot" or name == "Locale" or name == "Priority": """ These tags are only allowed under root, so we should err if this happens. """ if self.activeNode.parent != False: print self.rootNode print self.activeNode print "<"+name+"> node is only allowed underneath the Node. Please file a bug on the Fedora-tour Fedora component at http://bugzilla.redhat.com" sys.exit() def parserEndElement(self, name): print "Encountered "+name+" node End" self.currentElement == False if name == "Page": self.activeNode = self.activeNode.parent print MenuObject("../data/package.xml").isValid