#!/usr/bin/env python3 # SPDX-FileCopyrightText: 2021 Luca Beltrame # SPDX-License-Identifier: BSD-3-Clause import argparse from datetime import datetime from pathlib import Path from typing import List import frontmatter from git import Repo import sarge from slugify import slugify POST_PATH = "content/post" def new_post_title(title: str) -> str: suffix = "md" current_date = datetime.now().date().isoformat() slugified_title = slugify(title) post_title = f"{current_date}-{slugified_title}.{suffix}" return post_title def commit_initial_post(post_title, post_filename): repo = Repo("./") repo.index.add([str(post_filename)]) template = f"New post: {post_title}" repo.index.commit(template) def create_post(post_title: str, tags: List[str] = None, categories: List[str] = None, comments: bool = True, draft: bool = True) -> Path or None: cmd = ["hugo", "new", "-k", "posts"] title = new_post_title(post_title) path = Path(POST_PATH) / title cmd.append(str(path)) pid = sarge.run(cmd) if pid.returncode != 0: return header = frontmatter.load(path) if categories is not None: header["categories"] = categories if tags is not None: header["tags"] = tags header["draft"] = draft header["comments"] = comments header["title"] = post_title frontmatter.dump(header, path) print(f"{path} created.") return path def main(): parser = argparse.ArgumentParser() parser.add_argument("-t", "--tags", nargs="+", help="Post tags (space separated)") parser.add_argument("-c", "--categories", nargs="+", help="Post categories (space separated)") parser.add_argument("--disable_comments", action="store_false", help="Disable comments for the post") parser.add_argument("--commit", action="store_true", help="Commit to the repository") parser.add_argument("--draft", action="store_true", help="Create the post as draft") parser.add_argument("title", help="Title of the new post") options = parser.parse_args() post_path = create_post(options.title, options.tags, options.categories, comments=options.disable_comments) if post_path is not None and options.commit: commit_initial_post(options.title, post_path) if __name__ == "__main__": main()