/** * @see TemplatePluginModifier::execute() */ public function execute($tagArgs, Template $tplObj) { // default values $length = 80; $etc = '...'; $breakWords = false; // get values $string = $tagArgs[0]; if (isset($tagArgs[1])) { $length = intval($tagArgs[1]); } if (isset($tagArgs[2])) { $etc = $tagArgs[2]; } if (isset($tagArgs[3])) { $breakWords = $tagArgs[3]; } // execute plugin if ($length == 0) { return ''; } if (StringUtil::length($string) > $length) { $length -= StringUtil::length($etc); if (!$breakWords) { $string = preg_replace('/\\s+?(\\S+)?$/', '', StringUtil::substring($string, 0, $length + 1)); } return StringUtil::substring($string, 0, $length) . $etc; } else { return $string; } }
/** * Checks the condition. * * @param PMRuleCondition $condition * @param string $string * @return boolean */ protected function checkCondition(PMRuleCondition $condition, $string) { $value = StringUtil::toLowerCase($condition->ruleConditionValue); $string = StringUtil::toLowerCase($string); switch ($condition->ruleCondition) { case 'contains': if (StringUtil::indexOf($string, $value) !== false) { return true; } break; case 'dontContains': if (StringUtil::indexOf($string, $value) === false) { return true; } break; case 'beginsWith': if (StringUtil::indexOf($string, $value) === 0) { return true; } break; case 'endsWith': if (StringUtil::substring($string, -1 * StringUtil::length($value)) == $value) { return true; } break; case 'isEqualTo': if ($value == $string) { return true; } break; } return false; }
/** * @see Form::validate() */ public function validate() { parent::validate(); if (empty($this->message)) { throw new UserInputException('message'); } if (StringUtil::length($this->message) > WCF::getUser()->getPermission('user.contest.maxSolutionLength')) { throw new UserInputException('message', 'tooLong'); } }
/** * Returns an excerpt of this private message. * * @return string */ public function getMessagePreview() { AttachmentBBCode::setMessageID($this->pmID); $parser = MessageParser::getInstance(); $parser->setOutputType('text/plain'); $message = $parser->parse($this->message, $this->enableSmilies, $this->enableHtml, $this->enableBBCodes, false); if (StringUtil::length($message) > 500) { $message = StringUtil::substring($message, 0, 497) . '...'; } return $message; }
/** * @see Form::validate() */ public function validate() { parent::validate(); if (empty($this->comment)) { throw new UserInputException('comment'); } if (StringUtil::length($this->comment) > WCF::getUser()->getPermission('user.contest.maxSolutionLength')) { throw new UserInputException('comment', 'tooLong'); } // username $this->validateUsername(); }
/** * Returns an excerpt of the message. * * @return string */ public function getExcerpt() { $enableSmilies = 1; $enableHtml = 0; $enableBBCodes = 1; MessageParser::getInstance()->setOutputType('text/plain'); $message = MessageParser::getInstance()->parse($this->comment, $enableSmilies, $enableHtml, $enableBBCodes); // get abstract if (StringUtil::length($message) > 50) { $message = StringUtil::substring($message, 0, 47) . '...'; } return $message; }
/** * @see NotificationObject::getTitle() */ public function getTitle() { $message = $this->getFormattedMessage('text/plain'); $message = StringUtil::stripHTML($message); $message = StringUtil::trim($message); if (StringUtil::length($message) > 100) { $message = StringUtil::substring($message, 0, 97) . '...'; } if (empty($message)) { $message = '#' . $this->entryID; } return $message; }
/** * Returns true, if the given name is a valid username. * * @param string $name username * @return boolean */ public static function isValidUsername($name) { // check illegal characters if (!preg_match('!^[^,\\n]+$!', $name)) { return false; } // check long words $words = preg_split('!\\s+!', $name, -1, PREG_SPLIT_NO_EMPTY); foreach ($words as $word) { if (StringUtil::length($word) > 20) { return false; } } return true; }
/** * Returns an excerpt of the message. * * @return string */ public function getExcerpt() { // pre-format $message = StringUtil::trim(StringUtil::unifyNewlines($this->message)); // find 1st paragraph $excerpt = preg_replace('/^(.*?)\\n\\n.*/s', '$1', $message); if (StringUtil::length($excerpt) != StringUtil::length($message)) { $this->data['hasMoreText'] = 1; } // format require_once WCF_DIR . 'lib/data/message/bbcode/MessageParser.class.php'; MessageParser::getInstance()->setOutputType('text/html'); require_once WCF_DIR . 'lib/data/message/bbcode/AttachmentBBCode.class.php'; AttachmentBBCode::setMessageID($this->contestID); return MessageParser::getInstance()->parse($excerpt, $this->enableSmilies, $this->enableHtml, $this->enableBBCodes); }
/** * Returns an excerpt of the help item. * * @return string */ public function getExcerpt() { // get text $description = WCF::getLanguage()->getDynamicVariable('wcf.help.item.' . $this->helpItem . '.description'); // remove headlines $description = preg_replace('~<h4>.*?</h4>~', '', $description); // remove help images $description = preg_replace('~<p class="helpImage.*?</p>~s', '', $description); // strip html tags $description = strip_tags($description); // truncate text if (StringUtil::length($description) > 250) { $description = preg_replace('/\\s+?(\\S+)?$/', '', StringUtil::substring($description, 0, 251)); $description = StringUtil::substring($description, 0, 250) . '...'; } return $description; }
/** * @see Form::validate() */ public function validate() { parent::validate(); if (empty($this->pageName)) throw new UserInputException('pageName', 'empty'); if (!preg_match('/^[a-z0-9_-]+$/i', $this->pageName)) throw new UserInputException('pageName', 'invalid'); if (StringUtil::length($this->pageName) > 20) throw new UserInputException('pageName', 'tooLong'); if (empty($this->menuItem)) throw new UserInputException('menuItem', 'empty'); if (StringUtil::length($this->menuItem) > 20) throw new UserInputException('menuItem', 'tooLong'); }
/** * autoload method for classname * * @param string $className */ public function autoload($className) { if (!isset($className)) { throw new SystemException('missing className'); } $className = StringUtil::getClassName($className); $dir = StringUtil::toLowercase(StringUtil::substring($className, StringUtil::length('ViewableContest'))); if (empty($dir)) { throw new SystemException('wrong dir: ' . $dir); } $file = WCF_DIR . 'lib/data/contest/' . $dir . '/' . $className . '.class.php'; if (!is_file($file)) { throw new SystemException('wrong file: ' . $file); } require_once $file; if (!class_exists($className)) { throw new SystemException('class does not exist: ' . $className); } }
public function __construct($data, $boxname = "") { $this->threadLastPostsBoxData['templatename'] = "threadlastpostsbox"; $this->getBoxStatus($data); $this->threadLastPostsBoxData['boxID'] = $data['boxID']; $cntPosts = 0; if (!defined('THREADLASTPOSTSBOX_THREADID')) { define('THREADLASTPOSTSBOX_THREADID', 0); } if (!defined('THREADLASTPOSTSBOX_LIMIT')) { define('THREADLASTPOSTSBOX_LIMIT', 10); } if (!defined('THREADLASTPOSTSBOX_TITLELENGTH')) { define('THREADLASTPOSTSBOX_TITLELENGTH', 28); } if (!defined('THREADLASTPOSTSBOX_SBCOLOR')) { define('THREADLASTPOSTSBOX_SBCOLOR', 2); } require_once WBB_DIR . 'lib/data/board/Board.class.php'; $boardIDs = Board::getAccessibleBoards(); if (!empty($boardIDs) && THREADLASTPOSTSBOX_THREADID) { $sql = "SELECT wp.postID, wp.threadID, wp.userID, wp.subject, wp.message, wp.time" . "\n FROM wbb1_1_post wp" . "\n JOIN wbb1_1_thread wt ON (wt.threadID = wp.threadID)" . "\n WHERE wp.threadID = " . THREADLASTPOSTSBOX_THREADID . "\n AND wp.isDeleted = 0" . "\n AND wp.isDisabled = 0" . "\n AND wt.isDeleted = 0" . "\n AND wt.isDisabled = 0" . "\n AND wt.boardID IN (" . $boardIDs . ")" . "\n ORDER BY wp.postID DESC" . "\n LIMIT 0, " . THREADLASTPOSTSBOX_LIMIT; $result = WBBCore::getDB()->sendQuery($sql); while ($row = WBBCore::getDB()->fetchArray($result)) { if (!empty($row['subject'])) { $title = $row['subject']; } else { $title = preg_replace('/\\[/', '<', $row['message']); $title = preg_replace('/\\]/', '>', $title); $title = strip_tags($title); //StringUtil::stripHTML($title); } if (THREADLASTPOSTSBOX_TITLELENGTH != 0 && StringUtil::length($title) > THREADLASTPOSTSBOX_TITLELENGTH) { $title = StringUtil::substring($title, 0, THREADLASTPOSTSBOX_TITLELENGTH - 3) . '...'; } $row['title'] = StringUtil::encodeHTML($title); $this->threadLastPostsBoxData['box'][] = $row; $cntPosts++; } } WCF::getTPL()->assign(array('THREADLASTPOSTSBOX_SBCOLOR' => intval(THREADLASTPOSTSBOX_SBCOLOR), 'threadLastPostBoxCnt' => $cntPosts)); }
/** * @see Form::validate() */ public function validate() { ACPForm::validate(); if (empty($this->masterPassword)) { throw new UserInputException('masterPassword'); } // check password security if (StringUtil::length($this->masterPassword) < 8) { throw new UserInputException('masterPassword', 'notSecure'); } // digits if (!preg_match('![0-9]+!', $this->masterPassword)) { throw new UserInputException('masterPassword', 'notSecure'); } // latin characters (lower-case) if (!preg_match('![a-z]+!', $this->masterPassword)) { throw new UserInputException('masterPassword', 'notSecure'); } // latin characters (upper-case) if (!preg_match('![A-Z]+!', $this->masterPassword)) { throw new UserInputException('masterPassword', 'notSecure'); } // special characters if (!preg_match('![^A-Za-z0-9]+!', $this->masterPassword)) { throw new UserInputException('masterPassword', 'notSecure'); } // search for identical admin passwords $sql = "SELECT\tpassword, salt\n\t\t\tFROM\twcf" . WCF_N . "_user\n\t\t\tWHERE\tuserID IN (\n\t\t\t\t\tSELECT\tuserID\n\t\t\t\t\tFROM\twcf" . WCF_N . "_user_to_groups\n\t\t\t\t\tWHERE\tgroupID = 4\n\t\t\t\t)"; $result = WCF::getDB()->sendQuery($sql); while ($row = WCF::getDB()->fetchArray($result)) { if (StringUtil::getDoubleSaltedHash($this->masterPassword, $row['salt']) == $row['password']) { throw new UserInputException('masterPassword', 'notSecure'); } } // confirm master password if (empty($this->confirmMasterPassword)) { throw new UserInputException('confirmMasterPassword'); } if ($this->confirmMasterPassword != $this->masterPassword) { throw new UserInputException('confirmMasterPassword', 'notEqual'); } }
/** * Returns true, if the given password is secure. * * @param string $password * @return boolean */ public static function isSecurePassword($password) { if (REGISTER_ENABLE_PASSWORD_SECURITY_CHECK) { if (StringUtil::length($password) < REGISTER_PASSWORD_MIN_LENGTH) { return false; } if (REGISTER_PASSWORD_MUST_CONTAIN_DIGIT && !preg_match('![0-9]+!', $password)) { return false; } if (REGISTER_PASSWORD_MUST_CONTAIN_LOWER_CASE && !preg_match('![a-z]+!', $password)) { return false; } if (REGISTER_PASSWORD_MUST_CONTAIN_UPPER_CASE && !preg_match('![A-Z]+!', $password)) { return false; } if (REGISTER_PASSWORD_MUST_CONTAIN_SPECIAL_CHAR && !preg_match('![^A-Za-z0-9]+!', $password)) { return false; } } return true; }
/** * @see BBCode::getParsedTag() */ public function getParsedTag($openingTag, $content, $closingTag, BBCodeParser $parser) { $url = ''; if (isset($openingTag['attributes'][0])) { $url = $openingTag['attributes'][0]; } $noTitle = $content == $url; // add protocol if necessary if (!preg_match("/[a-z]:\\/\\//si", $url)) { $url = 'http://' . $url; } if ($parser->getOutputType() == 'text/html') { $external = true; if (($newURL = $this->isInternalURL($url)) !== false) { $url = $newURL; $external = false; } // cut visible url if ($noTitle) { $decodedContent = StringUtil::decodeHTML($content); if (StringUtil::length($decodedContent) > 60) { $content = StringUtil::encodeHTML(StringUtil::substring($decodedContent, 0, 40)) . '…' . StringUtil::encodeHTML(StringUtil::substring($decodedContent, -15)); } } else { $content = StringUtil::trim($content); } return '<a href="' . $url . '"' . ($external ? ' class="externalURL"' : '') . '>' . $content . '</a>'; } else { if ($parser->getOutputType() == 'text/plain') { if ($noTitle) { return $url; } return $content . ': ' . $url; } } }
/** * Process configured dates with plaintext names, dashed ranges and slashed intervals. * * @param array $cronjobsCache */ protected function processConfiguredDates($cronjobsCache = array()) { // get arrays containing the configured dates from our database (or, respectively, the cache). $this->cronjobsDataRaw['startMinute'] = explode(',', $cronjobsCache['startMinute']); $this->cronjobsDataRaw['startHour'] = explode(',', $cronjobsCache['startHour']); $this->cronjobsDataRaw['startDom'] = explode(',', $cronjobsCache['startDom']); $this->cronjobsDataRaw['startMonth'] = explode(',', $cronjobsCache['startMonth']); $this->cronjobsDataRaw['startDow'] = explode(',', $cronjobsCache['startDow']); // process plaintext month and day of week values. foreach ($this->cronjobsDataRaw as $element => $datesRaw) { foreach ($datesRaw as $position => $dateRaw) { switch ($element) { // months. case 'startMonth': $datesPlain = array('jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'); break; // days of week. // days of week. case 'startDow': // for us, the week begins on sunday because date() wants us to think that way. $datesPlain = array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'); break; // nothing to do for the others. // nothing to do for the others. default: break; } // if $dateRaw is a time range expressed with a dash, a special handling is needed. if (StringUtil::indexOf($dateRaw, '-')) { // dismantle the range into an array. $range = explode('-', $dateRaw); // investigate the new array. foreach ($range as $key => $value) { $slashPos = StringUtil::indexOf($value, '/'); if (StringUtil::length($value) == 3 && $slashPos === false) { // this is a plaintext name, so convert this into a number. $datePlain = StringUtil::toLowerCase($value); $dateNum = array_search($datePlain, $datesPlain); // put the converted value back to the array. if ($dateNum !== false) { $range[$key] = $dateNum; } } else { if ($slashPos !== false) { // this value additionally contains a slashed interval, // so once again part this value. $interval = explode('/', $value); if (StringUtil::length($interval['0']) == 3) { // this is a plaintext name, so convert this into a number. $datePlain = StringUtil::toLowerCase($interval['0']); $dateNum = array_search($datePlain, $datesPlain); if ($dateNum !== false) { $range[$key] = $dateNum; } } else { $range[$key] = $interval['0']; } $range[$key + 1] = $interval['1']; } } } // reassemble array. foreach ($range as $key => $digit) { $range[$key] = intval($digit); } $newPos = array_search($dateRaw, $this->cronjobsDataRaw[$element]); $this->cronjobsDataRaw[$element][$newPos] = $range; $this->getDashedRange($element, $newPos); } else { // this is no range. $slashPos = StringUtil::indexOf($dateRaw, '/'); if (StringUtil::length($dateRaw) == 3 && $slashPos === false) { // this is a plaintext name, so convert this into a number. $datePlain = StringUtil::toLowerCase($dateRaw); $dateNum = array_search($datePlain, $datesPlain); // put the converted value back to the original array. if ($dateNum !== false) { $this->cronjobsDataRaw[$element][$position] = $dateNum; } } else { if ($slashPos !== false) { // this value additionally contains a slashed interval, // so once again part this value. $interval = explode('/', $dateRaw); // put parted value back to array. unset($this->cronjobsDataRaw[$element][$position]); $this->cronjobsDataRaw[$element][$position][] = $interval['0']; $this->cronjobsDataRaw[$element][$position][] = $interval['1']; // break down slashed interval. $this->getSlashedInterval($element, $position); } } } } } }
/** * @see Form::validate() */ public function validate() { if (!count($this->groupIDs)) { throw new UserInputException('groupIDs', 'empty'); } if (!@is_int($this->maxLifeTime)) { throw new UserInputException('maxLifeTime', 'isNoInteger'); } if (empty($this->subject)) { throw new UserInputException('subject', 'empty'); } if (empty($this->text)) { throw new UserInputException('text', 'empty'); } else { if (StringUtil::length($this->text) > $this->maxTextLength) { throw new UserInputException('text', 'tooLong'); } else { if (defined('ENABLE_CENSORSHIP') && ENABLE_CENSORSHIP) { require_once WCF_DIR . 'lib/data/message/censorship/Censorship.class.php'; $result = Censorship::test($this->text); if ($result) { WCF::getTPL()->assign('censoredWords', $result); throw new UserInputException('text', 'censoredWordsFound'); } } } } parent::validate(); }
private static function parseURLsCallback($matches) { $url = $title = $matches[0]; $decodedTitle = StringUtil::decodeHTML($title); if (StringUtil::length($decodedTitle) > 60) { $title = StringUtil::encodeHTML(StringUtil::substring($decodedTitle, 0, 40)) . '…' . StringUtil::encodeHTML(StringUtil::substring($decodedTitle, -15)); } // add protocol if necessary if (!preg_match("/[a-z]:\\/\\//si", $url)) { $url = 'http://' . $url; } $external = true; if (($newURL = self::isInternalURL($url)) !== false) { $url = $newURL; $external = false; } return '<a href="' . $url . '"' . ($external ? ' class="externalURL"' : '') . '>' . $title . '</a>'; }
/** * Validates message text. */ protected function validateText() { if (empty($this->text)) { throw new UserInputException('text'); } // check text length if ($this->maxTextLength !== null && StringUtil::length($this->text) > $this->maxTextLength) { throw new UserInputException('text', 'tooLong'); } // search for censored words if (ENABLE_CENSORSHIP) { require_once WCF_DIR . 'lib/data/message/censorship/Censorship.class.php'; $result = Censorship::test($this->text); if ($result) { WCF::getTPL()->assign('censoredWords', $result); throw new UserInputException('text', 'censoredWordsFound'); } } }
/** * @see Form::validate() */ public function validate() { parent::validate(); if (empty($this->subject)) { throw new UserInputException('subject'); } if (empty($this->text)) { throw new UserInputException('text'); } if (StringUtil::length($this->text) > WCF::getUser()->getPermission('user.contest.maxSolutionLength')) { throw new UserInputException('text', 'tooLong'); } if (StringUtil::length($this->secretMessage) > WCF::getUser()->getPermission('user.contest.maxSolutionLength')) { throw new UserInputException('secretMessage', 'tooLong'); } if ($this->groupID) { $this->ownerGroups = ContestUtil::readAvailableGroups(); // validate group ids if (!array_key_exists($this->groupID, $this->ownerGroups)) { throw new UserInputException('ownerID'); } } if ($this->sponsorID) { if (!$this->contest->isOwner() && !ContestCrew::isMember()) { throw new UserInputException('ownerID'); } $this->ownerSponsors = array(); if ($this->contest->isOwner() || ContestCrew::isMember()) { foreach ($this->contest->getSponsors() as $sponsor) { $this->ownerSponsors[$sponsor->sponsorID] = $sponsor; } } // validate group ids if (!array_key_exists($this->sponsorID, $this->ownerSponsors)) { throw new UserInputException('ownerID'); } } if (!array_key_exists($this->state, $this->getStates())) { throw new UserInputException('state'); } }
private function addLine($string) { // wrap text if (StringUtil::length($string) > 75) { $string = StringUtil::splitIntoChunks($string, 75, "\r\n "); } $this->add($string . "\r\n"); }
/** * @see Form::validate() */ public function validate() { parent::validate(); if (empty($this->query)) { throw new UserInputException('query'); } if (StringUtil::length($this->query) < 3 || strpos($this->query, '%') !== false || strpos($this->query, '_') !== false) { throw new UserInputException('query', 'invalid'); } // search $itemNames = array(); $sql = "SELECT\tlanguageItem\n\t\t\tFROM\twcf" . WCF_N . "_language_item\n\t\t\tWHERE\tlanguageID = " . WCF::getLanguage()->getLanguageID() . "\n\t\t\t\tAND languageCategoryID = (\n\t\t\t\t\tSELECT\tlanguageCategoryID\n\t\t\t\t\tFROM\twcf" . WCF_N . "_language_category\n\t\t\t\t\tWHERE\tlanguageCategory = 'wcf.help.item'\n\t\t\t\t)\n\t\t\t\tAND packageID IN (\n\t\t\t\t\tSELECT\tdependency\n\t\t\t\t\tFROM\twcf" . WCF_N . "_package_dependency\n\t\t\t\t\tWHERE\tpackageID = " . PACKAGE_ID . "\n\t\t\t\t)\n\t\t\t\tAND (\n\t\t\t\t\t(languageUseCustomValue = 0 AND languageItemValue LIKE '%" . escapeString($this->query) . "%')\n\t\t\t\t\tOR (languageUseCustomValue = 1 AND languageCustomItemValue LIKE '%" . escapeString($this->query) . "%')\n\t\t\t\t)"; $result = WCF::getDB()->sendQuery($sql, 1000); while ($row = WCF::getDB()->fetchArray($result)) { // search parsed variables try { $languageItemValue = WCF::getLanguage()->getDynamicVariable($row['languageItem']); if (preg_match('!' . preg_quote($this->query) . '!i', $languageItemValue)) { $itemNames[] = str_replace('.description', '', str_replace('wcf.help.item.', '', $row['languageItem'])); } } catch (SystemException $e) { } // ignore errors } if (!count($itemNames)) { throw new NamedUserException(WCF::getLanguage()->get('wcf.help.search.error.noMatches', array('$query' => StringUtil::encodeHTML($this->query)))); } // get help items $sql = "SELECT\t\thelpItem, permissions, options\n\t\t\tFROM\t\twcf" . WCF_N . "_help_item\n\t\t\tWHERE\t\thelpItem IN ('" . implode("','", $itemNames) . "')\n\t\t\t\t\tAND isDisabled = 0\n\t\t\tORDER BY\tshowOrder"; $result = WCF::getDB()->sendQuery($sql); while ($row = WCF::getDB()->fetchArray($result)) { // check options if (!empty($row['options'])) { $hasEnabledOption = false; $options = explode(',', strtoupper($row['options'])); foreach ($options as $option) { if (defined($option) && constant($option)) { $hasEnabledOption = true; break; } } if (!$hasEnabledOption) { continue; } } // check permissions if (!empty($row['permissions'])) { $hasPermission = false; $permissions = explode(',', $row['permissions']); foreach ($permissions as $permission) { if (WCF::getUser()->getPermission($permission)) { $hasPermission = true; break; } } if (!$hasPermission) { continue; } } $this->result[] = $row['helpItem']; } if (!count($this->result)) { throw new NamedUserException(WCF::getLanguage()->get('wcf.help.search.error.noMatches', array('$query' => StringUtil::encodeHTML($this->query)))); } }
/** * Validates message text. */ protected function validateText() { parent::validateText(); // check text length if ($this->minCharLength > 0 && StringUtil::length($this->text) < $this->minCharLength) { throw new UserInputException('text', 'tooShort'); } // check word count if ($this->minWordCount > 0 && count(preg_split('/[\\W]+/', $this->text, -1, PREG_SPLIT_NO_EMPTY)) < $this->minWordCount) { throw new UserInputException('text', 'tooShort'); } }
/** * Returns html entities of all characters in the given string. * * @param string $string * @return string */ public static function encodeAllChars($string) { $result = ''; for ($i = 0, $j = StringUtil::length($string); $i < $j; $i++) { $char = StringUtil::substring($string, $i, 1); $result .= '&#' . (USE_MBSTRING ? StringUtil::getCharValue($char) : ord($char)) . ';'; } return $result; }
/** * @see NotificationObject::getTitle() */ public function getTitle() { $substring = StringUtil::substring($this->className, StringUtil::length('Contest')); return $substring; }
/** * Builds a bbcode tag. * * @param string $string * @return array bbcode tag data */ protected function buildTag($string) { $tag = array('name' => '', 'closing' => false, 'source' => $string); if (StringUtil::substring($string, 1, 1) == '/') { // closing tag $tag['name'] = StringUtil::toLowerCase(StringUtil::substring($string, 2, StringUtil::length($string) - 3)); $tag['closing'] = true; } else { // opening tag // split tag and attributes preg_match("!^\\[([a-z0-9]+)=?(.*)]\$!si", $string, $match); $tag['name'] = StringUtil::toLowerCase($match[1]); // build attributes if (!empty($match[2])) { $tag['attributes'] = $this->buildTagAttributes($match[2]); } } return $tag; }
/** * Adds tags to a tagged object. * * @param array $tags array holding tag names * @param Tagged $object object that should be tagged */ public function addTags($tags, Tagged $object, $languageID = 0) { $tagIDs = array(); foreach ($tags as $tag) { if (empty($tag)) { continue; } $tagID = Tag::test($tag, $languageID); if (!$tagID) { $tagID = Tag::insert($tag, $languageID); } $tagIDs[] = $tagID; } $tagIDs = array_unique($tagIDs); $sql = "INSERT INTO\twcf" . WCF_N . "_tag_to_object\n\t\t\t\t\t(objectID, tagID, taggableID, time, languageID)\n\t\t\tVALUES "; foreach ($tagIDs as $tagID) { $sql .= "(" . $object->getObjectID() . ", " . $tagID . ", " . $object->getTaggable()->getTaggableID() . ", " . TIME_NOW . ", " . $languageID . "),"; } $sql = StringUtil::substring($sql, 0, StringUtil::length($sql) - 1); $result = WCF::getDB()->sendQuery($sql); }
/** * Sends the email notification. */ public function sendNotification($post = null, $attachmentList = null) { $sql = "SELECT\t\tuser.*\n\t\t\tFROM\t\twbb" . WBB_N . "_board_subscription subscription\n\t\t\tLEFT JOIN\twcf" . WCF_N . "_user user\n\t\t\tON\t\t(user.userID = subscription.userID)\n\t\t\tWHERE\t\tsubscription.boardID = " . $this->boardID . "\n\t\t\t\t\tAND subscription.enableNotification = 1\n\t\t\t\t\tAND subscription.emails = 0\n\t\t\t\t\tAND subscription.userID <> " . $this->userID . "\n\t\t\t\t\tAND user.userID IS NOT NULL"; $result = WCF::getDB()->sendQuery($sql); if (WCF::getDB()->countRows($result)) { // get first post if ($post === null) { require_once WBB_DIR . 'lib/data/post/Post.class.php'; $post = new Post($this->firstPostID); } // get attachments if ($attachmentList === null) { require_once WCF_DIR . 'lib/data/attachment/MessageAttachmentList.class.php'; $attachmentList = new MessageAttachmentList($this->firstPostID); $attachmentList->readObjects(); } // set attachments require_once WCF_DIR . 'lib/data/message/bbcode/AttachmentBBCode.class.php'; AttachmentBBCode::setAttachments($attachmentList->getSortedAttachments()); // parse text require_once WCF_DIR . 'lib/data/message/bbcode/MessageParser.class.php'; $parser = MessageParser::getInstance(); $parser->setOutputType('text/plain'); $parsedText = $parser->parse($post->message, $post->enableSmilies, $post->enableHtml, $post->enableBBCodes, false); // truncate message if (!POST_NOTIFICATION_SEND_FULL_MESSAGE && StringUtil::length($parsedText) > 500) { $parsedText = StringUtil::substring($parsedText, 0, 500) . '...'; } // send notifications $languages = array(); $languages[WCF::getLanguage()->getLanguageID()] = WCF::getLanguage(); $languages[0] = WCF::getLanguage(); require_once WCF_DIR . 'lib/data/mail/Mail.class.php'; require_once WCF_DIR . 'lib/data/user/User.class.php'; require_once WBB_DIR . 'lib/data/board/Board.class.php'; $board = Board::getBoard($this->boardID); while ($row = WCF::getDB()->fetchArray($result)) { $recipient = new User(null, $row); // get language if (!isset($languages[$recipient->languageID])) { $languages[$recipient->languageID] = new Language($recipient->languageID); } // enable language $languages[$recipient->languageID]->setLocale(); // send mail $data = array('PAGE_TITLE' => $languages[$recipient->languageID]->get(PAGE_TITLE), 'PAGE_URL' => PAGE_URL, '$recipient' => $recipient->username, '$author' => $this->username, '$boardTitle' => $languages[$recipient->languageID]->get($board->title), '$topic' => $this->topic, '$threadID' => $this->threadID, '$text' => $parsedText); $mail = new Mail(array($recipient->username => $recipient->email), $languages[$recipient->languageID]->get('wbb.threadAdd.notification.subject', array('$title' => $languages[$recipient->languageID]->get($board->title))), $languages[$recipient->languageID]->get('wbb.threadAdd.notification.mail', $data)); $mail->send(); } // enable user language WCF::getLanguage()->setLocale(); // update notification count $sql = "UPDATE\twbb" . WBB_N . "_board_subscription\n\t\t\t\tSET \temails = emails + 1\n\t\t\t\tWHERE\tboardID = " . $this->boardID . "\n\t\t\t\t\tAND enableNotification = 1\n\t\t\t\t\tAND emails = 0"; WCF::getDB()->registerShutdownUpdate($sql); } }
/** * Compiles a template tag. * * @param string $tag */ protected function compileTag($tag) { if (preg_match('~^' . $this->outputPattern . '~s', $tag)) { // variable output return $this->compileOutputTag($tag); } $match = array(); // replace 'else if' with 'elseif' $tag = preg_replace('~^else\\s+if(?=\\s)~i', 'elseif', $tag); if (preg_match('~^(/?\\w+)~', $tag, $match)) { // build in function or plugin $tagCommand = $match[1]; $tagArgs = StringUtil::substring($tag, StringUtil::length($tagCommand)); switch ($tagCommand) { case 'if': $this->pushTag('if'); return $this->compileIfTag($tagArgs); case 'elseif': list($openTag) = end($this->tagStack); if ($openTag != 'if' && $openTag != 'elseif') { throw new SystemException($this->formatSyntaxError('unxepected {elseif}', $this->currentIdentifier, $this->currentLineNo)); } else { if ($openTag == 'if') { $this->pushTag('elseif'); } } return $this->compileIfTag($tagArgs, true); case 'else': list($openTag) = end($this->tagStack); if ($openTag != 'if' && $openTag != 'elseif') { throw new SystemException($this->formatSyntaxError('unexpected {else}', $this->currentIdentifier, $this->currentLineNo)); } else { $this->pushTag('else'); return '<?php } else { ?>'; } case '/if': list($openTag) = end($this->tagStack); if ($openTag != 'if' && $openTag != 'elseif' && $openTag != 'else') { throw new SystemException($this->formatSyntaxError('unexpected {/if}', $this->currentIdentifier, $this->currentLineNo)); } else { $this->popTag('if'); } return '<?php } ?>'; case 'include': return $this->compileIncludeTag($tagArgs); case 'foreach': $this->pushTag('foreach'); return $this->compileForeachTag($tagArgs); case 'foreachelse': list($openTag) = end($this->tagStack); if ($openTag != 'foreach') { throw new SystemException($this->formatSyntaxError('unexpected {foreachelse}', $this->currentIdentifier, $this->currentLineNo)); } else { $this->pushTag('foreachelse'); return '<?php } } else { { ?>'; } case '/foreach': $this->popTag('foreach'); return "<?php } } ?>"; case 'section': $this->pushTag('section'); return $this->compileSectionTag($tagArgs); case 'sectionelse': list($openTag) = end($this->tagStack); if ($openTag != 'section') { throw new SystemException($this->formatSyntaxError('unexpected {sectionelse}', $this->currentIdentifier, $this->currentLineNo)); } else { $this->pushTag('sectionelse'); return '<?php } } else { { ?>'; } case '/section': $this->popTag('section'); return "<?php } } ?>"; case 'capture': $this->pushTag('capture'); return $this->compileCaptureTag(true, $tagArgs); case '/capture': $this->popTag('capture'); return $this->compileCaptureTag(false); case 'ldelim': return $this->leftDelimiter; case 'rdelim': return $this->rightDelimiter; default: // 1) compiler functions first if ($phpCode = $this->compileCompilerPlugin($tagCommand, $tagArgs)) { return $phpCode; } // 2) block functions if ($phpCode = $this->compileBlockPlugin($tagCommand, $tagArgs)) { return $phpCode; } // 3) functions if ($phpCode = $this->compileFunctionPlugin($tagCommand, $tagArgs)) { return $phpCode; } } } throw new SystemException($this->formatSyntaxError('unknown tag {' . $tag . '}', $this->currentIdentifier, $this->currentLineNo), 12003); }