Вход Регистрация
Файл: base-sys/base/bol/text_format_service.php
Строк: 216
<?php

final class BOL_TextFormatService
{
    const 
WS_BTN_BOLD 'bold';
    const 
WS_BTN_ITALIC 'italic';
    const 
WS_BTN_UNDERLINE 'underline';
    const 
WS_BTN_UNORDERED_LIST 'unorderedlist';
    const 
WS_BTN_ORDERED_LIST 'orderedlist';
    const 
WS_BTN_LINK 'link';
    const 
WS_BTN_IMAGE 'image';
    const 
WS_BTN_VIDEO 'video';
    const 
WS_BTN_HTML 'html';
    const 
WS_BTN_SWITCH_HTML 'switchHtml';
    const 
WS_BTN_MORE 'more';

    const 
CONF_MEDIA_RESOURCE_LIST 'tf_resource_list';
    const 
CONF_USER_INPUT_CUSTOM_HTML_DISABLE 'tf_user_custom_html_disable';
    const 
CONF_USER_INPUT_RICH_MEDIA_DISABLE 'tf_user_rich_media_disable';
    const 
CONF_COMMENTS_RICH_MEDIA_DISABLE 'tf_comments_rich_media_disable';

    
/**
     * @var array
     */
    
private $videoParams;
    
/**
     * @var array
     */
    
private $htmlParams;
    
/**
     * @var array
     */
    
private $buttonTags;
    
/**
     * Singleton instance.
     *
     * @var BOL_TextFormatService
     */
    
private static $classInstance;

    
/**
     * Returns an instance of class (singleton pattern implementation).
     *
     * @return BOL_TextFormatService
     */
    
public static function getInstance()
    {
        if ( 
self::$classInstance === null )
        {
            
self::$classInstance = new self();
        }

        return 
self::$classInstance;
    }

    private function 
__construct()
    {
        
$this->buttonTags = array(
            
self::WS_BTN_BOLD => array('tags' => array('b''strong''span'), 'attrs' => array('span.style')),
            
self::WS_BTN_ITALIC => array('tags' => array('i''em''span'), 'attrs' => array('span.style')),
            
self::WS_BTN_UNDERLINE => array('tags' => array('u''span'), 'attrs' => array('span.style')),
            
self::WS_BTN_ORDERED_LIST => array('tags' => array('ol''li'), 'attrs' => array()),
            
self::WS_BTN_UNORDERED_LIST => array('tags' => array('ul''li'), 'attrs' => array()),
            
self::WS_BTN_LINK => array('tags' => array('a'), 'attrs' => array('a.href''a.title''a.target''a.rel')),
            
self::WS_BTN_IMAGE => array('tags' => array('img''a'), 'attrs' => array('img.src''img.width''img.height''img.alt''img.style''a.href''a.target')),
        );

        
$this->videoParams = array(
            
'tags' => array('object''iframe''param''embed'),
            
'attrs' => array('id''width''height''data''type''name''value''src''allowfullscreen''frameborder''flashvars')
        );

        
$this->htmlParams = array(
            
'tags' => array(),
            
'attrs' => array()
        );
    }

    
/**
     * Returns flag if custom html is allowed for user input.
     * 
     * @return boolean
     */
    
public function isCustomHtmlAllowed()
    {
        return (!(bool) 
PEEP::getConfig()->getValue('base'self::CONF_USER_INPUT_CUSTOM_HTML_DISABLE));
    }

    
/**
     * Returns flag if rich media is allowed for user input.
     * 
     * @return boolean
     */
    
public function isRichMediaAllowed()
    {
        return !((bool) 
PEEP::getConfig()->getValue('base'self::CONF_USER_INPUT_RICH_MEDIA_DISABLE));
    }

    
/**
     * Returns flag if rich media is allowed for comments.
     * 
     * @return type 
     */
    
public function isCommentsRichMediaAllowed()
    {
        return !((bool) 
PEEP::getConfig()->getValue('base'self::CONF_COMMENTS_RICH_MEDIA_DISABLE));
    }

    
/**
     * Returns the list of allowed resources for media (iframes, objects, embed).
     * 
     * @return array
     */
    
public function getMediaResourceList()
    {
        
$list PEEP::getConfig()->getValue('base'self::CONF_MEDIA_RESOURCE_LIST);

        if ( !empty(
$list) )
        {
            
$list json_decode($list);
        }

        return (!empty(
$list) && is_array($list) ) ? $list : array();
    }

    
/**
     * @param null $type
     * @return array
     */
    
public function getVideoParamList$type null )
    {
        if ( 
$type !== null && in_array($type, array('tags''attrs')) )
        {
            return 
$this->videoParams[$type];
        }

        return 
$this->videoParams;
    }

    public function 
