From 5adcf1231e8d4a4131bd09798f4dd296bd430081 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20St=C4=99pniowski?= Date: Mon, 10 Aug 2009 15:45:24 +0200 Subject: [PATCH] =?utf8?q?Poprawienie=20ilo=C5=9Bci=20=C5=9Bwiat=C5=82a=20?= =?utf8?q?pomi=C4=99dzy=20cz=C4=99=C5=9Bciami=20utworu=20w=20plikach=20TXT?= =?utf8?q?=20wypluwanych=20przez=20bibliotek=C4=99=20librarian=20(wymaga?= =?utf8?q?=C5=82o=20to=20przepisania=20ca=C5=82ego=20skryptu=20z=20u=C5=BC?= =?utf8?q?yciem=20XSLT).?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- lib/librarian/bin/book2txt.py | 46 +---- lib/librarian/book2txt.xslt | 308 ++++++++++++++++++++++++++++++++++ lib/librarian/text.py | 59 +++++++ 3 files changed, 369 insertions(+), 44 deletions(-) create mode 100644 lib/librarian/book2txt.xslt create mode 100644 lib/librarian/text.py diff --git a/lib/librarian/bin/book2txt.py b/lib/librarian/bin/book2txt.py index d3c2d0121..1ca4623fd 100755 --- a/lib/librarian/bin/book2txt.py +++ b/lib/librarian/bin/book2txt.py @@ -1,43 +1,8 @@ #!/usr/bin/env python -# -*- coding: utf-8 -*- -import re import os import optparse -import codecs -from librarian import dcparser - - -HEADER = u"""\ -Kodowanie znaków w dokumencie: UTF-8. ------ -Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl/). Reprodukcja cyfrowa wykonana przez -Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. 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ć. - -Wersja lektury w opracowaniu merytorycznym i krytycznym (przypisy i motywy) dostępna jest na stronie %s. ------ - -""" - -def get_header(filename): - return HEADER % dcparser.parse(filename).url - - -REGEXES = [ - (r']*>(.|\n)*?', ''), - (r']*>(.|\n)*?', ''), - ('<(begin|end)\\sid=[\'|"][b|e]\\d+[\'|"]\\s/>', ''), - (r'(()|())', ''), - (r'(.|\n)*?', ''), - (r'(.|\n)*?', ''), - (r'<[^>]+>', ''), - (r'/\n', '\n'), - (r'---', u'—'), - (r'--', u'-'), - (r',,', u'„'), - (r'"', u'”'), -] +from librarian import text if __name__ == '__main__': @@ -62,12 +27,5 @@ if __name__ == '__main__': print input_filename output_filename = os.path.splitext(input_filename)[0] + '.txt' - - xml = codecs.open(input_filename, 'r', encoding='utf-8').read() - for pattern, repl in REGEXES: - xml, n = re.subn(pattern, repl, xml) - - output = codecs.open(output_filename, 'w', encoding='utf-8') - output.write(get_header(input_filename)) - output.write(xml) + text.transform(input_filename, output_filename) diff --git a/lib/librarian/book2txt.xslt b/lib/librarian/book2txt.xslt new file mode 100644 index 000000000..ba07aa29e --- /dev/null +++ b/lib/librarian/book2txt.xslt @@ -0,0 +1,308 @@ + + + + + + + + + +Kodowanie znaków w dokumencie: UTF-8. +----- +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl/). Reprodukcja cyfrowa wykonana przez +Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. 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ć. + +Wersja lektury w opracowaniu merytorycznym i krytycznym (przypisy i motywy) dostępna jest na stronie %s. +----- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/ / + + + + + * + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +„” + + + +** + + + + + + + + + + + + + + + + + + + + + + +* + + + + + + + +------------------------------------------------ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/librarian/text.py b/lib/librarian/text.py new file mode 100644 index 000000000..09dc9a9ef --- /dev/null +++ b/lib/librarian/text.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +import os +import cStringIO +import re +import codecs + +from lxml import etree + +from librarian import dcparser + + +ENTITY_SUBSTITUTIONS = [ + (u'---', u'—'), + (u'--', u'–'), + (u'...', u'…'), + (u',,', u'„'), + (u'"', u'”'), +] + + +def substitute_entities(context, text): + """XPath extension function converting all entites in passed text.""" + if isinstance(text, list): + text = ''.join(text) + for entity, substitutution in ENTITY_SUBSTITUTIONS: + text = text.replace(entity, substitutution) + return text + + +# Register substitute_entities function with lxml +ns = etree.FunctionNamespace('http://wolnelektury.pl/functions') +ns['substitute_entities'] = substitute_entities + + +def transform(input_filename, output_filename): + """Transforms file input_filename in XML to output_filename in TXT.""" + # Parse XSLT + style_filename = os.path.join(os.path.dirname(__file__), 'book2txt.xslt') + style = etree.parse(style_filename) + + doc_file = cStringIO.StringIO() + expr = re.compile(r'/\s', re.MULTILINE | re.UNICODE); + + f = open(input_filename, 'r') + for line in f: + line = line.decode('utf-8') + line = expr.sub(u'
\n', line) + doc_file.write(line.encode('utf-8')) + f.close() + + doc_file.seek(0) + + parser = etree.XMLParser(remove_blank_text=True) + doc = etree.parse(doc_file, parser) + + result = doc.xslt(style) + output_file = codecs.open(output_filename, 'wb', encoding='utf-8') + output_file.write(unicode(result) % dcparser.parse(input_filename).url) + -- 2.20.1