public function testIncompleteRanges()
 {
     $o_tep = new TimeExpressionParser();
     $o_tep->setLanguage('en_US');
     $va_date = getDate();
     $vb_res = $o_tep->parse('August 20 - 27 2011');
     $this->assertEquals($vb_res, true);
     $va_parse = $o_tep->getHistoricTimestamps();
     $this->assertEquals($va_parse['start'], '2011.082000000000');
     $this->assertEquals($va_parse['end'], '2011.082723595900');
     $vb_res = $o_tep->parse('August 20 - 27');
     $this->assertEquals($vb_res, true);
     $va_parse = $o_tep->getHistoricTimestamps();
     $this->assertEquals($va_parse['start'], $va_date['year'] . '.082000000000');
     $this->assertEquals($va_parse['end'], $va_date['year'] . '.082723595900');
     $vb_res = $o_tep->parse('March - June 1850');
     $this->assertEquals($vb_res, true);
     $va_parse = $o_tep->getHistoricTimestamps();
     $this->assertEquals($va_parse['start'], '1850.030100000000');
     $this->assertEquals($va_parse['end'], '1850.063023595900');
 }
Exemplo n.º 2
0
 /**
  * Returns version of label 'display' field value suitable for sorting
  * The sortable value is the same as the display value except when the display value
  * starts with a definite article ('the' in English) or indefinite article ('a' or 'an' in English)
  * in the locale of the label, in which case the article is moved to the end of the sortable value.
  * 
  * What constitutes an article is defined in the TimeExpressionParser localization files. So if the
  * locale of the label doesn't correspond to an existing TimeExpressionParser localization, then
  * the users' current locale setting is used.
  */
 private function _generateSortableValue()
 {
     if ($vs_sort_field = $this->getProperty('LABEL_SORT_FIELD')) {
         $vs_display_field = $this->getProperty('LABEL_DISPLAY_FIELD');
         $o_tep = new TimeExpressionParser();
         $t_locale = new ca_locales();
         $o_tep->setLanguage($t_locale->localeIDToCode($this->get('locale_id')));
         $o_lang_settings = $o_tep->getLanguageSettings();
         $vs_display_value = trim(preg_replace('![^\\p{L}0-9 ]+!u', ' ', $this->get($vs_display_field)));
         $va_definite_articles = $o_lang_settings->get('definiteArticles');
         $va_indefinite_articles = $o_lang_settings->get('indefiniteArticles');
         foreach (array($o_lang_settings->get('definiteArticles'), $o_lang_settings->get('indefiniteArticles')) as $va_articles) {
             if (is_array($va_articles)) {
                 foreach ($va_articles as $vs_article) {
                     if (preg_match('!^(' . $vs_article . ')[ ]+!i', $vs_display_value, $va_matches)) {
                         $vs_display_value = trim(str_replace($va_matches[1], '', $vs_display_value) . ', ' . $va_matches[1]);
                         break 2;
                     }
                 }
             }
         }
         $this->set($vs_sort_field, $vs_display_value);
     }
 }
 /**
  *
  */
 public function refine(&$pa_destination_data, $pa_group, $pa_item, $pa_source_data, $pa_options = null)
 {
     $o_log = isset($pa_options['log']) && is_object($pa_options['log']) ? $pa_options['log'] : null;
     $pm_value = $pa_source_data[$pa_item['source']];
     // not actually used
     $va_item_dest = explode(".", $pa_item['destination']);
     $vs_item_terminal = array_pop($va_item_dest);
     $vs_group_terminal = array_pop($va_item_dest);
     $o_tep = new TimeExpressionParser();
     $o_tep->setLanguage('en_US');
     switch ($vs_mode = $pa_item['settings']['dateJoiner_mode']) {
         default:
         case 'range':
             $vs_date_expression = $pa_item['settings']['dateJoiner_expression'];
             $vs_date_start = $pa_item['settings']['dateJoiner_start'];
             $vs_date_end = $pa_item['settings']['dateJoiner_end'];
             if ($vs_date_expression && ($vs_exp = BaseRefinery::parsePlaceholder($vs_date_expression, $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' ')))) {
                 if ($o_tep->parse($vs_exp)) {
                     return $o_tep->getText();
                 } else {
                     if ($o_log) {
                         $o_log->logWarn(_t('[dateJoinerRefinery] Could not parse date expression %1 assembled from range', $vs_exp));
                     }
                 }
             }
             $va_date = array();
             if ($vs_date_start = BaseRefinery::parsePlaceholder($vs_date_start, $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' '))) {
                 if (!($vs_skip_start_exp = $pa_item['settings']['dateJoiner_skipStartIfExpression']) || !ExpressionParser::evaluate($vs_skip_start_exp, array_merge($pa_source_data, array('start' => $vs_date_start, 'end' => $vs_date_end, 'expression' => $ps_expression)))) {
                     $va_date[] = $vs_date_start;
                 } elseif ($vs_skip_start_replacement = $pa_item['settings']['dateJoiner_skipStartIfExpressionReplacementValue']) {
                     $va_date[] = $vs_skip_start_replacement;
                 }
             }
             if ($vs_date_end = BaseRefinery::parsePlaceholder($vs_date_end, $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' '))) {
                 if (!($vs_skip_end_exp = $pa_item['settings']['dateJoiner_skipEndIfExpression']) || !ExpressionParser::evaluate($vs_skip_end_exp, array_merge($pa_source_data, array('start' => $vs_date_start, 'end' => $vs_date_end, 'expression' => $ps_expression)))) {
                     $va_date[] = $vs_date_end;
                 } elseif ($vs_skip_end_replacement = $pa_item['settings']['dateJoiner_skipEndIfExpressionReplacementValue']) {
                     $va_date[] = $vs_skip_end_replacement;
                 }
             }
             foreach ($va_date as $vn_i => $vs_date) {
                 $va_date[$vn_i] = preg_replace("![^\\d]+\$!", "", $vs_date);
             }
             $vs_date_expression = join(" - ", $va_date);
             if ($vs_date_expression && ($vs_exp = BaseRefinery::parsePlaceholder($vs_date_expression, $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' ')))) {
                 if ($o_tep->parse($vs_exp)) {
                     return $o_tep->getText();
                 } else {
                     if ($o_log) {
                         $o_log->logWarn(_t('[dateJoinerRefinery] Could not parse date expression %1 assembled from range', $vs_exp));
                     }
                 }
             }
             break;
         case 'multiColumnDate':
             $va_month_list = $o_tep->getMonthList();
             $va_date = array();
             if ($vs_date_month = trim(BaseRefinery::parsePlaceholder($pa_item['settings']['dateJoiner_month'], $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' ')))) {
                 if (($vn_m = array_search($vs_date_month, $va_month_list)) !== false) {
                     $vs_date_month = $vn_m + 1;
                 }
                 $va_date[] = $vs_date_month;
             }
             if ($vs_date_day = trim(BaseRefinery::parsePlaceholder($pa_item['settings']['dateJoiner_day'], $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' ')))) {
                 $va_date[] = $vs_date_day;
             }
             if ($vs_date_year = trim(BaseRefinery::parsePlaceholder($pa_item['settings']['dateJoiner_year'], $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' ')))) {
                 $va_date[] = $vs_date_year;
             }
             if (sizeof($va_date)) {
                 // TODO: this is assuming US-style dates for now
                 if ($o_tep->parse(join("/", $va_date))) {
                     return $o_tep->getText();
                 } else {
                     if ($o_log) {
                         $o_log->logWarn(_t('[dateJoinerRefinery] Could not parse date expression %1 assembled from multiColumnDate', join("/", $va_date)));
                     }
                 }
             }
             break;
         case 'multiColumnRange':
             $va_dates = array();
             $va_month_list = $o_tep->getMonthList();
             // Process start date
             $va_date = array();
             if ($vs_date_month = trim(BaseRefinery::parsePlaceholder($pa_item['settings']['dateJoiner_startMonth'], $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' ')))) {
                 if (($vn_m = array_search($vs_date_month, $va_month_list)) !== false) {
                     $vs_date_month = $vn_m + 1;
                 }
                 $va_date[] = $vs_date_month;
             }
             if ($vs_date_day = trim(BaseRefinery::parsePlaceholder($pa_item['settings']['dateJoiner_startDay'], $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' ')))) {
                 $va_date[] = $vs_date_day;
             }
             if ($vs_date_year = trim(BaseRefinery::parsePlaceholder($pa_item['settings']['dateJoiner_startYear'], $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' ')))) {
                 $va_date[] = $vs_date_year;
             }
             if (sizeof($va_date)) {
                 if ($o_tep->parse(join("/", $va_date))) {
                     // TODO: this is assuming US-style dates for now
                     $va_dates[] = $o_tep->getText();
                 } else {
                     if ($o_log) {
                         $o_log->logWarn(_t('[dateJoinerRefinery] Could not parse date expression %1 assembled from multiColumnRange', join("/", $va_date)));
                     }
                 }
             }
             // Process end date
             $va_date = array();
             if ($vs_date_month = trim(BaseRefinery::parsePlaceholder($pa_item['settings']['dateJoiner_endMonth'], $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' ')))) {
                 if (($vn_m = array_search($vs_date_month, $va_month_list)) !== false) {
                     $vs_date_month = $vn_m + 1;
                 }
                 $va_date[] = $vs_date_month;
             }
             if ($vs_date_day = trim(BaseRefinery::parsePlaceholder($pa_item['settings']['dateJoiner_endDay'], $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' ')))) {
                 $va_date[] = $vs_date_day;
             }
             if ($vs_date_year = trim(BaseRefinery::parsePlaceholder($pa_item['settings']['dateJoiner_endYear'], $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' ')))) {
                 $va_date[] = $vs_date_year;
             }
             if (sizeof($va_date)) {
                 if ($o_tep->parse(join("/", $va_date))) {
                     // TODO: this is assuming US-style dates for now
                     $va_dates[] = $o_tep->getText();
                 } else {
                     if ($o_log) {
                         $o_log->logWarn(_t('[dateJoinerRefinery] Could not parse date expression %1 assembled from multiColumnRange', join("/", $va_date)));
                     }
                 }
             }
             if (sizeof($va_dates) > 0) {
                 return join(" - ", $va_dates);
             }
             break;
     }
     return null;
 }