*/ // must be run within Dokuwiki if(!defined('DOKU_INC')) die(); // we inherit from the XHTML renderer instead directly of the base renderer require_once DOKU_INC.'inc/parser/xhtml.php'; /** * The Renderer */ class renderer_plugin_nsexport_xhtml extends Doku_Renderer_xhtml { public $_media = array(); public function _relTop(){ // relative URLs we need global $ID; $deep = substr_count($ID,':'); $ref = ''; for($i=0; $i<$deep; $i++) $ref .= '../'; return $ref; } public function _localMedia($src){ // rewrite local media and move to zip if(!preg_match('/^\w+:\/\//',$src)){ $this->_media[] = $src; $ref = $this->_relTop(); $src = $ref.'_media/'.str_replace(':','/',$src); } return $src; } /** * Store all referenced media in metadata */ public function document_end(){ global $ID; parent::document_end(); $this->_media = array_unique($this->_media); p_set_metadata($ID,array('plugin_nsexport'=>$this->_media)); } /** * Rewrite all internal links to local html files */ public function internallink($id, $name = null, $search=null, $returnonly=false, $linktype='content') { global $conf; global $ID; // default name is based on $id as given $default = $this->_simpleTitle($id); $ref = $this->_relTop(); // now first resolve and clean up the $id resolve_pageid(getNS($ID),$id,$exists); $name = $this->_getLinkTitle($name, $default, $isImage, $id, $linktype); if ( !$isImage ) { if ( $exists ) { $class='wikilink1'; // fixme check if this a exported page, if not skip it } else { // doesn't exist? skip it $this->cdata($name); return; } } else { $class='media'; } //keep hash anchor list($id,$hash) = explode('#',$id,2); if(!empty($hash)) $hash = $this->_headerToLink($hash); //prepare for formating $link['target'] = $conf['target']['wiki']; $link['style'] = ''; $link['pre'] = ''; $link['suf'] = ''; // highlight link to current page if ($id === $ID) { $link['pre'] = ''; $link['suf'] = ''; } $link['more'] = ''; $link['class'] = $class; $link['url'] = $ref.str_replace(':','/',$id).'.html'; $link['name'] = $name; $link['title'] = $id; //keep hash if($hash) $link['url'].='#'.$hash; //output formatted $this->doc .= $this->_formatLink($link); } /** * Renders internal and external media * * @author Andreas Gohr */ public function _media ($src, $title=null, $align=null, $width=null, $height=null, $cache=null, $render = true) { $ret = ''; $src = $this->_localMedia($src); list($ext,$mime,$dl) = mimetype($src); if(substr($mime,0,5) === 'image'){ // first get the $title if (!is_null($title)) { $title = $this->_xmlEntities($title); }elseif($ext === 'jpg' || $ext === 'jpeg'){ //try to use the caption from IPTC/EXIF require_once(DOKU_INC.'inc/JpegMeta.php'); $jpeg = new JpegMeta(mediaFN($src)); if($jpeg !== false) $cap = $jpeg->getTitle(); if($cap){ $title = $this->_xmlEntities($cap); } } if (!$render) { // if the picture is not supposed to be rendered // return the title of the picture if (!$title) { // just show the sourcename $title = $this->_xmlEntities(basename(noNS($src))); } return $title; } //add image tag $ret .= '_xmlEntities($width).'"'; if ( !is_null($height) ) $ret .= ' height="'.$this->_xmlEntities($height).'"'; $ret .= ' />'; }elseif($mime === 'application/x-shockwave-flash'){ if (!$render) { // if the flash is not supposed to be rendered // return the title of the flash if (!$title) { // just show the sourcename $title = basename(noNS($src)); } return $this->_xmlEntities($title); } $att = array(); $att['class'] = "media$align"; if($align === 'right') $att['align'] = 'right'; if($align === 'left') $att['align'] = 'left'; $ret .= html_flashobject($src,$width,$height, array('quality' => 'high'), null, $att, $this->_xmlEntities($title)); }elseif($title){ // well at least we have a title to display $ret .= $this->_xmlEntities($title); }else{ // just show the sourcename $ret .= $this->_xmlEntities(basename(noNS($src))); } return $ret; } public function internalmedia ($src, $title = null, $align = null, $width = null, $height = null, $cache = null, $linking = null, $return = false) { global $ID; list($src,$hash) = explode('#',$src,2); resolve_mediaid(getNS($ID),$src, $exists); $lsrc = $this->_localMedia($src); $noLink = false; $render = ($linking === 'linkonly') ? false : true; $link = $this->_getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render); $link['url'] = $lsrc; list($ext,$mime,$dl) = mimetype($src); if(substr($mime,0,5) === 'image' && $render){ }elseif($mime === 'application/x-shockwave-flash' && $render){ // don't link flash movies $noLink = true; }else{ // add file icons $class = preg_replace('/[^_\-a-z0-9]+/i','_',$ext); $link['class'] .= ' mediafile mf_'.$class; } if($hash) $link['url'] .= '#'.$hash; //markup non existing files if (!$exists) $link['class'] .= ' wikilink2'; //output formatted if ($linking === 'nolink' || $noLink) $this->doc .= $link['name']; else $this->doc .= $this->_formatLink($link); } }