Skip to content

Commit daab6bf

Browse files
orzihdomWalters
authored andcommitted
Modified the options and processing of ReLaXedJS.
1 parent 50da20d commit daab6bf

File tree

4 files changed

+67
-29
lines changed

4 files changed

+67
-29
lines changed

README.md

+4-3
Original file line numberDiff line numberDiff line change
@@ -245,14 +245,15 @@ plugins:
245245
> <ANY_SITE_URL(eg. 'https://google.com')>
246246
> ```
247247
248-
* `use_relaxed_js_renderer`
248+
* `relaxedjs_path`
249249
250-
Set the value to `true` if you're using e.g. '[Mermaid](https://mermaid-js.github.io) diagrams and Headless Chrome is not working for you.
250+
Set the value to execute command of relaxed if you're using e.g. '[Mermaid](https://mermaid-js.github.io) diagrams and Headless Chrome is not working for you.
251251
Require "ReLaXed" Javascript PDF renderer to be installed on your system. See: '[ReLaXed](https://github.com/RelaxedJS/ReLaXed)'.
252252
253253
Please use 'theme_handler_path' option to specify custom JS sources and CSS Stylesheets which covers your needs. E.g. for Material
254254
theme it would be **material.py**. See: **mkdocs-with-pdf/mkdocs_with_pdf/themes/material.py** for implementation details.
255-
**default**: `false`
255+
**default**: `None`
256+
_**since**: `v0.7.0`_
256257
257258
> Install on your system:
258259
> ```

mkdocs_with_pdf/drivers/relaxedjs.py

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import os
2+
from logging import Logger
3+
from shutil import which
4+
from subprocess import PIPE, Popen
5+
from tempfile import TemporaryDirectory
6+
7+
8+
class RelaxedJSRenderer(object):
9+
10+
@classmethod
11+
def setup(self, program_path: str, logger: Logger):
12+
if not program_path:
13+
return None
14+
15+
if not which(program_path):
16+
raise RuntimeError(
17+
'No such `ReLaXed` program or not executable'
18+
+ f': "{program_path}".')
19+
20+
return self(program_path, logger)
21+
22+
def __init__(self, program_path: str, logger: Logger):
23+
self._program_path = program_path
24+
self._logger = logger
25+
26+
def write_pdf(self, html_string: str, output: str):
27+
self._logger.info(' Rendering with `ReLaXed JS`.')
28+
29+
with TemporaryDirectory() as work_dir:
30+
entry_point = os.path.join(work_dir, 'pdf_print.html')
31+
with open(entry_point, 'w+') as f:
32+
f.write(html_string)
33+
f.close()
34+
35+
self._logger.info(f" entry_point: {entry_point}")
36+
with Popen([self._program_path, entry_point, output,
37+
"--build-once"],
38+
stdout=PIPE) as proc:
39+
while True:
40+
log = proc.stdout.readline().decode().strip()
41+
if log:
42+
self._logger.info(f" {log}")
43+
if proc.poll() is not None:
44+
break

mkdocs_with_pdf/generator.py

+12-16
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import os
33
import re
44
from typing import Pattern
5-
import subprocess
65
from importlib import import_module
76
from importlib.util import module_from_spec, spec_from_file_location
87

@@ -140,31 +139,31 @@ def add_stylesheet(stylesheet: str):
140139
self._options.two_columns_level,
141140
self._options.logger)
142141
self._normalize_link_anchors(soup)
143-
html_string = self._render_js(soup)
142+
143+
if self._options.relaxed_js:
144+
html_string = str(soup)
145+
else:
146+
html_string = self._render_js(soup)
144147

145148
html_string = self._options.hook.pre_pdf_render(html_string)
146149

147150
if self._options.debug_html:
148151
print(f'{html_string}')
149152

153+
self.logger.info("Rendering for PDF.")
154+
150155
abs_pdf_path = os.path.join(config['site_dir'], output_path)
151-
output_pdf_name = self._options.output_pdf_name
152156
os.makedirs(os.path.dirname(abs_pdf_path), exist_ok=True)
153157

