Initial commit
This commit is contained in:
commit
acdf17e31c
2 changed files with 116 additions and 0 deletions
12
README.md
Normal file
12
README.md
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
|
||||||
|
## HTML Template Example
|
||||||
|
|
||||||
|
```html
|
||||||
|
<div class="sheet">
|
||||||
|
<h1>Hello</h1>
|
||||||
|
<p>World</p>
|
||||||
|
</div>
|
||||||
|
<div class="sheet">
|
||||||
|
<h1>Second Page</h1>
|
||||||
|
</div>
|
||||||
|
```
|
104
generate.py
Executable file
104
generate.py
Executable file
|
@ -0,0 +1,104 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from jinja2 import Template
|
||||||
|
from yaml import safe_load
|
||||||
|
|
||||||
|
PAPER_CSS = """@page { margin: 0 }
|
||||||
|
body { margin: 0 }
|
||||||
|
.sheet {
|
||||||
|
margin: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
box-sizing: border-box;
|
||||||
|
page-break-after: always;
|
||||||
|
}
|
||||||
|
/** Paper sizes **/
|
||||||
|
body.A3 .sheet { width: 297mm; height: 419mm }
|
||||||
|
body.A3.landscape .sheet { width: 420mm; height: 296mm }
|
||||||
|
body.A4 .sheet { width: 210mm; height: 296mm }
|
||||||
|
body.A4.landscape .sheet { width: 297mm; height: 209mm }
|
||||||
|
body.A5 .sheet { width: 148mm; height: 209mm }
|
||||||
|
body.A5.landscape .sheet { width: 210mm; height: 147mm }
|
||||||
|
body.letter .sheet { width: 216mm; height: 279mm }
|
||||||
|
body.letter.landscape .sheet { width: 280mm; height: 215mm }
|
||||||
|
body.legal .sheet { width: 216mm; height: 356mm }
|
||||||
|
body.legal.landscape .sheet { width: 357mm; height: 215mm }
|
||||||
|
/** Padding area **/
|
||||||
|
.sheet.padding-10mm { padding: 10mm }
|
||||||
|
.sheet.padding-15mm { padding: 15mm }
|
||||||
|
.sheet.padding-20mm { padding: 20mm }
|
||||||
|
.sheet.padding-25mm { padding: 25mm }
|
||||||
|
/** For screen preview **/
|
||||||
|
@media screen {
|
||||||
|
body { background: #e0e0e0 }
|
||||||
|
.sheet {
|
||||||
|
background: white;
|
||||||
|
box-shadow: 0 .5mm 2mm rgba(0,0,0,.3);
|
||||||
|
margin: 5mm auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/** Fix for Chrome issue #273306 **/
|
||||||
|
@media print {
|
||||||
|
body.A3.landscape { width: 420mm }
|
||||||
|
body.A3, body.A4.landscape { width: 297mm }
|
||||||
|
body.A4, body.A5.landscape { width: 210mm }
|
||||||
|
body.A5 { width: 148mm }
|
||||||
|
body.letter, body.legal { width: 216mm }
|
||||||
|
body.letter.landscape { width: 280mm }
|
||||||
|
body.legal.landscape { width: 357mm }
|
||||||
|
}"""
|
||||||
|
|
||||||
|
BASE_TEMPLATE = Template(
|
||||||
|
"""<!DOCTYPE html>
|
||||||
|
<html lang="{{ lang }}">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>{{ title }}</title>
|
||||||
|
</head>
|
||||||
|
<body class="A4">
|
||||||
|
<style>
|
||||||
|
/* paper.css -> https://github.com/cognitom/paper-css */
|
||||||
|
{{ paper_css }}
|
||||||
|
/* own rules */
|
||||||
|
@page { size: A4; }
|
||||||
|
{{ css }}
|
||||||
|
</style>
|
||||||
|
{{ content }}
|
||||||
|
</body>
|
||||||
|
</html>""")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
argp = ArgumentParser()
|
||||||
|
argp.add_argument(
|
||||||
|
"-t", "--template",
|
||||||
|
help="The path to the html content template",
|
||||||
|
metavar="PATH",
|
||||||
|
type=Path, required=True)
|
||||||
|
argp.add_argument(
|
||||||
|
"-s", "--css",
|
||||||
|
help="The path to the css file",
|
||||||
|
metavar="PATH",
|
||||||
|
type=Path, required=True)
|
||||||
|
argp.add_argument(
|
||||||
|
"-d", "--data",
|
||||||
|
help="The path to the yaml file containing the variables used in the templates",
|
||||||
|
metavar="PATH",
|
||||||
|
type=Path, required=True)
|
||||||
|
args = argp.parse_args()
|
||||||
|
# load data
|
||||||
|
with args.data.open("r") as f:
|
||||||
|
data = safe_load(f)
|
||||||
|
# load css
|
||||||
|
with args.css.open("r") as f:
|
||||||
|
css = f.read()
|
||||||
|
# template content
|
||||||
|
with args.template.open("r") as f:
|
||||||
|
content_template = Template(f.read())
|
||||||
|
content = content_template.render(data)
|
||||||
|
# template out complete html document
|
||||||
|
result = BASE_TEMPLATE.render(lang=data["lang"], title=data["title"], paper_css=PAPER_CSS, css=css, content=content)
|
||||||
|
print(result)
|
Loading…
Add table
Add a link
Reference in a new issue