add_lang('acp/posting'); // Set up general vars $action = request_var('action', ''); $bbcode_id = request_var('bbcode', 0); $this->tpl_name = 'acp_bbcodes'; $this->page_title = 'ACP_BBCODES'; // Set up mode-specific vars switch ($action) { case 'add': $bbcode_match = $bbcode_tpl = ''; $display_on_posting = 0; break; case 'edit': $sql = 'SELECT bbcode_match, bbcode_tpl, display_on_posting FROM ' . BBCODES_TABLE . ' WHERE bbcode_id = ' . $bbcode_id; $result = $db->sql_query($sql); if (!$row = $db->sql_fetchrow($result)) { trigger_error('BBCODE_NOT_EXIST'); } $db->sql_freeresult($result); $bbcode_match = $row['bbcode_match']; $bbcode_tpl = htmlspecialchars($row['bbcode_tpl']); $display_on_posting = $row['display_on_posting']; break; case 'modify': $sql = 'SELECT bbcode_id FROM ' . BBCODES_TABLE . ' WHERE bbcode_id = ' . $bbcode_id; $result = $db->sql_query($sql); if (!$row = $db->sql_fetchrow($result)) { trigger_error('BBCODE_NOT_EXIST'); } $db->sql_freeresult($result); // No break here case 'create': $display_on_posting = request_var('display_on_posting', 0); $bbcode_match = (isset($_POST['bbcode_match'])) ? htmlspecialchars(stripslashes($_POST['bbcode_match'])) : ''; $bbcode_tpl = (isset($_POST['bbcode_tpl'])) ? stripslashes($_POST['bbcode_tpl']) : ''; break; } // Do major work switch ($action) { case 'edit': case 'add': $template->assign_vars(array( 'S_EDIT_BBCODE' => true, 'U_BACK' => $this->u_action, 'U_ACTION' => $this->u_action . '&action=' . (($action == 'add') ? 'create' : 'modify') . (($bbcode_id) ? "&bbcode=$bbcode_id" : ''), 'BBCODE_MATCH' => $bbcode_match, 'BBCODE_TPL' => $bbcode_tpl, 'DISPLAY_ON_POSTING' => $display_on_posting) ); foreach ($user->lang['tokens'] as $token => $token_explain) { $template->assign_block_vars('token', array( 'TOKEN' => '{' . $token . '}', 'EXPLAIN' => $token_explain) ); } return; break; case 'modify': case 'create': $data = $this->build_regexp($bbcode_match, $bbcode_tpl); $sql_ary = array( 'bbcode_tag' => $data['bbcode_tag'], 'bbcode_match' => $bbcode_match, 'bbcode_tpl' => $bbcode_tpl, 'display_on_posting' => $display_on_posting, 'first_pass_match' => $data['first_pass_match'], 'first_pass_replace' => $data['first_pass_replace'], 'second_pass_match' => $data['second_pass_match'], 'second_pass_replace' => $data['second_pass_replace'] ); if ($action == 'create') { $sql = 'SELECT MAX(bbcode_id) as max_bbcode_id FROM ' . BBCODES_TABLE; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); if ($row) { $bbcode_id = $row['max_bbcode_id'] + 1; // Make sure it is greater than the core bbcode ids... if ($bbcode_id <= NUM_CORE_BBCODES) { $bbcode_id = NUM_CORE_BBCODES + 1; } } else { $bbcode_id = NUM_CORE_BBCODES + 1; } if ($bbcode_id > 31) { trigger_error('TOO_MANY_BBCODES'); } $sql_ary['bbcode_id'] = (int) $bbcode_id; $db->sql_query('INSERT INTO ' . BBCODES_TABLE . $db->sql_build_array('INSERT', $sql_ary)); $lang = 'BBCODE_ADDED'; $log_action = 'LOG_BBCODE_ADD'; } else { $db->sql_query('UPDATE ' . BBCODES_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . ' WHERE bbcode_id = ' . $bbcode_id); $lang = 'BBCODE_EDITED'; $log_action = 'LOG_BBCODE_EDIT'; } add_log('admin', $log_action, $data['bbcode_tag']); trigger_error($user->lang[$lang] . adm_back_link($this->u_action)); break; case 'delete': $sql = 'SELECT bbcode_tag FROM ' . BBCODES_TABLE . " WHERE bbcode_id = $bbcode_id"; $result = $db->sql_query($sql); if ($row = $db->sql_fetchrow($result)) { $db->sql_query('DELETE FROM ' . BBCODES_TABLE . " WHERE bbcode_id = $bbcode_id"); add_log('admin', 'LOG_BBCODE_DELETE', $row['bbcode_tag']); } $db->sql_freeresult($result); break; } $template->assign_vars(array( 'U_ACTION' => $this->u_action . '&action=add') ); $sql = 'SELECT * FROM ' . BBCODES_TABLE . ' ORDER BY bbcode_id'; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $template->assign_block_vars('bbcodes', array( 'BBCODE_TAG' => $row['bbcode_tag'], 'U_EDIT' => $this->u_action . '&action=edit&bbcode=' . $row['bbcode_id'], 'U_DELETE' => $this->u_action . '&action=delete&bbcode=' . $row['bbcode_id']) ); } $db->sql_freeresult($result); } /* * Build regular expression for custom bbcode */ function build_regexp($msg_bbcode, $msg_html) { $msg_bbcode = trim($msg_bbcode); $msg_html = trim($msg_html); $fp_match = preg_quote($msg_bbcode, '!'); $fp_replace = preg_replace('#^\[(.*?)\]#', '[$1:$uid]', $msg_bbcode); $fp_replace = preg_replace('#\[/(.*?)\]$#', '[/$1:$uid]', $fp_replace); $sp_match = preg_quote($msg_bbcode, '!'); $sp_match = preg_replace('#^\\\\\[(.*?)\\\\\]#', '\[$1:$uid\]', $sp_match); $sp_match = preg_replace('#\\\\\[/(.*?)\\\\\]$#', '\[/$1:$uid\]', $sp_match); $sp_replace = $msg_html; // @todo Make sure to change this too if something changed in message parsing $tokens = array( 'URL' => array( '!([a-z0-9]+://)?([^?].*?[^ \t\n\r<"]*)!ie' => "(('\$1') ? '\$1\$2' : 'http://\$2')" ), 'LOCAL_URL' => array( '!([^:]+/[^ \t\n\r<"]*)!' => '$1' ), 'EMAIL' => array( '!([a-z0-9]+[a-z0-9\-\._]*@(?:(?:[0-9]{1,3}\.){3,5}[0-9]{1,3}|[a-z0-9]+[a-z0-9\-\._]*\.[a-z]+))!i' => '$1' ), 'TEXT' => array( '!(.*?)!es' => "str_replace('\\\"', '"', str_replace('\\'', ''', '\$1'))" ), 'COLOR' => array( '!([a-z]+|#[0-9abcdef]+!i' => '$1' ), 'NUMBER' => array( '!([0-9]+)!' => '$1' ) ); $pad = 0; $modifiers = 'i'; if (preg_match_all('/\{(' . implode('|', array_keys($tokens)) . ')[0-9]*\}/i', $msg_bbcode, $m)) { foreach ($m[0] as $n => $token) { $token_type = $m[1][$n]; reset($tokens[$token_type]); list($match, $replace) = each($tokens[$token_type]); // Pad backreference numbers from tokens if (preg_match_all('/(? $bbcode_tag, 'first_pass_match' => $fp_match, 'first_pass_replace' => $fp_replace, 'second_pass_match' => $sp_match, 'second_pass_replace' => $sp_replace ); } } /** * @package module_install */ class acp_bbcodes_info { function module() { return array( 'filename' => 'acp_bbcodes', 'title' => 'ACP_BBCODES', 'version' => '1.0.0', 'modes' => array( 'bbcodes' => array('title' => 'ACP_BBCODES', 'auth' => 'acl_a_bbcode'), ), ); } function install() { } function uninstall() { } } ?>