133 lines
3.6 KiB
Python
133 lines
3.6 KiB
Python
"""
|
|
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()
|