processWsForOutput$text, array $params = array() )
    {
        
//hotfix for Chrome
//        $text = str_replace('<div><br></div>', '<br />', $text);
//        $text = str_replace(array('<div>', '</div>'), array('', '<br />'), $text);

        //hotfix for ie8
        
$text str_ireplace(array('<SPAN class=peep_ws_video>'), '<span class="peep_ws_video">'$text);
        
        if ( 
in_array(self::WS_BTN_HTML$params['buttons']) )
        {
            
$htmlResult $this->processHtml($text);
            
$text $htmlResult['text'];
        }

        if ( 
in_array(self::WS_BTN_VIDEO$params['buttons']) )
        {
            
$videoResult $this->processVideo($text);
            
$text $videoResult['text'];
        }

        
// default tags list
        
$tagsArray = array('br''span''blockquote''p');
        
// default attrs list
        
$attrsArray = array('class''p.style');

        foreach ( 
$params['buttons'] as $param )
        {
            if ( !empty(
$this->buttonTags[$param]['tags']) )
            {
                
$tagsArray array_merge($tagsArray$this->buttonTags[$param]['tags']);
            }

            if ( !empty(
$this->buttonTags[$param]['attrs']) )
            {
                
$attrsArray array_merge($attrsArray$this->buttonTags[$param]['attrs']);
            }
        }

        
array_unique($tagsArray);
        
array_unique($attrsArray);
        
        
$text UTIL_HtmlTag::stripTags($text$tagsArray$attrsArray);
        
        if ( !empty(
$htmlResult) )
        {
            
$text str_replace($htmlResult['search'], $htmlResult['replace'], $text);
        }
        
        if ( !empty(
$videoResult) )
        {
            
$text str_replace($videoResult['search'], $videoResult['replace'], $text);
        }

        if ( 
in_array(self::WS_BTN_MORE$params['buttons']) )
        {
            
$text str_replace('&lt;!--more--&gt;''<!--more-->'$text);
        }

        return 
$text;
    }

    public function 
processWsForInput$text, array $params = array() )
    {
        
//printVar($text);
//        if ( in_array('html', $params['buttons']) )
//        {
//            $htmlResult = $this->processHtml($text, false);
//            $text = str_replace($htmlResult['search'], $htmlResult['replace'], $htmlResult['text']);
//        }
//
//        if ( in_array('video', $params['buttons']) )
//        {
//            $videoResult = $this->processVideo($text, false);
//            $text = str_replace($videoResult['search'], $videoResult['replace'], $videoResult['text']);
//        }
        //printVar($videoResult);
        
if ( in_array(self::WS_BTN_MORE$params['buttons']) )
        {
            
$text str_replace('<!--more-->''&lt;!--more--&gt;'$text);
        }
        
//printVar($text);
        
return $text;
    }

    public function 
isCodeResourceValid$code )
    {
        return 
true;
    }

    private function 
