-
-
Save fofr/8922295 to your computer and use it in GitHub Desktop.
Format sifttter logs into daily markdown files
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/ruby | |
# Convert Sifttter logs into markdown files, one per day <http://paulrhayes.com> | |
# Based on Sifttter: An IFTTT-to-Day One Logger by Craig Eley 2014 <http://craigeley.com> | |
# Based on tp-dailylog.rb by Brett Terpstra 2012 <http://brettterpstra.com> | |
# | |
# Notes: | |
# * Uses `mdfind` to locate a specific folder of IFTTT-generated text files | |
# * The location of your folder should be hardcoded in line 23 | |
# * Scans leading timestamps in each line matching formatted_date's date | |
# * Does not alter text files in any way | |
# * Changes ampersand ('&') to 'and' so the script keeps running | |
# * Saves generated markdown into the specified directory | |
# * Creates one file per day in the format yyyy-mm-dd.md | |
# * Accepts options for specified date or range of dates, defaults to today | |
require 'time' | |
require 'erb' | |
require 'date' | |
require 'optparse' | |
options = {} | |
OptionParser.new do |opts| | |
opts.banner = "Usage: sifttter.rb [options]" | |
opts.on('-d', '--date DATE', 'Date to generate - Any parseable date string') { |v| options[:date] = v } | |
opts.on('-s', '--start START', 'Start date - Use with end to generate a range of dates') { |v| options[:start_date] = v } | |
opts.on('-e', '--end END', 'End date - Use with start to generate a range of dates') { |v| options[:end_date] = v } | |
end.parse! | |
if options[:start_date] && options[:end_date] | |
start_date = Date.parse(options[:start_date]) | |
end_date = Date.parse(options[:end_date]) | |
date_range = (start_date..end_date).map { |date| date } | |
else | |
date = options[:date] ? Date.parse(options[:date]) : Time.now() | |
date_range = [date] | |
end | |
output_path = '/Users/USERNAME/Dropbox/IFTTT/Sifttter/Markdown/' | |
files = %x{mdfind -onlyin /Users/USERNAME/Dropbox/IFTTT/Sifttter -name '.txt' | grep -v -i daily | sort} | |
date_range.each do |date| | |
formatted_date = date.strftime('%B %d, %Y') | |
filename = date.strftime('%Y-%m-%d') | |
projects = [] | |
files.split("\n").each do |file| | |
if File.exists?(file.strip) | |
f = File.open(file.strip, encoding: 'UTF-8') | |
lines = f.read | |
f.close | |
# Uses filename as header for section, strips out filetype | |
project = "## " + File.basename(file).gsub(/^.*?\/([^\/]+)$/,"\\1").capitalize + "\n" | |
found_completed = false | |
lines.each_line do |line| | |
if line =~ /&/ | |
line.gsub!(/[&]/, 'and') | |
end | |
if line =~ /#{formatted_date}/ | |
found_completed = true | |
# Removes formatted date and @done pattern from entry | |
project += line.gsub(/@done/,'').gsub(/#{formatted_date}.../,'').strip + "\n" | |
end | |
end | |
end | |
if found_completed | |
projects.push(project) | |
end | |
end | |
if projects.length > 0 | |
entrytext = "# Things done on #{formatted_date}\n\n" | |
projects.each do |project| | |
entrytext += project.gsub(/.txt/, ' ') + "\n" | |
end | |
file = "#{output_path}#{filename}.md" | |
fh = File.new(File.expand_path(file),'w+') | |
fh.puts entrytext | |
fh.close | |
puts "#{formatted_date} - #{file} generated" | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment