summaryrefslogtreecommitdiffstats
path: root/gallery_filter.inc
blob: 573ca31a378e833de527dc5b83d2adf72fa754d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<?php

/**
 * gallery.module : gallery_filter.inc
 * Gallery Filter functions
 */

/**
 * Function gallery_filter_process().
 * (implementation of the main filter routine)
 */
function gallery_filter_process($text) {
  $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'] = implode('|', array_fill(0, $default['n'], 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'] = 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])) {
      $params = array();
      $params['itemId'] = intval($match[1]);
      $args = array_filter(preg_split('/[\s,]+/', $match[2]));
      // Loop over all (optional) arguments
      foreach ($args as $arg) {
        list($key, $value) = array_filter(explode('=', $arg));
        $key = preg_replace('/\W/', '', $key);
        $params[$key] = _gallery_filter_sanitize($key, $value);
      }
      // 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']);
      }      
      if (isset($params['exactsize'])) {
        unset($default['maxsize']);
      }
      // Merge params with default values
      $params = array_merge($default, $params);
      // Transform 'type' into a valid parameter
      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'];
        unset($params['exactSize']);
      }
      if (isset($params['exactsize']) && !empty($params['exactsize'])) {    
        $params['exactSize'] = $params['exactsize'];
        unset($params['maxSize']);
      }
      $params['albumFrame'] = $params['album_frame'];
      $params['itemFrame'] = $params['item_frame'];
      $params['linkTarget'] = $params['target'];
      $params['link'] = $params['link'];
      
  		// Fetch the images and format output
      list($ret, $content, $head) = GalleryEmbed::getImageBlock($params);
      if ($ret) {
        gallery_error(t('Unable to get Gallery 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) {
        $head_array[] = trim($head);
      }
    }
  }
  
  // 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;
}