Пример #1
0
 /**
  * @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;
 }
Пример #7
0
 /**
  * @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();
         }
     }
 }