bce8dc3c93a098da23e5638b3353b5faaf85014d
.style.yapf
| ... | ... | @@ -8,6 +8,7 @@ blank_line_before_module_docstring=True |
| 8 | 8 | blank_lines_around_top_level_definition=1 |
| 9 | 9 | coalesce_brackets=True |
| 10 | 10 | column_limit=80 |
| 11 | +continuation_indent_width=2 |
|
| 11 | 12 | dedent_closing_brackets=True |
| 12 | 13 | indent_dictionary_value=True |
| 13 | 14 | indent_width=2 |
pages/essays.md
| ... | ... | @@ -20,6 +20,9 @@ Not all essays here are of a spiritual nature. Some, like **A Vision of |
| 20 | 20 | Saturn**, are more of a personal commentary or thought. |
| 21 | 21 | |
| 22 | 22 | --- |
| 23 | +<<ListMdFiles('essays')>> |
|
| 24 | + |
|
| 25 | +--- |
|
| 23 | 26 | |
| 24 | 27 | [Rights, Powers and Principles](essays/rights-powers-principles) |
| 25 | 28 |
post2md
| ... | ... | @@ -3,61 +3,100 @@ |
| 3 | 3 | import argparse |
| 4 | 4 | import json |
| 5 | 5 | import textwrap |
| 6 | -#import sys |
|
| 7 | -import os |
|
| 8 | 6 | |
| 9 | -from jinja2 import Environment, FileSystemLoader, select_autoescape |
|
| 7 | +from jinja2 import Environment |
|
| 10 | 8 | |
| 11 | 9 | ############################################################################## |
| 10 | +# Argument |
|
| 11 | + |
|
| 12 | +json_filename = '' |
|
| 13 | + |
|
| 14 | +#----------------------------------------------------------------------------- |
|
| 15 | +def load_json(filename): |
|
| 16 | + try: |
|
| 17 | + global json_filename |
|
| 18 | + |
|
| 19 | + with open(filename, 'r') as file: |
|
| 20 | + json_filename = filename |
|
| 21 | + return json.load(file) |
|
| 22 | + |
|
| 23 | + except FileNotFoundError: |
|
| 24 | + raise argparse.ArgumentTypeError(f"The file {filename} does not exist.") |
|
| 25 | + |
|
| 26 | + except json.JSONDecodeError: |
|
| 27 | + raise argparse.ArgumentTypeError( |
|
| 28 | + f"The file {filename} could not be parsed as JSON." |
|
| 29 | + ) |
|
| 30 | + |
|
| 31 | +#----------------------------------------------------------------------------- |
|
| 12 | 32 | def parse_arguments(): |
| 13 | 33 | parser = argparse.ArgumentParser( |
| 14 | - description='Convert JSON data from a Reddit post to Markdown format.' |
|
| 34 | + description='Convert JSON data from a Reddit post to Markdown format.' |
|
| 15 | 35 | ) |
| 16 | 36 | |
| 17 | 37 | parser.add_argument( |
| 18 | - 'jsonfile', help='The JSON file containing the Reddit post data.' |
|
| 38 | + '-j', '--jsonfile', dest="post_data", type=load_json, help="Path to the JSON file to load" |
|
| 19 | 39 | ) |
| 20 | 40 | |
| 21 | 41 | parser.add_argument( |
| 22 | - '-t', |
|
| 23 | - '--title', |
|
| 24 | - help='Override the post title with a custom title.', |
|
| 25 | - default=None |
|
| 42 | + '-t', |
|
| 43 | + '--title', |
|
| 44 | + help='Override the post title with a custom title.', |
|
| 45 | + default=None |
|
| 26 | 46 | ) |
| 27 | 47 | |
| 28 | - args = parser.parse_args() |
|
| 29 | - return args |
|
| 48 | + return parser.parse_args() |
|
| 30 | 49 | |
| 31 | 50 | ############################################################################## |
| 32 | 51 | # Jinja Stuff |
| 33 | 52 | |
| 34 | 53 | #----------------------------------------------------------------------------- |
| 35 | -def wrap_text(text, width=80): |
|
| 54 | +def wrap_text(text, width=80, prefix=''): |
|
| 55 | + initial = prefix |
|
| 56 | + subsequent = prefix |
|
| 36 | 57 | |
| 37 | - return textwrap.fill(text, width) |
|
| 58 | + paragraphs = text.split('\n\n') |
|
| 59 | + |
|
| 60 | + wrapped = [ |
|
| 61 | + textwrap.fill( |
|
| 62 | + paragraph, |
|
| 63 | + width, |
|
| 64 | + break_long_words=False, |
|
| 65 | + initial_indent=initial, |
|
| 66 | + subsequent_indent=subsequent |
|
| 67 | + ) for paragraph in paragraphs |
|
| 68 | + ] |
|
| 69 | + |
|
| 70 | + return f"\n{prefix}\n".join(wrapped) |
|
| 38 | 71 | |
| 39 | 72 | #----------------------------------------------------------------------------- |
| 40 | -env = Environment( |
|
| 41 | - loader=FileSystemLoader(os.path.join(os.path.dirname(__file__), '..')), |
|
| 42 | - lstrip_blocks=False, |
|
| 43 | - trim_blocks=False |
|
| 44 | -) |
|
| 73 | +env = Environment(lstrip_blocks=False, trim_blocks=False) |
|
| 45 | 74 | |
| 46 | 75 | env.filters['wrap'] = wrap_text |
| 47 | 76 | |
| 48 | 77 | article_j2 = """--- |
| 49 | 78 | title: {{ post.title }} |
| 79 | +tags: |
|
| 80 | + - reddit post |
|
| 50 | 81 | --- |
| 51 | 82 | --- |
| 52 | -{% filter wrap %} |
|
| 83 | + |
|
| 84 | +{% filter wrap -%} |
|
| 53 | 85 | This is a post I submitted to |
| 54 | 86 | [{{ post.subreddit }}]({{ post.url }}) |
| 55 | 87 | with some selected comment threads. If you wish to be credited for your |
| 56 | 88 | comment please let me know and I'll add your name to your comment. |
| 57 | 89 | {% endfilter %} |
| 90 | + |
|
| 58 | 91 | --- |
| 59 | 92 | |
| 60 | 93 | {{ post.text | wrap }} |
| 94 | + |
|
| 95 | +--- |
|
| 96 | +{% for comment in comments %} |
|
| 97 | +Comment: |
|
| 98 | +{{ comment.text | wrap(prefix='> ') }} |
|
| 99 | +{% endfor %} |
|
| 61 | 100 | """ |
| 62 | 101 | |
| 63 | 102 | template = env.from_string(article_j2) |
| ... | ... | @@ -68,40 +107,38 @@ def extract_post(json): |
| 68 | 107 | data = json[0]['data']['children'][0]['data'] |
| 69 | 108 | |
| 70 | 109 | post = { |
| 71 | - "subreddit": data["subreddit_name_prefixed"], |
|
| 72 | - "url": data["url"], |
|
| 73 | - "title": data["title"], |
|
| 74 | - "text": data["selftext"], |
|
| 110 | + "subreddit": data["subreddit_name_prefixed"], |
|
| 111 | + "url": data["url"], |
|
| 112 | + "title": data["title"], |
|
| 113 | + "text": data["selftext"], |
|
| 75 | 114 | } |
| 76 | 115 | |
| 77 | 116 | return post |
| 78 | 117 | |
| 79 | 118 | #----------------------------------------------------------------------------- |
| 80 | -def json_to_markdown(json_data, custom_title=None): |
|
| 81 | -# comments_data = json_data[1]['data']['children'] |
|
| 119 | +def extract_comments(json): |
|
| 120 | + data = json[1]['data']['children'] |
|
| 82 | 121 | |
| 83 | - post = extract_post(json_data) |
|
| 84 | - if custom_title: |
|
| 85 | - post["title"] = custom_title |
|
| 122 | + comments = [] |
|
| 86 | 123 | |
| 87 | -# for comment in comments_data: |
|
| 88 | -# comment_body = textwrap.fill(comment['data']['body'], width=80) |
|
| 89 | -# markdown_content += f"## Comment\n\n{comment_body}\n\n" |
|
| 90 | -# |
|
| 91 | -# return markdown_content |
|
| 92 | -# |
|
| 93 | - markdown = template.render(post=post).strip() |
|
| 124 | + for d in data: |
|
| 125 | + c = {"text": d["data"]["body"]} |
|
| 126 | + comments.append(c) |
|
| 94 | 127 | |
| 95 | - return markdown |
|
| 128 | + return comments |
|
| 96 | 129 | |
| 97 | 130 | #----------------------------------------------------------------------------- |
| 98 | -def convert(jsonfile, custom_title=None): |
|
| 99 | - with open(jsonfile, 'r') as json_file: |
|
| 100 | - json_data = json.load(json_file) |
|
| 101 | - markdown_content = json_to_markdown(json_data, custom_title) |
|
| 102 | - print(markdown_content) |
|
| 131 | +def convert(data, title=None): |
|
| 132 | + post = extract_post(data) |
|
| 133 | + if title: |
|
| 134 | + post["title"] = title |
|
| 135 | + |
|
| 136 | + comments = extract_comments(data) |
|
| 137 | + |
|
| 138 | + return template.render(post=post, comments=comments).strip() |
|
| 103 | 139 | |
| 104 | 140 | ############################################################################## |
| 105 | 141 | if __name__ == "__main__": |
| 106 | 142 | args = parse_arguments() |
| 107 | - convert(args.jsonfile, args.title) |
|
| 143 | + content = convert(args.post_data, args.title) |
|
| 144 | + print(f"{content}") |