diff --git a/.gitignore b/.gitignore index 70f0913..9e3641e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -/__pycache__ -/public +/target +/html \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..6831faf --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,264 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "arraydeque" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" + +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + +[[package]] +name = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "getopts" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cba6ae63eb948698e300f645f87c70f76630d505f23b8907cf1e193ee85048c1" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "hashbrown" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "memo-map" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d1115007560874e373613744c6fba374c17688327a71c1476d1a5954cc857b" + +[[package]] +name = "minijinja" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e60ac08614cc09062820e51d5d94c2fce16b94ea4e5003bb81b99a95f84e876" +dependencies = [ + "memo-map", + "self_cell", + "serde", + "serde_json", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pulldown-cmark" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e8bbe1a966bd2f362681a44f6edce3c2310ac21e4d5067a6e7ec396297a6ea0" +dependencies = [ + "bitflags", + "getopts", + "memchr", + "pulldown-cmark-escape", + "serde", + "unicase", +] + +[[package]] +name = "pulldown-cmark-escape" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae" + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "self_cell" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.141" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "syn" +version = "2.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-width" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" + +[[package]] +name = "webTemplate" +version = "0.2.0" +dependencies = [ + "hashlink", + "minijinja", + "pulldown-cmark", + "regex", + "yaml-rust2", +] + +[[package]] +name = "yaml-rust2" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ce2a4ff45552406d02501cea6c18d8a7e50228e7736a872951fe2fe75c91be7" +dependencies = [ + "arraydeque", + "encoding_rs", + "hashlink", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..4d2b46f --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "webTemplate" +version = "0.2.0" +edition = "2024" + +[dependencies] +hashlink = "0.10.0" +minijinja = { version = "2.10.2", features = ["loader", "builtins", "json"] } +pulldown-cmark = { version = "0.13.0", features = ["serde"] } +regex = "1.11.1" +yaml-rust2 = "0.10.2" diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 9595555..0000000 --- a/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM python:3 - -WORKDIR /app - -COPY requirements.txt ./ -RUN pip install --no-cache-dir -r requirements.txt - -copy . . - -CMD [ "python", "./render.py" ] diff --git a/header.py b/header.py deleted file mode 100644 index a921a9f..0000000 --- a/header.py +++ /dev/null @@ -1,31 +0,0 @@ -import yaml - -from render import listPages - -firstItem = True - -def headerGen(item, root): - global firstItem - if(root and not firstItem): - separator = '|' - else: - separator = '' - firstItem = False - - if(not ('klickable' in item and item['klickable'] is False)): - item['lable'] = '' + item["lable"] + '' - - if('sub' not in item): - return '
  • ' + separator + '' + item["lable"] + '
  • ' - - data = '' - subicon = '' - if(root): - subicon = ' ' - data += ' data-hassub="true"' - - html = '' + separator + '' + item["lable"] + subicon + '' - diff --git a/index.py b/index.py deleted file mode 100644 index 1ed05f0..0000000 --- a/index.py +++ /dev/null @@ -1,139 +0,0 @@ -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 += "|" - 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') diff --git a/index.yml b/index.yml deleted file mode 100644 index 131f057..0000000 --- a/index.yml +++ /dev/null @@ -1,181 +0,0 @@ ---- - - lable: Home - url: / -# - lable: Niet vergeten -# url: /niet-vergeten.html - - lable: HR - 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) - url: argief - sidebar: - # year 1 - - - lable: WIS10 #empty - clickable: False - - lable: ELE10 #empty - clickable: False - - lable: PEE10 #empty - clickable: False - - lable: ELE20 - sub: - - opamp - - - - 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 - - # year 2 - - - lable: REG10 - url: REG10-2 - sidebar: - - 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 - - #- DIS10 - #- EPS20 - - PEE40 #empty - - lable: TEL10 - sidebar: - - lable: index - url: . - # - lable: week 4.1 - # url: week-1.html - - lable: 4.2 theorie - url: week-2.html - - lable: 4.3 lab - url: week-3.html - - lable: 4.5 theorie - url: week-5.html - - - lable: Fablab making - url: fablab-making.html - - lable: Toki Pona - url: tokipona - -# - lable: Projecten -# klickable: False -# url: projecten -# sub: -# - lable: MR Function Board -# url: mr-fn-board -# sidebar: -# - lable: blog -# url: blog.html -# - lable: Button layout -# url: button-layout.html -# - lable: PCB -# url: pcb.html -# - lable: Puzzel Game -# url: puzzel-game diff --git a/page.py b/page.py deleted file mode 100644 index 9c79a01..0000000 --- a/page.py +++ /dev/null @@ -1,211 +0,0 @@ -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"{self.lable}" - else: - html = f"{self.lable}" - else: - subicon = " " - propertys = " data-hassub='true'" - propertys += " class=\"sub\"" - if (self.clickable): - html = f"{self.lable}{subicon}