From 5d768ad25c9d614acd54a692d1d7becadb6b82df Mon Sep 17 00:00:00 2001 From: MinchinWeb Date: Tue, 14 Apr 2015 15:49:58 -0600 Subject: [PATCH] Add YAML export --- jrnl/plugins/yaml_exporter.py | 70 +++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 jrnl/plugins/yaml_exporter.py diff --git a/jrnl/plugins/yaml_exporter.py b/jrnl/plugins/yaml_exporter.py new file mode 100644 index 00000000..1e00cf2f --- /dev/null +++ b/jrnl/plugins/yaml_exporter.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python +# encoding: utf-8 + +from __future__ import absolute_import, unicode_literals, print_function +from .text_exporter import TextExporter +import re +import sys +import yaml + + +class MarkdownExporter(TextExporter): + """This Exporter can convert entries and journals into Markdown with YAML front matter.""" + names = ["yaml"] + extension = "md" + + @classmethod + def export_entry(cls, entry, to_multifile=True): + """Returns a markdown representation of a single entry, with YAML front matter.""" + if to_multifile is False: + print("{}ERROR{}: YAML export must be to individual files. Please specify a directory to export to.".format("\033[31m", "\033[0m", file=sys.stderr)) + return + + date_str = entry.date.strftime(entry.journal.config['timeformat']) + body_wrapper = "\n" if entry.body else "" + body = body_wrapper + entry.body + + '''Increase heading levels in body text''' + newbody = '' + heading = '###' + previous_line = '' + warn_on_heading_level = False + for line in entry.body.splitlines(True): + if re.match(r"#+ ", line): + """ATX style headings""" + newbody = newbody + previous_line + heading + line + if re.match(r"#######+ ", heading + line): + warn_on_heading_level = True + line = '' + elif re.match(r"=+$", line) and not re.match(r"^$", previous_line): + """Setext style H1""" + newbody = newbody + heading + "# " + previous_line + line = '' + elif re.match(r"-+$", line) and not re.match(r"^$", previous_line): + """Setext style H2""" + newbody = newbody + heading + "## " + previous_line + line = '' + else: + newbody = newbody + previous_line + previous_line = line + newbody = newbody + previous_line # add very last line + + if warn_on_heading_level is True: + print("{}WARNING{}: Headings increased past H6 on export - {} {}".format("\033[33m", "\033[0m", date_str, entry.title), file=sys.stderr) + + # top = yaml.dump(entry) + + return "title: {title}\ndate: {date}\nstared: {stared}\ntags: {tags}\n{body} {space}".format( + date=date_str, + title=entry.title, + stared=entry.starred, + tags=', '.join([tag[1:] for tag in entry.tags]), + body=newbody, + space="" + ) + + @classmethod + def export_journal(cls, journal): + """Returns an error, as YAML export requires a directory as a target.""" + print("{}ERROR{}: YAML export must be to individual files. Please specify a directory to export to.".format("\033[31m", "\033[0m", file=sys.stderr)) + return