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