Пример #1
0
/**
 * Основная функция для форматирования текстов на выходе.
 *
 * @see textWrap()
 * @see reformat_callback()
 *
 * @param $input           string    исходный текст.
 * @param $max_word_size   integer   максимальное кол-во непробельных символов в слове (при превышении,
 *                                   слово рубится пробелами {@link textWrap()}).
 * @param $cut             boolean   обрабатывать ли тег <cut>:
 *                                   true: тег и все его содержимое заменяется на '...';
 *                                   false: убираем теги из исходного текста.
 * @param $nolink          boolean   формирование ссылок:
 *                                   1:  нельзя формировать ссылки (все вхождения http://www..... остаются просто текстом);
 *                                   0:  можно, содержащиеся в тексте URI оформаляются тегами <a>. Если
 *                                       это внутренний адрес, то ссылка прямая, иначе формируется адрес
 *                                       промежуточной страницы ({@link reformat_callback()}).
 *                                   -1: При включенном {@link globals.php HYPER_LINKS} можно использовать
 *                                       спец. формат, для вывода гипер-ссылок. В данном случае ссылка тоже всегда прямая.
 * @param $space           boolean   если true, то обрабатывается последовательность в два пробела (см. внутрь).
 * @param $max_link_len    integer   на каком символе обрезать хвост текста ссылки и заменять
 *                                   его на '...'. Имеет значение только при $nolink==false.
 * @return string                    отформатированный текст.
 */
function reformat($input, $max_word_size = 100, $cut = 0, $nolink = 0, $space = 0, $max_link_len = 25, $is_wysiwyg = false)
{
    $out = wysiwyg_video_replace($input, $wysiwyg_videos, true);
    $out = wysiwyg_image_replace($out, $wysiwyg_images, true);
    //сохранить в $wysiwyg_images изображения с классом wysiwyg_images
    $out = wysiwyg_code_replace($out, $wysiwyg_codes);
    $out = str_replace(array(' - ', ' -- ', "\r\n", "\n"), array(' &#150; ', ' &mdash; ', ' <br />', ' <br />'), $out);
    $out = str_replace("\r", ' <br />', $out);
    //в постах блогов переносы текста почему-то работают только так
    // Все что обрамлено как код в визивиге там мы не режем ничего и не заменяем на ссылки #0016101
    /*list($out, $code) = str_replace_mask('#((<p\sclass="code.*?>)(.*?)(<\/p>))#mix', $out);
      $code = str_replace("\n", "<br />", $code);*/
    if (!$is_wysiwyg) {
        $out = str_replace('&nbsp;', ' ', $out);
    }
    if ($cut) {
        $out = preg_replace('~<cut[^>]*?>.*?(?:</cut>|$)~si', '... ', $out);
        // обязательно пробел на конце, чтобы ссылки не испортить (http://zzz.com...textпослеcut).
        $out = preg_replace('~<\\!-- -W-EDITOR-CUT- -->.*?$~si', '... ', $out);
    } else {
        $out = preg_replace('~<[/!]*cut[^>]*>~i', ' ', $out);
        $out = preg_replace('~<\\!-- -W-EDITOR-CUT- -->~si', ' ', $out);
    }
    if ($nolink <= 0) {
        $GLOBALS['reformat.max_link_len'] = $max_link_len;
        $GLOBALS['reformat.can_hyper'] = $nolink == -1;
        $hre = HYPER_LINKS ? '{([^}]+)}' : '()';
        // отключается в globals.php.
        // сначала обрабатываем все ссылки обрамленные тегами <a>
        $out = preg_replace_callback('~<a[^>]+?href=\\"(https?:/(' . $hre . ')?/|www\\.)(([\\da-z-_а-яёА-ЯЁ]+\\.)*([a-zа-я]{2,15})(:\\d+)?([/?#][^"\\s<]*)*)\\"[^>]*?>.*?</a>~i', 'reformat_callback', $out);
        list($out, $url) = str_replace_mask('#((<a[^>]*>)(.*?)(<\\/a>))#mix', $out);
        $out = preg_replace_callback('~(https?:/(' . $hre . ')?/|www\\.)(([\\da-z-_а-яёА-ЯЁ]+\\.)*([a-zа-я]{2,15})(:\\d+)?([/?#][^"\\s<]*)*)~i', 'reformat_callback', $out);
        $out = str_unreplace_mask($url, $out);
    }
    if ($max_word_size) {
        $out = textWrap($out, $max_word_size);
    }
    if ($space) {
        $mx = 7;
        do {
            $out = str_replace('  ', '&nbsp; ', $out, $cnt);
        } while ($cnt && --$mx >= 0);
        if ($out[0] == ' ') {
            $out = '&nbsp;' . substr($out, 1);
        }
    }
    // #0016101
    //$out = str_unreplace_mask($code, $out);
    $out = wysiwyg_code_restore($out, $wysiwyg_codes);
    $out = wysiwyg_image_restore($out, $wysiwyg_images);
    //вернуть изображения с классом wysiwyg_images
    $out = wysiwyg_video_restore($out, $wysiwyg_videos);
    return $out;
}
Пример #2
0
/**
 * Корректная инициализация переданных параметров GET и POST переданных пользователем
 *
 * @param string  $type		Тип переданных данных (int, float, string, link, html, bool, money)
 * @param string  $get_name	Название данных в GET 
 * @param ustring $post_name	Название данных в POST 
 * @param mixed   $empty_val	Значение по умолчанию
 * @param integer $maxlen		Максимальная длинна данных
 * @param string $strip_tags		Для $type = 'html'. Если TRUE, то все теги и спецсимволы, сюда и будем пехать их
 * @param string $value  При обработке входящих данных в функции XAJAX необходима обработка чисто переменных
 *                            переводятся в сущности.
 *                            @see change_q_x()
 * @return mixed
 */
