xref: /plugin/mediathumbnails/syntax.php (revision bbf77476bb5361153ead40c284b7dea52f6e09ea)
1*bbf77476Sternite<?php
2*bbf77476Sternite/**
3*bbf77476Sternite * DokuWiki Plugin mediathumbnails (Syntax Component)
4*bbf77476Sternite *
5*bbf77476Sternite * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6*bbf77476Sternite * @author  Thomas Schäfer <thomas.schaefer@itschert.net>
7*bbf77476Sternite */
8*bbf77476Sternite
9*bbf77476Sternite// must be run within Dokuwiki
10*bbf77476Sterniteif (!defined('DOKU_INC')) {
11*bbf77476Sternite    die();
12*bbf77476Sternite}
13*bbf77476Sternite
14*bbf77476Sterniteclass syntax_plugin_mediathumbnails extends DokuWiki_Syntax_Plugin {
15*bbf77476Sternite
16*bbf77476Sternite	/**
17*bbf77476Sternite     * @return string Syntax mode type
18*bbf77476Sternite     */
19*bbf77476Sternite    public function getType()
20*bbf77476Sternite    {
21*bbf77476Sternite        return 'substition';
22*bbf77476Sternite    }
23*bbf77476Sternite
24*bbf77476Sternite    /**
25*bbf77476Sternite     * @return string Paragraph type
26*bbf77476Sternite     */
27*bbf77476Sternite    public function getPType()
28*bbf77476Sternite    {
29*bbf77476Sternite        return 'normal';
30*bbf77476Sternite    }
31*bbf77476Sternite
32*bbf77476Sternite    /**
33*bbf77476Sternite     * @return int Sort order - Low numbers go before high numbers
34*bbf77476Sternite     */
35*bbf77476Sternite    public function getSort()
36*bbf77476Sternite    {
37*bbf77476Sternite        return 1;
38*bbf77476Sternite    }
39*bbf77476Sternite
40*bbf77476Sternite    /**
41*bbf77476Sternite     * Connect lookup pattern to lexer.
42*bbf77476Sternite     *
43*bbf77476Sternite     * @param string $mode Parser mode
44*bbf77476Sternite     */
45*bbf77476Sternite    public function connectTo($mode)
46*bbf77476Sternite    {
47*bbf77476Sternite		$this->Lexer->addSpecialPattern("{{thumbnail>.+?}}", $mode, substr(get_class($this), 7));
48*bbf77476Sternite	}
49*bbf77476Sternite
50*bbf77476Sternite    /**
51*bbf77476Sternite     * Handle matches of the mediathumbnails syntax
52*bbf77476Sternite     *
53*bbf77476Sternite     * @param string       $match   The match of the syntax
54*bbf77476Sternite     * @param int          $state   The state of the handler
55*bbf77476Sternite     * @param int          $pos     The position in the document
56*bbf77476Sternite     * @param Doku_Handler $handler The handler
57*bbf77476Sternite     *
58*bbf77476Sternite     * @return array Data for the renderer
59*bbf77476Sternite     */
60*bbf77476Sternite    public function handle($match, $state, $pos, Doku_Handler $handler)
61*bbf77476Sternite    {
62*bbf77476Sternite		$thumbnailpath = "Thumbnails/thumbnail.png";
63*bbf77476Sternite
64*bbf77476Sternite		$mediapath = substr($match, 12, -2); //strip markup
65*bbf77476Sternite		$filepath = mediaFN($mediapath);
66*bbf77476Sternite		//$filepath = str_replace('\\', DIRECTORY_SEPARATOR, $filepath);
67*bbf77476Sternite
68*bbf77476Sternite		$zip = new ZipArchive;
69*bbf77476Sternite
70*bbf77476Sternite		if ($zip->open($filepath) !== TRUE) {
71*bbf77476Sternite			// odt file does not exist
72*bbf77476Sternite			return array();
73*bbf77476Sternite		}
74*bbf77476Sternite
75*bbf77476Sternite		if ($zip->locateName($thumbnailpath) !== false) {
76*bbf77476Sternite			// thumbnail file exists
77*bbf77476Sternite			$fp = $zip->getStream($thumbnailpath);
78*bbf77476Sternite			if(!$fp) {
79*bbf77476Sternite				return array();
80*bbf77476Sternite			}
81*bbf77476Sternite
82*bbf77476Sternite			$thumbnaildata = '';
83*bbf77476Sternite			while (!feof($fp)) {
84*bbf77476Sternite				$thumbnaildata .= fread($fp, 8192);
85*bbf77476Sternite			}
86*bbf77476Sternite
87*bbf77476Sternite			fclose($fp);
88*bbf77476Sternite
89*bbf77476Sternite			// write thumbnail file to media folder
90*bbf77476Sternite			$filedir = dirname($filepath);
91*bbf77476Sternite			$filename = basename($filepath);
92*bbf77476Sternite			$extended_filename = substr($filename,0,strrpos($filename,'.')).".thumbnail".strrchr($thumbnailpath,'.');
93*bbf77476Sternite
94*bbf77476Sternite			$filepath_thumbnail = $filedir . DIRECTORY_SEPARATOR . $extended_filename;
95*bbf77476Sternite			file_put_contents($filepath_thumbnail, $thumbnaildata);
96*bbf77476Sternite
97*bbf77476Sternite			// give media path to renderer
98*bbf77476Sternite			$mediapath_thumbnail = substr($mediapath,0,strrpos($mediapath,':')) . ":" . $extended_filename;
99*bbf77476Sternite			return array($mediapath_thumbnail);
100*bbf77476Sternite		}
101*bbf77476Sternite
102*bbf77476Sternite		return array();
103*bbf77476Sternite    }
104*bbf77476Sternite
105*bbf77476Sternite    /**
106*bbf77476Sternite     * Render xhtml output or metadata
107*bbf77476Sternite     *
108*bbf77476Sternite     * @param string        $mode     Renderer mode (supported modes: xhtml)
109*bbf77476Sternite     * @param Doku_Renderer $renderer The renderer
110*bbf77476Sternite     * @param array         $data     The data from the handler() function
111*bbf77476Sternite     *
112*bbf77476Sternite     * @return bool If rendering was successful.
113*bbf77476Sternite     */
114*bbf77476Sternite    public function render($mode, Doku_Renderer $renderer, $data)
115*bbf77476Sternite    {
116*bbf77476Sternite		$mediapath_thumbnail = $data[0];
117*bbf77476Sternite
118*bbf77476Sternite        if ($mode == 'xhtml') {
119*bbf77476Sternite
120*bbf77476Sternite			$src = ml($mediapath_thumbnail,array());
121*bbf77476Sternite
122*bbf77476Sternite			$i             = array();
123*bbf77476Sternite			$i['width']    = '100px';
124*bbf77476Sternite			//$i['height']   = $h;
125*bbf77476Sternite			//$i['border']   = 0;
126*bbf77476Sternite			//$i['alt']      = $this->_meta($img,'title');
127*bbf77476Sternite			$i['class']    = 'tn';
128*bbf77476Sternite			$iatt = buildAttributes($i);
129*bbf77476Sternite
130*bbf77476Sternite			$renderer->doc .= "{{".$mediapath_thumbnail."?100}}". '<img src="'.$src.'" '.$iatt.' />';
131*bbf77476Sternite            return true;
132*bbf77476Sternite
133*bbf77476Sternite        } elseif ($mode == 'odt') {
134*bbf77476Sternite
135*bbf77476Sternite			// TODO: yet to implement
136*bbf77476Sternite			$renderer->cdata("");
137*bbf77476Sternite			return true;
138*bbf77476Sternite
139*bbf77476Sternite		}
140*bbf77476Sternite
141*bbf77476Sternite        return false;
142*bbf77476Sternite    }
143*bbf77476Sternite}
144*bbf77476Sternite
145