xref: /plugin/struct/meta/InlineConfigParser.php (revision 7234bfb14e712ff548d9266ef32fdcc8eaf2d04e)
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
33*7234bfb1Ssplitbrain        $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 '':
53812a20f7SIain Hallam                        // Move straight to next parameter
54812a20f7SIain Hallam                        continue 2;
55812a20f7SIain Hallam                        break;
56812a20f7SIain Hallam                    // Pass full text ending in : straight to config
57812a20f7SIain Hallam                    case $p[-1] == ':' ? $p : '':
58812a20f7SIain Hallam                        if (in_array($p, ['filter', 'where', 'filterand', 'and', 'filteror', 'or'])) {
59812a20f7SIain Hallam                            $filtering = true;
60812a20f7SIain Hallam                        }
61812a20f7SIain Hallam                        $lines[] = $p . ' ' . trim($parameters[$i + 1]);
62812a20f7SIain Hallam                        $i++;
63812a20f7SIain Hallam                        break;
64812a20f7SIain Hallam                    // Short alias for filterand
65812a20f7SIain Hallam                    case '&':
66812a20f7SIain Hallam                        $filtering = true;
67812a20f7SIain Hallam                        $lines[] = 'filterand: ' . trim($parameters[$i + 1]);
68812a20f7SIain Hallam                        $i++;
69812a20f7SIain Hallam                        break;
70812a20f7SIain Hallam                    // Short alias for filteror
71812a20f7SIain Hallam                    case '|':
72812a20f7SIain Hallam                        $filtering = true;
73812a20f7SIain Hallam                        $lines[] = 'filteror: ' . trim($parameters[$i + 1]);
74812a20f7SIain Hallam                        $i++;
75812a20f7SIain Hallam                        break;
76812a20f7SIain Hallam                    default:
77812a20f7SIain Hallam                        // Move straight to next parameter
78812a20f7SIain Hallam                        continue 2;
79812a20f7SIain Hallam                        break;
80812a20f7SIain Hallam                }
81812a20f7SIain Hallam            }
82812a20f7SIain Hallam        }
83812a20f7SIain Hallam
84812a20f7SIain Hallam        // Check whether a page was specified
85812a20f7SIain Hallam        if (count($components) == 3) {
86812a20f7SIain Hallam            // At least page, schema and field supplied
87812a20f7SIain Hallam            $lines[] = 'schema: ' . trim($components[1]);
88812a20f7SIain Hallam            $lines[] = 'field: ' . trim($components[2]);
89812a20f7SIain Hallam            $lines[] = 'filter: %pageid% = ' . trim($components[0]);
90812a20f7SIain Hallam        } elseif (count($components) == 2) {
91812a20f7SIain Hallam            // At least schema and field supplied
92812a20f7SIain Hallam            $lines[] = 'schema: ' . trim($components[0]);
93812a20f7SIain Hallam            $lines[] = 'field: ' . trim($components[1]);
94812a20f7SIain Hallam            if (!$filtering) {
95812a20f7SIain Hallam                $lines[] = 'filter: %pageid% = $ID$';
96812a20f7SIain Hallam            }
97812a20f7SIain Hallam        }
98812a20f7SIain Hallam
99812a20f7SIain Hallam        // Call original ConfigParser's constructor
100812a20f7SIain Hallam        parent::__construct($lines);
101812a20f7SIain Hallam    }
102812a20f7SIain Hallam}
103