1*ee19bac3SLuigi Micco<?php 2*ee19bac3SLuigi Micco /** 3*ee19bac3SLuigi Micco * dw2Pdf Plugin: Conversion from dokuwiki content to pdf. 4*ee19bac3SLuigi Micco * 5*ee19bac3SLuigi Micco * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 6*ee19bac3SLuigi Micco * @author Luigi Micco <l.micco@tiscali.it> 7*ee19bac3SLuigi Micco */ 8*ee19bac3SLuigi Micco 9*ee19bac3SLuigi Micco// must be run within Dokuwiki 10*ee19bac3SLuigi Miccoif (!defined('DOKU_INC')) die(); 11*ee19bac3SLuigi Miccoif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/'); 12*ee19bac3SLuigi Micco 13*ee19bac3SLuigi Miccorequire_once (DOKU_PLUGIN . 'action.php'); 14*ee19bac3SLuigi Micco 15*ee19bac3SLuigi Miccoclass action_plugin_dw2pdf extends DokuWiki_Action_Plugin 16*ee19bac3SLuigi Micco{ 17*ee19bac3SLuigi Micco /** 18*ee19bac3SLuigi Micco * Constructor. 19*ee19bac3SLuigi Micco */ 20*ee19bac3SLuigi Micco function action_plugin_dw2pdf(){ 21*ee19bac3SLuigi Micco } 22*ee19bac3SLuigi Micco 23*ee19bac3SLuigi Micco /** 24*ee19bac3SLuigi Micco * return some info 25*ee19bac3SLuigi Micco */ 26*ee19bac3SLuigi Micco function getInfo(){ 27*ee19bac3SLuigi Micco return array ( 28*ee19bac3SLuigi Micco 'author' => 'Luigi Micco', 29*ee19bac3SLuigi Micco 'email' => 'l.micco@tiscali.it', 30*ee19bac3SLuigi Micco 'date' => '2010-02-04', 31*ee19bac3SLuigi Micco 'name' => 'Dw2Pdf plugin (action component)', 32*ee19bac3SLuigi Micco 'desc' => 'DokuWiki to Pdf converter', 33*ee19bac3SLuigi Micco 'url' => 'http://www.bitlibero.com/dokuwiki/dw2pdf-02.04.2010.zip', 34*ee19bac3SLuigi Micco ); 35*ee19bac3SLuigi Micco } 36*ee19bac3SLuigi Micco 37*ee19bac3SLuigi Micco /** 38*ee19bac3SLuigi Micco * Register the events 39*ee19bac3SLuigi Micco */ 40*ee19bac3SLuigi Micco function register(&$controller) 41*ee19bac3SLuigi Micco { 42*ee19bac3SLuigi Micco $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'convert',array()); 43*ee19bac3SLuigi Micco } 44*ee19bac3SLuigi Micco 45*ee19bac3SLuigi Micco function convert(&$event, $param) 46*ee19bac3SLuigi Micco { 47*ee19bac3SLuigi Micco global $ACT; 48*ee19bac3SLuigi Micco global $REV; 49*ee19bac3SLuigi Micco global $ID; 50*ee19bac3SLuigi Micco global $conf; 51*ee19bac3SLuigi Micco 52*ee19bac3SLuigi Micco if (( $ACT == 'export_pdfbook' ) || ( $ACT == 'export_pdf' )) { 53*ee19bac3SLuigi Micco // check user's rights 54*ee19bac3SLuigi Micco if ( auth_quickaclcheck($ID) < AUTH_READ ) { 55*ee19bac3SLuigi Micco return false; 56*ee19bac3SLuigi Micco } 57*ee19bac3SLuigi Micco 58*ee19bac3SLuigi Micco $event->preventDefault(); 59*ee19bac3SLuigi Micco 60*ee19bac3SLuigi Micco require_once(dirname(__FILE__)."/mpdf/mpdf.php"); 61*ee19bac3SLuigi Micco $mpdf=new mPDF('UTF-8-s'); 62*ee19bac3SLuigi Micco $mpdf->SetAutoFont(AUTOFONT_ALL); 63*ee19bac3SLuigi Micco 64*ee19bac3SLuigi Micco // Temp dir 65*ee19bac3SLuigi Micco define("_MPDF_TEMP_PATH", $conf['savedir'].'/tmp/'); 66*ee19bac3SLuigi Micco 67*ee19bac3SLuigi Micco $mpdf->ignore_invalid_utf8 = true; 68*ee19bac3SLuigi Micco $mpdf->mirrorMargins = 1; // Use different Odd/Even headers and footers and mirror margins 69*ee19bac3SLuigi Micco 70*ee19bac3SLuigi Micco $mpdf->defaultheaderfontsize = 8; /* in pts */ 71*ee19bac3SLuigi Micco $mpdf->defaultheaderfontstyle = ''; /* blank, B, I, or BI */ 72*ee19bac3SLuigi Micco $mpdf->defaultheaderline = 1; /* 1 to include line below header/above footer */ 73*ee19bac3SLuigi Micco 74*ee19bac3SLuigi Micco $mpdf->defaultfooterfontsize = 8; /* in pts */ 75*ee19bac3SLuigi Micco $mpdf->defaultfooterfontstyle = ''; /* blank, B, I, or BI */ 76*ee19bac3SLuigi Micco $mpdf->defaultfooterline = 1; /* 1 to include line below header/above footer */ 77*ee19bac3SLuigi Micco 78*ee19bac3SLuigi Micco $html = '<html><head>'; 79*ee19bac3SLuigi Micco $html = $html . "<style> 80*ee19bac3SLuigi Micco table { 81*ee19bac3SLuigi Micco border: 1px solid #808080; 82*ee19bac3SLuigi Micco border-collapse: collapse; 83*ee19bac3SLuigi Micco } 84*ee19bac3SLuigi Micco td, th { 85*ee19bac3SLuigi Micco border: 1px solid #808080; 86*ee19bac3SLuigi Micco }"; 87*ee19bac3SLuigi Micco 88*ee19bac3SLuigi Micco //load userdefined CSS? 89*ee19bac3SLuigi Micco if ($this->getConf("loadusercss") && @file_exists(DOKU_PLUGIN.'dw2pdf/user/user.css')) { 90*ee19bac3SLuigi Micco $html = $html . io_readFile(DOKU_PLUGIN.'dw2pdf/user/user.css'); 91*ee19bac3SLuigi Micco } 92*ee19bac3SLuigi Micco $html = $html . "</style>"; 93*ee19bac3SLuigi Micco $html = $html . '</head><body>'; 94*ee19bac3SLuigi Micco 95*ee19bac3SLuigi Micco 96*ee19bac3SLuigi Micco if ( $ACT == 'export_pdf' ) { 97*ee19bac3SLuigi Micco $list = array(); 98*ee19bac3SLuigi Micco $list[0] = $ID; 99*ee19bac3SLuigi Micco } else { 100*ee19bac3SLuigi Micco if (isset($_COOKIE['list-pagelist'])) { 101*ee19bac3SLuigi Micco $list = explode("|", $_COOKIE['list-pagelist']); 102*ee19bac3SLuigi Micco } 103*ee19bac3SLuigi Micco if ($_GET['pdfbook_title']) { 104*ee19bac3SLuigi Micco $pdftitle = $_GET['pdfbook_title']; 105*ee19bac3SLuigi Micco } else { 106*ee19bac3SLuigi Micco $pdftitle = $conf['title']; 107*ee19bac3SLuigi Micco } 108*ee19bac3SLuigi Micco } 109*ee19bac3SLuigi Micco 110*ee19bac3SLuigi Micco for ($n = 0; $n < count($list); $n++) { 111*ee19bac3SLuigi Micco $page = $list[$n]; 112*ee19bac3SLuigi Micco 113*ee19bac3SLuigi Micco $idparam = $page; 114*ee19bac3SLuigi Micco if ($REV != 0) { $idparam = $idparam."&rev=".$REV; }; 115*ee19bac3SLuigi Micco 116*ee19bac3SLuigi Micco $pos = strrpos(utf8_decode($ID), ':'); 117*ee19bac3SLuigi Micco $pageName = p_get_first_heading($ID); 118*ee19bac3SLuigi Micco if($pageName == NULL) { 119*ee19bac3SLuigi Micco if($pos != FALSE) { 120*ee19bac3SLuigi Micco $pageName = utf8_substr($page, $pos+1, utf8_strlen($page)); 121*ee19bac3SLuigi Micco } else { 122*ee19bac3SLuigi Micco $pageName = $page; 123*ee19bac3SLuigi Micco } 124*ee19bac3SLuigi Micco $pageName = str_replace('_', ' ', $pageName); 125*ee19bac3SLuigi Micco } 126*ee19bac3SLuigi Micco 127*ee19bac3SLuigi Micco $iddata = p_get_metadata($page,'date'); 128*ee19bac3SLuigi Micco 129*ee19bac3SLuigi Micco $html = $html . p_wiki_xhtml($page,$REV,false); 130*ee19bac3SLuigi Micco 131*ee19bac3SLuigi Micco if ($n == 0) { 132*ee19bac3SLuigi Micco // standard replacements 133*ee19bac3SLuigi Micco $replace = array( 134*ee19bac3SLuigi Micco '@ID@' => $ID, 135*ee19bac3SLuigi Micco '@PAGE@' => '{PAGENO}', 136*ee19bac3SLuigi Micco '@PAGES@' => '{nb}', 137*ee19bac3SLuigi Micco '@TITLE@' => $pageName, 138*ee19bac3SLuigi Micco '@WIKI@' => $conf['title'], 139*ee19bac3SLuigi Micco '@WIKIURL@' => DOKU_URL, 140*ee19bac3SLuigi Micco '@UPDATE@' => dformat($iddata['modified']), 141*ee19bac3SLuigi Micco '@PAGEURL@' => wl($idparam, false, true, "&"), 142*ee19bac3SLuigi Micco '@DATE@' => strftime($conf['dformat']), 143*ee19bac3SLuigi Micco ); 144*ee19bac3SLuigi Micco 145*ee19bac3SLuigi Micco // do the replace 146*ee19bac3SLuigi Micco $footer_odd = str_replace(array_keys($replace), array_values($replace), $this->getConf("footer_odd")); 147*ee19bac3SLuigi Micco $footer_even = str_replace(array_keys($replace), array_values($replace), $this->getConf("footer_even")); 148*ee19bac3SLuigi Micco $header_odd = str_replace(array_keys($replace), array_values($replace), $this->getConf("header_odd")); 149*ee19bac3SLuigi Micco $header_even = str_replace(array_keys($replace), array_values($replace), $this->getConf("header_even")); 150*ee19bac3SLuigi Micco 151*ee19bac3SLuigi Micco $mpdf->SetHeader($header_odd); 152*ee19bac3SLuigi Micco $mpdf->SetHeader($header_even, 'E'); 153*ee19bac3SLuigi Micco 154*ee19bac3SLuigi Micco $mpdf->SetFooter($footer_odd); 155*ee19bac3SLuigi Micco $mpdf->SetFooter($footer_even, 'E'); 156*ee19bac3SLuigi Micco } 157*ee19bac3SLuigi Micco 158*ee19bac3SLuigi Micco $html = $this->citation($html, $conf['title'], $idparam, $iddata, $this->getConf('addcitation')); 159*ee19bac3SLuigi Micco 160*ee19bac3SLuigi Micco if ($n < (count($list) - 1)) $html = $html . "<pagebreak />"; 161*ee19bac3SLuigi Micco 162*ee19bac3SLuigi Micco } 163*ee19bac3SLuigi Micco 164*ee19bac3SLuigi Micco $html = $this->arrangeHtml($html, $this->getConf("maxbookmarks"), $this->getConf("norender")); 165*ee19bac3SLuigi Micco 166*ee19bac3SLuigi Micco $mpdf->SetTitle($pageName); 167*ee19bac3SLuigi Micco $mpdf->WriteHTML($html); 168*ee19bac3SLuigi Micco 169*ee19bac3SLuigi Micco if (count($list) == 1) $pdftitle = $pageName; 170*ee19bac3SLuigi Micco 171*ee19bac3SLuigi Micco $output = 'I'; 172*ee19bac3SLuigi Micco if($this->getConf('output') == 'file') $output = 'D'; 173*ee19bac3SLuigi Micco $mpdf->Output(urlencode($pdftitle).'.pdf', $output); 174*ee19bac3SLuigi Micco 175*ee19bac3SLuigi Micco die(); 176*ee19bac3SLuigi Micco } 177*ee19bac3SLuigi Micco } 178*ee19bac3SLuigi Micco 179*ee19bac3SLuigi Micco // thanks to Jared Ong 180*ee19bac3SLuigi Micco // Custom function for help in stripping span tags 181*ee19bac3SLuigi Micco function strip_only($str, $tags) { 182*ee19bac3SLuigi Micco if(!is_array($tags)) { 183*ee19bac3SLuigi Micco $tags = (strpos($str, '>') !== false ? explode('>', str_replace('<', '', $tags)) : array($tags)); 184*ee19bac3SLuigi Micco if(end($tags) == '') array_pop($tags); 185*ee19bac3SLuigi Micco } 186*ee19bac3SLuigi Micco foreach($tags as $tag) $str = preg_replace('#</?'.$tag.'[^>]*>#is', '', $str); 187*ee19bac3SLuigi Micco return $str; 188*ee19bac3SLuigi Micco } 189*ee19bac3SLuigi Micco // Custom function for help in stripping span tags 190*ee19bac3SLuigi Micco 191*ee19bac3SLuigi Micco // Custom function for help in replacing ' " > < & 192*ee19bac3SLuigi Micco function strip_htmlencodedchars($str) { 193*ee19bac3SLuigi Micco $str = str_replace(''', '\'', $str); 194*ee19bac3SLuigi Micco $str = str_replace('"', '"', $str); 195*ee19bac3SLuigi Micco $str = str_replace('>', '>', $str); 196*ee19bac3SLuigi Micco $str = str_replace('<', '<', $str); 197*ee19bac3SLuigi Micco $str = str_replace('&', '&', $str); 198*ee19bac3SLuigi Micco return $str; 199*ee19bac3SLuigi Micco } 200*ee19bac3SLuigi Micco // Custom function for help in replacing ' " > < & 201*ee19bac3SLuigi Micco 202*ee19bac3SLuigi Micco 203*ee19bac3SLuigi Micco function arrangeHtml($html, $bookmark = 0, $norendertags = '' ) { 204*ee19bac3SLuigi Micco 205*ee19bac3SLuigi Micco // add bookmark links 206*ee19bac3SLuigi Micco if ($bookmark > 0) { 207*ee19bac3SLuigi Micco $html = preg_replace("/\<a name=(.+?)\>(.+?)\<\/a\>/s",'$2',$html); 208*ee19bac3SLuigi Micco for ($j = 1; $j<=$bookmark; $j++) { 209*ee19bac3SLuigi Micco $html = preg_replace("/\<h".$j."\>(.+?)\<\/h".$j."\>/s",'<h'.$j.'>$1<bookmark content="$1" level="'.($j-1).'"/></h'.$j.'>',$html); 210*ee19bac3SLuigi Micco } 211*ee19bac3SLuigi Micco } 212*ee19bac3SLuigi Micco // add bookmark links 213*ee19bac3SLuigi Micco 214*ee19bac3SLuigi Micco // insert a pagebreak for support of WRAP and PAGEBREAK plugins 215*ee19bac3SLuigi Micco $html = str_replace('<br style="page-break-after:always;">','<pagebreak />',$html); 216*ee19bac3SLuigi Micco $html = str_replace('<div class="wrap_pagebreak"></div>','<pagebreak />',$html); 217*ee19bac3SLuigi Micco 218*ee19bac3SLuigi Micco // thanks to Jared Ong 219*ee19bac3SLuigi Micco // Customized to strip all span tags so that the wiki <code> SQL would display properly 220*ee19bac3SLuigi Micco $norender = explode(',',$norendertags); 221*ee19bac3SLuigi Micco $html = $this->strip_only($html, $norender ); //array('span','acronym')); 222*ee19bac3SLuigi Micco $html = $this->strip_htmlencodedchars($html); 223*ee19bac3SLuigi Micco // Customized to strip all span tags so that the wiki <code> SQL would display properly 224*ee19bac3SLuigi Micco 225*ee19bac3SLuigi Micco $html = str_replace('href="/','href="http://'.$_SERVER['HTTP_HOST'].'/',$html); 226*ee19bac3SLuigi Micco 227*ee19bac3SLuigi Micco return $html; 228*ee19bac3SLuigi Micco } 229*ee19bac3SLuigi Micco 230*ee19bac3SLuigi Micco function citation($html, $title, $idparam, $date, $flag = false) { 231*ee19bac3SLuigi Micco 232*ee19bac3SLuigi Micco if($flag) { 233*ee19bac3SLuigi Micco $html = $html . "<br><br><div style='font-size: 80%; border: solid 0.5mm #DDDDDD;background-color: #EEEEEE; padding: 2mm; border-radius: 2mm 2mm; width: 100%;'>"; 234*ee19bac3SLuigi Micco $html = $html . "From:<br>"; 235*ee19bac3SLuigi Micco $html = $html . "<a href='".DOKU_URL."'>".DOKU_URL."</a> - "."<b>".$title."</b>"; 236*ee19bac3SLuigi Micco $html = $html . "<br><br>Permanent link:<br>"; 237*ee19bac3SLuigi Micco $html = $html . "<b><a href='".wl($idparam, false, true, "&")."'>".wl($idparam, false, true, "&")."</a></b>"; 238*ee19bac3SLuigi Micco $html = $html . "<br><br>Last update: <b>".dformat($date['modified'])."</b><br>"; 239*ee19bac3SLuigi Micco $html = $html . "</div>"; 240*ee19bac3SLuigi Micco } 241*ee19bac3SLuigi Micco return $html; 242*ee19bac3SLuigi Micco } 243*ee19bac3SLuigi Micco 244*ee19bac3SLuigi Micco} 245*ee19bac3SLuigi Micco?> 246