Skip to content

Commit 02a1982

Browse files
authored
Merge pull request #26 from cmason3/23.11.0
23.11.0
2 parents 4e29fe0 + c8438a7 commit 02a1982

File tree

12 files changed

+136
-20
lines changed

12 files changed

+136
-20
lines changed

contrib/update_cdnjs_links.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
import sys, os, re, requests
44

55
libraries = {
6-
'bootstrap': '5.3.1',
6+
'bootstrap': '5.3.2',
77
'codemirror': '5.65.15',
88
'firacode': '6.2.0',
99
'split.js': '1.6.5',
1010
'js-yaml': '4.1.0',
11-
'dayjs': '1.11.9',
11+
'dayjs': '1.11.10',
1212
'pako': '2.1.0',
1313
'jszip': '3.10.1'
1414
}

docker/Dockerfile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ ARG BRANCH="main"
55
RUN set -eux; \
66

77
apt-get update; \
8-
apt-get install -y --no-install-recommends git build-essential; \
8+
apt-get install -y --no-install-recommends wget git build-essential; \
9+
10+
wget -P /tmp https://github.com/jgm/pandoc/releases/download/3.1.8/pandoc-3.1.8-1-amd64.deb; \
11+
dpkg -i /tmp/pandoc-3.1.8-1-amd64.deb; \
912

1013
python3 -m venv /opt/jinjafx; \
1114
/opt/jinjafx/bin/python3 -m pip install --upgrade git+https://github.com/cmason3/jinjafx_server.git@${BRANCH} lxml; \
@@ -15,6 +18,7 @@ python3 -m venv /opt/jinjafx; \
1518
FROM docker.io/library/python:3.12-slim
1619

1720
COPY --from=BUILD --chown=99:99 /opt/jinjafx /opt/jinjafx
21+
COPY --from=BUILD --chown=99:99 /usr/bin/pandoc /usr/bin/pandoc
1822

1923
USER 99:99
2024

jinjafx_server.py

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,13 @@
2525
from jinja2 import __version__ as jinja2_version
2626

2727
import jinjafx, os, io, socket, signal, threading, yaml, json, base64, time, datetime, resource
28-
import re, argparse, hashlib, traceback, glob, hmac, uuid, struct, binascii, gzip, requests, ctypes
28+
import re, argparse, hashlib, traceback, glob, hmac, uuid, struct, binascii, gzip, requests, ctypes, subprocess
2929
import cmarkgfm, emoji
3030

31-
__version__ = '23.10.0'
31+
from shutil import which
32+
pandoc = which('pandoc')
33+
34+
__version__ = '23.11.0'
3235

3336
llock = threading.RLock()
3437
rlock = threading.RLock()
@@ -380,6 +383,12 @@ def do_GET(self, head=False, cache=True, versioned=False):
380383

381384
r[2] = r[2].decode('utf-8').replace('{{ jinjafx.version }}', jinjafx.__version__ + ' / Jinja2 v' + jinja2_version).replace('{{ get_link }}', get_link).encode('utf-8')
382385

386+
elif fpath == '/output.html':
387+
if pandoc:
388+
r[2] = r[2].decode('utf-8').replace('{{ pandoc_class }}', '').encode('utf-8')
389+
else:
390+
r[2] = r[2].decode('utf-8').replace('{{ pandoc_class }}', ' hide').encode('utf-8')
391+
383392
else:
384393
r = [ 'text/plain', 404, '404 Not Found\r\n'.encode('utf-8'), sys._getframe().f_lineno ]
385394

