Natural Language Date Replacements
Brett Terpstra just posted a very nice tool for inserting dates using Natural Language. His post is definitely worth a read.
Given my preference for Python and my previous experience with Natural Language Processing, I decided to implement something similar through a Keyboard Maestro trigger.
I have a macro that pops up a text box and asks for the date language you would like to interpret. Apparently KBM does have a leg up on TextExpander, in that it can accept input to a shell script or applescript. KBM truly is a fantastic tool.
I ended up with a really easy workflow that seems to work everywhere.
Step 1.
If I type "ndate" I get a pop-up:
Step 2.
I type a string and hit return.
There is no step 3.
I then get the string "2011-09-02 09:00:00" dropped in as a replacement.
Here's the macro design:
Here's the shell script (mostly python) that does all of the work. Don't forget the hash-bang at the beginning.
:::python
#!/usr/bin/env python
import os
import sys
import re
import parsedatetime.parsedatetime as pdt
import parsedatetime.parsedatetime_consts as pdc
import datetime
# Define Globals
pyDate = os.getenv('KMVAR_myDate')
# Function for parsing a string and returning a datetime value
def datetimeFromString( s ):
c = pdc.Constants()
p = pdt.Calendar(c)
result, what = p.parse( s )
dt = 0
# See: http://stackoverflow.com/questions/1810432/handling-the-different-results-from-parsedatetime
# what was returned (see http://code-bear.com/code/parsedatetime/docs/)
# 0 = failed to parse
# 1 = date (with current time, as a struct_time)
# 2 = time (with current date, as a struct_time)
# 3 = datetime
if what in (1,2,3):
# result is struct_time
dt = datetime.datetime( *result[:6] )
if what == 0:
# Failed to parse
raise ValueError, ("Don't understand date '"+s+"'")
dt = "Unrecognized Date"
return dt
NLPDate = datetimeFromString(pyDate)
print NLPDate