diff --git a/css/islandora.base.css b/css/islandora.base.css index 585ad756..28301aa1 100644 --- a/css/islandora.base.css +++ b/css/islandora.base.css @@ -1,4 +1,4 @@ -/* +/* Document : islandora_basic_collection.base.css Created on : May 23, 2012, 11:22:04 AM Description: @@ -19,7 +19,7 @@ /* * These rules will display DTs/DDs as columns. * Constructs must follow a key/value pair pattern. - * The three last declarations are meant to kill white space between DTs/DDs + * The three last declarations are meant to kill white space between DTs/DDs * (result of inline-block styling) */ @@ -43,7 +43,20 @@ dl.islandora-inline-metadata { padding-left: 40px; } -/* +dl.islandora-metadata-fields { + width:100%; +} + +.islandora-metadata dt, +.islandora-metadata dd { + border-top:1px solid #e5e5e5; +} + +.islandora-metadata dt.first, +.islandora-metadata dd.first { + border-top:0; +} +/* * In this rule, we reset the white-space (see hack above) */ .islandora-inline-metadata dt, diff --git a/css/islandora.print.css b/css/islandora.print.css index 45fca341..4b714bc5 100644 --- a/css/islandora.print.css +++ b/css/islandora.print.css @@ -4,15 +4,6 @@ * * We provide some sane print styling for Drupal, hiding most visuals. */ -a:link, -a:visited { /* underline all links */ - text-decoration: underline !important; -} - -#site-name a:link, -#site-name a:visited { /* Don't underline header */ - text-decoration: none !important; -} #content a[href^="javascript:"]:after, #content a[href^="#"]:after { /* Only display useful links. */ @@ -66,6 +57,7 @@ body.sidebar-first { .book-navigation, .forum-topic-navigation, .pager, +.contextual-links-region, .feed-icons { /* Hide sidebars and nav elements */ visibility: hidden !important; display: none !important; diff --git a/includes/derivatives.inc b/includes/derivatives.inc index c66944b1..8a6627e5 100644 --- a/includes/derivatives.inc +++ b/includes/derivatives.inc @@ -60,9 +60,14 @@ function islandora_do_derivatives(AbstractObject $object, array $options) { require_once $hook['file']; } foreach ($hook['function'] as $function) { - $logging = call_user_func($function, $object, $options['force']); - if (!empty($logging)) { - $results[] = $logging; + if (function_exists($function)) { + $logging = call_user_func($function, $object, $options['force']); + if (!empty($logging)) { + $results[] = $logging; + } + } + else { + watchdog('islandora', 'Unable to call derivative function @function as it was not found!', array('@function' => $function), WATCHDOG_ERROR); } } } diff --git a/includes/metadata.inc b/includes/metadata.inc new file mode 100644 index 00000000..bf59b830 --- /dev/null +++ b/includes/metadata.inc @@ -0,0 +1,171 @@ + t('None'), + 'description' => t("Don't show any metadata for displaying"), + ); + $viewers = array_merge_recursive($no_viewer, $defined_displays); + + $form['viewers'] = array( + '#type' => 'item', + '#title' => t('Select a viewer'), + '#description' => t('Preferred metadata display for Islandora. These may be provided by third-party modules.'), + '#tree' => TRUE, + '#theme' => 'islandora_viewers_table', + ); + + foreach ($viewers as $name => $profile) { + $options[$name] = ''; + $form['viewers']['name'][$name] = array( + '#type' => 'hidden', + '#value' => $name, + ); + $form['viewers']['label'][$name] = array( + '#type' => 'item', + '#markup' => $profile['label'], + ); + $form['viewers']['description'][$name] = array( + '#type' => 'item', + '#markup' => $profile['description'], + ); + $form['viewers']['configuration'][$name] = array( + '#type' => 'item', + '#markup' => (isset($profile['configuration']) AND $profile['configuration'] != '') ? l(t('configure'), $profile['configuration']) : '', + ); + } + $form['viewers']['default'] = array( + '#type' => 'radios', + '#options' => isset($options) ? $options : array(), + '#default_value' => variable_get('islandora_metadata_display', 'dublin_core'), + ); + } + else { + $form['viewers']['no_viewers'] = array( + '#markup' => t('No viewers detected.'), + ); + } + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Save configuration'), + ); + return $form; +} + +/** + * Submit handler for the metadata display form which sets the default viewer. + * + * @param array $form + * An array representing a Drupal form. + * @param array $form_state + * An array containing the Drupal form state. + */ +function islandora_metadata_display_form_submit($form, $form_state) { + variable_set('islandora_metadata_display', $form_state['values']['viewers']['default']); + drupal_set_message(t('The configuration options have been saved.')); +} + +/** + * Metadata display callback for rendering Dublin Core metadata. + * + * @param AbstractObject $object + * An AbstractObject representing an object within Fedora. + * @param bool $print + * Whether the display is being printed or not. + * + * @return string + * Markup representing the rendered metadata from Dublin Core. + */ +function islandora_metadata_display_callback(AbstractObject $object, $print = FALSE) { + $elements = array( + 'islandora_object' => $object, + 'print' => $print, + ); + return theme('islandora_dublin_core_display', $elements); +} + +/** + * Metadata description callback for rendering Dublin Core description. + * + * @param AbstractObject $islandora_object + * An AbstractObject representing an object within Fedora. + * + * @return string + * Markup representing the rendered metadata from Dublin Core. + */ +function islandora_metadata_description_callback(AbstractObject $islandora_object) { + $elements = array( + 'islandora_object' => $islandora_object, + ); + return theme('islandora_dublin_core_description', $elements); +} diff --git a/includes/tuque_wrapper.inc b/includes/tuque_wrapper.inc index 96f9919c..2aa85a8b 100644 --- a/includes/tuque_wrapper.inc +++ b/includes/tuque_wrapper.inc @@ -207,6 +207,7 @@ class IslandoraFedoraApiM extends FedoraApiM { 'params' => $params, ); islandora_alter_datastream($object, $datastream, $context); + $params = $context['params']; if (isset($params['lastModifiedDate'])) { $params['lastModifiedDate'] = (string) $object[$dsid]->createdDate; } @@ -244,6 +245,7 @@ class IslandoraFedoraApiM extends FedoraApiM { 'params' => $params, ); islandora_alter_object($object, $context); + $params = $context['params']; try { if ($context['block']) { throw new Exception('Modify Object was blocked.'); diff --git a/includes/utilities.inc b/includes/utilities.inc index 6366305e..2139ae09 100644 --- a/includes/utilities.inc +++ b/includes/utilities.inc @@ -908,3 +908,19 @@ function islandora_as_renderable_array(&$markup_array) { } unset($value); } + +/** + * Sanitizes an input string to be valid XML. + * + * @param string $input + * An input string. + * @param string $replacement + * What we are replacing invalid characters with, defaults to ''. + * + * @return string + * The sanitized string. + */ +function islandora_sanitize_input_for_valid_xml($input, $replacement = '') { + $input = preg_replace('/[^\x9\xA\xD\x20-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]/u', $replacement, $input); + return $input; +} diff --git a/islandora.api.php b/islandora.api.php index 0dff8d89..24d24528 100644 --- a/islandora.api.php +++ b/islandora.api.php @@ -691,3 +691,36 @@ function hook_islandora_update_related_objects_properties(AbstractObject $object function hook_islandora_breadcrumbs_alter(&$breadcrumbs, $context) { } + +/** + * Registry hook for metadata display viewers. + * + * Modules can use this hook to override the default Dublin Core display. + * This hook lets Islandora know which viewers there are available. + * + * @return array + * An associative array where the values are the following: + * -label: Human readable display label for selection. + * -description: A description of what the metadata display viewer does. + * -metadata callback: A callable function that provides the markup to be + * passed off to the template files. Returns markup or FALSE if the viewer + * wishes to default back to the Dublin Core display for the current object. + * -description callback: A callable function that provides the markup to be + * passed for the description. Returns markup or FALSE if the viewer + * wishes to default back to the Dublin Core display for the current object. + * -configuration (Optional): A path to the administration page for the + * metadata display. + + * @see islandora_retrieve_metadata_markup() + */ +function hook_islandora_metadata_display_info() { + return array( + 'hookable_displays_yay' => array( + 'label' => t('Hookable display yay!'), + 'description' => t('This is purely an example of how to implement this.'), + 'metadata callback' => 'hookable_displays_some_function_that_returns_metadata_markup', + 'description callback' => 'hookable_displays_some_function_that_returns_description_markup', + 'configuration' => 'admin/hookable_displays_yay/somepath', + ), + ); +} diff --git a/islandora.module b/islandora.module index 2964ec96..95003bf9 100644 --- a/islandora.module +++ b/islandora.module @@ -99,6 +99,14 @@ function islandora_menu() { 'type' => MENU_NORMAL_ITEM, 'weight' => -1, ); + $items['admin/islandora/metadata'] = array( + 'title' => 'Metadata Display', + 'description' => 'Configure settings for metadata display on Islandora objects', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('islandora_metadata_display_form'), + 'file' => 'includes/metadata.inc', + 'access arguments' => array('adminisiter site configuration'), + ); $items['admin/islandora/solution_packs'] = array( 'title' => 'Solution packs', 'description' => 'Install content models and collections required by installed solution packs.', @@ -445,6 +453,31 @@ function islandora_theme() { 'file' => 'theme/theme.inc', 'variables' => array('datastream' => NULL), ), + 'islandora_dublin_core_display' => array( + 'file' => 'theme/theme.inc', + 'template' => 'theme/islandora-dublin-core-display', + // We can add PIDs to the end of this pattern in our preprocess function + // and templates will be able to have have a pid appended to the + // template name to overide a template on a per object basis. + // An example template might be named: + // "islandora-dublin-core-display--islandora-27.tpl.php". + 'pattern' => 'islandora_dublin_core_display__', + 'variables' => array( + 'islandora_object' => NULL, + 'print' => NULL, + ), + ), + 'islandora_dublin_core_description' => array( + 'file' => 'theme/theme.inc', + 'template' => 'theme/islandora-dublin-core-description', + // We can add PIDs to the end of this pattern in our preprocess function + // and templates will be able to have have a pid appended to the + // template name to overide a template on a per object basis. + // An example template might be named: + // "islandora-dublin-core-description--islandora-27.tpl.php". + 'pattern' => 'islandora_dublin_core_description__', + 'variables' => array('islandora_object' => NULL), + ), ); } @@ -991,6 +1024,7 @@ function islandora_default_islandora_view_object($object) { function islandora_default_islandora_printer_object($object, $alter) { module_load_include('inc', 'islandora', 'includes/utilities'); module_load_include('inc', 'islandora', 'includes/datastream'); + module_load_include('inc', 'islandora', 'includes/metadata'); $path = drupal_get_path('module', 'islandora'); drupal_add_css($path . '/css/islandora.print.css'); @@ -1005,11 +1039,12 @@ function islandora_default_islandora_printer_object($object, $alter) { catch (Exception $e) { drupal_set_message(t('Error retrieving object %s %t', array('%s' => $islandora_object->id, '%t' => $e->getMessage())), 'error', FALSE); } - + $metadata = islandora_retrieve_metadata_markup($object, TRUE); $variables = isset($dc_object) ? $dc_object->asArray() : array(); $output = theme('islandora_object_print_object', array( 'object' => $object, 'dc_array' => $variables, + 'metadata' => $metadata, 'islandora_content' => $alter)); return array('Default output' => array('#markup' => $output)); @@ -1602,3 +1637,17 @@ function islandora_islandora_datastream_modified(AbstractObject $object, Abstrac )); islandora_derivative_logging($logging_results); } + +/** + * Implements hook_islandora_metadata_display_info(). + */ +function islandora_islandora_metadata_display_info() { + return array( + 'dublin_core' => array( + 'label' => t('Dublin Core'), + 'description' => t('Dublin Core metadata'), + 'metadata callback' => 'islandora_metadata_display_callback', + 'description callback' => 'islandora_metadata_description_callback', + ), + ); +} diff --git a/theme/islandora-dublin-core-description.tpl.php b/theme/islandora-dublin-core-description.tpl.php new file mode 100644 index 00000000..2ff54cdc --- /dev/null +++ b/theme/islandora-dublin-core-description.tpl.php @@ -0,0 +1,20 @@ + +
diff --git a/theme/islandora-dublin-core-display.tpl.php b/theme/islandora-dublin-core-display.tpl.php new file mode 100644 index 00000000..da67de18 --- /dev/null +++ b/theme/islandora-dublin-core-display.tpl.php @@ -0,0 +1,33 @@ + + diff --git a/theme/islandora-object-print.tpl.php b/theme/islandora-object-print.tpl.php index b9569061..53fdc529 100644 --- a/theme/islandora-object-print.tpl.php +++ b/theme/islandora-object-print.tpl.php @@ -10,21 +10,5 @@