Skip to content

Commit d307c46

Browse files
committed
Fixed run on Python 3.5.
1 parent 1c935b6 commit d307c46

17 files changed

Lines changed: 241 additions & 203 deletions

File tree

CHANGELOG

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
mkdocs-with-pdf 0.8.3 (2021-01-11)
2+
3+
* Fixed run on Python 3.5.
4+
15
mkdocs-with-pdf 0.8.2 (2021-01-08)
26

37
* Added a rendering hook module handler.

Pipfile

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ autopep8 = "*"
1313
mdx-gh-links = "*"
1414
mkdocs-redirects = "*"
1515
mkdocs-minify-plugin = "*"
16-
python-barcode = "*"
1716
qrcode = "*"
1817

1918
[packages]
@@ -30,5 +29,5 @@ weasyprint = "*"
3029

3130
[scripts]
3231
lint = "flake8 --show-source mkdocs_with_pdf"
33-
format = "autopep8 -ivr mkdocs_with_pdf"
32+
format = "autopep8 -ivaar mkdocs_with_pdf"
3433
test = "python -m unittest discover -v -s tests"

Pipfile.lock

Lines changed: 154 additions & 132 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mkdocs_with_pdf/cover.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def _make_cover(soup: PageElement, options: Options):
2323
keywords = options.template.keywords
2424
template = options.template.select(['cover', 'default_cover'])
2525

26-
options.logger.info(f'Generate a cover page with "{template.name}".')
26+
options.logger.info('Generate a cover page with "%s".', template.name)
2727
soup_template = BeautifulSoup(template.render(keywords), 'html.parser')
2828

2929
soup.body.insert(0, soup_template)
@@ -38,7 +38,7 @@ def _make_back_cover(soup: PageElement, options: Options):
3838
['back_cover', 'default_back_cover'])
3939

4040
options.logger.info(
41-
f'Generate a back cover page with "{template.name}".')
41+
'Generate a back cover page with "%s".', template.name)
4242
soup_template = BeautifulSoup(template.render(keywords), 'html.parser')
4343

4444
soup.body.append(soup_template)

mkdocs_with_pdf/drivers/event_hook.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ class EventHookHandler(object):
1616

1717
@classmethod
1818
def on_serve(cls, server, builder, logger: logging):
19-
path = f'./{cls._module_name}.py'
19+
path = './' + cls._module_name + '.py'
2020
if os.path.isfile(path):
21-
logger.warn(f'watch {path}')
21+
logger.warn('watch %s', path)
2222
server.watch(path, builder)
2323

2424
def __init__(self, options: object, config: Config, logger: logging):
@@ -37,7 +37,7 @@ def _load_module(self):
3737
module = __import__(self.__class__._module_name)
3838
importlib.reload(module)
3939
self._logger.info('Found PDF rendering event hook module.')
40-
except ModuleNotFoundError:
40+
except ImportError:
4141
module = None
4242

4343
return module

mkdocs_with_pdf/drivers/headless_chrome.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def setup(self, program_path: str, logger: Logger):
1313
if not which(program_path):
1414
raise RuntimeError(
1515
'No such `Headless Chrome` program or not executable'
16-
+ f': "{program_path}".')
16+
+ ': ' + program_path + '.')
1717
return self(program_path, logger)
1818

1919
def __init__(self, program_path: str, logger: Logger):
@@ -41,7 +41,7 @@ def render(self, html: str) -> str:
4141
return chrome.stdout.read().decode('utf-8')
4242

4343
except Exception as e:
44-
self._logger.error(f'Failed to render by JS: {e}')
44+
self._logger.error('Failed to render by JS: %s', e)
4545
finally:
4646
os.unlink(temp.name)
4747

mkdocs_with_pdf/generator.py

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def on_nav(self, nav):
3838
""" on_nav """
3939
self._nav = nav
4040
if nav:
41-
self._options.logger.debug(f'theme: {self._theme}')
41+
self._options.logger.debug('theme: %s', self._theme)
4242

4343
def on_post_page(self, output_content: str, page, pdf_path: str) -> str:
4444
""" on_post_page """
@@ -47,18 +47,18 @@ def is_excluded(url: str) -> bool:
4747
return url in self._options.exclude_pages
4848

4949
if is_excluded(page.url):
50-
self.logger.info(f'Page skipped: [{page.title}]({page.url})')
51-
return f"<!-- skipped '{page}' -->"
50+
self.logger.info('Page skipped: [%s](%s)', page.title, page.url)
51+
return "<!-- skipped '{}' -->".format(page)
5252
else:
53-
self.logger.debug(f' (post: [{page.title}]({page.url})')
53+
self.logger.debug(' (post: [%s](%s)', page.title, page.url)
5454

