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