Reading page preprocessor lines as INI

This commit is contained in:
octospacc 2022-08-13 00:29:34 +02:00
parent 78eb2ed40f
commit 89c6835745
3 changed files with 63 additions and 37 deletions

View File

@ -111,9 +111,24 @@ def GetHTMLPagesList(Pages, BlogName, SiteRoot, PathPrefix, Unite=[], Type='Page
List += Levels + Title + '\n' List += Levels + Title + '\n'
return markdown(MarkdownHTMLEscape(List, MarkdownExts), extensions=MarkdownExts) return markdown(MarkdownHTMLEscape(List, MarkdownExts), extensions=MarkdownExts)
def Preprocessor(Path, Type, SiteTemplate, SiteRoot, GlobalMacros): def TemplatePreprocessor(Text):
Meta, MetaDefault = '', {
'MenuStyle': 'Default'}
for l in Text.splitlines():
ll = l.lstrip()
if ll.startswith('<!--'):
lll = ll[4:].lstrip()
if lll.startswith('%'):
Meta += lll[1:-3].lstrip().rstrip() + '\n'
Meta = dict(ReadConf(LoadConfStr('[Meta]\n' + Meta), 'Meta'))
for i in MetaDefault:
if not i in Meta:
Meta.update({i:MetaDefault[i]})
return Meta
def PagePreprocessor(Path, Type, SiteTemplate, SiteRoot, GlobalMacros):
File = ReadFile(Path) File = ReadFile(Path)
Content, Titles, DashyTitles, HTMLTitlesFound, Macros, Meta = '', [], [], False, '', { Content, Titles, DashyTitles, HTMLTitlesFound, Macros, Meta, MetaDefault = '', [], [], False, '', '', {
'Template': SiteTemplate, 'Template': SiteTemplate,
'Style': '', 'Style': '',
'Type': Type, 'Type': Type,
@ -129,24 +144,13 @@ def Preprocessor(Path, Type, SiteTemplate, SiteRoot, GlobalMacros):
'EditedOn': '', 'EditedOn': '',
'Order': None} 'Order': None}
for l in File.splitlines(): for l in File.splitlines():
ls = l.lstrip() ll = l.lstrip()
if ls.startswith('// '): if ll.startswith('//'):
lss = ls[3:] lll = ll[2:].lstrip()
for Item in ('Template', 'Type', 'Index', 'Feed', 'Title', 'HTMLTitle', 'Description', 'Image', 'CreatedOn', 'EditedOn'): if lll.startswith('%'):
ItemText = '{}: '.format(Item) Meta += lll[1:].lstrip() + '\n'
if lss.startswith(ItemText): elif lll.startswith('$'):
Meta[Item] = lss[len(ItemText):] Macros += lll[1:].lstrip() + '\n'
if lss.startswith('$'):
Macros += lss[1:].lstrip() + '\n'
elif lss.startswith('Categories: '):
for i in lss[len('Categories: '):].split(' '):
Meta['Categories'] += [i]
elif lss.startswith('Background: '):
Meta['Style'] += "#MainBox{Background:" + lss[len('Background: '):] + ";} "
elif lss.startswith('Style: '):
Meta['Style'] += lss[len('Style: '):] + ' '
elif lss.startswith('Order: '):
Meta['Order'] = int(lss[len('Order: '):])
else: else:
Headings = ('h1', 'h2', 'h3', 'h4', 'h5', 'h6') Headings = ('h1', 'h2', 'h3', 'h4', 'h5', 'h6')
if Path.endswith('.html') and not HTMLTitlesFound: if Path.endswith('.html') and not HTMLTitlesFound:
@ -162,29 +166,39 @@ def Preprocessor(Path, Type, SiteTemplate, SiteRoot, GlobalMacros):
Content = str(Soup.prettify(formatter=None)) Content = str(Soup.prettify(formatter=None))
HTMLTitlesFound = True HTMLTitlesFound = True
elif Path.endswith('.md'): elif Path.endswith('.md'):
if ls.startswith('#'): if ll.startswith('#'):
DashTitle = DashifyTitle(l.lstrip('#'), DashyTitles) DashTitle = DashifyTitle(l.lstrip('#'), DashyTitles)
DashyTitles += [DashTitle] DashyTitles += [DashTitle]
Titles += [l] Titles += [l]
Content += MakeLinkableTitle(None, ls, DashTitle, 'md') + '\n' Content += MakeLinkableTitle(None, ll, DashTitle, 'md') + '\n'
else: else:
Content += l + '\n' Content += l + '\n'
elif Path.endswith('.pug'): elif Path.endswith('.pug'):
if ls.startswith(Headings): if ll.startswith(Headings):
if ls[2:].startswith(("(class='NoTitle", '(class="NoTitle')): if ll[2:].startswith(("(class='NoTitle", '(class="NoTitle')):
Content += l + '\n' Content += l + '\n'
else: else:
Title = '#'*int(ls[1]) + str(ls[3:]) Title = '#'*int(ll[1]) + str(ll[3:])
DashTitle = DashifyTitle(Title.lstrip('#'), DashyTitles) DashTitle = DashifyTitle(Title.lstrip('#'), DashyTitles)
DashyTitles += [DashTitle] DashyTitles += [DashTitle]
Titles += [Title] Titles += [Title]
# TODO: We should handle headers that for any reason already have parenthesis # TODO: We should handle headers that for any reason already have parenthesis
if ls[2:] == '(': if ll[2:] == '(':
Content += l + '\n' Content += l + '\n'
else: else:
Content += MakeLinkableTitle(l, Title, DashTitle, 'pug') + '\n' Content += MakeLinkableTitle(l, Title, DashTitle, 'pug') + '\n'
else: else:
Content += l + '\n' Content += l + '\n'
Meta = dict(ReadConf(LoadConfStr('[Meta]\n' + Meta), 'Meta'))
for i in MetaDefault:
if i in Meta:
if i == 'Categories':
Categories = Meta['Categories'].split(' ')
Meta['Categories'] = []
for j in Categories:
Meta['Categories'] += [j]
else:
Meta.update({i:MetaDefault[i]})
if Meta['Index'] in ('Default', 'Unspecified'): if Meta['Index'] in ('Default', 'Unspecified'):
if not Meta['Categories']: if not Meta['Categories']:
Meta['Categories'] = ['Uncategorized'] Meta['Categories'] = ['Uncategorized']
@ -197,7 +211,7 @@ def Preprocessor(Path, Type, SiteTemplate, SiteRoot, GlobalMacros):
Meta['Macros'].update(ReadConf(LoadConfStr('[Macros]\n' + Macros), 'Macros')) Meta['Macros'].update(ReadConf(LoadConfStr('[Macros]\n' + Macros), 'Macros'))
return Content, Titles, Meta return Content, Titles, Meta
def Postprocessor(FileType, Text, Meta): def PagePostprocessor(FileType, Text, Meta):
for e in Meta['Macros']: for e in Meta['Macros']:
Text = ReplWithEsc(Text, f"[: {e} :]", f"[:{e}:]") Text = ReplWithEsc(Text, f"[: {e} :]", f"[:{e}:]")
return Text return Text
@ -232,8 +246,8 @@ def OrderPages(Old):
for i,e in enumerate(Old): for i,e in enumerate(Old):
Curr = e[3]['Order'] Curr = e[3]['Order']
if Curr: if Curr:
if Curr > Max: if int(Curr) > Max:
Max = Curr Max = int(Curr)
else: else:
NoOrder += [e] NoOrder += [e]
for i in range(Max+1): for i in range(Max+1):
@ -241,7 +255,7 @@ def OrderPages(Old):
for i,e in enumerate(Old): for i,e in enumerate(Old):
Curr = e[3]['Order'] Curr = e[3]['Order']
if Curr: if Curr:
New[Curr] = e New[int(Curr)] = e
while [] in New: while [] in New:
New.remove([]) New.remove([])
return New + NoOrder return New + NoOrder
@ -360,7 +374,7 @@ def MakeSite(TemplatesText, PartsText, ContextParts, ContextPartsText, ConfMenu,
elif Type == 'Post': elif Type == 'Post':
Files = PostsPaths Files = PostsPaths
for File in Files: for File in Files:
Content, Titles, Meta = Preprocessor(f"{Type}s/{File}", Type, SiteTemplate, SiteRoot, GlobalMacros) Content, Titles, Meta = PagePreprocessor(f"{Type}s/{File}", Type, SiteTemplate, SiteRoot, GlobalMacros)
if Type != 'Page': if Type != 'Page':
File = f"{Type}s/{File}" File = f"{Type}s/{File}"
Pages += [[File, Content, Titles, Meta]] Pages += [[File, Content, Titles, Meta]]
@ -402,7 +416,7 @@ def MakeSite(TemplatesText, PartsText, ContextParts, ContextPartsText, ConfMenu,
<div><span>[staticoso:Category:{Cat}]</span></div> <div><span>[staticoso:Category:{Cat}]</span></div>
""") """)
Content, Titles, Meta = Preprocessor(FilePath, SiteRoot) Content, Titles, Meta = PagePreprocessor(FilePath, SiteRoot)
Pages += [[File, Content, Titles, Meta]] Pages += [[File, Content, Titles, Meta]]
for i,e in enumerate(ConfMenu): for i,e in enumerate(ConfMenu):
@ -415,10 +429,17 @@ def MakeSite(TemplatesText, PartsText, ContextParts, ContextPartsText, ConfMenu,
for File, Content, Titles, Meta in Pages: for File, Content, Titles, Meta in Pages:
PagePath = 'public/{}.html'.format(StripExt(File)) PagePath = 'public/{}.html'.format(StripExt(File))
if File.endswith('.md'): if File.endswith('.md'):
Content = markdown(Postprocessor('md', Content, Meta), extensions=MarkdownExts) Content = markdown(PagePostprocessor('md', Content, Meta), extensions=MarkdownExts)
elif File.endswith(('.pug')): elif File.endswith(('.pug')):
Content = Postprocessor('pug', ReadFile(PagePath), Meta) Content = PagePostprocessor('pug', ReadFile(PagePath), Meta)
TemplateMeta = TemplatePreprocessor(TemplatesText[Meta['Template']])
if TemplateMeta['MenuStyle'] == 'Line':
PagesListShowPaths = False
PagesListFlatten = True
else:
PagesListShowPaths = True
PagesListFlatten = False
HTMLPagesList = GetHTMLPagesList( HTMLPagesList = GetHTMLPagesList(
Pages=Pages, Pages=Pages,
BlogName=BlogName, BlogName=BlogName,
@ -427,7 +448,9 @@ def MakeSite(TemplatesText, PartsText, ContextParts, ContextPartsText, ConfMenu,
Unite=ConfMenu, Unite=ConfMenu,
Type='Page', Type='Page',
For='Menu', For='Menu',
MarkdownExts=MarkdownExts) MarkdownExts=MarkdownExts,
ShowPaths=PagesListShowPaths,
Flatten=PagesListFlatten)
HTML, ContentHTML, SlimHTML, Description, Image = PatchHTML( HTML, ContentHTML, SlimHTML, Description, Image = PatchHTML(
File=File, File=File,

View File

@ -13,8 +13,8 @@ from datetime import datetime
from pathlib import Path from pathlib import Path
FileExtensions = { FileExtensions = {
'Pages': ('html', 'md', 'pug'), 'Pages': ('htm', 'html', 'md', 'pug', 'txt'),
'Tmp': ('md', 'pug')} 'Tmp': ('md', 'pug', 'txt')}
def ReadFile(p): def ReadFile(p):
try: try:

3
TODO
View File

@ -10,3 +10,6 @@
- Full XML sitemap - Full XML sitemap
- SCSS support - SCSS support
- Images in post listings - Images in post listings
- Site menu on single line
- Fix HTML and TXT input pages
- Fix feed titles and page title ids