processHtml$text )
    {
        
$searchArray = array();
        
$replaceArray = array();

        
$index 1;

        while ( 
mb_strstr($text'<span class="peep_ws_html">') )
        {
            
$openSearchStr '<span class="peep_ws_html">';
            
$closeSearchStr '</span>';

            
$openPos mb_stripos($text$openSearchStr);
            
$closePos mb_stripos($text$closeSearchStr$openPos) + mb_strlen($closeSearchStr);
            
$code mb_substr($text$openPos$closePos $openPos);

            
$subCode mb_substr($codemb_strlen($openSearchStr));
            
$subCode mb_substr($subCode0mb_strlen($subCode) - mb_strlen($closeSearchStr));

            
$ph '#h#' $index '#h#';
            
$text str_replace($code$ph$text);

            
$searchArray[$index] = $ph;
            
$replaceArray[$index] = $openSearchStr UTIL_HtmlTag::stripJs($subCode) . $closeSearchStr;
            
$index++;
        }

        return array(
'text' => $text'search' => $searchArray'replace' => $replaceArray);
    }

    private function 
processVideo$text )
    {
        
$searchArray = array();
        
$replaceArray = array();

        
$index 1;

        while ( 
mb_strstr($text'<span class="peep_ws_video">') )
        {
            
$openSearchStr '<span class="peep_ws_video">';
            
$closeSearchStr '</span>';

            
$openPos mb_stripos($text$openSearchStr);
            
$closePos mb_stripos($text$closeSearchStr$openPos) + mb_strlen($closeSearchStr);
            
$code mb_substr($text$openPos$closePos $openPos);

            
$subCode mb_substr($codemb_strlen($openSearchStr));
            
$subCode mb_substr($subCode0mb_strlen($subCode) - mb_strlen($closeSearchStr));

            
$ph '#v#' $index '#v#';
            
$text str_replace($code$ph$text);

            
$searchArray[$index] = $ph;
            
$replaceArray[$index] = $openSearchStr UTIL_HtmlTag::stripTags($subCode$this->videoParams['tags'], $this->videoParams['attrs']) . $closeSearchStr;
            
$index++;
        }
        
        return array(
'text' => $text'search' => $searchArray'replace' => $replaceArray);
    }

    
/**
     * Validates provided video code, stripping all restricted tags.
     *
     * @param string $code
     * @return string
     */
    
public function validateVideoCode$code )
    {
        return 
UTIL_HtmlTag::stripTags($code$this->videoParams['tags'], $this->videoParams['attrs']);
    }
    
    
/**
     * Adds parameter to embed code
     *
     * @param string $code
     * @param string $name
     * @param string $value
     * @return string
     */
    
public static function addVideoCodeParam$code$name 'wmode'$value 'transparent' )
    {
        
$repl $code;

        if ( 
preg_match("/<object/i"$code) )
        {
            
$searchPattern '<param';
            
$pos stripos($code$searchPattern);
            if ( 
$pos )
            {
                
$addParam '<param name="' $name '" value="' $value '"></param><param';
                
$repl substr_replace($code$addParam$posstrlen($searchPattern));
            }
        }

        if ( 
preg_match("/<embed/i", !empty($repl) ? $repl $code) )
        {
            
$repl preg_replace("/<embed/i"'<embed ' $name '="' $value '"', isset($repl) ? $repl $code);
        }
        
        
$matches = array();
        if ( 
preg_match("/<iframe[^>]*src=['"]([^'"]+)['"]/i", !empty($repl) ? $repl $code$matches) )
        {
            
$src null;
            if ( 
strpos($matches[1], "//") === )
            {
                
$src "http:" $matches[1];
                
$src PEEP::getRequest()->buildUrlQueryString($src, array($name => $value));
                
$src substr($src5);
            }
            else
            {
                
$src PEEP::getRequest()->buildUrlQueryString($matches[1], array($name => $value));
            }
            
            
$repl preg_replace("/(<iframe[^>]*)src=['"]([^'"]+)['"]/i""$1src="".$src."""$code);
        }

        return 
$repl;
    }
}
Онлайн: 1
Реклама