xref: /plugin/struct/meta/InlineConfigParser.php (revision 5e29103a15bd9873f422f66a6a5239b6aec4651e)
1812a20f7SIain Hallam<?php
2812a20f7SIain Hallam
3812a20f7SIain Hallamnamespace dokuwiki\plugin\struct\meta;
4812a20f7SIain Hallam
5812a20f7SIain Hallam/**
6812a20f7SIain Hallam * Class InlineConfigParser
7812a20f7SIain Hallam *
8812a20f7SIain Hallam * Wrapper to convert inline syntax to full before instantiating ConfigParser
9812a20f7SIain Hallam *
10812a20f7SIain Hallam * {{$schema.field}}
11812a20f7SIain Hallam * {{$pageid.schema.field}}
12812a20f7SIain Hallam * {{$... ? filter: ... and: ... or: ...}} or {{$... ? & ... | ...}}
13812a20f7SIain Hallam * TODO: {{$... ? sum}} or {{$... ? +}}
14812a20f7SIain Hallam * TODO: {{$... ? default: ...}} or {{$... ? ! ...}}
15812a20f7SIain Hallam * Colons following key words must have no space preceding them.
16812a20f7SIain Hallam * If no page ID or filter is supplied, filter: "%pageid% = $ID$" is added.
17812a20f7SIain Hallam * Any component can be placed in double quotes (needed to allow space, dot or question mark in components).
18812a20f7SIain Hallam *
19812a20f7SIain Hallam * @package dokuwiki\plugin\struct\meta
20812a20f7SIain Hallam */
21812a20f7SIain Hallamclass InlineConfigParser extends ConfigParser
22812a20f7SIain Hallam{
23812a20f7SIain Hallam    /**
24812a20f7SIain Hallam     * Parser constructor.
25812a20f7SIain Hallam     *
26812a20f7SIain Hallam     * parses the given inline configuration
27812a20f7SIain Hallam     *
28812a20f7SIain Hallam     * @param string $inline
29812a20f7SIain Hallam     */
30812a20f7SIain Hallam    public function __construct($inline)
31812a20f7SIain Hallam    {
32812a20f7SIain Hallam        // Start to build the main config array
337234bfb1Ssplitbrain        $lines = [];  // Config lines to pass to full parser
34812a20f7SIain Hallam
35812a20f7SIain Hallam        // Extract components
36812a20f7SIain Hallam        $parts = explode('?', $inline, 2);
37812a20f7SIain Hallam        $n_parts = count($parts);
38812a20f7SIain Hallam        $components = str_getcsv(trim($parts[0]), '.');
39812a20f7SIain Hallam
40812a20f7SIain Hallam        // Extract parameters if given
41ca096eb0SLaurent Forthomme        $filtering = false;  // First initialisation of the variable
42812a20f7SIain Hallam        if ($n_parts == 2) {
43812a20f7SIain Hallam            $filtering = false;  // Whether to filter result to current page
44812a20f7SIain Hallam            $parameters = str_getcsv(trim($parts[1]), ' ');
45812a20f7SIain Hallam            $n_parameters = count($parameters);
46812a20f7SIain Hallam
47812a20f7SIain Hallam            // Process parameters and add to config lines
48812a20f7SIain Hallam            for ($i = 0; $i < $n_parameters; $i++) {
49812a20f7SIain Hallam                $p = trim($parameters[$i]);
50812a20f7SIain Hallam                switch ($p) {
51812a20f7SIain Hallam                    // Empty (due to extra spaces)
52812a20f7SIain Hallam                    case '':
53*5e29103aSannda                    default:
54812a20f7SIain Hallam                        // Move straight to next parameter
55812a20f7SIain Hallam                        continue 2;
56812a20f7SIain Hallam                        break;
57812a20f7SIain Hallam                    // Pass full text ending in : straight to config
58812a20f7SIain Hallam                    case $p[-1] == ':' ? $p : '':
59812a20f7SIain Hallam                        if (in_array($p, ['filter', 'where', 'filterand', 'and', 'filteror', 'or'])) {
60812a20f7SIain Hallam                            $filtering = true;
61812a20f7SIain Hallam                        }
62812a20f7SIain Hallam                        $lines[] = $p . ' ' . trim($parameters[$i + 1]);
63812a20f7SIain Hallam                        $i++;
64812a20f7SIain Hallam                        break;
65812a20f7SIain Hallam                    // Short alias for filterand
66812a20f7SIain Hallam                    case '&':
67812a20f7SIain Hallam                        $filtering = true;
68812a20f7SIain Hallam                        $lines[] = 'filterand: ' . trim($parameters[$i + 1]);
69812a20f7SIain Hallam                        $i++;
70812a20f7SIain Hallam                        break;
71812a20f7SIain Hallam                    // Short alias for filteror
72812a20f7SIain Hallam                    case '|':
73812a20f7SIain Hallam                        $filtering = true;
74812a20f7SIain Hallam                        $lines[] = 'filteror: ' . trim($parameters[$i + 1]);
75812a20f7SIain Hallam                        $i++;
76812a20f7SIain Hallam                        break;
77812a20f7SIain Hallam                }
78812a20f7SIain Hallam            }
79812a20f7SIain Hallam        }
80812a20f7SIain Hallam
81812a20f7SIain Hallam        // Check whether a page was specified
82812a20f7SIain Hallam        if (count($components) == 3) {
83812a20f7SIain Hallam            // At least page, schema and field supplied
84812a20f7SIain Hallam            $lines[] = 'schema: ' . trim($components[1]);
85812a20f7SIain Hallam            $lines[] = 'field: ' . trim($components[2]);
86812a20f7SIain Hallam            $lines[] = 'filter: %pageid% = ' . trim($components[0]);
87812a20f7SIain Hallam        } elseif (count($components) == 2) {
88812a20f7SIain Hallam            // At least schema and field supplied
89812a20f7SIain Hallam            $lines[] = 'schema: ' . trim($components[0]);
90812a20f7SIain Hallam            $lines[] = 'field: ' . trim($components[1]);
91812a20f7SIain Hallam            if (!$filtering) {
92812a20f7SIain Hallam                $lines[] = 'filter: %pageid% = $ID$';
93812a20f7SIain Hallam            }
94812a20f7SIain Hallam        }
95812a20f7SIain Hallam
96812a20f7SIain Hallam        // Call original ConfigParser's constructor
97812a20f7SIain Hallam        parent::__construct($lines);
98812a20f7SIain Hallam    }
99812a20f7SIain Hallam}
100