xref: /plugin/siteexport/action/pdfstyles.php (revision 8b157782c87209a5933bf869562aea1c049554c8)
1*8b157782Si-net /// software<?php
2*8b157782Si-net /// software/**
3*8b157782Si-net /// software * DokuWiki Plugin inetmodifications (Action Component)
4*8b157782Si-net /// software *
5*8b157782Si-net /// software * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6*8b157782Si-net /// software * @author  i-net /// software <tools@inetsoftware.de>
7*8b157782Si-net /// software */
8*8b157782Si-net /// software
9*8b157782Si-net /// software// must be run within Dokuwiki
10*8b157782Si-net /// softwareif(!defined('DOKU_INC')) die();
11*8b157782Si-net /// software
12*8b157782Si-net /// softwareclass action_plugin_siteexport_pdfstyles extends DokuWiki_Action_Plugin {
13*8b157782Si-net /// software
14*8b157782Si-net /// software    /**
15*8b157782Si-net /// software     * Registers a callback function for a given event
16*8b157782Si-net /// software     *
17*8b157782Si-net /// software     * @param Doku_Event_Handler $controller DokuWiki's event controller object
18*8b157782Si-net /// software     * @return void
19*8b157782Si-net /// software     */
20*8b157782Si-net /// software    public function register(Doku_Event_Handler $controller) {
21*8b157782Si-net /// software        global $INPUT;
22*8b157782Si-net /// software        if ( !strrpos( $_SERVER['SCRIPT_FILENAME'], 'css.php', -7 ) ) { return; }
23*8b157782Si-net /// software        if ( !$INPUT->has('pdfExport') ) { return true; }
24*8b157782Si-net /// software
25*8b157782Si-net /// software        $controller->register_hook('CSS_STYLES_INCLUDED', 'BEFORE', $this, 'handle_css_styles');
26*8b157782Si-net /// software        $controller->register_hook('CSS_CACHE_USE', 'BEFORE', $this, 'handle_use_cache');
27*8b157782Si-net /// software    }
28*8b157782Si-net /// software
29*8b157782Si-net /// software    /**
30*8b157782Si-net /// software     * This function serves debugging purposes and has to be enabled in the register phase
31*8b157782Si-net /// software     *
32*8b157782Si-net /// software     * @param Doku_Event $event  event object by reference
33*8b157782Si-net /// software     * @param mixed      $param  [the parameters passed as fifth argument to register_hook() when this
34*8b157782Si-net /// software     *                           handler was registered]
35*8b157782Si-net /// software     * @return void
36*8b157782Si-net /// software     */
37*8b157782Si-net /// software    public function handle_use_cache(Doku_Event &$event, $param) {
38*8b157782Si-net /// software        global $INPUT;
39*8b157782Si-net /// software
40*8b157782Si-net /// software        // We need different keys for each style sheet.
41*8b157782Si-net /// software        $event->data->key .= $INPUT->str('pdfExport', '0');
42*8b157782Si-net /// software        $event->data->cache = getCacheName( $event->data->key, $event->data->ext );
43*8b157782Si-net /// software
44*8b157782Si-net /// software        return true;
45*8b157782Si-net /// software    }
46*8b157782Si-net /// software
47*8b157782Si-net /// software    /**
48*8b157782Si-net /// software     * Finally, handle the JS script list. The script would be fit to do even more stuff / types
49*8b157782Si-net /// software     * but handles only admin and default currently.
50*8b157782Si-net /// software     *
51*8b157782Si-net /// software     * @param Doku_Event $event  event object by reference
52*8b157782Si-net /// software     * @param mixed      $param  [the parameters passed as fifth argument to register_hook() when this
53*8b157782Si-net /// software     *                           handler was registered]
54*8b157782Si-net /// software     * @return void
55*8b157782Si-net /// software     */
56*8b157782Si-net /// software    public function handle_css_styles(Doku_Event &$event, $param) {
57*8b157782Si-net /// software        global $INPUT;
58*8b157782Si-net /// software
59*8b157782Si-net /// software        switch( $event->data['mediatype'] ) {
60*8b157782Si-net /// software
61*8b157782Si-net /// software            case 'print':
62*8b157782Si-net /// software            case 'all':
63*8b157782Si-net /// software                // Filter for user styles
64*8b157782Si-net /// software                $allowed = array_filter( array_keys($event->data['files']), array($this, 'filter_css') );
65*8b157782Si-net /// software                $event->data['files'] = array_intersect_key($event->data['files'], array_flip($allowed));
66*8b157782Si-net /// software                break;
67*8b157782Si-net /// software
68*8b157782Si-net /// software            case 'screen':
69*8b157782Si-net /// software            case 'speech':
70*8b157782Si-net /// software            case 'DW_DEFAULT':
71*8b157782Si-net /// software                $event->preventDefault();
72*8b157782Si-net /// software                break;
73*8b157782Si-net /// software        }
74*8b157782Si-net /// software    }
75*8b157782Si-net /// software
76*8b157782Si-net /// software    /**
77*8b157782Si-net /// software     * A simple filter function to check the input string against a list of path-parts that are allowed
78*8b157782Si-net /// software     *
79*8b157782Si-net /// software     * @param string    $str   the script file to check against the list
80*8b157782Si-net /// software     * @param mixed     $list  the list of path parts to test
81*8b157782Si-net /// software     * @return boolean
82*8b157782Si-net /// software     */
83*8b157782Si-net /// software    private function includeFilter( $str, $list ) {
84*8b157782Si-net /// software
85*8b157782Si-net /// software        foreach( $list as $entry ) {
86*8b157782Si-net /// software            if ( strpos( $str, $entry ) ) return true;
87*8b157782Si-net /// software        }
88*8b157782Si-net /// software
89*8b157782Si-net /// software        return false;
90*8b157782Si-net /// software    }
91*8b157782Si-net /// software
92*8b157782Si-net /// software    /**
93*8b157782Si-net /// software     * Filters scripts that are intended for admins only
94*8b157782Si-net /// software     *
95*8b157782Si-net /// software     * @param string    $script   the script file to check against the list
96*8b157782Si-net /// software     * @return boolean
97*8b157782Si-net /// software     */
98*8b157782Si-net /// software    private function filter_css( $script ) {
99*8b157782Si-net /// software        return $this->includeFilter( $script, array(
100*8b157782Si-net /// software            '/lib/tpl/',
101*8b157782Si-net /// software        ));
102*8b157782Si-net /// software    }
103*8b157782Si-net /// software}
104*8b157782Si-net /// software
105*8b157782Si-net /// software// vim:ts=4:sw=4:et:
106