1<?php
2
3
4namespace dokuwiki\Subscriptions;
5
6
7use Diff;
8use InlineDiffFormatter;
9use UnifiedDiffFormatter;
10
11class PageSubscriptionSender extends SubscriptionSender
12{
13
14    /**
15     * Send the diff for some page change
16     *
17     * @param string   $subscriber_mail The target mail address
18     * @param string   $template        Mail template ('subscr_digest', 'subscr_single', 'mailtext', ...)
19     * @param string   $id              Page for which the notification is
20     * @param int|null $rev             Old revision if any
21     * @param string   $summary         Change summary if any
22     * @param int|null $current_rev     New revision if any
23     *
24     * @return bool                     true if successfully sent
25     */
26    public function sendPageDiff($subscriber_mail, $template, $id, $rev = null, $summary = '', $current_rev = null)
27    {
28        global $DIFF_INLINESTYLES;
29
30        // prepare replacements (keys not set in hrep will be taken from trep)
31        $trep = [
32            'PAGE' => $id,
33            'NEWPAGE' => wl($id, $current_rev?('rev='.$current_rev):'', true, '&'),
34            'SUMMARY' => $summary,
35            'SUBSCRIBE' => wl($id, ['do' => 'subscribe'], true, '&'),
36        ];
37        $hrep = [];
38
39        if ($rev) {
40            $subject = 'changed';
41            $trep['OLDPAGE'] = wl($id, "rev=$rev", true, '&');
42
43            $old_content = rawWiki($id, $rev);
44            $new_content = rawWiki($id);
45
46            $df = new Diff(
47                explode("\n", $old_content),
48                explode("\n", $new_content)
49            );
50            $dformat = new UnifiedDiffFormatter();
51            $tdiff = $dformat->format($df);
52
53            $DIFF_INLINESTYLES = true;
54            $df = new Diff(
55                explode("\n", $old_content),
56                explode("\n", $new_content)
57            );
58            $dformat = new InlineDiffFormatter();
59            $hdiff = $dformat->format($df);
60            $hdiff = '<table>' . $hdiff . '</table>';
61            $DIFF_INLINESTYLES = false;
62        } else {
63            $subject = 'newpage';
64            $trep['OLDPAGE'] = '---';
65            $tdiff = rawWiki($id);
66            $hdiff = nl2br(hsc($tdiff));
67        }
68
69        $trep['DIFF'] = $tdiff;
70        $hrep['DIFF'] = $hdiff;
71
72        $headers = ['Message-Id' => $this->getMessageID($id)];
73        if ($rev) {
74            $headers['In-Reply-To'] = $this->getMessageID($id, $rev);
75        }
76
77        return $this->send(
78            $subscriber_mail,
79            $subject,
80            $id,
81            $template,
82            $trep,
83            $hrep,
84            $headers
85        );
86    }
87
88}
89