xref: /plugin/iframeinterwiki/syntax.php (revision 010588a0a72e639992fd9a5b639a1a05f4d3fd86)
1e00731e6SRoques Steve<?php
2e00731e6SRoques Steve/**
3e00731e6SRoques Steve * Plugin Iframeinterwiki: Inserts an iframe element to include the specified url
4e00731e6SRoques Steve * Based on Iframe plugin written by Christopher Smith
5e00731e6SRoques Steve * include interwiki urls
6e00731e6SRoques Steve *
7e00731e6SRoques Steve * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
8e00731e6SRoques Steve * @author     Steve Roques <steve.roques@gmail.com>
9e00731e6SRoques Steve */
10e00731e6SRoques Steve// must be run within Dokuwiki
11e00731e6SRoques Steveif(!defined('DOKU_INC')) die();
12e00731e6SRoques Steve
13e00731e6SRoques Steveif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
14e00731e6SRoques Steve
15e00731e6SRoques Steve/**
16e00731e6SRoques Steve * All DokuWiki plugins to extend the parser/rendering mechanism
17e00731e6SRoques Steve * need to inherit from this class
18e00731e6SRoques Steve */
19e00731e6SRoques Steveclass syntax_plugin_iframeinterwiki extends DokuWiki_Syntax_Plugin {
20e00731e6SRoques Steve
21e00731e6SRoques Steve	function getType() { return 'substition'; }
22e00731e6SRoques Steve	function getSort() { return 305; }
23e00731e6SRoques Steve	function connectTo($mode) { $this->Lexer->addSpecialPattern('{{url>.*?}}',$mode,'plugin_iframeinterwiki'); }
24e00731e6SRoques Steve
25e00731e6SRoques Steve	function handle($match, $state, $pos, Doku_Handler $handler){
26e00731e6SRoques Steve		$match = substr($match, 6, -2);
27497530cdSRoques Steve
28497530cdSRoques Steve		$exploded = explode('|', $match, 2);
29497530cdSRoques Steve		$url = isset($exploded[0]) ? $exploded[0] : '';
30497530cdSRoques Steve		$alt = isset($exploded[1]) ? $exploded[1] : '';
31497530cdSRoques Steve
32497530cdSRoques Steve		$explodedUrl = explode(' ', $url, 2);
33497530cdSRoques Steve		$url = isset($explodedUrl[0]) ? $explodedUrl[0] : '';
34497530cdSRoques Steve		$param = isset($explodedUrl[1]) ? $explodedUrl[1] : '';
35e00731e6SRoques Steve
36e00731e6SRoques Steve		// javascript pseudo uris allowed?
37e00731e6SRoques Steve		if (!$this->getConf('js_ok') && substr($url,0,11) == 'javascript:'){
38e00731e6SRoques Steve			$url = false;
39e00731e6SRoques Steve		}
40e00731e6SRoques Steve
41e00731e6SRoques Steve		// set defaults
42e00731e6SRoques Steve		$opts = array(
43e00731e6SRoques Steve				'url'    => $url,
44e00731e6SRoques Steve				'width'  => '98%',
45e00731e6SRoques Steve				'height' => '400px',
46e00731e6SRoques Steve				'alt'    => $alt,
47e00731e6SRoques Steve				'scroll' => true,
48e00731e6SRoques Steve				'border' => true,
49e00731e6SRoques Steve				'align'  => false,
50e00731e6SRoques Steve			     );
51e00731e6SRoques Steve
52e00731e6SRoques Steve		// handle size parameters
53e00731e6SRoques Steve		$matches=array();
54e00731e6SRoques Steve		if(preg_match('/\[?(\d+(em|%|pt|px)?)\s*([,xX]\s*(\d+(em|%|pt|px)?))?\]?/',$param,$matches)){
5587231b17SRoques Steve			if(array_key_exists(4, $matches) && $matches[4]){
56e00731e6SRoques Steve				// width and height was given
57e00731e6SRoques Steve				$opts['width'] = $matches[1];
58e00731e6SRoques Steve				if(!$matches[2]) $opts['width'] .= 'px'; //default to pixel when no unit was set
59e00731e6SRoques Steve				$opts['height'] = $matches[4];
60*010588a0SSteve Roques                if(!isset($matches[5]) || !$matches[5]) $opts['height'] .= 'px'; //default to pixel when no unit was set
6187231b17SRoques Steve			}elseif(array_key_exists(2, $matches) && $matches[2]){
62e00731e6SRoques Steve				// only height was given
63e00731e6SRoques Steve				$opts['height'] = $matches[1];
64e00731e6SRoques Steve				if(!$matches[2]) $opts['height'] .= 'px'; //default to pixel when no unit was set
65e00731e6SRoques Steve			}
66e00731e6SRoques Steve		}
67e00731e6SRoques Steve
68e00731e6SRoques Steve		// handle other parameters
69e00731e6SRoques Steve		if(preg_match('/noscroll(bars?|ing)?/',$param)){
70e00731e6SRoques Steve			$opts['scroll'] = false;
71e00731e6SRoques Steve		}
72e00731e6SRoques Steve		if(preg_match('/no(frame)?border/',$param)){
73e00731e6SRoques Steve			$opts['border'] = false;
74e00731e6SRoques Steve		}
75e00731e6SRoques Steve		if(preg_match('/(left|right)/',$param,$matches)){
76e00731e6SRoques Steve			$opts['align'] = $matches[1];
77e00731e6SRoques Steve		}
78e00731e6SRoques Steve
79e00731e6SRoques Steve		return $opts;
80e00731e6SRoques Steve	}
81e00731e6SRoques Steve
820d9fa8feSRoques Steve	// Replace on url all match from interwiki conf
83e00731e6SRoques Steve	function parse_uri_inter($url, $filename) {
84497530cdSRoques Steve		if ( file_exists($filename) && ($file = fopen($filename, "r"))!==false ) {
85e00731e6SRoques Steve			while (($line = fgets($file)) !== false) {
86e00731e6SRoques Steve				$line = preg_replace("/\#.+/", '', trim($line));
87e00731e6SRoques Steve				preg_match("/^\s*?(.+?)\s+(.+?)$/i", $line, $matches);
880d9fa8feSRoques Steve				if (isset($matches[1], $matches[2]) && strpos($url, $matches[1]) !== false) {
89e00731e6SRoques Steve					$url = str_replace($matches[1] . '>', '@REPLACE@', $url);
900d9fa8feSRoques Steve					if(strpos($matches[2], '{NAME}') !== false) {
91e00731e6SRoques Steve						$url = str_replace('@REPLACE@' , str_replace('{NAME}', '', $matches[2]), $url);
920d9fa8feSRoques Steve					} else if(strpos($matches[2], '{URL}') !== false) {
93e00731e6SRoques Steve						$url = str_replace('%40REPLACE%40', str_replace('{URL}', '', $matches[2]), urlencode($url));
94e00731e6SRoques Steve					}
95e00731e6SRoques Steve				}
96e00731e6SRoques Steve			}
97e00731e6SRoques Steve			fclose($file);
98497530cdSRoques Steve		}
99e00731e6SRoques Steve		return $url;
100e00731e6SRoques Steve	}
101e00731e6SRoques Steve
102e00731e6SRoques Steve	function render($mode, Doku_Renderer $R, $data) {
103e00731e6SRoques Steve		if($mode != 'xhtml') return false;
104e00731e6SRoques Steve
105e00731e6SRoques Steve		if(!$data['url']) {
106e00731e6SRoques Steve			$R->doc .= '<div class="iframe">'.hsc($data['alt']).'</div>';
107e00731e6SRoques Steve		} else {
108e00731e6SRoques Steve
109e00731e6SRoques Steve
110e00731e6SRoques Steve			$opts = array(
111e00731e6SRoques Steve					'title' => $data['alt'],
112e00731e6SRoques Steve					'src'   => $this->parse_uri_inter($this->parse_uri_inter($data['url'], DOKU_INC . 'conf/interwiki.local.conf'), DOKU_INC . 'conf/interwiki.conf'),
113e00731e6SRoques Steve					'style' => 'width:'.$data['width'].'; height:'.$data['height'],
114e00731e6SRoques Steve				     );
115e00731e6SRoques Steve			if(!$data['border']) $opts['frameborder'] = 0;
116e00731e6SRoques Steve			if(!$data['scroll']) $opts['scrolling'] = 'no';
117e00731e6SRoques Steve			if($data['align'])   $opts['align'] = $data['align'];
118e00731e6SRoques Steve			$params = buildAttributes($opts);
119e00731e6SRoques Steve			if(!isset($alt)) {
120e00731e6SRoques Steve				$alt = '';
121e00731e6SRoques Steve			}
122e00731e6SRoques Steve			$R->doc .= "<iframe $params>".hsc($alt).'</iframe>';
123e00731e6SRoques Steve		}
124e00731e6SRoques Steve
125e00731e6SRoques Steve		return true;
126e00731e6SRoques Steve	}
127e00731e6SRoques Steve}
128