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