/** * Основная функция для форматирования текстов на выходе. * * @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(' – ', ' — ', ' <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(' ', ' ', $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(' ', ' ', $out, $cnt); } while ($cnt && --$mx >= 0); if ($out[0] == ' ') { $out = ' ' . 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; }
/** * Корректная инициализация переданных параметров 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> </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 />", " "), array("\n", "\n", " "), $value); $value = clearHTMLBeforeCutTags($value); $value = wysiwygLinkEncode($value); $value = wysiwygLinkDecode($value); $value = preg_replace('/\\&/', '&', $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(' '), $value ); $value = str_replace("<cut>", "<!-- -W-EDITOR-CUT- -->", $value); $value = str_replace("<!-- -W-EDITOR-CUT- -->", "<!-- -W-EDITOR-CUT- -->", $value); // $value = preg_replace_callback("/<([^\s>]+)[^>](.*?)*>/si", // create_function('$matches', 'return str_replace(" ", " ", $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> </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; }