xref: /plugin/struct/meta/InlineConfigParser.php (revision 812a20f76a42af454ce9b827bf7c930f0774879f)
1*812a20f7SIain Hallam<?php
2*812a20f7SIain Hallam
3*812a20f7SIain Hallamnamespace dokuwiki\plugin\struct\meta;
4*812a20f7SIain Hallam
5*812a20f7SIain Hallam/**
6*812a20f7SIain Hallam * Class InlineConfigParser
7*812a20f7SIain Hallam *
8*812a20f7SIain Hallam * Wrapper to convert inline syntax to full before instantiating ConfigParser
9*812a20f7SIain Hallam *
10*812a20f7SIain Hallam * {{$schema.field}}
11*812a20f7SIain Hallam * {{$pageid.schema.field}}
12*812a20f7SIain Hallam * {{$... ? filter: ... and: ... or: ...}} or {{$... ? & ... | ...}}
13*812a20f7SIain Hallam * TODO: {{$... ? sum}} or {{$... ? +}}
14*812a20f7SIain Hallam * TODO: {{$... ? default: ...}} or {{$... ? ! ...}}
15*812a20f7SIain Hallam * Colons following key words must have no space preceding them.
16*812a20f7SIain Hallam * If no page ID or filter is supplied, filter: "%pageid% = $ID$" is added.
17*812a20f7SIain Hallam * Any component can be placed in double quotes (needed to allow space, dot or question mark in components).
18*812a20f7SIain Hallam *
19*812a20f7SIain Hallam * @package dokuwiki\plugin\struct\meta
20*812a20f7SIain Hallam */
21*812a20f7SIain Hallamclass InlineConfigParser extends ConfigParser
22*812a20f7SIain Hallam{
23*812a20f7SIain Hallam
24*812a20f7SIain Hallam    /**
25*812a20f7SIain Hallam     * Parser constructor.
26*812a20f7SIain Hallam     *
27*812a20f7SIain Hallam     * parses the given inline configuration
28*812a20f7SIain Hallam     *
29*812a20f7SIain Hallam     * @param  string  $inline
30*812a20f7SIain Hallam     */
31*812a20f7SIain Hallam    public function __construct($inline)
32*812a20f7SIain Hallam    {
33*812a20f7SIain Hallam        // Start to build the main config array
34*812a20f7SIain Hallam        $lines     = array();  // Config lines to pass to full parser
35*812a20f7SIain Hallam
36*812a20f7SIain Hallam        // Extract components
37*812a20f7SIain Hallam        $parts        = explode('?', $inline, 2);
38*812a20f7SIain Hallam        $n_parts      = count($parts);
39*812a20f7SIain Hallam        $components   = str_getcsv(trim($parts[0]), '.');
40*812a20f7SIain Hallam        $n_components = count($components);
41*812a20f7SIain Hallam
42*812a20f7SIain Hallam        // Extract parameters if given
43*812a20f7SIain Hallam        if ($n_parts == 2) {
44*812a20f7SIain Hallam            $filtering    = false;  // Whether to filter result to current page
45*812a20f7SIain Hallam            $parameters   = str_getcsv(trim($parts[1]), ' ');
46*812a20f7SIain Hallam            $n_parameters = count($parameters);
47*812a20f7SIain Hallam
48*812a20f7SIain Hallam            // Process parameters and add to config lines
49*812a20f7SIain Hallam            for ($i = 0; $i < $n_parameters; $i++) {
50*812a20f7SIain Hallam                $p = trim($parameters[$i]);
51*812a20f7SIain Hallam                switch ($p) {
52*812a20f7SIain Hallam                    // Empty (due to extra spaces)
53*812a20f7SIain Hallam                    case '':
54*812a20f7SIain Hallam                        // Move straight to next parameter
55*812a20f7SIain Hallam                        continue 2;
56*812a20f7SIain Hallam                        break;
57*812a20f7SIain Hallam                    // Pass full text ending in : straight to config
58*812a20f7SIain Hallam                    case $p[-1] == ':' ? $p : '':
59*812a20f7SIain Hallam                        if (in_array($p, ['filter', 'where', 'filterand', 'and', 'filteror','or'])) {
60*812a20f7SIain Hallam                            $filtering = true;
61*812a20f7SIain Hallam                        }
62*812a20f7SIain Hallam                        $lines[] = $p . ' ' . trim($parameters[$i + 1]);
63*812a20f7SIain Hallam                        $i++;
64*812a20f7SIain Hallam                        break;
65*812a20f7SIain Hallam                    // Short alias for filterand
66*812a20f7SIain Hallam                    case '&':
67*812a20f7SIain Hallam                        $filtering = true;
68*812a20f7SIain Hallam                        $lines[] = 'filterand: ' . trim($parameters[$i + 1]);
69*812a20f7SIain Hallam                        $i++;
70*812a20f7SIain Hallam                        break;
71*812a20f7SIain Hallam                    // Short alias for filteror
72*812a20f7SIain Hallam                    case '|':
73*812a20f7SIain Hallam                        $filtering = true;
74*812a20f7SIain Hallam                        $lines[] = 'filteror: ' . trim($parameters[$i + 1]);
75*812a20f7SIain Hallam                        $i++;
76*812a20f7SIain Hallam                        break;
77*812a20f7SIain Hallam                    default:
78*812a20f7SIain Hallam                        // Move straight to next parameter
79*812a20f7SIain Hallam                        continue 2;
80*812a20f7SIain Hallam                        break;
81*812a20f7SIain Hallam                }
82*812a20f7SIain Hallam            }
83*812a20f7SIain Hallam        }
84*812a20f7SIain Hallam
85*812a20f7SIain Hallam        // Check whether a page was specified
86*812a20f7SIain Hallam        if (count($components) == 3) {
87*812a20f7SIain Hallam            // At least page, schema and field supplied
88*812a20f7SIain Hallam            $lines[] = 'schema: ' . trim($components[1]);
89*812a20f7SIain Hallam            $lines[] = 'field: ' . trim($components[2]);
90*812a20f7SIain Hallam            $lines[] = 'filter: %pageid% = ' . trim($components[0]);
91*812a20f7SIain Hallam        } elseif (count($components) == 2) {
92*812a20f7SIain Hallam            // At least schema and field supplied
93*812a20f7SIain Hallam            $lines[] = 'schema: ' . trim($components[0]);
94*812a20f7SIain Hallam            $lines[] = 'field: ' . trim($components[1]);
95*812a20f7SIain Hallam            if (! $filtering) {
96*812a20f7SIain Hallam                $lines[] = 'filter: %pageid% = $ID$';
97*812a20f7SIain Hallam            }
98*812a20f7SIain Hallam        }
99*812a20f7SIain Hallam
100*812a20f7SIain Hallam        // Call original ConfigParser's constructor
101*812a20f7SIain Hallam        parent::__construct($lines);
102*812a20f7SIain Hallam    }
103*812a20f7SIain Hallam}
104