#!/usr/bin/env ruby require 'json' require 'chronic' # First, figure out if we have tasks to deal with. tasks = $stdin.filter { |line| line.start_with? '{' } # If this is a creation, we'll only get one event. Count is as both the original and the new. original_json_task, json_task = case tasks.length when 2 then tasks else [tasks.first, tasks.first] end # Finally, actually handle the shorthands. task = JSON.parse(json_task) original_task = JSON.parse(original_json_task) loop do case task['description'] # Wait when /w:([^ ]+)/ task['wait'] = Chronic.parse($1) task['description'].sub!("w:#{$1}", "") # Project when /p:([^ ]+)/ task['project'] = $1 task['description'].sub!("p:#{$1}", "") # Due when /d:([^ ]+)/ task['due'] = Chronic.parse($1) task['description'].sub!("d:#{$1}", "") # Depends when /dep:([^ ]+)/ task['depends'] = $1 task['description'].sub!("dep:#{$1}", "") # Every when /e:([^ ]+)/ task['every'] = $1 task['description'].sub!("e:#{$1}", "") # RecurAfter when /a:([^ ]+)/ task['recur_after'] = $1 task['description'].sub!("a:#{$1}", "") # Scheduled when /s:([^ ]+)/ task['scheduled'] = Chronic.parse($1) task['description'].sub!("s:#{$1}", "") # Once we're out of things to expand, start parsing, and emit. else raise StopIteration end end # If we wound up with no description; e.g. because we were just given things to mod, use the original description. task['description'] = original_task['description'] if task['description'].strip.empty? print task.to_json