@@ -541,7 +550,7 @@ def html_escape(text):
541550
options = (cmarkgfm.cmark.Options.CMARK_OPT_GITHUB_PRE_LANG | cmarkgfm.cmark.Options.CMARK_OPT_SMART | cmarkgfm.cmark.Options.CMARK_OPT_UNSAFE)
542551
output = cmarkgfm.github_flavored_markdown_to_html(html_escape(output), options).replace('&', '&').replace('&', '&')
543552
head = '<!DOCTYPE html>\n<html>\n<head>\n'
544-
head += '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.1.0/github-markdown.min.css" crossorigin="anonymous">\n'
553+
head += '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.3.0/github-markdown.min.css" crossorigin="anonymous">\n'
545554
head += '<style>\n pre, code { white-space: pre-wrap !important; word-wrap: break-word !important; }\n</style>\n</head>\n'
546555
output = emoji.emojize(output, language='alias').encode('ascii', 'xmlcharrefreplace').decode('utf-8')
547556
output = head + '<body>\n<div class="markdown-body">\n' + output + '</div>\n</body>\n</html>\n'
@@ -580,7 +589,32 @@ def html_escape(text):
580589
r = [ 'text/plain', 400, '400 Bad Request\r\n', sys._getframe().f_lineno ]
581590

