summaryrefslogtreecommitdiff
path: root/guide-src/make.py
blob: 058a63b09241508242664a1eb5ee1623abeec109 (plain)
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import os, html
from urllib.parse import quote
import shutil

INPUT_DIR = 'guide-src'
OUTPUT_DIR = 'guide'
TITLE_PREFIX = '---'

os.makedirs(OUTPUT_DIR, exist_ok=True)

try:
	for f in os.listdir(INPUT_DIR):
		if f.endswith('.png'):
			shutil.copyfile(INPUT_DIR + '/' + f, OUTPUT_DIR + '/' + f)
		elif not '.' in f:
			os.makedirs(OUTPUT_DIR + '/' + f, exist_ok=True)
except FileNotFoundError:
	print('this script must be run from the root directory.')
	quit()

def readlines(path):
	f = open(path)
	l = f.readlines()
	f.close()
	return l

class Section:
	def __init__(self, path, name):
		self.path = path
		self.name = name
		self.items = []
	
	def __repr__(self):
		return ''.join(['Section(path=', repr(self.path), ', name=', repr(self.name), ', items=', repr(self.items), ')'])
		
outline = [l.strip() for l in readlines('{}/outline.txt'.format(INPUT_DIR)) if l.strip()]
sections = []
for item in outline:
	if item[0] == '/':
		assert item.endswith('.html'), 'expected path ending in .html'
		sections[-1].items.append(item[1:])
	else:
		[path, name] = item.split(': ')
		sections.append(Section(path, name))

sidebar_content = [
	('', '<a class="guide-sidebar-item" href="<ROOT>../index.html">back to pugl</a>'),
	('index.html', '<a class="guide-sidebar-item" href="<ROOT>index.html">the basics</a>'),
]

for section in sections:
	sidebar_content.append(('', '<h3 class="guide-sidebar-heading">{}</h3>'.format(section.name)))
	for item in section.items:
		path = '{}/{}/{}'.format(INPUT_DIR, section.path, item)
		file = open(path)
		first_line = file.readline().strip()
		file.close()
		assert first_line.startswith(TITLE_PREFIX), 'file {} doesn\'t start with title prefix {}'.format(path, TITLE_PREFIX)
		title = first_line[len(TITLE_PREFIX):].strip()
		assert '"' not in path, 'path {} should not contain "'.format(path)
		url = quote('{}/{}'.format(section.path, item))
		sidebar_content.append((section.path + '/' + item, '<a href="<ROOT>{}" class="guide-sidebar-item guide-sidebar-item-indented">{}</a>'.format(url, html.escape(title))))

def process_file(path):
	count = path.count('/')
	if count == 0:
		guide_root = ''
	elif count == 1:
		guide_root = '../'
	else:
		assert False, 'whats goin on with ' + path
	lines = readlines(INPUT_DIR + '/' + path)
	assert lines[0].startswith(TITLE_PREFIX)
	title = lines[0][len(TITLE_PREFIX):].strip()
	contents = ''.join(lines[1:])
	sidebar = []
	for (p, item) in sidebar_content:
		if p == path:
			item = item.replace('class="', 'class="guide-sidebar-item-active ')
		item = item.replace('<ROOT>', guide_root)
		sidebar.append(item.replace('<ROOT>', guide_root))
	output = '''<!DOCTYPE html>
<!-- This file was auto-generated by make.py. DO NOT EDIT IT DIRECTLY. -->
<html>
<head>
	<title>pugl - {title}</title>
	<meta charset="utf-8">
	<meta content="width=device-width,initial-scale=1" name="viewport">
	<link rel="icon" href="{root}../favicon.ico">
	<link rel="stylesheet" href="{root}../style.css">
</head>
<body id="guide-body">
<div id="guide-sidebar">
{sidebar}
</div>
<div id="guide-contents">
{contents}
</div>
</body>
</html>'''.format(title=title, sidebar=''.join(sidebar), contents=contents, root=guide_root)
	f = open(OUTPUT_DIR + '/' + path, 'w')
	f.write(output)
	f.close()

process_file('index.html')
for section in sections:
	for item in section.items:
		process_file('{}/{}'.format(section.path, item))