diff options
Diffstat (limited to 'utils')
-rw-r--r-- | utils/utils.py | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/utils/utils.py b/utils/utils.py index 1fdea5d9..f8a756c5 100644 --- a/utils/utils.py +++ b/utils/utils.py @@ -19,6 +19,9 @@ import multiprocessing import os import sys +from config.config import * +from rss import * + @contextmanager def init_colorama(): """Set global foreground modifying ANSI codes. @@ -257,3 +260,41 @@ class HTTPServerProcess(multiprocessing.Process): httpd.serve_forever() except KeyboardInterrupt: httpd.shutdown() + + +def list_posts(): + """List all posts, with date, title, and path to source file. + + This function only lists posts that has been built (since it reads + metadata from HTML rather than Markdown). + + Returns + ------- + posts : list + A list of posts, in reverse chronological order, where each + element is a tuple of (date, title, path to source file). + + """ + posts = [] + for name in os.listdir(os.path.join(BUILDDIR, "blog")): + if not re.match(r"^[0-9]{4}-[0-9]{2}-[0-9]{2}.*\.html", name): + continue + + htmlpath = os.path.join(BUILDDIR, "blog", name) + entry = AtomEntry() + item = RssItem() + try: + with open(htmlpath, encoding="utf-8") as htmlfile: + soup = bs4.BeautifulSoup(htmlfile.read(), "lxml") + title = soup.title.text + date = dateutil.parser.parse(soup.find("meta", attrs={"name": "date"})["content"]) + source_path = os.path.join(POSTSDIR, re.sub(r'.html$', '.md', name)) + posts.append((date, title, source_path)) + except Exception: + sys.stderr.write("error: failed to read metadata from HTML file %s\n" % name) + with open(htmlpath, encoding="utf-8") as htmlfile: + sys.stderr.write("dumping HTML:%s\n\n" % htmlfile.read()) + raise + + posts.sort(key=lambda post: post[0], reverse=True) + return posts |