| #! /usr/bin/python -u | |
| # | |
| # liblouis Braille Translation and Back-Translation Library | |
| # Copyright (C) 2010 Swiss Library for the Blind, Visually Impaired and Print Disabled | |
| # Copying and distribution of this file, with or without modification, | |
| # are permitted in any medium without royalty provided the copyright | |
| # notice and this notice are preserved. This file is offered as-is, | |
| # without any warranty. | |
| # This is a very simple example on how to extend libxslt to be able to | |
| # invoke liblouis from xslt. See also the accompanying | |
| # dtbook2brldtbook.xsl in the same directory which simpy copies a dtbook | |
| # xml and translates all the text node into Braille. | |
| import louis | |
| import libxml2 | |
| import libxslt | |
| import sys | |
| import getopt | |
| from optparse import OptionParser | |
| nodeName = None | |
| emphasisMap = { | |
| 'plain_text' : louis.plain_text, | |
| 'italic' : louis.italic, | |
| 'underline' : louis.underline, | |
| 'bold' : louis.bold, | |
| 'computer_braille' : louis.computer_braille} | |
| def translate(ctx, str, translation_table, emphasis=None): | |
| global nodeName | |
| try: | |
| pctxt = libxslt.xpathParserContext(_obj=ctx) | |
| ctxt = pctxt.context() | |
| tctxt = ctxt.transformContext() | |
| nodeName = tctxt.insertNode().name | |
| except: | |
| pass | |
| typeform = len(str)*[emphasisMap[emphasis]] if emphasis else None | |
| braille = louis.translate([translation_table], str.decode('utf-8'), typeform=typeform)[0] | |
| return braille.encode('utf-8') | |
| def xsltProcess(styleFile, inputFile, outputFile): | |
| """Transform an xml inputFile to an outputFile using the given styleFile""" | |
| styledoc = libxml2.parseFile(styleFile) | |
| style = libxslt.parseStylesheetDoc(styledoc) | |
| doc = libxml2.parseFile(inputFile) | |
| result = style.applyStylesheet(doc, None) | |
| style.saveResultToFilename(outputFile, result, 0) | |
| style.freeStylesheet() | |
| doc.freeDoc() | |
| result.freeDoc() | |
| libxslt.registerExtModuleFunction("translate", "http://liblouis.org/liblouis", translate) | |
| def main(): | |
| usage = "Usage: %prog [options] styleFile inputFile outputFile" | |
| parser = OptionParser(usage) | |
| (options, args) = parser.parse_args() | |
| if len(args) != 3: | |
| parser.error("incorrect number of arguments") | |
| xsltProcess(args[0], args[1], args[2]) | |
| if __name__ == "__main__": | |
| main() |