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