xref: /plugin/mediathumbnails/syntax.php (revision 2f64379eb49b362daf059966efccfcd4353a1803)
1bbf77476Sternite<?php
2bbf77476Sternite/**
3bbf77476Sternite * DokuWiki Plugin mediathumbnails (Syntax Component)
4bbf77476Sternite *
5bbf77476Sternite * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6bbf77476Sternite * @author  Thomas Schäfer <thomas.schaefer@itschert.net>
7bbf77476Sternite */
8bbf77476Sternite
9bbf77476Sternite// must be run within Dokuwiki
10bbf77476Sterniteif (!defined('DOKU_INC')) {
11bbf77476Sternite    die();
12bbf77476Sternite}
13bbf77476Sternite
14bbf77476Sterniteclass syntax_plugin_mediathumbnails extends DokuWiki_Syntax_Plugin {
15bbf77476Sternite
16bbf77476Sternite	/**
17bbf77476Sternite     * @return string Syntax mode type
18bbf77476Sternite     */
19bbf77476Sternite    public function getType()
20bbf77476Sternite    {
21bbf77476Sternite        return 'substition';
22bbf77476Sternite    }
23bbf77476Sternite
24bbf77476Sternite    /**
25bbf77476Sternite     * @return string Paragraph type
26bbf77476Sternite     */
27bbf77476Sternite    public function getPType()
28bbf77476Sternite    {
29bbf77476Sternite        return 'normal';
30bbf77476Sternite    }
31bbf77476Sternite
32bbf77476Sternite    /**
33bbf77476Sternite     * @return int Sort order - Low numbers go before high numbers
34bbf77476Sternite     */
35bbf77476Sternite    public function getSort()
36bbf77476Sternite    {
37bbf77476Sternite        return 1;
38bbf77476Sternite    }
39bbf77476Sternite
40bbf77476Sternite    /**
41bbf77476Sternite     * Connect lookup pattern to lexer.
42bbf77476Sternite     *
43bbf77476Sternite     * @param string $mode Parser mode
44bbf77476Sternite     */
45bbf77476Sternite    public function connectTo($mode)
46bbf77476Sternite    {
47bbf77476Sternite		$this->Lexer->addSpecialPattern("{{thumbnail>.+?}}", $mode, substr(get_class($this), 7));
48bbf77476Sternite	}
49bbf77476Sternite
50bbf77476Sternite    /**
51bbf77476Sternite     * Handle matches of the mediathumbnails syntax
52bbf77476Sternite     *
53bbf77476Sternite     * @param string       $match   The match of the syntax
54bbf77476Sternite     * @param int          $state   The state of the handler
55bbf77476Sternite     * @param int          $pos     The position in the document
56bbf77476Sternite     * @param Doku_Handler $handler The handler
57bbf77476Sternite     *
58bbf77476Sternite     * @return array Data for the renderer
59bbf77476Sternite     */
60bbf77476Sternite    public function handle($match, $state, $pos, Doku_Handler $handler)
61bbf77476Sternite    {
62da77d72dSternite		// Locate the given media file and check if it can be opened as zip
6332095c04Sternite		$mediapath_file = substr($match, 12, -2); //strip markup
64b8b45234Sternite		$filepath_local_file = mediaFN($mediapath_file);
658c9395f0Sternite		$timestamp_local_file = file_exists($filepath_local_file) ? filemtime($filepath_local_file) : false;
66bbf77476Sternite
67bbf77476Sternite		$zip = new ZipArchive;
68b8b45234Sternite		if ($zip->open($filepath_local_file) !== TRUE) {
69da77d72dSternite			// media file does not exist
70da77d72dSternite			return array($mediapath_file);
71bbf77476Sternite		}
72bbf77476Sternite
738c9395f0Sternite		// The media file exists and acts as a zip file!
748c9395f0Sternite
75da77d72dSternite		// Check all possible paths (configured in configuration key 'thumb_paths') if there is a file available
76da77d72dSternite		$thumb_paths_to_investigate = $this->getConf('thumb_paths');
77da77d72dSternite
78da77d72dSternite		foreach($thumb_paths_to_investigate as $thumbnail_path) {
79da77d72dSternite			$thumbnail_ending = strrchr($thumbnail_path,'.');
80da77d72dSternite
81b8b45234Sternite			if ($zip->locateName($thumbnail_path) !== false) {
828c9395f0Sternite
838c9395f0Sternite				// The thumbnail file exists, so prepare more information, now!
84*2f64379eSternite				$extended_filename = basename($filepath_local_file) . ".thumb" . $thumbnail_ending;
85*2f64379eSternite				$filepath_thumbnail = dirname($filepath_local_file) . DIRECTORY_SEPARATOR . $extended_filename;
868c9395f0Sternite				$mediapath_thumbnail = substr($mediapath_file,0,strrpos($mediapath_file,':')) . ":" . $extended_filename;
878c9395f0Sternite
888c9395f0Sternite				if (file_exists($filepath_thumbnail) && filemtime($filepath_thumbnail) == $timestamp_local_file) {
898c9395f0Sternite					// A thumbnail file for the current file version has already been created, don't extract it again, but give the renderer all needed information!
908c9395f0Sternite					return array($mediapath_file, $mediapath_thumbnail);
918c9395f0Sternite				}
928c9395f0Sternite
938c9395f0Sternite				// Get the thumbnail file!
94b8b45234Sternite				$fp = $zip->getStream($thumbnail_path);
95bbf77476Sternite				if(!$fp) {
96bbf77476Sternite					return array();
97bbf77476Sternite				}
98bbf77476Sternite
99bbf77476Sternite				$thumbnaildata = '';
100bbf77476Sternite				while (!feof($fp)) {
101bbf77476Sternite					$thumbnaildata .= fread($fp, 8192);
102bbf77476Sternite				}
103bbf77476Sternite
104bbf77476Sternite				fclose($fp);
105bbf77476Sternite
1068c9395f0Sternite				// Write thumbnail file to media folder
107bbf77476Sternite				file_put_contents($filepath_thumbnail, $thumbnaildata);
108bbf77476Sternite
1098c9395f0Sternite				// Set timestamp to the media file's timestamp (this is used to check in later passes if the file already exists in the correct version).
1108c9395f0Sternite				touch($filepath_thumbnail, $timestamp_local_file);
1118c9395f0Sternite
1128c9395f0Sternite				// Give media path to renderer
11332095c04Sternite				return array($mediapath_file, $mediapath_thumbnail);
114bbf77476Sternite			}
115da77d72dSternite		}
116bbf77476Sternite
117da77d72dSternite		return array($mediapath_file);
118bbf77476Sternite    }
119bbf77476Sternite
120bbf77476Sternite    /**
121bbf77476Sternite     * Render xhtml output or metadata
122bbf77476Sternite     *
123bbf77476Sternite     * @param string        $mode     Renderer mode (supported modes: xhtml)
124bbf77476Sternite     * @param Doku_Renderer $renderer The renderer
125bbf77476Sternite     * @param array         $data     The data from the handler() function
126bbf77476Sternite     *
127bbf77476Sternite     * @return bool If rendering was successful.
128bbf77476Sternite     */
129bbf77476Sternite    public function render($mode, Doku_Renderer $renderer, $data)
130bbf77476Sternite    {
131967904f1Sternite		list ($mediapath_file, $mediapath_thumbnail) = $data;
132bbf77476Sternite
133bbf77476Sternite        if ($mode == 'xhtml') {
134bbf77476Sternite
135da77d72dSternite			// check if a thumbnail file was found
136da77d72dSternite			if (!$mediapath_thumbnail) {
137*2f64379eSternite				if ($this->getConf('show_missing_thumb_error')) {
138da77d72dSternite					$renderer->doc .= trim($this->getConf('no_thumb_error_message')) . " " . $mediapath_file;
139da77d72dSternite					return true;
140da77d72dSternite				} else {
141da77d72dSternite					return false;
142da77d72dSternite				}
143da77d72dSternite			}
144da77d72dSternite
145bbf77476Sternite			$src = ml($mediapath_thumbnail,array());
146bbf77476Sternite
147bbf77476Sternite			$i             = array();
148b8b45234Sternite			$i['width']    = $this->getConf('thumb_width');
1493ac8d5b9Sternite			//$i['height']   = '';
1503ac8d5b9Sternite			$i['title']      = $mediapath_file;
151bbf77476Sternite			$i['class']    = 'tn';
152bbf77476Sternite			$iatt = buildAttributes($i);
153bbf77476Sternite
1546bc8b42dSternite			$renderer->doc .= 	($this->getConf('link_to_media_file') ? '<a href="/lib/exe/fetch.php?media=' . $mediapath_file . '">' : '') .
15532095c04Sternite								'<img src="'.$src.'" '.$iatt.' />' .
1566bc8b42dSternite								($this->getConf('link_to_media_file') ? '</a>' : '');
157bbf77476Sternite            return true;
158bbf77476Sternite
159bbf77476Sternite        } elseif ($mode == 'odt') {
160bbf77476Sternite
161bbf77476Sternite			// TODO: yet to implement
162bbf77476Sternite			$renderer->cdata("");
163bbf77476Sternite			return true;
164bbf77476Sternite
165bbf77476Sternite		}
166bbf77476Sternite
167bbf77476Sternite        return false;
168bbf77476Sternite    }
169bbf77476Sternite}
170bbf77476Sternite
171