diff --git a/Source/Build.py b/Source/Build.py index 3aa9d39..7fd9168 100755 --- a/Source/Build.py +++ b/Source/Build.py @@ -289,6 +289,16 @@ def Main(Args, FeedEntries): else: shutil.copytree('Assets', OutDir, dirs_exist_ok=True) +#def DoSiteBuild(Arg=None): +# #try: +# # SiteEditObserver.stop() +# # SiteEditObserver.join() +# #except: +# # pass +# Main(Args=Args, FeedEntries=FeedEntries) +# logging.info(f"✅ Done! ({round(time.time()-StartTime, 3)}s)") +# #SiteEditObserver.start() + if __name__ == '__main__': StartTime = time.time() @@ -341,7 +351,26 @@ if __name__ == '__main__': logging.warning("⚠ Can't load the XML libraries. XML Feeds Generation is Disabled. Make sure the 'lxml' library is installed.") FeedEntries = 0 - Main( - Args=Args, - FeedEntries=FeedEntries) + #from watchdog.observers import Observer + #from watchdog.events import LoggingEventHandler + #SiteEditEvent = LoggingEventHandler() + #SiteEditEvent.on_created = DoSiteBuild + #SiteEditEvent.on_deleted = DoSiteBuild + #SiteEditEvent.on_modified = DoSiteBuild + #SiteEditEvent.on_moved = DoSiteBuild + #SiteEditObserver = Observer() + #SiteEditObserver.schedule(SiteEditEvent, ".", recursive=True) + #SiteEditObserver.start() + + Main(Args=Args, FeedEntries=FeedEntries) logging.info(f"✅ Done! ({round(time.time()-StartTime, 3)}s)") + #DoSiteBuild() + + #try: + # while True: + # pass + #except KeyboardInterrupt: + # logging.info("Stopped.") + #finally: + # SiteEditObserver.stop() + # SiteEditObserver.join() diff --git a/Source/Modules/Elements.py b/Source/Modules/Elements.py index 7c1607b..73eeda7 100644 --- a/Source/Modules/Elements.py +++ b/Source/Modules/Elements.py @@ -33,11 +33,11 @@ RedirectPageTemplate = """\ - - + + {TitlePrefix}Redirect - - + +

{StrClick} {StrRedirect}.

@@ -46,15 +46,15 @@ RedirectPageTemplate = """\ """ HTMLCommentsBlock = '

{StrComments}

