xref: /plugin/strata/types/image.php (revision 5153720fcc1dd2b6e63035d45f7c2bc32e429371)
1*5153720fSfkaag71<?php
2*5153720fSfkaag71/**
3*5153720fSfkaag71 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
4*5153720fSfkaag71 * @author     Brend Wanders <b.wanders@utwente.nl>
5*5153720fSfkaag71 */
6*5153720fSfkaag71// must be run within Dokuwiki
7*5153720fSfkaag71if(!defined('DOKU_INC')) die('Meh.');
8*5153720fSfkaag71
9*5153720fSfkaag71/**
10*5153720fSfkaag71 * The image type.
11*5153720fSfkaag71 */
12*5153720fSfkaag71class plugin_strata_type_image extends plugin_strata_type {
13*5153720fSfkaag71    function isExternalMedia($value) {
14*5153720fSfkaag71        return preg_match('#^(https?|ftp)#i', $value);
15*5153720fSfkaag71    }
16*5153720fSfkaag71
17*5153720fSfkaag71    function normalize($value, $hint) {
18*5153720fSfkaag71        global $ID;
19*5153720fSfkaag71
20*5153720fSfkaag71        // strip leading {{ and closing }}
21*5153720fSfkaag71        $value = preg_replace(array('/^\{\{/','/\}\}$/u'), '', $value);
22*5153720fSfkaag71
23*5153720fSfkaag71        // drop any title and alignment spacing whitespace
24*5153720fSfkaag71        $value = explode('|', $value, 2);
25*5153720fSfkaag71        $value = trim($value[0]);
26*5153720fSfkaag71
27*5153720fSfkaag71        if($this->isExternalMedia($value)) {
28*5153720fSfkaag71            // external image
29*5153720fSfkaag71            // we don't do anything else here
30*5153720fSfkaag71        } else {
31*5153720fSfkaag71            // internal image
32*5153720fSfkaag71
33*5153720fSfkaag71            // discard size string and other options
34*5153720fSfkaag71            $pos = strrpos($value, '?');
35*5153720fSfkaag71            if($pos !== false ) {
36*5153720fSfkaag71                $value = substr($value, 0, $pos);
37*5153720fSfkaag71            }
38*5153720fSfkaag71
39*5153720fSfkaag71            // resolve page id with respect to selected base
40*5153720fSfkaag71            resolve_mediaid(getNS($ID),$value,$exists);
41*5153720fSfkaag71        }
42*5153720fSfkaag71
43*5153720fSfkaag71        return $value;
44*5153720fSfkaag71    }
45*5153720fSfkaag71
46*5153720fSfkaag71    function render($mode, &$R, &$T, $value, $hint) {
47*5153720fSfkaag71        if(preg_match('/([0-9]+)(?:x([0-9]+))?/',$hint,$captures)) {
48*5153720fSfkaag71            if(!empty($captures[1])) $width = (int)$captures[1];
49*5153720fSfkaag71            if(!empty($captures[2])) $height = (int)$captures[2];
50*5153720fSfkaag71        }
51*5153720fSfkaag71
52*5153720fSfkaag71        if($this->isExternalMedia($value)) {
53*5153720fSfkaag71            // render external media
54*5153720fSfkaag71            $R->externalmedia($value,null,null,$width,$height);
55*5153720fSfkaag71        } else {
56*5153720fSfkaag71            // render internal media
57*5153720fSfkaag71            // (':' is prepended to make sure we use an absolute pagename,
58*5153720fSfkaag71            // internalmedia resolves media ids, but the name is already resolved.)
59*5153720fSfkaag71            $R->internalmedia(':'.$value,null,null,$width,$height);
60*5153720fSfkaag71        }
61*5153720fSfkaag71    }
62*5153720fSfkaag71
63*5153720fSfkaag71    function getInfo() {
64*5153720fSfkaag71        return array(
65*5153720fSfkaag71            'desc'=>'Displays an image. The optional hint is treated as the size to scale the image to. Give the hint in WIDTHxHEIGHT format.',
66*5153720fSfkaag71            'hint'=>'size to scale the image to'
67*5153720fSfkaag71        );
68*5153720fSfkaag71    }
69*5153720fSfkaag71}
70