diff options
| author | user <user@node5.net> | 2024-02-26 23:17:21 +0100 |
|---|---|---|
| committer | user <user@node5.net> | 2024-02-26 23:17:21 +0100 |
| commit | e0c5d9871ae48e1162e2452749d31e205d2b9960 (patch) | |
| tree | 80b39ae5d0f678ebde6f560575f3eda59f378dc8 /src | |
| parent | 18892c1f8f202988803c4d08fa36fe1d6f87009a (diff) | |
render folders
Diffstat (limited to 'src')
| -rw-r--r-- | src/article_handler.py | 34 | ||||
| -rw-r--r-- | src/blog_node5_net.py | 8 |
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) |
