import os from html5tagger import Document, E, HTML from shutil import rmtree import markdown import html from pathlib import Path def generateNavigationBar(lines): global navbar navbar = E rawhtml = False htmlstring = "" for id, line in enumerate(lines): #parse raw HTML rawhtml, navbar, htmlstring = parseRawHTML(navbar, line, htmlstring, rawhtml, id, len(lines)) #parse markdown if not rawhtml: navbar = navbar.li(HTML(parseMarkdown(navbar, line))) def parseRawHTML(doc, line, htmlstring, rawhtml, id, maxlines): #raw html start if line.strip() == ">": rawhtml = True htmlstring = "" #parse indented raw html elif rawhtml: if line.startswith(" "): #experimental markdown inside HTML support htmlstring = htmlstring + html.unescape(markdown.markdown(html.escape(line.strip()))) #if indented html was the last line, this is needed for it to not be ignored #since this is the end of the file, we will not set rawhtml to False. if maxlines - id == 1: doc.div(HTML(htmlstring)) else: rawhtml = False doc.div(HTML(htmlstring)) htmlstring = "" return rawhtml, doc, htmlstring def parseMarkdown(doc, line): #do not allow HTML in markdown line = html.escape(line.strip()) return markdown.markdown(line) def generateLines(title, lines): title = title.replace(".page", "") doc = Document(title, lang="en") rawhtml = False htmlstring = "" for id, line in enumerate(lines): #parse raw HTML rawhtml, doc, htmlstring = parseRawHTML(doc, line, htmlstring, rawhtml, id, len(lines)) #parse markdown if not rawhtml: doc = doc(HTML(parseMarkdown(doc, line))) generatePage(title, doc) def generatePage(title, doc): global pages global titles global pagescount if 'pages' not in globals(): pages = [] if 'titles' not in globals(): titles = [] if 'navbar' in globals(): pages.append(str(E.ul(navbar)) + str(doc)) titles.append(title) else: pages.append(str(doc)) titles.append(title) def writePages(homepage): global pages global titles try: os.mkdir("./website-output") except FileExistsError: pass print("Output directory already exists, let's clean it!") #TODO only delete files that aren't present in newest site generation #deleting contents of folder without deleting the folder, to increase compatibility with various systems #for root, dirs, files in os.walk('./website-output'): # for f in files: # os.unlink(os.path.join(root, f)) # for d in dirs: # rmtree(os.path.join(root, d)) for id, page in enumerate(pages): foldername = "" #creates ./website-output/pagetitle/index.html file if it is not homepage if titles[id] != homepage: foldername = "/" + titles[id].replace(" ", "-").lower() #doing this here, because homepage directory is already created above try: os.mkdir("./website-output" + foldername) except FileExistsError: pass changed = False filepath = Path("./website-output" + foldername + "/index.html") if filepath.exists(): with open("./website-output" + foldername + "/index.html", 'r') as newpage: if newpage.read() != page: changed = True else: changed = True if changed: with open("./website-output" + foldername + "/index.html", 'w') as newpage: newpage.write(page) print("Written changed page: " + titles[id]) else: print("Page not changed: " + titles[id]) def main(): #if homepage is at Home.page, set homepage to "Home" homepage = "Home" if os.path.exists("./navbar"): with open("./navbar", 'r') as navbarfile: generateNavigationBar(navbarfile.readlines()) else: print("No 'navbar' file found, there will be no navigation bar.") #count total amount of pages first pagescount = 0 for file in os.listdir("./"): if file.endswith(".page"): pagescount += 1 with open(file, 'r') as page: generateLines(os.path.basename(file), page.readlines()) print("Found " + str(pagescount) + " pages") writePages(homepage) if __name__ == "__main__": main()