1<?php
2/**
3 * Source Plugin: includes a source file using the geshi highlighter
4 *
5 * Action plugin component, for cache validity determination
6 *
7 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
8 * @author     Christopher Smith <chris@jalakai.co.uk>
9 */
10if(!defined('DOKU_INC')) die();  // no Dokuwiki, no go
11
12if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
13require_once(DOKU_PLUGIN.'action.php');
14
15/**
16 * All DokuWiki plugins to extend the parser/rendering mechanism
17 * need to inherit from this class
18 */
19class action_plugin_source extends DokuWiki_Action_Plugin {
20
21    /**
22     * return some info
23     */
24    function getInfo(){
25      return array(
26        'author' => 'Christopher Smith',
27        'email'  => 'chris@jalakai.co.uk',
28        'date'   => '2008-08-13',
29        'name'   => 'Source Plugin',
30        'desc'   => 'Include a remote source file',
31        'url'    => 'http://www.dokuwiki.org/plugin:source',
32      );
33    }
34
35    /**
36     * plugin should use this method to register its handlers with the dokuwiki's event controller
37     */
38    function register(&$controller) {
39      $controller->register_hook('PARSER_CACHE_USE','BEFORE', $this, '_cache_prepare');
40    }
41
42    /**
43     * prepare the cache object for default _useCache action
44     */
45    function _cache_prepare(&$event, $param) {
46      $cache =& $event->data;
47
48      // we're only interested in wiki pages and supported render modes
49      if (!isset($cache->page)) return;
50      if (!isset($cache->mode) || in_array($cache->mode,array('i','metadata'))) return;
51
52      $max_age = $this->_cache_maxage($cache->page);
53      if (is_null($max_age)) return;
54
55      if ($max_age <= 0) {
56        // expire the cache
57        $event->preventDefault();
58        $event->stopPropagation();
59        $event->result = false;
60        return;
61      }
62
63      $cache->depends['age'] = !empty($cache->depends['age']) ?  min($cache->depends['age'],$max_age): $max_age;
64    }
65
66    /**
67     * determine the max allowable age of the cache
68     *
69     * @param   string    $id         wiki page name
70     *
71     * @return  int                   max allowable age of the cache
72     *                                null means not applicable
73     */
74    function _cache_maxage($id) {
75      $hasPart = p_get_metadata($id, 'relation haspart');
76      if (empty($hasPart) || !is_array($hasPart)) return null;
77
78      $location = $this->getConf('location');
79
80      $age = 0;
81      foreach ($hasPart as $file => $data) {
82        // ensure the metadata entry was created by or for this plugin
83        if (empty($data['owner']) || $data['owner'] != $this->getPluginName()) continue;
84
85        $file = $this->getConf['location'].$file;
86
87        // determine max allowable age for the cache
88        // if filemtime can't be determined, either for a non-existent $file or for a $file using
89        // an unsupported scheme, expire the cache immediately/always
90        $mtime = @filemtime($file);
91        if (!$mtime) { return 0; }
92
93        $age = max($age,$mtime);
94      }
95
96      return $age ? time()-$age : null;
97    }
98
99}
100
101//Setup VIM: ex: et ts=4 enc=utf-8 :