From e62e83717b34f3a4b00b38f662f8cd687e661154 Mon Sep 17 00:00:00 2001 From: Octo Andri <6083316-octospacc@users.noreply.gitlab.com> Date: Mon, 23 May 2022 20:36:50 +0000 Subject: [PATCH] Add support for website tree in left bar --- README.md | 14 +++++------ Source/Build.py | 67 +++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 66 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index f56541c..68cc583 100644 --- a/README.md +++ b/README.md @@ -15,13 +15,13 @@ Feel free to experiment with all of this stuff! - [pug-cli >= 1.0.0-alpha6](https://npmjs.com/package/pug-cli) ## Features roadmap -- [] SCSS compilation support for CSS templates -- [] Pug support for base templates and page side parts -- [] Differential recompile (to optimize resource waste on non-ephemeral servers) -- [] Hot-recompile (for website development) -- [] XML sitemap generation -- [] RSS feed generation -- [] Generation of website page tree in left sidebar +- [ ] SCSS compilation support for CSS templates +- [ ] Pug support for base templates and page side parts +- [ ] Differential recompile (to optimize resource waste on non-ephemeral servers) +- [ ] Hot-recompile (for website development) +- [ ] XML sitemap generation +- [ ] RSS feed generation +- [x] Generation of website page tree in left sidebar - [x] Generation of titles in right sidebar with clickable links - [x] Detections of titles in a page - [x] Pug support for pages diff --git a/Source/Build.py b/Source/Build.py index 8cd9462..a8bf578 100755 --- a/Source/Build.py +++ b/Source/Build.py @@ -73,7 +73,8 @@ def PreProcessor(p): Content, Titles, Meta = '', [], { 'Template': 'Standard.html', 'Style': '', - 'Index': 'True'} + 'Index': 'True', + 'Title': ''} for l in File.splitlines(): ls = l.lstrip() if p.endswith('.pug'): @@ -86,6 +87,8 @@ def PreProcessor(p): Meta['Style'] += ls[len('// Style: '):] + ' ' elif ls.startswith('// Index: '): Meta['Index'] += ls[len('// Index: '):] + ' ' + elif ls.startswith('// Title: '): + Meta['Title'] += ls[len('// Title: '):] + ' ' elif ls.startswith(('h1', 'h2', 'h3', 'h4', 'h5', 'h6')): if ls[2:].startswith(("(class='NoTitle", '(class="NoTitle')): Content += l + '\n' @@ -110,6 +113,10 @@ def PreProcessor(p): Meta['Style'] += "#MainBox{Background:" + ls[len('% Background: '):] + ";} " elif ls.startswith('% Style: '): Meta['Style'] += ls[len('% Style: '):] + ' ' + elif ls.startswith('% Index: '): + Meta['Index'] += ls[len('% Index: '):] + ' ' + elif ls.startswith('% Title: '): + Meta['Title'] += ls[len('% Title: '):] + ' ' else: Content += l + '\n' Heading = ls.split(' ')[0].count('#') @@ -126,12 +133,12 @@ def PugCompileList(Pages): # Pug-cli seems to shit itself with folder paths as input, so we pass ALL the files as arguments os.system('pug {} > /dev/null'.format(Paths)) -def PatchHTML(Template, Parts, Content, Titles, Meta): +def PatchHTML(Template, Parts, HTMLPagesList, Content, Titles, Meta): HTMLTitles = FormatTitles(Titles) Template = Template.replace('[HTML:Page:Title]', 'Untitled' if not Titles else Titles[0].lstrip('#')) Template = Template.replace('[HTML:Page:Style]', Meta['Style']) - #Template = Template.replace('[HTML:Page:LeftBox]', HTMLSiteTree) + Template = Template.replace('[HTML:Page:LeftBox]', HTMLPagesList) Template = Template.replace('[HTML:Page:RightBox]', HTMLTitles) Template = Template.replace('[HTML:Page:MainBox]', Content) @@ -139,6 +146,48 @@ def PatchHTML(Template, Parts, Content, Titles, Meta): Template = Template.replace('[HTML:Part:{}]'.format(p), Parts[p]) return Template +def FileToStr(File, Truncate=''): + return str(File)[len(Truncate):] + +def GetHTMLPagesList(Pages): + List = '' + LastParent = [] + for File, Content, Titles, Meta in Pages: + if Meta['Index'] == 'True' and Titles: + n = File.count('/') + 1 + if n > 1: + CurParent = File.split('/')[:-1] + for i,s in enumerate(CurParent): + if LastParent != CurParent: + LastParent = CurParent + Levels = '- ' * (n-1+i) + Title = CurParent[n-2+i] + List += Levels + Title + '\n' + Levels = '- ' * n + Title = Meta['Title'] if Meta['Title'] else 'Untitled' if not Titles else Titles[0].lstrip('#') + Title = '[{}]({})'.format( + Title, + '/{}.html'.format(File.rstrip('.pug'))) + List += Levels + Title + '\n' + return Markdown().convert(List) +""" + for t in Titles: + n = t.split(' ')[0].count('#') + Heading = '- ' * n + Title = t.lstrip('#') + Title = '[{}](#{})'.format(Title, DashifyStr(Title)) + MDTitles += Heading + Title + '\n' + + Pages = '' + for File in Path('Pages').rglob('*.pug'): + File = FileToStr(File, 'Pages/') + Content = ReadFile(File) + for File in Path('Pages').rglob('*.md'): + File = FileToStr(File, 'Pages/') + Content = ReadFile(File) + return Pages +""" + def DelTmp(): for File in Path('public').rglob('*.pug'): os.remove(File) @@ -148,10 +197,11 @@ def DelTmp(): def MakeSite(Templates, Parts): Pages = [] for File in Path('Pages').rglob('*.pug'): - File = str(File)[len('Pages/'):] + File = FileToStr(File, 'Pages/') Content, Titles, Meta = PreProcessor('Pages/{}'.format(File)) Pages += [[File, Content, Titles, Meta]] PugCompileList(Pages) + HTMLPagesList = GetHTMLPagesList(Pages) for File, Content, Titles, Meta in Pages: Template = Templates[Meta['Template']] Template = Template.replace( @@ -160,11 +210,11 @@ def MakeSite(Templates, Parts): WriteFile( 'public/{}.html'.format(File.rstrip('.pug')), PatchHTML( - Template, Parts, + Template, Parts, HTMLPagesList, ReadFile('public/{}.html'.format(File.rstrip('.pug'))), Titles, Meta)) for File in Path('Pages').rglob('*.md'): - File = str(File)[len('Pages/'):] + File = FileToStr(File, 'Pages/') Content, Titles, Meta = PreProcessor('Pages/{}'.format(File)) Template = Templates[Meta['Template']] Template = Template.replace( @@ -173,7 +223,7 @@ def MakeSite(Templates, Parts): WriteFile( 'public/{}.html'.format(File.rstrip('.md')), PatchHTML( - Template, Parts, + Template, Parts, HTMLPagesList, Markdown().convert(Content), Titles, Meta)) DelTmp() @@ -182,8 +232,9 @@ def Main(): ResetPublic() Templates = LoadFromDir('Templates') Parts = LoadFromDir('Parts') + #HTMLPages = SearchIndexedPages() shutil.copytree('Pages', 'public') - MakeSite(Templates, Parts) + MakeSite(Templates, Parts) #, HTMLPages) os.system("cp -R Assets/* public/") if __name__ == '__main__':