/** * Init bbcode cache * * requires: $this->bbcode_bitfield * sets: $this->bbcode_cache with bbcode templates needed for bbcode_bitfield */ function bbcode_cache_init() { global $phpbb_root_path, $phpEx, $config, $user, $phpbb_dispatcher, $phpbb_extension_manager, $phpbb_path_helper, $phpbb_container, $phpbb_filesystem; if (empty($this->template_filename)) { $this->template_bitfield = new bitfield($user->style['bbcode_bitfield']); $template = new \phpbb\template\twig\twig($phpbb_container->get('path_helper'), $phpbb_container->get('config'), new \phpbb\template\context(), new \phpbb\template\twig\environment($phpbb_container->get('config'), $phpbb_container->get('filesystem'), $phpbb_container->get('path_helper'), $phpbb_container, $phpbb_container->getParameter('core.root_path') . 'cache/', $phpbb_container->get('ext.manager'), new \phpbb\template\twig\loader($phpbb_filesystem)), $phpbb_container->getParameter('core.root_path') . 'cache/', $phpbb_container->get('user'), $phpbb_container->get('template.twig.extensions.collection'), $phpbb_extension_manager); $template->set_style(); $template->set_filenames(array('bbcode.html' => 'bbcode.html')); $this->template_filename = $template->get_source_file_for_handle('bbcode.html'); } $bbcode_ids = $rowset = $sql = array(); $bitfield = new bitfield($this->bbcode_bitfield); $bbcodes_set = $bitfield->get_all_set(); foreach ($bbcodes_set as $bbcode_id) { if (isset($this->bbcode_cache[$bbcode_id])) { // do not try to re-cache it if it's already in continue; } $bbcode_ids[] = $bbcode_id; if ($bbcode_id > NUM_CORE_BBCODES) { $sql[] = $bbcode_id; } } if (sizeof($sql)) { global $db; $sql = 'SELECT * FROM ' . BBCODES_TABLE . ' WHERE ' . $db->sql_in_set('bbcode_id', $sql); $result = $db->sql_query($sql, 3600); while ($row = $db->sql_fetchrow($result)) { // To circumvent replacing newlines with <br /> for the generated html, // we use carriage returns here. They are later changed back to newlines $row['bbcode_tpl'] = str_replace("\n", "\r", $row['bbcode_tpl']); $row['second_pass_replace'] = str_replace("\n", "\r", $row['second_pass_replace']); $rowset[$row['bbcode_id']] = $row; } $db->sql_freeresult($result); } // To perform custom second pass in extension, use $this->bbcode_second_pass_by_extension() // method which accepts variable number of parameters foreach ($bbcode_ids as $bbcode_id) { switch ($bbcode_id) { case 0: $this->bbcode_cache[$bbcode_id] = array('str' => array('[/quote:$uid]' => $this->bbcode_tpl('quote_close', $bbcode_id)), 'preg' => array('#\\[quote(?:="(.*?)")?:$uid\\]((?!\\[quote(?:=".*?")?:$uid\\]).)?#ise' => "\$this->bbcode_second_pass_quote('\$1', '\$2')")); break; case 1: $this->bbcode_cache[$bbcode_id] = array('str' => array('[b:$uid]' => $this->bbcode_tpl('b_open', $bbcode_id), '[/b:$uid]' => $this->bbcode_tpl('b_close', $bbcode_id))); break; case 2: $this->bbcode_cache[$bbcode_id] = array('str' => array('[i:$uid]' => $this->bbcode_tpl('i_open', $bbcode_id), '[/i:$uid]' => $this->bbcode_tpl('i_close', $bbcode_id))); break; case 3: $this->bbcode_cache[$bbcode_id] = array('preg' => array('#\\[url:$uid\\]((.*?))\\[/url:$uid\\]#s' => $this->bbcode_tpl('url', $bbcode_id), '#\\[url=([^\\[]+?):$uid\\](.*?)\\[/url:$uid\\]#s' => $this->bbcode_tpl('url', $bbcode_id))); break; case 4: if ($user->optionget('viewimg')) { $this->bbcode_cache[$bbcode_id] = array('preg' => array('#\\[img:$uid\\](.*?)\\[/img:$uid\\]#s' => $this->bbcode_tpl('img', $bbcode_id))); } else { $this->bbcode_cache[$bbcode_id] = array('preg' => array('#\\[img:$uid\\](.*?)\\[/img:$uid\\]#s' => str_replace('$2', '[ img ]', $this->bbcode_tpl('url', $bbcode_id, true)))); } break; case 5: $this->bbcode_cache[$bbcode_id] = array('preg' => array('#\\[size=([\\-\\+]?\\d+):$uid\\](.*?)\\[/size:$uid\\]#s' => $this->bbcode_tpl('size', $bbcode_id))); break; case 6: $this->bbcode_cache[$bbcode_id] = array('preg' => array('!\\[color=(#[0-9a-f]{3}|#[0-9a-f]{6}|[a-z\\-]+):$uid\\](.*?)\\[/color:$uid\\]!is' => $this->bbcode_tpl('color', $bbcode_id))); break; case 7: $this->bbcode_cache[$bbcode_id] = array('str' => array('[u:$uid]' => $this->bbcode_tpl('u_open', $bbcode_id), '[/u:$uid]' => $this->bbcode_tpl('u_close', $bbcode_id))); break; case 8: $this->bbcode_cache[$bbcode_id] = array('preg' => array('#\\[code(?:=([a-z]+))?:$uid\\](.*?)\\[/code:$uid\\]#ise' => "\$this->bbcode_second_pass_code('\$1', '\$2')")); break; case 9: $this->bbcode_cache[$bbcode_id] = array('preg' => array('#(\\[\\/?(list|\\*):[mou]?:?$uid\\])[\\n]{1}#' => "\$1", '#(\\[list=([^\\[]+):$uid\\])[\\n]{1}#' => "\$1", '#\\[list=([^\\[]+):$uid\\]#e' => "\$this->bbcode_list('\$1')"), 'str' => array('[list:$uid]' => $this->bbcode_tpl('ulist_open_default', $bbcode_id), '[/list:u:$uid]' => $this->bbcode_tpl('ulist_close', $bbcode_id), '[/list:o:$uid]' => $this->bbcode_tpl('olist_close', $bbcode_id), '[*:$uid]' => $this->bbcode_tpl('listitem', $bbcode_id), '[/*:$uid]' => $this->bbcode_tpl('listitem_close', $bbcode_id), '[/*:m:$uid]' => $this->bbcode_tpl('listitem_close', $bbcode_id))); break; case 10: $this->bbcode_cache[$bbcode_id] = array('preg' => array('#\\[email:$uid\\]((.*?))\\[/email:$uid\\]#is' => $this->bbcode_tpl('email', $bbcode_id), '#\\[email=([^\\[]+):$uid\\](.*?)\\[/email:$uid\\]#is' => $this->bbcode_tpl('email', $bbcode_id))); break; case 11: if ($user->optionget('viewflash')) { $this->bbcode_cache[$bbcode_id] = array('preg' => array('#\\[flash=([0-9]+),([0-9]+):$uid\\](.*?)\\[/flash:$uid\\]#' => $this->bbcode_tpl('flash', $bbcode_id))); } else { $this->bbcode_cache[$bbcode_id] = array('preg' => array('#\\[flash=([0-9]+),([0-9]+):$uid\\](.*?)\\[/flash:$uid\\]#' => str_replace('$1', '$3', str_replace('$2', '[ flash ]', $this->bbcode_tpl('url', $bbcode_id, true))))); } break; case 12: $this->bbcode_cache[$bbcode_id] = array('str' => array('[/attachment:$uid]' => $this->bbcode_tpl('inline_attachment_close', $bbcode_id)), 'preg' => array('#\\[attachment=([0-9]+):$uid\\]#' => $this->bbcode_tpl('inline_attachment_open', $bbcode_id))); break; default: if (isset($rowset[$bbcode_id])) { if ($this->template_bitfield->get($bbcode_id)) { // The bbcode requires a custom template to be loaded if (!($bbcode_tpl = $this->bbcode_tpl($rowset[$bbcode_id]['bbcode_tag'], $bbcode_id))) { // For some reason, the required template seems not to be available, use the default template $bbcode_tpl = !empty($rowset[$bbcode_id]['second_pass_replace']) ? $rowset[$bbcode_id]['second_pass_replace'] : $rowset[$bbcode_id]['bbcode_tpl']; } else { // In order to use templates with custom bbcodes we need // to replace all {VARS} to corresponding backreferences // Note that backreferences are numbered from bbcode_match if (preg_match_all('/\\{(URL|LOCAL_URL|EMAIL|TEXT|SIMPLETEXT|INTTEXT|IDENTIFIER|COLOR|NUMBER)[0-9]*\\}/', $rowset[$bbcode_id]['bbcode_match'], $m)) { foreach ($m[0] as $i => $tok) { $bbcode_tpl = str_replace($tok, '$' . ($i + 1), $bbcode_tpl); } } } } else { // Default template $bbcode_tpl = !empty($rowset[$bbcode_id]['second_pass_replace']) ? $rowset[$bbcode_id]['second_pass_replace'] : $rowset[$bbcode_id]['bbcode_tpl']; } // Replace {L_*} lang strings $bbcode_tpl = preg_replace('/{L_([A-Z0-9_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $bbcode_tpl); if (!empty($rowset[$bbcode_id]['second_pass_replace'])) { // The custom BBCode requires second-pass pattern replacements $this->bbcode_cache[$bbcode_id] = array('preg' => array($rowset[$bbcode_id]['second_pass_match'] => $bbcode_tpl)); } else { $this->bbcode_cache[$bbcode_id] = array('str' => array($rowset[$bbcode_id]['second_pass_match'] => $bbcode_tpl)); } } else { $this->bbcode_cache[$bbcode_id] = false; } break; } } $bbcode_cache = $this->bbcode_cache; $bbcode_bitfield = $this->bbcode_bitfield; $bbcode_uid = $this->bbcode_uid; /** * Use this event to modify the bbcode_cache * * @event core.bbcode_cache_init_end * @var array bbcode_cache The array of cached search and replace patterns of bbcodes * @var string bbcode_bitfield The bbcode bitfield * @var string bbcode_uid The bbcode uid * @since 3.1.3-RC1 */ $vars = array('bbcode_cache', 'bbcode_bitfield', 'bbcode_uid'); extract($phpbb_dispatcher->trigger_event('core.bbcode_cache_init_end', compact($vars))); $this->bbcode_cache = $bbcode_cache; $this->bbcode_bitfield = $bbcode_bitfield; $this->bbcode_uid = $bbcode_uid; }