diff --git a/modules/system/views_handler_field_file_extension.inc b/modules/system/views_handler_field_file_extension.inc index 6f9a03f..b543d8a 100644 --- a/modules/system/views_handler_field_file_extension.inc +++ b/modules/system/views_handler_field_file_extension.inc @@ -10,10 +10,40 @@ * @ingroup views_field_handlers */ class views_handler_field_file_extension extends views_handler_field { + public function option_definition() { + $options = parent::option_definition(); + $options['extension_detect_tar'] = array('default' => FALSE, 'bool' => TRUE); + return $options; + } + + public function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['extension_detect_tar'] = array( + '#type' => 'checkbox', + '#title' => t('Detect if tar is part of the extension'), + '#description' => t("See if the previous extension is '.tar' and if so, add that, so we see 'tar.gz' or 'tar.bz2' instead of just 'gz'."), + '#default_value' => $this->options['extension_detect_tar'], + ); + } + function render($values) { $value = $this->get_value($values); - if (preg_match('/\.([^\.]+)$/', $value, $match)) { - return $this->sanitize_value($match[1]); + if (!$this->options['extension_detect_tar']) { + if (preg_match('/\.([^\.]+)$/', $value, $match)) { + return $this->sanitize_value($match[1]); + } + } + else { + $file_parts = explode('.', basename($value)); + // If there is an extension. + if (count($file_parts) > 1) { + $extension = array_pop($file_parts); + $last_part_in_name = array_pop($file_parts); + if ($last_part_in_name === 'tar') { + $extension = 'tar.' . $extension; + } + return $this->sanitize_value($extension); + } } } } diff --git a/tests/handlers/views_handler_field_file_extension.test b/tests/handlers/views_handler_field_file_extension.test new file mode 100644 index 0000000..ab8b0a9 --- /dev/null +++ b/tests/handlers/views_handler_field_file_extension.test @@ -0,0 +1,66 @@ + 'Field: File extension', + 'description' => 'Test the views_handler_field_file_extension handler.', + 'group' => 'Views Handlers', + ); + } + + function dataSet() { + $data = parent::dataSet(); + $data[0]['name'] = 'file.png'; + $data[1]['name'] = 'file.tar'; + $data[2]['name'] = 'file.tar.gz'; + $data[3]['name'] = 'file'; + + return $data; + } + + function viewsData() { + $data = parent::viewsData(); + $data['views_test']['name']['field']['handler'] = 'views_handler_field_file_extension'; + $data['views_test']['name']['real field'] = 'name'; + + return $data; + } + + /** + * Tests the 'extension_detect_tar' handler option. + */ + public function testFileExtensionTarOption() { + $view = $this->getBasicView(); + + $view->display['default']->handler->override_option('fields', array( + 'name' => array( + 'id' => 'name', + 'table' => 'views_test', + 'field' => 'name', + ), + )); + + $this->executeView($view); + + // Test without the tar option. + $this->assertEqual($view->field['name']->advanced_render($view->result[0]), 'png'); + $this->assertEqual($view->field['name']->advanced_render($view->result[1]), 'tar'); + $this->assertEqual($view->field['name']->advanced_render($view->result[2]), 'gz'); + $this->assertEqual($view->field['name']->advanced_render($view->result[3]), ''); + // Test with the tar option. + $view->field['name']->options['extension_detect_tar'] = TRUE; + $this->assertEqual($view->field['name']->advanced_render($view->result[0]), 'png'); + $this->assertEqual($view->field['name']->advanced_render($view->result[1]), 'tar'); + $this->assertEqual($view->field['name']->advanced_render($view->result[2]), 'tar.gz'); + $this->assertEqual($view->field['name']->advanced_render($view->result[3]), ''); + } +} diff --git a/views.info b/views.info index 7521d82..aa7bd86 100644 --- a/views.info +++ b/views.info @@ -261,6 +261,7 @@ files[] = tests/handlers/views_handler_field_boolean.test files[] = tests/handlers/views_handler_field_custom.test files[] = tests/handlers/views_handler_field_counter.test files[] = tests/handlers/views_handler_field_date.test +files[] = tests/handlers/views_handler_field_file_extension.test files[] = tests/handlers/views_handler_field_file_size.test files[] = tests/handlers/views_handler_field_math.test files[] = tests/handlers/views_handler_field_url.test