Some updates to classes in HTML generation

This commit is contained in:
octospacc 2023-02-17 21:53:37 +01:00
parent 9551342b74
commit 8436f03ec7
5 changed files with 60 additions and 66 deletions

View File

@ -289,6 +289,16 @@ def Main(Args, FeedEntries):
else: else:
shutil.copytree('Assets', OutDir, dirs_exist_ok=True) 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__': if __name__ == '__main__':
StartTime = time.time() 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.") logging.warning("⚠ Can't load the XML libraries. XML Feeds Generation is Disabled. Make sure the 'lxml' library is installed.")
FeedEntries = 0 FeedEntries = 0
Main( #from watchdog.observers import Observer
Args=Args, #from watchdog.events import LoggingEventHandler
FeedEntries=FeedEntries) #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)") 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()

View File

@ -33,11 +33,11 @@ RedirectPageTemplate = """\
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>{TitlePrefix}Redirect</title> <title>{TitlePrefix}Redirect</title>
<link rel="canonical" href="{SiteDomain}/{DestURL}"> <link rel="canonical" href="{SiteDomain}/{DestURL}"/>
<meta http-equiv="refresh" content="0; url='{DestURL}'"> <meta http-equiv="refresh" content="0; url='{DestURL}'"/>
</head> </head>
<body> <body>
<p><a href="{DestURL}">{StrClick}</a> {StrRedirect}.</p> <p><a href="{DestURL}">{StrClick}</a> {StrRedirect}.</p>
@ -46,15 +46,15 @@ RedirectPageTemplate = """\
""" """
HTMLCommentsBlock = '<br><h3>{StrComments}</h3><a href="{URL}" rel="noopener" target="_blank">{StrOpen} <span class="twa twa-↗️"><span>↗️</span></span></a>' HTMLCommentsBlock = '<br><h3>{StrComments}</h3><a href="{URL}" rel="noopener" target="_blank">{StrOpen} <span class="twa twa-↗️"><span>↗️</span></span></a>'
def DashifyTitle(Title, Done=[]): def DashifyTitle(Title:str, Done:list=[]):
return UndupeStr(DashifyStr(Title.lstrip(' ').rstrip(' ')), Done, '-') 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 \\ <li>Item 1<ul> # :Item 1 \\ <li>Item 1<ul>
# .:Item 2 ============\\ <li>Item 2<ul> # .:Item 2 ============\\ <li>Item 2<ul>
# ..:Item 3 ============// <li>Item 3</li></ul></li></ul></li> # ..:Item 3 ============// <li>Item 3</li></ul></li></ul></li>
# :Item 4 // <li>Item 4</li> # :Item 4 // <li>Item 4</li>
def GenHTMLTreeList(MetaList:str, Type:str='ul'): def GenHTMLTreeList(MetaList:str, Type:str='ul', Class:str=""):
HTML = '' HTML = ''
Lines = MetaList.splitlines() Lines = MetaList.splitlines()
CurDepth, NextDepth, PrevDepth = 0, 0, 0 CurDepth, NextDepth, PrevDepth = 0, 0, 0
@ -69,7 +69,7 @@ def GenHTMLTreeList(MetaList:str, Type:str='ul'):
elif NextDepth < CurDepth: elif NextDepth < CurDepth:
HTML += f'</li>\n</{Type}>' * (CurDepth - NextDepth) + '</li>' HTML += f'</li>\n</{Type}>' * (CurDepth - NextDepth) + '</li>'
PrevDepth = CurDepth PrevDepth = CurDepth
return f'<{Type}>{HTML}\n</{Type}>' return f'<{Type} class="staticoso-TreeList {Class}">{HTML}\n</{Type}>'
def MakeLinkableTitle(Line:str, Title:str, DashTitle:str, Type:str): def MakeLinkableTitle(Line:str, Title:str, DashTitle:str, Type:str):
if Type == 'md': if Type == 'md':
@ -86,7 +86,7 @@ def MakeLinkableTitle(Line:str, Title:str, DashTitle:str, Type:str):
Rest=Line[Index+2:], Rest=Line[Index+2:],
DashTitle=DashTitle) 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': if Prefer == 'BodyTitle':
Title = Titles[0].lstrip('#') if Titles else Meta['Title'] if Meta['Title'] else FileName Title = Titles[0].lstrip('#') if Titles else Meta['Title'] if Meta['Title'] else FileName
elif Prefer == 'MetaTitle': elif Prefer == 'MetaTitle':
@ -97,21 +97,21 @@ def GetTitle(FileName:str, Meta:dict, Titles:list, Prefer='MetaTitle', BlogName=
Title += ' - ' + BlogName Title += ' - ' + BlogName
return Title return Title
def GetDescription(Meta:dict, BodyDescription, Prefer='MetaDescription'): def GetDescription(Meta:dict, BodyDescription:str, Prefer:str='MetaDescription'):
if Prefer == 'BodyDescription': if Prefer == 'BodyDescription':
Description = BodyDescription if BodyDescription else Meta['Description'] if Meta['Description'] else '' Description = BodyDescription if BodyDescription else Meta['Description'] if Meta['Description'] else ''
elif Prefer == 'MetaDescription': elif Prefer == 'MetaDescription':
Description = Meta['Description'] if Meta['Description'] else BodyDescription if BodyDescription else '' Description = Meta['Description'] if Meta['Description'] else BodyDescription if BodyDescription else ''
return Description return Description
def GetImage(Meta:dict, BodyImage, Prefer='MetaImage'): def GetImage(Meta:dict, BodyImage:str, Prefer:str='MetaImage'):
if Prefer == 'BodyImage': if Prefer == 'BodyImage':
Image = BodyImage if BodyImage else Meta['Image'] if Meta['Image'] else '' Image = BodyImage if BodyImage else Meta['Image'] if Meta['Image'] else ''
elif Prefer == 'MetaImage': elif Prefer == 'MetaImage':
Image = Meta['Image'] if Meta['Image'] else BodyImage if BodyImage else '' Image = Meta['Image'] if Meta['Image'] else BodyImage if BodyImage else ''
return Image return Image
def MakeContentHeader(Meta:dict, Locale:dict, Categories=''): def MakeContentHeader(Meta:dict, Locale:dict, Categories:str=''):
Header = '' Header = ''
for e in ['CreatedOn', 'EditedOn']: for e in ['CreatedOn', 'EditedOn']:
if Meta[e]: if Meta[e]:
@ -122,24 +122,26 @@ def MakeContentHeader(Meta:dict, Locale:dict, Categories=''):
Header += f'<span class="staticoso-ContentHeader-Index" id="staticoso-ContentHeader-Index"><span class="staticoso-Value">{Locale["Unlisted"]}</span></span><br>' Header += f'<span class="staticoso-ContentHeader-Index" id="staticoso-ContentHeader-Index"><span class="staticoso-Value">{Locale["Unlisted"]}</span></span><br>'
return f'<p>{Header}</p>' return f'<p>{Header}</p>'
def MakeCategoryLine(File, Meta): def MakeCategoryLine(File:str, Meta:dict):
Categories = '' Categories = ''
for Cat in Meta['Categories']: for Cat in Meta['Categories']:
Categories += f' <a href="{GetPathLevels(File)}Categories/{Cat}.html">{html.escape(Cat)}</a> ' Categories += f' <a href="{GetPathLevels(File)}Categories/{Cat}.html">{html.escape(Cat)}</a> '
return Categories 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() Title = GetTitle(File.split('/')[-1], Meta, Titles, Prefer, BlogName).lstrip().rstrip()
Link = False if Meta['Index'] == 'Unlinked' else True Link = False if Meta['Index'] == 'Unlinked' else True
if Link: if Link:
Href = f'{PathPrefix}{StripExt(File)}.html' Href = f'{PathPrefix}{StripExt(File)}.html'
Title = f'<a href="{Href}">{Title}</a>' Title = f'<a href="{Href}">{Title}</a>'
#else:
# Title = f'<span class="staticoso-ListItem-Plain">{Title}</span>'
if Meta['Type'] == 'Post': if Meta['Type'] == 'Post':
CreatedOn = Meta['CreatedOn'] if Meta['CreatedOn'] else '?' CreatedOn = Meta['CreatedOn'] if Meta['CreatedOn'] else '?'
Title = f"[<time>{CreatedOn}</time>] {Title}" Title = f"<span>[<time>{CreatedOn}</time>]</span> {Title}"
return 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 # TODO: Somehow titles written in Pug can end up here and don't work, they should be handled
List, DashyTitles = '', [] List, DashyTitles = '', []
for t in Titles: for t in Titles:
@ -192,8 +194,10 @@ def MakeHTMLJournal(Flags, Locale, FilePath, HTML):
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>{Title}</title> <title>{Title}</title>
<link rel="canonical" href="{URL}"> <link rel="canonical" href="{URL}"/>
{Redirect} {Redirect}
</head> </head>
<body> <body>

View File

@ -64,14 +64,14 @@ def GetHTMLPagesList(Pages, BlogName, SiteRoot, PathPrefix, CallbackFile=None, U
Levels = '.' * ((Depth-2+i) if not Flatten else 0) + ':' Levels = '.' * ((Depth-2+i) if not Flatten else 0) + ':'
# If search node endswith index, it's a page; else, it's a folder # If search node endswith index, it's a page; else, it's a folder
if StripExt(File).endswith('index'): if StripExt(File).endswith('index'):
Title = MakeListTitle(File, Meta, Titles, 'HTMLTitle', SiteRoot, BlogName, PathPrefix) Title = MakeListTitle(File, Meta, Titles, 'HTMLTitle', BlogName, PathPrefix)
DoneCount += 1 DoneCount += 1
else: else:
Title = CurParent[Depth-2+i] Title = CurParent[Depth-2+i]
if SingleLine: if SingleLine:
List += ' <span>' + Title + '</span> ' List += f' <span>{Title}</span> '
else: else:
List += Levels + Title + '\n' List += f'{Levels}<span>{Title}</span>\n'
# Pages with any other path # Pages with any other path
if not (Depth > 1 and StripExt(File).split('/')[-1] == 'index'): 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': if Meta['Order'] == 'Unite':
Title = markdown(MarkdownHTMLEscape(File, MarkdownExts), extensions=MarkdownExts).removeprefix('<p>').removesuffix('<p>') Title = markdown(MarkdownHTMLEscape(File, MarkdownExts), extensions=MarkdownExts).removeprefix('<p>').removesuffix('<p>')
else: else:
Title = MakeListTitle(File, Meta, Titles, 'HTMLTitle', SiteRoot, BlogName, PathPrefix) Title = MakeListTitle(File, Meta, Titles, 'HTMLTitle', BlogName, PathPrefix)
if SingleLine: if SingleLine:
List += ' <span>' + Title + '</span> ' List += ' <span>' + Title + '</span> '
else: else:
List += Levels + Title + '\n' List += Levels + Title + '\n'
if MenuStyle in ('Default', 'Flat'): if MenuStyle in ('Default', 'Flat'):
return GenHTMLTreeList(List) return GenHTMLTreeList(List, Class="staticoso-PagesList")
elif MenuStyle in ('Line', 'Excerpt', 'Image', 'Preview', 'Full'): elif MenuStyle in ('Line', 'Excerpt', 'Image', 'Preview', 'Full'):
return List return List
@ -361,25 +361,8 @@ def PatchHTML(File, HTML, StaticPartsText, DynamicParts, DynamicPartsText, HTMLP
HTML = None HTML = None
else: else:
HTML = WrapDictReplWithEsc(HTML, { HTML = WrapDictReplWithEsc(HTML, {
#'[staticoso:Site:Menu]': HTMLPagesList,
#'<staticoso:SiteMenu>': HTMLPagesList,
#'[staticoso:Page:Lang]': Meta['Language'] if Meta['Language'] else SiteLang,
#'<staticoso:PageLang>': Meta['Language'] if Meta['Language'] else SiteLang,
#'<staticoso:PageLanguage>': Meta['Language'] if Meta['Language'] else SiteLang,
#'[staticoso:Page:Chapters]': HTMLTitles,
#'<staticoso:PageSections>': HTMLTitles,
#'[staticoso:Page:Title]': Title,
#'<staticoso:PageTitle>': Title,
#'[staticoso:Page:Description]': Description,
#'<staticoso:PageDescription>': Description,
#'[staticoso:Page:Image]': Image,
#'<staticoso:PageImage>': Image,
#'[staticoso:Page:Path]': PagePath,
#'<staticoso:PagePath>': PagePath,
#'[staticoso:PageHead]': Meta['Head'], #'[staticoso:PageHead]': Meta['Head'],
#'<staticoso:PageHead>': Meta['Head'], #'<staticoso:PageHead>': Meta['Head'],
#'[staticoso:Page:Style]': Meta['Style'],
#'<staticoso:PageStyle>': Meta['Style'],
# #DEPRECATION # # #DEPRECATION #
'staticoso:Site:Menu': HTMLPagesList, 'staticoso:Site:Menu': HTMLPagesList,
'staticoso:Page:Lang': Meta['Language'] if Meta['Language'] else SiteLang, '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:PageHead': Meta['Head'],
'staticoso:PageStyle': Meta['Style'], 'staticoso:PageStyle': Meta['Style'],
# NOTE: Content is injected in page only at this point! Keep in mind for other substitutions # NOTE: Content is injected in page only at this point! Keep in mind for other substitutions
#'[staticoso:Page:Content]': Content,
#'<staticoso:PageContent>': Content,
#'[staticoso:Page:ContentInfo]': ContentHeader,
#'<staticoso:PageContentInfo>': ContentHeader,
#'[staticoso:BuildTime]': TimeNow,
#'<staticoso:BuildTime>': TimeNow,
#'<staticoso:SiteDomain>': SiteDomain,
#'[staticoso:Site:Name]': SiteName,
#'<staticoso:SiteName>': SiteName,
#'[staticoso:Site:AbsoluteRoot]': SiteRoot,
#'<staticoso:SiteAbsoluteRoot>': SiteRoot,
#'[staticoso:Site:RelativeRoot]': RelativeRoot,
#'<staticoso:SiteRelativeRoot>': RelativeRoot,
# #DEPRECATION # # #DEPRECATION #
'staticoso:Page:Content': Content, 'staticoso:Page:Content': Content,
'staticoso:Page:ContentInfo': ContentHeader, 'staticoso:Page:ContentInfo': ContentHeader,
@ -446,17 +416,6 @@ def PatchHTML(File, HTML, StaticPartsText, DynamicParts, DynamicPartsText, HTMLP
# TODO: Clean this doubling? # TODO: Clean this doubling?
ContentHTML = Content ContentHTML = Content
ContentHTML = WrapDictReplWithEsc(ContentHTML, { ContentHTML = WrapDictReplWithEsc(ContentHTML, {
#'[staticoso:Page:Title]': Title,
#'<staticoso:PageTitle>': Title,
#'[staticoso:Page:Description]': Description,
#'<staticoso:PageDescription>': Description,
#'<staticoso:SiteDomain>': SiteDomain,
#'[staticoso:Site:Name]': SiteName,
#'<staticoso:SiteName>': SiteName,
#'[staticoso:Site:AbsoluteRoot]': SiteRoot,
#'<staticoso:SiteAbsoluteRoot>': SiteRoot,
#'[staticoso:Site:RelativeRoot]': RelativeRoot,
#'<staticoso:SiteRelativeRoot>': RelativeRoot,
# #DEPRECATION # # #DEPRECATION #
'[staticoso:Page:Title]': Title, '[staticoso:Page:Title]': Title,
'[staticoso:Page:Description]': Description, '[staticoso:Page:Description]': Description,

1
TODO
View File

@ -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 - .html input pages bug: // metadata lines not being removed from final file after parsing
- Multi-line metadata flags - Multi-line metadata flags
- Category-based feeds - Category-based feeds

1
requirements.txt Normal file
View File

@ -0,0 +1 @@
lxml