Blame | Last modification | View Log | RSS feed
#!/usr/libexec/platform-python################################################################################ BRLTTY - A background process providing access to the console screen (when in# text mode) for a blind person using a refreshable braille display.## Copyright (C) 1995-2018 by The BRLTTY Developers.## BRLTTY comes with ABSOLUTELY NO WARRANTY.## This is free software, placed under the terms of the# GNU Lesser General Public License, as published by the Free Software# Foundation; either version 2.1 of the License, or (at your option) any# later version. Please see the file LICENSE-LGPL for details.## Web Page: http://brltty.com/## This software is maintained by Dave Mielke <dave@mielke.cc>.################################################################################ BRLTTY Contraction Table - latex-access (executable)import sys, osdef putProgramMessage (message):stream = sys.stderrstream.write(os.path.basename(sys.argv[0]) + ": " + message + "\n")stream.flush()def syntaxError (message):putProgramMessage(message)exit(2)def semanticError (message):putProgramMessage(message)exit(3)def systemError (message):putProgramMessage(message)exit(4)def missingPackage (name):systemError("package not installed: " + name)def putResponseProperty (keyword, value):value = str(value)if programArguments.verbose: putProgramMessage("rsp: " + keyword + "=" + value)stream = sys.stdoutstream.write(keyword + "=" + value.encode("UTF-8") + "\n")stream.flush()def getRequest ():request = {}while True:try:if programArguments.interactive:line = input(packageName + "> ")else:line = input()except EOFError:if len(request) == 0: return NonesemanticError("unexpected end-of-file on standard input")line = line.decode("UTF-8")components = line.split("=", 1)if len(components) > 1:(keyword, value) = componentskeyword = keyword.strip().lower()if programArguments.verbose: putProgramMessage("req: " + keyword + "=" + value)request[keyword] = valueif keyword == "text": breakreturn requestdef processRequest ():request = getRequest()if not request: return Falsefor attribute in ("displayLength", "cursorOffset", "expandCurrentWord", "consumedChars"):if hasattr(brailleTranslator, attribute):delattr(brailleTranslator, attribute)if "maximum-length" in request:brailleTranslator.displayLength = int(request["maximum-length"])if "cursor-position" in request:position = int(request["cursor-position"])if position > 0:brailleTranslator.cursorOffset = position - 1if "expand-current-word" in request:brailleTranslator.expandCurrentWord = int(request["expand-current-word"]) != 0brailleTranslator.capitalisation = "6dot"if "capitalization-mode" in request:if int(request["capitalization-mode"]) != 1:brailleTranslator.capitalisation = "8dot"text = request["text"]brf = brailleTranslator.translate(textPreprocessor.translate(text))if hasattr(brailleTranslator, "consumedChars"):consumedLength = brailleTranslator.consumedCharsputResponseProperty("consumed-length", consumedLength)else:consumedLength = len(text)if hasattr(brailleTranslator, "src2trans"):offsets = brailleTranslator.src2transif len(offsets) > consumedLength: offsets = offsets[:consumedLength]putResponseProperty("output-offsets", ",".join((str(offset) for offset in offsets)))putResponseProperty("brf", brf)return Truedef parseProgramArguments ():import argparseparser = argparse.ArgumentParser(prog = os.path.basename(sys.argv[0]),usage = "%(prog)s [option ...]",description = """This is an executable contraction table for BRLTTYthat uses the latex-access packageto translate LaTeX mathematical notation into braille.BRLTTY can be found at [http://brltty.com/].latex-access can be found at [http://www.latex-access.sourceforge.net/].""")parser.add_argument("-c", "--configuration",action = "store",nargs = 1,dest = "configuration",default = (os.path.join(os.path.expanduser("~"), "." + packageName),"/etc/" + packageName + ".conf"),help = "the configuration file to use")parser.add_argument("-n", "--nemeth",action = "store_const",const = "nemeth",dest = "translator",help = "translate into Nemeth Code")parser.add_argument("-u", "--ueb",action = "store_const",const = "ueb",dest = "translator",help = "translate into Unified English Braille")parser.add_argument("-i", "--interactive",action = "store_true",dest = "interactive",help = "enable input editing and history")parser.add_argument("-v", "--verbose",action = "store_true",dest = "verbose",help = "show request and response properties on standard error")return parser.parse_args()if __name__ == "__main__":packageName = "latex-access"programArguments = parseProgramArguments()if programArguments.interactive:import readline, atexithistoryFile=os.path.join(os.path.expanduser("~"), "." + packageName + ".history")atexit.register(readline.write_history_file, historyFile)readline.read_history_file(historyFile)try:from latex_access import nemeth, ueb, preprocessor, settingsexcept ImportError:missingPackage(packageName)for configurationFile in programArguments.configuration:if os.path.exists(configurationFile):if programArguments.verbose:putProgramMessage("configuration file: " + configurationFile)settings.loadSettings(configurationFile)breakif programArguments.translator:settings.settings["brailletable"] = programArguments.translatorbrailleTranslator = settings.brailleTableToUse()textPreprocessor = preprocessor.preprocessor()settings.activateSettings({"braille": brailleTranslator,"preprocessor": textPreprocessor})while processRequest(): pass