xref: /plugin/recommend/helper/assignment.php (revision b8b86b6cc38a68c8eb36a4b455118cdd5062ca1b)
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