5555
soup = self._soup_from_content(output_content, page)
5656

5757
self._remove_empty_tags(soup)
5858

5959
if not self._head:
6060
self._head = soup.find('head')
61-
# self.logger.debug(f'{self._head}')
61+
# self.logger.debug('%s', self._head)
6262

6363
# for 'material'
6464
article = soup.find('article')
@@ -83,7 +83,8 @@ def is_excluded(url: str) -> bool:
8383
setattr(page, 'pdf-article', article)
8484
self._scrap_scripts(soup)
8585
else:
86-
self.logger.warning(f'Missing article: [{page.title}]({page.url})')
86+
self.logger.warning(
87+
'Missing article: [%s](%s)', page.title, page.url)
8788

8889
return self._options.hook.inject_link(
8990
output_content, pdf_path, page, self._theme)
@@ -128,7 +129,7 @@ def add_stylesheet(stylesheet: str):
128129
html_string = self._options.hook.pre_pdf_render(html_string)
129130

130131
if self._options.debug_html:
131-
print(f'{html_string}')
132+
print(html_string)
132133

133134
self.logger.info("Rendering for PDF.")
134135
html = HTML(string=html_string)
@@ -137,7 +138,7 @@ def add_stylesheet(stylesheet: str):
137138
abs_pdf_path = os.path.join(config['site_dir'], output_path)
138139
os.makedirs(os.path.dirname(abs_pdf_path), exist_ok=True)
139140

140-
self.logger.info(f'Output a PDF to "{abs_pdf_path}".')
141+
self.logger.info('Output a PDF to "%s".', abs_pdf_path)
141142
render.write_pdf(abs_pdf_path)
142143

143144
# ------------------------
@@ -156,7 +157,7 @@ def is_blank(el):
156157
hit = False
157158
for x in soup.find_all():
158159
if x.name in includes and is_blank(x):
159-
# self.logger.debug(f'Strip: {x}')
160+
# self.logger.debug('Strip: %s'%(x))
160161
x.extract()
161162
hit = True
162163
if not hit:
@@ -199,13 +200,13 @@ def _get_content(self, soup: PageElement, page):
199200
def shift_heading(elem, page):
200201
for i in range(7, 0, -1):
201202
while True:
202-
h = elem.find(f'h{i}')
203+
h = elem.find('h%d' % (i))
203204
if not h:
204205
break
205-
h.name = f'h{i + 1}'
206+
h.name = 'h%d' % (i + 1)
206207

207208
page_path = self._page_path_for_id(page)
208-
h1 = soup.new_tag('h1', id=f'{page_path}')
209+
h1 = soup.new_tag('h1', id=str(page_path))
209210
h1.append(page.title)
210211
elem.insert(0, h1)
211212
return elem
@@ -220,8 +221,8 @@ def cleanup_class(classes: []):
220221
if article:
221222

222223
page_path = self._page_path_for_id(page)
223-
article['id'] = f'{page_path}:' # anchor for each page.
224-
article['data-url'] = f'/{page_path}'
224+
article['id'] = '{}:'.format(page_path) # anchor for each page.
225+
article['data-url'] = '/{}'.format(page_path)
225226
return article
226227

227228
elif page.children:
@@ -246,8 +247,9 @@ def cleanup_class(classes: []):
246247
child_article['class'] = cleanup_class(classes)
247248

248249
page_path = self._page_path_for_id(page)
249-
new_article['id'] = f'{page_path}:' # anchor for each page.
250-
new_article['data-url'] = f'/{page_path}'
250+
# anchor for each page.
251+
new_article['id'] = '{}:'.format(page_path)
252+
new_article['data-url'] = '/{}'.format(page_path)
251253
if child_classes:
252254
new_article['class'] = child_classes
253255

@@ -282,14 +284,15 @@ def _load_theme_handler(self):
282284
return mod
283285
except FileNotFoundError as e:
284286
self.logger.error(
285-
f'Could not load theme handler {theme}'
286-
f' from custom directory "{custom_handler_path}": {e}')
287+
'Could not load theme handler %s'
288+
' from custom directory "%s": %s',
289+
theme, custom_handler_path, e)
287290
pass
288291

289292
try:
290293
return import_module(module_name, 'mkdocs_with_pdf.themes')
291294
except ImportError as e:
292-
self.logger.error(f'Could not load theme handler {theme}: {e}')
295+
self.logger.error('Could not load theme handler %s: %s', theme, e)
293296
return generic_theme
294297

295298
# -------------------------------------------------------------
@@ -319,7 +322,7 @@ def normalize_anchor_chars(anchor: str):
319322
if not (self._options.strict or self._options.debug_html):
320323
self.logger.info('Anchor points provided:')
321324
for anchor in sorted(anchors):
322-
self.logger.info(f'| {anchor}')
325+
self.logger.info('| %s', anchor)
323326
return
324327

