for flag in flags:
document.edoc.getroot().set(flag, 'yes')
+ # add editors info
+ document.edoc.getroot().set('editors', u', '.join(sorted(
+ editor.readable() for editor in document.editors())))
+
opf = xslt(document.book_info.to_etree(), get_resource('epub/xsltContent.xsl'))
manifest = opf.find('.//' + OPFNS('manifest'))
guide = opf.find('.//' + OPFNS('guide'))
</xsl:template>
<xsl:template name="editors">
- <xsl:if test="//dc:contributor.editor[text()]|//dc:contributor.technical_editor[text()]">
+ <xsl:if test="@editors">
<p class="info">
<xsl:text>Opracowanie redakcyjne i przypisy: </xsl:text>
- <xsl:for-each select="//dc:contributor.editor[text()]|//dc:contributor.technical_editor[text() and not(//dc:contributor.editor/text()=text())]">
- <xsl:sort />
- <xsl:if test="position() != 1">, </xsl:if>
- <xsl:apply-templates mode="person" />
- </xsl:for-each>.
- </p>
+ <xsl:value-of select="@editors" />.</p>
</xsl:if>
</xsl:template>
- <xsl:template match="dc:contributor.editor|dc:contributor.technical_editor">
- <br /><xsl:apply-templates mode='person' />
- </xsl:template>
-
<xsl:template match="text()" mode="person">
<xsl:value-of select="wl:person_name(.)" />
</xsl:template>
xpath = self.path_to_xpath(key)
node = self.edoc.xpath(xpath)[0]
repl = etree.fromstring(u"<%s>%s</%s>" %(node.tag, data, node.tag) )
- node.getparent().replace(node, repl);
+ node.getparent().replace(node, repl)
except Exception, e:
unmerged.append( repr( (key, xpath, e) ) )
node.tag = 'span'
node.tail = tail
+ def editors(self):
+ """Returns a set of all editors for book and its children.
+
+ :returns: set of dcparser.Person objects
+ """
+ if self.book_info is None:
+ raise NoDublinCore('No Dublin Core in document.')
+ persons = set(self.book_info.editors +
+ self.book_info.technical_editors)
+ for child in self.parts():
+ persons.update(child.editors())
+ if None in persons:
+ persons.remove(None)
+ return persons
+
# Converters
def as_html(self, *args, **kwargs):
# This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
#
+"""PDF creation library.
+
+Creates one big XML from the book and its children, converts it to LaTeX
+with TeXML, then runs it by XeLaTeX.
+
+"""
from __future__ import with_statement
import os
import os.path
def parse_creator(doc):
- """ find all dc:creator and dc.contributor tags and add *_parsed versions with forenames first """
+ """Generates readable versions of creator and translator tags.
+
+ Finds all dc:creator and dc.contributor.translator tags
+ and adds *_parsed versions with forenames first.
+ """
for person in doc.xpath("|".join('//dc:'+(tag) for tag in (
- 'creator', 'contributor.translator', 'contributor.editor', 'contributor.technical_editor')),
+ 'creator', 'contributor.translator')),
namespaces = {'dc': str(DCNS)})[::-1]:
if not person.text:
continue
# Parse XSLT
try:
document = load_including_children(wldoc)
+ root = document.edoc.getroot()
if cover:
if cover is True:
cover = WLCover
bound_cover = cover(document.book_info)
- document.edoc.getroot().set('data-cover-width', str(bound_cover.width))
- document.edoc.getroot().set('data-cover-height', str(bound_cover.height))
+ root.set('data-cover-width', str(bound_cover.width))
+ root.set('data-cover-height', str(bound_cover.height))
if bound_cover.uses_dc_cover:
if document.book_info.cover_by:
- document.edoc.getroot().set('data-cover-by', document.book_info.cover_by)
+ root.set('data-cover-by', document.book_info.cover_by)
if document.book_info.cover_source:
- document.edoc.getroot().set('data-cover-source', document.book_info.cover_source)
+ root.set('data-cover-source',
+ document.book_info.cover_source)
if flags:
for flag in flags:
- document.edoc.getroot().set('flag-' + flag, 'yes')
+ root.set('flag-' + flag, 'yes')
# check for LaTeX packages
if morefloats:
- document.edoc.getroot().set('morefloats', morefloats.lower())
+ root.set('morefloats', morefloats.lower())
elif package_available('morefloats', 'maxfloats=19'):
- document.edoc.getroot().set('morefloats', 'new')
+ root.set('morefloats', 'new')
# add customizations
if customizations is not None:
- document.edoc.getroot().set('customizations', u','.join(customizations))
+ root.set('customizations', u','.join(customizations))
+
+ # add editors info
+ root.set('editors', u', '.join(sorted(
+ editor.readable() for editor in document.editors())))
# hack the tree
move_motifs_inside(document.edoc)
text = re.sub(ur"([\u0400-\u04ff]+)", ur"<alien>\1</alien>", text)
- document = WLDocument.from_string(text, parse_dublincore=True)
+ document = WLDocument.from_string(text,
+ parse_dublincore=True, provider=provider)
document.swap_endlines()
for child_uri in document.book_info.parts:
</xsl:choose>
</xsl:if>
}
+ \def\editors{<xsl:call-template name="editors" />}
</TeXML>
<cmd name="editorialsection" />
+
</env>
</TeXML>
</xsl:template>
\vspace{.6em}
</xsl:if>}
\def\description{<xsl:apply-templates select=".//dc:description" mode="inline" />}
- \def\editors{<xsl:call-template name="editors" />}
</TeXML>
</xsl:template>
</xsl:template>
<xsl:template name="editors">
- <xsl:if test="//dc:contributor.editor_parsed|//dc:contributor.technical_editor_parsed">
+ <xsl:if test="@editors">
<xsl:text>Opracowanie redakcyjne i przypisy: </xsl:text>
- <xsl:for-each select="//dc:contributor.editor_parsed|//dc:contributor.technical_editor_parsed[not(//dc:contributor.editor_parsed/text()=text())]">
- <xsl:sort select="@sortkey" />
- <xsl:if test="position() != 1">, </xsl:if>
- <xsl:apply-templates mode="inline" />
- </xsl:for-each>.
+ <xsl:value-of select="@editors" />
+ <xsl:text>.</xsl:text>
</xsl:if>
</xsl:template>
setup(
name='librarian',
- version='1.5',
+ version='1.5.1',
description='Converter from WolneLektury.pl XML-based language to XHTML, TXT and other formats',
author="Marek Stępniowski",
author_email='marek@stepniowski.com',
Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN.
-Opracowanie redakcyjne i przypisy: Aleksandra Sekuła, Olga Sutkowska
+Opracowanie redakcyjne i przypisy: Adam Fikcyjny, Aleksandra Sekuła, Olga Sutkowska
<dc:subject.period xml:lang="pl">Pozytywizm</dc:subject.period>
<dc:subject.type xml:lang="pl">Liryka</dc:subject.type>
<dc:subject.genre xml:lang="pl">Wiersz</dc:subject.genre>
+<dc:contributor.technical_editor xml:lang="pl">Fikcyjny, Adam</dc:contributor.technical_editor>
<dc:description xml:lang="pl">Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN.</dc:description>
<dc:identifier.url xml:lang="pl">http://wolnelektury.pl/katalog/lektura/poezye</dc:identifier.url>
<dc:relation.hasPart xml:lang="pl">http://wolnelektury.pl/katalog/lektura/miedzy-nami-nic-nie-bylo</dc:relation.hasPart>
+<dc:relation.hasPart xml:lang="pl">http://wolnelektury.pl/katalog/lektura/do-mlodych</dc:relation.hasPart>
<dc:source.URL xml:lang="pl">http://www.polona.pl/Content/5164</dc:source.URL>
<dc:source xml:lang="pl">(Asnyk, Adam) El...y (1838-1897), Poezye, t. 3, Gebethner i Wolff, wyd. nowe poprzedzone słowem wstępnym St. Krzemińskiego, Warszawa, 1898</dc:source>
<dc:rights xml:lang="pl">Domena publiczna - Adam Asnyk zm. 1897</dc:rights>
--- /dev/null
+<utwor><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+<rdf:Description rdf:about="http://redakcja.wolnelektury.pl/documents/book/do-mlodych/">
+<dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Asnyk, Adam</dc:creator>
+<dc:title xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Do młodych</dc:title>
+<dc:contributor.editor xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Sekuła, Aleksandra</dc:contributor.editor>
+<dc:contributor.technical_editor xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Sutkowska, Olga</dc:contributor.technical_editor>
+<dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Fundacja Nowoczesna Polska</dc:publisher>
+<dc:subject.period xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Pozytywizm</dc:subject.period>
+<dc:subject.type xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Liryka</dc:subject.type>
+<dc:subject.genre xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Wiersz</dc:subject.genre>
+<dc:description xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN.</dc:description>
+<dc:identifier.url xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">http://wolnelektury.pl/katalog/lektura/do-mlodych</dc:identifier.url>
+<dc:source.URL xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">http://www.polona.pl/Content/8616</dc:source.URL>
+<dc:source xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">El...y (Adam Asnyk), Poezye, t. 3, Gebethner i Wolff, wyd. nowe poprzedzone słowem wstępnym St. Krzemińskiego, Warszawa 1898</dc:source>
+<dc:rights xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Domena publiczna - Adam Asnyk zm. 1897</dc:rights>
+<dc:date.pd xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">1897</dc:date.pd>
+<dc:format xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">xml</dc:format>
+<dc:type xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">text</dc:type>
+<dc:type xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">text</dc:type>
+<dc:date xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">2009-04-07</dc:date>
+<dc:audience xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">L</dc:audience>
+<dc:language xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">pol</dc:language>
+<dc:relation.coverImage.url xmlns:dc="http://purl.org/dc/elements/1.1/">http://redakcja.wolnelektury.pl/media/dynamic/cover/image/35.jpg</dc:relation.coverImage.url>
+<dc:relation.coverImage.attribution xmlns:dc="http://purl.org/dc/elements/1.1/">leboski@Flickr, CC BY 2.0</dc:relation.coverImage.attribution>
+<dc:relation.coverImage.source xmlns:dc="http://purl.org/dc/elements/1.1/">http://redakcja.wolnelektury.pl/cover/image/35</dc:relation.coverImage.source>
+</rdf:Description>
+</rdf:RDF><liryka_l>
+
+<autor_utworu>Adam Asnyk</autor_utworu>
+
+<nazwa_utworu>Do młodych</nazwa_utworu>
+
+
+
+
+<strofa>Szukajcie prawdy jasnego płomienia,/
+Szukajcie nowych, nieodkrytych dróg!/
+Za każdym krokiem w tajniki stworzenia/
+Coraz się dusza ludzka rozprzestrzenia/
+I większym staje się Bóg!</strofa>
+
+
+<strofa>Choć otrząśniecie kwiaty barwnych mitów,/
+Choć rozproszycie legendowy mrok,/
+Choć mgłę urojeń zedrzecie z błękitów, ---/
+Ludziom niebiańskich nie zbraknie zachwytów,/
+Lecz dalej sięgnie ich wzrok.</strofa>
+
+
+<strofa><begin id="b1238764684390"/><motyw id="m1238764684390">Czas, Kondycja ludzka, Przemijanie</motyw>Każda epoka ma swe własne cele/
+I zapomina o wczorajszych snach:/
+Nieście więc wiedzy pochodnię na czele/
+I nowy udział bierzcie w wieków dziele,---/
+Przyszłości podnoście gmach!</strofa>
+
+
+<strofa>Ale nie depczcie przeszłości ołtarzy,/
+Choć macie sami doskonalsze wznieść:/
+Na nich się jeszcze święty ogień żarzy,/
+I miłość ludzka stoi tam na straży,/
+I wy winniście im cześć!</strofa>
+
+
+<strofa>Ze światem, który w ciemność już zachodzi/
+Wraz z całą tęczą idealnych snów,/
+Prawdziwa mądrość niechaj was pogodzi:/
+I wasze gwiazdy, o zdobywcy młodzi,/
+W ciemnościach pogasną znów!<end id="e1238764684390"/></strofa>
+
+</liryka_l></utwor>
\ No newline at end of file
<dc:contributor.editor xml:lang="pl" />
<dc:contributor.editor xml:lang="pl">Sekuła, Aleksandra</dc:contributor.editor>
<dc:contributor.technical_editor xml:lang="pl">Sutkowska, Olga</dc:contributor.technical_editor>
+<dc:contributor.editor xml:lang="pl">Fikcyjny, Adam</dc:contributor.editor>
+<dc:contributor.technical_editor xml:lang="pl">Fikcyjny, Adam</dc:contributor.technical_editor>
<dc:publisher xml:lang="pl">Fundacja Nowoczesna Polska</dc:publisher>
<dc:subject.period xml:lang="pl">Pozytywizm</dc:subject.period>
<dc:subject.type xml:lang="pl">Liryka</dc:subject.type>
# This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
#
+from zipfile import ZipFile
+from lxml import html
+from nose.tools import *
from librarian import DirDocProvider
from librarian.parser import WLDocument
-from nose.tools import *
-from utils import get_fixture
+from tests.utils import get_fixture
def test_transform():
- WLDocument.from_file(
+ epub = WLDocument.from_file(
get_fixture('text', 'asnyk_zbior.xml'),
provider=DirDocProvider(get_fixture('text', ''))
- ).as_epub(flags=['without_fonts'])
+ ).as_epub(flags=['without_fonts']).get_file()
+ zipf = ZipFile(epub)
+
+ # Check contributor list.
+ last = zipf.open('OPS/last.html')
+ tree = html.parse(last)
+ editors_attribution = False
+ for par in tree.findall("//p"):
+ if par.text.startswith(u'Opracowanie redakcyjne i przypisy:'):
+ editors_attribution = True
+ assert_equal(par.text.rstrip(),
+ u'Opracowanie redakcyjne i przypisy: '
+ u'Adam Fikcyjny, Aleksandra Sekuła, Olga Sutkowska.')
+ assert_true(editors_attribution)
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
+# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
+#
+import re
+from tempfile import NamedTemporaryFile
+from nose.tools import *
+from librarian import DirDocProvider
+from librarian.parser import WLDocument
+from utils import get_fixture
+
+
+def test_transform():
+ temp = NamedTemporaryFile(delete=False)
+ temp.close()
+ WLDocument.from_file(
+ get_fixture('text', 'asnyk_zbior.xml'),
+ provider=DirDocProvider(get_fixture('text', ''))
+ ).as_pdf(save_tex=temp.name)
+ tex = open(temp.name).read().decode('utf-8')
+ print tex
+
+ # Check contributor list.
+ editors = re.search(ur'\\def\\editors\{'
+ ur'Opracowanie redakcyjne i przypisy: ([^}]*?)\.\s*\}', tex)
+ assert_equal(editors.group(1),
+ u"Adam Fikcyjny, Aleksandra Sekuła, Olga Sutkowska")