xref: /plugin/bez/renderer/xhtmlmail.php (revision a0cd8c785f18b483f73582b411767428d04a78f6)
1*a0cd8c78SSzymon Olewniczak<?php
2*a0cd8c78SSzymon Olewniczak
3*a0cd8c78SSzymon Olewniczakclass renderer_plugin_bez_xhtmlmail extends Doku_Renderer_xhtml {
4*a0cd8c78SSzymon Olewniczak
5*a0cd8c78SSzymon Olewniczak    /** @var array Settings, control the behavior of the renderer */
6*a0cd8c78SSzymon Olewniczak    public $info = array(
7*a0cd8c78SSzymon Olewniczak        'cache' => true, // may the rendered result cached?
8*a0cd8c78SSzymon Olewniczak        'toc'   => true, // render the TOC?
9*a0cd8c78SSzymon Olewniczak        'img'   => array(), //images to attach in mail
10*a0cd8c78SSzymon Olewniczak    );
11*a0cd8c78SSzymon Olewniczak
12*a0cd8c78SSzymon Olewniczak    /**
13*a0cd8c78SSzymon Olewniczak     * Our own format
14*a0cd8c78SSzymon Olewniczak     *
15*a0cd8c78SSzymon Olewniczak     * @return string
16*a0cd8c78SSzymon Olewniczak     */
17*a0cd8c78SSzymon Olewniczak    function getFormat() {
18*a0cd8c78SSzymon Olewniczak        return 'bez_xhtmlmail';
19*a0cd8c78SSzymon Olewniczak    }
20*a0cd8c78SSzymon Olewniczak
21*a0cd8c78SSzymon Olewniczak    /**
22*a0cd8c78SSzymon Olewniczak     * Unique media file cid used by Mailer to identify images
23*a0cd8c78SSzymon Olewniczak     *
24*a0cd8c78SSzymon Olewniczak     * @param string $mediaId
25*a0cd8c78SSzymon Olewniczak     * @param string $rev
26*a0cd8c78SSzymon Olewniczak     * @param bool   $delimiters wrap emded with '%%'
27*a0cd8c78SSzymon Olewniczak     * @return string
28*a0cd8c78SSzymon Olewniczak     */
29*a0cd8c78SSzymon Olewniczak    private function embed($mediaId, $rev='', $delimiters=false) {
30*a0cd8c78SSzymon Olewniczak        $embed = $mediaId . $rev;
31*a0cd8c78SSzymon Olewniczak        if ($delimiters) $embed = '%%' . $embed . '%%';
32*a0cd8c78SSzymon Olewniczak        return $embed;
33*a0cd8c78SSzymon Olewniczak    }
34*a0cd8c78SSzymon Olewniczak
35*a0cd8c78SSzymon Olewniczak    /**
36*a0cd8c78SSzymon Olewniczak     * Render an internal media file
37*a0cd8c78SSzymon Olewniczak     *
38*a0cd8c78SSzymon Olewniczak     * @param string $src       media ID
39*a0cd8c78SSzymon Olewniczak     * @param string $title     descriptive text
40*a0cd8c78SSzymon Olewniczak     * @param string $align     left|center|right
41*a0cd8c78SSzymon Olewniczak     * @param int    $width     width of media in pixel
42*a0cd8c78SSzymon Olewniczak     * @param int    $height    height of media in pixel
43*a0cd8c78SSzymon Olewniczak     * @param string $cache     cache|recache|nocache
44*a0cd8c78SSzymon Olewniczak     * @param string $linking   linkonly|detail|nolink
45*a0cd8c78SSzymon Olewniczak     * @param bool   $return    return HTML instead of adding to $doc
46*a0cd8c78SSzymon Olewniczak     * @return void|string writes to doc attribute or returns html depends on $return
47*a0cd8c78SSzymon Olewniczak     */
48*a0cd8c78SSzymon Olewniczak    function internalmedia($src, $title = null, $align = null, $width = null,
49*a0cd8c78SSzymon Olewniczak                           $height = null, $cache = null, $linking = null, $return = false) {
50*a0cd8c78SSzymon Olewniczak        global $ID;
51*a0cd8c78SSzymon Olewniczak        list($src, $hash) = explode('#', $src, 2);
52*a0cd8c78SSzymon Olewniczak        resolve_mediaid(getNS($ID), $src, $exists, $this->date_at, true);
53*a0cd8c78SSzymon Olewniczak
54*a0cd8c78SSzymon Olewniczak        $noLink = false;
55*a0cd8c78SSzymon Olewniczak        $render = ($linking == 'linkonly') ? false : true;
56*a0cd8c78SSzymon Olewniczak        $link   = $this->_getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render);
57*a0cd8c78SSzymon Olewniczak        if ($exists) {
58*a0cd8c78SSzymon Olewniczak            $rev = $this->_getLastMediaRevisionAt($src);
59*a0cd8c78SSzymon Olewniczak            $path = mediaFN($src, $rev);
60*a0cd8c78SSzymon Olewniczak            list($ext, $mime) = mimetype($src);
61*a0cd8c78SSzymon Olewniczak
62*a0cd8c78SSzymon Olewniczak            $this->info['img'][] = array(
63*a0cd8c78SSzymon Olewniczak                'path'  => $path,
64*a0cd8c78SSzymon Olewniczak                'mime'  => $mime,
65*a0cd8c78SSzymon Olewniczak                'name'  => $title,
66*a0cd8c78SSzymon Olewniczak                'embed' => $this->embed($src, $rev)
67*a0cd8c78SSzymon Olewniczak            );
68*a0cd8c78SSzymon Olewniczak        }
69*a0cd8c78SSzymon Olewniczak
70*a0cd8c78SSzymon Olewniczak        list($ext, $mime) = mimetype($src, false);
71*a0cd8c78SSzymon Olewniczak        if(substr($mime, 0, 5) == 'image' && $render) {
72*a0cd8c78SSzymon Olewniczak            $link['url'] = ml($src, array('id' => $ID, 'cache' => $cache, 'rev'=>$this->_getLastMediaRevisionAt($src)),
73*a0cd8c78SSzymon Olewniczak                ($linking == 'direct'), '&amp;', true);
74*a0cd8c78SSzymon Olewniczak        } elseif(($mime == 'application/x-shockwave-flash' || media_supportedav($mime)) && $render) {
75*a0cd8c78SSzymon Olewniczak            // don't link movies
76*a0cd8c78SSzymon Olewniczak            $noLink = true;
77*a0cd8c78SSzymon Olewniczak        } else {
78*a0cd8c78SSzymon Olewniczak            // add file icons
79*a0cd8c78SSzymon Olewniczak            $class = preg_replace('/[^_\-a-z0-9]+/i', '_', $ext);
80*a0cd8c78SSzymon Olewniczak            $link['class'] .= ' mediafile mf_'.$class;
81*a0cd8c78SSzymon Olewniczak            $link['url'] = ml($src, array('id' => $ID, 'cache' => $cache , 'rev'=>$this->_getLastMediaRevisionAt($src)),
82*a0cd8c78SSzymon Olewniczak                              true, '&amp;', true);
83*a0cd8c78SSzymon Olewniczak            if($exists) $link['title'] .= ' ('.filesize_h(filesize(mediaFN($src))).')';
84*a0cd8c78SSzymon Olewniczak        }
85*a0cd8c78SSzymon Olewniczak
86*a0cd8c78SSzymon Olewniczak        if($hash) $link['url'] .= '#'.$hash;
87*a0cd8c78SSzymon Olewniczak
88*a0cd8c78SSzymon Olewniczak        //markup non existing files
89*a0cd8c78SSzymon Olewniczak        if(!$exists) {
90*a0cd8c78SSzymon Olewniczak            $link['class'] .= ' wikilink2';
91*a0cd8c78SSzymon Olewniczak        }
92*a0cd8c78SSzymon Olewniczak
93*a0cd8c78SSzymon Olewniczak        //output formatted
94*a0cd8c78SSzymon Olewniczak        if($return) {
95*a0cd8c78SSzymon Olewniczak            if($linking == 'nolink' || $noLink) return $link['name'];
96*a0cd8c78SSzymon Olewniczak            else return $this->_formatLink($link);
97*a0cd8c78SSzymon Olewniczak        } else {
98*a0cd8c78SSzymon Olewniczak            if($linking == 'nolink' || $noLink) $this->doc .= $link['name'];
99*a0cd8c78SSzymon Olewniczak            else $this->doc .= $this->_formatLink($link);
100*a0cd8c78SSzymon Olewniczak        }
101*a0cd8c78SSzymon Olewniczak    }
102*a0cd8c78SSzymon Olewniczak
103*a0cd8c78SSzymon Olewniczak    /**
104*a0cd8c78SSzymon Olewniczak     * Renders internal and external media
105*a0cd8c78SSzymon Olewniczak     *
106*a0cd8c78SSzymon Olewniczak     * @author Andreas Gohr <andi@splitbrain.org>
107*a0cd8c78SSzymon Olewniczak     * @param string $src       media ID
108*a0cd8c78SSzymon Olewniczak     * @param string $title     descriptive text
109*a0cd8c78SSzymon Olewniczak     * @param string $align     left|center|right
110*a0cd8c78SSzymon Olewniczak     * @param int    $width     width of media in pixel
111*a0cd8c78SSzymon Olewniczak     * @param int    $height    height of media in pixel
112*a0cd8c78SSzymon Olewniczak     * @param string $cache     cache|recache|nocache
113*a0cd8c78SSzymon Olewniczak     * @param bool   $render    should the media be embedded inline or just linked
114*a0cd8c78SSzymon Olewniczak     * @return string
115*a0cd8c78SSzymon Olewniczak     */
116*a0cd8c78SSzymon Olewniczak    function _media($src, $title = null, $align = null, $width = null,
117*a0cd8c78SSzymon Olewniczak                    $height = null, $cache = null, $render = true) {
118*a0cd8c78SSzymon Olewniczak
119*a0cd8c78SSzymon Olewniczak        $ret = '';
120*a0cd8c78SSzymon Olewniczak
121*a0cd8c78SSzymon Olewniczak        list($ext, $mime) = mimetype($src);
122*a0cd8c78SSzymon Olewniczak        if(substr($mime, 0, 5) == 'image') {
123*a0cd8c78SSzymon Olewniczak            // first get the $title
124*a0cd8c78SSzymon Olewniczak            if(!is_null($title)) {
125*a0cd8c78SSzymon Olewniczak                $title = $this->_xmlEntities($title);
126*a0cd8c78SSzymon Olewniczak            } elseif($ext == 'jpg' || $ext == 'jpeg') {
127*a0cd8c78SSzymon Olewniczak                //try to use the caption from IPTC/EXIF
128*a0cd8c78SSzymon Olewniczak                require_once(DOKU_INC.'inc/JpegMeta.php');
129*a0cd8c78SSzymon Olewniczak                $jpeg = new JpegMeta(mediaFN($src));
130*a0cd8c78SSzymon Olewniczak                if($jpeg !== false) $cap = $jpeg->getTitle();
131*a0cd8c78SSzymon Olewniczak                if(!empty($cap)) {
132*a0cd8c78SSzymon Olewniczak                    $title = $this->_xmlEntities($cap);
133*a0cd8c78SSzymon Olewniczak                }
134*a0cd8c78SSzymon Olewniczak            }
135*a0cd8c78SSzymon Olewniczak            if(!$render) {
136*a0cd8c78SSzymon Olewniczak                // if the picture is not supposed to be rendered
137*a0cd8c78SSzymon Olewniczak                // return the title of the picture
138*a0cd8c78SSzymon Olewniczak                if(!$title) {
139*a0cd8c78SSzymon Olewniczak                    // just show the sourcename
140*a0cd8c78SSzymon Olewniczak                    $title = $this->_xmlEntities(utf8_basename(noNS($src)));
141*a0cd8c78SSzymon Olewniczak                }
142*a0cd8c78SSzymon Olewniczak                return $title;
143*a0cd8c78SSzymon Olewniczak            }
144*a0cd8c78SSzymon Olewniczak            //add image tag
145*a0cd8c78SSzymon Olewniczak            $rev = $this->_getLastMediaRevisionAt($src);
146*a0cd8c78SSzymon Olewniczak            $ret .= '<img src="' . $this->embed($src, $rev, true) . '"';
147*a0cd8c78SSzymon Olewniczak            $ret .= ' class="media'.$align.'"';
148*a0cd8c78SSzymon Olewniczak
149*a0cd8c78SSzymon Olewniczak            if($title) {
150*a0cd8c78SSzymon Olewniczak                $ret .= ' title="'.$title.'"';
151*a0cd8c78SSzymon Olewniczak                $ret .= ' alt="'.$title.'"';
152*a0cd8c78SSzymon Olewniczak            } else {
153*a0cd8c78SSzymon Olewniczak                $ret .= ' alt=""';
154*a0cd8c78SSzymon Olewniczak            }
155*a0cd8c78SSzymon Olewniczak
156*a0cd8c78SSzymon Olewniczak            if(!is_null($width))
157*a0cd8c78SSzymon Olewniczak                $ret .= ' width="'.$this->_xmlEntities($width).'"';
158*a0cd8c78SSzymon Olewniczak
159*a0cd8c78SSzymon Olewniczak            if(!is_null($height))
160*a0cd8c78SSzymon Olewniczak                $ret .= ' height="'.$this->_xmlEntities($height).'"';
161*a0cd8c78SSzymon Olewniczak
162*a0cd8c78SSzymon Olewniczak            $ret .= ' />';
163*a0cd8c78SSzymon Olewniczak
164*a0cd8c78SSzymon Olewniczak        } elseif(media_supportedav($mime, 'video') || media_supportedav($mime, 'audio')) {
165*a0cd8c78SSzymon Olewniczak            // first get the $title
166*a0cd8c78SSzymon Olewniczak            $title = !is_null($title) ? $this->_xmlEntities($title) : false;
167*a0cd8c78SSzymon Olewniczak            if(!$render) {
168*a0cd8c78SSzymon Olewniczak                // if the file is not supposed to be rendered
169*a0cd8c78SSzymon Olewniczak                // return the title of the file (just the sourcename if there is no title)
170*a0cd8c78SSzymon Olewniczak                return $title ? $title : $this->_xmlEntities(utf8_basename(noNS($src)));
171*a0cd8c78SSzymon Olewniczak            }
172*a0cd8c78SSzymon Olewniczak
173*a0cd8c78SSzymon Olewniczak            $att          = array();
174*a0cd8c78SSzymon Olewniczak            $att['class'] = "media$align";
175*a0cd8c78SSzymon Olewniczak            if($title) {
176*a0cd8c78SSzymon Olewniczak                $att['title'] = $title;
177*a0cd8c78SSzymon Olewniczak            }
178*a0cd8c78SSzymon Olewniczak
179*a0cd8c78SSzymon Olewniczak            if(media_supportedav($mime, 'video')) {
180*a0cd8c78SSzymon Olewniczak                //add video
181*a0cd8c78SSzymon Olewniczak                $ret .= $this->_video($src, $width, $height, $att);
182*a0cd8c78SSzymon Olewniczak            }
183*a0cd8c78SSzymon Olewniczak            if(media_supportedav($mime, 'audio')) {
184*a0cd8c78SSzymon Olewniczak                //add audio
185*a0cd8c78SSzymon Olewniczak                $ret .= $this->_audio($src, $att);
186*a0cd8c78SSzymon Olewniczak            }
187*a0cd8c78SSzymon Olewniczak
188*a0cd8c78SSzymon Olewniczak        } elseif($mime == 'application/x-shockwave-flash') {
189*a0cd8c78SSzymon Olewniczak            if(!$render) {
190*a0cd8c78SSzymon Olewniczak                // if the flash is not supposed to be rendered
191*a0cd8c78SSzymon Olewniczak                // return the title of the flash
192*a0cd8c78SSzymon Olewniczak                if(!$title) {
193*a0cd8c78SSzymon Olewniczak                    // just show the sourcename
194*a0cd8c78SSzymon Olewniczak                    $title = utf8_basename(noNS($src));
195*a0cd8c78SSzymon Olewniczak                }
196*a0cd8c78SSzymon Olewniczak                return $this->_xmlEntities($title);
197*a0cd8c78SSzymon Olewniczak            }
198*a0cd8c78SSzymon Olewniczak
199*a0cd8c78SSzymon Olewniczak            $att          = array();
200*a0cd8c78SSzymon Olewniczak            $att['class'] = "media$align";
201*a0cd8c78SSzymon Olewniczak            if($align == 'right') $att['align'] = 'right';
202*a0cd8c78SSzymon Olewniczak            if($align == 'left') $att['align'] = 'left';
203*a0cd8c78SSzymon Olewniczak            $ret .= html_flashobject(
204*a0cd8c78SSzymon Olewniczak                ml($src, array('cache' => $cache), true, '&'), $width, $height,
205*a0cd8c78SSzymon Olewniczak                array('quality' => 'high'),
206*a0cd8c78SSzymon Olewniczak                null,
207*a0cd8c78SSzymon Olewniczak                $att,
208*a0cd8c78SSzymon Olewniczak                $this->_xmlEntities($title)
209*a0cd8c78SSzymon Olewniczak            );
210*a0cd8c78SSzymon Olewniczak        } elseif($title) {
211*a0cd8c78SSzymon Olewniczak            // well at least we have a title to display
212*a0cd8c78SSzymon Olewniczak            $ret .= $this->_xmlEntities($title);
213*a0cd8c78SSzymon Olewniczak        } else {
214*a0cd8c78SSzymon Olewniczak            // just show the sourcename
215*a0cd8c78SSzymon Olewniczak            $ret .= $this->_xmlEntities(utf8_basename(noNS($src)));
216*a0cd8c78SSzymon Olewniczak        }
217*a0cd8c78SSzymon Olewniczak
218*a0cd8c78SSzymon Olewniczak        return $ret;
219*a0cd8c78SSzymon Olewniczak    }
220*a0cd8c78SSzymon Olewniczak}