{StrOpen} ↗️'
def DashifyTitle(Title, Done=[]):
return UndupeStr(DashifyStr(Title.lstrip(' ').rstrip(' ')), Done, '-')
def MakeLinkableTitle(Line, Title, DashTitle, Type):
if Type == 'md':
Index = Title.split(' ')[0].count('#')
return HTMLSectionTitleLine.format(
Index=Index,
DashTitle=DashTitle,
Title=Title[Index+1:])
elif Type == 'pug':
Index = Line.find('h')
return PugSectionTitleLine.format(
Start=Line[:Index],
Heading=Line[Index:Index+2],
Rest=Line[Index+2:],
DashTitle=DashTitle)
def GetTitle(FileName, Meta, Titles, Prefer='MetaTitle', BlogName=None):
if Prefer == 'BodyTitle':
Title = Titles[0].lstrip('#') if Titles else Meta['Title'] if Meta['Title'] else FileName
elif Prefer == 'MetaTitle':
Title = Meta['Title'] if Meta['Title'] else Titles[0].lstrip('#') if Titles else FileName
elif Prefer == 'HTMLTitle':
Title = Meta['HTMLTitle'] if Meta['HTMLTitle'] else Meta['Title'] if Meta['Title'] else Titles[0].lstrip('#') if Titles else FileName
if BlogName and 'Blog' in Meta['Categories']:
Title += ' - ' + BlogName
return Title
def GetDescription(Meta, BodyDescription, Prefer='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, BodyImage, Prefer='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, Locale, Categories=''):
Header = ''
for e in ['CreatedOn', 'EditedOn']:
if Meta[e]:
Header += f'{Locale[e]}: {Meta[e]} '
if Categories:
Header += f'{Locale["Categories"]}:{Categories.removesuffix(" ")} '
return f'
{Header}
'
def MakeCategoryLine(File, Meta):
Categories = ''
for Cat in Meta['Categories']:
Categories += f' {html.escape(Cat)} '
return Categories
def MakeListTitle(File, Meta, Titles, Prefer, SiteRoot, BlogName, PathPrefix=''):
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}'
if Meta['Type'] == 'Post':
CreatedOn = Meta['CreatedOn'] if Meta['CreatedOn'] else '?'
Title = f"[] {Title}"
return Title
def FormatTitles(Titles, Flatten=False):
# TODO: Somehow titles written in Pug can end up here and don't work, they should be handled
HTMLTitles, DashyTitles = '', []
for t in Titles:
n = 0 if Flatten else t.split(' ')[0].count('#')
Title = MkSoup(t.lstrip('#')).get_text()
DashyTitle = DashifyTitle(Title, DashyTitles)
DashyTitles += [DashyTitle]
Start = '
'
# Clean up a generic HTML tree such that it's compliant with the HTML Journal standard
# (https://m15o.ichi.city/site/subscribing-to-a-journal-page.html);
# basis is: find an element with the JournalBody attr., and group its direct children as s
def MakeHTMLJournal(Flags, Locale, FilePath, HTML):
Soup, Journal, Entries = MkSoup(HTML), '', []
for t in Soup.find_all(attrs={"htmljournal":True}):
#JournalStyle = JournalStyles[t.attrs["journalstyle"]] if 'journalstyle' in t.attrs and t.attrs["journalstyle"] in JournalStyles else JournalStyles['Default']
for c in t.children: # Entries, some might be entirely grouped in their own element but others could not, use headings as separators
for ct in MkSoup(str(c)).find_all():
# Transform (almost, for now I reserve some) any heading into h2 and remove any attributes
if ct.name in JournalHeadings:
Title = ct.text.strip().removeprefix('»').strip()
Chr0 = Title[0]
# Remove leading symbols before date
if Chr0 in JournalTitleDecorators.keys():
Idx = Title.find(JournalTitleDecorators[Chr0])
Title = Title[1:Idx] + ' - ' + Title[Idx+2:]
if Journal:
Journal += '\n \n'
Journal += f'\n\n
{Title}
\n'
elif ct.name == 'p': # We should handle any type to preserve and things
Journal += str(ct)
FileName = FilePath.split('/')[-1]
URL = f'{Flags["SiteDomain"]}/{StripExt(FilePath)}.Journal.html'
Redirect = f"""""" if Flags["JournalRedirect"] else ''
# Instead of copying stuff from the full page, for now we use dedicated title, header, footer, and pagination
Title = t.attrs["journaltitle"] if 'journaltitle' in t.attrs else f'"{StripExt(FileName)}" Journal - {Flags["SiteName"]}' if Flags["SiteName"] else f'"{StripExt(FileName)}" Journal'
FeedLink = f"""""" if Flags["SiteDomain"] else ''
Header = t.attrs["journalheader"] if 'journalheader' in t.attrs else f"""\