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