示例#1
0
    def getRules(self):
        if not self.rules:
            tree = XSDTree.makeOne(VERIFICATION_FILE_PATH)

            if not tree:
                return self.rules

            root = tree.getroot()
            prefix = root.prefix

            verificationTypes = tree.xpath(
                '//' + prefix +
                ':complexType[contains(@name, "Verification")]',
                namespaces={prefix: XSD_NS})
            for verificationType in verificationTypes:
                name = verificationType.get('name')
                name = name[0].upper() + name[1:-len('Verification')]
                self._setDomains(prefix, verificationType, name)

            ruleNodes = tree.xpath('//' + prefix +
                                   ':element[contains(@name, "Rule")]',
                                   namespaces={prefix: XSD_NS})
            for ruleNode in ruleNodes:
                mathNodes = ruleNode.xpath('.//math:math',
                                           namespaces={"math": MATHML_NS})
                if mathNodes:
                    mathDoc = MathDOM()
                    mathDoc._etree = etree.XML(etree.tostring(mathNodes[0]),
                                               parser=mathDoc._parser)
                    if mathDoc._etree is None:
                        raise NoMathMLException(
                            "The 'math' construction has errors")

                    self.rules.add(
                        Rule(
                            ruleNode.get('name'), mathDoc,
                            mathNodes[0].getparent().get('forInChIList'),
                            self._domains[ruleNode.get('name')]
                            if self._domains.has_key(
                                ruleNode.get('name')) else []))

        rules = set()
        for rule in self.rules:
            rules.add(rule.copy())

        for rule in self.addRules:
            rules.add(rule)

        for rule in self.delRules:
            if rule in rules:
                rules.remove(rule)

        for rule in self.useRules:
            rules.add(rule)

        if self.useRules:
            for rule in self.rules:
                if not rule in self.useRules:
                    if rule in rules:
                        rules.remove(rule)

        return rules