From d1445da3d9b0e8031064b5a4369bdc6063a30a97 Mon Sep 17 00:00:00 2001 From: octospacc Date: Fri, 24 Jun 2022 20:00:38 +0200 Subject: [PATCH] Working feed --- README.md | 2 +- Source/Build.py | 49 +++++++++++++++++++++++++++++++++---------------- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 0239ca6..cddd7e9 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Feel free to experiment with all of this stuff! - [ ] Differential recompile (to optimize resource waste on non-ephemeral servers) - [ ] Hot-recompile (for website development) - [ ] XML sitemap generation -- [ ] Atom + RSS feed generation for posts +- [x] Atom + RSS feed generation for posts - [x] Generation of website page tree in left sidebar - [x] Generation of titles in right sidebar with clickable links - [x] Detections of titles in a page diff --git a/Source/Build.py b/Source/Build.py index 0e21030..6dc9dff 100755 --- a/Source/Build.py +++ b/Source/Build.py @@ -12,6 +12,7 @@ import json import os import shutil from ast import literal_eval +from datetime import datetime from Libs import htmlmin from Libs.bs4 import BeautifulSoup from Libs.feedgen.feed import FeedGenerator @@ -430,10 +431,17 @@ def MakeSite(TemplatesText, PartsText, ContextParts, ContextPartsText, SiteName, Categories=Categories, Locale=Locale, Reserved=Reserved) - if Minify != 'False' and Minify != 'None': + if Minify not in ('False', 'None'): HTML = DoMinify(HTML) WriteFile(PagePath, HTML) + return Pages + +def GetFullDate(Date): + if not Date: + return None + return datetime.strftime(datetime.strptime(Date, '%Y-%m-%d'), '%Y-%m-%dT%H:%M+00:00') + def SetReserved(Reserved): for i in ['Categories']: if i not in Reserved: @@ -452,25 +460,33 @@ def SetSorting(Sorting): Sorting.update({i:Default[i]}) return Sorting -def MakeFeed(SiteName, SiteTagline, SiteDomain, MaxEntries, Lang, Minify=False): +def MakeFeed(Pages, SiteName, SiteTagline, SiteDomain, MaxEntries, Lang, Minify=False): Feed = FeedGenerator() - Feed.id(SiteDomain if SiteDomain else ' ') + Link = SiteDomain if SiteDomain else ' ' + Feed.id(Link) Feed.title(SiteName if SiteName else ' ') - Feed.link(href=SiteDomain if SiteDomain else ' ', rel='alternate') + Feed.link(href=Link, rel='alternate') Feed.subtitle(SiteTagline if SiteTagline else ' ') if SiteDomain: - Feed.logo('SiteDomain/favicon.png') + Feed.logo(SiteDomain.rstrip('/') + '/favicon.png') Feed.language(Lang) - #Feed.updated('2022-01-01T00:00+00:00') - #Feed.lastBuildDate('2022-01-01T00:00+00:00') - #Feed.pubDate('2022-01-01T00:00+00:00') - Entry = Feed.add_entry() - Entry.id('PageURL') - Entry.title('PageTitle') - Entry.link(href='PageURL', rel='alternate') - Entry.updated('2022-01-01T00:00+00:00') - Entry.pubDate('2022-01-01T00:00+00:00') + for File, Content, Titles, Meta in Pages: + #print(Meta['Image']) + #print(Meta['Title']) + #print(Meta['Description']) + if Meta['Type'] == 'Post': + Entry = Feed.add_entry() + Link = '{}/{}.html'.format(SiteDomain, StripExt(File)) if SiteDomain else ' ' + CreatedOn = GetFullDate(Meta['CreatedOn']) + EditedOn = GetFullDate(Meta['EditedOn']) + Entry.id(Link) + Entry.title(Meta['Title'] if Meta['Title'] else ' ') + Entry.link(href=Link, rel='alternate') + if CreatedOn: + Entry.pubDate(CreatedOn) + EditedOn = EditedOn if EditedOn else CreatedOn if CreatedOn and not EditedOn else '1970-01-01T00:00+00:00' + Entry.updated(EditedOn) os.mkdir('public/feed') Feed.atom_file('public/feed/atom.xml', pretty=(not Minify)) @@ -489,7 +505,7 @@ def Main(Args): if os.path.isdir('Posts'): shutil.copytree('Posts', 'public/Posts') - MakeSite( + Pages = MakeSite( TemplatesText=LoadFromDir('Templates', '*.html'), PartsText=LoadFromDir('Parts', '*.html'), ContextParts=literal_eval(Args.ContextParts) if Args.ContextParts else {}, @@ -506,12 +522,13 @@ def Main(Args): if FeedEntries != 0: MakeFeed( + Pages=Pages, SiteName=SiteName, SiteTagline=SiteTagline, SiteDomain=SiteDomain, MaxEntries=FeedEntries, Lang=SiteLang, - Minify=True if Args.Minify and Args.Minify != 'False' and Args.Minify != 'None' else False) + Minify=True if Args.Minify and Args.Minify not in ('False', 'None') else False) DelTmp() os.system("cp -R Assets/* public/")