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