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
 * Copyright (C) 2007 EDIT
9
 * European Distributed Institute of Taxonomy
10
 * http://www.e-taxonomy.eu
11
 *
12
 */
13

    
14

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

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

    
81
  }
82
  return $items;
83
}
84

    
85

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

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

    
96
  $header = array(t('Pattern'), t('Replacement'), t('Operations'));
97
  $rid = -1;
98
  if(count($rules)){
99
  foreach ($rules as $rule) {
100
      $rid++;
101
      $rows[] = array($rule['pattern'], $rule['replace'], l('edit', 'admin/settings/cdm_mediauri/edit/'. $rid).' | '.l('delete', 'admin/settings/cdm_mediauri/delete/'. $rid));
102
    }
103
  }
104
  else {
105
     $rows[] = array(array('data' => '<em>' 
106
     . 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) );
107
  }
108
  return theme('table', $header, $rows);
109
}
110

    
111

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

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

    
128

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

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

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

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

    
180
  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'));
181
}
182

    
183

    
184

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

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

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

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

    
334

    
335

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

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

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