212 lines
7.4 KiB
Python
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('<', '<')
|
|
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
|