2013-06-14 10 views
2

In Chronic 0.9.1, при разборе Febr 2013 Я получаю результат June 2013. Feb 2013 разобран штрафом, но Febr 2013 нет.Почему Chronic неправильно обрабатывает четыре месяца письма?

Я думаю, что проблема заключается в том, что аббревиатура месяца имеет четыре буквы.

мне нужно:

  • Анализировать Febr 2013 к February 2013 или
  • Invalidate Febr 2013.

Для проверки даты я использую:

Chronic.parse(params[:date]).blank? 

Является ли это ошибка? Могу ли я сделать работу вокруг? Или, есть правильный способ проверить это?

+0

Спасибо за редактирование :) –

ответ

2

Технически это ошибка, но я более склонен назвать это дырой в своей логике. Вот как Chronic::Repeater.scan_for_month_names решает, что в месяц: имена

Месяц являются либо три буквы, или полное имя.

Вы можете извлечь этот метод из источника, изменить шаблоны в соответствии с вашими потребностями, а затем перезаписать этот метод вместе с отправкой его в виде патча, чтобы настройка была добавлена ​​к будущим версиям драгоценного камня. Или вы можете изменить входящую строку, выполнив поиск трехбуквенных аббревиатур в начале слова и обрезая посторонние символы.


ОК, вот что-то жевать:

require 'abbrev' 

MONTHS = %w[ 
    january 
    february 
    march 
    april 
    may 
    june 
    july 
    august 
    september 
    october 
    november 
    december 
] 

MONTHS_ABBREV = Abbrev.abbrev(MONTHS) 
MONTHS_REGEX = /\b(?:j(?:a(?:n(?:u(?:a(?:ry?)?)?)?)?|u(?:ly?|ne?))|s(?:e(?:p(?:t(?:e(?:m(?:b(?:er?)?)?)?)?)?)?)?|a(?:u(?:g(?:u(?:st?)?)?)?|p(?:r(?:il?)?)?)|d(?:e(?:c(?:e(?:m(?:b(?:er?)?)?)?)?)?)?|f(?:e(?:b(?:r(?:u(?:a(?:ry?)?)?)?)?)?)?|n(?:o(?:v(?:e(?:m(?:b(?:er?)?)?)?)?)?)?|o(?:c(?:t(?:o(?:b(?:er?)?)?)?)?)?|ma(?:r(?:ch?)?|y))\b/i 

%w[j ja jan janu january f fe feb febr february].each do |m| 
    puts "#{ m } => #{ MONTHS_ABBREV[m[MONTHS_REGEX]] }" 
end 

Какие выходы:

j => 
ja => january 
jan => january 
janu => january 
january => january 
f => february 
fe => february 
feb => february 
febr => february 
february => february 

Другими словами, j не является уникальным, так что это не хит. ja уникален и связан с january, как и остальные тесты ja.... f уникален, поэтому он попадает, как и все остальные тесты f....

Что делает Abbrev.abbrev? Он разбивает слова, переданные в, на минимальные уникальные строки, используемые для определения всего слова. Вот как это выглядит, если я использую только четыре месяца:

require 'abbrev' 

MONTHS = %w[ 
    march 
    may 
    june 
    july 
] 

MONTHS_ABBREV = Abbrev.abbrev(MONTHS) 
pp MONTHS_ABBREV 

Результирующее в:

{"marc"=>"march", 
"mar"=>"march", 
"jun"=>"june", 
"jul"=>"july", 
"march"=>"march", 
"may"=>"may", 
"june"=>"june", 
"july"=>"july"} 

Те делают замечательные стартовые значения для регулярного выражения.

Где я нашел MONTHS_REGEX? Хе-хе ... это какой-то волшебный код Perl, используя небольшой известный модуль под названием Regexp::Assemble, который я очень скучаю по Ruby. Это скучно ... нет, это ... дьявольски хорошо и тесно связано с тем, как Perl что-то делает, и у меня болит голова, когда я читаю его, иначе я бы портировал его.

+0

Я собираюсь вставить это, и я приму ответ! Спасибо, действительно! –

 Смежные вопросы

  • Нет связанных вопросов^_^