def __scanLocaleRoots(self, name): while name and name != 'root': doc = self.__localeAsDoc(name) if doc is not None: yield Node(doc, self.__unDistinguishedAttributes) try: name = self.__parentLocale[name] except KeyError: try: name, tail = name.rsplit('_', 1) except ValueError: # No tail to discard: we're done break
def __localeAsDoc(self, name: str, aliasFor = None): path = f'common/main/{name}.xml' if self.root.joinpath(path).exists(): elt = self.__xml(path) for child in Node(elt).findAllChildren('alias'): try: alias = child.dom.attributes['source'].nodeValue except (KeyError, AttributeError): pass else: return self.__localeAsDoc(alias, aliasFor or name) # No alias child with a source: return elt if aliasFor: raise Error(f'Fatal error: found an alias "{aliasFor}" -> "{name}", ' 'but found no file for the alias')
def __localeAsDoc(self, name, aliasFor = None, joinPath = os.path.join, exists = os.path.isfile): path = ('common', 'main', name + '.xml') if exists(joinPath(self.root, *path)): elt = self.__xml(path) for child in Node(elt).findAllChildren('alias'): try: alias = child.dom.attributes['source'].nodeValue except (KeyError, AttributeError): pass else: return self.__localeAsDoc(alias, aliasFor or name) # No alias child with a source: return elt if aliasFor: raise Error('Fatal error: found an alias "{}" -> "{}", but found no file for the alias' .format(aliasFor, name))
def supplement(self, name): """Loads supplemental data as a Supplement object. The name should be that of a file in common/supplemental/, without path. """ return Supplement(Node(self.__xml(('common', 'supplemental', name))))
def xml(self, *path): """Load a single XML file and return its root element as an XmlScanner. The path is interpreted relative to self.root""" return XmlScanner(Node(self.__xml(path)))