/** * @see \wcf\system\bbcode\IBBCode::getParsedTag() */ public function getParsedTag(array $openingTag, $content, array $closingTag, BBCodeParser $parser) { if ($parser->getOutputType() == 'text/html') { $quoteLink = !empty($openingTag['attributes'][1]) ? $openingTag['attributes'][1] : ''; $externalQuoteLink = !empty($openingTag['attributes'][1]) ? !ApplicationHandler::getInstance()->isInternalURL($openingTag['attributes'][1]) : false; if (!$externalQuoteLink) { $quoteLink = preg_replace('~^https?://~', RouteHandler::getProtocol(), $quoteLink); } $quoteAuthor = !empty($openingTag['attributes'][0]) ? $openingTag['attributes'][0] : ''; $quoteAuthorObject = null; if ($quoteAuthor && !$externalQuoteLink) { $quoteAuthorLC = mb_strtolower(StringUtil::decodeHTML($quoteAuthor)); foreach (MessageEmbeddedObjectManager::getInstance()->getObjects('com.woltlab.wcf.quote') as $user) { if (mb_strtolower($user->username) == $quoteAuthorLC) { $quoteAuthorObject = $user; break; } } } WCF::getTPL()->assign(array('content' => $content, 'quoteLink' => $quoteLink, 'quoteAuthor' => $quoteAuthor, 'quoteAuthorObject' => $quoteAuthorObject, 'isExternalQuoteLink' => $externalQuoteLink)); return WCF::getTPL()->fetch('quoteBBCodeTag'); } else { if ($parser->getOutputType() == 'text/simplified-html') { return WCF::getLanguage()->getDynamicVariable('wcf.bbcode.quote.text', array('content' => $content, 'cite' => !empty($openingTag['attributes'][0]) ? $openingTag['attributes'][0] : '')) . "\n"; } } }
/** * @see \wcf\system\worker\IWorker::execute() */ public function execute() { $this->objectList->getConditionBuilder()->add('conversation_message.messageID BETWEEN ? AND ?', array($this->limit * $this->loopCount + 1, $this->limit * $this->loopCount + $this->limit)); parent::execute(); if (!$this->loopCount) { // reset search index SearchIndexManager::getInstance()->reset('com.woltlab.wcf.conversation.message'); } // prepare statements $attachmentObjectType = ObjectTypeCache::getInstance()->getObjectTypeByName('com.woltlab.wcf.attachment.objectType', 'com.woltlab.wcf.conversation.message'); $sql = "SELECT\t\tCOUNT(*) AS attachments\n\t\t\tFROM\t\twcf" . WCF_N . "_attachment\n\t\t\tWHERE\t\tobjectTypeID = ?\n\t\t\t\t\tAND objectID = ?"; $attachmentStatement = WCF::getDB()->prepareStatement($sql); foreach ($this->objectList as $message) { SearchIndexManager::getInstance()->add('com.woltlab.wcf.conversation.message', $message->messageID, $message->message, $message->subject ?: '', $message->time, $message->userID, $message->username); $editor = new ConversationMessageEditor($message); $data = array(); // count attachments $attachmentStatement->execute(array($attachmentObjectType->objectTypeID, $message->messageID)); $row = $attachmentStatement->fetchSingleRow(); $data['attachments'] = $row['attachments']; // update embedded objects $data['hasEmbeddedObjects'] = MessageEmbeddedObjectManager::getInstance()->registerObjects('com.woltlab.wcf.conversation.message', $message->messageID, $message->message) ? 1 : 0; $editor->update($data); } }
/** * @see \wcf\data\IMessage::getFormattedMessage() */ public function getFormattedMessage() { // assign embedded objects MessageEmbeddedObjectManager::getInstance()->setActiveMessage('com.woltlab.wcf.conversation.message', $this->messageID); // parse and return message MessageParser::getInstance()->setOutputType('text/html'); return MessageParser::getInstance()->parse($this->message, $this->enableSmilies, $this->enableHtml, $this->enableBBCodes); }
/** * Returns a rendered message preview. * * @return array */ public function getMessagePreview() { // get options $enableBBCodes = isset($this->parameters['options']['enableBBCodes']) ? 1 : 0; $enableHtml = isset($this->parameters['options']['enableHtml']) ? 1 : 0; $enableSmilies = isset($this->parameters['options']['enableSmilies']) ? 1 : 0; $preParse = isset($this->parameters['options']['preParse']) ? 1 : 0; $allowedBBCodesPermission = isset($this->parameters['allowedBBCodesPermission']) ? $this->parameters['allowedBBCodesPermission'] : 'user.message.allowedBBCodes'; // validate permissions for options if ($enableBBCodes && !WCF::getSession()->getPermission('user.message.canUseBBCodes')) { $enableBBCodes = 0; } if ($enableHtml && !WCF::getSession()->getPermission('user.message.canUseHtml')) { $enableHtml = 0; } if ($enableSmilies && !WCF::getSession()->getPermission('user.message.canUseSmilies')) { $enableSmilies = 0; } // check if disallowed bbcode are used if ($enableBBCodes && $allowedBBCodesPermission) { $disallowedBBCodes = MessageParser::getInstance()->validateBBCodes($this->parameters['data']['message'], ArrayUtil::trim(explode(',', WCF::getSession()->getPermission($allowedBBCodesPermission)))); if (!empty($disallowedBBCodes)) { throw new UserInputException('message', WCF::getLanguage()->getDynamicVariable('wcf.message.error.disallowedBBCodes', array('disallowedBBCodes' => $disallowedBBCodes))); } } // get message $message = StringUtil::trim($this->parameters['data']['message']); // get embedded objects MessageEmbeddedObjectManager::getInstance()->parseTemporaryMessage($message); // parse URLs if ($preParse && $enableBBCodes) { if ($allowedBBCodesPermission) { $message = PreParser::getInstance()->parse($message, ArrayUtil::trim(explode(',', WCF::getSession()->getPermission($allowedBBCodesPermission)))); } else { $message = PreParser::getInstance()->parse($message); } } // parse message $preview = MessageParser::getInstance()->parse($message, $enableSmilies, $enableHtml, $enableBBCodes, false); return array('message' => $preview); }
/** * Returns the message text, truncated to given character length. * * @param integer $maxLength * @return string */ public function getFormattedExcerpt($maxLength = CMS_NEWS_EXCERPT_LENGTH) { $message = $this->message; // find position of [readmore] tag $position = mb_strpos($this->message, '[readmore]'); if ($position !== false) { $message = mb_substr($message, 0, $position); } // assign embedded objects MessageEmbeddedObjectManager::getInstance()->setActiveMessage('de.incendium.cms.news.entry', $this->entryID); // parse message MessageParser::getInstance()->setOutputType('text/html'); $message = MessageParser::getInstance()->parse($message, $this->enableSmilies, $this->enableHtml, $this->enableBBCodes); // truncate message return MessageUtil::truncateFormattedMessage($message, $maxLength); }
/** * @see \wcf\data\IMessageInlineEditorAction::save() */ public function save() { $data = array('message' => PreParser::getInstance()->parse(MessageUtil::stripCrap($this->parameters['data']['message']), explode(',', WCF::getSession()->getPermission('user.message.allowedBBCodes')))); if (!$this->message->getConversation()->isDraft) { $data['lastEditTime'] = TIME_NOW; $data['editCount'] = $this->message->editCount + 1; } // execute update action $action = new ConversationMessageAction(array($this->message), 'update', array('data' => $data)); $action->executeAction(); // load new message $this->message = new ConversationMessage($this->message->messageID); $this->message->getAttachments(); if (MODULE_ATTACHMENT) { $attachmentList = $this->message->getAttachments(true); $count = 0; if ($attachmentList !== null) { // set permisions $attachmentList->setPermissions(array('canDownload' => true, 'canViewPreview' => true)); $count = count($attachmentList); } // update count to reflect number of attachments after edit if ($count != $this->message->attachments) { $messageEditor = new ConversationMessageEditor($this->message); $messageEditor->update(array('attachments' => $count)); } } // load embedded objects MessageEmbeddedObjectManager::getInstance()->loadObjects('com.woltlab.wcf.conversation.message', array($this->message->messageID)); $data = array('actionName' => 'save', 'message' => $this->message->getFormattedMessage()); if (MODULE_ATTACHMENT) { WCF::getTPL()->assign(array('attachmentList' => $attachmentList, 'objectID' => $this->message->messageID)); $data['attachmentList'] = WCF::getTPL()->fetch('attachments'); } return $data; }
/** * @see \wcf\system\bbcode\IBBCode::getParsedTag() */ public function getParsedTag(array $openingTag, $content, array $closingTag, BBCodeParser $parser) { // get attachment id $attachmentID = 0; if (isset($openingTag['attributes'][0])) { $attachmentID = $openingTag['attributes'][0]; } // get embedded object $attachment = MessageEmbeddedObjectManager::getInstance()->getObject('com.woltlab.wcf.attachment', $attachmentID); if ($attachment === null) { if (self::$attachmentList !== null) { $attachments = self::$attachmentList->getGroupedObjects(self::$objectID); if (isset($attachments[$attachmentID])) { $attachment = $attachments[$attachmentID]; // mark attachment as embedded $attachment->markAsEmbedded(); } } } if ($attachment !== null) { if ($attachment->showAsImage() && $attachment->canViewPreview() && $parser->getOutputType() == 'text/html') { // image $alignment = isset($openingTag['attributes'][1]) ? $openingTag['attributes'][1] : ''; $width = isset($openingTag['attributes'][2]) ? $openingTag['attributes'][2] : 0; // check if width is valid and the original is accessible by viewer if ($width > 0) { if ($attachment->canDownload()) { // check if width exceeds image width if ($width > $attachment->width) { $width = $attachment->width; } } else { $width = 0; } } $result = ''; if ($width > 0) { $class = ''; if ($alignment == 'left' || $alignment == 'right') { $class = 'messageFloatObject' . ucfirst($alignment); } $source = StringUtil::encodeHTML(LinkHandler::getInstance()->getLink('Attachment', array('object' => $attachment))); $title = StringUtil::encodeHTML($attachment->filename); $result = '<a href="' . $source . '" title="' . $title . '" class="embeddedAttachmentLink jsImageViewer' . ($class ? ' ' . $class : '') . '"><img src="' . $source . '" style="width: ' . $width . 'px" alt="" /></a>'; } else { $linkParameters = array('object' => $attachment); if ($attachment->hasThumbnail()) { $linkParameters['thumbnail'] = 1; } $class = ''; if ($alignment == 'left' || $alignment == 'right') { $class = 'messageFloatObject' . ucfirst($alignment); } $imageClasses = ''; if (!$attachment->hasThumbnail()) { $imageClasses = 'embeddedAttachmentLink jsResizeImage'; } if ($class && (!$attachment->hasThumbnail() || !$attachment->canDownload())) { $imageClasses .= ' ' . $class; } $result = '<img src="' . StringUtil::encodeHTML(LinkHandler::getInstance()->getLink('Attachment', $linkParameters)) . '"' . ($imageClasses ? ' class="' . $imageClasses . '"' : '') . ' style="width: ' . ($attachment->hasThumbnail() ? $attachment->thumbnailWidth : $attachment->width) . 'px; height: ' . ($attachment->hasThumbnail() ? $attachment->thumbnailHeight : $attachment->height) . 'px;" alt="" />'; if ($attachment->hasThumbnail() && $attachment->canDownload()) { $result = '<a href="' . StringUtil::encodeHTML(LinkHandler::getInstance()->getLink('Attachment', array('object' => $attachment))) . '" title="' . StringUtil::encodeHTML($attachment->filename) . '" class="embeddedAttachmentLink jsImageViewer' . ($class ? ' ' . $class : '') . '">' . $result . '</a>'; } } return $result; } else { // file return StringUtil::getAnchorTag(LinkHandler::getInstance()->getLink('Attachment', array('object' => $attachment)), !empty($content) && $content != $attachmentID ? $content : $attachment->filename); } } // fallback return StringUtil::getAnchorTag(LinkHandler::getInstance()->getLink('Attachment', array('id' => $attachmentID))); }
/** * Reads the embedded objects of the messages in the list. */ public function readEmbeddedObjects() { if (!empty($this->embeddedObjectMessageIDs)) { // add message objects to attachment object cache to save SQL queries ObjectTypeCache::getInstance()->getObjectTypeByName('com.woltlab.wcf.attachment.objectType', 'com.woltlab.wcf.conversation.message')->getProcessor()->setCachedObjects($this->objects); // load embedded objects MessageEmbeddedObjectManager::getInstance()->loadObjects('com.woltlab.wcf.conversation.message', $this->embeddedObjectMessageIDs); } }
/** * @see \wcf\system\bbcode\IBBCode::getParsedTag() */ public function getParsedTag(array $openingTag, $content, array $closingTag, BBCodeParser $parser) { // call copyright TeraliosBBCodesCopyright::callCopyright(); // default values $attachmentID = 0; $float = 'none'; $type = 'default'; $link = ''; $text = ''; $isImage = false; // parameter values $attachmentID = isset($openingTag['attributes'][0]) ? intval($openingTag['attributes'][0]) : 0; $float = isset($openingTag['attributes'][1]) ? mb_strtolower($openingTag['attributes'][1]) : 'none'; switch ($float) { case 'left': case 'right': case 'none': break; default: $float = 'none'; } $text = StringUtil::trim($content); $title = WCF::getLanguage()->getDynamicVariable('wcf.bbcode.xattach.title', array('xaID' => $attachmentID)); // get attachment $attachment = MessageEmbeddedObjectManager::getInstance()->getObject('de.teralios.bbcodes.attachment', $attachmentID); if ($attachment === null) { if (static::$attachmentList !== null) { $attachments = static::$attachmentList->getGroupedObjects(static::$objectID); if (isset($attachments[$attachmentID])) { $attachment = $attachments[$attachmentID]; $attachment->markAsEmbedded(); } } } // Attachment if ($attachment !== null) { $title = !empty($attachment->filename) ? WCF::getLanguage()->getDynamicVariable('wcf.bbcode.xattach.title.full', array('xaFilename' => $attachment->filename, 'xaDownloads' => $attachment->downloads)) : $title; $linkParameters = array('object' => $attachment); // can view image if ($attachment->showAsImage() && $attachment->canViewPreview()) { if ($attachment->hasThumbnail()) { $linkParameters['thumbnail'] = 1; } $isImage = true; $link = '<img src="' . StringUtil::encodeHTML(LinkHandler::getInstance()->getLink('Attachment', $linkParameters)) . '"' . (!$attachment->hasThumbnail() ? ' class="embeddedAttachmentLink jsResizeImage"' : '') . ' style="width: ' . ($attachment->hasThumbnail() ? $attachment->thumbnailWidth : $attachment->width) . 'px; height: ' . ($attachment->hasThumbnail() ? $attachment->thumbnailHeight : $attachment->height) . 'px" alt="" />'; if ($attachment->hasThumbnail() && $attachment->canDownload()) { $link = '<a href="' . StringUtil::encodeHTML(LinkHandler::getInstance()->getLink('Attachment', array('object' => $attachment))) . '" title="' . $title . '" class="embeddedAttachmentLink jsImageViewer">' . $link . '</a>'; } } else { if ($attachment->showAsImage()) { $link = StringUtil::encodeHTML(LinkHandler::getInstance()->getLink('Attachment', array('object' => $attachment))); $type = 'image'; } else { $link = StringUtil::encodeHTML(LinkHandler::getInstance()->getLink('Attachment', array('object' => $attachment))); $type = self::getType($attachment); } } } else { $link = StringUtil::encodeHTML(LinkHandler::getInstance()->getLink('Attachment', array('id' => $attachmentID))); } if ($parser->getOutputType() == 'text/html') { WCF::getTPL()->assign(array('xaLink' => $link, 'xaTitle' => $title, 'xaIcon' => self::choseIcon($type), 'xaIsImage' => $isImage, 'xaText' => $text, 'xaFloat' => $float, 'xaNoBorder' => BBCODES_XATTACH_FREESTYLE)); $result = WCF::getTPL()->fetch('xAttachBBCode'); } else { $result = StringUtil::getAnchorTag($link, $title) . (!empty($text) ? ' (' . $text . ')' : ''); } return $result; }
/** * @see \wcf\data\AbstractDatabaseObjectAction::update() */ public function update() { // count attachments if (isset($this->parameters['attachmentHandler']) && $this->parameters['attachmentHandler'] !== null) { $this->parameters['data']['attachments'] = count($this->parameters['attachmentHandler']); } // update lastVersionTime for edit history if (MODULE_EDIT_HISTORY && isset($this->parameters['isEdit']) && isset($this->parameters['data']['text'])) { $this->parameters['data']['lastVersionTime'] = TIME_NOW; } parent::update(); // get ids $objectIDs = array(); foreach ($this->objects as $entry) { $objectIDs[] = $entry->entryID; } if (!empty($objectIDs)) { // delete old search index entries SearchIndexManager::getInstance()->delete('de.incendium.cms.news.entry', $objectIDs); } $publicationEntryIDs = array(); foreach ($this->objects as $entry) { // handle the news categories if (isset($this->parameters['categoryIDs'])) { $entry->updateCategoryIDs($this->parameters['categoryIDs']); } // update tags if (!empty($this->parameters['tags'])) { // set language id (cannot be zero) $languageID = !isset($this->parameters['data']['languageID']) || $this->parameters['data']['languageID'] === null ? LanguageFactory::getInstance()->getDefaultLanguageID() : $this->parameters['data']['languageID']; TagEngine::getInstance()->addObjectTags('de.incendium.cms.news.entry', $entry->entryID, $this->parameters['tags'], $languageID); } // create new search index entry SearchIndexManager::getInstance()->add('de.incendium.cms.news.entry', $entry->entryID, isset($this->parameters['data']['message']) ? $this->parameters['data']['message'] : $entry->message, isset($this->parameters['data']['subject']) ? $this->parameters['data']['subject'] : $entry->subject, $entry->time, $entry->userID, $entry->username, $entry->languageID); // handle publication if (!$entry->isPublished && !empty($this->parameters['data']['isPublished'])) { $publicationEntryIDs[] = $entry->entryID; } // edit if (isset($this->parameters['isEdit']) && isset($this->parameters['data']['message'])) { $historySavingEntry = new HistorySavingEntry($entry->getDecoratedObject()); EditHistoryManager::getInstance()->add('de.incendium.cms.news.entry', $entry->entryID, $entry->message, $historySavingEntry->getTime(), $historySavingEntry->getUserID(), $historySavingEntry->getUsername(), isset($this->parameters['editReason']) ? $this->parameters['editReason'] : '', WCF::getUser()->userID); } NewsEntryModificationLogHandler::getInstance()->edit($entry->getDecoratedObject(), isset($this->parameters['reason']) ? $this->parameters['reason'] : ''); // update embedded objects if (isset($this->parameters['data']['message'])) { if ($entry->hasEmbeddedObjects != MessageEmbeddedObjectManager::getInstance()->registerObjects('de.incendium.cms.news.entry', $entry->entryID, $this->parameters['data']['message'])) { $entry->update(array('hasEmbeddedObjects' => $entry->hasEmbeddedObjects ? 0 : 1)); } } // trigger publication if (!empty($publicationEntryIDs)) { $action = new EntryAction($publicationEntryIDs, 'triggerPublication'); $action->executeAction(); } } }