From ae13870226eb5b5a00fb87f442ae77fde6ed9e29 Mon Sep 17 00:00:00 2001 From: Ed Ward Date: Thu, 1 Aug 2019 13:28:14 +0200 Subject: [PATCH] Various improvements in the PDF rendering. More efficient build --- build.py | 32 ++++++++++--------- pdf-template.html | 9 +++--- source/css/common.css | 14 +++++++++ source/css/pdf.css | 71 ++++++++++++++++++++++++++----------------- source/css/screen.css | 14 --------- 5 files changed, 79 insertions(+), 61 deletions(-) diff --git a/build.py b/build.py index 75a13f1..3469853 100755 --- a/build.py +++ b/build.py @@ -354,7 +354,7 @@ def BuildOnePageSidebar(fs): levelNums = [0]*3 for i in range(len(fs)): - # Handle Part/Chapter/subchapter/section/subsection numbering + # Handle Part/Chapter/subchapter numbering level = fs[i]['level'] if level < 2: levelNums[2] = 0 @@ -515,22 +515,22 @@ for header in fileStruct: print(header['title']) - # Handle TOC scriblings and one-page titles... + # Handle TOC scriblings... + if level == 0: + toc = toc + '

Part ' + num2roman(levelNums[level]) + ': ' + header['title'] + '

\n'; + elif level == 1: + toc = toc + '\t

Ch. ' + str(levelNums[level]) + ':  ' + header['title'] + '

\n' + elif level == 2: + toc = toc + '\t\t

' + header['title'] + '

\n' + + # Handle one-page and PDF titles... opl = '' if 'link' in header: opl = ' id="' + header['link'] + '"' else: opl = ' id="' + header['filename'] + '"' + oph = '' + header['title'] + '\n'; - if level == 0: - toc = toc + '

Part ' + num2roman(levelNums[level]) + ': ' + header['title'] + '

\n'; - oph = '

Part ' + num2roman(levelNums[level]) + ' - ' + header['title'] + '

\n'; - elif level == 1: - toc = toc + '\t

Ch. ' + str(levelNums[level]) + ':  ' + header['title'] + '

\n' - oph = '

' + str(levelNums[level]) + ' - ' + header['title'] + '

\n'; - elif level == 2: - toc = toc + '\t\t

' + header['title'] + '

\n' - oph = '

' + str(levelNums[level-1]) + '.' + str(levelNums[level]) + ' - ' + header['title'] + '

\n'; # Make the 'this thing contains...' stuff if HaveChildren(fileStruct, pageNumber): @@ -680,17 +680,21 @@ if not nopdf: print('Generating the PDF...') # Create the PDF version of the documentation - pdfpageFile = open(global_site_dir + 'pdf.html', 'w') pdfpage = pdfpage.replace('{% tree %}', opsidebar) # create the TOC pdfpage = pdfpage.replace('{{ content }}', '') # cleans up the last spaceholder pdfpage = pdfpage.replace('src="/images/', 'src="images/') # makes images links relative pdfpage = pdfpage.replace('url(\'/images/', 'url(\'images/') # CSS images links relative + # Write it to disk (optional, can be removed) + pdfpageFile = open(global_site_dir + 'pdf.html', 'w') pdfpageFile.write(pdfpage) pdfpageFile.close() + # Generating the actual PDF with weasyprint (https://weasyprint.org/) from weasyprint import HTML - doc = HTML(filename = global_site_dir + 'pdf.html') - doc.write_pdf(global_site_dir + 'manual.pdf') + #from weasyprint.fonts import FontConfiguration + #html_font_config = FontConfiguration() + doc = HTML(string = pdfpage, base_url = global_site_dir) + doc.write_pdf(global_site_dir + 'manual.pdf')#, font_config = html_font_config) if not quiet: print('Processed ' + str(fileCount) + ' files.') diff --git a/pdf-template.html b/pdf-template.html index 18389c8..bd9edd5 100644 --- a/pdf-template.html +++ b/pdf-template.html @@ -14,13 +14,12 @@
- - - -
+ Ardour logo +

The Ardour Manual

+
-

Table of contents

+

Table of contents

