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