175494ca1SAnna Dabrowska<?php 275494ca1SAnna Dabrowska 375494ca1SAnna Dabrowskaclass helper_plugin_recommend_assignment 475494ca1SAnna Dabrowska{ 575494ca1SAnna Dabrowska public static $confFile = DOKU_CONF . 'recommend_snippets.json'; 675494ca1SAnna Dabrowska 775494ca1SAnna Dabrowska public static function getAssignments() 875494ca1SAnna Dabrowska { 9ea12645dSAnna Dabrowska if (!is_file(self::$confFile)) return []; 1075494ca1SAnna Dabrowska return @jsonToArray(self::$confFile); 1175494ca1SAnna Dabrowska } 1275494ca1SAnna Dabrowska 1375494ca1SAnna Dabrowska public function addAssignment($assignment) 1475494ca1SAnna Dabrowska { 1575494ca1SAnna Dabrowska $assignments = self::getAssignments(); 1675494ca1SAnna Dabrowska $assignments[] = $assignment; 1775494ca1SAnna Dabrowska return (bool)file_put_contents(self::$confFile, json_encode($assignments, JSON_PRETTY_PRINT)); 1875494ca1SAnna Dabrowska } 1975494ca1SAnna Dabrowska 2075494ca1SAnna Dabrowska public function removeAssignment($assignment) 2175494ca1SAnna Dabrowska { 2275494ca1SAnna Dabrowska if (empty($assignment['pattern'])) { 2375494ca1SAnna Dabrowska return false; 2475494ca1SAnna Dabrowska } 2575494ca1SAnna Dabrowska 2675494ca1SAnna Dabrowska $assignments = self::getAssignments(); 2775494ca1SAnna Dabrowska $remaining = array_filter($assignments, function($data) use ($assignment) { 2875494ca1SAnna Dabrowska return !( 2975494ca1SAnna Dabrowska $assignment['pattern'] === $data['pattern'] 3075494ca1SAnna Dabrowska && $assignment['user'] === $data['user'] 31d0dae647SAnna Dabrowska && $assignment['subject'] === $data['subject'] 3275494ca1SAnna Dabrowska && $assignment['message'] === $data['message'] 3375494ca1SAnna Dabrowska ); 3475494ca1SAnna Dabrowska }); 3575494ca1SAnna Dabrowska 3675494ca1SAnna Dabrowska if (count($remaining) < count($assignments)) { 3775494ca1SAnna Dabrowska return (bool)file_put_contents(self::$confFile, json_encode($remaining, JSON_PRETTY_PRINT)); 3875494ca1SAnna Dabrowska } 3975494ca1SAnna Dabrowska return false; 4075494ca1SAnna Dabrowska } 41b8b86b6cSAnna Dabrowska 42b8b86b6cSAnna Dabrowska /** 43b8b86b6cSAnna Dabrowska * Returns the last matching template. 44b8b86b6cSAnna Dabrowska * 45b8b86b6cSAnna Dabrowska * @return array 46b8b86b6cSAnna Dabrowska */ 47b8b86b6cSAnna Dabrowska public function loadMatchingTemplate() 48b8b86b6cSAnna Dabrowska { 49b8b86b6cSAnna Dabrowska $assignments = self::getAssignments(); 50b8b86b6cSAnna Dabrowska $hlp = $this; 51b8b86b6cSAnna Dabrowska $matches = array_filter($assignments, function ($data) use ($hlp) { 52b8b86b6cSAnna Dabrowska return $hlp::matchPagePattern($data['pattern']); 53b8b86b6cSAnna Dabrowska }); 54b8b86b6cSAnna Dabrowska 55b8b86b6cSAnna Dabrowska $template = array_pop($matches); 56b8b86b6cSAnna Dabrowska return $template; 57b8b86b6cSAnna Dabrowska } 58b8b86b6cSAnna Dabrowska 59b8b86b6cSAnna Dabrowska /** 60b8b86b6cSAnna Dabrowska * Check if the given pattern matches the given page 61b8b86b6cSAnna Dabrowska * 62b8b86b6cSAnna Dabrowska * @param string $pattern the pattern to check against 63b8b86b6cSAnna Dabrowska * @param string|null $page the cleaned pageid to check 64b8b86b6cSAnna Dabrowska * @param string|null $pns optimization, the colon wrapped namespace of the page, set null for automatic 65b8b86b6cSAnna Dabrowska * @return bool 66b8b86b6cSAnna Dabrowska * @author Andreas Gohr 67b8b86b6cSAnna Dabrowska * 68b8b86b6cSAnna Dabrowska */ 69b8b86b6cSAnna Dabrowska public static function matchPagePattern($pattern, $page = null, $pns = null) 70b8b86b6cSAnna Dabrowska { 71b8b86b6cSAnna Dabrowska if (is_null($page)) $page = getID(); 72b8b86b6cSAnna Dabrowska 73b8b86b6cSAnna Dabrowska if (trim($pattern, ':') == '**') { 74b8b86b6cSAnna Dabrowska return true; 75b8b86b6cSAnna Dabrowska } // match all 76b8b86b6cSAnna Dabrowska 77b8b86b6cSAnna Dabrowska // regex patterns 78b8b86b6cSAnna Dabrowska if ($pattern[0] == '/') { 79b8b86b6cSAnna Dabrowska return (bool) preg_match($pattern, ":$page"); 80b8b86b6cSAnna Dabrowska } 81b8b86b6cSAnna Dabrowska 82b8b86b6cSAnna Dabrowska if (is_null($pns)) { 83b8b86b6cSAnna Dabrowska $pns = ':' . getNS($page) . ':'; 84b8b86b6cSAnna Dabrowska } 85b8b86b6cSAnna Dabrowska 86b8b86b6cSAnna Dabrowska $ans = ':' . cleanID($pattern) . ':'; 87*c6f9d3d5SAnna Dabrowska if (str_ends_with($pattern, '**')) { 88b8b86b6cSAnna Dabrowska // upper namespaces match 89*c6f9d3d5SAnna Dabrowska if (str_starts_with($pns, $ans)) { 90b8b86b6cSAnna Dabrowska return true; 91b8b86b6cSAnna Dabrowska } 92*c6f9d3d5SAnna Dabrowska } elseif (str_ends_with($pattern, '*')) { 93b8b86b6cSAnna Dabrowska // namespaces match exact 94b8b86b6cSAnna Dabrowska if ($ans == $pns) { 95b8b86b6cSAnna Dabrowska return true; 96b8b86b6cSAnna Dabrowska } 97*c6f9d3d5SAnna Dabrowska } elseif (cleanID($pattern) == $page) { 98b8b86b6cSAnna Dabrowska // exact match 99b8b86b6cSAnna Dabrowska return true; 100b8b86b6cSAnna Dabrowska } 101b8b86b6cSAnna Dabrowska 102b8b86b6cSAnna Dabrowska return false; 103b8b86b6cSAnna Dabrowska } 10475494ca1SAnna Dabrowska} 105