*/
// must be run within Dokuwiki
if (!defined('DOKU_INC')) die();
/**
* Render xhtml suitable as input for mpdf library
*/
class renderer_plugin_dw2pdf extends Doku_Renderer_xhtml {
private $lastHeaderLevel = -1;
private $originalHeaderLevel = 0;
private $difference = 0;
/**
* Stores action instance
*
* @var action_plugin_dw2pdf
*/
private $actioninstance = null;
/**
* load action plugin instance
*/
public function __construct() {
$this->actioninstance = plugin_load('action', 'dw2pdf');
}
public function document_start() {
global $ID;
parent::document_start();
//ancher for rewritten links to included pages
$check = false;
$pid = sectionID($ID, $check);
$this->doc .= "";
$this->doc .= "";
}
/**
* Make available as XHTML replacement renderer
*
* @param $format
* @return bool
*/
public function canRender($format){
if($format == 'xhtml') return true;
return false;
}
/**
* Simplified header printing with PDF bookmarks
*
* @param string $text
* @param int $level from 1 (highest) to 6 (lowest)
* @param int $pos
*/
public function header($text, $level, $pos) {
if(!$text) return; //skip empty headlines
global $ID;
$hid = $this->_headerToLink($text, true);
//only add items within global configured levels (doesn't check the pdf toc settings)
$this->toc_additem($hid, $text, $level);
$check = false;
$pid = sectionID($ID, $check);
$hid = $pid . '__' . $hid;
// add PDF bookmark
$bookmark = '';
$maxbookmarklevel = $this->actioninstance->getExportConfig('maxbookmarks');
// 0: off, 1-6: show down to this level
if($maxbookmarklevel && $maxbookmarklevel >= $level) {
$bookmarklevel = $this->calculateBookmarklevel($level);
$bookmark = '';
}
// print header
$this->doc .= DOKU_LF . "$bookmark";
$this->doc .= "";
$this->doc .= $this->_xmlEntities($text);
$this->doc .= "";
$this->doc .= "" . DOKU_LF;
}
/**
* Bookmark levels might increase maximal +1 per level.
* (note: levels start at 1, bookmarklevels at 0)
*
* @param int $level 1 (highest) to 6 (lowest)
* @return int
*/
protected function calculateBookmarklevel($level) {
if($this->lastHeaderLevel == -1) {
$this->lastHeaderLevel = $level;
}
$step = $level - $this->lastHeaderLevel;
if($step > 1) {
$this->difference = $this->difference + ($step - 1);
}
if($step < 0 ) {
$this->difference = min($this->difference, $level - $this->originalHeaderLevel);
$this->difference = max($this->difference, 0);
}
$bookmarklevel = $level - $this->difference;
if($step > 1) {
$this->originalHeaderLevel = $bookmarklevel;
}
$this->lastHeaderLevel = $level;
return $bookmarklevel - 1; //zero indexed
}
/**
* Render a page local link
*
* // modified copy of parent function
*
* @param string $hash hash link identifier
* @param string $name name for the link
* @param bool $returnonly
* @return string|void
*
* @see Doku_Renderer_xhtml::locallink
*/
function locallink($hash, $name = null, $returnonly = false) {
global $ID;
$name = $this->_getLinkTitle($name, $hash, $isImage);
$hash = $this->_headerToLink($hash);
$title = $ID.' ↵';
$check = false;
$pid = sectionID($ID, $check);
$this->doc .= '';
$this->doc .= $name;
$this->doc .= '';
}
/**
* Wrap centered media in a div to center it
*
* @param string $src media ID
* @param string $title descriptive text
* @param string $align left|center|right
* @param int $width width of media in pixel
* @param int $height height of media in pixel
* @param string $cache cache|recache|nocache
* @param bool $render should the media be embedded inline or just linked
* @return string
*/
function _media ($src, $title=NULL, $align=NULL, $width=NULL,
$height=NULL, $cache=NULL, $render = true) {
$out = '';
if($align == 'center'){
$out .= '
';
}
$out .= parent::_media ($src, $title, $align, $width, $height, $cache, $render);
if($align == 'center'){
$out .= '
';
}
return $out;
}
/**
* hover info makes no sense in PDFs, so drop acronyms
*
* @param string $acronym
*/
function acronym($acronym) {
$this->doc .= $this->_xmlEntities($acronym);
}
/**
* reformat links if needed
*
* @param array $link
* @return string
*/
function _formatLink($link){
// for internal links contains the title the pageid
if(in_array($link['title'], $this->actioninstance->getExportedPages())) {
list(/* $url */, $hash) = explode('#', $link['url'], 2);
$check = false;
$pid = sectionID($link['title'], $check);
$link['url'] = "#" . $pid . '__' . $hash;
}
// prefix interwiki links with interwiki icon
if($link['name'][0] != '<' && preg_match('/\binterwiki iw_(.\w+)\b/',$link['class'],$m)){
if(file_exists(DOKU_INC.'lib/images/interwiki/'.$m[1].'.png')){
$img = DOKU_BASE.'lib/images/interwiki/'.$m[1].'.png';
}elseif(file_exists(DOKU_INC.'lib/images/interwiki/'.$m[1].'.gif')){
$img = DOKU_BASE.'lib/images/interwiki/'.$m[1].'.gif';
}else{
$img = DOKU_BASE.'lib/images/interwiki.png';
}
$link['name'] = '
'.$link['name'];
}
return parent::_formatLink($link);
}
/**
* no obfuscation for email addresses
*
* @param string $address
* @param null $name
* @param bool $returnonly
* @return string|void
*/
function emaillink($address, $name = NULL, $returnonly = false) {
global $conf;
$old = $conf['mailguard'];
$conf['mailguard'] = 'none';
parent::emaillink($address, $name, $returnonly);
$conf['mailguard'] = $old;
}
}