'Myron Turner',
'email' => 'turnermm02@shaw.ca',
'date' => '2011-07-1',
'name' => 'epub',
'desc' => 'renderer for ebook creator',
'url' => 'http://www.dokuwiki.org/plugin:epub');
}
function __construct() {
$this->allow_url_fopen=ini_get ( 'allow_url_fopen' ) ;
$this->isWin=function_exists('epub_isWindows') ? epub_isWindows() : false;
$this->mpeg_settings('audio') ;
$this->mpeg_settings('video') ;
}
function mpeg_settings($which) {
if($which == 'audio') {
$this->audio_link = $this->getConf('audio_fn');
$nmsp = 'audio_nmsp';
}
else {
$this->video_link = $this->getConf('video_fn');
$nmsp = 'video_nmsp';
}
$nmsp = $this->getConf($nmsp);
$nmsp = str_replace(' ','',$nmsp);
$nmsp = str_replace(',','|',$nmsp);
$nmsp_orig = $nmsp;
$nmsp = str_replace(':','_',$nmsp);
if($which == 'audio') {
$this->audio_nmsp = $nmsp;
$this->audio_nmsp_orig = $nmsp_orig;
return;
}
$this->video_nmsp = $nmsp;
$this->video_nmsp_orig = $nmsp_orig;
}
/**
* Make available as XHTML replacement renderer
*/
public function canRender($format){
if($format == 'xhtml') return true;
return false;
}
function set_oebps() {
$this->oebps = epub_get_oebps();
}
function set_current_page($page) {
$this->current_page=$page;
}
function opf_handle() {
if(!$this->opf_handle) {
$this->opf_handle= fopen($this->oebps. 'content.opf', 'a');
}
return $this->opf_handle;
}
function is_epubid($id) {
return is_epub_pageid($id);
}
/**
* Simplified header printing with PDF bookmarks
*/
function header($text, $level, $pos, $readonly=false) {
if(!$text) return; //skip empty headlines
$hid = $this->_headerToLink($text, true);
// print header
$this->doc .= DOKU_LF."
"; } } else if(strpos($mtype[1],'video') !== false) { if($this->video_link) $out .= '
"; } } else { $out .= "$title"; } return $out; } function create_external_link($name) { return array( "target" => "", "style" => "", "pre" => "", "suf" => "", "type"=>'ext_media', "more" => 'rel="nofollow"', "class" => 'urlextern', "url" => $name, "name" => basename($name), "title" => $name ); } /** * hover info makes no sense in PDFs, so drop acronyms */ function acronym($acronym) { $this->doc .= $this->_xmlEntities($acronym); } function is_image($link,&$type) { if(strpos($link['class'],'media') === false) { $type=$link['class']; return false; } $mime_type = mimetype($link['title']); if(!$mime_type[1] ) { list($url,$rest) = explode('?', $link['url']); $mime_type = mimetype($url); if(!$mime_type[1]) { $mime_type = mimetype($rest); } } if(!$mime_type[1]) { $type = 'other'; return false; } list($type,$ext) = explode('/', $mime_type[1] ); if($type != 'image') { $type='media'; return false; } return true; } /** * reformat links if needed */ function _formatLink($link){ $type = ""; if($this->is_image($link,$type)) { if(preg_match('#media\s*=\s*http#',$link['url'])) { $name = $this->copy_media($link['title'],true); if($name) { return $this->set_image($name) ; } else return $this->set_image(''); } elseif(strpos($link['name'],'copy_media($link['title']); if(strpos($link['name'],'fetch.php') !== false) { $t = $link['title']; $link['name'] = preg_replace("#src=.*?$t\"#", "src=\"$name\"",$link['name']); if(strpos($link['name'],'alt=""') !==false) { $link['name'] = str_replace('alt=""','alt="'. $link['title'] . '"', $link['name']); } return $this->clean_image_link($link['name']); } elseif(strpos($link['url'],'fetch.php') !== false) { if(preg_match('/src=\"(.*?)\"/',$link['name'],$matches)) { $link['name'] = '' . $link['title'] . ''; return $this->clean_image_link($link['name']); } } $link['name'] = $this->clean_image_link($link['name']); return $link['name']; } $name = $this->copy_media($link['title']); return $this->set_image($name); } elseif($link['class'] == 'media' && strpos($link['name'],'doc .= '' . $link['name'] . ''; return; } if((strpos($link['class'],'wikilink') !== false ) && $type!='media') { //internal link $orig = ""; $name = $this->local_name($link,$orig,$frag); if(!$this->is_epubid($orig)) { $doku_base = DOKU_BASE; $doku_base = trim($doku_base,'/'); $fnote = DOKU_URL . "doku.php?id=$orig"; return $this->set_footnote($link,$fnote); } $name = epub_clean_name($name); $name .='.html'; if($link['class'] == 'wikilink2') { $wfn = wikiFN($orig); if( file_exists($wfn) ) $link['class'] = 'wikilink1'; } } else if($type=='media') { //internal media $orig = ""; $name = $this->local_name($link,$orig); if(!empty($link['display'])) { $link['name'] = $link['display']; if(strpos($link['class'],'mp3') !== false) { $orig = preg_replace('/^(' . $this->audio_nmsp . ')_/', "$1:", $orig); $orig = preg_replace('/^(' . $this->audio_nmsp_orig . ')_/', "$1:", $orig); //two levels deep } else if(strpos($link['class'],'mp4') !== false) { $orig = preg_replace('/^(' . $this->video_nmsp . ')_/', "$1:", $orig); $orig = preg_replace('/^(' . $this->video_nmsp_orig . ')_/', "$1:", $orig); } } $note_url = DOKU_URL . "lib/exe/fetch.php?media=" . $orig; $link['class'] = 'wikilink1'; $out = $this->set_footnote($link,$note_url); $out=preg_replace('/(.*?)<\/a>(?=set_footnote($link,trim($link['url'])); // creates an entry in output for the link with a live footnote to the link if(isset($link['type']) && $link['type'] == 'ext_media') { $this->doc .= $out; } else return $out; } if(!$name) return; $link['url'] = $name; if($frag) $link['url'] .="#$frag"; return parent::_formatLink($link); } function clean_image_link($link) { $link = str_replace('Images/Images',"Images",$link); $link = preg_replace('#[\.\/]*Images#', "../Images", $link ); return $link; } function set_footnote($link, $note_url="") { $out = $link['name']; $fn_id = epub_fn(); $link['name'] = "[$fn_id]"; if(preg_match("/media\s*=\s*(http.*)/", $link['url'],$matches)) { //format external urls $note_url = urldecode($matches[1]); } $link['url'] = 'footnotes.html#' .$this->current_page; $link['class'] = 'wikilink1'; $id = 'backto_' . $fn_id; $hash_link=""; $out .= $hash_link . parent::_formatLink($link); // . ''; epub_write_footnote($fn_id,$this->current_page,$note_url); return $out; } function smiley($smiley) { static $smileys; if(!$smileys) $smileys = getSmileys(); if ( array_key_exists($smiley, $this->smileys) ) { $spath = DOKU_INC . 'lib/images/smileys/'.$smileys[$smiley]; $name = $this->copy_media($spath,true); $this->doc .= $this->_media($name); } } function local_name($link,&$orig="", &$frag ="") { $base_name= basename($link['url']); $title = $link['title']? ltrim($link['title'],':'): ""; list($starturl,$frag) = explode('#',$link['url']); if ($title) { $name = $title; } elseif($base_name) { list($name,$rest) = explode('?',$base_name); } if($name) { $orig = ltrim($name,':'); return epub_clean_name(str_replace(':','_',$name)); } return false; } function copy_media($media,$external=false) { $name = epub_clean_name(str_replace(':','_',basename($media))); $ret_name = $name; $mime_type = mimetype($name); list($type,$ext) = explode('/', $mime_type[1] ); if($type !== 'image' && $type != 'audio' && $type != 'video') return; if($external) { if(!$this->allow_url_fopen) return; $tmp = str_replace('https://',"",$media); $tmp = str_replace('http://',"",$media); $tmp = str_replace('www.',"",$tmp); if($this->isWin) { $tmp = preg_replace('/^[A-Z]:/',"",$tmp); } $tmp=ltrim($tmp,'/\/'); $elems=explode('/',$tmp); if($this->isWin) { $elems=explode('\\',$tmp); } if(!empty($elems) && $elems[0]) { $elems[0] = preg_replace('#/\W#','_',$elems[0]); $name = $elems[0]. "_" . $name; } } if($type == 'audio') { $name = "Audio/$name"; } else if($type == 'video') { $name = "Video/$name"; } else if(!preg_match("/^Images/", $name)) { $name = "Images/$name"; } $file = $this->oebps . $name; if(file_exists($file)) return $name; if(!$external) { $media = mediaFN($media); } if(copy ($media , $file)) { epub_write_item($name,$mime_type[1]) ; return $name; } else if(!$this->isWin && epub_save_image($media , $file)) { epub_write_item($name,$mime_type[1]) ; return $name; } return false; } function set_image($img,$width=null,$height=null,$align=null) { $w=""; $h=""; if($width) $w= ' width="' . $width . '"'; if($height) $h= ' height="' .$height . '"'; $img = $this->clean_image_link($img); $class='media'; if($align) { $class .= $align; } return ''; } function set_audio($src,$mtype,$title) { $src = "../$src"; $type = $mtype[1]; $out = '\n"; return $out; } function set_video($src,$mtype,$title) { $src = "../$src"; $type = $mtype[1]; $out = '\n"; return $out; } function plugin($name,$data,$state = '', $match = '') { if($name !='mathpublish' && $name !='ditaa' && $name !='graphviz') return parent::plugin($name,$data); $mode ='xhtml'; $renderer =p_get_renderer($mode ); $plugin =& plugin_load('syntax',$name); if($plugin != null) { $plugin->render($mode,$renderer,$data); if($name == 'ditaa') { epub_check_for_ditaa($renderer->doc,$this); } else if($name =='mathpublish') { epub_check_for_math($renderer->doc,$this); } else if($name =='graphviz') { epub_check_for_graphviz($renderer->doc,$this,$data,$plugin); } $this->doc .= $renderer->doc; } } /** * no obfuscation for email addresses */ function emaillink($address, $name = NULL,$returnonly = false) { global $conf; $old = $conf['mailguard']; $conf['mailguard'] = 'none'; parent::emaillink($address, $name); $conf['mailguard'] = $old; } function write($what,$handle) { fwrite($handle,"$what\n"); fflush($handle); } }