From 779f189918633412f1cf5667b7ffe59d9ed106c9 Mon Sep 17 00:00:00 2001 From: EsGeh Date: Mon, 8 Apr 2019 14:39:10 +0200 Subject: [PATCH] wrapper script for tei->html. flexible output redir when running executables. --- tei2html.py | 103 +++++++++++++++++++++++++++++++++++++++++++ utils/load_config.py | 35 +++++++++++---- 2 files changed, 130 insertions(+), 8 deletions(-) create mode 100755 tei2html.py diff --git a/tei2html.py b/tei2html.py new file mode 100755 index 0000000..997644c --- /dev/null +++ b/tei2html.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8; mode: python -*- + +"A converter from TEI to HTML." + +__version__ = "1.0" +__date__ = "20190408" +__author__ = "sgfroerer@mpiwg-berlin.mpg.de" + +from utils.load_config import load_config, check_executable, exec_command, ToFile +import utils.libeoaconvert as libeoaconvert + +import logging +import argparse +from pathlib import Path + +# things to be done +# assign ids top to bottom for the following elements: +# div1 div2 div3 note item table EOAfigure EOAequation formula theorem + +BASE_DIR = Path( __file__ ).resolve().parent +SCRIPT_NAME = Path( __file__).stem + +def check_executables(): + check_executable( "saxon" ) + +def main( + input_file, + root_dir +): + """Main function""" + + exec_command( + "saxon -t -s:{input_file} -xsl:{xslt_file} domain={root_dir}".format( + xslt_file = (BASE_DIR / SCRIPT_NAME) . with_suffix( ".xsl" ), + input_file = input_file, + root_dir = root_dir + ), + ) + +# def main ends here + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + formatter_class=argparse.ArgumentDefaultsHelpFormatter + ) + parser.add_argument( + "-c", "--config", + default = BASE_DIR / "config" / "eoaconvert.cfg", + help="Name of config file" + ) + parser.add_argument( + "-l", "--log-file", + default = Path("logs", SCRIPT_NAME).with_suffix(".log"), + help="logfile" + ) + parser.add_argument( + "--log-level", + default = "INFO", + help="log level: choose between DEBUG, INFO, WARNING, ERROR, CRITICAL" + ) + parser.add_argument( + "--root-dir", + default = Path.cwd(), + help="internal html links on the page will use this location as a prefix" + ) + parser.add_argument( + "-f", "--filename", + required = True, + help="Name of main EOA-TEI file" + ) + + ''' + TODO: support output directory + parser.add_argument( + "-o", "--output-dir", + default = ".", + help="where to dump all output files" + ) + ''' + + args = parser.parse_args() + + CONFIG_FILE = args.config + + print("The configfile is '%s'." % CONFIG_FILE) + print("The logfile is '%s'." % args.log_file) + + CONFIG = load_config( + CONFIG_FILE, + args.log_level, + args.log_file, + ) + + check_executables() + + # run main: + main( + input_file = args.filename, + root_dir = args.root_dir + ) + +# finis diff --git a/utils/load_config.py b/utils/load_config.py index f1d3ebd..bf396b9 100644 --- a/utils/load_config.py +++ b/utils/load_config.py @@ -24,10 +24,18 @@ def copy_dir_overwrite( src, dst ): shutil.rmtree( dst ) shutil.copytree( src, dst) +class ToFile: + def __init__( self, filename ): + self.filename = filename + +class ToLog: + pass + def exec_command( command, error_msg = "ERROR while running {command}", wd = None, + output_to = ToLog(), log_level = "INFO", ignore_fail = False ): @@ -37,24 +45,35 @@ def exec_command( ) arguments = shlex.split(command) + + if isinstance( output_to, ToFile ): + stdout_file = open( output_to.filename, "w") + if isinstance( output_to, ToLog ): + stdout_file = PIPE + else: + stdout_file = None process = subprocess.Popen( arguments, cwd = wd, - stdout=PIPE, - stderr=PIPE + stdout= stdout_file, + stderr= STDOUT, ) - def check_io(): + def check_io(stream): while True: - output = process.stdout.readline() + output = stream.readline() if output: - logging.debug( output.decode().strip() ) + logging.debug( "> " + output.decode().strip() ) else: break - + # keep checking stdout/stderr until the child exits - while process.poll() is None: - check_io() + logging.debug( f"{command} output:" ) + if isinstance( output_to, ToFile ): + stdout_file.close() + elif isinstance( output_to, ToLog ): + while process.poll() is None: + check_io(process.stdout) ret = process.wait() # 0 means success if (not ignore_fail) and ret != 0: