Project

General

Profile

Download (14.6 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
// $Id$
3

    
4
/*
5
 * @file
6
 * cdm_mediauri.module
7
 * 
8
 *
9
 * Copyright (C) 2007 EDIT
10
 * European Distributed Institute of Taxonomy
11
 * http://www.e-taxonomy.eu
12
 *
13
 */
14

    
15

    
16
/**
17
 * Implementation of hook_menu()
18
 */
19
function cdm_mediauri_menu($may_cache) {
20
  
21
  $items = array();
22
  if ($may_cache) {
23
    
24
   $items[] = array(
25
      'path' => 'admin/settings/cdm_mediauri',
26
      'title' => t('CDM Media URI Conversion'),
27
      'description' => t('Media URI Conversion Rules'),
28
      'access' => user_access('administer cdm_dataportal'),
29
      'callback' => 'cdm_mediauri_overview',
30
      'type' => MENU_NORMAL_ITEM,
31
    );
32

    
33
  $items[] = array(
34
      'path' => 'admin/settings/cdm_mediauri/list',
35
      'title' => t('List'),
36
      'description' => t('Media URI Conversion Rules'),
37
      'access' => user_access('administer cdm_dataportal'),
38
      'callback' => 'cdm_mediauri_overview',
39
      'weight' => 1,
40
      'type' => MENU_DEFAULT_LOCAL_TASK,
41
    );
42
    
43
    $items[] = array(
44
      'path' => 'admin/settings/cdm_mediauri/add',
45
      'title' => t('Add Rule'),
46
      'description' => t('Add Media URI Conversion Rule'),
47
      'access' => user_access('administer cdm_dataportal'),
48
      'callback' => 'drupal_get_form',
49
      'callback arguments' => array('cdm_mediauri_rule_add'),
50
      'weight' => 2,
51
      'type' => MENU_LOCAL_TASK,
52
    );
53
    
54
     $items[] = array(
55
      'path' => 'admin/settings/cdm_mediauri/edit',
56
      'access' => user_access('administer cdm_dataportal'),
57
      'callback' => 'drupal_get_form',
58
      'callback arguments' => array('cdm_mediauri_rule_edit'),
59
      'type' => MENU_CALLBACK,
60
    );
61
    
62
     $items[] = array(
63
      'path' => 'admin/settings/cdm_mediauri/delete',
64
      'access' => user_access('administer cdm_dataportal'),
65
      'callback' => 'drupal_get_form',
66
      'callback arguments' => array('cdm_mediauri_rule_delete'),
67
      'type' => MENU_CALLBACK,
68
    );
69
    
70
    $rules = cdm_mediauri_rules();
71
    foreach($rules as $rule){
72
      if($rule['embed_html'] && $rule['path']){
73
        $items[] = array(
74
          'path' => $rule['path'],
75
          'access' => true, //TODO restrict access
76
          'callback' => 'cdm_mediauri_view_embed',
77
          'type' => MENU_CALLBACK,
78
        );
79
      }
80
    }
81

    
82
  }
83
  return $items;
84
}
85

    
86

    
87
/**
88
 * Returns an overview list of existing media uri rules
89
 */
90
function cdm_mediauri_overview($rules = false) {
91
  
92

    
93
  if(!$rules){
94
    $rules = cdm_mediauri_rules();
95
  }
96

    
97
  $header = array(t('Pattern'), t('Replacement'), t('Operations'));
98
  $rid = -1;
99
  if(count($rules)){
100
  foreach ($rules as $rule) {
101
      $rid++;
102
      $rows[] = array($rule['pattern'], $rule['replace'], l('edit', 'admin/settings/cdm_mediauri/edit/'. $rid).' | '.l('delete', 'admin/settings/cdm_mediauri/delete/'. $rid));
103
    }
104
  }
105
  else {
106
     $rows[] = array(array('data' => '<em>' 
107
     . t('There are no existing media uri conversion rules. You may add some rule: <a href="@add">add rule</a>', array('@add' => url('admin/settings/cdm_mediauri/add'))) . '</em>', 'colspan' => 3) );
108
  }
109
  return theme('table', $header, $rows);
110
}
111

    
112

    
113
/**
114
 * Menu callback; add new mediauri rule.
115
 */
116
function cdm_mediauri_rule_add() {
117
  
118
 
119
  $form = cdm_mediauri_rule_edit_form('new');
120
  return system_settings_form($form);
121
}
122

    
123
function cdm_mediauri_rule_edit($rid) {
124
  
125
  $form = cdm_mediauri_rule_edit_form($rid);
126
  return system_settings_form($form);
127
}
128

    
129

    
130
function cdm_mediauri_rule_add_submit($form_id, $form_values) {
131
  
132
  if($form_values['rid'] == 'new'){
133
    $rules = cdm_mediauri_rules();
134
    $rules[] = $form_values['rule'];
135
    variable_set('cdm_mediauri_rules', $rules);
136
       drupal_set_message('Rule added');
137
  }else {
138
    drupal_set_message('Cannot add rule', 'error');
139
  }
140
  return 'admin/settings/cdm_mediauri';
141
}
142

    
143
function cdm_mediauri_rule_edit_submit($form_id, $form_values) {
144
  
145
  if(is_numeric($form_values['rid'])){
146
    $rules = cdm_mediauri_rules();
147
    // determine if the menu has changed
148
    if($rules[$form_values['rid']]['embed'] != $form_values['rule']['embed'] || $rules[$form_values['rid']]['path'] != $form_values['rule']['path']) {    
149
      menu_rebuild();
150
      drupal_set_message('Menu Rebuild');
151
    }
152
    $rules[$form_values['rid']] = $form_values['rule'];
153
    variable_set('cdm_mediauri_rules', $rules);
154
     drupal_set_message('Rule saved');
155
  }else {
156
    drupal_set_message('Cannot save rule (invalid rule id)', 'error');
157
  }
158
  return 'admin/settings/cdm_mediauri';
159
}
160

    
161
function cdm_mediauri_rule_delete_submit($form_id, $form_values) {
162
  
163
  if(is_numeric($form_values['rid'])){
164
    $rules = cdm_mediauri_rules();
165
    unset($rules[$form_values['rid']]);
166
    variable_set('cdm_mediauri_rules', $rules);
167
    drupal_set_message('Rule deleted');
168
  } else {
169
    drupal_set_message('Cannot delete rule (invalid rule id)', 'error');
170
  }
171
  return 'admin/settings/cdm_mediauri';
172
}
173

    
174
/**
175
 * Menu callback; confirm deletion of mediauri rule.
176
 */
177
function cdm_mediauri_rule_delete($rid = 0) {
178
  $rules = cdm_mediauri_rules();
179
  $form['rid'] = array('#type' => 'hidden', '#value' => $rid);
180

    
181
  return confirm_form($form, t('Are you sure you want to delete the following rule:'.cdm_mediauri_overview(array($rules[$rid]))), 'admin/settings/cdm_mediauri', '', t('Delete'), t('Cancel'));
182
}
183

    
184

    
185

    
186
function cdm_mediauri_rule_edit_form($rid = 'new'){
187

    
188
  if($rid == 'new'){
189
    // ---- little code snipped used to import default rules during development 
190
    $default_rule_id = FALSE; // 0 or 1 or FALSE
191
    
192
    if($default_rule_id !== false){
193
      $default_rules = cdm_mediauri_rules(true);
194
      $rule = $default_rules[$default_rule_id];
195
    }
196
    // --- END
197
  
198
    if(!$rule) {
199
      $rule = array();
200
      $rule['type'] = 'empty';
201
      $rule['pattern'] = '';
202
      $rule['replace'] = '';
203
      $rule['prefix'] = ''; 
204
      $rule['affix'] = '';
205
      $rule['url_encode'] = 0; 
206
      $rule['embed_html'] = 0;
207
      $rule['path'] = '';
208
      $rule['title'] = '';
209
    }
210
  } else {
211
    $rules = cdm_mediauri_rules(); 
212
    $rule = $rules[$rid];
213
  }
214
  
215
  $form = array();
216

    
217
  /*
218
   * rule
219
   * 
220
   *  ['type']: values(preview, webapp, media)
221
   *  ['size_x'], ['size_y']: dimensions of preview image in px
222
   *  ['pattern']: php PCRE regex pattern (see: http://www.php.net/manual/reference.pcre.pattern.syntax.php)
223
   *  ['replace']: replacement string 
224
   *  ['prefix']: string by which the converted url is to be prefixed
225
   *  ['affix']: string by which the converted url is to be affixed
226
   *  ['url_encode']: values(TRUE, FALSE) if the converted url is to be url encoded
227
   *  ['embed_html']: embes the construct of prefix + url + affix into the page as plain html
228
   * 
229
   */
230
  $form['rid'] = array(
231
    '#type' => 'hidden',
232
    '#value' => $rid,
233
   );
234
  
235
  $form['rule'] = array(
236
    '#type' => 'fieldset',
237
    '#title' => ($rule['type'] == 'empty' ? t('New Rule') : t('Rule '.$rid)),
238
    '#tree' => TRUE,
239
  );
240
  
241
  $form['rule']['type'] =  array(
242
    '#type'  => 'select',
243
    '#title' => t('Type'),
244
    '#default_value' => $rule['type'],
245
    '#options' => array(
246
        'preview' => t('Preview Quality'),
247
        'webapp' => t('Web Application'),
248
        ),
249
    '#description'   => t('The type media representation.'),
250
  );
251
  
252
   $form['rule']['pattern'] =  array(
253
    '#type' => 'textarea',
254
    '#title'         => t('Pattern'),
255
    '#description'   => t('php PCRE regex pattern (see: ').l('php manual', 'http://www.php.net/manual/reference.pcre.pattern.syntax.php').')',
256
    '#default_value' => $rule['pattern'],
257
    '#rows' => 1
258
  );
259
  
260
  $form['rule']['replace'] =  array(
261
    '#type' => 'textarea',
262
    '#title'         => t('Replacement'),
263
    '#default_value' => $rule['replace'],
264
    '#rows' => 1,
265
   );
266
  
267
  //  ['embed_html'] = 1;
268
  
269
  $form['rule']['embed_html'] =  array(
270
    '#type' => 'checkbox',
271
    '#title'         => t('Embed'),
272
    '#default_value' => $rule['embed_html'],
273
    '#description'   => t('Embed the construct of prefix + url + affix into the page as plain html')
274
   );
275

    
276
   $form['rule']['url_encode'] =  array(
277
    '#type' => 'checkbox',
278
    '#title'         => t('Url Encode'),
279
    '#default_value' => $rule['url_encode'],
280
    '#description'   => t('Whether the converted url is to be url encoded')
281
   );
282
  
283
   
284
  $form['rule']['path'] =  array(
285
    '#type'          => 'textfield',
286
    '#title'         => t('Drupal Path'),
287
    '#default_value' => $rule['path'],
288
    '#description'   => t('Drupal Path under which the media is to be embedded into a page')
289
  );
290
  
291
  
292
  $form['rule']['title'] =  array(
293
    '#type'          => 'textfield',
294
    '#title'         => t('Page Title'),
295
    '#default_value' => $rule['title'],
296
    '#description'   => t('Page Title')
297
  );
298
  
299
   
300
  $form['rule']['prefix'] =  array(
301
    '#type' => 'textarea',
302
    '#title'   => t('Prefix'),
303
    '#default_value' => $rule['prefix'],
304
    '#rows' => 1,
305
  );
306
  
307
    $form['rule']['affix'] =  array(
308
    '#type' => 'textarea',
309
    '#title'   => t('Affix'),
310
    '#default_value' => $rule['affix'],
311
    '#rows' => 1,
312
  );
313
  
314
   $form['rule']['size_x'] =  array(
315
    '#type' => 'textfield',
316
    '#title'         => t('Preview Image Width'),
317
    '#default_value' => $rule['size_x'],
318
    '#disabled' => $rule['type'] != 'preview',
319
    '#description'   => t('Width of preview image in px'),
320
    '#size' => 4, 
321
  );
322
  
323
  $form['rule']['size_y'] =  array(
324
    '#type' => 'textfield',
325
    '#title'         => t('Preview Image Height'),
326
    '#default_value' => $rule['size_y'],
327
    '#disabled' => $rule['type'] != 'preview',
328
    '#description'   => t('Height of preview image in px'),
329
    '#size' => 4, 
330
  );
331
    
332
  return $form;
333
}
334

    
335

    
336

    
337
function cdm_mediauri_rules($default = false){
338
  /*
339
   * rules
340
   * 
341
   *  ['type']: values(preview, webapp, media)
342
   *  ['size_x'], ['size_y']: dimensions of preview image in px
343
   *  ['pattern']: php PCRE regex pattern (see: http://www.php.net/manual/reference.pcre.pattern.syntax.php)
344
   *  ['replace']: replacement string 
345
   *  ['prefix']: string by which the converted url is to be prefixed
346
   *  ['affix']: string by which the converted url is to be affixed
347
   *  ['url_encode']: values(TRUE, FALSE) if the converted url to be url encoded
348
   *  ['embed_html']: embes the construct of prefix + url + affix into the page as plain html
349
   * 
350
   */
351
  if($default){
352
  // default rules
353
  $rule1 = array();
354
  $rule1['type'] = 'preview';
355
  $rule1['pattern'] = '/^(http:\/\/ww2.bgbm.org\/herbarium\/images(?:\/\w+)(?:\/\d+){4})(\/)(.*)$/';
356
  $rule1['replace'] = '$1/thumbs/$3';
357
  $rule1['size_x'] = 125;
358
  $rule1['size_Y'] = 200;
359
  
360
  
361
  $rule2 = array();
362
  $rule2['type'] = 'webapp';
363
  $rule2['pattern'] = '/^http:\/\/ww2.bgbm.org\/herbarium\/images\/((?:\w+\/)(?:\d+\/){4}[\w_]+?\.)(.*)$/';
364
  $rule2['replace'] = '$1fpx';
365
  $rule2['prefix'] = '<div style="float: left; width: 10em;">
366
  <p>© BGBM: <br>
367
  Access is granted under the following conditions:<br>
368
  The images may not passed on to any third party without our written
369
  consent and due mention of the copyright restrictions, and may not be
370
  used for commercial or non-scientific purposes. Reproduction in
371
  scientific publications is authorized on the condition that the source
372
  and the copyright are fully acknowledged:<br>
373
  © Botanischer Garten und Botanisches Museum Berlin-Dahlem, FU Berlin.</li>
374
</p>
375
<p><a href="http://www.bgbm.org/bgbm/verantwo_e.htm"
376
    class="leftnavi" title="Contact">Contact</a> | <a href="http://www.bgbm.org/bgbm/imprint.htm"
377
    class="leftnavi" title="Impressum">Imprint</a> | <a href="http://www.bgbm.org/disclaim_e.htm" class="leftnavi"
378
    title="Disclaimer">Disclaimer</a>
379
</p>
380
</div><div><embed width="490" height="700" align="middle" type="application/x-shockwave-flash" 
381
       pluginspage="http://www.macromedia.com/go/getflashplayer" name="FSIViewer" 
382
       bgcolor="black" quality="high" play="true" 
383
       src="http://ww2.bgbm.org/fsi/fsi.swf?cfg=plugin2&FPXSrc='; 
384
  $rule2['affix'] = '&FPXWidth=2801&FPXHeight=4478&Effects=qlt%3D85&InitialView=&Measure_ImageWidth=270.0&Measure_Suffix=%20mm"/></div>';
385
  $rule2['url_encode'] = 1; 
386
  $rule2['embed_html'] = 1;
387
  $rule2['path'] = 'bgbm.org/herbarium';
388
  
389
  return array($rule1, $rule2);
390
  
391
  } else {
392
    return variable_get('cdm_mediauri_rules', array());
393
  }
394
  
395
}
396

    
397
/**
398
 * Converts a media uri according to all matching conversion rules which are currently defined.
399
 * 
400
 * Format of a returned array element:
401
 * 
402
 *  $return_array[{type}] { // values for {type}:(preview, webapp, media, original)
403
 *      ['size_x'],         // dimensions of preview image in px
404
 *      ['size_y'],         // dimensions of preview image in px
405
 *      ['uri']             // the uri possibly prefixed with path
406
 *      ['embed_html']      // the uri embedded into some string
407
 *  }
408
 * 
409
 * @return returns an associative array of the original media uri and all convered 
410
 *    whereas the rule type becomes the array key of the array entries.
411
 *    All uris are again packed into associative arrays by means to submit 
412
 *    additional information as defined in the rules applied. 
413
 */
414
function cdm_mediauri_conversion($mediaUri){
415
  
416
  $rules = cdm_mediauri_rules();
417
  
418
  $muris = array();
419
  $muris['original'] = array('uri' => $mediaUri, 'size_x'=>null, 'size_y'=>null);
420
  
421
  foreach($rules as $rule){
422
      $uri_converted = preg_replace($rule['pattern'], $rule['replace'], $mediaUri);
423
      if($uri_converted != $mediaUri){
424
        if(isset($rule['url_encode']) && $rule['url_encode']){
425
          $uri_converted = urlencode($uri_converted);
426
        }
427
        $muris[$rule['type']] = array('uri'=>$uri_converted, 'size_x'=>$rule['size_x'], 'size_y'=>$rule['size_y']);
428
        if(isset($rule['embed_html']) && $rule['embed_html']){
429
          if($rule['path']){
430
            // embed later on other page
431
            $muris[$rule['type']]['uri'] = $rule['path'].'/'.$uri_converted;
432
          } else {
433
            // direct embed
434
            $muris[$rule['type']]['embed_html'] =  $rule['prefix'].$uri_converted.$rule['affix'];
435
          }
436
        }
437
      }
438
  }
439
  return $muris;
440
}
441

    
442
function cdm_mediauri_view_embed($uri){
443
  
444
  $path = '';
445
  for($i = 0; ($arg = arg($i)); $i++){
446
    if($arg == $uri){
447
      break;
448
    } else {
449
      $path .= ($path ? '/': '').$arg;
450
    }
451
  }
452
  
453
  $rule = false;
454
  foreach(cdm_mediauri_rules() as $r){
455
    if($r['embed_html'] && $r['path'] == $path){
456
      $rule = $r;
457
      break;
458
    }
459
  }
460
  
461
  if($rule){
462
    drupal_set_title($rule['title']);
463
    return $rule['prefix'].$uri.$rule['affix'];
464
  }
465
  
466
  return 'ERROR:'.$path.$uri;
467
}
(3-3/4)