Skip to content

Instantly share code, notes, and snippets.

@vrypan
Last active December 24, 2015 06:29
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vrypan/6757242 to your computer and use it in GitHub Desktop.
Save vrypan/6757242 to your computer and use it in GitHub Desktop.
Quick'n'dirty script to generate bucket3 posts from DayOne journal entries. Only entries with tag 'blog' will be published, the rest are ignored.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Usage:
dayone-to-b3.py [options]
Options:
-p, --path=<path> top directory of your blog. [default: .]
"""
from bucket3 import b3tools
import plistlib
import os
from docopt import docopt
import re
import unidecode
import shutil
def slugify(str):
# Credit: http://stackoverflow.com/a/8366771
str = unidecode.unidecode(str).lower()
return re.sub(r'\W+','-',str)
DropBox = '/Users/vrypan/Dropbox/'
DayOne_dir = os.path.join(DropBox, 'Apps', 'Day One', 'Journal.dayone')
TEMPLATE = """---
title: >
%s
date: %s
slug: %s
tags: %s
attached: %s
location: %s
weather: %s
---
%s
"""
args = docopt(__doc__)
conf = b3tools.conf_get(args['--path'])
for f in os.listdir(os.path.join(DayOne_dir, 'entries')):
j = plistlib.readPlist(os.path.join(DayOne_dir, 'entries', f))
if 'Tags' in j and 'blog' in j['Tags']:
text_lines = j['Entry Text'].split('\n')
title = text_lines[0]
body = '\n'.join(text_lines[1:])
slug = slugify(unicode(title))
date = j['Creation Date']
if 'Location' in j:
location = "\n locality: %s\n country: %s\n place: %s\n long: %s\n lat: %s" % (
j['Location']['Locality'],
j['Location']['Country'],
j['Location']['Place Name'],
j['Location']['Longitude'],
j['Location']['Latitude']
)
else:
location = ""
if 'Weather' in j:
weather = "\n C: %s\n F: %s\n description: %s\n icon: %s" % (
j['Weather']['Celsius'],
j['Weather']['Fahrenheit'],
j['Weather']['Description'],
j['Weather']['IconName']
)
else:
weather = ""
tags = ', '.join(
[t for t in j['Tags'] if t != 'blog' ]
)
image_path = os.path.join(DayOne_dir, 'photos', '%s.jpg' % j['UUID'])
if os.path.isfile(image_path):
image = '%s.jpg' % j['UUID']
body = "![photo](%s)\n\n%s" % (image, body)
else:
image = ''
post = TEMPLATE % (
title,
date,
slug,
tags,
image,
location,
weather,
body,
)
prefix = j['Creation Date'].strftime('%y%m%d')
dirname = os.path.join(
conf['root_dir'],
'posts',
'dayone',
"%s-%s" % (prefix, slug)
)
filename = os.path.join(dirname, "%s-%s.%s" % (prefix, slug, 'md'))
if not os.path.exists(dirname):
os.mkdir(dirname)
f = open(filename, 'w')
f.write(post.encode('utf8'))
f.close()
print "Created %s." % filename
if image:
shutil.copy2(
image_path,
dirname
)
print "Copied %s" % image
else:
print '%s already exists.' % dirname
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment