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:
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()

View File

@ -33,11 +33,11 @@ RedirectPageTemplate = """\
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>{TitlePrefix}Redirect</title>
<link rel="canonical" href="{SiteDomain}/{DestURL}">
<meta http-equiv="refresh" content="0; url='{DestURL}'">
<link rel="canonical" href="{SiteDomain}/{DestURL}"/>
<meta http-equiv="refresh" content="0; url='{DestURL}'"/>
</head>
<body>
<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>'
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 \\ <li>Item 1<ul>
# .:Item 2 ============\\ <li>Item 2<ul>
# ..:Item 3 ============// <li>Item 3</li></ul></li></ul></li>
# :Item 4 // <li>Item 4</li>
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'</li>\n</{Type}>' * (CurDepth - NextDepth) + '</li>'
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):
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'<span class="staticoso-ContentHeader-Index" id="staticoso-ContentHeader-Index"><span class="staticoso-Value">{Locale["Unlisted"]}</span></span><br>'
return f'<p>{Header}</p>'
def MakeCategoryLine(File, Meta):
def MakeCategoryLine(File:str, Meta:dict):
Categories = ''
for Cat in Meta['Categories']:
Categories += f' <a href="{GetPathLevels(File)}Categories/{Cat}.html">{html.escape(Cat)}</a> '
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'<a href="{Href}">{Title}</a>'
#else:
# Title = f'<span class="staticoso-ListItem-Plain">{Title}</span>'
if Meta['Type'] == 'Post':
CreatedOn = Meta['CreatedOn'] if Meta['CreatedOn'] else '?'
Title = f"[<time>{CreatedOn}</time>] {Title}"
Title = f"<span>[<time>{CreatedOn}</time>]</span> {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):
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>{Title}</title>
<link rel="canonical" href="{URL}">
<link rel="canonical" href="{URL}"/>
{Redirect}
</head>
<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) + ':'
# 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 += ' <span>' + Title + '</span> '
List += f' <span>{Title}</span> '
else:
List += Levels + Title + '\n'
List += f'{Levels}<span>{Title}</span>\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('<p>').removesuffix('<p>')
else:
Title = MakeListTitle(File, Meta, Titles, 'HTMLTitle', SiteRoot, BlogName, PathPrefix)
Title = MakeListTitle(File, Meta, Titles, 'HTMLTitle', BlogName, PathPrefix)
if SingleLine:
List += ' <span>' + Title + '</span> '
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,
#'<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:Page:Style]': Meta['Style'],
#'<staticoso:PageStyle>': 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,
#'<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 #
'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,
#'<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 #
'[staticoso:Page:Title]': Title,
'[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
- Multi-line metadata flags
- Category-based feeds

1
requirements.txt Normal file
View File

@ -0,0 +1 @@
lxml