mirror of
https://github.com/torrentpier/torrentpier
synced 2025-08-20 21:33:54 -07:00
PSR-4 compatible legacy code autoloading.
This commit is contained in:
parent
e463fee20f
commit
80a035d191
50 changed files with 5296 additions and 4522 deletions
|
@ -403,378 +403,18 @@ function add_search_words($post_id, $post_message, $topic_title = '', $only_retu
|
|||
}
|
||||
}
|
||||
|
||||
class bbcode
|
||||
{
|
||||
public $tpl = array(); // шаблоны для замены тегов
|
||||
public $smilies; // смайлы
|
||||
public $found_spam; // найденные спам "слова"
|
||||
public $del_words = array(); // см. get_words_rate()
|
||||
public $tidy_cfg = array(
|
||||
'drop-empty-paras' => false,
|
||||
'fix-uri' => false,
|
||||
'force-output' => true,
|
||||
'hide-comments' => true,
|
||||
'join-classes' => false,
|
||||
'join-styles' => false,
|
||||
'merge-divs' => false,
|
||||
'newline' => 'LF',
|
||||
'output-xhtml' => true,
|
||||
'preserve-entities' => true,
|
||||
'quiet' => true,
|
||||
'quote-ampersand' => false,
|
||||
'show-body-only' => true,
|
||||
'show-errors' => false,
|
||||
'show-warnings' => false,
|
||||
'wrap' => 0,
|
||||
);
|
||||
public $block_tags = array(
|
||||
'align',
|
||||
'br',
|
||||
'clear',
|
||||
'hr',
|
||||
'list',
|
||||
'pre',
|
||||
'quote',
|
||||
'spoiler',
|
||||
);
|
||||
public $preg = array();
|
||||
public $str = array();
|
||||
public $preg_search = array();
|
||||
public $preg_repl = array();
|
||||
public $str_search = array();
|
||||
public $str_repl = array();
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->tpl = get_bbcode_tpl();
|
||||
|
||||
$this->init_replacements();
|
||||
}
|
||||
|
||||
/**
|
||||
* init_replacements
|
||||
*/
|
||||
public function init_replacements()
|
||||
{
|
||||
$tpl = $this->tpl;
|
||||
$img_exp = '(https?:)?//[^\s\?&;=\#\"<>]+?\.(jpg|jpeg|gif|png)([a-z0-9/?&%;][^\[\]]*)?';
|
||||
$email_exp = '[a-z0-9&\-_.]+?@[\w\-]+\.([\w\-\.]+\.)?[\w]+';
|
||||
|
||||
$this->preg = array(
|
||||
'#\[quote="(.+?)"\]#isu' => $tpl['quote_username_open'],
|
||||
'#\[spoiler="(.+?)"\]#isu' => $tpl['spoiler_title_open'],
|
||||
'#\[list=(a|A|i|I|1)\]#isu' => '<ul type="$1">',
|
||||
'#\[\*=(\d+)\]#isu' => '<li value="$1">',
|
||||
'#\[pre\](.*?)\[/pre\]#isu' => '<pre class="post-pre">$1</pre>',
|
||||
'#\[name=([a-zA-Z0-9_]+?)\]#isu' => '<a name="$1"></a>',
|
||||
'#\[url=\#([a-zA-Z0-9_]+?)\](.*?)\[/url\]#isu' => '<a class="postLink-name" href="#$1">$2</a>',
|
||||
'#\[color=([\#0-9a-zA-Z]+)\]#isu' => '<span style="color: $1;">',
|
||||
'#\[size=([1-2]?[0-9])\]#isu' => '<span style="font-size: $1px; line-height: normal;">',
|
||||
'#\[align=(left|right|center|justify)\]#isu' => '<span class="post-align" style="text-align: $1;">',
|
||||
'#\[font="([\w\- \']+)"\]#isu' => '<span style="font-family: $1;">',
|
||||
"#\[img\]($img_exp)\[/img\]#isu" => $tpl['img'],
|
||||
"#\[img=(left|right|center)\]($img_exp)\[/img\]\s*#isu" => $tpl['img_aligned'],
|
||||
"#\[email\]($email_exp)\[/email\]#isu" => '<a href="mailto:$1">$1</a>',
|
||||
"#\[qpost=([0-9]*)\]#isu" => '<u class="q-post">$1</u>',
|
||||
);
|
||||
|
||||
$this->str = array(
|
||||
'[quote]' => $tpl['quote_open'],
|
||||
'[/quote]' => $tpl['quote_close'],
|
||||
'[spoiler]' => $tpl['spoiler_open'],
|
||||
'[/spoiler]' => $tpl['spoiler_close'],
|
||||
'[list]' => '<ul>',
|
||||
'[*]' => '<li>',
|
||||
'[/list]' => '</ul>',
|
||||
'[/color]' => '</span>',
|
||||
'[/size]' => '</span>',
|
||||
'[/align]' => '</span>',
|
||||
'[/font]' => '</span>',
|
||||
'[tab]' => ' ',
|
||||
'[br]' => "\n\n",
|
||||
'[hr]' => $tpl['hr'],
|
||||
'[b]' => '<span class="post-b">',
|
||||
'[/b]' => '</span>',
|
||||
'[u]' => '<span class="post-u">',
|
||||
'[/u]' => '</span>',
|
||||
'[i]' => '<span class="post-i">',
|
||||
'[/i]' => '</span>',
|
||||
'[s]' => '<span class="post-s">',
|
||||
'[/s]' => '</span>',
|
||||
'[del]' => '<span class="post-s">',
|
||||
'[/del]' => '</span>',
|
||||
'[clear]' => '<div class="clear"> </div>',
|
||||
);
|
||||
|
||||
$this->preg_search = array_keys($this->preg);
|
||||
$this->preg_repl = array_values($this->preg);
|
||||
$this->str_search = array_keys($this->str);
|
||||
$this->str_repl = array_values($this->str);
|
||||
}
|
||||
|
||||
/**
|
||||
* bbcode2html
|
||||
* $text должен быть уже обработан htmlCHR($text, false, ENT_NOQUOTES);
|
||||
*/
|
||||
public function bbcode2html($text)
|
||||
{
|
||||
global $bb_cfg;
|
||||
|
||||
$text = " $text ";
|
||||
$text = static::clean_up($text);
|
||||
$text = $this->spam_filter($text);
|
||||
|
||||
// Tag parse
|
||||
if (strpos($text, '[') !== false) {
|
||||
// [code]
|
||||
$text = preg_replace_callback('#(\s*)\[code\](.+?)\[/code\](\s*)#s', array(&$this, 'code_callback'), $text);
|
||||
|
||||
// Escape tags inside tiltes in [quote="tilte"]
|
||||
$text = preg_replace_callback('#(\[(quote|spoiler)=")(.+?)("\])#', array(&$this, 'escape_tiltes_callback'), $text);
|
||||
|
||||
// [url]
|
||||
$url_exp = '[\w\#!$%&~/.\-;:=,?@а-яА-Я()\[\]+]+?';
|
||||
$text = preg_replace_callback("#\[url\]((?:https?://)?$url_exp)\[/url\]#isu", array(&$this, 'url_callback'), $text);
|
||||
$text = preg_replace_callback("#\[url\](www\.$url_exp)\[/url\]#isu", array(&$this, 'url_callback'), $text);
|
||||
$text = preg_replace_callback("#\[url=((?:https?://)?$url_exp)\]([^?\n\t].*?)\[/url\]#isu", array(&$this, 'url_callback'), $text);
|
||||
$text = preg_replace_callback("#\[url=(www\.$url_exp)\]([^?\n\t].*?)\[/url\]#isu", array(&$this, 'url_callback'), $text);
|
||||
|
||||
// Normalize block level tags wrapped with new lines
|
||||
$block_tags = implode('|', $this->block_tags);
|
||||
$text = str_replace("\n\n[hr]\n\n", '[br][hr][br]', $text);
|
||||
$text = preg_replace("#(\s*)(\[/?($block_tags)(.*?)\])(\s*)#", '$2', $text);
|
||||
|
||||
// Tag replacements
|
||||
$text = preg_replace($this->preg_search, $this->preg_repl, $text);
|
||||
$text = str_replace($this->str_search, $this->str_repl, $text);
|
||||
}
|
||||
|
||||
$text = $this->make_clickable($text);
|
||||
$text = $this->smilies_pass($text);
|
||||
$text = $this->new_line2html($text);
|
||||
$text = trim($text);
|
||||
|
||||
if ($bb_cfg['tidy_post']) {
|
||||
$text = $this->tidy($text);
|
||||
}
|
||||
|
||||
return trim($text);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clean up
|
||||
*/
|
||||
public static function clean_up($text)
|
||||
{
|
||||
$text = trim($text);
|
||||
$text = str_replace("\r", '', $text);
|
||||
$text = preg_replace('#[ \t]+$#m', '', $text); // trailing spaces
|
||||
$text = preg_replace('#\n{3,}#', "\n\n", $text);
|
||||
return $text;
|
||||
}
|
||||
|
||||
/**
|
||||
* Spam filter
|
||||
*/
|
||||
private function spam_filter($text)
|
||||
{
|
||||
global $bb_cfg;
|
||||
static $spam_words = null;
|
||||
static $spam_replace = ' СПАМ';
|
||||
|
||||
if (isset($this)) {
|
||||
$found_spam =& $this->found_spam;
|
||||
}
|
||||
|
||||
// set $spam_words and $spam_replace
|
||||
if (!$bb_cfg['spam_filter_file_path']) {
|
||||
return $text;
|
||||
}
|
||||
if (null === $spam_words) {
|
||||
$spam_words = file_get_contents($bb_cfg['spam_filter_file_path']);
|
||||
$spam_words = strtolower($spam_words);
|
||||
$spam_words = explode("\n", $spam_words);
|
||||
}
|
||||
|
||||
$found_spam = array();
|
||||
|
||||
$tm_start = utime();
|
||||
|
||||
$msg_decoded = $text;
|
||||
$msg_decoded = html_entity_decode($msg_decoded);
|
||||
$msg_decoded = urldecode($msg_decoded);
|
||||
$msg_decoded = str_replace('&', ' &', $msg_decoded);
|
||||
|
||||
$msg_search = strtolower($msg_decoded);
|
||||
|
||||
foreach ($spam_words as $spam_str) {
|
||||
if (!$spam_str = trim($spam_str)) {
|
||||
continue;
|
||||
}
|
||||
if (strpos($msg_search, $spam_str) !== false) {
|
||||
$found_spam[] = $spam_str;
|
||||
}
|
||||
}
|
||||
if ($found_spam) {
|
||||
$spam_exp = array();
|
||||
foreach ($found_spam as $keyword) {
|
||||
$spam_exp[] = preg_quote($keyword, '/');
|
||||
}
|
||||
$spam_exp = implode('|', $spam_exp);
|
||||
|
||||
$text = preg_replace("/($spam_exp)(\S*)/i", $spam_replace, $msg_decoded);
|
||||
$text = htmlCHR($text, false, ENT_NOQUOTES);
|
||||
# bb_log(date("H:i:s") ." | ". sprintf('%.4f', (utime() - $tm_start)) ." | ". sprintf('%-6s', strlen($text)) ." | ". join(' ** ', $found_spam) ."\n", 'spam_filter');
|
||||
}
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
/**
|
||||
* [code] callback
|
||||
*/
|
||||
public function code_callback($m)
|
||||
{
|
||||
$code = trim($m[2]);
|
||||
$code = str_replace(' ', ' ', $code);
|
||||
$code = str_replace(' ', ' ', $code);
|
||||
$code = str_replace("\t", ' ', $code);
|
||||
$code = str_replace(array('[', ']', ':', ')'), array('[', ']', ':', ')'), $code);
|
||||
return $this->tpl['code_open'] . $code . $this->tpl['code_close'];
|
||||
}
|
||||
|
||||
/**
|
||||
* [url] callback
|
||||
*/
|
||||
public function url_callback($m)
|
||||
{
|
||||
global $bb_cfg;
|
||||
|
||||
$url = trim($m[1]);
|
||||
$url_name = (isset($m[2])) ? trim($m[2]) : $url;
|
||||
|
||||
if (!preg_match("#^https?://#isu", $url) && !preg_match("/^#/", $url)) {
|
||||
$url = 'http://' . $url;
|
||||
}
|
||||
|
||||
if (in_array(parse_url($url, PHP_URL_HOST), $bb_cfg['nofollow']['allowed_url']) || $bb_cfg['nofollow']['disabled']) {
|
||||
$link = "<a href=\"$url\" class=\"postLink\">$url_name</a>";
|
||||
} else {
|
||||
$link = "<a href=\"$url\" class=\"postLink\" rel=\"nofollow\">$url_name</a>";
|
||||
}
|
||||
|
||||
return $link;
|
||||
}
|
||||
|
||||
/**
|
||||
* Escape tags inside tiltes in [quote="tilte"]
|
||||
*/
|
||||
public function escape_tiltes_callback($m)
|
||||
{
|
||||
$tilte = substr($m[3], 0, 250);
|
||||
$tilte = str_replace(array('[', ']', ':', ')', '"'), array('[', ']', ':', ')', '"'), $tilte);
|
||||
// еще раз htmlspecialchars, т.к. при извлечении из title происходит обратное преобразование
|
||||
$tilte = htmlspecialchars($tilte, ENT_QUOTES);
|
||||
return $m[1] . $tilte . $m[4];
|
||||
}
|
||||
|
||||
/**
|
||||
* make_clickable
|
||||
*/
|
||||
public function make_clickable($text)
|
||||
{
|
||||
$url_regexp = "#
|
||||
(?<![\"'=])
|
||||
\b
|
||||
(
|
||||
https?://[\w\#!$%&~/.\-;:=?@а-яА-Я()\[\]+]+
|
||||
)
|
||||
(?![\"']|\[/url|\[/img|</a)
|
||||
(?=[,!]?\s|[\)<!])
|
||||
#xiu";
|
||||
|
||||
// pad it with a space so we can match things at the start of the 1st line.
|
||||
$ret = " $text ";
|
||||
|
||||
// hide passkey
|
||||
$ret = hide_passkey($ret);
|
||||
|
||||
// matches an "xxxx://yyyy" URL at the start of a line, or after a space.
|
||||
$ret = preg_replace_callback($url_regexp, array(&$this, 'make_url_clickable_callback'), $ret);
|
||||
|
||||
// Remove our padding..
|
||||
$ret = substr(substr($ret, 0, -1), 1);
|
||||
|
||||
return ($ret);
|
||||
}
|
||||
|
||||
/**
|
||||
* make_url_clickable_callback
|
||||
*/
|
||||
public function make_url_clickable_callback($m)
|
||||
{
|
||||
global $bb_cfg;
|
||||
|
||||
$max_len = 70;
|
||||
$href = $m[1];
|
||||
$name = (mb_strlen($href, 'UTF-8') > $max_len) ? mb_substr($href, 0, $max_len - 19) . '...' . mb_substr($href, -16) : $href;
|
||||
|
||||
if (in_array(parse_url($href, PHP_URL_HOST), $bb_cfg['nofollow']['allowed_url']) || $bb_cfg['nofollow']['disabled']) {
|
||||
$link = "<a href=\"$href\" class=\"postLink\">$name</a>";
|
||||
} else {
|
||||
$link = "<a href=\"$href\" class=\"postLink\" rel=\"nofollow\">$name</a>";
|
||||
}
|
||||
|
||||
return $link;
|
||||
}
|
||||
|
||||
/**
|
||||
* smilies_pass
|
||||
*/
|
||||
public function smilies_pass($text)
|
||||
{
|
||||
global $datastore;
|
||||
|
||||
if (null === $this->smilies) {
|
||||
$this->smilies = $datastore->get('smile_replacements');
|
||||
}
|
||||
if ($this->smilies) {
|
||||
$parsed_text = preg_replace($this->smilies['orig'], $this->smilies['repl'], $text, 101, $smilies_cnt);
|
||||
$text = ($smilies_cnt <= 100) ? $parsed_text : $text;
|
||||
}
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
/**
|
||||
* new_line2html
|
||||
*/
|
||||
public function new_line2html($text)
|
||||
{
|
||||
$text = preg_replace('#\n{2,}#', '<span class="post-br"><br /></span>', $text);
|
||||
$text = str_replace("\n", '<br />', $text);
|
||||
return $text;
|
||||
}
|
||||
|
||||
/**
|
||||
* tidy
|
||||
*/
|
||||
public function tidy($text)
|
||||
{
|
||||
$text = tidy_repair_string($text, $this->tidy_cfg, 'utf8');
|
||||
return $text;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @deprecated bb_code
|
||||
* Dirty class removed from here since 2.1.6
|
||||
* To add new bbcodes see at src/Legacy/BBCode.php
|
||||
*/
|
||||
|
||||
function bbcode2html($text)
|
||||
{
|
||||
global $bbcode;
|
||||
|
||||
if (!isset($bbcode)) {
|
||||
$bbcode = new bbcode();
|
||||
$bbcode = new TorrentPier\Legacy\BBCode();
|
||||
}
|
||||
$orig_word = array();
|
||||
$replacement_word = array();
|
||||
|
@ -785,81 +425,11 @@ function bbcode2html($text)
|
|||
return $bbcode->bbcode2html($text);
|
||||
}
|
||||
|
||||
class words_rate
|
||||
{
|
||||
public $dbg_mode = false;
|
||||
public $words_rate = 0;
|
||||
public $deleted_words = array();
|
||||
public $del_text_hl = '';
|
||||
public $words_del_exp = '';
|
||||
public $words_cnt_exp = '#[a-zA-Zа-яА-ЯёЁ]{4,}#';
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
// слова начинающиеся на..
|
||||
$del_list = file_get_contents(BB_ROOT . '/library/words_rate_del_list.txt');
|
||||
$del_list = str_compact($del_list);
|
||||
$del_list = str_replace(' ', '|', preg_quote($del_list, '/'));
|
||||
$del_exp = '/\b(' . $del_list . ')[\w\-]*/i';
|
||||
|
||||
$this->words_del_exp = $del_exp;
|
||||
}
|
||||
|
||||
/**
|
||||
* возвращает "показатель полезности" сообщения используемый для автоудаления коротких сообщений типа "спасибо", "круто" и т.д.
|
||||
*/
|
||||
public function get_words_rate($text)
|
||||
{
|
||||
$this->words_rate = 127; // максимальное значение по умолчанию
|
||||
$this->deleted_words = array();
|
||||
$this->del_text_hl = $text;
|
||||
|
||||
// длинное сообщение
|
||||
if (strlen($text) > 600) {
|
||||
return $this->words_rate;
|
||||
}
|
||||
// вырезаем цитаты если содержит +1
|
||||
if (preg_match('#\+\d+#', $text)) {
|
||||
$text = strip_quotes($text);
|
||||
}
|
||||
// содержит ссылку
|
||||
if (strpos($text, '://')) {
|
||||
return $this->words_rate;
|
||||
}
|
||||
// вопрос
|
||||
if ($questions = preg_match_all('#\w\?+#', $text, $m)) {
|
||||
if ($questions >= 1) {
|
||||
return $this->words_rate;
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->dbg_mode) {
|
||||
preg_match_all($this->words_del_exp, $text, $this->deleted_words);
|
||||
$text_dbg = preg_replace($this->words_del_exp, '<span class="del-word">$0</span>', $text);
|
||||
$this->del_text_hl = '<div class="prune-post">' . $text_dbg . '</div>';
|
||||
}
|
||||
$text = preg_replace($this->words_del_exp, '', $text);
|
||||
|
||||
// удаление смайлов
|
||||
$text = preg_replace('#:\w+:#', '', $text);
|
||||
// удаление bbcode тегов
|
||||
$text = preg_replace('#\[\S+\]#', '', $text);
|
||||
|
||||
$words_count = preg_match_all($this->words_cnt_exp, $text, $m);
|
||||
|
||||
if ($words_count !== false && $words_count < 127) {
|
||||
$this->words_rate = ($words_count == 0) ? 1 : $words_count;
|
||||
}
|
||||
|
||||
return $this->words_rate;
|
||||
}
|
||||
}
|
||||
|
||||
function get_words_rate($text)
|
||||
{
|
||||
static $wr = null;
|
||||
if (!isset($wr)) {
|
||||
$wr = new words_rate();
|
||||
$wr = new TorrentPier\Legacy\WordsRate();
|
||||
}
|
||||
return $wr->get_words_rate($text);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue