Вход Регистрация
Файл: phpBB3/includes/acp/acp_bbcodes.php
Строк: 244
<?php
/**
*
* @package acp
* @version $Id$
* @copyright (c) 2005 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/

/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
    exit;
}

/**
* @package acp
*/
class acp_bbcodes
{
    var 
$u_action;

    function 
main($id$mode)
    {
        global 
$db$user$auth$template$cache;
        global 
$config$phpbb_root_path$phpbb_admin_path$phpEx;

        
$user->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';
        
$form_key 'acp_bbcodes';

        
add_form_key($form_key);

        
// Set up mode-specific vars
        
switch ($action)
        {
            case 
'add':
                
$bbcode_match $bbcode_tpl $bbcode_helpline '';
                
$display_on_posting 0;
            break;

            case 
'edit':
                
$sql 'SELECT bbcode_match, bbcode_tpl, display_on_posting, bbcode_helpline
                    FROM ' 
BBCODES_TABLE '
                    WHERE bbcode_id = ' 
$bbcode_id;
                
$result $db->sql_query($sql);
                
$row $db->sql_fetchrow($result);
                
$db->sql_freeresult($result);

                if (!
$row)
                {
                    
trigger_error($user->lang['BBCODE_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
                }

                
$bbcode_match $row['bbcode_match'];
                
$bbcode_tpl htmlspecialchars($row['bbcode_tpl']);
                
$display_on_posting $row['display_on_posting'];
                
$bbcode_helpline $row['bbcode_helpline'];
            break;

            case 
'modify':
                
$sql 'SELECT bbcode_id, bbcode_tag
                    FROM ' 
BBCODES_TABLE '
                    WHERE bbcode_id = ' 
$bbcode_id;
                
$result $db->sql_query($sql);
                
$row $db->sql_fetchrow($result);
                
$db->sql_freeresult($result);

                if (!
$row)
                {
                    
trigger_error($user->lang['BBCODE_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
                }

            
// No break here

            
case 'create':
                
$display_on_posting request_var('display_on_posting'0);

                
$bbcode_match request_var('bbcode_match''');
                
$bbcode_tpl htmlspecialchars_decode(utf8_normalize_nfc(request_var('bbcode_tpl'''true)));
                
$bbcode_helpline utf8_normalize_nfc(request_var('bbcode_helpline'''true));
            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 '&amp;action=' . (($action == 'add') ? 'create' 'modify') . (($bbcode_id) ? "&amp;bbcode=$bbcode_id''),

                    
'L_BBCODE_USAGE_EXPLAIN'=> sprintf($user->lang['BBCODE_USAGE_EXPLAIN'], '<a href="#down">''</a>'),
                    
'BBCODE_MATCH'            => $bbcode_match,
                    
'BBCODE_TPL'            => $bbcode_tpl,
                    
'BBCODE_HELPLINE'        => $bbcode_helpline,
                    
'DISPLAY_ON_POSTING'    => $display_on_posting)
                );

                foreach (
$user->lang['tokens'] as $token => $token_explain)
                {
                    
$template->assign_block_vars('token', array(
                        
'TOKEN'        => '{' $token '}',
                        
'EXPLAIN'    => ($token === 'LOCAL_URL') ? sprintf($token_explaingenerate_board_url() . '/') : $token_explain,
                    ));
                }

                return;

            break;

            case 
'modify':
            case 
'create':

                
$warn_text preg_match('%<[^>]*{text[d]*}[^>]*>%i'$bbcode_tpl);
                if (!
$warn_text || confirm_box(true))
                {
                    
$data $this->build_regexp($bbcode_match$bbcode_tpl);

                    
// Make sure the user didn't pick a "bad" name for the BBCode tag.
                    
$hard_coded = array('code''quote''quote=''attachment''attachment=''b''i''url''url=''img''size''size=''color''color=''u''list''list=''email''email=''flash''flash=');

                    if ((
$action == 'modify' && strtolower($data['bbcode_tag']) !== strtolower($row['bbcode_tag'])) || ($action == 'create'))
                    {
                        
$sql 'SELECT 1 as test
                            FROM ' 
BBCODES_TABLE "
                            WHERE LOWER(bbcode_tag) = '" 
$db->sql_escape(strtolower($data['bbcode_tag'])) . "'";
                        
$result $db->sql_query($sql);
                        
$info $db->sql_fetchrow($result);
                        
$db->sql_freeresult($result);

                        
// Grab the end, interrogate the last closing tag
                        
if ($info['test'] === '1' || in_array(strtolower($data['bbcode_tag']), $hard_coded) || (preg_match('#[/([^[]*)]$#'$bbcode_match$regs) && in_array(strtolower($regs[1]), $hard_coded)))
                        {
                            
trigger_error($user->lang['BBCODE_INVALID_TAG_NAME'] . adm_back_link($this->u_action), E_USER_WARNING);
                        }
                    }

                    if (
substr($data['bbcode_tag'], -1) === '=')
                    {
                        
$test substr($data['bbcode_tag'], 0, -1);
                    }
                    else
                    {
                        
$test $data['bbcode_tag'];
                    }

                    if (!
preg_match('%\[' $test '[^]]*].*?\[/' $test ']%s'$bbcode_match))
                    {
                        
trigger_error($user->lang['BBCODE_OPEN_ENDED_TAG'] . adm_back_link($this->u_action), E_USER_WARNING);
                    }

                    if (
strlen($data['bbcode_tag']) > 16)
                    {
                        
trigger_error($user->lang['BBCODE_TAG_TOO_LONG'] . adm_back_link($this->u_action), E_USER_WARNING);
                    }

                    if (
strlen($bbcode_match) > 4000)
                    {
                        
trigger_error($user->lang['BBCODE_TAG_DEF_TOO_LONG'] . adm_back_link($this->u_action), E_USER_WARNING);
                    }


                    if (
strlen($bbcode_helpline) > 255)
                    {
                        
trigger_error($user->lang['BBCODE_HELPLINE_TOO_LONG'] . adm_back_link($this->u_action), E_USER_WARNING);
                    }

                    
$sql_ary = array(
                        
'bbcode_tag'                => $data['bbcode_tag'],
                        
'bbcode_match'                => $bbcode_match,
                        
'bbcode_tpl'                => $bbcode_tpl,
                        
'display_on_posting'        => $display_on_posting,
                        
'bbcode_helpline'            => $bbcode_helpline,
                        
'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 BBCODE_LIMIT)
                        {
                            
trigger_error($user->lang['TOO_MANY_BBCODES'] . adm_back_link($this->u_action), E_USER_WARNING);
                        }

                        
$sql_ary['bbcode_id'] = (int) $bbcode_id;

                        
$db->sql_query('INSERT INTO ' BBCODES_TABLE $db->sql_build_array('INSERT'$sql_ary));
                        
$cache->destroy('sql'BBCODES_TABLE);

                        
$lang 'BBCODE_ADDED';
                        
$log_action 'LOG_BBCODE_ADD';
                    }
                    else
                    {
                        
$sql 'UPDATE ' BBCODES_TABLE '
                            SET ' 
$db->sql_build_array('UPDATE'$sql_ary) . '
                            WHERE bbcode_id = ' 
$bbcode_id;
                        
$db->sql_query($sql);
                        
$cache->destroy('sql'BBCODES_TABLE);

                        
$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));
                }
                else
                {
                    
confirm_box(false$user->lang['BBCODE_DANGER'], build_hidden_fields(array(
                        
'action'                => $action,
                        
'bbcode'                => $bbcode_id,
                        
'bbcode_match'            => $bbcode_match,
                        
'bbcode_tpl'            => htmlspecialchars($bbcode_tpl),
                        
'bbcode_helpline'        => $bbcode_helpline,
                        
'display_on_posting'    => $display_on_posting,
                        ))
                    , 
'confirm_bbcode.html');
                }

            break;

            case 
'delete':

                
$sql 'SELECT bbcode_tag
                    FROM ' 
BBCODES_TABLE "
                    WHERE bbcode_id = 
$bbcode_id";
                
$result $db->sql_query($sql);
                
$row $db->sql_fetchrow($result);
                
$db->sql_freeresult($result);

                if (
$row)
                {
                    if (
confirm_box(true))
                    {
                        
$db->sql_query('DELETE FROM ' BBCODES_TABLE " WHERE bbcode_id = $bbcode_id");
                        
$cache->destroy('sql'BBCODES_TABLE);
                        
add_log('admin''LOG_BBCODE_DELETE'$row['bbcode_tag']);
                    }
                    else
                    {
                        
confirm_box(false$user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
                            
'bbcode'    => $bbcode_id,
                            
'i'            => $id,
                            
'mode'        => $mode,
                            
'action'    => $action))
                        );
                    }
                }

            break;
        }

        
$template->assign_vars(array(
            
'U_ACTION'        => $this->u_action '&amp;action=add')
        );

        
$sql 'SELECT *
            FROM ' 
BBCODES_TABLE '
            ORDER BY bbcode_tag'
;
        
$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 '&amp;action=edit&amp;bbcode=' $row['bbcode_id'],
                
'U_DELETE'            => $this->u_action '&amp;action=delete&amp;bbcode=' $row['bbcode_id'])
            );
        }
        
$db->sql_freeresult($result);
    }

    
/*
    * Build regular expression for custom bbcode
    */
    
function build_regexp(&$bbcode_match, &$bbcode_tpl)
    {
        
$bbcode_match trim($bbcode_match);
        
$bbcode_tpl trim($bbcode_tpl);
        
$utf8 strpos($bbcode_match'INTTEXT') !== false;

        
// make sure we have utf8 support
        
$utf8_pcre_properties false;
        if (
version_compare(PHP_VERSION'5.1.0''>=') || (version_compare(PHP_VERSION'5.0.0-dev''<=') && version_compare(PHP_VERSION'4.4.0''>=')))
        {
            
// While this is the proper range of PHP versions, PHP may not be linked with the bundled PCRE lib and instead with an older version
            
if (@preg_match('/p{L}/u''a') !== false)
            {
                
$utf8_pcre_properties true;
            }
        }

        
$fp_match preg_quote($bbcode_match'!');
        
$fp_replace preg_replace('#^[(.*?)]#''[$1:$uid]'$bbcode_match);
        
$fp_replace preg_replace('#[/(.*?)]$#''[/$1:$uid]'$fp_replace);

        
$sp_match preg_quote($bbcode_match'!');
        
$sp_match preg_replace('#^\\[(.*?)\\]#''[$1:$uid]'$sp_match);
        
$sp_match preg_replace('#\\[/(.*?)\\]$#''[/$1:$uid]'$sp_match);
        
$sp_replace $bbcode_tpl;

        
// @todo Make sure to change this too if something changed in message parsing
        
$tokens = array(
            
'URL'     => array(
                
'!(?:(' str_replace(array('!''#'), array('!''#'), get_preg_expression('url')) . ')|(' str_replace(array('!''#'), array('!''#'), get_preg_expression('www_url')) . '))!ie'    =>    "$this->bbcode_specialchars(('$1') ? '$1' : 'http://$2')"
            
),
            
'LOCAL_URL'     => array(
                
'!(' str_replace(array('!''#'), array('!''#'), get_preg_expression('relative_url')) . ')!e'    =>    "$this->bbcode_specialchars('$1')"
            
),
            
'RELATIVE_URL'    => array(
                
'!(' str_replace(array('!''#'), array('!''#'), get_preg_expression('relative_url')) . ')!e'    =>    "$this->bbcode_specialchars('$1')"
            
),
            
'EMAIL' => array(
                
'!(' get_preg_expression('email') . ')!ie'    =>    "$this->bbcode_specialchars('$1')"
            
),
            
'TEXT' => array(
                
'!(.*?)!es'     =>    "str_replace(array("\r\n", '\"', '\'', '(', ')'), array("\n", '"', '&#39;', '&#40;', '&#41;'), trim('$1'))"
            
),
            
'SIMPLETEXT' => array(
                
'!([a-zA-Z0-9-+.,_ ]+)!'     =>    "$1"
            
),
            
'INTTEXT' => array(
                (
$utf8_pcre_properties) ? '!([p{L}p{N}-+,_. ]+)!u' '!([a-zA-Z0-9-+,_. ]+)!u'     =>    "$1"
            
),
            
'IDENTIFIER' => array(
                
'!([a-zA-Z0-9-_]+)!'     =>    "$1"
            
),
            
'COLOR' => array(
                
'!([a-z]+|#[0-9abcdef]+)!i'    =>    '$1'
            
),
            
'NUMBER' => array(
                
'!([0-9]+)!'    =>    '$1'
            
)
        );

        
$sp_tokens = array(
            
'URL'     => '(?i)((?:' str_replace(array('!''#'), array('!''#'), get_preg_expression('url')) . ')|(?:' str_replace(array('!''#'), array('!''#'), get_preg_expression('www_url')) . '))(?-i)',
            
'LOCAL_URL'     => '(?i)(' str_replace(array('!''#'), array('!''#'), get_preg_expression('relative_url')) . ')(?-i)',
            
'RELATIVE_URL'     => '(?i)(' str_replace(array('!''#'), array('!''#'), get_preg_expression('relative_url')) . ')(?-i)',
            
'EMAIL' => '(' get_preg_expression('email') . ')',
            
'TEXT' => '(.*?)',
            
'SIMPLETEXT' => '([a-zA-Z0-9-+.,_ ]+)',
            
'INTTEXT' => ($utf8_pcre_properties) ? '([p{L}p{N}-+,_. ]+)' '([a-zA-Z0-9-+,_. ]+)',
            
'IDENTIFIER' => '([a-zA-Z0-9-_]+)',
            
'COLOR' => '([a-zA-Z]+|#[0-9abcdefABCDEF]+)',
            
'NUMBER' => '([0-9]+)',
        );

        
$pad 0;
        
$modifiers 'i';
        
$modifiers .= ($utf8 && $utf8_pcre_properties) ? 'u' '';

        if (
preg_match_all('/{(' implode('|'array_keys($tokens)) . ')[0-9]*}/i'$bbcode_match$m))
        {
            foreach (
$m[0] as $n => $token)
            {
                
$token_type $m[1][$n];

                
reset($tokens[strtoupper($token_type)]);
                list(
$match$replace) = each($tokens[strtoupper($token_type)]);

                
// Pad backreference numbers from tokens
                
if (preg_match_all('/(?<!\\)$([0-9]+)/'$replace$repad))
                {
                    
$repad $pad sizeof(array_unique($repad[0]));
                    
$replace preg_replace('/(?<!\\)$([0-9]+)/e'"'${' . ($1 + $pad) . '}'"$replace);
                    
$pad $repad;
                }

                
// Obtain pattern modifiers to use and alter the regex accordingly
                
$regex preg_replace('/!(.*)!([a-z]*)/''$1'$match);
                
$regex_modifiers preg_replace('/!(.*)!([a-z]*)/''$2'$match);

                for (
$i 0$size strlen($regex_modifiers); $i $size; ++$i)
                {
                    if (
strpos($modifiers$regex_modifiers[$i]) === false)
                    {
                        
$modifiers .= $regex_modifiers[$i];

                        if (
$regex_modifiers[$i] == 'e')
                        {
                            
$fp_replace "'" str_replace("'""\'"$fp_replace) . "'";
                        }
                    }

                    if (
$regex_modifiers[$i] == 'e')
                    {
                        
$replace "'.$replace.'";
                    }
                }

                
$fp_match str_replace(preg_quote($token'!'), $regex$fp_match);
                
$fp_replace str_replace($token$replace$fp_replace);

                
$sp_match str_replace(preg_quote($token'!'), $sp_tokens[$token_type], $sp_match);

                
// Prepend the board url to local relative links
                
$replace_prepend = ($token_type === 'LOCAL_URL') ? generate_board_url() . '/' '';

                
$sp_replace str_replace($token$replace_prepend '${' . ($n 1) . '}'$sp_replace);
            }

            
$fp_match '!' $fp_match '!' $modifiers;
            
$sp_match '!' $sp_match '!s' . (($utf8) ? 'u' '');

            if (
strpos($fp_match'e') !== false)
            {
                
$fp_replace str_replace("'.'"''$fp_replace);
                
$fp_replace str_replace(".''."'.'$fp_replace);
            }
        }
        else
        {
            
// No replacement is present, no need for a second-pass pattern replacement
            // A simple str_replace will suffice
            
$fp_match '!' $fp_match '!' $modifiers;
            
$sp_match $fp_replace;
            
$sp_replace '';
        }

        
// Lowercase tags
        
$bbcode_tag preg_replace('/.*?[([a-z0-9_-]+=?).*/i''$1'$bbcode_match);
        
$bbcode_search preg_replace('/.*?[([a-z0-9_-]+)=?.*/i''$1'$bbcode_match);

        if (!
preg_match('/^[a-zA-Z0-9_-]+=?$/'$bbcode_tag))
        {
            global 
$user;
            
trigger_error($user->lang['BBCODE_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
        }

        
$fp_match preg_replace('#[/?' $bbcode_search '#ie'"strtolower('$0')"$fp_match);
        
$fp_replace preg_replace('#[/?' $bbcode_search '#ie'"strtolower('$0')"$fp_replace);
        
$sp_match preg_replace('#[/?' $bbcode_search '#ie'"strtolower('$0')"$sp_match);
        
$sp_replace preg_replace('#[/?' $bbcode_search '#ie'"strtolower('$0')"$sp_replace);

        return array(
            
'bbcode_tag'                => $bbcode_tag,
            
'first_pass_match'            => $fp_match,
            
'first_pass_replace'        => $fp_replace,
            
'second_pass_match'            => $sp_match,
            
'second_pass_replace'        => $sp_replace
        
);
    }
}

?>
Онлайн: 1
Реклама