aboutsummaryrefslogtreecommitdiff
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)