Project

General

Profile

Download (14.7 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
 * The contents of this file are subject to the Mozilla Public License Version 1.1
13
 * See LICENSE.TXT at the top of this package for the full license terms.
14
 */
15

    
16

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

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

    
83
  }
84
  return $items;
85
}
86

    
87

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

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

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

    
113

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

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

    
130

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

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

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

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

    
182
  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'));
183
}
184

    
185

    
186

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

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

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

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

    
336

    
337

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

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

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