1 <?php
2 
3 use dokuwiki\Extension\Plugin;
4 use dokuwiki\plugin\struct\meta\StructException;
5 use dokuwiki\plugin\struct\meta\Search;
6 
7 /**
8  * DokuWiki Plugin struct (Helper Component)
9  *
10  * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
11  * @author  Andreas Gohr, Michael Große <dokuwiki@cosmocode.de>
12  */
13 
14 class helper_plugin_struct_config extends Plugin
15 {
16     /**
17      * @param string $val
18      *
19      * @return array
20      */
21     public function parseSort($val)
22     {
23         if (substr($val, 0, 1) == '^') {
24             return [substr($val, 1), false];
25         }
26         return [$val, true];
27     }
28 
29     /**
30      * @param $logic
31      * @param $val
32      *
33      * @return array|bool
34      */
35     public function parseFilterLine($logic, $val)
36     {
37         $flt = $this->parseFilter($val);
38         if ($flt) {
39             $flt[] = $logic;
40             return $flt;
41         }
42         return false;
43     }
44 
45     /**
46      * Parse a filter
47      *
48      * @param string $val
49      *
50      * @return array ($col, $comp, $value)
51      * @throws StructException
52      */
53     protected function parseFilter($val)
54     {
55 
56         $comps = Search::$COMPARATORS;
57         $comps[] = '*~';
58         array_unshift($comps, '<>');
59         $comps = array_map('preg_quote_cb', $comps);
60         $comps = implode('|', $comps);
61 
62         if (!preg_match('/^(.*?)(' . $comps . ')(.*)$/', $val, $match)) {
63             throw new StructException('Invalid search filter %s', hsc($val));
64         }
65         array_shift($match); // we don't need the zeroth match
66         $match[0] = trim($match[0]);
67         $match[2] = trim($match[2]);
68         return $match;
69     }
70 }
71 
72 // vim:ts=4:sw=4:et:
73