""" Created by Massimo Di Pierro License BSD """ from __future__ import print_function import subprocess import os import os.path import re import sys from tempfile import mkstemp, mkdtemp, NamedTemporaryFile from gluon.contrib.markmin.markmin2latex import markmin2latex __all__ = ['markmin2pdf'] def removeall(path): ERROR_STR = """Error removing %(path)s, %(error)s """ def rmgeneric(path, __func__): try: __func__(path) except OSError as xxx_todo_changeme: (errno, strerror) = xxx_todo_changeme.args print(ERROR_STR % {'path': path, 'error': strerror}) files = [path] while files: file = files[0] if os.path.isfile(file): f = os.remove rmgeneric(file, os.remove) del files[0] elif os.path.isdir(file): nested = os.listdir(file) if not nested: rmgeneric(file, os.rmdir) del files[0] else: files = [os.path.join(file, x) for x in nested] + files def latex2pdf(latex, pdflatex='pdflatex', passes=3): """ calls pdflatex in a tempfolder Arguments: - pdflatex: path to the pdflatex command. Default is just 'pdflatex'. - passes: defines how often pdflates should be run in the texfile. """ pdflatex = pdflatex passes = passes warnings = [] # setup the envoriment tmpdir = mkdtemp() texfile = open(tmpdir + '/test.tex', 'wt',encoding="utf-8") texfile.write(latex) texfile.seek(0) texfile.close() texfile = os.path.abspath(texfile.name) # start doing some work for i in range(0, passes): logfd, logname = mkstemp() outfile = os.fdopen(logfd) try: ret = subprocess.call([pdflatex, '-interaction=nonstopmode', '-output-format', 'pdf', '-output-directory', tmpdir, texfile], cwd=os.path.dirname(texfile), stdout=outfile, stderr=subprocess.PIPE) finally: outfile.close() re_errors = re.compile('^\!(.*)$', re.M) re_warnings = re.compile('^LaTeX Warning\:(.*)$', re.M) flog = open(logname) try: loglines = flog.read() finally: flog.close() errors = re_errors.findall(loglines) warnings = re_warnings.findall(loglines) os.unlink(logname) pdffile = texfile.rsplit('.', 1)[0] + '.pdf' data = None if os.path.isfile(pdffile): with open(pdffile,'rb') as fpdf : data = fpdf.read() removeall(tmpdir) return data, warnings, errors def markmin2pdf(text, image_mapper=lambda x: None, extra={}): return latex2pdf(markmin2latex(text, image_mapper=image_mapper, extra=extra)) if __name__ == '__main__': import sys import doctest import markmin2html if sys.argv[1:2] == ['-h']: data, warnings, errors = markmin2pdf(markmin2html.__doc__) if errors: print('ERRORS:' + '\n'.join(errors)) print('WARNGINS:' + '\n'.join(warnings)) else: print(data) elif len(sys.argv) > 1: fargv = open(sys.argv[1], 'rb') try: data, warnings, errors = markmin2pdf(fargv.read()) finally: fargv.close() if errors: print('ERRORS:' + '\n'.join(errors)) print('WARNGINS:' + '\n'.join(warnings)) else: print(data) else: doctest.testmod()