--- inline.module-orig 2007-09-28 18:11:46.000000000 +0200 +++ inline.module 2007-10-28 13:39:29.000000000 +0100 @@ -86,11 +86,38 @@ '#type' => 'fieldset', '#title' => t('Image dimensions and scaling'), '#collapsible' => true, '#description' => (module_exists('imagecache') ? t('Select the Imagecache presets to use for inlined images.', array('!presets' => url('admin/settings/imagecache'))) : t('Note: If Imagecache module is installed, Inline provides support for image scaling.', array('!imagecache' => url('http://drupal.org/project/imagecache')))), ); + + $form['inline']['upload']['inline_xls'] = array( + '#type' => 'fieldset', + '#title' => t('MS-Excel files'), + '#collapsible' => true, + ); + $form['inline']['upload']['inline_xls']['path']['inline_xlhtml_path'] = array( + '#type' => 'textfield', + '#title' => t('Absolute path to executable xlhtml'), + '#default_value' => variable_get('inline_xlhtml_path', '/usr/bin/xlhtml'), + ); + $form['inline']['upload']['inline_xls']['opt']['inline_xlhtml_opt'] = array( + '#type' => 'textfield', + '#title' => t('Options for xlhtml'), + '#default_value' => variable_get('inline_xlhtml_opt', '-nh -fw'), + ); + $form['inline']['upload']['inline_xls']['path']['inline_iconv_path'] = array( + '#type' => 'textfield', + '#title' => t('Absolute path to executable iconv'), + '#default_value' => variable_get('inline_iconv_path', '/usr/bin/iconv'), + ); + $form['inline']['upload']['inline_xls']['opt']['inline_iconv_opt'] = array( + '#type' => 'textfield', + '#title' => t('Options for iconv'), + '#default_value' => variable_get('inline_iconv_opt', '-f ISO8859-2 -t UTF8'), + ); + // If Imagecache module exists and is enabled, we assume that we want to use // the improved image handling instead of our own. if (module_exists('imagecache')) { $options = array(); $options[''] = 'No Imagecache processing'; @@ -122,14 +149,33 @@ '#required' => TRUE, '#default_value' => variable_get('inline_img_dim', '150,150'), '#description' => t('This setting limits the dimensions of displayed images in pixels. They will not be resized. Images exceeding these dimensions are automatically not displayed.', array('!content-types' => url('admin/content/types'))), ); } + + _inline_validate_paths($form); return system_settings_form($form); } + +/** + * Checks the different pathes in the settings + */ +function _inline_validate_paths($form) { + $errors = 0; + foreach ($form['inline']['upload']['inline_xls']['path'] as $name => $details) { + $value = variable_get($name, ''); + if ($value && !is_executable($value) ){ + $errors += 1; + drupal_set_message(t('inline: ' . $value . ' does not exist or is not executable')); + } + } + return $errors == 0; +} + + /** * Implementation of hook_form_alter(). * * Allows to enable/disable auto-inline support for each content type. */ @@ -258,11 +304,13 @@ } return NULL; } else { // Named file reference. - foreach ($node->files as $file) { + // when several attachments have the same file name + // then return the last occurance + foreach ( array_reverse($node->files,TRUE) as $file) { $file = (object)$file; if ($file->filename == $id) { return $file; } } @@ -337,10 +385,48 @@ $html = $image; } return $html; } + + +/** + * for each file type supported there must exist a function + * to create the viewable output + * + * @param object $file + * A file object of an excel document to insert. + * @param string $field + * The field name to prepend with the image (unused) +**/ +function theme_inline_xls($file, $field) { + $errors = 0; + + $xlhtml_path= variable_get('inline_xlhtml_path',''); + $xlhtml_opt= variable_get('inline_xlhtml_opt',''); + $iconv_path= variable_get('inline_iconv_path',''); + $iconv_opt= variable_get('inline_iconv_opt',''); + + if ($xlhtml_path && !is_executable($xlhtml_path) ){ + $errors += 1; + drupal_set_message(t('inline: ' . $xlhtml_path . ' does not exist or is not executable')); + } + if ($iconv_path && !is_executable($iconv_path) ){ + $errors += 1; + drupal_set_message(t('inline: ' . $iconv_path . ' does not exist or is not executable')); + } + + if (!$errors && $xlhtml_path && $iconv_path) { // excel -> html transformation + $html = shell_exec($xlhtml_path . ' ' . $xlhtml_opt . ' ' . $file->filepath . ' | ' . $iconv_path . ' ' . $iconv_opt); + } + else { // show a link to the file if transformation to html is not possible + $html = theme('inline_as_link', $file); + } + + return $html; +} + /** * Insert an image in front of node teaser. * * @param object $node @@ -443,16 +529,21 @@ $title = $match[3][$key]; if (!empty($title)) { $file->title = $title; } // Decide whether to show a link or an image tag. - if (_inline_decide_img_tag($file)) { - $replace = theme('inline_img', $file, $field); - } - else { - $replace = theme('inline_as_link', $file); - } + // _inline_decide_inline_tag now returns some kind of document type + switch( _inline_decide_inline_tag($file) ) { + case 'img': + $replace = theme('inline_img', $file, $field); + break; + case 'xls': + $replace = theme('inline_xls', $file, $field); + break; + default: + $replace = theme('inline_as_link', $file); + } } else { $replace = 'NOT FOUND: '. $value .''; } $s[] = $match[0][$key]; @@ -537,5 +628,28 @@ } } return FALSE; } + +/** + * Decides if a inline tag or a link to a file should be rendered + * + * @param $file a file object + * + * @return type of file found or '' if unknown: + * currently the following types are supported + * 'img' for inlinable images + * 'xls' for MS excel sheet + */ +function _inline_decide_inline_tag($file) { + if (_inline_decide_img_tag($file)) { + return 'img'; + } else { + $inlined = array('xls', 'vnd.ms-excel'); + $mime = array_pop(explode('/', $file->filemime)); + if (in_array($mime, $inlined)) { + return 'xls'; + } + return ''; + } +}