{% tree %} diff --git a/source/css/common.css b/source/css/common.css index e4716fb..967d65e 100644 --- a/source/css/common.css +++ b/source/css/common.css @@ -1,3 +1,17 @@ +@font-face { + font-family: 'junge-regular'; + src: url('junge-regular-webfont.woff') format('woff'), + url('junge-regular-webfont.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +body { + font-family: 'junge-regular'; + font-size: 16px; + line-height: 2ex; +} + kbd { display: inline-block; min-width: 1em; diff --git a/source/css/pdf.css b/source/css/pdf.css index 5429085..c5ae24e 100644 --- a/source/css/pdf.css +++ b/source/css/pdf.css @@ -5,26 +5,23 @@ margin: 1.5cm 1.5cm 1.5cm 1.5cm; } -@page :first { - size: A4; - margin: 1.5cm 1.5cm 1.5cm 1.5cm; - background: url("../images/ardour_logo.svg") no-repeat center; - background-size: contain; -} - img { max-width: 100%; } div.frontcover { page-break-after: always; + margin: auto; + width: 80%; + font-size: 4em; + text-align: center; } /* styles for the right hand spread Bottom left we display the title of the book, bottom right the page using a CSS counter, top right the content of the current chapter */ -@page:right { +@page :right { @bottom-left { margin: 10pt 0 30pt 0; /*border-top: .25pt solid #666;*/ @@ -49,7 +46,7 @@ div.frontcover { /* styles for the left hand spread Bottom right book title, bottom left current page */ -@page:left { +@page :left { @bottom-right { margin: 10pt 0 30pt 0; /*border-top: .25pt solid #666;*/ @@ -66,7 +63,7 @@ div.frontcover { } /* first page */ -@page:first { +@page :first { @bottom-right { content: normal; margin: 0; @@ -78,39 +75,57 @@ div.frontcover { } } -/* reset chapter and figure counters on the body */ body { - counter-reset: chapternum figurenum; - font-family: "Trebuchet MS", "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Tahoma, sans-serif; - line-height: 1.2; - font-size: 9pt; + counter-reset: partnum chapternum subchapternum figurenum; /* resets all counters */ + /*font-family: "Trebuchet MS", "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Tahoma, sans-serif;*/ + font-size: 10pt; + line-height: 1.25em; + } -/* get the title of the current chapter - this will be the content of the h1 -reset figure counter as figures start from 1 in each chapter */ h1 { - string-set: doctitle content(); + string-set: doctitle content(); /* get the title of the current chapter */ page-break-before: always; - counter-reset: figurenum; - line-height: 1.3; - counter-increment: chapternum; } -h1:first-of-type { /* the ToC should not count...*/ +#toc::before { /* the ToC should not count...*/ content: none; - counter-reset: chapternum; + counter-reset: partnum; + /*counter-increment: partnum -1;*/ } -/* increment and display figure counter */ -figcaption:before { - counter-increment: figurenum; - content: counter(chapternum) "-" counter(figurenum) ". "; +h1::before { /* parts */ + counter-increment: partnum; + content: "Part " counter(partnum) " - "; } +h2::before { /* chapter */ + counter-increment: chapternum; + content: "Chapter " counter(chapternum) " - "; +} + +h3::before { /* subchapter */ + counter-increment: subchapternum; + content: counter(chapternum) "." counter(subchapternum) " - " ; +} + +figcaption::before { + counter-increment: figurenum; + content: "Fig. " counter(chapternum) "." counter(figurenum) " - "; +} + +h1 { font-size: 3em; } +h2 { font-size: 2.25em; counter-reset: subchapternum figurenum; } +h3 { font-size: 1.75em; } +h4 { font-size: 1.4em; } +h5 { font-size: 1.2em; } +h6 { font-size: 1.1em; } + h1,h2,h3,h4,h5 { font-weight: bold; page-break-after: avoid; page-break-inside:avoid; + line-height: 1.25em; } h1+p, h2+p, h3+p { @@ -154,6 +169,6 @@ a { } /* add page number to cross references */ -a.xref:after { +a.xref::after { content: " (page " target-counter(attr(href, url), page) ")"; } diff --git a/source/css/screen.css b/source/css/screen.css index 0d6486f..bb0f469 100644 --- a/source/css/screen.css +++ b/source/css/screen.css @@ -1,17 +1,3 @@ -@font-face { - font-family: 'junge-regular'; - src: url('junge-regular-webfont.woff2') format('woff2'), - url('junge-regular-webfont.woff') format('woff'), - url('junge-regular-webfont.ttf') format('truetype'); - font-weight: normal; - font-style: normal; -} - -body { - font-family: 'junge-regular'; - font-size: 16px; - line-height: 2ex; -} .clear { clear:both;