-
Notifications
You must be signed in to change notification settings - Fork 0
/
render_website.py
63 lines (53 loc) · 2.2 KB
/
render_website.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import json
import urllib.parse
import math
import os
import more_itertools
from environs import Env
from jinja2 import Environment, FileSystemLoader, select_autoescape
from livereload import Server
def get_books(book_json_path, books_per_page):
with open(book_json_path, 'r', encoding='utf-8') as file:
books_json = file.read()
books = json.loads(books_json)
pages_count = math.ceil(len(books) / books_per_page)
for book in books:
book['book_path'] = urllib.parse.quote(book.get('book_path'))
book['img_src'] = urllib.parse.quote(book.get('img_src'))
chunked_books = list(more_itertools.chunked(books, books_per_page))
return pages_count, chunked_books
def render_page(template, pages_count, page_number, first_col_books, second_col_books, folder):
rendered_page = template.render(
folder=folder,
pages_count=pages_count,
page_number=page_number,
first_col_books=first_col_books,
second_col_books=second_col_books
)
if page_number == 1:
with open(os.path.join(folder, f'index.html'), 'w', encoding="utf8") as file:
file.write(rendered_page)
else:
with open(os.path.join(folder, f'index{page_number}.html'), 'w', encoding="utf8") as file:
file.write(rendered_page)
def on_reload():
env = Env()
env.read_env()
folder = env('FOLDER', default='pages')
books_per_page = env.int('BOOKS_PER_PAGE', default=10)
books_per_col = int(books_per_page / 2)
env = Environment(
loader=FileSystemLoader('.'),
autoescape=select_autoescape(['html', 'xml'])
)
template = env.get_template('template.html')
pages_count, chunked_books = get_books('books.json', books_per_page)
os.makedirs(folder, exist_ok=True)
for page_number, books_on_page in enumerate(chunked_books, 1):
first_col_books, second_col_books = more_itertools.chunked(books_on_page, math.ceil(len(books_on_page) / 2))
render_page(template, pages_count, page_number, first_col_books, second_col_books, folder)
if __name__ == '__main__':
on_reload()
server = Server()
server.watch('template.html', on_reload)
server.serve(root='.', default_filename='pages/index.html')