/**
* gallery.module : gallery_filter.inc
- * Gallery Filter functions (originally by MichelleC and Waldemar)
+ * Gallery Filter functions
*/
-
-// ***************** The Filter in Action ***********************
-define('GALLERY__FILTER_WORD', 1);
-define('GALLERY_FILTER_INTEGER', 2);
-define('GALLERY_FILTER_STRING', 3);
-
-function gallery_filter_attr_value($text, $value_type = GALLERY_FILTER_WORD) {
- // Strip off initial and final quotes.
- $first = substr($text, 0, 1);
- if ($first == "\"" || $first == "\'") {
- if (substr($text, -1, 1) == $first) {
- $text = substr($text, 1, -1);
- }
- }
- switch ($value_type) {
- case GALLERY_FILTER_WORD :
- return preg_replace("/\W/", '', $text);
- case GALLERY_FILTER_INTEGER :
- return preg_replace("/\D/", '', $text);
- default :
- return check_plain($text);
- }
-}
-
-// Execute filter on given text.
+/**
+ * Function gallery_filter_process().
+ * (implementation of the main filter routine)
+ */
function gallery_filter_process($text) {
- // Find all the image codes and loop over them, replacing each with the Gallery2 image block
- $prefix = variable_get('gallery_filter_prefix', 'G2');
-
- $matchetxt = "/\[".trim($prefix).":(\d+)(\s*,)?\s*(.*?)\]/i";
- preg_match_all($matchetxt, $text, $matches, PREG_SET_ORDER);
- // If we have at least one match, set everything up
- if (count($matches) > 0) {
- // Set the default and path variables based on module settings
- $default_size = variable_get('gallery_filter_default_size', 150);
- $default_div_class = variable_get('gallery_filter_default_div_class', 'nowrap');
- $default_album_frame = variable_get('gallery_filter_default_album_frame', '');
- $default_item_frame = variable_get('gallery_filter_default_item_frame', '');
- $default_block_type = variable_get('gallery_filter_default_block_type', 'recentImage');
- $default_n_images = variable_get('gallery_filter_n_images', 1);
- $default_show = variable_get('gallery_filter_default_show', 'none');
- $default_link_target = variable_get('gallery_filter_default_link_target', '');
-
- if ($default_album_frame == 'none') {
- $default_album_frame = '';
- }
- if ($default_item_frame == 'none') {
- $default_item_frame = '';
- }
-
- // This will hold the list of frames used for images so we can add the CSS link(s) at the end
- $frame_list = array ();
-
- // This sets up the embedding
- list ($success, $ret) = _gallery_init(true);
- if (!$success) {
- gallery_error(t('Unable to initialize embedded Gallery'), $ret);
- return;
- }
- }
- foreach ($matches as $match) {
- // Pull out the arguments into the $args array
- $args = array ();
- preg_match_all("/(\w+)\=(\"[^\"]*\"|\S*)/", $match[3], $a, PREG_SET_ORDER);
-
- foreach ($a as $arg) {
- $args[strtolower($arg[1])] = $arg[2];
- }
-
- // Set number of images to show
- $n_images = gallery_filter_attr_value($args['n'], GALLERY_FILTER_INTEGER);
- if ($n_images == 0) {
- // No size specified; use the default
- $n_images = $default_n_images;
- }
-
- // Set the block type
- $block_type = gallery_filter_attr_value($args['type'], GALLERY_FILTER_WORD);
- if (empty($block_type)) {
- // No block type specified; use the default
- $block_type = $default_block_type;
- }
- if ($n_images <= 1)
- $block_type = 'specificItem'; //so it shows something if n=1 and an album is selected
-
- // Set the size of the thumbnail
- $size = gallery_filter_attr_value($args['size'], GALLERY_FILTER_INTEGER);
- if ($size == 0) {
- // No size specified; use the default
- $size = $default_size;
- }
-
- // Set the class of the div
- $div_class = gallery_filter_attr_value($args['class'], GALLERY_FILTER_WORD);
- if (empty ($div_class)) {
- // No class specified; use the default
- $div_class = $default_div_class;
- }
- // Switch the class to g2image versions (adds consistency)
- switch ($div_class) {
- case 'left':
- $div_class = "g2image_float_left";
- break;
- case 'right':
- $div_class = "g2image_float_right";
- break;
- case 'center':
- case 'centre':
- $div_class = "g2image_centered";
- break;
- case 'normal':
- $div_class = "g2image_normal";
- break;
- }
- // Set the overriding, album, and item frames
- $frame = gallery_filter_attr_value($args['frame'], GALLERY_FILTER_WORD);
- $album_frame = gallery_filter_attr_value($args['aframe'], GALLERY_FILTER_WORD);
- $item_frame = gallery_filter_attr_value($args['iframe'], GALLERY_FILTER_WORD);
-
- if (empty ($frame)) {
- // No overriding frame given; check for album_frame and item_frame
- if (empty ($album_frame)) {
- // No album frame specified; use the default one
- $album_frame = $default_album_frame;
- }
-
- if (empty ($item_frame)) {
- // No item frame specified; use the default one
- $item_frame = $default_item_frame;
- }
-
- } else {
- // Overriding frame given; use it
- $album_frame = $frame;
- $item_frame = $frame;
- }
-
- // Add the requested frames to the array so we can get the CSS later. Don't worry about
- // dupes at this point; they will be filtered out later.
- array_push($frame_list, $frame);
- array_push($frame_list, $album_frame);
- array_push($frame_list, $item_frame);
-
- // This part actually fetches the image block. It uses the same paramaters as the code
- // found under "Image Block" in site admin in Gallery2.
-
- $show = $default_show;
-
- // Not customized yet:
- $link_target = $default_link_target;
-
- $param_blocks_array = array_fill(0, $n_images, $block_type);
- $params['itemId'] = $match[1];
- $params['blocks'] = is_array($param_blocks_array) ? implode('|', $param_blocks_array) : "";
- $param_show_array = $show;
- $params['show'] = is_array($param_show_array) ? implode('|', $param_show_array) : "";
- $params['maxSize'] = $size;
- // Add frames and link target using g2_filter code from MichelleC
- $params['albumFrame'] = $album_frame;
- $params['itemFrame'] = $item_frame;
- $params['linkTarget'] = $link_target;
-
- $g2_head = array();
- $block = array ();
- list ($ret, $content, $head) = GalleryEmbed::getImageBlock($params);
- if ($ret) {
- gallery_error(t('Unable to get Gallery image block'), $ret);
- return;
- } else {
- if ($content) {
- // Add a div around the table for styling
- if ($div_class != 'none') {
- $content = '<div class ="giImageBlock '.$div_class.'">'.$content.'</div>';
+ $prefix = trim(variable_get('gallery_filter_prefix', 'G2'));
+ preg_match_all("/\[$prefix:(\d+)\s*(.*?)\]/i", $text, $matches, PREG_SET_ORDER);
+
+ // Initialize G2 and set default arguments
+ if (count($matches) > 0) {
+ if (!_gallery_init(TRUE)) {
+ return $text;
+ }
+ $default['n'] = variable_get('gallery_filter_n_images', 1);
+ $default['type'] = variable_get('gallery_filter_default_block_type', 'recentImage');
+ $default['maxsize'] = variable_get('gallery_filter_default_maxsize', GALLERY_FILTER_MAXSIZE_DEFAULT);
+ $default['exactsize'] = variable_get('gallery_filter_default_exactsize', GALLERY_FILTER_EXACTSIZE_DEFAULT);
+ $default['class'] = variable_get('gallery_filter_default_div_class', 'nowrap');
+ $default['album_frame'] = variable_get('gallery_filter_default_album_frame', 'none');
+ $default['item_frame'] = variable_get('gallery_filter_default_item_frame', 'none');
+ $default['show'] = array_filter(variable_get('gallery_filter_default_show', array('none')));
+ $default['target'] = variable_get('gallery_filter_default_link_target', '');
+ $default['link'] = variable_get('gallery_filter_default_link', '');
+ }
+ else {
+ return $text;
+ }
+
+ $head_array = array();
+ // Loop over all matches
+ foreach ($matches as $match) {
+ // First argument is numeric => valid G2 filter tag
+ if (is_numeric($match[1])) {
+ $args = array_filter(preg_split('/[\s,]+/', $match[2]));
+ $params = array('itemId' => intval($match[1]));
+ // If this item is not an album (e.g. photo, movie, ...) set block type to 'specificItem'
+ $details = gallery_item_details($params['itemId']);
+ if (isset($details['g2type']) && $details['g2type'] != 'GalleryAlbumItem') {
+ $params['n'] = 1;
+ $params['type'] = 'specificItem';
+ }
+ if (preg_match('/user(:([\d]+))?/i', $params['itemId'], $param_uid)) {
+ require_once(drupal_get_path('module', 'gallery') .'/gallery_user.inc');
+ $params['itemId'] = gallery_user_useralbum(isset($param_uid[2]) ? $param_uid[2] : NULL, FALSE);
+ }
+ // Loop over all (optional) arguments
+ foreach ($args as $arg) {
+ list($key, $value) = array_filter(explode('=', $arg));
+ if (!empty($value)) {
+ $key = preg_replace('/\W/', '', $key);
+ $params[$key] = _gallery_filter_sanitize($key, $value);
}
- // This puts the image block HTML back into the rest of the text
+ }
+ // Treat 'maxsize' and 'size' as the same
+ if (isset($params['size'])) {
+ $params['maxsize'] = $params['size'];
+ unset($params['size']);
+ }
+ // Carefully treat the default size method (cannot just merge them as the
+ // entered value must take precedence over the default)
+ if (isset($params['maxsize'])) {
+ unset($default['exactsize']);
+ }
+ else if (isset($params['exactsize'])) {
+ unset($default['maxsize']);
+ }
+ // Merge params with default values
+ $params = array_merge($default, $params);
+ // Transform 'type' into a valid parameter
+ if ($params['n'] > 1 && $params['type'] == 'specificItem') {
+ $params['type'] = $default['type'];
+ }
+ if (is_array($params['type'])) {
+ // Ensure 'type' contains 'n' elements (auto-append if necessary)
+ $count = count($params['type']);
+ if (($num = $params['n'] - $count) > 0) {
+ $params['type'] += array_fill($count, $num, end($params['type']));
+ }
+ }
+ else {
+ $params['type'] = array_fill(0, $params['n'], $params['type']);
+ }
+ // 'frame' overrides 'album_frame' and 'item_frame'
+ if ($params['frame']) {
+ $params['album_frame'] = $params['item_frame'] = $params['frame'];
+ }
+ // Convert into G2-compatible arguments
+ $params['blocks'] = implode('|', $params['type']);
+ if (isset($params['maxsize']) && !empty($params['maxsize'])) {
+ $params['maxSize'] = $params['maxsize'];
+ }
+ else if (isset($params['exactsize']) && !empty($params['exactsize'])) {
+ $params['exactSize'] = $params['exactsize'];
+ }
+ $params['albumFrame'] = $params['album_frame'];
+ $params['itemFrame'] = $params['item_frame'];
+ $params['show'] = implode('|', $params['show']);
+ $params['linkTarget'] = $params['target'];
+ // Unset redundant parameters
+ unset(
+ $params['n'],
+ $params['type'],
+ $params['exactsize'],
+ $params['maxsize'],
+ $params['frame'],
+ $params['album_frame'],
+ $params['item_frame'],
+ $params['target']
+ );
+ gallery_debug($params, t('Filter parameters'));
+ // Fetch the images and format output
+ list($ret, $content, $head) = GalleryEmbed::getImageBlock($params);
+ if ($ret) {
+ gallery_error(t('Error trying to get image block.'), $ret);
+ continue;
+ }
+ if ($content) {
+ // Replace G2 filter tag with image block html
+ $params['class'] = 'giImageBlock'. ($params['class'] ? ' '. $params['class'] : '');
+ $content = '<div class ="'. $params['class'] .'">'. $content .'</div>';
$text = str_replace($match[0], $content, $text);
- }
+ }
if ($head) {
- $g2_head[] = $head;
- }
- }
- } // end of for loop through matches
- // If we had at least one match, finish up by adding the css. Unfotunately if there are multiple
- // images on a page this will get added multiple times.
- if (count($matches) > 0) {
- GalleryEmbed :: done();
- if ($g2_head) {
- gallery_set_html_head(implode("\n", array_unique($g2_head)));
+ $head_array[] = trim($head);
+ }
}
- drupal_add_css(drupal_get_path('module', 'gallery') .'/gallery_filter.css', 'module', 'all');
- }
- return $text . "<br class=\"giImageBlock-clear-both\" />";;
+ }
+
+ // Add html head items and css
+ if (count($head_array)) {
+ gallery_set_head(implode("\n", array_unique($head_array)));
+ }
+ GalleryEmbed::done();
+
+ return $text .'<br class="giImageBlock-clear-both" />';
+}
+
+/**
+ * Function _gallery_filter_sanitize().
+ * (sanitize filter parameters)
+ */
+function _gallery_filter_sanitize($key, $value) {
+ switch (strtolower($key)) {
+ case 'n':
+ case 'size':
+ case 'maxsize':
+ case 'exactsize':
+ return intval(preg_replace('/\D/', '', $value));
+ case 'class':
+ case 'frame':
+ case 'album_frame':
+ case 'item_frame':
+ case 'target':
+ case 'link':
+ return preg_replace('/\W/', '', $value);
+ case 'type':
+ case 'show':
+ return explode('|', preg_replace('/[^\w\x7c]/', '', $value));
+ default :
+ return check_plain($value);
+ }
+
+ return $value;
}
-?>
\ No newline at end of file