xref: /plugin/combo/ComboStrap/Message.php (revision c3437056399326d621a01da73b649707fbb0ae69)
137748cd8SNickeau<?php
237748cd8SNickeau
337748cd8SNickeaunamespace ComboStrap;
437748cd8SNickeau
537748cd8SNickeauuse dokuwiki\Extension\Plugin;
637748cd8SNickeau
737748cd8SNickeauclass Message
837748cd8SNickeau{
937748cd8SNickeau
1037748cd8SNickeau
1137748cd8SNickeau    const SIGNATURE_CLASS = "signature";
1237748cd8SNickeau    const TAG = "message";
13*c3437056SNickeau    const TYPE_ERROR = "error";
14*c3437056SNickeau    private $content = [];
15*c3437056SNickeau    private $type;
1637748cd8SNickeau
17*c3437056SNickeau    const TYPE_INFO = 'Info';
1837748cd8SNickeau    const TYPE_WARNING = 'Warning';
1937748cd8SNickeau
2037748cd8SNickeau    /**
2137748cd8SNickeau     * @var Plugin
2237748cd8SNickeau     */
2337748cd8SNickeau    private $plugin;
24*c3437056SNickeau    /**
25*c3437056SNickeau     * @var string the page canonical
26*c3437056SNickeau     */
27*c3437056SNickeau    private $canonical = "support";
2837748cd8SNickeau    private $signatureName;
29*c3437056SNickeau
30*c3437056SNickeau    private $class;
3137748cd8SNickeau    /**
32*c3437056SNickeau     * @var int
3337748cd8SNickeau     */
34*c3437056SNickeau    private $status;
3537748cd8SNickeau
3637748cd8SNickeau
37*c3437056SNickeau    public function __construct($type)
3837748cd8SNickeau    {
3937748cd8SNickeau        $this->type = $type;
4037748cd8SNickeau    }
4137748cd8SNickeau
42*c3437056SNickeau    public static function createInfoMessage($plainText = null): Message
4337748cd8SNickeau    {
44*c3437056SNickeau        $message = new Message(self::TYPE_INFO);
45*c3437056SNickeau        if ($plainText !== null) {
46*c3437056SNickeau            $message->addPlainTextContent($plainText);
47*c3437056SNickeau        }
48*c3437056SNickeau        return $message;
4937748cd8SNickeau    }
5037748cd8SNickeau
51*c3437056SNickeau    public static function createWarningMessage($plainText = null): Message
5237748cd8SNickeau    {
53*c3437056SNickeau        $message = new Message(self::TYPE_WARNING);
54*c3437056SNickeau        if ($plainText !== null) {
55*c3437056SNickeau            $message->addPlainTextContent($plainText);
56*c3437056SNickeau        }
57*c3437056SNickeau        return $message;
5837748cd8SNickeau    }
5937748cd8SNickeau
60*c3437056SNickeau
61*c3437056SNickeau    public
62*c3437056SNickeau    function addContent($message, $mime): Message
6337748cd8SNickeau    {
64*c3437056SNickeau        if (!isset($this->content[$mime])) {
65*c3437056SNickeau            $this->content[$mime] = [];
66*c3437056SNickeau        }
67*c3437056SNickeau        $this->content[$mime][] = $message;
68*c3437056SNickeau        return $this;
6937748cd8SNickeau    }
7037748cd8SNickeau
71*c3437056SNickeau    public static function createErrorMessage(string $plainText): Message
72*c3437056SNickeau    {
73*c3437056SNickeau        $message = new Message(self::TYPE_ERROR);
74*c3437056SNickeau        if ($plainText !== null) {
75*c3437056SNickeau            $message->addPlainTextContent($plainText);
76*c3437056SNickeau        }
77*c3437056SNickeau        return $message;
78*c3437056SNickeau    }
79*c3437056SNickeau
80*c3437056SNickeau
81*c3437056SNickeau    public
82*c3437056SNickeau    function addHtmlContent($message): Message
83*c3437056SNickeau    {
84*c3437056SNickeau        return $this->addContent($message, Mime::HTML);
85*c3437056SNickeau    }
86*c3437056SNickeau
87*c3437056SNickeau    public
88*c3437056SNickeau    function setCanonical($canonical): Message
89*c3437056SNickeau    {
90*c3437056SNickeau        $this->canonical = $canonical;
91*c3437056SNickeau        return $this;
92*c3437056SNickeau    }
93*c3437056SNickeau
94*c3437056SNickeau    public
95*c3437056SNickeau    function setClass($class): Message
96*c3437056SNickeau    {
97*c3437056SNickeau        $this->class = $class;
98*c3437056SNickeau        return $this;
99*c3437056SNickeau    }
100*c3437056SNickeau
101*c3437056SNickeau    public
102*c3437056SNickeau    function getContent($mime = null): string
103*c3437056SNickeau    {
104*c3437056SNickeau        if ($mime != null) {
105*c3437056SNickeau            return implode(DOKU_LF, $this->content[$mime]);
106*c3437056SNickeau        }
107*c3437056SNickeau        $contentAll = "";
108*c3437056SNickeau        foreach ($this->content as $contentArray) {
109*c3437056SNickeau            $contentAll .= implode(DOKU_LF, $contentArray);
110*c3437056SNickeau        }
111*c3437056SNickeau        return $contentAll;
112*c3437056SNickeau    }
113*c3437056SNickeau
114*c3437056SNickeau    public
115*c3437056SNickeau    function getPlainTextContent(): ?string
116*c3437056SNickeau    {
117*c3437056SNickeau        $plainTextLines = $this->content[Mime::PLAIN_TEXT];
118*c3437056SNickeau        if ($plainTextLines === null) {
119*c3437056SNickeau            return null;
120*c3437056SNickeau        }
121*c3437056SNickeau        return implode(DOKU_LF, $plainTextLines);
122*c3437056SNickeau    }
123*c3437056SNickeau
124*c3437056SNickeau    public
125*c3437056SNickeau    function getType(): string
12637748cd8SNickeau    {
12737748cd8SNickeau        return $this->type;
12837748cd8SNickeau    }
12937748cd8SNickeau
130*c3437056SNickeau    public
131*c3437056SNickeau    function setSignatureName($signatureName): Message
13237748cd8SNickeau    {
13337748cd8SNickeau        $this->signatureName = $signatureName;
134*c3437056SNickeau        return $this;
13537748cd8SNickeau    }
13637748cd8SNickeau
13737748cd8SNickeau    /**
138*c3437056SNickeau     * Return an HTML Box (Used when sending message and in the main content)
13937748cd8SNickeau     * @return string
14037748cd8SNickeau     */
141*c3437056SNickeau    public
142*c3437056SNickeau    function toHtmlBox(): string
14337748cd8SNickeau    {
14437748cd8SNickeau
14537748cd8SNickeau        PluginUtility::getSnippetManager()->upsertCssSnippetForRequest(self::TAG);
14637748cd8SNickeau        $message = "";
14737748cd8SNickeau
148*c3437056SNickeau        $tagAttributes = TagAttributes::createEmpty("message")
149*c3437056SNickeau            ->addClassName("alert")
150*c3437056SNickeau            ->addHtmlAttributeValue("role", "alert");
151*c3437056SNickeau        if ($this->class !== null) {
152*c3437056SNickeau            $tagAttributes->addClassName($this->class);
153*c3437056SNickeau        }
154*c3437056SNickeau        if (sizeof($this->content) <> 0) {
155*c3437056SNickeau
156*c3437056SNickeau            if ($this->getType() == Message::TYPE_INFO) {
157*c3437056SNickeau                $tagAttributes->addClassName("alert-success");
15837748cd8SNickeau            } else {
159*c3437056SNickeau                $tagAttributes->addClassName("alert-warning");
16037748cd8SNickeau            }
16137748cd8SNickeau
162*c3437056SNickeau            $message = $tagAttributes->toHtmlEnterTag("div");
163*c3437056SNickeau            $htmlContent = $this->getContent(Mime::HTML);
164*c3437056SNickeau            if ($htmlContent !== null) {
165*c3437056SNickeau                $message .= $htmlContent;
166*c3437056SNickeau            }
16737748cd8SNickeau
16837748cd8SNickeau            /**
16937748cd8SNickeau             * If this is a test call without a plugin
17037748cd8SNickeau             * we have no plugin attached
17137748cd8SNickeau             */
17237748cd8SNickeau            $firedByLang = "This message was fired by the ";
17337748cd8SNickeau            if ($this->plugin != null) {
17437748cd8SNickeau                $firedByLang = $this->plugin->getLang('message_come_from');
17537748cd8SNickeau            }
17637748cd8SNickeau
177*c3437056SNickeau            $message .= '<div class="' . self::SIGNATURE_CLASS . '">' . $firedByLang . PluginUtility::getDocumentationHyperLink($this->canonical, $this->signatureName, false) . '</div>';
17837748cd8SNickeau            $message .= '</div>';
17937748cd8SNickeau
18037748cd8SNickeau            /**
18137748cd8SNickeau             * In dev, to spot the XHTML compliance error
18237748cd8SNickeau             */
18337748cd8SNickeau            if (PluginUtility::isDevOrTest()) {
18437748cd8SNickeau                $isXml = XmlUtility::isXml($message);
18537748cd8SNickeau                if (!$isXml) {
18637748cd8SNickeau                    LogUtility::msg("This message is not xml compliant ($message)");
18737748cd8SNickeau                    $message = <<<EOF
18837748cd8SNickeau<div class='alert alert-warning'>
18937748cd8SNickeau    <p>This message is not xml compliant</p>
19037748cd8SNickeau    <pre>$message</pre>
19137748cd8SNickeau</div>
19237748cd8SNickeauEOF;
19337748cd8SNickeau                }
19437748cd8SNickeau            }
19537748cd8SNickeau
19637748cd8SNickeau        }
19737748cd8SNickeau        return $message;
19837748cd8SNickeau    }
19937748cd8SNickeau
200*c3437056SNickeau    /**
201*c3437056SNickeau     * This is barely used because the syntax plugin does
202*c3437056SNickeau     * not even inherit from {@link \dokuwiki\Extension\Plugin}
203*c3437056SNickeau     * but from {@link \dokuwiki\Parsing\ParserMode\Plugin}
204*c3437056SNickeau     * What fuck up is fucked upx
205*c3437056SNickeau     * @param Plugin $plugin
206*c3437056SNickeau     * @return $this
207*c3437056SNickeau     */
208*c3437056SNickeau    public function setPlugin(Plugin $plugin): Message
209*c3437056SNickeau    {
210*c3437056SNickeau        $this->plugin = $plugin;
211*c3437056SNickeau        return $this;
212*c3437056SNickeau    }
213*c3437056SNickeau
214*c3437056SNickeau    public function addPlainTextContent($text): Message
215*c3437056SNickeau    {
216*c3437056SNickeau        return $this->addContent($text, Mime::PLAIN_TEXT);
217*c3437056SNickeau    }
218*c3437056SNickeau
219*c3437056SNickeau    public function sendLogMsg()
220*c3437056SNickeau    {
221*c3437056SNickeau        $content = $this->getContent(Mime::PLAIN_TEXT);
222*c3437056SNickeau        switch ($this->type) {
223*c3437056SNickeau            case self::TYPE_WARNING:
224*c3437056SNickeau                $type = LogUtility::LVL_MSG_WARNING;
225*c3437056SNickeau                break;
226*c3437056SNickeau            case self::TYPE_INFO:
227*c3437056SNickeau                $type = LogUtility::LVL_MSG_INFO;
228*c3437056SNickeau                break;
229*c3437056SNickeau            case self::TYPE_ERROR:
230*c3437056SNickeau                $type = LogUtility::LVL_MSG_ERROR;
231*c3437056SNickeau                break;
232*c3437056SNickeau            default:
233*c3437056SNickeau                $type = LogUtility::LVL_MSG_ERROR;
234*c3437056SNickeau        }
235*c3437056SNickeau        LogUtility::msg($content, $type, $this->canonical);
236*c3437056SNickeau    }
237*c3437056SNickeau
238*c3437056SNickeau    public function getDocumentationHyperLink(): ?string
239*c3437056SNickeau    {
240*c3437056SNickeau        if ($this->canonical !== null) {
241*c3437056SNickeau            $canonicalPath = DokuPath::createUnknownFromIdOrPath($this->canonical);
242*c3437056SNickeau            $label = $canonicalPath->toLabel();
243*c3437056SNickeau            return PluginUtility::getDocumentationHyperLink($this->canonical, $label, false);
244*c3437056SNickeau        } else {
245*c3437056SNickeau            return null;
246*c3437056SNickeau        }
247*c3437056SNickeau    }
248*c3437056SNickeau
249*c3437056SNickeau    /**
250*c3437056SNickeau     * An exit code / status
251*c3437056SNickeau     * @param int $status
252*c3437056SNickeau     * @return $this
253*c3437056SNickeau     */
254*c3437056SNickeau    public function setStatus(int $status): Message
255*c3437056SNickeau    {
256*c3437056SNickeau        $this->status = $status;
257*c3437056SNickeau        return $this;
258*c3437056SNickeau    }
259*c3437056SNickeau
260*c3437056SNickeau    public function getStatus(): int
261*c3437056SNickeau    {
262*c3437056SNickeau        if ($this->status !== null) {
263*c3437056SNickeau            return $this->status;
264*c3437056SNickeau        }
265*c3437056SNickeau        if ($this->type === null) {
266*c3437056SNickeau            return HttpResponse::STATUS_ALL_GOOD;
267*c3437056SNickeau        }
268*c3437056SNickeau        switch ($this->type) {
269*c3437056SNickeau            case self::TYPE_ERROR:
270*c3437056SNickeau                return HttpResponse::STATUS_INTERNAL_ERROR;
271*c3437056SNickeau            case self::TYPE_INFO:
272*c3437056SNickeau            default:
273*c3437056SNickeau                return HttpResponse::STATUS_ALL_GOOD;
274*c3437056SNickeau        }
275*c3437056SNickeau
276*c3437056SNickeau    }
277*c3437056SNickeau
278*c3437056SNickeau    public function setType(string $type): Message
279*c3437056SNickeau    {
280*c3437056SNickeau        $this->type = $type;
281*c3437056SNickeau        return $this;
282*c3437056SNickeau    }
283*c3437056SNickeau
28437748cd8SNickeau}
285