From 02049b6d33609fb034d38d6761657c148c6fca06 Mon Sep 17 00:00:00 2001 From: LailaTheElf Date: Mon, 21 Jul 2025 19:42:32 +0200 Subject: [PATCH] move new versino from volta website --- .gitignore | 4 +- Cargo.lock | 264 ++++++++++++++++++++++++++++++ Cargo.toml | 11 ++ Dockerfile | 10 -- header.py | 31 ---- index.py | 139 ---------------- index.yml | 181 --------------------- page.py | 211 ------------------------ render.py | 179 --------------------- render.sh | 10 -- renderMD.py | 43 ----- renderSCSS.py | 13 -- requirements.txt | 5 - sidemenu.py | 50 ------ src/main.rs | 64 ++++++++ src/render.rs | 118 ++++++++++++++ src/render/index.rs | 354 +++++++++++++++++++++++++++++++++++++++++ src/render/parse_md.rs | 223 ++++++++++++++++++++++++++ style.scss | 215 ------------------------- template.html | 24 --- 20 files changed, 1036 insertions(+), 1113 deletions(-) create mode 100644 Cargo.lock create mode 100644 Cargo.toml delete mode 100644 Dockerfile delete mode 100644 header.py delete mode 100644 index.py delete mode 100644 index.yml delete mode 100644 page.py delete mode 100644 render.py delete mode 100644 render.sh delete mode 100644 renderMD.py delete mode 100644 renderSCSS.py delete mode 100644 requirements.txt delete mode 100644 sidemenu.py create mode 100644 src/main.rs create mode 100644 src/render.rs create mode 100644 src/render/index.rs create mode 100644 src/render/parse_md.rs delete mode 100644 style.scss delete mode 100644 template.html 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}