diff --git a/extra_sass/style.css.scss b/extra_sass/style.css.scss new file mode 100644 index 0000000..0d82efd --- /dev/null +++ b/extra_sass/style.css.scss @@ -0,0 +1,98 @@ +@media print { + .md-typeset { + line-height: 1.4; + } + .md-typeset ul li, + .md-typeset ol li { + margin-bottom: .25rem; + } + + #doc-toc ul li>a>span, + .md-typeset h1>span, + .md-typeset h2>span, + .md-typeset h3>span { + display: inline-block; + } + + .md-typeset h1>span, + .md-typeset h2>span, + .md-typeset h3>span { + padding-right: 0.5rem; + } + + /** workaround [[ */ + .md-typeset h2>span.twemoji, + .md-typeset h2>span.twemoji>img { + height: 1.363em; + } + .md-typeset h2>span.twemoji>img { + margin-top: -0.3em; + } + #doc-toc span.twemoji, + #doc-toc span.twemoji img { + height: 1.125rem; + vertical-align: middle; + } + + .md-typeset span.twemoji, + .md-typeset span.twemoji img { + display: inline-block; + } + .md-typeset figure { + display: block; + & > img { + margin: 0 auto; + } + } + + /* ]] **/ + + .md-typeset .tx-content__footer hr, + footer.md-typeset hr { + background-color: transparent; + border-bottom: 0.5px solid #e91e63; + } + footer.md-typeset a { + display: flex; + justify-content: center; + vertical-align: middle; + } + + .md-typeset .tx-insiders-container, + .md-typeset .mdx-insiders-container { + display: block; + clear: both; + + & .tx-insiders-list, + & .mdx-insiders-list { + display: flex; + flex-wrap: wrap; + + & .tx-insiders-list__item, + & .mdx-insiders-list__item { + float: none; + } + } + } + + section.md-typeset[data-url="/changelog/"] { + & h4+ul { + margin: 0; + } + & ul>li { + margin-bottom: 0; + } + } + + article a, + article blockquote, + article pre, + article table, + article ul, + article ol, + article * + div.highlight, + section + section * + div.highlight { + page-break-before: auto !important; + page-break-inside: auto !important; + } +} diff --git a/mkdocs-pdf-print.yml b/mkdocs-pdf-print.yml index da0f2b1..3595377 100644 --- a/mkdocs-pdf-print.yml +++ b/mkdocs-pdf-print.yml @@ -1,23 +1,26 @@ # Used to trigger a PDF build of the site INHERIT: mkdocs.yml + +# Slimmed down version of recipes +docs_dir: 'docs_to_pdf' + plugins: + extra-sass: with-pdf: - author: David Young - copyright: ANY TEXT - - cover: false + #author: David Young + #copyright: ANY TEXT + cover: true back_cover: true - cover_title: TITLE TEXT - cover_subtitle: SUBTITLE TEXT - custom_template_path: TEMPLATES PATH - toc_title: TOC TITLE TEXT - heading_shift: false + #cover_title: TITLE TEXT + #cover_subtitle: SUBTITLE TEXT + #custom_template_path: TEMPLATES PATH + #toc_title: TOC TITLE TEXT + #heading_shift: true toc_level: 3 - ordered_chapter_level: 2 + ordered_chapter_level: 4 excludes_children: - 'release-notes/:upgrading' - 'release-notes/:changelog' - exclude_pages: - 'bugs/' - 'appendix/contribute/' @@ -26,14 +29,11 @@ plugins: img: POSTER IMAGE URL text: ALTERNATE TEXT - src: ... - two_columns_level: 3 - +# two_columns_level: 3 render_js: true - headless_chrome_path: headless-chromium - - output_path: any-place/document.pdf - enabled_if_env: ENABLE_PDF_EXPORT +# headless_chrome_path: headless-chromium + output_path: funky-penguins-geek-cookbook.pdf debug_html: true show_anchors: true verbose: true diff --git a/pdf_event_hook/__init__.py b/pdf_event_hook/__init__.py new file mode 100644 index 0000000..17c042b --- /dev/null +++ b/pdf_event_hook/__init__.py @@ -0,0 +1,56 @@ +import logging + +from bs4 import BeautifulSoup +from mkdocs.structure.pages import Page + + +def inject_link(html: str, href: str, + page: Page, logger: logging) -> str: + """Adding PDF View button on navigation bar(using material theme)""" + + def _pdf_icon(): + _ICON = ''' + + + + + + + + + + + + +''' # noqa: E501 + return BeautifulSoup(_ICON, 'html.parser') + + logger.info('(hook on inject_link: %s)', page.title) + soup = BeautifulSoup(html, 'html.parser') + + nav = soup.find(class_='md-header-nav') + if not nav: + # after 7.x + nav = soup.find('nav', class_='md-header__inner') + if nav: + a = soup.new_tag('a', href=href, title='PDF', + **{'class': 'md-header-nav__button md-icon'}) + a.append(_pdf_icon()) + nav.append(a) + return str(soup) + + return html + + +# def pre_js_render(soup: BeautifulSoup, logger: logging) -> BeautifulSoup: +# logger.info('(hook on pre_js_render)') +# return soup + + +# def pre_pdf_render(soup: BeautifulSoup, logger: logging) -> BeautifulSoup: +# logger.info('(hook on pre_pdf_render)') +# tag = soup.find(lambda tag: tag.name == +# 'body' and 'data-md-color-scheme' in tag.attrs) +# if tag: +# tag['data-md-color-scheme'] = 'print' +# return soup diff --git a/scripts/build-pdf.sh b/scripts/build-pdf.sh index a2b937a..8f4ac70 100755 --- a/scripts/build-pdf.sh +++ b/scripts/build-pdf.sh @@ -1,4 +1,10 @@ #!/bin/bash set -e -docker build --build-arg FROM_SOURCE=ghcr.io/geek-cookbook/mkdocs-material-insiders . -t funkypenguin/mkdocs-material --platform amd64 -docker run --rm --name mkdocs-material -e ENABLE_PDF_EXPORT=1 -v ${PWD}:/docs funkypenguin/mkdocs-material build -f mkdocs-pdf-print.yml +# docker build --build-arg FROM_SOURCE=ghcr.io/geek-cookbook/mkdocs-material-insiders . -t funkypenguin/mkdocs-material --platform amd64 + +# Prepare slimmed-down versions for PDFing +cp -rf manuscript docs_to_pdf +find docs_to_pdf -type f -exec sed -i -e 's/recipe-footer.md/common-links.md/g' {} \; + +# Build PDF from slimmed recipes +docker run --rm --name mkdocs-material -e ENABLE_PDF_EXPORT=1 -v ${PWD}/docs_to_pdf:/docs funkypenguin/mkdocs-material build -f mkdocs-pdf-print.yml