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