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:

NLP Popup

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:

NLP Macro

 

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