webTemplate/page.py
2023-02-06 09:50:20 +01:00

212 lines
7.4 KiB
Python

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('<', '&lt;')
self.lable = self.lable.replace('>', '&gt;')
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