? swftools-401140.patch Index: swftools.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/swftools/swftools.module,v retrieving revision 1.20.2.16.2.76 diff -u -p -r1.20.2.16.2.76 swftools.module --- swftools.module 11 May 2010 21:02:50 -0000 1.20.2.16.2.76 +++ swftools.module 14 Oct 2010 23:56:55 -0000 @@ -33,27 +33,27 @@ define('SWFTOOLS_UNDEFINED', '__undefine define('SWFTOOLS_STORED_SETTINGS', 0x0001); /** - * The calling function is requesting player settings and wants the full set, including blanks and defaults. + * The calling function is requesting player settings and wants the full set, including blanks and defaults. */ define('SWFTOOLS_FULL_SETTINGS', 0x0002); /** - * SWF Tools should return mark up to place on the page. + * SWF Tools should return mark up to place on the page. */ define('SWFTOOLS_RETURN_MARKUP', 0x0000); /** - * SWF Tools should return the cid for the content which was stored in the cache. + * SWF Tools should return the cid for the content which was stored in the cache. */ define('SWFTOOLS_RETURN_CID', 0x0001); /** - * This playlist does not return xml but updates the data array directly. + * This playlist does not return xml but updates the data array directly. */ define('SWFTOOLS_NON_XML_PLAYLIST', ''); /** - * Settings are being stored in to the variables table. + * Settings are being stored in to the variables table. */ define('SWFTOOLS_ADMIN_STORE', 1); @@ -102,7 +102,7 @@ define('SWFTOOLS_ACCESSIBLE_VISIBLE', 0x */ /** - * SWF Tools does not allow access to private files by default. + * SWF Tools does not allow access to private files by default. */ define('SWFTOOLS_PRIVATE_ACCESS_DENIED', 0x0000); @@ -118,7 +118,7 @@ function swftools_init() { // Add JavaScript that allows other scripts to access movies from the DOM drupal_add_js(drupal_get_path('module', 'swftools') . '/swftools.js'); - + // Add CSS to enable hiding of accessible controls drupal_add_css(drupal_get_path('module', 'swftools') . '/swftools.css'); @@ -162,7 +162,7 @@ function swftools_menu() { 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); - + $items['swftools/page/%'] = array( 'title' => 'SWF Tools', 'page callback' => 'swftools_get_html', @@ -170,7 +170,7 @@ function swftools_menu() { 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); - + $items['admin/settings/swftools/embed'] = array( 'title' => 'Embedding settings', 'description' => 'Set the embedding method that SWF Tools should use, and configure embedding defaults.', @@ -180,7 +180,7 @@ function swftools_menu() { 'page arguments' => array('swftools_admin_embed_form'), 'file' => 'includes/swftools.admin.inc', ); - + // If CCK is active then add a link to the CCK formatters if (module_exists('content')) { $items['admin/settings/swftools/cck'] = array( @@ -192,7 +192,7 @@ function swftools_menu() { 'file' => 'includes/swftools.admin.inc', ); } - + // Add SWF Tools status report $items['admin/reports/swftools'] = array( 'title' => 'SWF Tools status', @@ -202,7 +202,7 @@ function swftools_menu() { 'file' => 'includes/swftools.admin.status.inc', 'weight' => 9, ); - + // Integrate items from the generic players module $items = array_merge($items, swftools_genericplayers_menu()); @@ -251,18 +251,18 @@ function swftools_perm() { * the form: array('action'=>'dosomething','player'=>'withsomething','embed'=>'withthisjavascript'). * These usually default to the administration settings and also you will * usually use a CONSTANT which will be documented further at a later stage. - * + * * @ingroup swftools */ function swf($file, $options = array()) { - + // $time_start = microtime(true); - + // TODO: We should put SWF Tools own settings somewhere safe in the othervars array // If someone passes a variable from the input filter it could collide. // Maybe put them under #swftools (since the data are properties of swftools?) // A finished item has player, profile, cid, id, file_url, src_path, src - + // Initialise any $options array elements that weren't passed by the caller $options += array( 'params' => array(), @@ -270,7 +270,7 @@ function swf($file, $options = array()) 'othervars' => array(), 'methods' => array(), ); - + // Initialise othervars with some defaults $options['othervars'] += array( 'profile' => '', @@ -281,7 +281,7 @@ function swf($file, $options = array()) 'id' => '', 'stream' => FALSE, ); - + // Initialise methods with some defaults $options['methods'] += array( 'action' => '', @@ -289,56 +289,56 @@ function swf($file, $options = array()) 'embed' => '', // 'stream' => '', ); - + // Initialise params with some defaults $options['params'] += array( 'base' => swftools_get_base(), ); - + // See if we can get this item from the SWF Tools cache if (($ret = swftools_get_from_cache($file, $options)) && variable_get('swftools_cache', CACHE_NORMAL)) { // $time_end = microtime(true); // $time = $time_end - $time_start; // dsm('Used cache in ' . $time); if ($ret->headers && $script_location = variable_get('swftools_javascript_location', SWFTOOLS_JAVASCRIPT_INLINE)) { - drupal_add_js($ret->headers, 'inline', $script_location == SWFTOOLS_JAVASCRIPT_HEADER ? 'header' : 'footer'); + drupal_add_js($ret->headers, 'inline', $script_location == SWFTOOLS_JAVASCRIPT_HEADER ? 'header' : 'footer'); } return $options['othervars']['return'] == SWFTOOLS_RETURN_CID ? $options['othervars']['return'] : $ret->data; } - + // Ensure id is unique, or assign an id if one isn't set $options['othervars']['id'] = swftools_get_id($options['othervars']['id']); - + // If swf() was called with an array of files, make a playlist if (is_array($file)) { // Turn the array in to a playlist and attach it to othervars swftools_prepare_playlist($file, $options); - + } - + // ACTION // Work out what SWF Tools should do with this file (e.g. video, audio) // If an explicit action wasn't set then try to determine an appropriate one using the filename $options['methods']['action'] = $options['methods']['action'] ? swftools_fix_old_action_names($options['methods']['action']) : swftools_get_action($file); - + // RESOLVE PLAYER AND EMBEDDING // 'resolved' refers to the fact that these are the methods we now intend to use, not /all/ methods available. - + // PLAYER // Work out what player SWF Tools will need to use for this action // If an explicit player wasn't set then find out what player is configured for the current action - $options['methods']['player'] = $options['methods']['player'] ? swftools_fix_old_player_names($options['methods']['player']) : swftools_get_player($options['methods']['action'], $options['othervars']['profile']); - + $options['methods']['player'] = $options['methods']['player'] ? swftools_fix_old_player_names($options['methods']['player']) : swftools_get_player($options['methods']['action'], $options['othervars']['profile']); + // If there is no player assigned we don't what to do with this action if (!$options['methods']['player']) { // Get the descriptions that go with the actions $actions = swftools_get_actions(); - + // If we have a matching description for the specified action, create a meaningful message if (isset($actions[$options['methods']['action']]['#description'])) { - + // If we also have a meaningful profile name use that too if ($options['othervars']['profile']) { if (function_exists('swftools_profiles_get_profile') && ($profile = swftools_profiles_get_profile($options['othervars']['profile']))) { @@ -352,12 +352,12 @@ function swf($file, $options = array()) else { $profile = 'SWF Tools'; } - + // And output a message swftools_set_error('swftools', 'No player is configured for %action. Check the %profile file handling settings.', array('%action' => $actions[$options['methods']['action']]['#description'], '%profile' => $profile), WATCHDOG_WARNING); } - + // Otherwise we have an action that SWF Tools doesn't understand, so create a fallback message else { swftools_set_error('swftools', 'No modules have registered the action %action. Check any required supporting modules are enabled.', array('%action' => $options['methods']['action']), WATCHDOG_WARNING); @@ -366,24 +366,24 @@ function swf($file, $options = array()) // We couldn't find a player for this content, so fallback to the alternate markup and return return $options['othervars']['html_alt']; } - + // Get all the actions, tools and embedding options available to us $all_methods = swftools_get_methods(); // Check that the action / player combination is valid (it should appear in the array of all methods) if (isset($all_methods[$options['methods']['action']][$options['methods']['player']])) { - + // The combination was found, place player information in to resolved_methods $options['resolved_methods']['player'] = $all_methods[$options['methods']['action']][$options['methods']['player']]; - + } - + // If the action / player combination doesn't appear then we give up here else { // Get the descriptions that go with the actions $actions = swftools_get_actions(); - + // Set an error swftools_set_error('swftools', 'The combination of %player with %action is not valid. Check that the player is available and that it supports the requested action.', array('%player' => $options['methods']['player'], '%action' => $options['methods']['action']), WATCHDOG_WARNING); @@ -391,10 +391,10 @@ function swf($file, $options = array()) return $options['othervars']['html_alt']; } - + // EMBED // Work out what embedding method SWF Tools should use for this content - + // If an explicit embed method was not set then assign one now $options['methods']['embed'] = $options['methods']['embed'] ? $options['methods']['embed'] : variable_get('swftools_embed_method', 'swftools_direct'); @@ -408,7 +408,7 @@ function swf($file, $options = array()) // Explode string $dimensions = explode('x', $options['params']); - + // If we got two pieces assume success if (count($dimensions) == 2) { $options['params'] = array( @@ -417,16 +417,16 @@ function swf($file, $options = array()) ); } } - + // FLASHVARS // If the flashvars were passed as a string then turn it in to an array if (!is_array($options['flashvars'])) { parse_str($options['flashvars'], $options['flashvars']); } - + // XML PLAYLIST // Determine if we are trying to generate a playlist that needs xml output, and create it if required - + // If $options['othervars']['playlist_data'] is set then we are processing a playlist if ($options['othervars']['playlist_data']) { @@ -434,11 +434,11 @@ function swf($file, $options = array()) $file = swftools_generate_playlist($options); } - + // FILE - // Make sure that the file path in $file is valid, and as necessary try to + // Make sure that the file path in $file is valid, and as necessary try to // expand it to a relative url on the local file system, or point to the remote media directory - + // First we assume that we can just set $file_url to the value in $file $file_url = $file; @@ -447,26 +447,26 @@ function swf($file, $options = array()) // Process to get a url (in src) and expand the path (in src_path) if necessary $source = swftools_get_url_and_path($file); - + // If FALSE was returned then the file doesn't exist so return $html_alt if (!$source) { return $options['othervars']['html_alt']; } - + // $file might need to be changed to reflect a path on the local file system // This happens when the user just supplied a filename and files are being sourced locally // Put $file = $source['filepath'] in case that happened $file = $source['filepath']; - + // In all cases $file_url is now an absolute, or relative, url to the file that we can use - $file_url = $source['fileurl']; + $file_url = $source['fileurl']; } - + // Attach file_url to othervars so player modules have access if required $options['othervars']['file_url'] = $file_url; - - // Depending if we are outputting a swf or using a player we need to attach $file in different places + + // Depending if we are outputting a swf or using a player we need to attach $file in different places switch ($options['methods']['player']) { // Embedding an swf directly - no player @@ -481,17 +481,17 @@ function swf($file, $options = array()) $options['othervars']['filepath'] = $options['resolved_methods']['player']['library']; $options['othervars']['fileurl'] = base_path() . $options['othervars']['filepath']; } - + } - + // Merge default and user defined parameters, with user defined ones taking precedence $options['params'] = array_merge(_swftools_params(), $options['params']); - + // If player requires a higher version of flash than the current default then over-ride the default if (version_compare($options['resolved_methods']['player']['version'], $options['params']['version'], '>')) { $options['params']['version'] = $options['resolved_methods']['player']['version']; } - + /** * We used to call hook_flashvars, using the module name, but we are starting to do a lot * more than just flashvars. So we will borrow from the theme system and implement @@ -507,7 +507,7 @@ function swf($file, $options = array()) } // TODO: Can we deprecate this - we are accommodating the ability to specify width x height in a string on params. - + // We used to set height and width on $vars->params, but they're not actually params and they were // being unset in individual embedding functions. So we'll move them to $vars->othervars. // We will continue to let users pass the data on $vars->params so as not to break existing code. @@ -515,38 +515,38 @@ function swf($file, $options = array()) $options['othervars']['height'] = $options['params']['height']; unset($options['params']['height']); } - + if (!isset($options['othervars']['width']) && !empty($options['params']['width'])) { $options['othervars']['width'] = $options['params']['width']; unset($options['params']['width']); } - + // Try and make sure we have a size set on this content swftools_set_size($options); - + // Change html_alt to include the first image when handling an image list // TODO: Should this be an option that can be disabled? if ($options['methods']['action'] == 'image_list') { swftools_image_html_alt($options); } - + // See if anyone wants to alter anything just before it is output drupal_alter('swftools', $options); - + // Call theme function $output = theme('swftools_embed', $options); - + // See if the embed placed a script for us to cache $script = ($data = drupal_get_js($options['othervars']['id'])) ? str_replace(array("\n"), '', $data) : ''; - + // Cache the result cache_set('swf:' . $options['othervars']['cid'], $output, 'cache_swftools', CACHE_PERMANENT, $script); - + // If we want just the cid then return that if ($options['othervars']['return'] == SWFTOOLS_RETURN_CID) { return $options['othervars']['cid']; } - + // Return the markup return $output; @@ -555,12 +555,12 @@ function swf($file, $options = array()) /** * Converts an array of paramters to JSON and returns them as a string ready for use as a flashvar. - * + * * @param $params * An array of parameters. * @param $attribute * The attribute that the JSON string will be attached to. - * + * * @return * A string in the form [attr]={JSON} */ @@ -571,10 +571,10 @@ function swftools_json_params(&$params, /** * Returns 'true' or 'false' for JavaScript based the supplied value $bool. - * + * * @param $bool * The value that should be cast to true or false. - * + * * @return * The string 'true' or 'false' depending on the supplied value. */ @@ -593,7 +593,7 @@ function _swftools_tf($bool) { /** * Returns the currently configured player for the specified action and profile. - * + * * We use a static array so that if we are generating a complex page we can * quickly locate the relevant action/profile player after we've done it the * first time. This saves us from repeat calls to swftools_variable_get(). @@ -602,29 +602,29 @@ function _swftools_tf($bool) { * The SWF Tools action to be performed. * @param $profile * The profile being used for this item. - * + * * @return * The name of the currently configured player for this action. */ function swftools_get_player($action, $profile = '') { - + // Initialise a static array for this page call static $players = array(); - + // We need to give the empty profile a name to place it in the array $_profile = $profile ? $profile : SWFTOOLS_UNDEFINED; - + // Do we already know the players for this profile? if (!isset($players[$_profile])) { - + // Register the players for this profile in the array $players[$_profile] = swftools_get_players($profile); - + } // Return the result return isset($players[$_profile][$action]) ? $players[$_profile][$action] : FALSE; - + } @@ -637,10 +637,10 @@ function _swftools_params() { // Cache this static $params = array(); - + // If not set then get defaults if (!$params) { - + // Define default parameters for case when settings have been stored $defaults = array( 'swliveconnect' => 'false', @@ -655,12 +655,12 @@ function _swftools_params() { 'wmode' => 'opaque', 'bgcolor' => '', 'version' => '7', - 'allowscriptaccess' => 'sameDomain', + 'allowscriptaccess' => 'sameDomain', ); // Retrieve settings from the database if available $params = variable_get('swftools_params', $defaults); - + } // Return the default parameters @@ -671,35 +671,35 @@ function _swftools_params() { /** * Returns information about the specified file. - * + * * We use this function to try and get the height and width for content that * we don't have a specific size for. - * + * * The returned value is an array that may include width, height, extension, * file_size, mime_type. We return FALSE if we didn't get a valid file, or if * image_get_info() couldn't tell us anything. - * + * * @parameter $file * Path to a local file that we want to interrogate. - * + * * @return * An array of data, or FALSE if we didn't get anything. */ function swftools_get_info($file) { - + // Assume we won't have data $info = FALSE; - + // Try to get image info (first assume it is in the file directory (most likely case)) if ($try = file_create_path($file)) { $info = image_get_info($try); } - + // If it wasn't in the file system just try the file path - that might be valid if (!$info) { $info = image_get_info($file); } - + // Return either the info array, or it will be FALSE if we got nothing return $info; @@ -708,33 +708,33 @@ function swftools_get_info($file) { /** * Generates an playlist and places it in {cache_swftools} ready for use. - * + * * This relies on player modules implementing hook_swftools_playlist_[player]. * A module implementing this hook may either return an xml string that will be * used by the player, or it may update the data array directly. - * + * * We don't check for the existence of this content in the cache already. If we * are here then the swf wasn't in the cache, so it's pretty certain the xml * won't be either. - * + * * We used to create an actual file. Now we place the content in {cache_swftools} * and access it via swftools/playlist/nnn, where nnn is the cid. - * + * * @param &$options * The SWF Tools data array for this element. - * + * * @return * The path to the virtual xml file (will be in the form swftools/playlist/nnn), * or an empty string (SWFTOOLS_NON_XML_PLAYLIST) if there is no xml. */ function swftools_generate_playlist(&$options) { - + /** * We don't need to hash again. We have been given a cid via $vars->othervars['cid'] * which is based on the incoming data, so lets just use that. Then we don't have to * hash again. We prefix cache entries with xml: when they are a playlist so the cid * for the playlist will be xml:nnn, and for the movie will be swf:nnn. We have a - * matched pair in the database which is neat. + * matched pair in the database which is neat. */ // Determine the name of the hook that would be used to generate an xml playlist @@ -742,10 +742,10 @@ function swftools_generate_playlist(&$op // Build the name of the function we would call $function = $options['resolved_methods']['player']['module'] . $hook; - + // See if the function exists - if it doesn't the module doesn't implement this hook if (function_exists($function)) { - + // Call the function and pass variables by reference $playlist = $function($options); @@ -753,24 +753,24 @@ function swftools_generate_playlist(&$op if (!$playlist) { return SWFTOOLS_NON_XML_PLAYLIST; } - + // Cache the result cache_set('xml:' . $options['othervars']['cid'] . '.xml', $playlist, 'cache_swftools'); - + // Return the path to the xml return url('swftools/playlist/' . $options['othervars']['cid'] . '.xml'); - + } - + // We don't have hook_swftools_playlist_[player] for this player, return an empty string return ''; - + } /** * Prepares an array of filenames, or file objects, for use in a playlist. - * + * * This function processes the supplied array and returns an array of playlist data which has * two elements, header and playlist. The header array contains the playlist title, which may * be an empty string if nothing was set. The playlist array contains an array of playlist @@ -779,7 +779,7 @@ function swftools_generate_playlist(&$op * - title : the title for the element, set to the filename if nothing given * - filename : the filename for the file * - fileurl : the full url to the file - * + * * drupal_alter is called just prior to returning the playlist, so a module can implement * hook_swftools_playlist_alter(&$playlist_data) to modify the playlist prior to return. This * means other modules can modify, or add, elements. For example, the swftools_getid3 module @@ -799,49 +799,49 @@ function swftools_generate_playlist(&$op * existence of files should be skipped */ function swftools_prepare_playlist($files, &$options) { - + // Make sure stream and action are present on options $options['methods'] += array( 'player' => '', ); - + // Initialise two flags for establishing the action to be taken on this playlist $action = ''; $mixed_media = FALSE; - + // Initialise playlist data array $playlist_data = array( 'header' => array(), 'playlist' => array(), ); - + // Iterate over the array of files to set filepath, fileurl and title keys foreach ($files AS $key => $data) { - + // If $data is an object convert it to an array if (is_object($data)) { $data = (array)$data; } - + // If $data is a string then make it array with this value on the filepath key elseif (!is_array($data)) { - + // Create an array with key filepath set to the $data string $data = array( 'filepath' => $data, ); - + } - + // Attach the incoming element to the playlist $playlist_data['playlist'][$key] = $data; - + /** * Ensure the title key is present to simplify later code as we know it will be present. * Note we no longer set a default title. We leave it empty since all output should * now be handled by a theme function, so if the user wants to make a default we can * let them since they will know a specific value wasn't given. We don't do it for them. - * + * * We also initialise some other empty strings to make checks in other modules easier. */ $playlist_data['playlist'][$key] += array( @@ -854,7 +854,7 @@ function swftools_prepare_playlist($file 'duration' => '', 'stream' => FALSE, ); - + // Find out if this item is a stream by checking for rtmp and exploding it if (strpos($playlist_data['playlist'][$key]['filepath'], 'rtmp:') === 0) { $stream = explode(' ', $playlist_data['playlist'][$key]['filepath']); @@ -863,80 +863,80 @@ function swftools_prepare_playlist($file if (count($stream) == 2) { list($playlist_data['playlist'][$key]['stream'], $playlist_data['playlist'][$key]['filepath']) = $stream; $options['othervars']['stream'] = TRUE; - + // TODO: Action checking fails as streams don't have an extension - assume mixed media $options['methods']['action'] = 'media_list'; } - } - + } + // If this whole playlist isn't a stream, and this item isn't a stream if (!is_string($options['othervars']['stream']) && !$playlist_data['playlist'][$key]['stream']) { - + // Expand $file as necessary if local or remote $source = swftools_get_url_and_path($playlist_data['playlist'][$key]['filepath']); // Store results $playlist_data['playlist'][$key]['filepath'] = $source['filepath']; $playlist_data['playlist'][$key]['fileurl'] = $source['fileurl']; - + } else { $playlist_data['playlist'][$key]['fileurl'] = $playlist_data['playlist'][$key]['filepath']; } - + // See if we have an image we need to expand if ($playlist_data['playlist'][$key]['image']) { $source = swftools_get_url_and_path($playlist_data['playlist'][$key]['image']); $playlist_data['playlist'][$key]['image'] = $source['fileurl']; } - + // Allow other modules to modify this playlist element (e.g. getID3) drupal_alter('swftools_playlist_element', $playlist_data['playlist'][$key]); - + // If the caller wants us to work out the action for them then it happens in here if (!$options['methods']['action']) { // Get the extension for this item $extension = strtolower(pathinfo($playlist_data['playlist'][$key]['fileurl'], PATHINFO_EXTENSION)); - + // Only try to determine actions if there's an extension to work with, and we didn't already work out it's mixed if ($extension && !$mixed_media) { - + // Work out what we'd do with this file $action_for_this_file = swftools_get_action('dummy.' . $extension); - + // If this is the first file we've processed we log it if (!$action) { $action = $action_for_this_file; } - + // Is this action the same as the first file we saw? If not we have mixed media if ($action != $action_for_this_file) { $mixed_media = TRUE; $action = 'media_list'; } - + } } - + } - + // If we didn't get an action (happens with streams as they have no extension) then specify an action now $action = $action ? $action : 'media_list'; // Pluralize the action for multiple files if not already pluralized $action = (substr($action, -5, 5) == '_list') ? $action : $action . '_list'; - + // If the called didn't specify an action then assign it now $options['methods']['action'] = $options['methods']['action'] ? $options['methods']['action'] : $action; - + // Attach the resulting playlist to the array (we are working by reference) $options['othervars']['playlist_data'] = $playlist_data; - + // Call drupal_alter to let other modules modify the entire playlist if they want drupal_alter('swftools_playlist', $playlist_data); - + } @@ -1003,7 +1003,7 @@ function swftools_filter($op, $delta = 0 /** * Processes text obtained from the input filter. - * + * * This function processes the filter text that the user has added to the text area. * If the filter is wrapped in

then these are stripped as part of the processing * This eliminates a validation error in the resulting mark up if SWF Tools filter is @@ -1017,21 +1017,21 @@ function _swftools_filter_process_text($ // $match[0][#] .... fully matched string // $match[1][#] .... matched tag type ( swf | swflist ) // $match[2][#] .... full params string until the closing '>' - + $swftools_parameters = array('file', 'params', 'flashvars', 'othervars', 'methods', 'files'); $match_vars = array(); - + // Initialise an array to hold playlist arrays $files = array(); - - + + foreach ($match[2] as $key => $passed_parameters) { //preg_match_all('/(\w*)=\"(.*?)\"/', $passed_parameters, $match_vars[$key]); preg_match_all('/(\w*)=(?:\"|")(.*?)(?:\"|")/', $passed_parameters, $match_vars[$key]); // $match_vars[0][#] .... fully matched string // $match_vars[1][#] .... matched parameter, eg flashvars, params // $match_vars[2][#] .... value after the '=' - + // Process the parameters onto the $prepared array. // Search for standard parameters, parse the values out onto the array. foreach ($match_vars[$key][1] as $vars_key => $vars_name) { @@ -1102,7 +1102,7 @@ function _swftools_filter_process_text($ $options['flashvars'] = $prepared[$key]['flashvars']; $options['othervars'] = $prepared[$key]['othervars']; $options['methods'] = $prepared[$key]['methods']; - + switch ($match[1][$key]) { case 'swf': $replace = swf($prepared[$key]['file'], $options); @@ -1110,8 +1110,8 @@ function _swftools_filter_process_text($ case 'swflist': // If this filter contains a key called files if ($prepared[$key]['files']) { - - // Iterate over the + + // Iterate over the foreach ($prepared[$key]['files'] AS $name => $filename) { if (!$filename) { @@ -1119,7 +1119,7 @@ function _swftools_filter_process_text($ } // Put in to proper format for new swftools_prepare_playlist() - $files[$key][$name]['filepath'] = $prepared[$key]['files'][$name]; + $files[$key][$name]['filepath'] = $prepared[$key]['files'][$name]; } @@ -1130,7 +1130,7 @@ function _swftools_filter_process_text($ else { $replace = ''; - + } break; } @@ -1174,7 +1174,7 @@ function swftools_get_filter_alias($var, 'allowfullscreen' => 'params', 'allowscriptaccess' => 'params', ); - + if (!count($player_mapping)) { $player_mapping = module_invoke_all('swftools_variable_mapping'); } @@ -1198,13 +1198,13 @@ function swftools_get_filter_alias($var, /** * Parses a string passed to the input filter in to separate key value pairs. - * + * * We cannot automatically use parse_str() because things like the list of * files are not key-value pairs, but just a list of items. - * + * * @param $string * The string to parse. - * + * * @return * An array of key/value pairs. */ @@ -1212,13 +1212,13 @@ function swftools_parse_str($string) { // Initialise the array $return = array(); - + // Split the string at each & $pairs = split('&', $string); // Iterate over each piece foreach ($pairs as $pair) { - + // Split each piece at = $splitpair = split('=', $pair); @@ -1226,7 +1226,7 @@ function swftools_parse_str($string) { if (!isset($splitpair[1]) || array_key_exists($splitpair[0], $return)) { $return[] = $splitpair[0]; } - + // Otherwise we had a key-value we can add to the array else { $return[$splitpair[0]] = $splitpair[1]; @@ -1235,7 +1235,7 @@ function swftools_parse_str($string) { // Return the result return $return; - + } @@ -1243,7 +1243,7 @@ function swftools_parse_str($string) { * Implementation of hook_theme(). */ function swftools_theme() { - + return array( // This is called by swf() when it is ready to embed @@ -1257,13 +1257,13 @@ function swftools_theme() { 'arguments' => array('file' => NULL, 'options' => NULL), 'file' => 'includes/swftools.core.inc', ), - + // These are the SWF Tools CCK formatters 'swftools_formatter_swftools' => array( 'arguments' => array('element' => NULL, 'profile' => NULL), 'function' => 'theme_swftools_formatter_swftools', 'file' => 'includes/swftools.theme.inc', - + ), 'swftools_formatter_swftools_no_file' => array( 'arguments' => array('element' => NULL), @@ -1280,31 +1280,31 @@ function swftools_theme() { 'function' => 'theme_swftools_formatter_thumbnail', 'file' => 'includes/swftools.theme.inc', ), - + // This themes an swftools element in the FormAPI 'swftools' => array( 'arguments' => array('element' => NULL), 'file' => 'includes/swftools.core.inc', ), - + // This themes an swftools element in the FormAPI 'swftools' => array( 'arguments' => array('element' => NULL), 'file' => 'includes/swftools.core.inc', ), - + 'swftools_page' => array( 'template' => 'swftools-page', 'arguments' => array('content' => NULL), 'path' => drupal_get_path('module', 'swftools') . '/includes', 'preprocess functions' => array('template_preprocess_page'), ), - + // Generic accessible controls handler 'swftools_accessible_controls' => array( 'arguments' => array('player' => NULL, 'id' => NULL, 'actions' => NULL, 'visible' => NULL), ), - + // Path to an empty image when no thumbnail is given 'swftools_empty_image' => array( 'arguments' => array('data' => NULL), @@ -1317,7 +1317,7 @@ function swftools_theme() { /** * Implementation of hook_file_download(). - * + * * Allows SWF Tools to work with a private file system that might include files * uploaded outside the control of an upload module, e.g. FTP of large video files. * @@ -1332,13 +1332,13 @@ function swftools_file_download($file) { // Get extension of file in question $extension = strtolower(pathinfo($file, PATHINFO_EXTENSION)); - + // Get list of extensions that SWF Tools can grant access to $extensions = variable_get('swftools_grant_access_extensions', SWFTOOLS_PRIVATE_ACCESS_ALLOWED_EXTENSIONS); // Need access to the user object global $user; - + // Check if SWF Tools should grant access to this extension - skip the check for user #1 if ($user->uid != 1) { $regex = '/\.('. ereg_replace(' +', '|', preg_quote($extensions)) .')$/i'; @@ -1349,7 +1349,7 @@ function swftools_file_download($file) { // Build an array of types that SWF Tools can react to $mime_types = _swftools_mime_types(); - + // If file is one of the above types, based on the extension, return headers if (isset($mime_types[$extension])) { return array( @@ -1371,10 +1371,10 @@ function swftools_swftools_methods() { 'module' => 'swftools', 'title' => t('Display the swf directly on the page'), ); - + // Add on generic players (we have to call this hook manually as it isn't in a module) $methods += swftools_genericplayers_swftools_methods(); - + // Return the methods that are native to SWF Tools return $methods; @@ -1383,10 +1383,10 @@ function swftools_swftools_methods() { /** * Helper function to set the size of the swf content in to $options['othervars']['height'] and ['width'] - * + * * @param &$options * Data arrays that is being assembled by SWF Tools. - * + * * @return * Nothing - function operates by reference. */ @@ -1399,11 +1399,11 @@ function swftools_set_size(&$options) { if (count(array_intersect_key($options['othervars'], $defaults)) == 2) { return; } - + // See if we can get height and width from flashvars $try = array_intersect_key($options['flashvars'], $defaults); $options['othervars'] += $try; - + // See if we can get height and width from player $try = array_intersect_key($options['resolved_methods']['player'], $defaults); $options['othervars'] += $try; @@ -1412,10 +1412,10 @@ function swftools_set_size(&$options) { if (count(array_intersect_key($options['othervars'], $defaults)) == 2) { return; } - + // Try and get size from the file to be embedded, but preserve height or width if just one was set $info = swftools_get_info($options['othervars']['filepath']); - + // If sizes were retrieved then use them if ($info) { $try = array_intersect_key($info, $defaults); @@ -1424,7 +1424,7 @@ function swftools_set_size(&$options) { // And if all else fails, assign 100% $options['othervars'] += $defaults; - + } @@ -1448,49 +1448,49 @@ function swftools_field_formatter_info() 'swftools_thumbnail' => array('label' => t('SWF Tools - thumbnail'), 'field types' => array('filefield', 'link', 'text'), 'multiple values' => CONTENT_HANDLE_CORE, - ), + ), ); } /** * Verifies that the supplied id is unique, and assigns an id if one was not supplied. - * + * * Typically this is called to get us a unique id, but the user can also supply an id. In all cases * we call form_clean_id to verify that the id is unique in this page generation session. - * + * * @param $id * An id to be checked, or empty if we don't have one yet. - * + * * @return * A unique id. */ function swftools_get_id($id = '') { - + // If a specific id wasn't set then assign one $id = $id ? $id : uniqid('swftools-'); - + // Check the id is unique (ours should be, a user supplied one might not be) return form_clean_id($id); - + } /** * Creates a relative path url from a file path, using private or public file system. - * + * * This is an SWF Tools version of file_create_url(). The only difference is that * here we do not output absolute paths as we are only using these paths within the * context of a page and therefore relative is fine. - * + * * @param $path * Path to the file. - * + * * @return * A string with a complete path, relative to the local file system. */ function swftools_create_url($path) { - + // Strip file_directory_path from $path. We only include relative paths in urls. if (strpos($path, file_directory_path() .'/') === 0) { $path = trim(substr($path, strlen(file_directory_path())), '\\/'); @@ -1508,97 +1508,101 @@ function swftools_create_url($path) { /** * Determines the url for a file, and expands its filepath if necessary. - * + * * @param $file * A string containing a url or a path to a file. - * + * * @return * An array with two keys * - src: The url to the file (relative if on the local system) * - src_path: The path to the file, expanded if necessary - * + * * This function is necessary because SWF Tools allows flexibility in how the site interprets * filenames. If just a filename is provided then this might point to a file on the local system, * or it might point to an external location if the remote media path is set. However, for things * like auto-detection of sizes to work when the filename is local it must be expanded to include * the file path. - * + * * If $file is a full and valid absolute url then the function returns $file on both keys. - * + * * If $file is full and valid url on the local system then the function returns $file on both keys. - * + * * If $file is a path to a local file (sites/default/files/xxx) then src_path will return this, * and src will return a full relative url. - * + * * If $file is just a filename and remote media is active then src and src_path will both be set * to the url for the external location. - * + * * If $file is just a filename and remote media is not active then src_path will return the path * to the local system (so xxx becomes sites/default/files/xxx) and src will return the full - * relative url. + * relative url. */ function swftools_get_url_and_path($file) { - + + // Encode URL + $parts = parse_url($file); + $parts['path'] = str_replace('%2F', '/', rawurlencode($parts['path'])); + $uri = _swf_glue_url($parts); + // src will contain a full, or relative, url that is used to render the file // src_path will contain a partial path (without webroot), or the original file path $ret = array( - 'fileurl' => '', + 'fileurl' => $uri, 'filepath' => $file, ); - + // If already a valid absolute url simply return it - if (valid_url($file, TRUE)) { - $ret['fileurl'] = $file; + if (valid_url($uri, TRUE)) { + $ret['fileurl'] = $uri; return $ret; } - + // If a valid url, and starts with /, then assume to be a local path relative to web root // No security check is needed as the result of this is only output to the webpage // We strip base_path from the file to create filepath that is valid for image_get_info later. - - // FileField will create paths with spaces in - need to reverse that when testing for valid_url - $temp = str_replace(' ', '%20', $file); - -// if (valid_url($file) && strpos($file, '/') === 0) { - if (valid_url($temp) && strpos($file, '/') === 0) { + if (valid_url($uri) && strpos($file, '/') === 0) { return array( - 'fileurl' => $file, + 'fileurl' => $uri, 'filepath' => str_replace(base_path(), '', $file), ); } - + // If defintely in the local file system return a relative url to the file if ($file == file_create_path($file)) { // If media checking is active check to see if it actually exists if (variable_get('swftools_check_media', TRUE)) { - + // If the file doesn't exist, set an error message and return FALSE to indicate failure if (!file_exists($file)) { drupal_set_message(t('SWF Tools could not find %file.', array('%file' => $file)), 'error'); return FALSE; } - + } - + // If we got here then return a relative url to the file $ret['fileurl'] = swftools_create_url($file); return $ret; - + } - + // Retrieve the media url setting $media_url = trim(variable_get('swftools_media_url', '')); - + // If a remote path is set build the appropriate url to the file if ($media_url) { - $ret['fileurl'] = $media_url . '/' . $path; + $ret['fileurl'] = $media_url . '/' . $path; return $ret; } - + // If we got here then expand to a local file path and call again - return swftools_get_url_and_path(file_create_path($file)); - + if ($file = file_create_path($file)) { + return swftools_get_url_and_path($file); + } + else { + return $ret; + } } @@ -1606,34 +1610,61 @@ function swftools_get_url_and_path($file * Returns a string defining a base path for flash to use. */ function swftools_get_base() { - + // Cache the result as we might get multiple calls static $base = ''; // If $base is not already defined then set it if (!$base) { - + // Retrieve swftools_media_url to see if a remote path has been set $base = trim(variable_get('swftools_media_url', '')); - + // If $base is still empty then use local path to file directory if (!$base) { - $base = base_path() . file_directory_path() . '/'; + $base = base_path() . file_directory_path() . '/'; } } - + // Return the base path return $base; } +/** + * Alt to Drupal's url() function. + * @see http://drupal.org/node/513860 + * + * http://php.net/parse-url#85963 + * @param $parsed + * An array with the url broken into their components + */ +function _swf_glue_url($parsed) { + if (!is_array($parsed)) { + return FALSE; + } + + $uri = isset($parsed['scheme']) ? $parsed['scheme'] . ':' . ((drupal_strtolower($parsed['scheme']) == 'mailto') ? '' : '//') : ''; + $uri .= isset($parsed['user']) ? $parsed['user'] . (isset($parsed['pass']) ? ': ' . $parsed['pass'] : '') . '@' : ''; + $uri .= isset($parsed['host']) ? $parsed['host'] : ''; + $uri .= isset($parsed['port']) ? ':' . $parsed['port'] : ''; + + if (isset($parsed['path'])) { + $uri .= (substr($parsed['path'], 0, 1) == '/') ? $parsed['path'] : ((!empty($uri) ? '/' : '' ) . $parsed['path']); + } + + $uri .= isset($parsed['query']) ? '?' . $parsed['query'] : ''; + $uri .= isset($parsed['fragment']) ? '#' . $parsed['fragment'] : ''; + + return $uri; +} /** * Flatten an array which has sub-arrays in to a single keyed array. - * + * * If keys in the sub-array are the same as ones seen previously the early key will be over-written. - * + * * @param $array * Array to be processed. */ @@ -1641,24 +1672,24 @@ function swftools_array_flatten(&$array) // Only process if we passed an array if (is_array($array)) { - + // Iterate over the array foreach ($array as $key => $value) { - + // If the value is in itself an array then flatten that too if (is_array($value)) { - + // Unset this key as this contains an array unset($array[$key]); - + // Flatten the sub-array swftools_array_flatten($value); - + // Merge the flattened sub-array in to the rest of the array $array = array_merge($array, $value); } - + } } @@ -1668,54 +1699,54 @@ function swftools_array_flatten(&$array) /** * Returns a variable from the relevant profile, or the global settings, or the default values. - * + * * This is a custom handler to take care of the SWF Tools profile mechanism. * If no profile name is given then it simply returns the requested variable, * or the default if the variable is not set. - * + * * If a profile name is given then it will first try to retrive the profiled variable. * If that fails it will try to return the global setting, and if that fails then it * will return the default. In this way we cascade through the "most relevant" setting. - * + * * @param $name * The name of the variable to return. * @param $default * The default value to use if this variable has never been set. * @param $profile * The name of the profile to use. - * + * * @return * The value of the variable. */ function swftools_variable_get($name, $default, $profile = '') { - + if ($profile && ($ret = variable_get('swftools_' . $profile . '_' . $name, SWFTOOLS_UNDEFINED)) != SWFTOOLS_UNDEFINED) { return $ret; } return variable_get($name, $default); - + } /** * Serves an xml playlist from the {cache_swftools} table. - * + * * SWF Tools no longer generates a physical file for the playlist. Instead it * places an entry in its internal cache table and then serves the file from * there. Pages request the files by accessing swftools/playlist/nnn.xml, where * nnn is the cid of the content. - * + * * Note that we check at swf() whether the relevant cid exists in the table. If * it doesn't then the playlist file is regenerated. - * + * * @param $playlist * The name of the playlist being requested. - * + * * @return * Serve the xml file, or issue drupal_not_found() if it doesn't exist. */ function swftools_get_xml($playlist) { - + if (!$data = cache_get('xml:' . $playlist, 'cache_swftools')) { print drupal_not_found(); } @@ -1723,25 +1754,25 @@ function swftools_get_xml($playlist) { drupal_set_header('Content-Type: text/xml; charset=utf-8'); print $data->data; } - + } /** * Serves just the swf content from the cache via the path swftools/page/nnnn - * + * * This feature is experimental - the only access control at the moment is whether * the user is generally allowed to view content. Complex permissions will come * later. - * + * * @param $cid * The cid of the item to retrieve. - * + * * @return * An html page, including headers */ function swftools_get_html($cid) { - + if (!variable_get('swftools_grant_access_to_cache', 0)) { print drupal_access_denied(); } @@ -1751,48 +1782,48 @@ function swftools_get_html($cid) { else { print theme('swftools_page', $content->data); } - + } /** * Creates a cid for the call to swf() and returns its data from the cache when available. - * + * * To make our cid we create an array from $file and $options. Then we serialize it, and then * we run it through md5. This generates a unique cid for that piece of content. * * Once the cid is created it is attached to $options['othervars']['cid'] so that * subsequent functions don't have to rehash the data to generate it again. - * + * * Within {cache_swftools} we then prefix the cid with swf: or xml: to indicate whether the * cache entry refers to the markup that produces the content, or the xml: that describes the * playlist. So for xml playlist content we should have two entries with the same numeric portion * in their cid. - * + * * @param $file * The $file parameter from the call to swf(). * @param $options * The $options parameter from the call to swf(). - * + * * @return * The cached content, or FALSE if it is isn't available. */ function swftools_get_from_cache($file, &$options) { - // Construct a cid for this piece of content + // Construct a cid for this piece of content $cid = md5(serialize(array($file, $options))); - // Set the cid on othervars ready to store this item if we have to render it + // Set the cid on othervars ready to store this item if we have to render it $options['othervars']['cid'] = $cid; - + // If this is in the cache then return it if ($ret = cache_get('swf:' . $cid, 'cache_swftools')) { return $ret; } - + // Indicate that we don't have cached data return FALSE; - + } @@ -1808,7 +1839,7 @@ function swftools_flush_caches() { * Returns the default handlers, or customised handlers, for each action. */ function swftools_get_players($profile) { - + // These are the standard defaults (key is action, value is handler) $defaults = array( 'video' => 'generic_flv', @@ -1818,27 +1849,27 @@ function swftools_get_players($profile) // Retrieve settings from the database if available $settings = swftools_variable_get('swftools_handlers', $defaults, $profile); - + // Return result return $settings; - + } /** * Merges two multi-dimensional arrays. - * + * * This function is used by players that filter their settings to strip out * blanks or defaults. For the admin page we need a full set of values to prevent * errors. Since the arrays might be multi-dimensional we cannot use a regular * array_merge(). The values in the first array will be over-written by values in * the second, if they exist. - * + * * @param $array1 * The first array to merge. * @param $array2 * The second array to merge. - * + * * @return * The result of the merge. */ @@ -1850,7 +1881,7 @@ function swftools_array_merge($array1, $ // If this key is present in $array1 then work out what to do if (isset($array1[$key])) { - // If both keys hold arrays, combine them + // If both keys hold arrays, combine them if (is_array($value) && is_array($array1[$key])) { $array1[$key] = swftools_array_merge($array1[$key], $value); } @@ -1865,7 +1896,7 @@ function swftools_array_merge($array1, $ } } - + // Return the result return $array1; @@ -1874,15 +1905,15 @@ function swftools_array_merge($array1, $ /** * Retrieves the list of actions, and their descriptions, that modules are presenting to SWF Tools. - * + * * @param $reset * When TRUE will reset the cache. - * + * * @return * An array of actions. */ function swftools_get_actions($reset = FALSE) { - + // Cache actions static $actions; @@ -1892,7 +1923,7 @@ function swftools_get_actions($reset = F $actions = $cached->data; } else { - + // Build a list of standard actions that SWF Tools knows about from its other modules $default_actions = array( 'swf' => array( @@ -1921,7 +1952,7 @@ function swftools_get_actions($reset = F 'image' => array( '#description' => 'a single image', '#type' => 'images', - '#weight' => -3, + '#weight' => -3, ), 'image_list' => array( '#description' => 'a series of images', @@ -1942,10 +1973,10 @@ function swftools_get_actions($reset = F $actions = array_merge($actions, $result); } } - + // Merge additional or new values over the defaults (allows defaults to be renamed) $actions = array_merge($default_actions, $actions); - + // Sort the list uasort($actions, 'element_sort'); @@ -1953,33 +1984,33 @@ function swftools_get_actions($reset = F cache_set('actions', $actions, 'cache_swftools'); } } - + // Return the list of available actions return $actions; - + } /** * Determines the action to be taken, based on the extension of a filename. - * + * * @param $extension * The file being queried. - * + * * @return * An SWF Tools action, or 'media_list' if we don't know. */ function swftools_get_action($file) { - + // Get the array of actions, keyed on extension $actions = _swftools_actions(); // Get the extension for this file $extension = strtolower(pathinfo($file, PATHINFO_EXTENSION)); - + // If we know the handler for this then use it, otherwise return 'media_list' - return isset($actions[$extension]) ? $actions[$extension] : 'media_list'; - + return isset($actions[$extension]) ? $actions[$extension] : 'media_list'; + } @@ -1987,13 +2018,13 @@ function swftools_get_action($file) { * Returns an array of actions, keyed by file extension. */ function _swftools_actions() { - + // Cache this as there may be multiple calls static $actions; - + // Do we need to fetch the array of actions? if (!$actions) { - + // Defaults to use if no settings have been stored $defaults = array( 'swf' => 'swf', @@ -2005,15 +2036,15 @@ function _swftools_actions() { 'png' => 'image', 'gif' => 'image', ); - + // Use settings from configuration page, or defaults $actions = variable_get('swftools_actions', $defaults); - + } - + // Return the result return $actions; - + } @@ -2024,19 +2055,19 @@ function _swftools_mime_types() { $defaults = array( 'swf' => 'application/x-shockwave-flash', - 'flv' => 'video/x-flv', + 'flv' => 'video/x-flv', 'mp3' => 'audio/mpeg', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpe' => 'image/jpeg', 'png' => 'image/png', 'gif' => 'image/gif', - + ); // Use settings from configuration page, or defaults $mime_types = variable_get('swftools_mime_types', $defaults); - + // Return the result return $mime_types; @@ -2045,11 +2076,11 @@ function _swftools_mime_types() { /** * Implementation of hook_form_FORM_ID_alter(). - * + * * Alters the system_performance_settings form so the SWF Tools cache can be managed along with other caches. */ function swftools_form_system_performance_settings_alter(&$form, &$form_state) { - + $form['swftools_cache'] = array( '#type' => 'fieldset', '#title' => t('SWF Tools cache'), @@ -2072,11 +2103,11 @@ function swftools_form_system_performanc $temp = $form['clear_cache']; unset($form['clear_cache']); $form['clear_cache'] = $temp; - + $temp = $form['buttons']; unset($form['buttons']); $form['buttons'] = $temp; - + } @@ -2084,7 +2115,7 @@ function swftools_form_system_performanc * Implementation of hook_elements(). */ function swftools_elements() { - + $type['swftools'] = array( '#params' => array(), '#flashvars' => array(), @@ -2095,21 +2126,21 @@ function swftools_elements() { // Return the type return $type; - + } /** * Changes old player names to the new ones so existing content doesn't break. - * + * * @param $name * The currently assigned player name. - * + * * @return * The corrected player name (which will be unchanged if it is already ok). */ function swftools_fix_old_player_names($name) { - + // This is the array to map old names to new names $map = array( 'flowplayer_mediaplayer' => 'flowplayer', @@ -2117,29 +2148,29 @@ function swftools_fix_old_player_names($ 'wijering_imagerotator' => 'imagerotator', 'wijering4_mediaplayer' => 'jwplayer4', ); - + // Attach the supplied action name as both key and value $map += array( $name => $name, ); - + // Return the mapped result return $map[$name]; - + } /** * Changes old action names to the new ones so existing content doesn't break. - * + * * @param $name * The currently assigned action name. - * + * * @return * The corrected action name (which will be unchanged if it is already ok). */ function swftools_fix_old_action_names($name) { - + // This is the array to map old names to new names $map = array( 'swftools_swf_display_direct' => 'swf', @@ -2151,15 +2182,15 @@ function swftools_fix_old_action_names($ 'swftools_image_display_list' => 'image_list', 'swftools_media_display_list' => 'media_list', ); - + // Attach the supplied action name as both key and value $map += array( $name => $name, ); - + // Return the mapped result return $map[$name]; - + } @@ -2176,14 +2207,14 @@ function swftools_views_api() { /** * Outputs a message to the screen and/or the watchdog, according to the configuration settings. - * + * * Parameters are as watchdog(). - * + * * @see watchdog() */ function swftools_set_error($type, $message, $variables = array(), $severity = WATCHDOG_NOTICE, $link = NULL) { - + // Find out where this message should go $destination = variable_get('swftools_error_output', SWFTOOLS_ERROR_WATCHDOG_AND_SCREEN); @@ -2203,43 +2234,43 @@ function swftools_set_error($type, $mess if ($destination & SWFTOOLS_ERROR_SCREEN) { drupal_set_message(t($message, $variables), $status[$severity]); } - + // Write to watchdog? if ($destination & SWFTOOLS_ERROR_WATCHDOG) { watchdog($type, $message, $variables, $severity, $link); } - + } /** * Replaces the html_alt string with an image tag when rendering an image playlist. - * + * * This is designed so that if the Flash embed fails the user will see the * first image from the image playlist, rather than just an empty message. - * + * * TODO: Could extend this to substitute thumbnails on audio? Or is that too much! - * + * * @param $options * SWF Tools data array. - * + * * @return * Nothing - modifies the array directly. */ function swftools_image_html_alt(&$options) { - + // Make sure there is a playlist (not using Flickr etc) if ($file = $options['othervars']['playlist_data']['playlist']) { // Get the first array element - use array_shift on a copy of the playlist in case there are named keys $file = array_shift($file); - + // Get height and width data for the first image $info = swftools_get_info($file['filepath']); - + // Initialise an empty array $attributes = array(); - + // Try to make sure the image height and width don't exceed the player height and width to keep the layout as we expect if ($info) { $attributes['height'] = ($info['height'] > $options['othervars']['height']) ? $options['othervars']['height'] : $info['height']; @@ -2249,18 +2280,18 @@ function swftools_image_html_alt(&$optio // Replace html_alt with an image, setting alt text as both alt and title (so when user hovers they see a sensible message) $alt = strip_tags($options['othervars']['html_alt']); $options['othervars']['html_alt'] = theme('image', $file['filepath'], $alt, $alt, $attributes, FALSE); - + } - + } /** * Builds a list of accessible controls for the specified player. - * + * * SWF Tools accessibility scripts use classes of the form * !player-accessible-!action-!id - * + * * @param $player * The player name to be made accessible (e.g. jwplayer4). * @param $id @@ -2272,17 +2303,17 @@ function swftools_image_html_alt(&$optio * * @return * HTML markup to generate a list - * + * * @ingroup swftools */ function theme_swftools_accessible_controls($player, $id, $actions, $visible) { - + foreach ($actions as $action => $label) { $list[] = l($label, '', array('fragment' => ' ', 'external' => TRUE, 'attributes' => array('class' => t('!player-accessible-!action-!id', array('!player' => $player, '!action' => $action, '!id' => $id))))); } - + return theme_item_list($list, '', 'ul', array('class' => $visible == SWFTOOLS_ACCESSIBLE_VISIBLE ? '' : 'swftools-accessible-hidden')); - + } @@ -2292,7 +2323,7 @@ function theme_swftools_accessible_contr * The imagecache preset to be applied. * @param $path * The existing path. - * + * * @return * The modified path, or an unaltered path if not on the local file system. */ @@ -2301,8 +2332,8 @@ function swftools_imagecache_create_path if (module_exists('imagecache')) { $path = str_replace(file_directory_path(), file_directory_path() . '/imagecache/' . $preset, $path); } - + return $path; - + }