1<?php
2
3namespace dokuwiki\Cache;
4
5/**
6 * Caching of data of renderer
7 */
8class CacheRenderer extends CacheParser
9{
10
11    /**
12     * method contains cache use decision logic
13     *
14     * @return bool               see useCache()
15     */
16    public function makeDefaultCacheDecision()
17    {
18        global $conf;
19
20        if (!parent::makeDefaultCacheDecision()) {
21            return false;
22        }
23
24        if (!isset($this->page)) {
25            return true;
26        }
27
28        // meta cache older than file it depends on?
29        if ($this->_time < @filemtime(metaFN($this->page, '.meta'))) {
30            return false;
31        }
32
33        // check current link existence is consistent with cache version
34        // first check the purgefile
35        // - if the cache is more recent than the purgefile we know no links can have been updated
36        if ($this->_time >= @filemtime($conf['cachedir'] . '/purgefile')) {
37            return true;
38        }
39
40        // for wiki pages, check metadata dependencies
41        $metadata = p_get_metadata($this->page);
42
43        if (!isset($metadata['relation']['references']) ||
44            empty($metadata['relation']['references'])) {
45            return true;
46        }
47
48        foreach ($metadata['relation']['references'] as $id => $exists) {
49            if ($exists != page_exists($id, '', false)) {
50                return false;
51            }
52        }
53
54        return true;
55    }
56
57    protected function addDependencies()
58    {
59        global $conf;
60
61        // default renderer cache file 'age' is dependent on 'cachetime' setting, two special values:
62        //    -1 : do not cache (should not be overridden)
63        //    0  : cache never expires (can be overridden) - no need to set depends['age']
64        if ($conf['cachetime'] == -1) {
65            $this->_nocache = true;
66            return;
67        } elseif ($conf['cachetime'] > 0) {
68            $this->depends['age'] = isset($this->depends['age']) ?
69                min($this->depends['age'], $conf['cachetime']) : $conf['cachetime'];
70        }
71
72        // renderer cache file dependencies ...
73        $files = array(
74            DOKU_INC . 'inc/parser/' . $this->mode . '.php',       // ... the renderer
75        );
76
77        // page implies metadata and possibly some other dependencies
78        if (isset($this->page)) {
79
80            // for xhtml this will render the metadata if needed
81            $valid = p_get_metadata($this->page, 'date valid');
82            if (!empty($valid['age'])) {
83                $this->depends['age'] = isset($this->depends['age']) ?
84                    min($this->depends['age'], $valid['age']) : $valid['age'];
85            }
86        }
87
88        $this->depends['files'] = !empty($this->depends['files']) ?
89            array_merge($files, $this->depends['files']) :
90            $files;
91
92        parent::addDependencies();
93    }
94}
95