<?php
/*
Статические свойства не могут быть доступны через объект с помощью оператора "->"
private - нельзя вызывать вне класса
static - обращение без экземпляра класса
*/
class bbcode extends core {
    protected $geshi; // вызываю данные файла
    protected $codeId;
    protected $codeIndex;
    protected $codeParts;

    public function __invoke() {
        $this->codeId = uniqid();
        $this->codeIndex = 0;
        $this->codeParts = [];
        return $this;
    }
    ///////////// главные теги
    public function tags($var,$bb = NULL) {
        $var = empty($bb)?nl2br($var):$var; //сохраняем переносы
        $var = $this->highlight_bb($var); // стандартные бб коды
        $var = $this->urls($var); // ссылки
        $var = $this->webmoney($var); // данные вебмани
        $var = $this->images($var); // данные изображения
        $var = $this->highlightCode($var); // подцветка кода
        return $var;
    }
    // Вывод bb кодов
    public function vivbb() {
        ?>
        <div class="bbot">
            <div title="жирный шрифт" class="bbk" onclick="addTag('[b]', '[/b]');">b</div>
            <div title="курсивный шрифт" class="bbk" onclick="addTag('[i]', '[/i]');">i</div>
            <div title="подчеркивание" class="bbk" onclick="addTag('[u]', '[/u]');">u</div>
            <div title="цвет" class="bbk" onclick="colors('[cl=]', '[/cl]');">cl</div>
            <div title="цытата" class="bbk" onclick="addTag('[cit]', '[/cit]');">cit</div>
            <div title="марк" class="bbk" onclick="addTag('[mark]', '[/mark]');">mark</div>
            <div title="раздел" class="bbk" onclick="addTag('[h3]', '[/h3]');">h3</div>
            <div title="тег" class="bbk" onclick="addTag('[tt]', '[/tt]');">tt</div>
            <div title="код" class="bbk" onclick="code();">code</div>
            <div title="вебмани" class="bbk" onclick="addTag('[webm=]', '');">webm</div>
            <div title="картинка" class="bbk" onclick="img();">img</div>
            <div title="ссылка" class="bbk" onclick="urls();">url</div>
        </div>
        <div id="colors" class="displ" style="display: none;">
            <span style="color:red;cursor: pointer;" title="цвет" onclick="addTag('[cl=red]', '[/cl]');">цвет</span>
            <span style="color:blue;cursor: pointer;" title="цвет" onclick="addTag('[cl=blue]', '[/cl]');">цвет</span>
            <span style="color:orange;cursor: pointer;" title="цвет" onclick="addTag('[cl=orange]', '[/cl]');">цвет</span>
            <span style="color:#8B008B;cursor: pointer;" title="цвет" onclick="addTag('[cl=#8B008B]', '[/cl]');">цвет</span>
            <span style="color:#8B4513;cursor: pointer;" title="цвет" onclick="addTag('[cl=#8B4513]', '[/cl]');">цвет</span>
            <span style="color:#808000;cursor: pointer;" title="цвет" onclick="addTag('[cl=#808000]', '[/cl]');">цвет</span>
            <span style="color:#008000;cursor: pointer;" title="цвет" onclick="addTag('[cl=#008000]', '[/cl]');">цвет</span>
            <span style="color:#006400;cursor: pointer;" title="цвет" onclick="addTag('[cl=#006400]', '[/cl]');">цвет</span>
            <span style="color:#20B2AA;cursor: pointer;" title="цвет" onclick="addTag('[cl=#20B2AA]', '[/cl]');">цвет</span>
            <span style="color:#708090;cursor: pointer;" title="цвет" onclick="addTag('[cl=#708090]', '[/cl]');">цвет</span>
        </div>
        <div id="code" class="displ" style="display: none;">
            <span style="cursor: pointer;" title="php" onclick="addTag('[php]', '[/php]');">php</span>
            <span style="cursor: pointer;" title="html" onclick="addTag('[code=html]', '[/code]');">html</span>
            <span style="cursor: pointer;" title="css" onclick="addTag('[code=css]', '[/code]');">css</span>
            <span style="cursor: pointer;" title="html" onclick="addTag('[code=html]', '[/code]');">html</span>
            <span style="cursor: pointer;" title="js" onclick="addTag('[code=js]', '[/code]');">js</span>
            <span style="cursor: pointer;" title="sql" onclick="addTag('[code=sql]', '[/code]');">sql</span>
            <span style="cursor: pointer;" title="xml" onclick="addTag('[code=xml]', '[/code]');">xml</span>
            <span style="cursor: pointer;" title="другой код" onclick="addTag('[code=]', '[/code]');">другое</span>
        </div>
        <script src="/css/jquery2.min.js"></script>
        <script>
            function addTag(open, close) {
                var control = $('#control')[0];
                var start = control.selectionStart;
                var end = control.selectionEnd;
                var text = $(control).val();
                $(control).val(text.substring(0, start) + open + text.substring(start, end) + close + text.substring(end));
                $(control).focus();
                var sel = end + (open + close).length;
                control.setSelectionRange(sel, sel);
                return false;
            }
            // раздел с цветами
            function colors() {
                $('.displ').css('display', 'none');
                $('#colors').css('display', '');
            }
            // раздел с кодами
            function code() {
                $('.displ').css('display', 'none');
                $('#code').css('display', '');
            }
            // При клике на кнопки не снимаем фокус с textarea.
            $('.bbk').on('mousedown', function() {
                return false;
            });
            /*
            // Автовысота
            $('#control').on('input', function(e) {
                this.style.height = '300px';
                this.style.height = (this.scrollHeight + 6) + 'px'; 
            });
            */
            // Вставка изображений
            function img() {
                var pole = prompt('Введите ссылку на изображение');
                if(pole !== null){
                    addTag('[photo-'+pole+'|100]', '');
                }
            }
            // Вставка ссылок
            function urls() {
                var pole = prompt('Введите ссылку');
                if(pole !== null){
                    addTag('[url='+pole+']', '');
                }
            }
        </script>
        <?php
    }
    // Удаляем все ненужные теги для хеадера
 	public static function notags($var = '') {
 		$var = preg_replace('#\[img=(.+?)\]#si', 'Изображение.', $var);
 		$replace = [
            '[b]' => '',
            '[/b]' => '',
            '[i]' => '',
            '[/i]' => '',
            '[mark]' => '',
            '[/mark]' => '',
            '[h3]' => '',
            '[/h3]' => ''
 		];
 		return strtr($var, $replace);
 	}
 	// Новый бб код изображения
    private function images($var) {
        $var = preg_replace_callback('#\[photo-(.+?)\|(.+?)\]#s', [$this, 'phpImgCallback'], $var);
        return $var;
    }
    private function phpImgCallback($code) {
    	if(empty($code[2])) $wid = 100; else $wid = $code[2];
		return '<a href="'.$code[1].'" title="просмотр изображения"><img alt="Изображение" role="image" aria-label="Изображение image riblog" title="Изображение с сайта riblog.ru" src="'.$code[1].'" style="width:'.$code[2].'%;"></a>';
    }
    // Разбиваем функцию вебмани
    private function webmoney($var) {
        $var = preg_replace_callback('#\[webm=(.+?)\]#s', [$this, 'phpWebmCallback'], $var);
        return $var;
    }
    // Веб мани
    private function phpWebmCallback($code) {
		return '<div>WMID: <a target="_blank" href="https://passport.webmoney.ru/asp/CertView.asp?wmid='.$code[1].'">'.$code[1].'</a></div>
		<div>BL: <img src="//bl.wmtransfer.com/img/bl/'.$code[1].'?w=35&amp;h=18&amp;bg=0XDBE2E9" alt="" class="icon"></div>
		<div>Претензии | Отзывы</div>
		<div><a href="//arbitrage.webmoney.ru/asp/claims.asp?wmid='.$code[1].'"><img src="https://arbitrage.webmoney.ru/xml/AL.aspx?wmid='.$code[1].'" alt="" class="icon"></a></div>';
    }
    // Разбиваем функцию ссылок
    private function urls($var) {
        $var = preg_replace_callback('#\[url=(.+?)\]#s', [$this, 'phpUrlCallback'], $var);
        return $var;
    }
    // Ссылки
    private function phpUrlCallback($code) {
        return '<a rel="nofollow" title="перейти на сайт" target="_blank" href="'.$code[1].'"><i class="fas fa-sync-alt"></i> '.parse_url($code[1], PHP_URL_HOST).'</a>';
    }
    // Основные бб коды
    private function highlight_bb($var) {
        $search = [
            '#\[img=(.+?)]#is', //картинка
            '#\[i](.+?)\[/i]#is', //курсив
            '#\[u](.+?)\[/u]#is', //подчеркивание
            '#\[b](.+?)\[/b]#is', //жирный
            '#\[cl=(.+?)\](.+?)\[/cl]#is', //цвет
            '#\[cit](.+?)\[/cit]#is', //цытата
            '#\[mark](.+?)\[/mark]#is', //выделенный текст
            '#\[h3](.+?)\[/h3]#is', //раздел в блоге
            '#\[tt](.+?)\[/tt]#is' //тег
        ];

        $replace = [
            '<a href="$1" title="просмотр изображения"><img alt="Изображение" role="image" aria-label="Изображение image riblog" title="Изображение с сайта riblog.ru" src="$1" style="width:100%;"></a>', //картинка
            '<em>$1</em>', //курсив
            '<span style="text-decoration:underline">$1</span>', //подчеркивание
            '<strong>$1</strong>', //жирный
            '<span style="color: $1">$2</span>', //цвет
            '<blockquote class="cit">$1</blockquote>', //цытата
            '<mark>$1</mark>', //цытата
            '<h3>$1</h3>', //раздел в блоге
            '<span class="tag">$1</span>' //тег
        ];

        return preg_replace($search, $replace, $var);
    }
    // Разбиваем функцию подцветки кода на другие коды
    private function highlightCode($var) {
        $var = preg_replace_callback('#\[php\](.+?)\[\/php\]#s', [$this, 'phpCodeCallback'], $var);
        $var = preg_replace_callback('#\[code=(.+?)\](.+?)\[\/code]#is', [$this, 'codeCallback'], $var);
        return $var;
    }
    // Дописываем код php 
    private function phpCodeCallback($code){
        return $this->codeCallback([1 => 'php', 2 => $code[1]]);
    }
    // Тут начинаем определять подцветку кода
    private function codeCallback($code) {
        require_once ROOT.'flowap/app/geshi.php';
        $parsers = [
            'php'  => 'php',
            'css'  => 'css',
            'html' => 'html5',
            'js'   => 'javascript',
            'sql'  => 'sql',
            'xml'  => 'xml'
        ];

        $parser = isset($code[1]) && isset($parsers[$code[1]]) ? $parsers[$code[1]] : 'php';

        if (null === $this->geshi) {
            require_once ROOT.'flowap/app/geshi.php';
            $this->geshi = new \GeSHi;
            $this->geshi->set_link_styles(GESHI_LINK, 'text-decoration: none');
            $this->geshi->set_link_target('_blank');
            $this->geshi->enable_line_numbers(GESHI_FANCY_LINE_NUMBERS, 2);
            $this->geshi->set_line_style('background: rgba(255, 255, 255, 0.5)', 'background: rgba(255, 255, 255, 0.35)', false);
            $this->geshi->set_code_style('padding-left: 6px; white-space: pre-wrap');
        }

        
        $this->geshi->set_language($parser);
        $php = strtr($code[2], ['<br />' => '']);
        $php = html_entity_decode(trim($php), ENT_QUOTES, 'UTF-8');
        $this->geshi->set_source($php);
        $this->codeIndex++;
        //$this->codeParts[$this->codeIndex] = $this->geshi->parse_code();

        return '<div style="overflow-x: auto;display: inline-block;overflow: auto;width: 100%;">'.$this->geshi->parse_code().'</div>';
    }
}
?>