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