diff options
-rw-r--r-- | cli/cli.py | 148 | ||||
-rw-r--r-- | cli/post.py | 149 | ||||
-rwxr-xr-x | pyblog | 7 |
3 files changed, 153 insertions, 151 deletions
@@ -1,24 +1,13 @@ #/bin/python3 -import os import subprocess - import sys - import re -import io -import fileinput - import time - import signal -import blessed - from config.config import * - from utils import utils - from generators import generators @@ -34,133 +23,6 @@ def regenerate(args): exit(generators.generate_blog(fresh=True)) -def edit_post_with_editor(path): - """Launch text editor to edit post at a given path. - - Text editor is $VISUAL, then if empty, $EDITOR, then if still empty, - vi. - - """ - if "VISUAL" in os.environ: - editor = os.environ["VISUAL"] - elif "EDITOR" in os.environ: - editor = os.environ["EDITOR"] - else: - editor = "vi" - subprocess.call([editor, path]) - - -def new_post(title): - """Create a new post with metadata pre-filled. - - The path to the new post is printed to stdout. - - Returns - ------- - 0 - On success. - - """ - date = utils.current_datetime() - filename_date = date.strftime("%Y-%m-%d") - iso_date = date.isoformat() - display_date = "%s %d, %d" % (date.strftime("%B"), date.day, date.year) - title_sanitized = utils.sanitize(title) - filename = "%s-%s.md" % (filename_date, title_sanitized) - fullpath = os.path.join(POSTSDIR, filename) - if not os.path.isdir(POSTSDIR): - if os.path.exists(POSTSDIR): - os.remove(POSTSDIR) - os.mkdir(POSTSDIR, mode=0o755) - if os.path.exists(fullpath): - sys.stderr.write("%serror: '%s' already exists, please pick a different title%s\n" % - (RED, fullpath, RESET)) - return 1 - with open(fullpath, 'w', encoding='utf-8') as newpost: - newpost.write("---\n") - newpost.write('title: "%s"\n' % title) - newpost.write("date: %s\n" % iso_date) - newpost.write("date_display: %s\n" % display_date) - newpost.write("---\n\n") - sys.stderr.write("New post created in:\n") - print(fullpath) - edit_post_with_editor(fullpath) - - return 0 - - -def new_post_cli(args): - """CLI wrapper around new_post.""" - new_post(args.title) - - -def touch(filename): - """Update the timestamp of a post to the current time.""" - filename = os.path.basename(filename) - fullpath = os.path.join(POSTSDIR, filename) - if not os.path.exists(fullpath): - sys.stderr.write("%serror: post %s not found %s\n" % - (RED, fullpath, RESET)) - return 1 - filename_prefix_re = re.compile(r"^[0-9]{4}-[0-9]{2}-[0-9]{2}") - if not filename_prefix_re.match(filename): - sys.stderr.write(RED) - sys.stderr.write("error: post %s is not a valid post\n" % filename) - sys.stderr.write("error: the filename of a valid post begins with " - "a date in the form xxxx-xx-xx\n") - sys.stderr.write(RESET) - return 1 - - # update timestamp in the metadata section of the post - whatchanged = io.StringIO() - date = utils.current_datetime() - iso_date = date.isoformat() - display_date = "%s %d, %d" % (date.strftime("%B"), date.day, date.year) - filename_date = date.strftime("%Y-%m-%d") - with fileinput.input(files=(fullpath), inplace=True) as lines: - meta_fences = 0 - for line in lines: - if line.startswith("---"): - meta_fences += 1 - sys.stdout.write(line) - continue - if meta_fences >= 2: - # already went past the metadata section - sys.stdout.write(line) - continue - - if line.startswith("date: "): - updated_line = "date: %s\n" % iso_date - sys.stdout.write(updated_line) - whatchanged.write("-%s+%s\n" % (line, updated_line)) - continue - - if line.startswith("date_display: "): - updated_line = "date_display: %s\n" % display_date - sys.stdout.write(updated_line) - whatchanged.write("-%s+%s\n" % (line, updated_line)) - continue - - sys.stdout.write(line) - - sys.stderr.write("\n%schangeset:%s\n\n%s" % - (YELLOW, RESET, whatchanged.getvalue())) - whatchanged.close() - - # check if the file needs to be renamed - new_filename = filename_prefix_re.sub(filename_date, filename) - if new_filename != filename: - new_fullpath = os.path.join(POSTSDIR, new_filename) - os.rename(fullpath, new_fullpath) - sys.stderr.write("%srenamed to %s%s\n" % (YELLOW, new_filename, RESET)) - return 0 - - -def touch_cli(args): - """CLI wrapper around touch.""" - touch(args.filename) - - def deploy(args): """Deploys build directory to origin/master without regenerating. @@ -357,13 +219,3 @@ def preview(args): sys.stderr.write("\nSIGINT received, cleaning up...\n") server_process.join() return 0 - - -def edit_existing_post(args): - selector = utils.PostSelector(blessed.Terminal(), utils.list_posts()) - selection = selector.select() - if selection: - print(selection) - edit_post_with_editor(selection) - else: - return 1 diff --git a/cli/post.py b/cli/post.py new file mode 100644 index 00000000..3c196968 --- /dev/null +++ b/cli/post.py @@ -0,0 +1,149 @@ +#!/bin/python3 + +import os +import subprocess +import blessed +import re +import time +import sys +import io +import fileinput + +from utils import utils +from config.config import * + +def edit_post_with_editor(path): + """Launch text editor to edit post at a given path. + + Text editor is $VISUAL, then if empty, $EDITOR, then if still empty, + vi. + + """ + if "VISUAL" in os.environ: + editor = os.environ["VISUAL"] + elif "EDITOR" in os.environ: + editor = os.environ["EDITOR"] + else: + editor = "vi" + subprocess.call([editor, path]) + + +def new_post(title): + """Create a new post with metadata pre-filled. + + The path to the new post is printed to stdout. + + Returns + ------- + 0 + On success. + + """ + date = utils.current_datetime() + filename_date = date.strftime("%Y-%m-%d") + iso_date = date.isoformat() + display_date = "%s %d, %d" % (date.strftime("%B"), date.day, date.year) + title_sanitized = utils.sanitize(title) + filename = "%s-%s.md" % (filename_date, title_sanitized) + fullpath = os.path.join(POSTSDIR, filename) + if not os.path.isdir(POSTSDIR): + if os.path.exists(POSTSDIR): + os.remove(POSTSDIR) + os.mkdir(POSTSDIR, mode=0o755) + if os.path.exists(fullpath): + sys.stderr.write("%serror: '%s' already exists, please pick a different title%s\n" % + (RED, fullpath, RESET)) + return 1 + with open(fullpath, 'w', encoding='utf-8') as newpost: + newpost.write("---\n") + newpost.write('title: "%s"\n' % title) + newpost.write("date: %s\n" % iso_date) + newpost.write("date_display: %s\n" % display_date) + newpost.write("---\n\n") + sys.stderr.write("New post created in:\n") + print(fullpath) + edit_post_with_editor(fullpath) + + return 0 + + +def new_post_cli(args): + """CLI wrapper around new_post.""" + new_post(args.title) + + +def edit_existing_post(args): + selector = utils.PostSelector(blessed.Terminal(), utils.list_posts()) + selection = selector.select() + if selection: + print(selection) + edit_post_with_editor(selection) + else: + return 1 + + +def touch(filename): + """Update the timestamp of a post to the current time.""" + filename = os.path.basename(filename) + fullpath = os.path.join(POSTSDIR, filename) + if not os.path.exists(fullpath): + sys.stderr.write("%serror: post %s not found %s\n" % + (RED, fullpath, RESET)) + return 1 + filename_prefix_re = re.compile(r"^[0-9]{4}-[0-9]{2}-[0-9]{2}") + if not filename_prefix_re.match(filename): + sys.stderr.write(RED) + sys.stderr.write("error: post %s is not a valid post\n" % filename) + sys.stderr.write("error: the filename of a valid post begins with " + "a date in the form xxxx-xx-xx\n") + sys.stderr.write(RESET) + return 1 + + # update timestamp in the metadata section of the post + whatchanged = io.StringIO() + date = utils.current_datetime() + iso_date = date.isoformat() + display_date = "%s %d, %d" % (date.strftime("%B"), date.day, date.year) + filename_date = date.strftime("%Y-%m-%d") + with fileinput.input(files=(fullpath), inplace=True) as lines: + meta_fences = 0 + for line in lines: + if line.startswith("---"): + meta_fences += 1 + sys.stdout.write(line) + continue + if meta_fences >= 2: + # already went past the metadata section + sys.stdout.write(line) + continue + + if line.startswith("date: "): + updated_line = "date: %s\n" % iso_date + sys.stdout.write(updated_line) + whatchanged.write("-%s+%s\n" % (line, updated_line)) + continue + + if line.startswith("date_display: "): + updated_line = "date_display: %s\n" % display_date + sys.stdout.write(updated_line) + whatchanged.write("-%s+%s\n" % (line, updated_line)) + continue + + sys.stdout.write(line) + + sys.stderr.write("\n%schangeset:%s\n\n%s" % + (YELLOW, RESET, whatchanged.getvalue())) + whatchanged.close() + + # check if the file needs to be renamed + new_filename = filename_prefix_re.sub(filename_date, filename) + if new_filename != filename: + new_fullpath = os.path.join(POSTSDIR, new_filename) + os.rename(fullpath, new_fullpath) + sys.stderr.write("%srenamed to %s%s\n" % (YELLOW, new_filename, RESET)) + return 0 + + +def touch_cli(args): + """CLI wrapper around touch.""" + touch(args.filename) @@ -13,6 +13,7 @@ import dateutil.parser from utils import utils from cli import cli +from cli import post def main(): @@ -26,7 +27,7 @@ def main(): "new_post", aliases=["n", "new"], description="Create a new post with metadata pre-filled.") parser_new_post.add_argument("title", help="title of the new post") - parser_new_post.set_defaults(func=cli.new_post_cli) + parser_new_post.set_defaults(func=post.new_post_cli) parser_new_post = subparsers.add_parser( "touch", aliases=["t", "tou"], @@ -41,7 +42,7 @@ def main(): parser_new_post.add_argument("filename", help="path or basename of the source file, " "e.g., 2015-05-05-new-blog-new-start.md") - parser_new_post.set_defaults(func=cli.touch_cli) + parser_new_post.set_defaults(func=post.touch_cli) parser_generate = subparsers.add_parser( "generate", aliases=["g", "gen"], @@ -71,7 +72,7 @@ def main(): parser_new_post = subparsers.add_parser( "edit", aliases=["e", "ed"], description="Bring up post selector to select post for editing.") - parser_new_post.set_defaults(func=cli.edit_existing_post) + parser_new_post.set_defaults(func=post.edit_existing_post) with utils.init_colorama(): args = parser.parse_args() |