Вход Регистрация
Файл: forsoc.ru/includes/acp/acp_bbcodes.php
Строк: 326
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/

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

class 
acp_bbcodes
{
    var 
$u_action;

    function 
main($id$mode)
    {
        global 
$db$user$auth$template$cache$request$phpbb_dispatcher;
        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);
        
$submit $request->is_set_post('submit');

        
$this->tpl_name 'acp_bbcodes';
        
$this->page_title 'ACP_BBCODES';
        
$form_key 'acp_bbcodes';

        
add_form_key($form_key);

        if (
$submit && !check_form_key($form_key))
        {
            
trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
        }

        
// 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':

                
$tpl_ary = 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,
                );

                
$bbcode_tokens = array('TEXT''SIMPLETEXT''INTTEXT''IDENTIFIER''NUMBER''EMAIL''URL''LOCAL_URL''RELATIVE_URL''COLOR');

                
/**
                * Modify custom bbcode template data before we display the add/edit form
                *
                * @event core.acp_bbcodes_edit_add
                * @var    string    action            Type of the action: add|edit
                * @var    array    tpl_ary            Array with custom bbcode add/edit data
                * @var    int        bbcode_id        When editing: the bbcode id,
                *                                when creating: 0
                * @var    array    bbcode_tokens    Array of bbcode tokens
                * @since 3.1.0-a3
                */
                
$vars = array('action''tpl_ary''bbcode_id''bbcode_tokens');
                
extract($phpbb_dispatcher->trigger_event('core.acp_bbcodes_edit_add'compact($vars)));

                
$template->assign_vars($tpl_ary);

                foreach (
$bbcode_tokens as $token)
                {
                    
$template->assign_block_vars('token', array(
                        
'TOKEN'        => '{' $token '}',
                        
'EXPLAIN'    => ($token === 'LOCAL_URL') ? $user->lang(array('tokens'$token), generate_board_url() . '/') : $user->lang(array('tokens'$token)),
                    ));
                }

                return;

            break;

            case 
'modify':
            case 
'create':

                
$sql_ary $hidden_fields = array();

                
/**
                * Modify custom bbcode data before the modify/create action
                *
                * @event core.acp_bbcodes_modify_create
                * @var    string    action                Type of the action: modify|create
                * @var    array    sql_ary                Array with new bbcode data
                * @var    int        bbcode_id            When editing: the bbcode id,
                *                                    when creating: 0
                * @var    bool    display_on_posting    Display bbcode on posting form
                * @var    string    bbcode_match        The bbcode usage string to match
                * @var    string    bbcode_tpl            The bbcode HTML replacement string
                * @var    string    bbcode_helpline        The bbcode help line string
                * @var    array    hidden_fields        Array of hidden fields for use when
                *                                    submitting form when $warn_text is true
                * @since 3.1.0-a3
                */
                
$vars = array(
                    
'action',
                    
'sql_ary',
                    
'bbcode_id',
                    
'display_on_posting',
                    
'bbcode_match',
                    
'bbcode_tpl',
                    
'bbcode_helpline',
                    
'hidden_fields',
                );
                
extract($phpbb_dispatcher->trigger_event('core.acp_bbcodes_modify_create'compact($vars)));

                
$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_merge($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_merge($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']);

                        if (
$request->is_ajax())
                        {
                            
$json_response = new phpbbjson_response;
                            
$json_response->send(array(
                                
'MESSAGE_TITLE'    => $user->lang['INFORMATION'],
                                
'MESSAGE_TEXT'    => $user->lang['BBCODE_DELETED'],
                                
'REFRESH_DATA'    => array(
                                    
'time'    => 3
                                
)
                            ));
                        }
                    }
                    else
                    {
                        
confirm_box(false$user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
                            
'bbcode'    => $bbcode_id,
                            
'i'            => $id,
                            
'mode'        => $mode,
                            
'action'    => $action))
                        );
                    }
                }

            break;
        }

        
$u_action $this->u_action;

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

        
$sql_ary = array(
            
'SELECT'    => 'b.*',
            
'FROM'        => array(BBCODES_TABLE => 'b'),
            
'ORDER_BY'    => 'b.bbcode_tag',
        );

        
/**
        *  Modify custom bbcode template data before we display the form
        *
        * @event core.acp_bbcodes_display_form
        * @var    string    action            Type of the action: modify|create
        * @var    array    sql_ary            The SQL array to get custom bbcode data
        * @var    array    template_data    Array with form template data
        * @var    string    u_action        The u_action link
        * @since 3.1.0-a3
        */
        
$vars = array('action''sql_ary''template_data''u_action');
        
extract($phpbb_dispatcher->trigger_event('core.acp_bbcodes_display_form'compact($vars)));

        
$result $db->sql_query($db->sql_build_query('SELECT'$sql_ary));

        
$template->assign_vars($template_data);

        while (
$row $db->sql_fetchrow($result))
        {
            
$bbcodes_array = array(
                
'BBCODE_TAG'        => $row['bbcode_tag'],
                
'U_EDIT'            => $u_action '&amp;action=edit&amp;bbcode=' $row['bbcode_id'],
                
'U_DELETE'            => $u_action '&amp;action=delete&amp;bbcode=' $row['bbcode_id'],
            );

            
/**
            *  Modify display of custom bbcodes in the form
            *
            * @event core.acp_bbcodes_display_bbcodes
            * @var    array    row                Array with current bbcode data
            * @var    array    bbcodes_array    Array of bbcodes template data
            * @var    string    u_action        The u_action link
            * @since 3.1.0-a3
            */
            
$vars = array('bbcodes_array''row''u_action');
            
extract($phpbb_dispatcher->trigger_event('core.acp_bbcodes_display_bbcodes'compact($vars)));

            
$template->assign_block_vars('bbcodes'$bbcodes_array);

        }
        
$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);

        
// Allow unicode characters for URL|LOCAL_URL|RELATIVE_URL|INTTEXT tokens
        
$utf8 preg_match('/(URL|LOCAL_URL|RELATIVE_URL|INTTEXT)/'$bbcode_match);

        
$utf8_pcre_properties phpbb_pcre_utf8_support();

        
$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
        
);
    }
}
Онлайн: 0
Реклама