| #! /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() |