{StrOpen} ↗️' -def DashifyTitle(Title, Done=[]): +def DashifyTitle(Title:str, Done:list=[]): return UndupeStr(DashifyStr(Title.lstrip(' ').rstrip(' ')), Done, '-') -# Generate HTML tree/nested list from our internal metaformat, such as: +# Generate HTML tree list (nested list) from our internal metaformat, such as: # :Item 1 \\
  • Item 1
  • # :Item 4 //
  • Item 4
  • -def GenHTMLTreeList(MetaList:str, Type:str='ul'): +def GenHTMLTreeList(MetaList:str, Type:str='ul', Class:str=""): HTML = '' Lines = MetaList.splitlines() CurDepth, NextDepth, PrevDepth = 0, 0, 0 @@ -69,7 +69,7 @@ def GenHTMLTreeList(MetaList:str, Type:str='ul'): elif NextDepth < CurDepth: HTML += f'\n' * (CurDepth - NextDepth) + '' PrevDepth = CurDepth - return f'<{Type}>{HTML}\n' + return f'<{Type} class="staticoso-TreeList {Class}">{HTML}\n' def MakeLinkableTitle(Line:str, Title:str, DashTitle:str, Type:str): if Type == 'md': @@ -86,7 +86,7 @@ def MakeLinkableTitle(Line:str, Title:str, DashTitle:str, Type:str): Rest=Line[Index+2:], DashTitle=DashTitle) -def GetTitle(FileName:str, Meta:dict, Titles:list, Prefer='MetaTitle', BlogName=None): +def GetTitle(FileName:str, Meta:dict, Titles:list, Prefer:str='MetaTitle', BlogName:str=None): if Prefer == 'BodyTitle': Title = Titles[0].lstrip('#') if Titles else Meta['Title'] if Meta['Title'] else FileName elif Prefer == 'MetaTitle': @@ -97,21 +97,21 @@ def GetTitle(FileName:str, Meta:dict, Titles:list, Prefer='MetaTitle', BlogName= Title += ' - ' + BlogName return Title -def GetDescription(Meta:dict, BodyDescription, Prefer='MetaDescription'): +def GetDescription(Meta:dict, BodyDescription:str, Prefer:str='MetaDescription'): if Prefer == 'BodyDescription': Description = BodyDescription if BodyDescription else Meta['Description'] if Meta['Description'] else '' elif Prefer == 'MetaDescription': Description = Meta['Description'] if Meta['Description'] else BodyDescription if BodyDescription else '' return Description -def GetImage(Meta:dict, BodyImage, Prefer='MetaImage'): +def GetImage(Meta:dict, BodyImage:str, Prefer:str='MetaImage'): if Prefer == 'BodyImage': Image = BodyImage if BodyImage else Meta['Image'] if Meta['Image'] else '' elif Prefer == 'MetaImage': Image = Meta['Image'] if Meta['Image'] else BodyImage if BodyImage else '' return Image -def MakeContentHeader(Meta:dict, Locale:dict, Categories=''): +def MakeContentHeader(Meta:dict, Locale:dict, Categories:str=''): Header = '' for e in ['CreatedOn', 'EditedOn']: if Meta[e]: @@ -122,24 +122,26 @@ def MakeContentHeader(Meta:dict, Locale:dict, Categories=''): Header += f'{Locale["Unlisted"]}
    ' return f'

    {Header}

    ' -def MakeCategoryLine(File, Meta): +def MakeCategoryLine(File:str, Meta:dict): Categories = '' for Cat in Meta['Categories']: Categories += f' {html.escape(Cat)} ' return Categories -def MakeListTitle(File, Meta, Titles, Prefer, SiteRoot, BlogName, PathPrefix=''): +def MakeListTitle(File:str, Meta:dict, Titles:list, Prefer:str, BlogName:str, PathPrefix:str=''): Title = GetTitle(File.split('/')[-1], Meta, Titles, Prefer, BlogName).lstrip().rstrip() Link = False if Meta['Index'] == 'Unlinked' else True if Link: Href = f'{PathPrefix}{StripExt(File)}.html' Title = f'{Title}' + #else: + # Title = f'{Title}' if Meta['Type'] == 'Post': CreatedOn = Meta['CreatedOn'] if Meta['CreatedOn'] else '?' - Title = f"[] {Title}" + Title = f"[] {Title}" return Title -def FormatTitles(Titles, Flatten=False): +def FormatTitles(Titles:list, Flatten=False): # TODO: Somehow titles written in Pug can end up here and don't work, they should be handled List, DashyTitles = '', [] for t in Titles: @@ -192,8 +194,10 @@ def MakeHTMLJournal(Flags, Locale, FilePath, HTML): + + {Title} - + {Redirect} diff --git a/Source/Modules/Site.py b/Source/Modules/Site.py index 2ccbb20..21907e0 100644 --- a/Source/Modules/Site.py +++ b/Source/Modules/Site.py @@ -64,14 +64,14 @@ def GetHTMLPagesList(Pages, BlogName, SiteRoot, PathPrefix, CallbackFile=None, U Levels = '.' * ((Depth-2+i) if not Flatten else 0) + ':' # If search node endswith index, it's a page; else, it's a folder if StripExt(File).endswith('index'): - Title = MakeListTitle(File, Meta, Titles, 'HTMLTitle', SiteRoot, BlogName, PathPrefix) + Title = MakeListTitle(File, Meta, Titles, 'HTMLTitle', BlogName, PathPrefix) DoneCount += 1 else: Title = CurParent[Depth-2+i] if SingleLine: - List += ' ' + Title + ' ' + List += f' {Title} ' else: - List += Levels + Title + '\n' + List += f'{Levels}{Title}\n' # Pages with any other path if not (Depth > 1 and StripExt(File).split('/')[-1] == 'index'): @@ -80,14 +80,14 @@ def GetHTMLPagesList(Pages, BlogName, SiteRoot, PathPrefix, CallbackFile=None, U if Meta['Order'] == 'Unite': Title = markdown(MarkdownHTMLEscape(File, MarkdownExts), extensions=MarkdownExts).removeprefix('

    ').removesuffix('

    ') else: - Title = MakeListTitle(File, Meta, Titles, 'HTMLTitle', SiteRoot, BlogName, PathPrefix) + Title = MakeListTitle(File, Meta, Titles, 'HTMLTitle', BlogName, PathPrefix) if SingleLine: List += ' ' + Title + ' ' else: List += Levels + Title + '\n' if MenuStyle in ('Default', 'Flat'): - return GenHTMLTreeList(List) + return GenHTMLTreeList(List, Class="staticoso-PagesList") elif MenuStyle in ('Line', 'Excerpt', 'Image', 'Preview', 'Full'): return List @@ -361,25 +361,8 @@ def PatchHTML(File, HTML, StaticPartsText, DynamicParts, DynamicPartsText, HTMLP HTML = None else: HTML = WrapDictReplWithEsc(HTML, { - #'[staticoso:Site:Menu]': HTMLPagesList, - #'': HTMLPagesList, - #'[staticoso:Page:Lang]': Meta['Language'] if Meta['Language'] else SiteLang, - #'': Meta['Language'] if Meta['Language'] else SiteLang, - #'': Meta['Language'] if Meta['Language'] else SiteLang, - #'[staticoso:Page:Chapters]': HTMLTitles, - #'': HTMLTitles, - #'[staticoso:Page:Title]': Title, - #'': Title, - #'[staticoso:Page:Description]': Description, - #'': Description, - #'[staticoso:Page:Image]': Image, - #'': Image, - #'[staticoso:Page:Path]': PagePath, - #'': PagePath, #'[staticoso:PageHead]': Meta['Head'], #'': Meta['Head'], - #'[staticoso:Page:Style]': Meta['Style'], - #'': Meta['Style'], # #DEPRECATION # 'staticoso:Site:Menu': HTMLPagesList, 'staticoso:Page:Lang': Meta['Language'] if Meta['Language'] else SiteLang, @@ -401,19 +384,6 @@ def PatchHTML(File, HTML, StaticPartsText, DynamicParts, DynamicPartsText, HTMLP 'staticoso:PageHead': Meta['Head'], 'staticoso:PageStyle': Meta['Style'], # NOTE: Content is injected in page only at this point! Keep in mind for other substitutions - #'[staticoso:Page:Content]': Content, - #'': Content, - #'[staticoso:Page:ContentInfo]': ContentHeader, - #'': ContentHeader, - #'[staticoso:BuildTime]': TimeNow, - #'': TimeNow, - #'': SiteDomain, - #'[staticoso:Site:Name]': SiteName, - #'': SiteName, - #'[staticoso:Site:AbsoluteRoot]': SiteRoot, - #'': SiteRoot, - #'[staticoso:Site:RelativeRoot]': RelativeRoot, - #'': RelativeRoot, # #DEPRECATION # 'staticoso:Page:Content': Content, 'staticoso:Page:ContentInfo': ContentHeader, @@ -446,17 +416,6 @@ def PatchHTML(File, HTML, StaticPartsText, DynamicParts, DynamicPartsText, HTMLP # TODO: Clean this doubling? ContentHTML = Content ContentHTML = WrapDictReplWithEsc(ContentHTML, { - #'[staticoso:Page:Title]': Title, - #'': Title, - #'[staticoso:Page:Description]': Description, - #'': Description, - #'': SiteDomain, - #'[staticoso:Site:Name]': SiteName, - #'': SiteName, - #'[staticoso:Site:AbsoluteRoot]': SiteRoot, - #'': SiteRoot, - #'[staticoso:Site:RelativeRoot]': RelativeRoot, - #'': RelativeRoot, # #DEPRECATION # '[staticoso:Page:Title]': Title, '[staticoso:Page:Description]': Description, diff --git a/TODO b/TODO index cb494ec..bce004c 100644 --- a/TODO +++ b/TODO @@ -1,3 +1,4 @@ +- Put more metadata in the generated HTML (classes, data- attribs., ecc..) for CSS purposes - .html input pages bug: // metadata lines not being removed from final file after parsing - Multi-line metadata flags - Category-based feeds diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ab90481 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +lxml