From fe4cf294d5f60a2def577b7f00538b6fabf879e1 Mon Sep 17 00:00:00 2001 From: octospacc Date: Wed, 8 Mar 2023 11:30:39 +0100 Subject: [PATCH] Implement basic transclusions; Redirects without .html; Minor fixes --- App/Source/Build.py | 31 +++++++++++++++++++--------- App/Source/Modules/Globals.py | 3 ++- App/Source/Modules/Meta.py | 2 ++ App/Source/Modules/Site.py | 39 ++++++++++++++++++----------------- 4 files changed, 45 insertions(+), 30 deletions(-) diff --git a/App/Source/Build.py b/App/Source/Build.py index 508c1e0..1608e5f 100644 --- a/App/Source/Build.py +++ b/App/Source/Build.py @@ -100,16 +100,27 @@ def WriteRedirects(Flags:dict, Pages:list, FinalPaths, Locale:dict): SiteName = Flags['SiteName'] for Page in Pages: for URL in Page['Meta']['URLs']: - DestFile = f'{Flags["OutDir"]}/{URL}' - if DestFile not in FinalPaths: - DestURL = f'{GetPathLevels(URL)}{StripExt(Page["File"])}.html' - mkdirps(os.path.dirname(DestFile)) - WriteFile(DestFile, RedirectPageTemplate.format( - SiteDomain=Flags['SiteDomain'], - DestURL=DestURL, - TitlePrefix=f'{SiteName} - ' if SiteName else '', - StrClick=Locale['ClickHere'], - StrRedirect=Locale['IfNotRedirected'])) + for DestOpts in ((f'{Flags["OutDir"]}/{URL}', ''), (f'{Flags["OutDir"]}/{StripExt(URL)}/index.html', '../')): + DestFile, DestPrefix = DestOpts + if DestFile not in FinalPaths: + DestURL = f'{DestPrefix}{GetPathLevels(URL)}{StripExt(Page["File"])}.html' + mkdirps(os.path.dirname(DestFile)) + WriteFile(DestFile, RedirectPageTemplate.format( + SiteDomain=Flags['SiteDomain'], + DestURL=DestURL, + TitlePrefix=f'{SiteName} - ' if SiteName else '', + StrClick=Locale['ClickHere'], + StrRedirect=Locale['IfNotRedirected'])) + if StripExt(Page["File"]).split('/')[-1].lower() != 'index': + DestFile = f'{Flags["OutDir"]}/{StripExt(Page["File"])}/index.html' + DestURL = f'../{StripExt(Page["File"]).split("/")[-1]}.html' + mkdirps(os.path.dirname(DestFile)) + WriteFile(DestFile, RedirectPageTemplate.format( + SiteDomain=Flags['SiteDomain'], + DestURL=DestURL, + TitlePrefix=f'{SiteName} - ' if SiteName else '', + StrClick=Locale['ClickHere'], + StrRedirect=Locale['IfNotRedirected'])) def CopyBaseFiles(Flags:dict): f = NameSpace(Flags) diff --git a/App/Source/Modules/Globals.py b/App/Source/Modules/Globals.py index eead700..dbd1464 100644 --- a/App/Source/Modules/Globals.py +++ b/App/Source/Modules/Globals.py @@ -37,8 +37,9 @@ PageMetaDefault = { 'Categories': [], 'URLs': [], 'CreatedOn': '', - 'UpdatedOn': '', + 'PublishedOn': '', # Alias of CreatedOn 'EditedOn': '', + 'UpdatedOn': '', # Alias of EditedOn 'Order': None, 'Language': None, 'Downsync': None diff --git a/App/Source/Modules/Meta.py b/App/Source/Modules/Meta.py index db26e47..a0915e6 100644 --- a/App/Source/Modules/Meta.py +++ b/App/Source/Modules/Meta.py @@ -232,6 +232,8 @@ def PagePreprocessor(Flags:dict, Page:list, GlobalMacros:dict, LightRun:bool=Fal Meta['URLs'] += [j] else: Meta.update({i:MetaDefault[i]}) + if Meta['PublishedOn']: + Meta['CreatedOn'] = Meta['PublishedOn'] if Meta['UpdatedOn']: Meta['EditedOn'] = Meta['UpdatedOn'] if Meta['Index'].lower() in ('default', 'unspecified', 'categories'): diff --git a/App/Source/Modules/Site.py b/App/Source/Modules/Site.py index 766a8d5..46266fb 100644 --- a/App/Source/Modules/Site.py +++ b/App/Source/Modules/Site.py @@ -48,10 +48,10 @@ def HandleDynamicParts(Flags:dict, Html:str, Snippets:dict): return Html # TODO: This would need to be handled either fully before or fully after after all pages' content has been transformed to HTML, else other markups end up in HTML and the page is broken -def HandleTransclusions(Html:str, Caller:str, Pages:list): +def HandleTransclusions(Base:str, Caller:str, Pages:list): #if Type == 'Evals': # [% cmd %] | {% cmd %} Targets = [] - Finding = Html + Finding = Base Start = Finding.find('{{') while Start != -1: Start = Start + 2 @@ -61,13 +61,13 @@ def HandleTransclusions(Html:str, Caller:str, Pages:list): Targets += [Finding[:Stop]] Start = Finding.find('{{') for Target in Targets: - # Maybe we should show an error message on possible recursive transclusion, as currently this doesn't handle escaped tokens + # We should show an error message on inexistant transclusion and possible recursive transclusion, as currently this doesn't handle escaped tokens if Target != Caller: for File, Content, _, _ in Pages: if File == Target: - Html = ReplWithEsc(Html, '{{' + Target + '}}', Content) + Base = ReplWithEsc(Base, '{{' + Target + '}}', Content) break - return Html + return Base def PatchHtml(Flags:dict, Pages:list, Page:dict, Context:dict, Snippets:dict, Locale:dict, LightRun): f = NameSpace(Flags) @@ -140,6 +140,7 @@ def PatchHtml(Flags:dict, Pages:list, Page:dict, Context:dict, Snippets:dict, Lo 'staticoso:PagePath': PagePath, 'staticoso:PageHead': Meta['Head'], 'staticoso:PageStyle': Meta['Style'], + 'staticoso:PageCreatedOn': Meta['CreatedOn'], # NOTE: Content is injected in page only at this point! Keep in mind for other substitutions # #DEPRECATION # 'staticoso:Page:Content': Content, @@ -176,18 +177,18 @@ def PatchHtml(Flags:dict, Pages:list, Page:dict, Context:dict, Snippets:dict, Lo ContentHtml = Content ContentHtml = WrapDictReplWithEsc(ContentHtml, { # #DEPRECATION # - '[staticoso:Page:Title]': Title, - '[staticoso:Page:Description]': Description, - '[staticoso:Site:Name]': f.SiteName, - '[staticoso:Site:AbsoluteRoot]': f.SiteRoot, - '[staticoso:Site:RelativeRoot]': RelativeRoot, + 'staticoso:Page:Title': Title, + 'staticoso:Page:Description': Description, + 'staticoso:Site:Name': f.SiteName, + 'staticoso:Site:AbsoluteRoot': f.SiteRoot, + 'staticoso:Site:RelativeRoot': RelativeRoot, ################ - '': Title, - '': Description, - '': f.SiteDomain, - '': f.SiteName, - '': f.SiteRoot, - '': RelativeRoot, + 'staticoso:PageTitle': Title, + 'staticoso:PageDescription': Description, + 'staticoso:SiteDomain': f.SiteDomain, + 'staticoso:SiteName': f.SiteName, + 'staticoso:SiteAbsoluteRoot': f.SiteRoot, + 'staticoso:SiteRelativeRoot': RelativeRoot, }, InternalMacrosWraps) #Html = WhileFuncResultChanges(HandleTransclusions, {"Html": Html, "Caller": File, "Pages": Pages}, 'Html') for e in Meta['Macros']: @@ -239,6 +240,9 @@ def HandlePage(Flags:dict, Page:list, Pages:list, Categories, LimitFiles, Snippe ContentPagePath = f'{f.OutDir}.Content/{StripExt(File)}.html' LightRun = False if LimitFiles == False or File in LimitFiles else True + # This should be done after all pages are converted to HTML, else issues with different formats will occur + Content = HandleTransclusions(Content, File, Pages) + if FileLower.endswith(FileExtensions['Markdown']): Content = markdown(PagePostprocessor('md', Content, Meta), extensions=f.MarkdownExts) elif FileLower.endswith(('.pug')): @@ -430,9 +434,6 @@ def MakeSite(Flags:dict, LimitFiles, Snippets, ConfMenu, GlobalMacros:dict, Loca Categories = PopulateCategoryLists(Flags, Pages, Categories) Pages += MakeAutoCategories(Flags, Categories) - #logging.info("Building the HTML Search Page") - #Pages += [PagePreprocessor(Flags, Path='Search.html', TempPath='Search.html', Type='Page', SiteTemplate=SiteTemplate, GlobalMacros=GlobalMacros, LightRun=LightRun, Content=BuildPagesSearch(Flags, Pages))] - for i,e in enumerate(ConfMenu): for File, Content, Titles, Meta in Pages: File = StripExt(File)+'.html'