function __paramInit($type = 'int', $get_name = NULL, $post_name = NULL, $empty_val = NULL, $maxlen = NULL, $strip_tags = FALSE, $value = FALSE)
{
    //$value = FALSE;
    if ($get_name && isset($_GET[$get_name])) {
        if ($_GET[$get_name] !== '') {
            $value = $_GET[$get_name];
        }
    }
    if ($value === FALSE) {
        if ($post_name && isset($_POST[$post_name])) {
            if ($_POST[$post_name] !== '') {
                $value = $_POST[$post_name];
            }
        }
    }
    if ($value === FALSE) {
        return $empty_val;
    }
    if (intval($maxlen)) {
        $value = addslashes(substr(stripslashes($value), 0, intval($maxlen)));
    }
    switch ($type) {
        case 'striptrim':
            return stripslashes(trim($value));
        case 'page':
            $value = intvalPgSql($value);
            return $value <= 0 ? 1 : $value;
        case 'uinteger':
        case 'uint':
            return abs(intvalPgSql($value));
        case 'array_integer':
        case 'array_int':
            return array_map('intvalPgSql', $value);
        case 'integer':
        case 'int':
            return intvalPgSql($value);
        case 'String':
            //$value = stripslashes($value);
        //$value = stripslashes($value);
        case 'string':
            return change_q_x($value, TRUE);
        case 'string_no_slashes':
            return stripslashes(change_q_x($value, TRUE));
        case 'link':
            return change_q_x(strip_http($value), TRUE);
        case 'html':
            return $strip_tags ? change_q_x($value, FALSE, TRUE, "", false, false) : change_q_x($value, FALSE, TRUE, null, false, false);
        case 'htmltext':
            return change_q_x($value, TRUE, FALSE);
            // аналогичен 'htmltext', но оставляет теги ul, li, b, p, i
        // аналогичен 'htmltext', но оставляет теги ul, li, b, p, i
        case 'html_save_ul_li_b_p_i':
            return change_q_x($value, false, false, 'b|i|p|ul|li');
        case 'array':
            return $value;
        case 'bool':
            return !!$value;
        case 'float':
            setlocale(LC_ALL, 'en_US.UTF-8');
            return floatval($value);
        case 'money':
            setlocale(LC_ALL, 'en_US.UTF-8');
            return floatval(preg_replace('/\\s+/', '', str_replace(",", ".", $value)));
        case 'ckedit_nocut':
            $nocut = true;
        case 'ckeditor':
        case 'ckedit':
            //$value = stripslashes($value);
            $value = wysiwyg_video_replace($value, $wysiwyg_videos);
            if (hasPermissions('adm')) {
                $value = wysiwyg_image_replace($value, $wysiwyg_images);
            }
            $value = wysiwyg_code_replace($value, $wysiwyg_codes);
            $ph = md5(time()) . "_code";
            list($value, $url) = str_replace_mask('#((<a[^>]*>)(.*?)(<\\/a>))#mix', $value);
            foreach ($url as &$u) {
                $u = stripslashes($u);
                $u = cleanHref($u);
            }
            $value = preg_replace(array("~<cut\\s*?\\/>~mix", "~<\\/cut>~"), array("<cut>", ""), $value);
            // Заменяем каты
            if ($nocut) {
                // Удаляем каты
                $value = str_replace("<cut>", "", $value);
            }
            $value = str_replace(array("<br />", "<br/>", "<br>"), "___BR___", $value);
            // Заменяем переносы для сохранения следующая функция их сжирает
            // Обрабатываем отступы в теге <pre>
            $value = str_replace("\n", "__N__", $value);
            $value = preg_replace_callback('~<pre>(.*?)<\\/pre>~mix', 'rn2br', $value);
            $value = str_replace("__N__", "\n", $value);
            $value = strip_tags($value, '<a>,<strike>,<cut>,<pre>,<b>,<strong>,<em>,<u>,<i>,<p>,<ul>,<ol>,<li>,<s>,<h1>,<h2>,<h3>,<h4>,<h5>,<h6>');
            $value = change_q_x($value, FALSE, TRUE, 'strike|cut|pre|b|strong|em|u|i|p(\\s' . $ph . '_\\w*)?+|ul|ol|li|s|h[1-6]{1}', false, false);
            $value = str_replace("___BR___", "<br />", $value);
            // Возвращаем переносы
            $value = clearHTMLBeforeCutTags($value);
            $value = str_replace("<cut>", "<!-- -W-EDITOR-CUT- -->", $value);
            $value = hlcode($value);
            $tidy = new tidy();
            $value = $tidy->repairString($value, array('fix-backslash' => false, 'show-body-only' => true, 'bare' => true, 'clean' => false, 'drop-empty-paras' => false, 'preserve-entities' => true, 'wrap' => '0'), 'raw');
            $value = str_unreplace_mask($url, $value);
            $value = wysiwygLinkEncode($value);
            $value = wysiwygLinkDecode($value);
            $value = str_replace("<!-- -W-EDITOR-CUT- -->", "<cut>", $value);
            $value = str_replace("<p></p>", "<p>&nbsp;</p>", $value);
            $value = str_replace("\n", "", $value);
            /*
             * \h - горизонтальный пробельный символ. Для поддержки необходимо --PHP >= 5.2.4, PCRE >= 7.2 (на бете сейчас PCRE 6.6)
             */
            //$value = preg_replace("/[\p{Zs}]/", " ", $value);
            $value = wysiwyg_code_restore($value, $wysiwyg_codes);
            if (hasPermissions('adm')) {
                $value = wysiwyg_image_restore($value, $wysiwyg_images);
            }
            $value = wysiwyg_video_restore($value, $wysiwyg_videos);
            return $value;
            break;
        case 'wysiwyg':
        case 'wysiwyg_tidy':
        case 'wysiwyg_message':
            $value = wysiwyg_video_replace($value, $wysiwyg_videos);
            $value = wysiwyg_image_replace($value, $wysiwyg_images);
            $value = wysiwyg_code_replace($value, $wysiwyg_codes);
            $value = str_replace(array("\n", "\r"), "", $value);
            $value = preg_replace("[\r\n]", "", $value);
            $ph = md5(time()) . "_code";
            list($value, $url) = str_replace_mask('#((<a[^>]*>)(.*?)(<\\/a>))#mix', $value);
            foreach ($url as &$u) {
                $u = cleanHref($u);
            }
            //$value = preg_replace('/<p\sclass.*?code\s(\w*?).?"/si', "<p {$ph}_$1", $value);
            $value = change_q_x($value, FALSE, TRUE, 'a|strike|cut|b|strong|em|u|i|p(\\s' . $ph . '_\\w*)?+|ul|ol|li|s|h[1-6]{1}', false, false);
            $value = str_unreplace_mask($url, $value);
            $value = preg_replace("#<([^><]+?)([^a-z_\\-]on\\w*|xmlns)(\\s*=\\s*[^><]*)([><]*)#i", "<\\1\\4", $value);
            $value = preg_replace("/<br ?\\/?>/si", "\n", $value);
            $value = str_replace(array("<br />", "<br />", "&nbsp;"), array("\n", "\n", " "), $value);
            $value = clearHTMLBeforeCutTags($value);
            $value = wysiwygLinkEncode($value);
            $value = wysiwygLinkDecode($value);
            $value = preg_replace('/\\&amp;/', '&', $value);
            //$value = preg_replace('/<p\s[a-z0-9]{32}_code_(.*?)>/', '<p class="code $1">', $value);
            $value = preg_replace("/(li|ol|ul)>[\n]+/iU", "\$1>", $value);
            //$value = str_replace(array('  '), array('&nbsp;&nbsp;'), $value );
            $value = str_replace("<cut>", "<!-- -W-EDITOR-CUT- -->", $value);
            $value = str_replace("&lt;!-- -W-EDITOR-CUT- --&gt;", "<!-- -W-EDITOR-CUT- -->", $value);
            //        $value = preg_replace_callback("/<([^\s>]+)[^>](.*?)*>/si",
            //                create_function('$matches', 'return str_replace("&nbsp;", " ", $matches[0]);'),
            //            $value);
            if ($type == 'wysiwyg_message') {
                $value = preg_replace(array("/<p>/", "/<\\/p>/", "/\n+\\s*\$/"), array("", "\n\n", ""), $value);
                $value = str_replace("\n", "<br />", $value);
            } elseif ($type != 'wysiwyg_tidy') {
                $value = nl2br($value);
            }
            if ($type == 'wysiwyg_tidy') {
                //tidy
                $tidy = new tidy();
                $value = $tidy->repairString($value, array('fix-backslash' => false, 'show-body-only' => true, 'bare' => true, 'drop-empty-paras' => false, 'preserve-entities' => true, 'wrap' => '0'), 'raw');
                $value = str_replace("<p></p>", "<p>&nbsp;</p>", $value);
                $value = str_replace("\n", "", $value);
                $value = preg_replace("/\\p{Zs}/", " ", $value);
                //!tidy
            }
            $value = wysiwyg_code_restore($value, $wysiwyg_codes);
            $value = wysiwyg_image_restore($value, $wysiwyg_images);
            $value = wysiwyg_video_restore($value, $wysiwyg_videos);
            return $value;
    }
    return NULL;
}