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