Blog posts page

This commit is contained in:
2022-06-03 23:38:47 +02:00
parent 3eabb4c065
commit 8b3112a2dc
2 changed files with 49 additions and 21 deletions

View File

@ -16,7 +16,7 @@ Feel free to experiment with all of this stuff!
## Features roadmap ## Features roadmap
- [ ] Handle showing creation and modified date for any page - [ ] Handle showing creation and modified date for any page
- [ ] Generation of category pages (ex. page with list of blog posts) - [x] Generation of category pages (ex. page with list of blog posts)
- [x] Custom title choosing type (HTML/Plaintext) - [x] Custom title choosing type (HTML/Plaintext)
- [x] Custom page ordering - [x] Custom page ordering
- [ ] SCSS compilation support for CSS templates - [ ] SCSS compilation support for CSS templates

View File

@ -60,6 +60,20 @@ def GetTitleIdLine(Line, Title):
NewLine += Line[Index+2:] NewLine += Line[Index+2:]
return NewLine return NewLine
def MakeListTitle(File, Meta, Titles, Prefer, SiteRoot):
Title = GetTitle(Meta, Titles, Prefer)
if Meta['Type'] == 'Post':
Title = '[{}] [{}]({})'.format(
Meta['CreatedOn'],
Title,
'{}{}html'.format(SiteRoot, File[:-3]))
else:
Title = '[{}]({})'.format(
Title,
'{}{}html'.format(SiteRoot, File[:-3]))
return Title
def FormatTitles(Titles): def FormatTitles(Titles):
MDTitles = '' MDTitles = ''
for t in Titles: for t in Titles:
@ -82,15 +96,18 @@ def PreProcessor(p, SiteRoot):
Content, Titles, Meta = '', [], { Content, Titles, Meta = '', [], {
'Template': 'Standard.html', 'Template': 'Standard.html',
'Style': '', 'Style': '',
'Type': 'Page',
'Index': 'True', 'Index': 'True',
'Title': '', 'Title': '',
'HTMLTitle': '', 'HTMLTitle': '',
'CreatedOn': '',
'EditedOn': '',
'Order': None} 'Order': None}
for l in File.splitlines(): for l in File.splitlines():
ls = l.lstrip() ls = l.lstrip()
if ls.startswith('// '): if ls.startswith('// '):
lss = ls[3:] lss = ls[3:]
for Item in ['Template', 'Index', 'Title', 'HTMLTitle']: for Item in ['Template', 'Type', 'Index', 'Title', 'HTMLTitle', 'CreatedOn', 'EditedOn']:
ItemText = '{}: '.format(Item) ItemText = '{}: '.format(Item)
if lss.startswith(ItemText): if lss.startswith(ItemText):
Meta[Item] = lss[len(ItemText):] Meta[Item] = lss[len(ItemText):]
@ -124,16 +141,20 @@ def PugCompileList(Pages):
Paths += '"{}" '.format(FilePath) Paths += '"{}" '.format(FilePath)
os.system('pug {} > /dev/null'.format(Paths)) os.system('pug {} > /dev/null'.format(Paths))
def PatchHTML(Template, Parts, HTMLPagesList, Content, Titles, Meta, SiteRoot): def PatchHTML(Template, Parts, HTMLPagesList, Content, Titles, Meta, SiteRoot, Macros):
HTMLTitles = FormatTitles(Titles) HTMLTitles = FormatTitles(Titles)
for p in Parts: for i in Parts:
Template = Template.replace('[HTML:Part:{}]'.format(p), Parts[p]) Template = Template.replace('[HTML:Part:{}]'.format(i), Parts[i])
Template = Template.replace('[HTML:Site:AbsoluteRoot]', SiteRoot)
Template = Template.replace('[HTML:Page:LeftBox]', HTMLPagesList) Template = Template.replace('[HTML:Page:LeftBox]', HTMLPagesList)
Template = Template.replace('[HTML:Page:RightBox]', HTMLTitles) Template = Template.replace('[HTML:Page:RightBox]', HTMLTitles)
Template = Template.replace('[HTML:Page:Title]', GetTitle(Meta, Titles, 'MetaTitle')) Template = Template.replace('[HTML:Page:Title]', GetTitle(Meta, Titles, 'MetaTitle'))
Template = Template.replace('[HTML:Page:Style]', Meta['Style']) Template = Template.replace('[HTML:Page:Style]', Meta['Style'])
Template = Template.replace('[HTML:Page:MainBox]', Content) Template = Template.replace('[HTML:Page:MainBox]', Content)
Template = Template.replace('[HTML:Site:AbsoluteRoot]', SiteRoot)
for i in Macros:
#print(i)
#print(Macros[i])
Template = Template.replace('<span>[HTML:Macro:{}]</span>'.format(i), Macros[i])
return Template return Template
def FileToStr(File, Truncate=''): def FileToStr(File, Truncate=''):
@ -161,16 +182,25 @@ def OrderPages(Old):
#print(i) #print(i)
return New return New
def GetHTMLPagesList(Pages, SiteRoot): def GetHTMLPagesList(Pages, SiteRoot, Type='Page'):
List = '' List = ''
LastParent = [] LastParent = []
IndexPages = Pages.copy() IndexPages = Pages.copy()
for e in IndexPages: for e in IndexPages:
#print(e[3]['Index'])
if e[3]['Index'] == 'False': if e[3]['Index'] == 'False':
IndexPages.remove(e) IndexPages = IndexPages.remove(e)
IndexPages = OrderPages(IndexPages) #print(IndexPages)
for i,e in enumerate(IndexPages):
#print(e[3]['Type'])
if e[3]['Type'] != Type:
#print('rem')
IndexPages.pop(i)
#print(IndexPages)
if Type == 'Page':
IndexPages = OrderPages(IndexPages)
for File, Content, Titles, Meta in IndexPages: for File, Content, Titles, Meta in IndexPages:
if Meta['Index'] == 'True' and GetTitle(Meta, Titles, Prefer='HTMLTitle') != 'Untitled': if Meta['Type'] == Type and Meta['Index'] == 'True' and GetTitle(Meta, Titles, Prefer='HTMLTitle') != 'Untitled':
n = File.count('/') + 1 n = File.count('/') + 1
if n > 1: if n > 1:
CurParent = File.split('/')[:-1] CurParent = File.split('/')[:-1]
@ -179,19 +209,13 @@ def GetHTMLPagesList(Pages, SiteRoot):
LastParent = CurParent LastParent = CurParent
Levels = '- ' * (n-1+i) Levels = '- ' * (n-1+i)
if File[:-3].endswith('index.'): if File[:-3].endswith('index.'):
Title = GetTitle(Meta, Titles, 'HTMLTitle') Title = MakeListTitle(File, Meta, Titles, 'HTMLTitle', SiteRoot)
Title = '[{}]({})'.format(
Title,
'{}{}html'.format(SiteRoot, File[:-3]))
else: else:
Title = CurParent[n-2+i] Title = CurParent[n-2+i]
List += Levels + Title + '\n' List += Levels + Title + '\n'
if not (n > 1 and File[:-3].endswith('index.')): if not (n > 1 and File[:-3].endswith('index.')):
Levels = '- ' * n Levels = '- ' * n
Title = GetTitle(Meta, Titles, 'HTMLTitle') Title = MakeListTitle(File, Meta, Titles, 'HTMLTitle', SiteRoot)
Title = '[{}]({})'.format(
Title,
'{}{}html'.format(SiteRoot, File[:-3]))
List += Levels + Title + '\n' List += Levels + Title + '\n'
return Markdown().convert(List) return Markdown().convert(List)
@ -203,12 +227,16 @@ def DelTmp():
def MakeSite(Templates, Parts, SiteRoot): def MakeSite(Templates, Parts, SiteRoot):
Pages = [] Pages = []
Macros = {
'BlogPosts': ''}
for File in Path('Pages').rglob('*.pug'): for File in Path('Pages').rglob('*.pug'):
File = FileToStr(File, 'Pages/') File = FileToStr(File, 'Pages/')
Content, Titles, Meta = PreProcessor('Pages/{}'.format(File), SiteRoot) Content, Titles, Meta = PreProcessor('Pages/{}'.format(File), SiteRoot)
Pages += [[File, Content, Titles, Meta]] Pages += [[File, Content, Titles, Meta]]
PugCompileList(Pages) PugCompileList(Pages)
HTMLPagesList = GetHTMLPagesList(Pages, SiteRoot) HTMLPagesList = GetHTMLPagesList(Pages, SiteRoot, 'Page')
#print(GetHTMLPagesList(Pages, SiteRoot, 'Post'))
Macros['BlogPosts'] = GetHTMLPagesList(Pages, SiteRoot, 'Post')
for File, Content, Titles, Meta in Pages: for File, Content, Titles, Meta in Pages:
Template = Templates[Meta['Template']] Template = Templates[Meta['Template']]
Template = Template.replace( Template = Template.replace(
@ -222,7 +250,7 @@ def MakeSite(Templates, Parts, SiteRoot):
PatchHTML( PatchHTML(
Template, Parts, HTMLPagesList, Template, Parts, HTMLPagesList,
ReadFile('public/{}html'.format(File[:-3])), ReadFile('public/{}html'.format(File[:-3])),
Titles, Meta, SiteRoot)) Titles, Meta, SiteRoot, Macros))
for File in Path('Pages').rglob('*.md'): for File in Path('Pages').rglob('*.md'):
File = FileToStr(File, 'Pages/') File = FileToStr(File, 'Pages/')
Content, Titles, Meta = PreProcessor('Pages/{}'.format(File), SiteRoot) Content, Titles, Meta = PreProcessor('Pages/{}'.format(File), SiteRoot)
@ -238,7 +266,7 @@ def MakeSite(Templates, Parts, SiteRoot):
PatchHTML( PatchHTML(
Template, Parts, HTMLPagesList, Template, Parts, HTMLPagesList,
Markdown().convert(Content), Markdown().convert(Content),
Titles, Meta, SiteRoot)) Titles, Meta, SiteRoot, Macros))
DelTmp() DelTmp()
def Main(Args): def Main(Args):