Извлечь распознанную строку даты, переданную методу разбора в Chronic

Я хотел бы подражать функциональности быстрого события календаря Mac или быстрого входа Fantastical. Используя камень Chronic, я могу передать строку вроде:

"Today at 3pm"
=> 2014-01-24 15:00:00 -0600 

Хронический анализ не работает, если вы передаете что-то вроде:

"Eat at Joes Today at 3pm" 
=> nil

До сих пор я использовал простое регулярное выражение для разбиения строки на слово, обычно используемое для возврата даты в Chronic. Начальное регулярное выражение простое:

scan(/(.+)(tomorrow{1}.+|in\s.+|next\s.+|today\s.+)/)

Это возвращает массив с заголовком, если хотите, и строкой, которую я хочу отправить в Chronic для анализа.

Два вопроса:

  1. Это действительно лучший способ сделать это? Я должен был бы предоставить какое-нибудь мега-регулярное выражение для разбиения любой строки, которую, я думаю, мои пользователи отправят сюда
  2. Будет ли лучше взломать Chronic? Это уже разбирает даты для меня, но моя первоначальная мысль - нет, потому что если вы сдадите Eat at Joes Today at 3pm к Chronic.parse, он вернет ноль. Кажется, он не распознает часть строки для форматирования даты в ее нынешнем виде.

1 ответ

Решение

Я бы не стал редактировать Chronic. Единственная функция Chronic - это анализ даты и времени на естественном языке, а не другой ввод. Вы можете быть заинтересованы в Nickel жемчужина здесь:

https://github.com/iainbeeston/nickel

Это отделяет время от другого языка.

n = Nickel.parse("use the force on july 1st at 9am", Time.now)
n.message                       #=> "use the force"
n.occurrences.first.start_date  #=> "20110701"
Другие вопросы по тегам