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