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"" else: html = f"" else: subicon = " " propertys = " data-hassub='true'" propertys += " class=\"sub\"" if (self.clickable): html = f"