xref: /plugin/combo/ComboStrap/Message.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
137748cd8SNickeau<?php
237748cd8SNickeau
337748cd8SNickeaunamespace ComboStrap;
437748cd8SNickeau
5*04fd306cSNickeauuse ComboStrap\Xml\XmlSystems;
637748cd8SNickeauuse dokuwiki\Extension\Plugin;
737748cd8SNickeau
837748cd8SNickeauclass Message
937748cd8SNickeau{
1037748cd8SNickeau
1137748cd8SNickeau
1237748cd8SNickeau    const SIGNATURE_CLASS = "signature";
1337748cd8SNickeau    const TAG = "message";
14c3437056SNickeau    const TYPE_ERROR = "error";
15*04fd306cSNickeau    private array $content = [];
16*04fd306cSNickeau    private string $type;
1737748cd8SNickeau
18c3437056SNickeau    const TYPE_INFO = 'Info';
1937748cd8SNickeau    const TYPE_WARNING = 'Warning';
2037748cd8SNickeau
2137748cd8SNickeau    /**
2237748cd8SNickeau     * @var Plugin
2337748cd8SNickeau     */
2437748cd8SNickeau    private $plugin;
25c3437056SNickeau    /**
26c3437056SNickeau     * @var string the page canonical
27c3437056SNickeau     */
28c3437056SNickeau    private $canonical = "support";
2937748cd8SNickeau    private $signatureName;
30c3437056SNickeau
31c3437056SNickeau    private $class;
3237748cd8SNickeau    /**
33c3437056SNickeau     * @var int
3437748cd8SNickeau     */
35c3437056SNickeau    private $status;
3637748cd8SNickeau
3737748cd8SNickeau
38c3437056SNickeau    public function __construct($type)
3937748cd8SNickeau    {
4037748cd8SNickeau        $this->type = $type;
4137748cd8SNickeau    }
4237748cd8SNickeau
43c3437056SNickeau    public static function createInfoMessage($plainText = null): Message
4437748cd8SNickeau    {
45c3437056SNickeau        $message = new Message(self::TYPE_INFO);
46c3437056SNickeau        if ($plainText !== null) {
47c3437056SNickeau            $message->addPlainTextContent($plainText);
48c3437056SNickeau        }
49c3437056SNickeau        return $message;
5037748cd8SNickeau    }
5137748cd8SNickeau
52c3437056SNickeau    public static function createWarningMessage($plainText = null): Message
5337748cd8SNickeau    {
54c3437056SNickeau        $message = new Message(self::TYPE_WARNING);
55c3437056SNickeau        if ($plainText !== null) {
56c3437056SNickeau            $message->addPlainTextContent($plainText);
57c3437056SNickeau        }
58c3437056SNickeau        return $message;
5937748cd8SNickeau    }
6037748cd8SNickeau
61c3437056SNickeau
62c3437056SNickeau    public
63c3437056SNickeau    function addContent($message, $mime): Message
6437748cd8SNickeau    {
65c3437056SNickeau        if (!isset($this->content[$mime])) {
66c3437056SNickeau            $this->content[$mime] = [];
67c3437056SNickeau        }
68c3437056SNickeau        $this->content[$mime][] = $message;
69c3437056SNickeau        return $this;
7037748cd8SNickeau    }
7137748cd8SNickeau
72c3437056SNickeau    public static function createErrorMessage(string $plainText): Message
73c3437056SNickeau    {
74c3437056SNickeau        $message = new Message(self::TYPE_ERROR);
75c3437056SNickeau        if ($plainText !== null) {
76c3437056SNickeau            $message->addPlainTextContent($plainText);
77c3437056SNickeau        }
78c3437056SNickeau        return $message;
79c3437056SNickeau    }
80c3437056SNickeau
81c3437056SNickeau
82c3437056SNickeau    public
83c3437056SNickeau    function addHtmlContent($message): Message
84c3437056SNickeau    {
85c3437056SNickeau        return $this->addContent($message, Mime::HTML);
86c3437056SNickeau    }
87c3437056SNickeau
88c3437056SNickeau    public
89c3437056SNickeau    function setCanonical($canonical): Message
90c3437056SNickeau    {
91c3437056SNickeau        $this->canonical = $canonical;
92c3437056SNickeau        return $this;
93c3437056SNickeau    }
94c3437056SNickeau
95c3437056SNickeau    public
96c3437056SNickeau    function setClass($class): Message
97c3437056SNickeau    {
98c3437056SNickeau        $this->class = $class;
99c3437056SNickeau        return $this;
100c3437056SNickeau    }
101c3437056SNickeau
102c3437056SNickeau    public
103c3437056SNickeau    function getContent($mime = null): string
104c3437056SNickeau    {
105c3437056SNickeau        if ($mime != null) {
106c3437056SNickeau            return implode(DOKU_LF, $this->content[$mime]);
107c3437056SNickeau        }
108c3437056SNickeau        $contentAll = "";
109c3437056SNickeau        foreach ($this->content as $contentArray) {
110c3437056SNickeau            $contentAll .= implode(DOKU_LF, $contentArray);
111c3437056SNickeau        }
112c3437056SNickeau        return $contentAll;
113c3437056SNickeau    }
114c3437056SNickeau
115c3437056SNickeau    public
116c3437056SNickeau    function getPlainTextContent(): ?string
117c3437056SNickeau    {
118c3437056SNickeau        $plainTextLines = $this->content[Mime::PLAIN_TEXT];
119c3437056SNickeau        if ($plainTextLines === null) {
120c3437056SNickeau            return null;
121c3437056SNickeau        }
122c3437056SNickeau        return implode(DOKU_LF, $plainTextLines);
123c3437056SNickeau    }
124c3437056SNickeau
125c3437056SNickeau    public
126c3437056SNickeau    function getType(): string
12737748cd8SNickeau    {
12837748cd8SNickeau        return $this->type;
12937748cd8SNickeau    }
13037748cd8SNickeau
131c3437056SNickeau    public
132c3437056SNickeau    function setSignatureName($signatureName): Message
13337748cd8SNickeau    {
13437748cd8SNickeau        $this->signatureName = $signatureName;
135c3437056SNickeau        return $this;
13637748cd8SNickeau    }
13737748cd8SNickeau
13837748cd8SNickeau    /**
139c3437056SNickeau     * Return an HTML Box (Used when sending message and in the main content)
14037748cd8SNickeau     * @return string
14137748cd8SNickeau     */
142c3437056SNickeau    public
143c3437056SNickeau    function toHtmlBox(): string
14437748cd8SNickeau    {
14537748cd8SNickeau
146*04fd306cSNickeau        PluginUtility::getSnippetManager()->attachCssInternalStyleSheet(self::TAG);
14737748cd8SNickeau        $message = "";
14837748cd8SNickeau
149c3437056SNickeau        $tagAttributes = TagAttributes::createEmpty("message")
150c3437056SNickeau            ->addClassName("alert")
1514cadd4f8SNickeau            ->addOutputAttributeValue("role", "alert");
152c3437056SNickeau        if ($this->class !== null) {
153c3437056SNickeau            $tagAttributes->addClassName($this->class);
154c3437056SNickeau        }
155c3437056SNickeau        if (sizeof($this->content) <> 0) {
156c3437056SNickeau
157c3437056SNickeau            if ($this->getType() == Message::TYPE_INFO) {
158c3437056SNickeau                $tagAttributes->addClassName("alert-success");
15937748cd8SNickeau            } else {
160c3437056SNickeau                $tagAttributes->addClassName("alert-warning");
16137748cd8SNickeau            }
16237748cd8SNickeau
163c3437056SNickeau            $message = $tagAttributes->toHtmlEnterTag("div");
164c3437056SNickeau            $htmlContent = $this->getContent(Mime::HTML);
165c3437056SNickeau            if ($htmlContent !== null) {
166c3437056SNickeau                $message .= $htmlContent;
167c3437056SNickeau            }
16837748cd8SNickeau
16937748cd8SNickeau            /**
17037748cd8SNickeau             * If this is a test call without a plugin
17137748cd8SNickeau             * we have no plugin attached
17237748cd8SNickeau             */
17337748cd8SNickeau            $firedByLang = "This message was fired by the ";
17437748cd8SNickeau            if ($this->plugin != null) {
17537748cd8SNickeau                $firedByLang = $this->plugin->getLang('message_come_from');
17637748cd8SNickeau            }
17737748cd8SNickeau
178c3437056SNickeau            $message .= '<div class="' . self::SIGNATURE_CLASS . '">' . $firedByLang . PluginUtility::getDocumentationHyperLink($this->canonical, $this->signatureName, false) . '</div>';
17937748cd8SNickeau            $message .= '</div>';
18037748cd8SNickeau
18137748cd8SNickeau            /**
18237748cd8SNickeau             * In dev, to spot the XHTML compliance error
18337748cd8SNickeau             */
18437748cd8SNickeau            if (PluginUtility::isDevOrTest()) {
185*04fd306cSNickeau                $isXml = XmlSystems::isXml($message);
18637748cd8SNickeau                if (!$isXml) {
18737748cd8SNickeau                    LogUtility::msg("This message is not xml compliant ($message)");
18837748cd8SNickeau                    $message = <<<EOF
18937748cd8SNickeau<div class='alert alert-warning'>
19037748cd8SNickeau    <p>This message is not xml compliant</p>
19137748cd8SNickeau    <pre>$message</pre>
19237748cd8SNickeau</div>
19337748cd8SNickeauEOF;
19437748cd8SNickeau                }
19537748cd8SNickeau            }
19637748cd8SNickeau
19737748cd8SNickeau        }
19837748cd8SNickeau        return $message;
19937748cd8SNickeau    }
20037748cd8SNickeau
201c3437056SNickeau    /**
202c3437056SNickeau     * This is barely used because the syntax plugin does
203c3437056SNickeau     * not even inherit from {@link \dokuwiki\Extension\Plugin}
204c3437056SNickeau     * but from {@link \dokuwiki\Parsing\ParserMode\Plugin}
205c3437056SNickeau     * What fuck up is fucked upx
206c3437056SNickeau     * @param Plugin $plugin
207c3437056SNickeau     * @return $this
208c3437056SNickeau     */
209c3437056SNickeau    public function setPlugin(Plugin $plugin): Message
210c3437056SNickeau    {
211c3437056SNickeau        $this->plugin = $plugin;
212c3437056SNickeau        return $this;
213c3437056SNickeau    }
214c3437056SNickeau
215c3437056SNickeau    public function addPlainTextContent($text): Message
216c3437056SNickeau    {
217c3437056SNickeau        return $this->addContent($text, Mime::PLAIN_TEXT);
218c3437056SNickeau    }
219c3437056SNickeau
220*04fd306cSNickeau    public function sendToLogUtility()
221c3437056SNickeau    {
222c3437056SNickeau        $content = $this->getContent(Mime::PLAIN_TEXT);
223c3437056SNickeau        switch ($this->type) {
224c3437056SNickeau            case self::TYPE_WARNING:
225c3437056SNickeau                $type = LogUtility::LVL_MSG_WARNING;
226c3437056SNickeau                break;
227c3437056SNickeau            case self::TYPE_INFO:
228c3437056SNickeau                $type = LogUtility::LVL_MSG_INFO;
229c3437056SNickeau                break;
230c3437056SNickeau            case self::TYPE_ERROR:
231c3437056SNickeau                $type = LogUtility::LVL_MSG_ERROR;
232c3437056SNickeau                break;
233c3437056SNickeau            default:
234c3437056SNickeau                $type = LogUtility::LVL_MSG_ERROR;
235c3437056SNickeau        }
236c3437056SNickeau        LogUtility::msg($content, $type, $this->canonical);
237c3437056SNickeau    }
238c3437056SNickeau
239c3437056SNickeau    public function getDocumentationHyperLink(): ?string
240c3437056SNickeau    {
241c3437056SNickeau        if ($this->canonical !== null) {
242*04fd306cSNickeau            $canonicalPath = WikiPath::createFromUnknownRoot($this->canonical);
243*04fd306cSNickeau            $label = ResourceName::getFromPath($canonicalPath);
244c3437056SNickeau            return PluginUtility::getDocumentationHyperLink($this->canonical, $label, false);
245c3437056SNickeau        } else {
246c3437056SNickeau            return null;
247c3437056SNickeau        }
248c3437056SNickeau    }
249c3437056SNickeau
250c3437056SNickeau    /**
251c3437056SNickeau     * An exit code / status
252c3437056SNickeau     * @param int $status
253c3437056SNickeau     * @return $this
254c3437056SNickeau     */
255c3437056SNickeau    public function setStatus(int $status): Message
256c3437056SNickeau    {
257c3437056SNickeau        $this->status = $status;
258c3437056SNickeau        return $this;
259c3437056SNickeau    }
260c3437056SNickeau
261c3437056SNickeau    public function getStatus(): int
262c3437056SNickeau    {
263c3437056SNickeau        if ($this->status !== null) {
264c3437056SNickeau            return $this->status;
265c3437056SNickeau        }
266*04fd306cSNickeau        if (!isset($this->type)) {
267*04fd306cSNickeau            return HttpResponseStatus::ALL_GOOD;
268c3437056SNickeau        }
269c3437056SNickeau        switch ($this->type) {
270c3437056SNickeau            case self::TYPE_ERROR:
271*04fd306cSNickeau                return HttpResponseStatus::INTERNAL_ERROR;
272c3437056SNickeau            case self::TYPE_INFO:
273c3437056SNickeau            default:
274*04fd306cSNickeau                return HttpResponseStatus::ALL_GOOD;
275c3437056SNickeau        }
276c3437056SNickeau
277c3437056SNickeau    }
278c3437056SNickeau
279c3437056SNickeau    public function setType(string $type): Message
280c3437056SNickeau    {
281c3437056SNickeau        $this->type = $type;
282c3437056SNickeau        return $this;
283c3437056SNickeau    }
284c3437056SNickeau
28537748cd8SNickeau}
286