Compare commits
10 Commits
bfdaa5e7fb
...
5f22cdf06f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5f22cdf06f | ||
|
|
7d04d86b14 | ||
|
|
851a008170 | ||
|
|
ea2c441ddd | ||
|
|
b318d67eb4 | ||
|
|
21d81e3248 | ||
|
|
cc60119452 | ||
|
|
ba73ca3aef | ||
|
|
0b310e2220 | ||
|
|
54ec3b47a8 |
3
.gitignore
vendored
3
.gitignore
vendored
@ -1 +1,2 @@
|
|||||||
/__picache__
|
/__pycache__
|
||||||
|
/public
|
||||||
|
|||||||
10
Dockerfile
Normal file
10
Dockerfile
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
FROM python:3
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY requirements.txt ./
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
copy . .
|
||||||
|
|
||||||
|
CMD [ "python", "./render.py" ]
|
||||||
139
index.py
Normal file
139
index.py
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
import os
|
||||||
|
import yaml
|
||||||
|
import shutil
|
||||||
|
from jinja2 import Template
|
||||||
|
import sass
|
||||||
|
|
||||||
|
from page import Page
|
||||||
|
|
||||||
|
pages = []
|
||||||
|
|
||||||
|
# SRC_DIR = "/home/mreenen/Documents/git/kladjes"
|
||||||
|
SRC_DIR = os.path.abspath("/home/mreenen/Documents/git/kladjes")
|
||||||
|
TARGET_DIR = os.path.abspath("public")
|
||||||
|
|
||||||
|
def renderPage(page, template, header):
|
||||||
|
html = page.renderPage(template, header, SRC_DIR)
|
||||||
|
|
||||||
|
path = TARGET_DIR + page.url
|
||||||
|
if (path.split('.')[-1] != "html"):
|
||||||
|
path = os.path.abspath(path + '/index.html')
|
||||||
|
|
||||||
|
pathDir = os.path.dirname(path)
|
||||||
|
fileName = os.path.basename(path)
|
||||||
|
|
||||||
|
os.makedirs(pathDir, exist_ok=True)
|
||||||
|
with open(path, 'w') as file:
|
||||||
|
file.write(html)
|
||||||
|
del html
|
||||||
|
|
||||||
|
if (page.assets is not None):
|
||||||
|
print("assets found")
|
||||||
|
for asset in page.assets:
|
||||||
|
srcAssets = SRC_DIR + asset
|
||||||
|
destAssets = TARGET_DIR + asset
|
||||||
|
|
||||||
|
if(not os.path.isdir(destAssets)):
|
||||||
|
os.mkdir(destAssets)
|
||||||
|
|
||||||
|
print(f"asset: {asset}")
|
||||||
|
|
||||||
|
for f in os.listdir(srcAssets):
|
||||||
|
print(f"f: {f}")
|
||||||
|
if ((f[0] != '.') and os.path.isfile(srcAssets + "/" + f)):
|
||||||
|
print("copy: " + asset + "/" + f)
|
||||||
|
shutil.copyfile(srcAssets + "/" + f, destAssets + "/" + f)
|
||||||
|
|
||||||
|
def findPageInList(list, url):
|
||||||
|
i = 0
|
||||||
|
while (i < len(list)):
|
||||||
|
if (list[i].url == url):
|
||||||
|
return i
|
||||||
|
i += 1
|
||||||
|
return -1
|
||||||
|
|
||||||
|
def render(rootPage, template, header):
|
||||||
|
done = False
|
||||||
|
isSub = False
|
||||||
|
lastPage = []
|
||||||
|
curPage = 0
|
||||||
|
while not done:
|
||||||
|
if (curPage == 0):
|
||||||
|
page = rootPage
|
||||||
|
else:
|
||||||
|
pageIndex = curPage - 1
|
||||||
|
page = None
|
||||||
|
if (pageIndex < len(rootPage.subPages)):
|
||||||
|
page = rootPage.subPages[pageIndex]
|
||||||
|
else:
|
||||||
|
pageIndex -= len(rootPage.subPages)
|
||||||
|
if (pageIndex < len(rootPage.sidebar)):
|
||||||
|
page = rootPage.sidebar[pageIndex]
|
||||||
|
|
||||||
|
if (page is not None):
|
||||||
|
if (page.clickable):
|
||||||
|
renderPage(page, template, header)
|
||||||
|
|
||||||
|
if ((curPage != 0) and
|
||||||
|
((len(page.subPages) > 0) or (len(page.sidebar) > 0))):
|
||||||
|
rootPage = page
|
||||||
|
lastPage.append(curPage)
|
||||||
|
curPage = 1
|
||||||
|
else:
|
||||||
|
curPage += 1
|
||||||
|
|
||||||
|
else:
|
||||||
|
if (len(lastPage) > 0):
|
||||||
|
curPage = lastPage.pop() + 1
|
||||||
|
rootPage = rootPage.parrent
|
||||||
|
else:
|
||||||
|
done = True
|
||||||
|
print(f"done")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def index(fileName):
|
||||||
|
global pages
|
||||||
|
with open(SRC_DIR + '/index.yaml', 'r') as file:
|
||||||
|
index = yaml.safe_load(file)
|
||||||
|
|
||||||
|
if ('sitemap' not in index):
|
||||||
|
print("ERROR: /index.yaml is missing a sitemap")
|
||||||
|
else:
|
||||||
|
pages = []
|
||||||
|
for item in index["sitemap"]:
|
||||||
|
pages.append(Page(item, None))
|
||||||
|
|
||||||
|
for page in pages:
|
||||||
|
page.scan(SRC_DIR)
|
||||||
|
|
||||||
|
print("START INDEX")
|
||||||
|
for p in pages:
|
||||||
|
print(p)
|
||||||
|
print("END INDEX")
|
||||||
|
|
||||||
|
seperator = False
|
||||||
|
header = ""
|
||||||
|
for p in pages:
|
||||||
|
if (seperator):
|
||||||
|
header += "<span class='menuSeparator'>|</span>"
|
||||||
|
header += p.topMenuHTML()
|
||||||
|
seperator = True
|
||||||
|
|
||||||
|
os.makedirs(TARGET_DIR, exist_ok=True)
|
||||||
|
with open(TARGET_DIR + '/header.html', 'w') as file:
|
||||||
|
file.write(header);
|
||||||
|
|
||||||
|
with open('template.html') as file:
|
||||||
|
template = Template(file.read())
|
||||||
|
for p in pages:
|
||||||
|
render(p, template, header)
|
||||||
|
|
||||||
|
with open('style.scss', 'r') as file:
|
||||||
|
css = sass.compile(string=file.read())
|
||||||
|
with open(TARGET_DIR + '/style.css', 'w') as file:
|
||||||
|
file.write(css)
|
||||||
|
del css
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
index('index.yml')
|
||||||
268
index.yml
268
index.yml
@ -1,134 +1,168 @@
|
|||||||
---
|
---
|
||||||
- lable: Home
|
- lable: Home
|
||||||
url: /
|
url: /
|
||||||
# - lable: Niet vergeten
|
# - lable: Niet vergeten
|
||||||
# url: /niet-vergeten.html
|
# url: /niet-vergeten.html
|
||||||
- lable: HR
|
- lable: HR
|
||||||
sub:
|
sub:
|
||||||
|
- lable: ANE10
|
||||||
|
url: ANE10
|
||||||
|
sidebar:
|
||||||
|
- lable: Index
|
||||||
|
url: .
|
||||||
|
- lable: Dingen
|
||||||
|
url: dingen.html
|
||||||
|
- lable: lab 3
|
||||||
|
url: lab-3.html
|
||||||
|
- lable: lab 5
|
||||||
|
url: lab-5.html
|
||||||
|
- lable: ANE10-2
|
||||||
|
url: ANE10-2
|
||||||
|
sidebar:
|
||||||
|
- lable: Index
|
||||||
|
url: .
|
||||||
|
- lable: Bi Polar Junction Transistor
|
||||||
|
url: bjt.html
|
||||||
|
- lable: Field Effect Transistor
|
||||||
|
url: fet.html
|
||||||
|
|
||||||
|
- lable: DIS10
|
||||||
|
sidebar:
|
||||||
|
- lable: index
|
||||||
|
url: .
|
||||||
|
- lable: handigheidjes
|
||||||
|
url: handigheidjes.html
|
||||||
|
- lable: opgavens
|
||||||
|
url: opgaves.html
|
||||||
|
- lable: 3.1 theorie
|
||||||
|
url: week-3.1.html
|
||||||
|
- lable: 3.2 theorie
|
||||||
|
url: week-3.2.html
|
||||||
|
- lable: 3.3 theorie
|
||||||
|
url: week-3.3.html
|
||||||
|
- lable: 3.4 lab
|
||||||
|
url: week-3.4.html
|
||||||
|
- lable: 3.5 theorie
|
||||||
|
url: week-3.5.html
|
||||||
|
# - lable: 3.7 lab
|
||||||
|
# url: week-3.7.html
|
||||||
|
- lable: 4.1 lab
|
||||||
|
url: week-4.1.html
|
||||||
|
- lable: 4.3 lab
|
||||||
|
url: week-4.3.html
|
||||||
|
- lable: 4.4 theorie
|
||||||
|
url: week-4.4.html
|
||||||
|
- lable: 4.5 theorie
|
||||||
|
url: week-4.5.html
|
||||||
|
- lable: 4.7 lab
|
||||||
|
url: week-5.5.html
|
||||||
|
- lable: EPS20
|
||||||
|
sidebar:
|
||||||
|
- lable: index
|
||||||
|
url: .
|
||||||
|
- lable: week 1
|
||||||
|
url: week-1.html
|
||||||
|
- lable: lab 1
|
||||||
|
url: lab-1.html
|
||||||
|
- lable: week 2
|
||||||
|
url: week-2.html
|
||||||
|
|
||||||
- lable: Argief (beta)
|
- lable: Argief (beta)
|
||||||
url: argief
|
url: argief
|
||||||
sidebar:
|
sidebar:
|
||||||
# year 1
|
# year 1
|
||||||
|
|
||||||
- WIS10 #empty
|
- lable: WIS10 #empty
|
||||||
- ELE10 #empty
|
clickable: False
|
||||||
- PEE10 #empty
|
- lable: ELE10 #empty
|
||||||
- lable: ELE20
|
clickable: False
|
||||||
sub:
|
- lable: PEE10 #empty
|
||||||
- opamp
|
clickable: False
|
||||||
|
- lable: ELE20
|
||||||
|
sub:
|
||||||
|
- opamp
|
||||||
|
|
||||||
#- WIS20
|
|
||||||
- EMS10 #empty
|
|
||||||
- PEE20 #empty
|
|
||||||
- lable: EPS10
|
|
||||||
sub:
|
|
||||||
- buckboost
|
|
||||||
- electiesh-en-machnetich-veld
|
|
||||||
- lab-1
|
|
||||||
- lab-2
|
|
||||||
- lab-3
|
|
||||||
- lab-4
|
|
||||||
- lab-5
|
|
||||||
- lab-6
|
|
||||||
|
|
||||||
# year 2
|
- lable: WIS20
|
||||||
|
sidebar:
|
||||||
|
- lable: formuleblad
|
||||||
|
url: formuleblad.html
|
||||||
|
- lable: diffrencieren
|
||||||
|
url: diffrencieeren.html
|
||||||
|
- lable: supsitutsie
|
||||||
|
url: supsitutsie.html
|
||||||
|
- lable: breuksplitsen
|
||||||
|
url: breuksplitsen.html
|
||||||
|
- lable: parsiele int.
|
||||||
|
url: parsiel.html
|
||||||
|
- lable: fourier transform
|
||||||
|
url: fourier-transformatie.html
|
||||||
|
- lable: divrenciaal vergeleiking
|
||||||
|
url: difrenciaal-vergeleiking.html
|
||||||
|
- lable: 2de Orde DV
|
||||||
|
url: 2de-orde-dv.html
|
||||||
|
- EMS10 #empty
|
||||||
|
- PEE20 #empty
|
||||||
|
- lable: EPS10
|
||||||
|
sub:
|
||||||
|
- buckboost
|
||||||
|
- electiesh-en-machnetich-veld
|
||||||
|
- lab-1
|
||||||
|
- lab-2
|
||||||
|
- lab-3
|
||||||
|
- lab-4
|
||||||
|
- lab-5
|
||||||
|
- lab-6
|
||||||
|
|
||||||
#- REG10
|
# year 2
|
||||||
- EMS20 #empyt
|
|
||||||
- PEE30 #empty
|
|
||||||
#- ANE10
|
|
||||||
|
|
||||||
#- DIS10
|
- lable: REG10
|
||||||
#- EPS20
|
url: REG10-2
|
||||||
- PEE40 #empty
|
sidebar:
|
||||||
#- TEL10
|
- lable: Index
|
||||||
|
url: .
|
||||||
|
- lable: Laplace
|
||||||
|
url: laplace.html
|
||||||
|
- lable: Voorbeelden
|
||||||
|
url: voorbeelden.html
|
||||||
|
- lable: Eigenschappen
|
||||||
|
url: eigenschappen.html
|
||||||
|
- lable: P-Regelaar
|
||||||
|
url: pregelaar.html
|
||||||
|
- lable: polen en nulpunten
|
||||||
|
url: polen-en-nulpunten.html
|
||||||
|
- lable: Formuleblad
|
||||||
|
url: formuleblad.html
|
||||||
|
- lable: Lab 1
|
||||||
|
url: lab1.html
|
||||||
|
- lable: Lab 2
|
||||||
|
url: lab2.html
|
||||||
|
- lable: Lab 3
|
||||||
|
url: lab3.html
|
||||||
|
- EMS20 #empyt
|
||||||
|
- PEE30 #empty
|
||||||
|
#- ANE10
|
||||||
|
|
||||||
- lable: Fablab making
|
#- DIS10
|
||||||
url: fablab-making.html
|
#- EPS20
|
||||||
- lable: WIS20
|
- PEE40 #empty
|
||||||
sidebar:
|
- lable: TEL10
|
||||||
- lable: Diffrencieren
|
sidebar:
|
||||||
url: diffrencieeren.html
|
- lable: index
|
||||||
- lable: Supsitutsie
|
url: .
|
||||||
url: supsitutsie.html
|
# - lable: week 4.1
|
||||||
- lable: Breuksplitsen
|
# url: week-1.html
|
||||||
url: breuksplitsen.html
|
- lable: 4.2 theorie
|
||||||
- lable: Parsiele int.
|
url: week-2.html
|
||||||
url: parsiel.html
|
- lable: 4.3 lab
|
||||||
- lable: Fourier transform
|
url: week-3.html
|
||||||
url: fourier-transformatie.html
|
- lable: 4.5 theorie
|
||||||
- lable: Divrenciaal vergeleiking
|
url: week-5.html
|
||||||
url: difrenciaal-vergeleiking.html
|
|
||||||
- lable: 2de Orde DV
|
|
||||||
url: 2de-orde-dv.html
|
|
||||||
- lable: WIS20-2
|
|
||||||
sidebar:
|
|
||||||
- lable: index
|
|
||||||
url: .
|
|
||||||
- lable: formuleblad
|
|
||||||
url: formuleblad.html
|
|
||||||
|
|
||||||
- lable: REG10
|
- lable: Fablab making
|
||||||
url: REG10-2
|
url: fablab-making.html
|
||||||
sidebar:
|
- lable: Toki Pona
|
||||||
- lable: Index
|
url: tokipona
|
||||||
url: .
|
|
||||||
- lable: Laplace
|
|
||||||
url: laplace.html
|
|
||||||
- lable: Voorbeelden
|
|
||||||
url: voorbeelden.html
|
|
||||||
- lable: Eigenschappen
|
|
||||||
url: eigenschappen.html
|
|
||||||
- lable: P-Regelaar
|
|
||||||
url: pregelaar.html
|
|
||||||
- lable: polen en nulpunten
|
|
||||||
url: polen-en-nulpunten.html
|
|
||||||
- lable: Formuleblad
|
|
||||||
url: formuleblad.html
|
|
||||||
- lable: Lab 1
|
|
||||||
url: lab1.html
|
|
||||||
- lable: Lab 2
|
|
||||||
url: lab2.html
|
|
||||||
- lable: Lab 3
|
|
||||||
url: lab3.html
|
|
||||||
- lable: ANE10
|
|
||||||
url: ANE10-2
|
|
||||||
sidebar:
|
|
||||||
- lable: Index
|
|
||||||
url: .
|
|
||||||
- lable: Bi Polar Junction Transistor
|
|
||||||
url: bjt.html
|
|
||||||
- lable: Field Effect Transistor
|
|
||||||
url: fet.html
|
|
||||||
|
|
||||||
- lable: DIS10
|
|
||||||
sidebar:
|
|
||||||
- lable: index
|
|
||||||
url: .
|
|
||||||
- lable: handigheidjes
|
|
||||||
url: handigheidjes.html
|
|
||||||
- lable: opgavens
|
|
||||||
url: opgaves.html
|
|
||||||
- lable: week 1
|
|
||||||
url: week-1.html
|
|
||||||
- lable: week 2
|
|
||||||
url: week-2.html
|
|
||||||
- lable: week 3
|
|
||||||
url: week-3.html
|
|
||||||
- lable: week 4
|
|
||||||
url: week-4.html
|
|
||||||
- lable: week 5
|
|
||||||
url: week-5.html
|
|
||||||
- lable: EPS20
|
|
||||||
sidebar:
|
|
||||||
- lable: index
|
|
||||||
url: .
|
|
||||||
- lable: week 1
|
|
||||||
url: week-1.html
|
|
||||||
- lable: lab 1
|
|
||||||
url: lab-1.html
|
|
||||||
- lable: Toki Pona
|
|
||||||
url: tokipona
|
|
||||||
|
|
||||||
# - lable: Projecten
|
# - lable: Projecten
|
||||||
# klickable: False
|
# klickable: False
|
||||||
|
|||||||
211
page.py
Normal file
211
page.py
Normal file
@ -0,0 +1,211 @@
|
|||||||
|
import os
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
from renderMD import renderMD
|
||||||
|
|
||||||
|
class Page:
|
||||||
|
lable = ''
|
||||||
|
url = ''
|
||||||
|
clickable = True
|
||||||
|
|
||||||
|
subPages = []
|
||||||
|
sidebar = []
|
||||||
|
parrent = None
|
||||||
|
assets = None
|
||||||
|
|
||||||
|
def __init__(self, item, parrent):
|
||||||
|
self.subPages = []
|
||||||
|
self.sidebar = []
|
||||||
|
self.parrent = parrent
|
||||||
|
|
||||||
|
if (parrent is None):
|
||||||
|
root = ''
|
||||||
|
else:
|
||||||
|
root = parrent.url
|
||||||
|
|
||||||
|
if (type(item) is str):
|
||||||
|
self.lable = item
|
||||||
|
self.url = os.path.abspath(root + '/' + item)
|
||||||
|
self.clickable = True
|
||||||
|
|
||||||
|
elif (type(item) is dict):
|
||||||
|
if('url' not in item):
|
||||||
|
if(('klickable' in item) and (item['klickable'] is False)):
|
||||||
|
self.url = root # still set the url for sub pages
|
||||||
|
else:
|
||||||
|
self.url = root + '/' + item['lable']
|
||||||
|
else:
|
||||||
|
self.url = item['url']
|
||||||
|
|
||||||
|
if(self.url == ''):
|
||||||
|
self.url = '/'
|
||||||
|
|
||||||
|
if(self.url[0] != '/'):
|
||||||
|
self.url = root + '/' + self.url
|
||||||
|
|
||||||
|
self.url = os.path.abspath(self.url)
|
||||||
|
|
||||||
|
if('lable' not in item):
|
||||||
|
self.lable = item['url'].split('/')[-1]
|
||||||
|
else:
|
||||||
|
self.lable = item['lable']
|
||||||
|
self.lable = self.lable.replace('<', '<')
|
||||||
|
self.lable = self.lable.replace('>', '>')
|
||||||
|
|
||||||
|
if ('sub' in item):
|
||||||
|
for subItem in item['sub']:
|
||||||
|
self.subPages.append(Page(subItem, self))
|
||||||
|
|
||||||
|
if ('sidebar' in item):
|
||||||
|
for subItem in item['sidebar']:
|
||||||
|
self.sidebar.append(Page(subItem, self))
|
||||||
|
else:
|
||||||
|
self.sidebar = []
|
||||||
|
|
||||||
|
if ('klickable' in item):
|
||||||
|
self.clickable = item["klickable"]
|
||||||
|
|
||||||
|
else:
|
||||||
|
print('ERROR: Page.__init__(): invalid index itemtype ' + type(item))
|
||||||
|
|
||||||
|
def scan(self, srcDir):
|
||||||
|
if ((self.parrent is None) or (self.url != self.parrent.url)):
|
||||||
|
indexFile = os.path.abspath(srcDir + self.url + '/index.yaml')
|
||||||
|
print(f"INFO: Page.scan(): indexFile: {indexFile}")
|
||||||
|
|
||||||
|
index = None
|
||||||
|
if (os.path.isfile(indexFile)):
|
||||||
|
with open(indexFile, 'r') as file:
|
||||||
|
index = yaml.safe_load(file)
|
||||||
|
|
||||||
|
if (index is not None):
|
||||||
|
if ('subPages' in index):
|
||||||
|
print(f"INFO: Page.scan(): subpages found for {self.url}")
|
||||||
|
for item in index["subPages"]:
|
||||||
|
page = Page(item, self)
|
||||||
|
self.subPages.append(page)
|
||||||
|
page.scan(srcDir)
|
||||||
|
|
||||||
|
if ('sidebar' in index):
|
||||||
|
print(f"INFO: Page.scan(): sidemenu found for {self.url}")
|
||||||
|
for item in index["sidebar"]:
|
||||||
|
page = Page(item, self)
|
||||||
|
self.sidebar.append(page)
|
||||||
|
page.scan(srcDir)
|
||||||
|
|
||||||
|
if ('assets' in index):
|
||||||
|
print(f"INFO: Page.scan(): assets found for {self.url}")
|
||||||
|
self.assets = index["assets"]
|
||||||
|
i = 0
|
||||||
|
while (i < len(self.assets)):
|
||||||
|
if(self.assets[i][0] != '/'):
|
||||||
|
self.assets[i] = self.url + '/' + self.assets[i]
|
||||||
|
self.assets[i] = os.path.abspath(self.assets[i])
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def getSidebar(self):
|
||||||
|
if ((len(self.sidebar) == 0) and (self.parrent is not None)):
|
||||||
|
return self.parrent.getSidebar()
|
||||||
|
else:
|
||||||
|
return self.sidebar
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.toString(0)
|
||||||
|
def toString(self, indents):
|
||||||
|
indent = " "*indents
|
||||||
|
str = f"{indent} - lable: {self.lable}\n"
|
||||||
|
str += f"{indent} url: {self.url}\n"
|
||||||
|
if (self.clickable):
|
||||||
|
str += f"{indent} clickable: True\n"
|
||||||
|
else:
|
||||||
|
str += f"{indent} clickable: False\n"
|
||||||
|
if (self.assets is not None):
|
||||||
|
str += f"{indent} assets: {len(self.assets)}\n"
|
||||||
|
for asset in self.assets:
|
||||||
|
str += f"{indent} - {asset}\n"
|
||||||
|
if (len(self.subPages) > 0):
|
||||||
|
str += f"{indent} sub: {len(self.subPages)}\n"
|
||||||
|
for page in self.subPages:
|
||||||
|
str += page.toString(indents + 1)
|
||||||
|
if (len(self.sidebar) > 0):
|
||||||
|
str += f"{indent} sidebar:\n"
|
||||||
|
for page in self.sidebar:
|
||||||
|
str += page.toString(indents + 1)
|
||||||
|
return str
|
||||||
|
|
||||||
|
def topMenuHTML(self):
|
||||||
|
if (len(self.subPages) == 0):
|
||||||
|
propertys = ''
|
||||||
|
if (self.clickable):
|
||||||
|
html = f"<span class='menuLable'><a href='{self.url}'>{self.lable}</a></span>"
|
||||||
|
else:
|
||||||
|
html = f"<span class='menuLable'>{self.lable}</span>"
|
||||||
|
else:
|
||||||
|
subicon = " <svg class='menuDropIcon' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'><path d='M1,3.7L5,8L9,3.7' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' fill='none' stroke='#eee'></path></svg>"
|
||||||
|
propertys = " data-hassub='true'"
|
||||||
|
propertys += " class=\"sub\""
|
||||||
|
if (self.clickable):
|
||||||
|
html = f"<span class='menuLable'><a href='{self.url}'>{self.lable}</a>{subicon}</span><ul>"
|
||||||
|
else:
|
||||||
|
html = f"<span class='menuLable'>{self.lable}{subicon}</span><ul>"
|
||||||
|
for page in self.subPages:
|
||||||
|
html += page.topMenuHTML()
|
||||||
|
html += "</ul>"
|
||||||
|
|
||||||
|
return f"<li{propertys}>{html}</li>"
|
||||||
|
|
||||||
|
def sidebarHTML(self):
|
||||||
|
if (len(self.subPages) == 0):
|
||||||
|
propertys = ""
|
||||||
|
if (self.clickable):
|
||||||
|
html = f"<span class='menuLable'><a href='{self.url}'>{self.lable}</a></span>"
|
||||||
|
else:
|
||||||
|
html = f"<span class='menuLable'>{self.lable}</span>"
|
||||||
|
else:
|
||||||
|
propertys = " data-hassub='true'"
|
||||||
|
propertys += " class=\"sub\""
|
||||||
|
if (self.clickable):
|
||||||
|
html = f"<span class='menuLable'><a href='{self.url}'>{self.lable}</a></span><ul>"
|
||||||
|
else:
|
||||||
|
html = f"<span class='menuLable'>{self.lable}</span><ul>"
|
||||||
|
for page in self.subPages:
|
||||||
|
html += page.sidebarHTML()
|
||||||
|
html += "</ul>"
|
||||||
|
|
||||||
|
return f"<li{propertys}>{html}</li>"
|
||||||
|
|
||||||
|
def renderPage(self, template, header, srcDir):
|
||||||
|
html = ""
|
||||||
|
|
||||||
|
if (os.path.isdir(srcDir + self.url)):
|
||||||
|
if(self.url[-1] == '/'):
|
||||||
|
srcFile = self.url + 'index.md'
|
||||||
|
else:
|
||||||
|
srcFile = self.url + '/index.md'
|
||||||
|
elif (len(self.url.split('.')) > 1 and len(self.url.split('.')[-1]) < 5):
|
||||||
|
srcFile = '.'.join(self.url.split('.')[0:-1]) + '.md'
|
||||||
|
else:
|
||||||
|
srcFile = self.url + '.md'
|
||||||
|
|
||||||
|
if(not os.path.isfile(srcDir + srcFile)):
|
||||||
|
print(f"ERROR: faild to find srouce file for page {self.lable} ({self.url})")
|
||||||
|
else:
|
||||||
|
print('md: ' + srcFile)
|
||||||
|
|
||||||
|
if(len(self.getSidebar()) != 0):
|
||||||
|
sidebar = '<aside><nav><ul id="sidemenu">'
|
||||||
|
for item in self.getSidebar():
|
||||||
|
sidebar += item.sidebarHTML()
|
||||||
|
sidebar += '</ul></nav></aside>'
|
||||||
|
else:
|
||||||
|
sidebar = ""
|
||||||
|
|
||||||
|
html = template.render(
|
||||||
|
header = header,
|
||||||
|
sidebar = sidebar,
|
||||||
|
body = renderMD(srcDir + srcFile)
|
||||||
|
)
|
||||||
|
|
||||||
|
return html
|
||||||
@ -10,8 +10,8 @@ from renderSCSS import renderSCSS
|
|||||||
with open('template.html', 'r') as file:
|
with open('template.html', 'r') as file:
|
||||||
template = Template(file.read())
|
template = Template(file.read())
|
||||||
|
|
||||||
srcDir = '../notes'
|
srcDir = '/source'
|
||||||
destDir = '../public'
|
destDir = '/target'
|
||||||
|
|
||||||
firstItem = True
|
firstItem = True
|
||||||
|
|
||||||
|
|||||||
@ -7,6 +7,8 @@ def renderLatex(code):
|
|||||||
code = code.strip()
|
code = code.strip()
|
||||||
code = code.replace("=>", "\\Rightarrow")
|
code = code.replace("=>", "\\Rightarrow")
|
||||||
code = code.replace("->", "\\rightarrow")
|
code = code.replace("->", "\\rightarrow")
|
||||||
|
code = code.replace("\\(", "\\left(")
|
||||||
|
code = code.replace("\\)", "\\right)")
|
||||||
code = code.replace("*", "\\cdot")
|
code = code.replace("*", "\\cdot")
|
||||||
|
|
||||||
a = re.search(r"{[^{}]*} */ *{[^{}]*}", code)
|
a = re.search(r"{[^{}]*} */ *{[^{}]*}", code)
|
||||||
|
|||||||
5
requirements.txt
Normal file
5
requirements.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
pyyaml
|
||||||
|
jinja2
|
||||||
|
misaka
|
||||||
|
latex2mathml
|
||||||
|
libsass
|
||||||
215
style.scss
Normal file
215
style.scss
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
@import url('https://fonts.googleapis.com/css2?family=Roboto&family=Ubuntu&display=swap');
|
||||||
|
|
||||||
|
$main-color: #222;
|
||||||
|
$second-color: #333;
|
||||||
|
$oposit-color: #eee;
|
||||||
|
$accent-color: #7d7;
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
overflow-x: hidden;
|
||||||
|
|
||||||
|
background-color: $main-color;
|
||||||
|
color: $oposit-color;
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
text-align: right;
|
||||||
|
height: 50px;
|
||||||
|
|
||||||
|
background: linear-gradient(180deg, $main-color 0%, $main-color 80%, rgba(0,0,0,0) 100%);
|
||||||
|
|
||||||
|
#headerLogo{
|
||||||
|
padding-left: 50px;
|
||||||
|
height: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
list-style: none;
|
||||||
|
padding: 0 50px 0 0;
|
||||||
|
margin: 0;
|
||||||
|
display: inline-block;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
font-family: 'Ubuntu', sans-serif;
|
||||||
|
font-size: 18px;
|
||||||
|
|
||||||
|
.menuSeparator,
|
||||||
|
.menuLable{
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
li.sub .menuLable{
|
||||||
|
padding: 15px 5px;
|
||||||
|
|
||||||
|
a {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
li.open {
|
||||||
|
.menuLable {
|
||||||
|
background-color: $second-color;
|
||||||
|
}
|
||||||
|
ul {
|
||||||
|
display: block;
|
||||||
|
ul {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ul{
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
text-align: center;
|
||||||
|
padding: 0;
|
||||||
|
// margin-left: 10px;
|
||||||
|
background-color: $second-color;
|
||||||
|
border-bottom-right-radius: 5px;
|
||||||
|
border-bottom-left-radius: 5px;
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.menuDropIcon{
|
||||||
|
width: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
padding: 15px 5px;
|
||||||
|
color: $accent-color;
|
||||||
|
text-decoration: none;
|
||||||
|
|
||||||
|
&:hover{
|
||||||
|
color: $accent-color;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
li a{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
aside{
|
||||||
|
height: 100vh;
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
|
||||||
|
overflow-y: auto;
|
||||||
|
|
||||||
|
ul{
|
||||||
|
list-style: none;
|
||||||
|
padding: 50px 0 0 0;
|
||||||
|
margin: 0;
|
||||||
|
display: block;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
font-family: 'Ubuntu', sans-serif;
|
||||||
|
font-size: 18px;
|
||||||
|
|
||||||
|
.menuLable {
|
||||||
|
height: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
padding: 0 0 0 25px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
width: 150px;
|
||||||
|
display: block;
|
||||||
|
padding: 15px 5px;
|
||||||
|
color: $accent-color;
|
||||||
|
text-decoration: none;
|
||||||
|
|
||||||
|
&:hover{
|
||||||
|
color: $accent-color;
|
||||||
|
background-color: $second-color;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main {
|
||||||
|
padding: 0 calc(50vw - 250px) 50px;
|
||||||
|
max-width: 500px;
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: $accent-color;
|
||||||
|
text-decoration: none;
|
||||||
|
|
||||||
|
&:hover{
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
a.btn {
|
||||||
|
padding: 5px;
|
||||||
|
border: 1px $accent-color solid;
|
||||||
|
border-radius: 5px;
|
||||||
|
|
||||||
|
&:hover{
|
||||||
|
color: $main-color;
|
||||||
|
background-color: $accent-color;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
img, video {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#bigPicture {
|
||||||
|
display: none;
|
||||||
|
position: fixed;
|
||||||
|
top: 50vh;
|
||||||
|
width: 100vw;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
&.show{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
&.tall{
|
||||||
|
width: auto;
|
||||||
|
height: 100vh;
|
||||||
|
left: 50vw;
|
||||||
|
transform: translateY(-50%) translateX(-50%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 850px){
|
||||||
|
main {
|
||||||
|
padding-left: 175px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 555px){
|
||||||
|
main {
|
||||||
|
width: auto;
|
||||||
|
padding: 0 28px 50px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6{
|
||||||
|
font-family: 'Ubuntu', sans-serif;
|
||||||
|
}
|
||||||
|
h1 { padding-top: 50px; font-size: 40px; }
|
||||||
|
h2 { padding-top: 40px; font-size: 30px; }
|
||||||
|
h3 { padding-top: 10px; font-size: 20px; }
|
||||||
@ -4,15 +4,21 @@
|
|||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<link rel="stylesheet" href="/styles/main.css">
|
<link rel="stylesheet" href="/style.css">
|
||||||
<title>Notes</title>
|
<title>Kladjes</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
{{ header }}
|
<header>
|
||||||
{{ sidebar }}
|
<nav>
|
||||||
<main>
|
<ul class="menu">
|
||||||
{{ body }}
|
{{ header }}
|
||||||
</main>
|
</ul>
|
||||||
<script src="/scripts/app.js"></script>
|
</nav>
|
||||||
|
</header>
|
||||||
|
{{ sidebar }}
|
||||||
|
<main>
|
||||||
|
{{ body }}
|
||||||
|
</main>
|
||||||
|
<script src="/scripts/app.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user