154-
self.logger.info("Rendering for PDF.")
155158
self.logger.info(f'Output a PDF to "{abs_pdf_path}".')
156159

157-
if self._options.use_relaxed_js_renderer:
158-
self.logger.info("Use 'Relaxed' JS renderer.")
159-
output_html_name = os.path.join(abs_pdf_path, output_pdf_name + '.html')
160-
with open(output_html_name, 'w+') as f:
161-
f.write(html_string)
162-
f.close()
163-
subprocess.call(["relaxed", output_html_name, "--build-once"])
160+
if self._options.relaxed_js:
161+
self._options.relaxed_js.write_pdf(
162+
html_string, abs_pdf_path)
164163
else:
165164
html = HTML(string=html_string)
166165
render = html.render()
167-
render.write_pdf(abs_pdf_path + output_pdf_name + ".pdf")
166+
render.write_pdf(abs_pdf_path)
168167

169168
# ------------------------
170169
def _remove_empty_tags(self, soup: PageElement):
@@ -393,10 +392,7 @@ def _render_js(self, soup):
393392
for src in scripts:
394393
body.append(soup.new_tag('script', src=f'file://{src}'))
395394

396-
if self._options.use_relaxed_js_renderer:
397-
return str(soup)
398-
else:
399-
return self._options.js_renderer.render(str(soup))
395+
return self._options.js_renderer.render(str(soup))
400396

401397
def _scrap_scripts(self, soup):
402398
if not self._options.js_renderer:

mkdocs_with_pdf/options.py

+7-10
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from .drivers.event_hook import EventHookHandler
66
from .drivers.headless_chrome import HeadlessChromeDriver
7+
from .drivers.relaxedjs import RelaxedJSRenderer
78
from .templates.template import Template
89

910

@@ -16,8 +17,7 @@ class Options(object):
1617
('debug_html', config_options.Type(bool, default=False)),
1718
('show_anchors', config_options.Type(bool, default=False)),
1819

19-
('output_pdf_name', config_options.Type(str, default="document")),
20-
('output_path', config_options.Type(str, default="pdf/")),
20+
('output_path', config_options.Type(str, default="pdf/document.pdf")),
2121
('theme_handler_path', config_options.Type(str, default=None)),
2222

2323
('author', config_options.Type(str, default=None)),
@@ -44,8 +44,8 @@ class Options(object):
4444
('render_js', config_options.Type(bool, default=False)),
4545
('headless_chrome_path',
4646
config_options.Type(str, default='chromium-browser')),
47-
('use_relaxed_js_renderer',
48-
config_options.Type(bool, default=False)),
47+
('relaxedjs_path',
48+
config_options.Type(str, default=None)),
4949
)
5050

5151
def __init__(self, local_config, config, logger: logging):
@@ -56,7 +56,6 @@ def __init__(self, local_config, config, logger: logging):
5656
self.show_anchors = local_config['show_anchors']
5757

5858
self.output_path = local_config.get('output_path', None)
59-
self.output_pdf_name = local_config.get('output_pdf_name', None)
6059
self.theme_handler_path = local_config.get('theme_handler_path', None)
6160

6261
# Author and Copyright
@@ -93,17 +92,15 @@ def __init__(self, local_config, config, logger: logging):
9392

9493
self.two_columns_level = local_config['two_columns_level']
9594

96-
if local_config['use_relaxed_js_renderer']:
97-
self.use_relaxed_js_renderer = True
98-
else:
99-
self.use_relaxed_js_renderer = False
100-
10195
# ...etc.
10296
self.js_renderer = None
10397
if local_config['render_js']:
10498
self.js_renderer = HeadlessChromeDriver.setup(
10599
local_config['headless_chrome_path'], logger)
106100

101+
self.relaxed_js = RelaxedJSRenderer.setup(
102+
local_config['relaxedjs_path'], logger)
103+
107104
# Theming
108105
self.theme_name = config['theme'].name
109106
self.theme_handler_path = local_config.get('theme_handler_path', None)

0 commit comments

Comments
 (0)