mirror of
https://github.com/jrnl-org/jrnl.git
synced 2025-05-10 16:48:31 +02:00
Merge 99fa0fd4f0
into 9a55b2c81b
This commit is contained in:
commit
dc170de2e8
6 changed files with 67 additions and 14 deletions
|
@ -37,6 +37,7 @@ class Journal(object):
|
||||||
'tagsymbols': '@',
|
'tagsymbols': '@',
|
||||||
'highlight': True,
|
'highlight': True,
|
||||||
'linewrap': 80,
|
'linewrap': 80,
|
||||||
|
'folder': os.path.expanduser("~/journal/"),
|
||||||
}
|
}
|
||||||
self.config.update(kwargs)
|
self.config.update(kwargs)
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,20 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# encoding: utf-8
|
# encoding: utf-8
|
||||||
|
|
||||||
|
import os
|
||||||
|
try: from slugify import slugify
|
||||||
|
except ImportError: import slugify
|
||||||
try: import simplejson as json
|
try: import simplejson as json
|
||||||
except ImportError: import json
|
except ImportError: import json
|
||||||
|
|
||||||
def to_json(journal):
|
def to_json(journal, output):
|
||||||
"""Returns a JSON representation of the Journal."""
|
"""Returns a JSON representation of the Journal."""
|
||||||
return json.dumps([e.to_dict() for e in journal.entries], indent=2)
|
result = json.dumps([e.to_dict() for e in journal.entries], indent=2)
|
||||||
|
if output is not False:
|
||||||
|
write_file(result, output)
|
||||||
|
return result
|
||||||
|
|
||||||
def to_md(journal):
|
def to_md(journal, output):
|
||||||
"""Returns a markdown representation of the Journal"""
|
"""Returns a markdown representation of the Journal"""
|
||||||
out = []
|
out = []
|
||||||
year, month = -1, -1
|
year, month = -1, -1
|
||||||
|
@ -22,4 +28,39 @@ def to_md(journal):
|
||||||
out.append(e.date.strftime("%B"))
|
out.append(e.date.strftime("%B"))
|
||||||
out.append('-' * len(e.date.strftime("%B")) + "\n")
|
out.append('-' * len(e.date.strftime("%B")) + "\n")
|
||||||
out.append(e.to_md())
|
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(str(journal), output)
|
||||||
|
return 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
|
||||||
|
result = str(e)
|
||||||
|
fullpath = path + filename + extension
|
||||||
|
print fullpath
|
||||||
|
write_file(result, fullpath)
|
||||||
|
return ("Journal exported")
|
||||||
|
|
||||||
|
def write_file(content, path):
|
||||||
|
"""Writes content to the file provided"""
|
||||||
|
f = open(path, 'w+')
|
||||||
|
f.write(content)
|
||||||
|
f.close()
|
||||||
|
|
|
@ -29,6 +29,7 @@ default_config = {
|
||||||
'tagsymbols': '@',
|
'tagsymbols': '@',
|
||||||
'highlight': True,
|
'highlight': True,
|
||||||
'linewrap': 80,
|
'linewrap': 80,
|
||||||
|
'folder': os.path.expanduser("~/journal/"),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -91,4 +92,7 @@ def install_jrnl(config_path='~/.jrnl_config'):
|
||||||
config['password'] = password
|
config['password'] = password
|
||||||
return config
|
return config
|
||||||
|
|
||||||
|
# Where to export files?
|
||||||
|
path_query = 'Path to your journal folder (leave blank for ~/journal): '
|
||||||
|
folder_path = raw_input(path_query).strip() or os.path.expanduser('~/journal')
|
||||||
|
default_config['folder'] = os.path.expanduser(folder_path)
|
||||||
|
|
22
jrnl/jrnl.py
22
jrnl/jrnl.py
|
@ -42,9 +42,9 @@ def parse_args():
|
||||||
reading.add_argument('-short', dest='short', action="store_true", help='Show only titles or line containing the search tags')
|
reading.add_argument('-short', dest='short', action="store_true", help='Show only titles or line containing the search tags')
|
||||||
|
|
||||||
exporting = parser.add_argument_group('Export / Import', 'Options for transmogrifying your journal')
|
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('--tags', dest='tags', action="store_true", help='Returns a list of all tags and number of occurrences')
|
||||||
exporting.add_argument('--json', dest='json', action="store_true", help='Returns a JSON-encoded 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('--markdown', dest='markdown', action="store_true", help='Returns a Markdown-formated version of the Journal')
|
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('--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('--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")
|
exporting.add_argument('--delete-last', dest='delete_last', help='Deletes the last entry from your journal file.', action="store_true")
|
||||||
|
@ -55,7 +55,7 @@ def guess_mode(args, config):
|
||||||
"""Guesses the mode (compose, read or export) from the given arguments"""
|
"""Guesses the mode (compose, read or export) from the given arguments"""
|
||||||
compose = True
|
compose = True
|
||||||
export = False
|
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
|
compose = False
|
||||||
export = True
|
export = True
|
||||||
elif args.start_date or args.end_date or args.limit or args.strict or args.short:
|
elif args.start_date or args.end_date or args.limit or args.strict or args.short:
|
||||||
|
@ -196,11 +196,17 @@ def cli():
|
||||||
elif args.tags:
|
elif args.tags:
|
||||||
print_tags(journal)
|
print_tags(journal)
|
||||||
|
|
||||||
elif args.json: # export to json
|
elif args.export == 'json': # export to json
|
||||||
print(exporters.to_json(journal))
|
print(exporters.to_json(journal, args.output))
|
||||||
|
|
||||||
elif args.markdown: # export to json
|
elif args.export == 'markdown' or args.export == 'md': # export to markdown
|
||||||
print(exporters.to_md(journal))
|
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:
|
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.")
|
print("PyCrypto not found. To encrypt or decrypt your journal, install the PyCrypto package from http://www.pycrypto.org.")
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
clint >= 0.3.1
|
clint >= 0.3.1
|
||||||
parsedatetime == 1.1.2
|
parsedatetime == 1.1.2
|
||||||
|
slugify==0.0.1
|
||||||
|
|
2
setup.py
2
setup.py
|
@ -56,7 +56,7 @@ setup(
|
||||||
version = "1.0.1",
|
version = "1.0.1",
|
||||||
description = "A command line journal application that stores your journal in a plain text file",
|
description = "A command line journal application that stores your journal in a plain text file",
|
||||||
packages = ['jrnl'],
|
packages = ['jrnl'],
|
||||||
install_requires = ["parsedatetime >= 1.1.2"],
|
install_requires = ["parsedatetime >= 1.1.2", "slugify >= 0.0.1"],
|
||||||
extras_require = {
|
extras_require = {
|
||||||
'encryption': ["pycrypto"],
|
'encryption': ["pycrypto"],
|
||||||
'highlight': ["clint"]
|
'highlight': ["clint"]
|
||||||
|
|
Loading…
Add table
Reference in a new issue