From 5408f60db3f5828a7b57a57b582fbf3e33bf3fd5 Mon Sep 17 00:00:00 2001 From: Aniket Pant Date: Fri, 21 Jun 2013 19:22:02 +0530 Subject: [PATCH] Add new export option Support for json and md retained All export types moved to --export except tags Signed-off-by: Aniket Pant --- jrnl/exporters.py | 44 +++++++++++++++++++++++++++++++++++++++++--- jrnl/jrnl.py | 20 +++++++++++++------- 2 files changed, 54 insertions(+), 10 deletions(-) diff --git a/jrnl/exporters.py b/jrnl/exporters.py index 4a4b0245..bba105a0 100644 --- a/jrnl/exporters.py +++ b/jrnl/exporters.py @@ -1,6 +1,9 @@ #!/usr/bin/env python # encoding: utf-8 +import os +try: from slugify import slugify +except ImportError: import slugify try: import simplejson as json except ImportError: import json @@ -28,16 +31,18 @@ def to_tag_list(journal): result += "\n".join(u"{0:20} : {1}".format(tag, n) for n, tag in sorted(tag_counts, reverse=False)) return result -def to_json(journal): +def to_json(journal, output): """Returns a JSON representation of the Journal.""" tags = get_tags_count(journal) result = { "tags": dict((tag, count) for count, tag in tags), "entries": [e.to_dict() for e in journal.entries] } + if output is not False: + write_file(json.dumps(result, indent=2), output) return json.dumps(result, indent=2) -def to_md(journal): +def to_md(journal, output): """Returns a markdown representation of the Journal""" out = [] year, month = -1, -1 @@ -51,4 +56,37 @@ def to_md(journal): out.append(e.date.strftime("%B")) out.append('-' * len(e.date.strftime("%B")) + "\n") out.append(e.to_md()) - return "\n".join(out) + result = "\n".join(out) + if output is not False: + write_file(result, output) + return result + +def to_txt(journal, output): + """Returns the complete text of the Journal.""" + if output is not False: + write_file(unicode(journal), output) + return unicode(journal) + +def to_files(journal, output): + """Turns your journal into separate files for each entry.""" + if output is False: + output = journal.config['folder'] + "*.txt" # default path + path, extension = os.path.splitext(os.path.expanduser(output)) + head, tail = os.path.split(path) + if tail == '*': # if wildcard is specified + path = head + '/' + if not os.path.exists(path): # if the folder doesn't exist, create it + os.makedirs(path) + for e in journal.entries: + date = e.date.strftime('%Y-%m-%d') + title = slugify(unicode(e.title)) + filename = date + '-' + title + fullpath = path + filename + extension + write_file(unicode(e), fullpath) + return ("Journal exported") + +def write_file(content, path): + """Writes content to the file provided""" + f = open(path, 'w+') + f.write(content) + f.close() diff --git a/jrnl/jrnl.py b/jrnl/jrnl.py index 2af9b60c..f23cc799 100755 --- a/jrnl/jrnl.py +++ b/jrnl/jrnl.py @@ -45,8 +45,8 @@ def parse_args(): exporting = parser.add_argument_group('Export / Import', 'Options for transmogrifying your journal') exporting.add_argument('--tags', dest='tags', action="store_true", help='Returns a list of all tags and number of occurences') - exporting.add_argument('--json', dest='json', action="store_true", help='Returns a JSON-encoded version of the Journal') - exporting.add_argument('--markdown', dest='markdown', action="store_true", help='Returns a Markdown-formated version of the Journal') + exporting.add_argument('--export', metavar='TYPE', dest='export', help='Export your journal to Markdown, JSON, Text or multiple files', nargs='?', default=False, const=None) + exporting.add_argument('-o', metavar='OUTPUT', dest='output', help='The output of the file can be provided when using with --export', nargs='?', default=False, const=None) exporting.add_argument('--encrypt', metavar='FILENAME', dest='encrypt', help='Encrypts your existing journal with a new password', nargs='?', default=False, const=None) exporting.add_argument('--decrypt', metavar='FILENAME', dest='decrypt', help='Decrypts your journal and stores it in plain text', nargs='?', default=False, const=None) exporting.add_argument('--delete-last', dest='delete_last', help='Deletes the last entry from your journal file.', action="store_true") @@ -57,7 +57,7 @@ def guess_mode(args, config): """Guesses the mode (compose, read or export) from the given arguments""" compose = True export = False - if args.json or args.decrypt is not False or args.encrypt is not False or args.markdown or args.tags or args.delete_last: + if args.decrypt is not False or args.encrypt is not False or args.export is not False or args.tags or args.delete_last: compose = False export = True elif args.start_date or args.end_date or args.limit or args.strict or args.short: @@ -190,11 +190,17 @@ def cli(): elif args.tags: print(exporters.to_tag_list(journal)) - elif args.json: # export to json - print(exporters.to_json(journal)) + elif args.export == 'json': # export to json + print(exporters.to_json(journal, args.output)) - elif args.markdown: # export to json - print(exporters.to_md(journal)) + elif args.export == 'markdown' or args.export == 'md': # export to markdown + print(exporters.to_md(journal, args.output)) + + elif args.export == 'text' or args.export == 'txt': # export to text + print(exporters.to_txt(journal, args.output)) + + elif args.export == 'files': # export to files + print(exporters.to_files(journal, args.output)) elif (args.encrypt is not False or args.decrypt is not False) and not PYCRYPTO: print("PyCrypto not found. To encrypt or decrypt your journal, install the PyCrypto package from http://www.pycrypto.org.")