mirror of
https://github.com/e107inc/e107.git
synced 2025-08-01 12:20:44 +02:00
Legacy textparse class removed. Separate emote and profanity classes.
This commit is contained in:
@@ -43,11 +43,7 @@ class bb_code extends e_bb_base
|
||||
|
||||
if($pref['smiley_activate'])
|
||||
{
|
||||
if (!is_object($tp->e_emote))
|
||||
{
|
||||
$tp->e_emote = new e_emoteFilter;
|
||||
}
|
||||
$code_text = $tp->e_emote->filterEmotesRev($code_text);
|
||||
$code_text = e107::getEmote()->filterEmotesRev($code_text);
|
||||
}
|
||||
|
||||
$search = array(E_NL,'\','$', '<');
|
||||
|
@@ -388,7 +388,7 @@ class bbcode_shortcodes extends e_shortcode
|
||||
|
||||
function renderEmotes()
|
||||
{
|
||||
$emotes = e107::getParser()->getEmotes();
|
||||
$emotes = e107::getEmote()->getList();
|
||||
$pref = e107::getPref();
|
||||
$text = "";
|
||||
|
||||
|
@@ -402,6 +402,8 @@ if (!function_exists('asortbyindex'))
|
||||
asort ($sort_values);
|
||||
reset ($sort_values);
|
||||
|
||||
$sorted_arr = array();
|
||||
|
||||
foreach($sort_values as $arr_key =>$arr_val)
|
||||
{
|
||||
$sorted_arr[] = $array[$arr_key];
|
||||
@@ -418,21 +420,17 @@ if (!function_exists('r_emote'))
|
||||
*/
|
||||
function r_emote()
|
||||
{
|
||||
global $sysprefs, $pref;
|
||||
$tp = e107::getParser();
|
||||
|
||||
if (!is_object($tp->e_emote))
|
||||
{
|
||||
// require_once(e_HANDLER.'emote_filter.php');
|
||||
$tp->e_emote = new e_emoteFilter;
|
||||
}
|
||||
|
||||
|
||||
$pack = e107::getPref('emotepack');
|
||||
|
||||
$list = e107::getEmote()->getList();
|
||||
|
||||
$str = '';
|
||||
foreach($tp->e_emote->emotes as $key => $value) // filename => text code
|
||||
foreach($list as $key => $value) // filename => text code
|
||||
{
|
||||
$key = str_replace("!", ".", $key); // Usually '.' was replaced by '!' when saving
|
||||
$key = preg_replace("#_(\w{3})$#", ".\\1", $key); // '_' followed by exactly 3 chars is file extension
|
||||
$key = e_IMAGE_ABS."emotes/" . $pref['emotepack'] . "/" .$key; // Add in the file path
|
||||
$key = e_IMAGE_ABS."emotes/" . $pack . "/" .$key; // Add in the file path
|
||||
|
||||
$value2 = substr($value, 0, strpos($value, " "));
|
||||
$value = ($value2 ? $value2 : $value);
|
||||
@@ -509,6 +507,7 @@ if (!function_exists('multiarray_sort'))
|
||||
$key = is_numeric($arr_key) ? "" : $arr_key; // retain assoc-array keys.
|
||||
$sorted_arr[$key] = $array[$arr_key];
|
||||
}*/
|
||||
$sorted_arr = array();
|
||||
|
||||
foreach($sort_values as $arr_key=>$arr_val)
|
||||
{
|
||||
|
@@ -192,6 +192,7 @@ class e107
|
||||
'e_bbcode' => '{e_HANDLER}bbcode_handler.php',
|
||||
'e_bb_base' => '{e_HANDLER}bbcode_handler.php',
|
||||
'e_customfields' => '{e_HANDLER}e_customfields_class.php',
|
||||
'e_emote' => '{e_HANDLER}e_emote_class.php',
|
||||
'e_file' => '{e_HANDLER}file_class.php',
|
||||
'e_file_inspector_json_phar' => '{e_HANDLER}e_file_inspector_json_phar.php',
|
||||
'e_form' => '{e_HANDLER}form_handler.php',
|
||||
@@ -209,6 +210,7 @@ class e107
|
||||
'e_parser' => '{e_HANDLER}e_parse_class.php',
|
||||
'e_parse_shortcode' => '{e_HANDLER}shortcode_handler.php',
|
||||
'e_plugin' => '{e_HANDLER}plugin_class.php',
|
||||
'e_profanity' => '{e_HANDLER}e_profanity_class.php',
|
||||
'e_ranks' => '{e_HANDLER}e_ranks_class.php',
|
||||
'e_shortcode' => '{e_HANDLER}shortcode_handler.php',
|
||||
'e_system_user' => '{e_HANDLER}user_model.php',
|
||||
@@ -3994,6 +3996,26 @@ class e107
|
||||
return self::getSingleton('error_page');
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve e_emote filter .
|
||||
*
|
||||
* @return e_emote
|
||||
*/
|
||||
public static function getEmote()
|
||||
{
|
||||
return self::getSingleton('e_emote');
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve Profanity filter .
|
||||
*
|
||||
* @return e_profanity
|
||||
*/
|
||||
public static function getProfanity()
|
||||
{
|
||||
return self::getSingleton('e_profanity');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Parses an array into a valid, rawurlencoded query string. This differs from http_build_query() as we need to
|
||||
|
133
e107_handlers/e_emote_class.php
Normal file
133
e107_handlers/e_emote_class.php
Normal file
@@ -0,0 +1,133 @@
|
||||
<?php
|
||||
|
||||
|
||||
class e_emote
|
||||
{
|
||||
|
||||
private $search = array();
|
||||
private $replace = array();
|
||||
public $emotes;
|
||||
private $singleSearch = array();
|
||||
private $singleReplace = array();
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
|
||||
$pref = e107::getPref();
|
||||
|
||||
if(empty($pref['emotepack']))
|
||||
{
|
||||
$pref['emotepack'] = 'default';
|
||||
e107::getConfig('emote')->clearPrefCache('emote');
|
||||
e107::getConfig('core')->set('emotepack', 'default')->save(false, true, false);
|
||||
}
|
||||
|
||||
$this->emotes = e107::getConfig('emote')->getPref();
|
||||
|
||||
if(empty($this->emotes))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$base = defined('e_HTTP_STATIC') && is_string(e_HTTP_STATIC) ? e_HTTP_STATIC : SITEURLBASE;
|
||||
|
||||
foreach($this->emotes as $key => $value)
|
||||
{
|
||||
|
||||
$value = trim($value);
|
||||
|
||||
if($value)
|
||||
{ // Only 'activate' emote if there's a substitution string set
|
||||
|
||||
|
||||
$key = preg_replace("#!(\w{3,}?)$#si", ".\\1", $key);
|
||||
// Next two probably to sort out legacy issues - may not be required any more
|
||||
// $key = preg_replace("#_(\w{3})$#", ".\\1", $key);
|
||||
|
||||
$key = str_replace('!', '_', $key);
|
||||
|
||||
$filename = e_IMAGE . 'emotes/' . $pref['emotepack'] . '/' . $key;
|
||||
|
||||
|
||||
$fileloc = $base . e_IMAGE_ABS . 'emotes/' . $pref['emotepack'] . '/' . $key;
|
||||
|
||||
$alt = str_replace(array('.png', '.gif', '.jpg'), '', $key);
|
||||
|
||||
if(file_exists($filename))
|
||||
{
|
||||
$tmp = explode(' ', $value);
|
||||
foreach($tmp as $code)
|
||||
{
|
||||
$img = "<img class='e-emoticon' src='" . $fileloc . "' alt=\"" . $alt . '" />';
|
||||
|
||||
$this->search[] = "\n" . $code;
|
||||
$this->replace[] = "\n" . $img;
|
||||
|
||||
$this->search[] = ' ' . $code;
|
||||
$this->replace[] = ' ' . $img;
|
||||
|
||||
$this->search[] = '>' . $code; // Fix for emote within html.
|
||||
$this->replace[] = '>' . $img;
|
||||
|
||||
$this->singleSearch[] = $code;
|
||||
$this->singleReplace[] = $img;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
unset($this->emotes[$key]);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
// print_a($this->regSearch);
|
||||
// print_a($this->regReplace);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a list of the available emoticons.
|
||||
* @return array
|
||||
*/
|
||||
public function getList()
|
||||
{
|
||||
|
||||
return $this->emotes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $text
|
||||
* @return string
|
||||
*/
|
||||
public function filterEmotes($text)
|
||||
{
|
||||
|
||||
if(empty($text))
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
if(!empty($this->singleSearch) && (strlen($text) < 12) && in_array($text, $this->singleSearch)) // just one emoticon with no space, line-break or html tags around it.
|
||||
{
|
||||
return str_replace($this->singleSearch, $this->singleReplace, $text);
|
||||
}
|
||||
|
||||
return str_replace($this->search, $this->replace, $text);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param $text
|
||||
* @return string|string[]
|
||||
*/
|
||||
public function filterEmotesRev($text)
|
||||
{
|
||||
|
||||
return str_replace($this->replace, $this->search, $text);
|
||||
}
|
||||
|
||||
}
|
@@ -1592,12 +1592,7 @@ class e_parse extends e_parser
|
||||
// Convert emoticons to graphical icons, if enabled
|
||||
if ($opts['emotes'])
|
||||
{
|
||||
if (!is_object($this->e_emote))
|
||||
{
|
||||
// require_once(e_HANDLER.'emote_filter.php');
|
||||
$this->e_emote = new e_emoteFilter;
|
||||
}
|
||||
$sub_blk = $this->e_emote->filterEmotes($sub_blk);
|
||||
$sub_blk = e107::getEmote()->filterEmotes($sub_blk);
|
||||
}
|
||||
|
||||
|
||||
@@ -2207,7 +2202,7 @@ class e_parse extends e_parser
|
||||
* @param string $text
|
||||
* @return mixed|string
|
||||
*/
|
||||
public function ampEncode($text='')
|
||||
private function ampEncode($text='')
|
||||
{
|
||||
// Fix any left-over '&'
|
||||
//first revert any previously converted.
|
||||
@@ -3014,7 +3009,7 @@ class e_parse extends e_parser
|
||||
|
||||
public function getEmotes()
|
||||
{
|
||||
return $this->e_emote->emotes;
|
||||
return e107::getEmote()->getList();
|
||||
}
|
||||
|
||||
|
||||
@@ -3236,7 +3231,7 @@ class e_parse extends e_parser
|
||||
}
|
||||
|
||||
|
||||
public function doReplace($matches)
|
||||
private function doReplace($matches)
|
||||
{
|
||||
if(defined($matches[1]) && (deftrue('ADMIN') || strpos($matches[1], 'ADMIN') === FALSE))
|
||||
{
|
||||
@@ -5343,253 +5338,3 @@ class e_parser
|
||||
}
|
||||
|
||||
|
||||
|
||||
class e_emotefilter
|
||||
{
|
||||
private $search = array();
|
||||
private $replace = array();
|
||||
public $emotes;
|
||||
private $singleSearch = array();
|
||||
private $singleReplace = array();
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$pref = e107::getPref();
|
||||
|
||||
if(empty($pref['emotepack']))
|
||||
{
|
||||
$pref['emotepack'] = 'default';
|
||||
e107::getConfig('emote')->clearPrefCache('emote');
|
||||
e107::getConfig('core')->set('emotepack','default')->save(false,true,false);
|
||||
}
|
||||
|
||||
$this->emotes = e107::getConfig('emote')->getPref();
|
||||
|
||||
if(empty($this->emotes))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$base = defined('e_HTTP_STATIC') && is_string(e_HTTP_STATIC) ? e_HTTP_STATIC : SITEURLBASE;
|
||||
|
||||
foreach($this->emotes as $key => $value)
|
||||
{
|
||||
|
||||
$value = trim($value);
|
||||
|
||||
if ($value)
|
||||
{ // Only 'activate' emote if there's a substitution string set
|
||||
|
||||
|
||||
$key = preg_replace("#!(\w{3,}?)$#si", ".\\1", $key);
|
||||
// Next two probably to sort out legacy issues - may not be required any more
|
||||
// $key = preg_replace("#_(\w{3})$#", ".\\1", $key);
|
||||
|
||||
$key = str_replace('!', '_', $key);
|
||||
|
||||
$filename = e_IMAGE. 'emotes/' . $pref['emotepack'] . '/' . $key;
|
||||
|
||||
|
||||
|
||||
$fileloc = $base.e_IMAGE_ABS. 'emotes/' . $pref['emotepack'] . '/' . $key;
|
||||
|
||||
$alt = str_replace(array('.png','.gif', '.jpg'),'', $key);
|
||||
|
||||
if(file_exists($filename))
|
||||
{
|
||||
$tmp = explode(' ', $value);
|
||||
foreach($tmp as $code)
|
||||
{
|
||||
$img = "<img class='e-emoticon' src='".$fileloc."' alt=\"".$alt. '" />';
|
||||
|
||||
$this->search[] = "\n".$code;
|
||||
$this->replace[] = "\n".$img;
|
||||
|
||||
$this->search[] = ' ' .$code;
|
||||
$this->replace[] = ' ' .$img;
|
||||
|
||||
$this->search[] = '>' .$code; // Fix for emote within html.
|
||||
$this->replace[] = '>' .$img;
|
||||
|
||||
$this->singleSearch[] = $code;
|
||||
$this->singleReplace[] = $img;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
if(strstr($value, " "))
|
||||
{
|
||||
$tmp = explode(" ", $value);
|
||||
foreach($tmp as $code)
|
||||
{
|
||||
$this->search[] = " ".$code;
|
||||
$this->search[] = "\n".$code;
|
||||
|
||||
$this->replace[] = " <img class='e-emoticon' src='".$fileloc."' alt=\"".$alt."\" /> ";
|
||||
$this->replace[] = "\n <img class='e-emoticon' src='".$fileloc."'alt=\"".$alt."\" /> ";
|
||||
}
|
||||
unset($tmp);
|
||||
}
|
||||
else
|
||||
{
|
||||
if($value)
|
||||
{
|
||||
$this->search[] = " ".$value;
|
||||
$this->search[] = "\n".$value;
|
||||
|
||||
$this->replace[] = " <img class='e-emoticon' src='".$fileloc."' alt=\"".$alt."\" /> ";
|
||||
$this->replace[] = "\n <img class='e-emoticon' src='".$fileloc."' alt=\"".$alt."\" /> ";
|
||||
}
|
||||
}*/
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
unset($this->emotes[$key]);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
// print_a($this->regSearch);
|
||||
// print_a($this->regReplace);
|
||||
|
||||
}
|
||||
|
||||
|
||||
public function filterEmotes($text)
|
||||
{
|
||||
|
||||
if(empty($text))
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
if(!empty($this->singleSearch) && (strlen($text) < 12) && in_array($text, $this->singleSearch)) // just one emoticon with no space, line-break or html tags around it.
|
||||
{
|
||||
return str_replace($this->singleSearch,$this->singleReplace,$text);
|
||||
}
|
||||
|
||||
return str_replace($this->search, $this->replace, $text);
|
||||
|
||||
}
|
||||
|
||||
|
||||
public function filterEmotesRev($text)
|
||||
{
|
||||
return str_replace($this->replace, $this->search, $text);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class e_profanityFilter
|
||||
{
|
||||
protected $profanityList;
|
||||
private $pref;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
|
||||
$this->pref = e107::getPref();
|
||||
|
||||
if(empty($this->pref['profanity_words']))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
$words = explode(',', $this->pref['profanity_words']);
|
||||
$word_array = array();
|
||||
foreach($words as $word)
|
||||
{
|
||||
$word = trim($word);
|
||||
if($word != '')
|
||||
{
|
||||
$word_array[] = $word;
|
||||
if (strpos($word, '$') !== FALSE)
|
||||
{
|
||||
$word_array[] = str_replace('$', '\$', $word); // Special case - '$' may be 'in clear' or as entity
|
||||
}
|
||||
}
|
||||
}
|
||||
if(count($word_array))
|
||||
{
|
||||
$this->profanityList = str_replace('#','\#',implode("\b|\b", $word_array)); // We can get entities in the string - confuse the regex delimiters
|
||||
}
|
||||
unset($words);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
public function filterProfanities($text)
|
||||
{
|
||||
|
||||
if (empty($this->profanityList))
|
||||
{
|
||||
return $text;
|
||||
}
|
||||
|
||||
if(!empty($this->pref['profanity_replace']))
|
||||
{
|
||||
return preg_replace("#\b".$this->profanityList."\b#is", $this->pref['profanity_replace'], $text);
|
||||
}
|
||||
|
||||
return preg_replace_callback("#\b".$this->profanityList."\b#is", array($this, 'replaceProfanities'), $text);
|
||||
}
|
||||
|
||||
public function replaceProfanities($matches)
|
||||
{
|
||||
/*!
|
||||
@function replaceProfanities callback
|
||||
@abstract replaces vowels in profanity words with stars
|
||||
@param text string - text string to be filtered
|
||||
@result filtered text
|
||||
*/
|
||||
|
||||
return preg_replace('#a|e|i|o|u#i', '*', $matches[0]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Backwards Compatibility Class textparse
|
||||
*/
|
||||
class textparse {
|
||||
|
||||
public function editparse($text, $mode = 'off')
|
||||
{
|
||||
trigger_error('<b>'.__METHOD__.' is deprecated. Use e107::getParser()->toForm($text) instead. ', E_USER_DEPRECATED);
|
||||
|
||||
return e107::getParser()->toForm($text);
|
||||
}
|
||||
|
||||
public function tpa($text, $mode = '', $referrer = '', $highlight_search = false, $poster_id = '')
|
||||
{
|
||||
trigger_error('<b>'.__METHOD__.' is deprecated. Use e107::getParser()->toHTML($text) instead. ', E_USER_DEPRECATED);
|
||||
|
||||
return e107::getParser()->toHTML($text, true, $mode, $poster_id);
|
||||
}
|
||||
|
||||
public function tpj($text)
|
||||
{
|
||||
trigger_error('<b>'.__METHOD__.' is deprecated. ', E_USER_DEPRECATED);
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
public function formtpa($text, $mode = '')
|
||||
{
|
||||
trigger_error('<b>'.__METHOD__.' is deprecated. Use e107::getParser()->toDB($text) instead. ', E_USER_DEPRECATED);
|
||||
|
||||
unset($mode); // keep PHPStorm happy
|
||||
|
||||
return e107::getParser()->toDB($text);
|
||||
}
|
||||
|
||||
public function formtparev($text)
|
||||
{
|
||||
trigger_error('<b>'.__METHOD__.' is deprecated. Use e107::getParser()->toForm($text) instead. ', E_USER_DEPRECATED);
|
||||
|
||||
return e107::getParser()->toForm($text);
|
||||
}
|
||||
|
||||
}
|
80
e107_handlers/e_profanity_class.php
Normal file
80
e107_handlers/e_profanity_class.php
Normal file
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
|
||||
|
||||
class e_profanity
|
||||
{
|
||||
|
||||
protected $profanityList;
|
||||
private $pref;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
|
||||
$this->pref = e107::getPref();
|
||||
|
||||
if(empty($this->pref['profanity_words']))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
$words = explode(',', $this->pref['profanity_words']);
|
||||
$word_array = array();
|
||||
foreach($words as $word)
|
||||
{
|
||||
$word = trim($word);
|
||||
if($word != '')
|
||||
{
|
||||
$word_array[] = $word;
|
||||
if(strpos($word, '$') !== false)
|
||||
{
|
||||
$word_array[] = str_replace('$', '\$', $word); // Special case - '$' may be 'in clear' or as entity
|
||||
}
|
||||
}
|
||||
}
|
||||
if(count($word_array))
|
||||
{
|
||||
$this->profanityList = str_replace('#', '\#', implode("\b|\b", $word_array)); // We can get entities in the string - confuse the regex delimiters
|
||||
}
|
||||
unset($words);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $text
|
||||
* @return string|string[]|null
|
||||
*/
|
||||
public function filterProfanities($text)
|
||||
{
|
||||
|
||||
if(empty($this->profanityList))
|
||||
{
|
||||
return $text;
|
||||
}
|
||||
|
||||
if(!empty($this->pref['profanity_replace']))
|
||||
{
|
||||
return preg_replace("#\b" . $this->profanityList . "\b#is", $this->pref['profanity_replace'], $text);
|
||||
}
|
||||
|
||||
return preg_replace_callback("#\b" . $this->profanityList . "\b#is", array($this, 'replaceProfanities'), $text);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param $matches
|
||||
* @return string|string[]|null
|
||||
*/
|
||||
public function replaceProfanities($matches)
|
||||
{
|
||||
|
||||
/*!
|
||||
@function replaceProfanities callback
|
||||
@abstract replaces vowels in profanity words with stars
|
||||
@param text string - text string to be filtered
|
||||
@result filtered text
|
||||
*/
|
||||
|
||||
return preg_replace('#a|e|i|o|u#i', '*', $matches[0]);
|
||||
}
|
||||
}
|
@@ -499,6 +499,12 @@ while($row = $sql->fetch())
|
||||
$result = $this->tp->post_toForm($text);
|
||||
$this->assertSame($expected, $result);
|
||||
|
||||
$array = array($text);
|
||||
$arrayExp = array($expected);
|
||||
$result = $this->tp->post_toForm($array);
|
||||
$this->assertSame($arrayExp, $result);
|
||||
|
||||
|
||||
}
|
||||
/*
|
||||
public function testHtml_truncate()
|
||||
|
Reference in New Issue
Block a user