X-Git-Url: https://git.mdrn.pl/librarian.git/blobdiff_plain/d04e61819290fc8d6d71b1932c55a774014c1f05..35800232083044a4fa7927c9295f7be611e16227:/src/librarian/document.py?ds=sidebyside diff --git a/src/librarian/document.py b/src/librarian/document.py index c0efd3a..a3ee093 100644 --- a/src/librarian/document.py +++ b/src/librarian/document.py @@ -2,19 +2,25 @@ import gettext import os import re from lxml import etree -from .builders import builders +import six from .parser import parser -from . import dcparser +from . import dcparser, DCNS, DirDocProvider from .functions import lang_code_3to2 class WLDocument: - def __init__(self, tree=None, filename=None): - if filename is not None: - tree = etree.parse(filename, parser=parser) + def __init__(self, filename=None, url=None, provider=None): + source = filename or six.moves.urllib.request.urlopen(url) + tree = etree.parse(source, parser=parser) self.tree = tree tree.getroot().document = self - self.base_meta = dcparser.BookInfo({}, {}, validate_required=False) + self.base_meta = dcparser.BookInfo({}, { + DCNS('language'): ["pol"], + }, validate_required=False) + + self.provider = provider if provider is not None else DirDocProvider('.') + + self.tree.getroot().validate() @property def meta(self): @@ -23,8 +29,17 @@ class WLDocument: return self.tree.getroot().meta return master.meta - def build(self, builder_id, **kwargs): - return builders[builder_id]().build(self, **kwargs) + @property + def children(self): + for part_uri in self.meta.parts or []: + yield type(self)( + filename=self.provider.by_uri(part_uri), + provider=self.provider + ) + + + def build(self, builder, base_url=None, **kwargs): + return builder(base_url=base_url).build(self, **kwargs) def _compat_assign_ordered_ids(self): """ @@ -64,3 +79,13 @@ class WLDocument: _compat_assigns_section_ids_in_elem(child, idfier + '-') _compat_assigns_section_ids_in_elem(self.tree.getroot().master) + + def editors(self): + persons = set(self.meta.editors + + self.meta.technical_editors) + for child in self.children: + persons.update(child.editors()) + if None in persons: + persons.remove(None) + return persons +