from urllib2 import urlopen
from lxml import etree
-from librarian import OPFNS, NCXNS, XHTMLNS, DCNS
+from librarian import OPFNS, NCXNS, XHTMLNS, DCNS, BuildError
from librarian import core
from librarian.formats import Format
from librarian.formats.cover.evens import EvensCover
if cover is not None:
self.cover = cover
- def dc(self, tag):
- return self.doc.meta.get_one(DCNS(tag))
+ def dc(self, tag, multiple=False):
+ if multiple:
+ return ', '.join(self.doc.meta.get(DCNS(tag)))
+ else:
+ return self.doc.meta.get_one(DCNS(tag))
def build(self, ctx=None):
'Information about the resource',
'Publisher: %s' % self.dc('publisher'),
'Rights: %s' % self.dc('rights'),
- 'Intended audience: %s' % self.dc('audience'),
+ 'Intended audience: %s' % self.dc('audience', multiple=True),
self.dc('description'),
'Resource prepared using MIL/PEER editing platform.',
'Source available at %s' % ctx.source_url,
EpubFormat.renderers.register(core.Div, 'list', NaturalText('ul'))
EpubFormat.renderers.register(core.Div, 'list.enum', NaturalText('ol'))
EpubFormat.renderers.register(core.Div, 'item', NaturalText('li'))
+EpubFormat.renderers.register(core.Span, 'item', NaturalText('li'))
class DivImageR(EpubRenderer):
def render(self, element, ctx):
src = element.attrib.get('src', '')
ctx.images.append(src)
+ if '/' not in src:
+ raise BuildError('Bad image URL')
src = src.rsplit('/', 1)[1]
return super(DivImageR, self).render(element, Context(ctx, src=src))
EpubFormat.renderers.register(core.Div, 'img', DivImageR('img'))
+class DivVideoR(Silent):
+ def render(self, element, ctx):
+ src = 'https://www.youtube.com/watch?v=%s' % element.attrib.get('videoid', '')
+ return super(DivVideoR, self).render(element, Context(ctx, src=src))
+
+ def container(self, ctx):
+ root, inner = super(DivVideoR, self).container(ctx)
+ src = getattr(ctx, 'src', '')
+ link = etree.Element('a', {'href': src})
+ link.text = src
+ inner.append(link)
+ return root, inner
+EpubFormat.renderers.register(core.Div, 'video', DivVideoR('p'))
+
+
class HeaderR(NaturalText):
def subcontext(self, element, ctx):
return Context(ctx, inline=True)