-
Notifications
You must be signed in to change notification settings - Fork 0
/
pandoc_api.py
89 lines (70 loc) · 2.44 KB
/
pandoc_api.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# coding=utf8
import pathlib
import subprocess
import io
import tempfile
from flask import Flask, request, after_this_request
from flask.helpers import send_file
from pip._vendor.distlib._backport import shutil
app = Flask(__name__)
__ACCEPTED_FORMATS_STR = """docbook, haddock, html, json, latex, markdown, markdown_github,
markdown_mmd, markdown_phpextra, markdown_strict, mediawiki,
native, opml, org, rst, textile"""
ACCEPTED_INPUT_FORMATS = {
format.strip()
for format in __ACCEPTED_FORMATS_STR.strip().split(",")
}
__ACCEPTED_OUTPUT_FORMATS_STR = """
asciidoc, beamer, context, docbook, docx, dzslides, epub, epub3,
fb2, html, html5, icml, json, latex, man, markdown,
markdown_github, markdown_mmd, markdown_phpextra,
markdown_strict, mediawiki, native, odt, opendocument, opml,
org, plain, revealjs, rst, rtf, s5, slideous, slidy,
texinfo, textile
"""
ACCEPTED_OUTPUT_FORMATS = {
format.strip()
for format in __ACCEPTED_OUTPUT_FORMATS_STR.strip().split(",")
}
IN_EXTENSIONS = {
"latex": "tex",
"markdown": "md",
"markdown_github": "md",
"markdown_mmd": "md",
"markdown_phpextra": "md",
"markdown_strict": "md",
}
OUTPUT_FILE_EXTENSION_MAPPING = {
"beamer": "pdf",
"latex": "pdf",
"html5": "html",
"revealjs": "html",
"markdown": "md",
"markdown_github": "md",
"markdown_mmd": "md",
"markdown_phpextra": "md",
"markdown_strict": "md",
}
@app.route("/v0/convert/<in_format>/<out_format>", methods=['POST'])
def convert(in_format, out_format):
if in_format not in ACCEPTED_INPUT_FORMATS:
return "Invalid infile format", 404
if out_format not in ACCEPTED_OUTPUT_FORMATS:
return "Invalid output format", 404
tempdir = pathlib.Path(tempfile.mkdtemp())
out_extension = OUTPUT_FILE_EXTENSION_MAPPING.get(out_format, out_format)
in_extension = IN_EXTENSIONS.get(in_format, "")
try:
# import pudb; pudb.set_trace()
infile = tempdir / "infile.{}".format(in_extension)
infile.write_bytes(request.stream.read())
out = tempdir / "{}.{}".format("outfile", out_extension)
command = ['pandoc', '-f', in_format, '-t', out_format, "-o", out, infile]
subprocess.check_call(command, cwd=str(tempdir))
except:
shutil.rmtree(tempdir)
@after_this_request
def remove_files(response):
shutil.rmtree(tempdir)
return response
return send_file(str(out), attachment_filename=str(out.stem)), 200