From 9588913100979b2a33ab87f60b5233f79c5bdf7d Mon Sep 17 00:00:00 2001 From: Craig Moyer Date: Sun, 29 Sep 2019 08:27:27 -0400 Subject: [PATCH] Syncing with jrnl-org/master --- jrnl/__init__.py | 2 +- jrnl/export.py | 66 ++++++++++++++++++++++++++++++++++ jrnl/install.py | 1 - jrnl/templates/sample.template | 18 ++++++++++ 4 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 jrnl/export.py create mode 100644 jrnl/templates/sample.template diff --git a/jrnl/__init__.py b/jrnl/__init__.py index 15dbedb6..da5c2df9 100644 --- a/jrnl/__init__.py +++ b/jrnl/__init__.py @@ -11,4 +11,4 @@ __title__ = 'jrnl' __version__ = '2.0.0-rc3' __author__ = 'Manuel Ebert' __license__ = 'MIT License' -__copyright__ = 'Copyright 2012 - 2016 Manuel Ebert' +__copyright__ = 'Copyright 2013 - 2015 Manuel Ebert' diff --git a/jrnl/export.py b/jrnl/export.py new file mode 100644 index 00000000..d4873314 --- /dev/null +++ b/jrnl/export.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python +# encoding: utf-8 + +from __future__ import absolute_import, unicode_literals +from .util import ERROR_COLOR, RESET_COLOR +from .util import slugify, u +from .template import Template +import os +import codecs + + +class Exporter(object): + """This Exporter can convert entries and journals into text files.""" + def __init__(self, format): + with open("jrnl/templates/" + format + ".template") as f: + front_matter, body = f.read().strip("-\n").split("---", 2) + self.template = Template(body) + + def export_entry(self, entry): + """Returns a unicode representation of a single entry.""" + return entry.__unicode__() + + def _get_vars(self, journal): + return { + 'journal': journal, + 'entries': journal.entries, + 'tags': journal.tags + } + + def export_journal(self, journal): + """Returns a unicode representation of an entire journal.""" + return self.template.render_block("journal", **self._get_vars(journal)) + + def write_file(self, journal, path): + """Exports a journal into a single file.""" + try: + with codecs.open(path, "w", "utf-8") as f: + f.write(self.export_journal(journal)) + return "[Journal exported to {0}]".format(path) + except IOError as e: + return "[{2}ERROR{3}: {0} {1}]".format(e.filename, e.strerror, ERROR_COLOR, RESET_COLOR) + + def make_filename(self, entry): + return entry.date.strftime("%Y-%m-%d_{0}.{1}".format(slugify(u(entry.title)), self.extension)) + + def write_files(self, journal, path): + """Exports a journal into individual files for each entry.""" + for entry in journal.entries: + try: + full_path = os.path.join(path, self.make_filename(entry)) + with codecs.open(full_path, "w", "utf-8") as f: + f.write(self.export_entry(entry)) + except IOError as e: + return "[{2}ERROR{3}: {0} {1}]".format(e.filename, e.strerror, ERROR_COLOR, RESET_COLOR) + return "[Journal exported to {0}]".format(path) + + def export(self, journal, format="text", output=None): + """Exports to individual files if output is an existing path, or into + a single file if output is a file name, or returns the exporter's + representation as unicode if output is None.""" + if output and os.path.isdir(output): # multiple files + return self.write_files(journal, output) + elif output: # single file + return self.write_file(journal, output) + else: + return self.export_journal(journal) diff --git a/jrnl/install.py b/jrnl/install.py index 2472beb4..77247508 100644 --- a/jrnl/install.py +++ b/jrnl/install.py @@ -50,7 +50,6 @@ default_config = { 'editor': os.getenv('VISUAL') or os.getenv('EDITOR') or "", 'encrypt': False, 'template': False, - 'plugin_path': os.path.join(CONFIG_PATH, 'plugins'), 'default_hour': 9, 'default_minute': 0, 'timeformat': "%Y-%m-%d %H:%M", diff --git a/jrnl/templates/sample.template b/jrnl/templates/sample.template new file mode 100644 index 00000000..983d6af3 --- /dev/null +++ b/jrnl/templates/sample.template @@ -0,0 +1,18 @@ +--- +extension: txt +--- + +{% block journal %} +{% for entry in entries %} +{% include entry %} +{% endfor %} + +{% endblock %} + +{% block entry %} +{{ entry.title }} +{{ "-" * len(entry.title) }} + +{{ entry.body }} + +{% endblock %}