1<?php
2/**
3 * CSV Plugin: displays a single value from a CSV file
4 *
5 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
6 * @author     Andreas Gohr <gohr@cosmocode.de>
7 */
8
9/**
10 * Display a single CSV value
11 */
12class syntax_plugin_csv_value extends DokuWiki_Syntax_Plugin
13{
14
15    protected $rowcache = array();
16
17    /** @inheritdoc */
18    public function getType()
19    {
20        return 'substition';
21    }
22
23    /** @inheritdoc */
24    public function getSort()
25    {
26        return 155;
27    }
28
29    /** @inheritdoc */
30    public function getPType()
31    {
32        return 'normal';
33    }
34
35    /** @inheritdoc */
36    public function connectTo($mode)
37    {
38        $this->Lexer->addSpecialPattern('<csvval[^>]*>', $mode, 'plugin_csv_value');
39    }
40
41    /** @inheritdoc */
42    public function handle($match, $state, $pos, Doku_Handler $handler)
43    {
44        $optstr = substr($match, 7, -1); // <csvval ... >
45        $opt = helper_plugin_csv::parseOptions($optstr);
46
47        return $opt;
48    }
49
50    /**
51     * @param array $opt
52     * @return string
53     */
54    public function getCachedValue($opt)
55    {
56        $r = $opt['outr'] + $opt['hdr_rows'];
57        $c = $opt['outc'];
58        unset($opt['output']);
59        unset($opt['outr']);
60        unset($opt['outc']);
61
62        $cache = md5(serialize($opt));
63        if (!isset($this->rowcache[$cache])) {
64            try {
65                $content = helper_plugin_csv::loadContent($opt['file']);
66            } catch (\Exception $e) {
67                return $e->getMessage();
68            }
69            $this->rowcache[$cache] = helper_plugin_csv::prepareData($content, $opt);
70        }
71
72        if (isset($this->rowcache[$cache][$r][$c])) {
73            return $this->rowcache[$cache][$r][$c];
74        } else {
75            return 'Failed to find requested value';
76        }
77    }
78
79    /** @inheritdoc */
80    public function render($mode, Doku_Renderer $renderer, $opt)
81    {
82        if ($mode == 'metadata') return false;
83
84        if ($opt['file'] === '') {
85            $renderer->cdata('no csv file given');
86            return true;
87        }
88
89        if (!media_ispublic($opt['file'])) $renderer->info['cache'] = false;
90
91        $value = $this->getCachedValue($opt);
92        $renderer->cdata($value);
93        return true;
94    }
95
96}
97