1 # -*- coding: utf-8 -*-
3 # This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
4 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
6 from librarian import dcparser, parser
14 ENTITY_SUBSTITUTIONS = [
24 Kodowanie znaków w dokumencie: UTF-8.
26 Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl/). Reprodukcja cyfrowa wykonana przez
27 Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN.
28 \n%(license_description)s.
30 Wersja lektury w opracowaniu merytorycznym i krytycznym (przypisy i motywy) dostępna jest na stronie %(url)s.
39 def strip(context, text):
40 """Remove unneeded whitespace from beginning and end"""
41 if isinstance(text, list):
43 return re.sub(r'\s+', ' ', text).strip()
46 def substitute_entities(context, text):
47 """XPath extension function converting all entites in passed text."""
48 if isinstance(text, list):
50 for entity, substitutution in ENTITY_SUBSTITUTIONS:
51 text = text.replace(entity, substitutution)
55 def wrap_words(context, text, wrapping):
56 """XPath extension function automatically wrapping words in passed text"""
57 if isinstance(text, list):
62 words = re.split(r'\s', text)
67 line_length += len(word) + 1
68 if line_length > wrapping:
69 # Max line length was exceeded. We create new line
71 line_length = len(word)
72 lines[-1].append(word)
73 return '\n'.join(' '.join(line) for line in lines)
76 # Register substitute_entities function with lxml
77 ns = etree.FunctionNamespace('http://wolnelektury.pl/functions')
79 ns['substitute_entities'] = substitute_entities
80 ns['wrap_words'] = wrap_words
83 def transform(input_filename, output_filename, is_file=True, parse_dublincore=True, **options):
84 """Transforms file input_filename in XML to output_filename in TXT."""
86 style_filename = os.path.join(os.path.dirname(__file__), 'xslt/book2txt.xslt')
87 style = etree.parse(style_filename)
90 document = parser.WLDocument.from_file(input_filename, True, parse_dublincore=parse_dublincore)
92 document = parser.WLDocument.from_string(input_filename, True, parse_dublincore=parse_dublincore)
94 result = document.transform(style, **options)
96 output_file = codecs.open(output_filename, 'wb', encoding='utf-8')
99 parsed_dc = dcparser.parse(input_filename)
101 license_description = parsed_dc.license_description
102 license = parsed_dc.license
104 license_description = u"Ten utwór jest udostepniony na licencji %s: \n%s" % (license_description, license)
106 license_description = u"Ten utwór nie jest chroniony prawem autorskim i znajduje się w domenie publicznej, co oznacza, że możesz go swobodnie wykorzystywać, publikować i rozpowszechniać"
110 license_description = ""
111 output_file.write(TEMPLATE % {
113 'license_description': license_description,
114 'text': unicode(result),