325328
missing = set()
@@ -335,15 +338,15 @@ def normalize_anchor_chars(anchor: str):
335338
missing.add(href)
336339

337340
if len(missing):
338-
self.logger.error(f'Missing {len(missing)} link(s):')
341+
self.logger.error('Missing %d link(s):', len(missing))
339342
for link in sorted(missing):
340-
self.logger.warning(f' | {link}')
343+
self.logger.warning(' | %s', link)
341344
if (self._options.show_anchors or
342345
self._options.verbose or
343346
self._options.debug_html):
344347
self.logger.info(' | --- found anchors:')
345348
for anchor in sorted(anchors):
346-
self.logger.info(f' | {anchor}')
349+
self.logger.info(' | %s', anchor)
347350

348351
# -------------------------------------------------------------
349352

@@ -365,7 +368,8 @@ def _render_js(self, soup):
365368
tag.text = self._mixed_script
366369
body.append(tag)
367370
for src in scripts:
368-
body.append(soup.new_tag('script', src=f'file://{src}'))
371+
body.append(soup.new_tag(
372+
'script', src='file://%s' % (src)))
369373

370374
return self._options.js_renderer.render(str(soup))
371375

mkdocs_with_pdf/plugin.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ def on_config(self, config):
7171
if not self.enabled:
7272
self._logger.warning(
7373
'without generate PDF'
74-
f'(set environment variable {env_name} to 1 to enable)'
74+
'(set environment variable %s to 1 to enable)',
75+
env_name
7576
)
7677
return
7778
else:
@@ -135,15 +136,15 @@ def on_post_build(self, config):
135136
end = timer()
136137
self._total_time += (end - start)
137138
self._logger.info(
138-
f'Converting {self._num_pages} articles to PDF'
139-
f' took {self._total_time:.1f}s'
139+
'Converting {} articles to PDF'
140+
' took {:.1f}s'.format(self._num_pages, self._total_time)
140141
)
141142

142143
if self._error_counter:
143144
errors, warns = self._error_counter.counts()
144145
if errors > 0 or warns > 0:
145146
raise RuntimeError(
146-
f'{errors} error(s) and/or {warns} warning(s)'
147+
'{} error(s) and/or {} warning(s)'.format(errors, warns)
147148
+ ' occurred while generating PDF.')
148149

149150
def _get_path_to_pdf_from(self, start):

mkdocs_with_pdf/preprocessor/links/transform.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def transform():
2727
target = urljoin(rel_url, target_url.path)
2828

2929
if target in ['/', '.', 'index.html']:
30-
return f'#.:{hash}'
30+
return '#.:{}'.format(hash)
3131

3232
if target.endswith('.png'):
3333
return href
@@ -39,7 +39,7 @@ def transform():
3939
if not target.endswith('/'):
4040
target += '/'
4141

42-
return f'#{quote(target)}:{hash}'
42+
return '#{}:{}'.format(quote(target), hash)
4343

4444
x_href = transform()
4545

@@ -63,7 +63,7 @@ def transform_id(id: str, rel_url: str):
6363
"""normalize id to foo/bar/section:id"""
6464

6565
if rel_url in ['.', 'index.html']:
66-
return f'.:{id}'
66+
return '.:{}'.format(id)
6767

6868
head, tail = os.path.split(rel_url)
6969
section, _ = os.path.splitext(tail)
@@ -77,4 +77,4 @@ def normalize(path):
7777
head = normalize(head)
7878
section = normalize(section)
7979

80-
return f'{head}{section}:{id}'
80+
return '{}{}:{}'.format(head, section, id)

mkdocs_with_pdf/styles/__init__.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,20 @@ def _css_escape(text: str) -> str:
2121

2222

2323
def style_for_print(options: Options) -> str:
24-
scss = f"""
25-
:root {{
26-
string-set: author '{_css_escape(options.author)}',
27-
copyright '{_css_escape(options.copyright)}',
28-
title '{_css_escape(options.cover_title)}';
29-
}}
30-
h1, h2, h3 {{
24+
scss = """
25+
:root {
26+
string-set: author '%s',
27+
copyright '%s',
28+
title '%s';
29+
}
30+
h1, h2, h3 {
3131
string-set: chapter content();
32-
}}
33-
"""
32+
}
33+
""" % (
34+
_css_escape(options.author),
35+
_css_escape(options.copyright),
36+
_css_escape(options.cover_title)
37+
)
3438
css = sass.compile(string=scss)
3539

3640
base_path = os.path.abspath(os.path.dirname(__file__))

0 commit comments

Comments
 (0)