582591
else:
583-
if fpath == '/get_link':
592+
if fpath == '/html2docx':
593+
if pandoc:
594+
if self.headers['Content-Type'] == 'application/json':
595+
try:
596+
if not self.ratelimit(remote_addr, 4, False):
597+
html = self.d(json.loads(postdata.decode('utf-8')))
598+
p = subprocess.run([pandoc, '-f', 'html', '-t', 'docx', '--sandbox', '--reference-doc=' + base + '/pandoc/reference.docx'], input=html, stdout=subprocess.PIPE, check=True)
599+
self.send_response(200)
600+
self.send_header('Content-Type', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document')
601+
self.send_header('Content-Length', str(len(p.stdout)))
602+
self.send_header('X-Download-Filename', 'Output.' + datetime.datetime.now().strftime('%Y%m%d-%H%M%S') + '.docx')
603+
self.end_headers()
604+
self.wfile.write(p.stdout)
605+
return
606+
607+
else:
608+
r = [ 'text/plain', 429, '429 Too Many Requests\r\n', sys._getframe().f_lineno ]
609+
610+
except Exception as e:
611+
log(traceback.format_exc())
612+
r = [ 'text/plain', 400, '400 Bad Request\r\n', sys._getframe().f_lineno ]
613+
614+
else:
615+
r = [ 'text/plain', 400, '400 Bad Request\r\n', sys._getframe().f_lineno ]
616+
617+
elif fpath == '/get_link':
584618
if aws_s3_url or github_url or repository:
585619
if self.headers['Content-Type'] == 'application/json':
586620
try:

jinjafx_server/pandoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../pandoc

pandoc/reference.docx

22.1 KB
Binary file not shown.

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
],
3030
packages=["jinjafx_server"],
3131
include_package_data=True,
32-
package_data={'': ['www/*']},
32+
package_data={'': ['www/*', 'pandoc/reference.docx']},
3333
install_requires=["jinjafx>=1.13.0", "requests", "cmarkgfm>=0.5.0", "emoji"],
3434
entry_points={
3535
"console_scripts": [

www/dt.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<meta name="viewport" content="width=1536, user-scalable=no">
77
<title>JinjaFx DataTemplate</title>
88
<link rel="shortcut icon" href="/874f2915/jinjafx.png">
9-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.1/css/bootstrap.min.css" integrity="sha512-Z/def5z5u2aR89OuzYcxmDJ0Bnd5V1cKqBEbvLOiUNWdg9PQeXVvXLI90SE4QOHGlfLqUnDNVAYyZi8UwUTmWQ==" crossorigin="anonymous" referrerpolicy="no-referrer">
9+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.2/css/bootstrap.min.css" integrity="sha512-b2QcS5SsA8tZodcDtGRELiGv5SaKSk1vDHDaQRda0htPYWZ6046lr3kJ5bAAQdpV2mmA/4v0wQF9MyU6/pDIAg==" crossorigin="anonymous" referrerpolicy="no-referrer">
1010
<link rel="stylesheet" href="/f8555653/jinjafx.css">
1111
<script src="/00abd23c/jinjafx_dt.js"></script>
1212
</head>

www/index.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88
<title>JinjaFx - Jinja2 Templating Tool</title>
99
<script src="/6d052dbe/obsolete.js"></script>
1010
<link rel="shortcut icon" href="/874f2915/jinjafx.png">
11-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.1/css/bootstrap.min.css" integrity="sha512-Z/def5z5u2aR89OuzYcxmDJ0Bnd5V1cKqBEbvLOiUNWdg9PQeXVvXLI90SE4QOHGlfLqUnDNVAYyZi8UwUTmWQ==" crossorigin="anonymous" referrerpolicy="no-referrer">
11+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.2/css/bootstrap.min.css" integrity="sha512-b2QcS5SsA8tZodcDtGRELiGv5SaKSk1vDHDaQRda0htPYWZ6046lr3kJ5bAAQdpV2mmA/4v0wQF9MyU6/pDIAg==" crossorigin="anonymous" referrerpolicy="no-referrer">
1212
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.15/codemirror.min.css" integrity="sha512-uf06llspW44/LZpHzHT6qBOIVODjWtv4MxCricRxkzvopAlSWnTf6hpZTFxuuZcuNE9CBQhqE0Seu1CoRk84nQ==" crossorigin="anonymous" referrerpolicy="no-referrer">
1313
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.15/addon/dialog/dialog.min.css" integrity="sha512-Vogm+Cii1SXP5oxWQyPdkA91rHB776209ZVvX4C/i4ypcfBlWVRXZGodoTDAyyZvO36JlTqDqkMhVKAYc7CMjQ==" crossorigin="anonymous" referrerpolicy="no-referrer">
1414
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.15/addon/display/fullscreen.min.css" integrity="sha512-T8xB3MmwpA77VK9lUH3UkdUTnkmpqOxHF8OceOKaHrvpcXMSNX0xtpa9FoLTDAVO1JnB2UiMdVeI2V0HTHjTWA==" crossorigin="anonymous" referrerpolicy="no-referrer">
1515
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.15/addon/fold/foldgutter.min.css" integrity="sha512-YwkMTlTHn8dBnwa47IF+cKsS00HPiiVhQ4DpwT1KF2gUftfFR7aefepabSPLAs6zrMyD89M3w0Ow6mQ5XJEUCw==" crossorigin="anonymous" referrerpolicy="no-referrer">
1616
<link rel="stylesheet" href="/f8555653/jinjafx.css">
1717
<link rel="stylesheet" href="/af18a9f8/jinjafx_m.css">
18-
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.1/js/bootstrap.bundle.min.js" integrity="sha512-ToL6UYWePxjhDQKNioSi4AyJ5KkRxY+F1+Fi7Jgh0Hp5Kk2/s8FD7zusJDdonfe5B00Qw+B8taXxF6CFLnqNCw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
18+
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.2/js/bootstrap.bundle.min.js" integrity="sha512-X/YkDZyjTf4wyc2Vy16YGCPHwAY8rZJY+POgokZjQB2mhIRFJCckEGc6YyX9eNsPfn0PzThEuNs+uaomE5CO6A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
1919
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.15/codemirror.min.js" integrity="sha512-2359y3bpxFfJ9xZw1r2IHM0WlZjZLI8gjLuhTGOVtRPzro3dOFy4AyEEl9ECwVbQ/riLXMeCNy0h6HMt2WUtYw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
2020
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.15/addon/selection/mark-selection.min.js" integrity="sha512-XaS0JPIY5yDTDaYIMjkoXz+LF/DEVhRn1eq9QOhJPhMuJGGPOKZTulF+LY8/uwd18k00CIaSe4f8fCyp/5U7IQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
2121
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.15/addon/dialog/dialog.min.js" integrity="sha512-NAJeqwfpM7/nfX90EweQhjudb66diK3Y9mkBjb4xJ6wufuVqFVAjHd8mJW//CGHNR9cI8wUfDRJ0jtLzZ9v8Qg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
@@ -31,8 +31,8 @@
3131
<script src="https://cdnjs.cloudflare.com/ajax/libs/pako/2.1.0/pako_deflate.min.js" integrity="sha512-oEsmlMj4bUaKNfYtsxV2eZm+5L0I/JhLsXftLFKeywkgAq8QMLKRlZrMIkMC2AHZQ/gT8YtI+fP1WUwNjF1PoQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
3232
<script src="https://cdnjs.cloudflare.com/ajax/libs/split.js/1.6.5/split.min.js" integrity="sha512-lNjb0qWDVvt1zfSiXufaxtlFtenve3BLbvljxuMXuSr0DE0HYp5OhX0u89uwNd6MvlX1bgJ8ulfG4JMGurs8UA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
3333
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-yaml/4.1.0/js-yaml.min.js" integrity="sha512-CSBhVREyzHAjAFfBlIBakjoRUKp5h7VSweP0InR/pAJyptH7peuhCsqAI/snV+TwZmXZqoUklpXp6R6wMnYf5Q==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
34-
<script src="https://cdnjs.cloudflare.com/ajax/libs/dayjs/1.11.9/dayjs.min.js" integrity="sha512-q4Xn+ZU2K+dqJPL8a3TiyGsDa31IkR/rLt/w+fy8jLrx8TdXj0dLM1Aq4aPXnOOKxHEya/bD9DePDB2DHm4jJQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
35-
<script src="https://cdnjs.cloudflare.com/ajax/libs/dayjs/1.11.9/plugin/relativeTime.min.js" integrity="sha512-6RygaIDPDX6ddRU7XCHt5mE3D1z+cwvGk1OilDc91XVgqgBhgw5UgtQFZdlPSzC5IyeSKMQPzvtW+7+YFWb0TQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
34+
<script src="https://cdnjs.cloudflare.com/ajax/libs/dayjs/1.11.10/dayjs.min.js" integrity="sha512-FwNWaxyfy2XlEINoSnZh1JQ5TRRtGow0D6XcmAWmYCRgvqOUTnzCxPc9uF35u5ZEpirk1uhlPVA19tflhvnW1g==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
35+
<script src="https://cdnjs.cloudflare.com/ajax/libs/dayjs/1.11.10/plugin/relativeTime.min.js" integrity="sha512-MVzDPmm7QZ8PhEiqJXKz/zw2HJuv61waxb8XXuZMMs9b+an3LoqOqhOEt5Nq3LY1e4Ipbbd/e+AWgERdHlVgaA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
3636
<script src="/73874bbf/jinjafx_m.js"></script>
3737
</head>
3838
<body>

www/jinjafx_o.css

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ pre#print_pre {
3636
.fs-85 {
3737
font-size: 85%;
3838
}
39+
.hide {
40+
display: none !important;
41+
}
3942
.nosb {
4043
overflow-y: scroll;
4144
scrollbar-width: none;

www/jinjafx_o.js

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
(function() {
2+
var active = null;
23
var obj = null;
34
var tid = 0;
45
var qs = '';
@@ -50,6 +51,7 @@
5051
};
5152

5253
document.getElementById('print').onclick = function() {
54+
sobj.innerHTML = '';
5355
var t = document.getElementById('t_' + document.querySelector('.tab-content > .active').getAttribute('id'));
5456

5557
if (t.nodeName == 'IFRAME') {
@@ -61,6 +63,49 @@
6163
}
6264
};
6365

66+
document.getElementById('docx').onclick = function() {
67+
sobj.innerHTML = '';
68+
if (obj != null) {
69+
var xHR = new XMLHttpRequest();
70+
xHR.open("POST", 'html2docx' + qs, true);
71+
72+
xHR.onload = function() {
73+
if (this.status === 200) {
74+
var link = document.createElement('a');
75+
link.href = window.URL.createObjectURL(xHR.response);
76+
link.download = xHR.getResponseHeader("X-Download-Filename");
77+
link.click();
78+
}
79+
else {
80+
var sT = (this.statusText.length == 0) ? window.opener.getStatusText(this.status) : this.statusText;
81+
set_status("darkred", "HTTP ERROR " + this.status, sT);
82+
}
83+
};
84+
85+
xHR.timeout = 10000;
86+
xHR.onerror = function() {
87+
set_status("darkred", "ERROR", "XMLHttpRequest.onError()");
88+
};
89+
xHR.ontimeout = function() {
90+
set_status("darkred", "ERROR", "XMLHttpRequest.onTimeout()");
91+
};
92+
93+
xHR.responseType = "blob";
94+
xHR.setRequestHeader("Content-Type", "application/json");
95+
96+
var o = JSON.stringify(obj.outputs[active + ':html']);
97+
if (o.length > 1024) {
98+
xHR.setRequestHeader("Content-Encoding", "gzip");
99+
xHR.send(pako.gzip(o));
100+
}
101+
else {
102+
xHR.send(o);
103+
}
104+
}
105+
var t = document.getElementById('t_' + document.querySelector('.tab-content > .active').getAttribute('id'));
106+
t.focus();
107+
};
108+
64109
document.getElementById('download').onclick = function() {
65110
sobj.innerHTML = '';
66111
if (obj != null) {
@@ -195,6 +240,26 @@
195240
window.onresize();
196241
document.body.style.display = 'block';
197242

243+
function toggle_docx() {
244+
var e = document.getElementsByClassName('nav-link active');
245+
for (var i = 0; i < e.length; i++) {
246+
active = e.item(i).text;
247+
if (active + ':html' in obj.outputs) {
248+
document.getElementById('docx').classList.remove('d-none');
249+
}
250+
else {
251+
document.getElementById('docx').classList.add('d-none');
252+
}
253+
}
254+
}
255+
256+
var e = document.getElementsByClassName('nav-link');
257+
for (var i = 0; i < e.length; i++) {
258+
e.item(i).onclick = toggle_docx;
259+
}
260+
261+
toggle_docx();
262+
198263
if (stderr != null) {
199264
var html = '<ul class="mb-0">'
200265
stderr.trim().split(/\n+/).forEach(function(w) {

www/logs.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<meta name="viewport" content="width=1280, user-scalable=no">
66
<title>JinjaFx Logs</title>
77
<link rel="shortcut icon" href="/874f2915/jinjafx.png">
8-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.1/css/bootstrap.min.css" integrity="sha512-Z/def5z5u2aR89OuzYcxmDJ0Bnd5V1cKqBEbvLOiUNWdg9PQeXVvXLI90SE4QOHGlfLqUnDNVAYyZi8UwUTmWQ==" crossorigin="anonymous" referrerpolicy="no-referrer">
8+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.2/css/bootstrap.min.css" integrity="sha512-b2QcS5SsA8tZodcDtGRELiGv5SaKSk1vDHDaQRda0htPYWZ6046lr3kJ5bAAQdpV2mmA/4v0wQF9MyU6/pDIAg==" crossorigin="anonymous" referrerpolicy="no-referrer">
99
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/fira_code.min.css" integrity="sha512-MbysAYimH1hH2xYzkkMHB6MqxBqfP0megxsCLknbYqHVwXTCg9IqHbk+ZP/vnhO8UEW6PaXAkKe2vQ+SWACxxA==" crossorigin="anonymous" referrerpolicy="no-referrer">
1010
<link rel="stylesheet" href="/f8555653/jinjafx.css">
1111
<style>

0 commit comments

Comments
 (0)