about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authoruser <user@node5.net>2024-02-26 23:17:21 +0100
committeruser <user@node5.net>2024-02-26 23:17:21 +0100
commite0c5d9871ae48e1162e2452749d31e205d2b9960 (patch)
tree80b39ae5d0f678ebde6f560575f3eda59f378dc8 /src
parent18892c1f8f202988803c4d08fa36fe1d6f87009a (diff)
render folders
Diffstat (limited to 'src')
-rw-r--r--src/article_handler.py34
-rw-r--r--src/blog_node5_net.py8
2 files changed, 26 insertions, 16 deletions
diff --git a/src/article_handler.py b/src/article_handler.py
index 00321a7..3ec7cff 100644
--- a/src/article_handler.py
+++ b/src/article_handler.py
@@ -25,6 +25,7 @@ class ArticleNoMetaData(ArticleHandlerException):
 @dataclasses.dataclass
 class WebPage:
     url: str
+    name: str
 
 
 @dataclasses.dataclass
@@ -39,15 +40,15 @@ class MetaData():
     Created: {self.created}'''
 
 
-def truncate(text: str, max_length: int=50):
+def truncate(text: str, max_length: int = 50):
     if len(text) < max_length:
         return text
     else:
         return text[0:max_length - 1]
 
+
 @dataclasses.dataclass
 class Article(WebPage):
-    title: str
     metadata: MetaData
     web_dir: tuple
     source_path: str | os.PathLike
@@ -58,8 +59,8 @@ class Article(WebPage):
     @property
     def pretty_print(self) -> str:
         return f'''
-Title:       {self.title}
-Metadata:   {self.metadata.pretty_print}
+Name:        {self.name}
+Metadata:    {self.metadata.pretty_print}
 Web dir:     {self.web_dir}
 URL:         {self.url}
 Source path: {self.source_path}
@@ -74,8 +75,8 @@ class Folder(WebPage):
     sub_folders: typing.Dict[str, typing.Self] = dataclasses.field(default_factory=dict)
 
 
-def get_web_dir(path, title) -> tuple[str, ...]:
-    dir_structure = path.split(title)[0]
+def get_web_dir(path, name) -> tuple[str, ...]:
+    dir_structure = path.split(name)[0]
     # Split into tuple, remove first part, assemble to path again, all to remove the first source dir agnostically 
     dir_structure_prefix_striped = pathlib.Path(dir_structure).parts[2:]
     return dir_structure_prefix_striped
@@ -109,15 +110,15 @@ def get_article(path: str | os.PathLike) -> Article:
         article_folder_name = os.path.dirname(path)
         article_args['folder_path'] = article_folder_name
         dir_basename = os.path.basename(article_folder_name)
-        article_args['title'] = dir_basename
+        article_args['name'] = dir_basename
     else:
         # Article one file
-        article_args['title'] = os.path.basename(filename)
-    article_args['web_dir'] = get_web_dir(path, article_args['title'])
+        article_args['name'] = os.path.basename(filename)
+    article_args['web_dir'] = get_web_dir(path, article_args['name'])
     article_args['source_path'] = path
 
     article_args[
-        'url'] = f'{"/" if article_args["web_dir"] else ""}{"/".join(article_args["web_dir"])}/{article_args["title"]}'
+        'url'] = f'{"/" if article_args["web_dir"] else ""}{"/".join(article_args["web_dir"])}/{article_args["name"]}'
 
     with open(path, 'r') as file:
         source = file.read()
@@ -135,7 +136,7 @@ def discover_folder_structure(article: Article, articles: Folder):
 
         if folder_name not in previous_folder.sub_folders:
             logging.debug('new')
-            current_folder = Folder(url=f'{previous_folder.url}{folder_name}/')
+            current_folder = Folder(url=f'{previous_folder.url}{folder_name}/', name=folder_name)
             previous_folder.sub_folders[folder_name] = current_folder
         else:
             logging.debug('reuse')
@@ -146,11 +147,20 @@ def discover_folder_structure(article: Article, articles: Folder):
     previous_folder.articles.append(article)
 
 
+def sort_articles(folder: Folder):
+    folder.articles = sorted(folder.articles,
+                             key=lambda x: x.metadata.created if x.metadata.created is not None else datetime.date.min,
+                             reverse=True)
+    for folder in folder.sub_folders.values():
+        sort_articles(folder)
+
+
 def discover_articles(path):
     articles_paths = glob.glob(f'{path}/**/*.md', recursive=True)  # Equivalent to ls ./**.md
-    articles = Folder(url='/')
+    articles = Folder(url='/', name='index')
     for article_path in articles_paths:
         article = get_article(article_path)
         logging.debug(article.pretty_print)
         discover_folder_structure(articles=articles, article=article)
+    sort_articles(articles)
     return articles
diff --git a/src/blog_node5_net.py b/src/blog_node5_net.py
index af26c76..36c5b7f 100644
--- a/src/blog_node5_net.py
+++ b/src/blog_node5_net.py
@@ -17,7 +17,7 @@ folders_by_url: typing.Dict[str, article_handler.Folder] = {}
 articles_by_url: typing.Dict[str, article_handler.Article] = {}
 
 
-@app.context_processor  # Always inject title to all render_templates
+@app.context_processor  # Always inject site title to all render_templates
 def inject_title():
     return {'title': site_root_folder_path}
 
@@ -31,8 +31,8 @@ def view_folder():
     path = flask.request.path
     if path is not '/':
         path = strip_trailing_slash(flask.request.path)
-    a = folders_by_url[path]
-    return 'Folder'
+    folder = folders_by_url[path]
+    return flask.render_template('folder.html', folder=folder)
 
 
 def view_article():
@@ -52,7 +52,7 @@ def register_urls(folder: article_handler.Folder):
         if article.folder_path:
             blueprint_args['static_folder'] = os.path.abspath(article.folder_path)
             blueprint_args['static_url_path'] = ''
-        blueprint = flask.Blueprint(article.title, __name__, url_prefix=article.url, **blueprint_args)
+        blueprint = flask.Blueprint(article.name, __name__, url_prefix=article.url, **blueprint_args)
         blueprint.add_url_rule('/', view_func=view_article)
         app.register_blueprint(blueprint)
         # app.add_url_rule(article.url, view_func=view_article)