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