xref: /plugin/dw2pdf/action.php (revision ee19bac3a9e18c4e82bade46c04f87d8eefafb3c)
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 &#039; &quot; &gt; &lt; &amp;
192*ee19bac3SLuigi Micco    function strip_htmlencodedchars($str) {
193*ee19bac3SLuigi Micco      $str = str_replace('&#039;', '\'', $str);
194*ee19bac3SLuigi Micco      $str = str_replace('&quot;', '"', $str);
195*ee19bac3SLuigi Micco      $str = str_replace('&gt;', '>', $str);
196*ee19bac3SLuigi Micco      $str = str_replace('&lt;', '<', $str);
197*ee19bac3SLuigi Micco      $str = str_replace('&amp;', '&', $str);
198*ee19bac3SLuigi Micco      return $str;
199*ee19bac3SLuigi Micco    }
200*ee19bac3SLuigi Micco    // Custom function for help in replacing &#039; &quot; &gt; &lt; &amp;
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>&nbsp;-&nbsp;"."<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