epub covers
[librarian.git] / librarian / meta.py
1 # -*- coding: utf-8 -*-
2 #
3 # This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
4 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
5 #
6 from lxml import etree
7 from librarian import DCNS, SSTNS
8
9
10 def text_value(meta):
11     """ Finds out the text value of metadata element.
12     
13     >>> p = Person()
14     >>> p.text = u"Czajka, Radek"
15     >>> print text_value(p)
16     Radek Czajka
17
18     """
19     if hasattr(meta, 'text_value'):
20         return meta.text_value()
21     else:
22         return meta.text
23
24
25 class Metadata(etree.ElementBase):
26     @classmethod
27     def about(cls, element):
28         meta = cls()
29         meta._about = element
30         return meta
31
32     def get_about(self):
33         if hasattr(self, '_about'):
34             return self._about
35         else:
36             return self.getparent()
37
38     def get(self, key, inherit=True):
39         """ Finds metadata by its element name. """
40         values = self.findall(key)
41         if values:
42             return [text_value(v) for v in values]
43         elif inherit and self.get_about().getparent() is not None:
44             return self.get_about().getparent().meta.get(key)
45         elif inherit and hasattr(self.get_about(), 'meta_context'):
46             return self.get_about().meta_context.get(key)
47         else:
48             return []
49
50     def get_one(self, *args, **kwargs):
51         values = self.get(*args, **kwargs)
52         if values:
53             return values[0]
54         else:
55             return None
56         
57
58     # Specials.
59
60     def author(self):
61         try:
62             return unicode(self.get(DCNS('creator'))[0])
63         except IndexError:
64             return u""
65
66     def slug(self):
67         try:
68             return self.get(DCNS('identifier'))[0].slug()
69         except IndexError:
70             return None
71
72     def title(self):
73         dc_title = self.get(DCNS('title'), inherit=False)
74         if dc_title:
75             return unicode(dc_title[0])
76         else:
77             header = self.get_about().find(SSTNS('header'))
78             if header is not None:
79                 # FIXME: This should be a simple text representation
80                 return header.text
81             else:
82                 return u""
83
84
85 class MetaItem(etree.ElementBase):
86     pass
87
88
89 class Person(MetaItem):
90     def text_value(self):
91         return u" ".join(p.strip() for p in reversed(self.text.rsplit(u',', 1)))
92
93
94 class Identifier(MetaItem):
95     def slug(self):
96         return self.text.rstrip('/').rsplit('/', 1)[-1]