From f80d611202fc46f1deacd3058f80cf01c69f46f8 Mon Sep 17 00:00:00 2001 From: Cameron Date: Tue, 15 Dec 2020 08:59:31 -0800 Subject: [PATCH] Bbcode code optimization and test. --- e107_core/bbcodes/bb_img.php | 518 ++++++++++--------- e107_handlers/pop3_class.php | 2 +- e107_handlers/user_extended_class.php | 5 +- e107_plugins/download/includes/admin.php | 2 +- e107_plugins/log/admin_config.php | 2 +- e107_plugins/log/consolidate.php | 2 +- e107_plugins/log/stats.php | 2 +- e107_plugins/newsletter/admin_config.php | 2 +- e107_tests/tests/unit/bbcodes/bb_imgTest.php | 79 +++ e107_tests/tests/unit/e_parseTest.php | 20 +- 10 files changed, 378 insertions(+), 256 deletions(-) create mode 100644 e107_tests/tests/unit/bbcodes/bb_imgTest.php diff --git a/e107_core/bbcodes/bb_img.php b/e107_core/bbcodes/bb_img.php index d78ba50dd..b3832b467 100644 --- a/e107_core/bbcodes/bb_img.php +++ b/e107_core/bbcodes/bb_img.php @@ -11,276 +11,300 @@ // Currently defaults class to 'floatnone' - overridden by bbcode -if (!defined('e107_INIT')) { exit; } - -class bb_img extends e_bb_base -{ - function toDB($code_text, $parm) + if(!defined('e107_INIT')) { - $parms = eHelper::scParams($parm); - $safe = array(); - - if(!empty($parms['class'])) $safe['class'] = eHelper::secureClassAttr($parms['class']); - if(!empty($parms['id'])) $safe['id'] = eHelper::secureIdAttr($parms['id']); - if(!empty($parms['style'])) $safe['style'] = eHelper::secureStyleAttr($parms['style']); - if(!empty($parms['alt'])) $safe['alt'] = e107::getParser()->filter($parms['alt']); - if(isset($parms['width'])) $safe['width'] = (int) $parms['width']; - - if(!empty($safe)) - { - return '[img '.eHelper::buildAttr($safe).']'.$code_text.'[/img]'; - } - - return '[img]'.$code_text.'[/img]'; + exit; } - /** - * Media Manager bbcode. eg. using {e_MEDIA_IMAGE} and auto-resizing. - * @param $code_text - * @param $parm - * @return string tag with resized image. - */ - private function mediaImage($code_text,$parm) - { - $tp = e107::getParser(); - - // Replace the bbcode path with a real one. - $code_text = str_replace('{e_MEDIA}images/','{e_MEDIA_IMAGE}',$code_text); //BC 0.8 fix. - // $code_text = str_replace('{e_MEDIA_IMAGE}', e_HTTP."thumb.php?src=e_MEDIA_IMAGE/", $code_text); - // $code_text = str_replace('{e_THEME}', e_HTTP."thumb.php?src=e_THEME/", $code_text); - $imgParms = $this->processParm($code_text, $parm); - $figcaption = false; + class bb_img extends e_bb_base + { - if(!empty($imgParms['figcaption'])) - { - $figcaption = $imgParms['figcaption']; - unset($imgParms['figcaption']); - } - - - foreach($imgParms as $k => $v) - { - // $parmStr .= " ".$k.'="'.$v.'"'; - if($v !== '') - { - $p[] = $tp->toAttribute($k).'="'.$tp->toAttribute($v).'"'; - } - } - - $resizeWidth = e107::getBB()->resizeWidth(); - $w = vartrue($imgParms['width']) ? intval($imgParms['width']) : vartrue($resizeWidth,0); - // $h = vartrue($imgParms['height']) ? intval($imgParms['height']) : e107::getBB()->resizeHeight(); - - // $resize = "&w=".$w; // Always resize - otherwise the thumbnailer returns nothing. - // $parmStr = implode(" ",$p); - - - - // $url = e107::getParser()->thumbUrl($code_text, $resize); - - $imgParms['w'] = $w; - - if(!empty($figcaption)) + function toDB($code_text, $parm) { - $html = "
\n"; - // $html .= ""; - $html .= $tp->toImage($code_text, $imgParms); - $html .= "
".e107::getParser()->filter($figcaption)."
\n"; - $html .= "
"; - return $html; + $parms = eHelper::scParams($parm); + $safe = array(); + + if(!empty($parms['class'])) + { + $safe['class'] = eHelper::secureClassAttr($parms['class']); + } + if(!empty($parms['id'])) + { + $safe['id'] = eHelper::secureIdAttr($parms['id']); + } + if(!empty($parms['style'])) + { + $safe['style'] = eHelper::secureStyleAttr($parms['style']); + } + if(!empty($parms['alt'])) + { + $safe['alt'] = e107::getParser()->filter($parms['alt']); + } + if(isset($parms['width'])) + { + $safe['width'] = (int) $parms['width']; + } + + if(!empty($safe)) + { + return '[img ' . eHelper::buildAttr($safe) . ']' . $code_text . '[/img]'; + } + + return '[img]' . $code_text . '[/img]'; } - else + + /** + * Media Manager bbcode. eg. using {e_MEDIA_IMAGE} and auto-resizing. + * + * @param $code_text + * @param $parm + * @return string tag with resized image. + */ + private function mediaImage($code_text, $parm) { + + $tp = e107::getParser(); + + // Replace the bbcode path with a real one. + $code_text = str_replace('{e_MEDIA}images/', '{e_MEDIA_IMAGE}', $code_text); //BC 0.8 fix. + + $imgParms = $this->processParm($code_text, $parm); + + $figcaption = false; + + if(!empty($imgParms['figcaption'])) + { + $figcaption = $imgParms['figcaption']; + unset($imgParms['figcaption']); + } + + $resizeWidth = e107::getBB()->resizeWidth(); + + $w = !empty($imgParms['width']) ? (int) $imgParms['width'] : vartrue($resizeWidth, 0); + + $imgParms['w'] = $w; + + if(!empty($figcaption)) + { + $html = "
\n"; + // $html .= ""; + $html .= $tp->toImage($code_text, $imgParms); + $html .= "
" . e107::getParser()->filter($figcaption) . "
\n"; + $html .= "
"; + + return $html; + } + return $tp->toImage($code_text, $imgParms); - // return ""; + } - } - /** - * Process the [img] bbcode parm. ie. [img parms]something[/img] - * @param $code_text - * @param $parm - * @param string $mode - * @return array|string - */ - private function processParm($code_text, $parm, $mode='') - { + /** + * Process the [img] bbcode parm. ie. [img parms]something[/img] + * + * @param string $code_text + * @param string $parm + * @param string $mode + * @return array|string + */ + private function processParm($code_text, $parm, $mode = '') + { - $tp = e107::getParser(); - $imgParms = array(); + $tp = e107::getParser(); + $imgParms = array(); - $parm = preg_replace('#onerror *=#i','',$parm); - $parm = str_replace("amp;", "&", $parm); - - // $parm = str_replace(" ","&",$parm); // Needed as parse_str() doesn't know how to handle spaces. Could return [width] => '400 AltValue' - - parse_str($parm,$imgParms); - - if(!vartrue($imgParms['width']) && strpos($parm,'width')!==false) // Calculate thumbnail width from style. - { - preg_match("/width:([\d]*)[p|x|%|;]*/i", $parm, $m); - if($m[1] > 0) + $parm = preg_replace('#onerror *=#i', '', $parm); + $parm = str_replace("amp;", "&", $parm); + + // $parm = str_replace(" ","&",$parm); // Needed as parse_str() doesn't know how to handle spaces. Could return [width] => '400 AltValue' + + parse_str($parm, $imgParms); + + + if(empty($imgParms['width']) && strpos($parm, 'width') !== false) // Calculate thumbnail width from style. { - $imgParms['width'] = $m[1]; - $imgParms['style'] = str_replace($m[0],'',$imgParms['style']); // strip hard-coded width styling. - } - } - - if(!vartrue($imgParms['alt'])) // Generate an Alt value from filename if one not found. - { - preg_match("/([\w]*)(?:\.png|\.jpg|\.jpeg|\.gif)/i", $code_text, $match); // Generate required Alt attribute. - $imgParms['alt'] = ucwords(str_replace("_"," ",$match[1])); - } - else - { - $imgParms['figcaption'] = $imgParms['alt'] ; - } - - $imgParms['title'] = $imgParms['alt'] ; - - $class = !empty($imgParms['class']) ? ' '.$imgParms['class'] : ''; - - $imgParms['class'] = "img-rounded rounded bbcode ".e107::getBB()->getClass('img').$class; // This will be overridden if a new class is specified - - if($mode == 'string') - { - $text = ''; - foreach($imgParms as $key => $val) - { - $text .= $key."='".$tp->toAttribute($val)."' "; - } - return $text; - } - - - return $imgParms; - } - - - - function toHTML($code_text, $parm) - { - - $tp = e107::getParser(); - $pref = e107::getPref(); - - if (trim($code_text) == "") return ""; // Do nothing on empty file - - if(substr($code_text,0,15) == '{e_MEDIA_IMAGE}' || substr($code_text,0,9) == '{e_MEDIA}' || substr($code_text,0,9) == '{e_THEME}') // Image from Media-Manager. - { - return $this->mediaImage($code_text, $parm); - } - - - if (preg_match("#\.php\?.*#",$code_text)){return "";} //XXX Breaks MediaManager Images, so do it after mediaManager check. - - $addlink = FALSE; - - - // Automatic Img Resizing -- - $w = e107::getBB()->resizeWidth(); // varies depending on the class set by external script. see admin->media-manager->prefs - $h = e107::getBB()->resizeHeight(); - - // No resizing on v1.x legacy images. - if(strpos($code_text,"://")==false && ($w || $h) && strpos($code_text,"{e_IMAGE}custom")===false && strpos($code_text,"newspost_images/")===false) // local file. - { - $code_text = $tp->thumbUrl($code_text,'w='.$w.'&h='.$h); - } - - // ------------------------ - - $search = array('"', '{E_IMAGE}', '{E_FILE}', '{e_IMAGE}', '{e_FILE}'); - $replace = array(''', e_IMAGE_ABS, e_FILE_ABS, e_IMAGE_ABS, e_FILE_ABS); - $replaceInt = array(''', e_IMAGE, e_FILE, e_IMAGE, e_FILE); - $intName = str_replace($search, $replaceInt, $code_text); // Server-relative file names - - - $code_text = str_replace($search, $replace, $code_text); - $code_text = $tp -> toAttribute($code_text); - - $img_file = pathinfo($code_text); // 'External' file name. N.B. - might still contain a constant such as e_IMAGE - - $parmStr = $this->processParm($code_text, $parm, 'string'); - - - - // Select a random file if required - if (strpos($img_file['basename'],'*') !== FALSE) - { - $fileList = array(); - $intFile = pathinfo($intName); // N.B. - might still contain a constant such as e_IMAGE - $matchString = '#'.str_replace('*','.*?',$intFile['basename']).'#'; - $dirName = $tp->replaceConstants($intFile['dirname'].'/'); // we want server-relative directory - if (($h = opendir($dirName)) !== FALSE) - { - while (($f = readdir($h)) !== FALSE) + preg_match("/width:([\d]*)[p|x|%|;]*/i", $parm, $m); + if($m[1] > 0) { - if (preg_match($matchString,$f)) - { - $fileList[] = $f; // Just need to note file names - } + $imgParms['width'] = $m[1]; + $imgParms['style'] = str_replace($m[0], '', $imgParms['style']); // strip hard-coded width styling. } - closedir($h); } - else - { - echo "Error opening directory: {$dirName}
"; - return ''; - } - if (count($fileList)) - { - $img_file['basename'] = $fileList[mt_rand(0,count($fileList)-1)]; // Just change name of displayed file - no change on directory - $code_text = $img_file['dirname']."/".$img_file['basename']; - } - else - { - echo 'No file: '.$code_text; - return ''; - } - } - - - // Check for whether we can display image down here - so we can show image name if appropriate - if (!vartrue($pref['image_post']) || !check_class($pref['image_post_class'])) - { - switch ($pref['image_post_disabled_method']) - { - case '1' : - return CORE_LAN17; - case '2' : - return ''; - } - return CORE_LAN18.$code_text; - } - - - // Check for link to main image if required - if (strpos($img_file['basename'],'th_') === 0) - { - $addlink = TRUE; - $main_name = $img_file['dirname']."/".substr($img_file['basename'],3); // delete the 'th' prefix from file name - } - elseif (strpos($img_file['basename'],'thumb_') === 0) - { - $addlink = TRUE; - $main_name = $img_file['dirname']."/".substr($img_file['basename'],6); // delete the 'thumb' prefix from file name - } - - - if ($addlink) - { - return ""; + if(empty($imgParms['alt'])) // Generate an Alt value from filename if one not found. + { + preg_match("/([\w]*)(?:\.png|\.jpg|\.jpeg|\.gif)/i", $code_text, $match); // Generate required Alt attribute. + + if(!empty($match[1])) + { + $imgParms['alt'] = ucwords(str_replace("_", " ", $match[1])); + } + } + else + { + $imgParms['figcaption'] = $imgParms['alt']; + } + + if(!empty($imgParms['alt'])) + { + $imgParms['title'] = $imgParms['alt']; + } + + $class = !empty($imgParms['class']) ? ' ' . $imgParms['class'] : ''; + + $imgParms['class'] = "img-rounded rounded bbcode " . e107::getBB()->getClass('img') . $class; // This will be overridden if a new class is specified + + if($mode == 'string') + { + $text = ''; + foreach($imgParms as $key => $val) + { + $text .= $key . "='" . $tp->toAttribute($val) . "' "; + } + + return $text; + } + + + return $imgParms; } - else + + /** + * @param string $code_text + * @param string $parm width=x etc. + * @return string + */ + function toHTML($code_text, $parm) { - return ""; + + $tp = e107::getParser(); + $pref = e107::getPref(); + + $code_text = trim($code_text); + + if(empty($code_text)) + { + return ""; + } // Do nothing on empty file + + if(strpos($code_text, '{e_MEDIA_IMAGE}') === 0 || strpos($code_text, '{e_MEDIA}') === 0 || strpos($code_text, '{e_THEME}') === 0) // Image from Media-Manager. + { + return $this->mediaImage($code_text, $parm); + } + + if(preg_match("#\.php\?.*#", $code_text)) + { + return ""; + } //XXX Breaks MediaManager Images, so do it after mediaManager check. + + $addlink = false; + + + // Automatic Img Resizing -- + $w = e107::getBB()->resizeWidth(); // varies depending on the class set by external script. see admin->media-manager->prefs + $h = e107::getBB()->resizeHeight(); + + // No resizing on v1.x legacy images. + if(strpos($code_text, "://") == false && ($w || $h) && strpos($code_text, "{e_IMAGE}custom") === false && strpos($code_text, "newspost_images/") === false) // local file. + { + $code_text = $tp->thumbUrl($code_text, 'w=' . $w . '&h=' . $h); + } + + // ------------------------ + + $search = array('"', '{E_IMAGE}', '{E_FILE}', '{e_IMAGE}', '{e_FILE}'); + $replace = array(''', e_IMAGE_ABS, e_FILE_ABS, e_IMAGE_ABS, e_FILE_ABS); + $replaceInt = array(''', e_IMAGE, e_FILE, e_IMAGE, e_FILE); + $intName = str_replace($search, $replaceInt, $code_text); // Server-relative file names + + + $code_text = str_replace($search, $replace, $code_text); + $code_text = $tp->toAttribute($code_text); + + $img_file = pathinfo($code_text); // 'External' file name. N.B. - might still contain a constant such as e_IMAGE + + $parmStr = $this->processParm($code_text, $parm, 'string'); + + + // Select a random file if required + if(strpos($img_file['basename'], '*') !== false) + { + $fileList = array(); + $intFile = pathinfo($intName); // N.B. - might still contain a constant such as e_IMAGE + $matchString = '#' . str_replace('*', '.*?', $intFile['basename']) . '#'; + $dirName = $tp->replaceConstants($intFile['dirname'] . '/'); // we want server-relative directory + if(($h = opendir($dirName)) !== false) + { + while(($f = readdir($h)) !== false) + { + if(preg_match($matchString, $f)) + { + $fileList[] = $f; // Just need to note file names + } + } + closedir($h); + } + else + { + echo "Error opening directory: {$dirName}
"; + + return ''; + } + if(count($fileList)) + { + $img_file['basename'] = $fileList[mt_rand(0, count($fileList) - 1)]; // Just change name of displayed file - no change on directory + $code_text = $img_file['dirname'] . "/" . $img_file['basename']; + } + else + { + echo 'No file: ' . $code_text; + + return ''; + } + } + + + // Check for whether we can display image down here - so we can show image name if appropriate + if(!vartrue($pref['image_post']) || !check_class($pref['image_post_class'])) + { + switch($pref['image_post_disabled_method']) + { + case '1' : + return CORE_LAN17; + case '2' : + return ''; + } + + return CORE_LAN18 . $code_text; + } + + + // Check for link to main image if required + if(strpos($img_file['basename'], 'th_') === 0) + { + $addlink = true; + $main_name = $img_file['dirname'] . "/" . substr($img_file['basename'], 3); // delete the 'th' prefix from file name + } + elseif(strpos($img_file['basename'], 'thumb_') === 0) + { + $addlink = true; + $main_name = $img_file['dirname'] . "/" . substr($img_file['basename'], 6); // delete the 'thumb' prefix from file name + } + + + if($addlink) + { + return ""; + } + else + { + return ""; + } } + } -} - diff --git a/e107_handlers/pop3_class.php b/e107_handlers/pop3_class.php index 88047f074..1cb4f8c5f 100644 --- a/e107_handlers/pop3_class.php +++ b/e107_handlers/pop3_class.php @@ -176,7 +176,7 @@ class receiveMail { $body = $this->get_part($this->marubox, $mid, "TEXT/HTML"); } - if (($body == "") || $mode == 'plain') + if (empty($body) || $mode == 'plain') $body = $this->get_part($this->marubox, $mid, "TEXT/PLAIN"); if ($body == "") { return ""; diff --git a/e107_handlers/user_extended_class.php b/e107_handlers/user_extended_class.php index 99133769f..52df39fd6 100644 --- a/e107_handlers/user_extended_class.php +++ b/e107_handlers/user_extended_class.php @@ -910,8 +910,9 @@ class e107_user_extended { $tp = e107::getParser(); $frm = e107::getForm(); - - if(trim($curval) == "" && $struct['user_extended_struct_default'] != "") + $curval = trim($curval); + + if(empty($curval) && !empty($struct['user_extended_struct_default'])) { $curval = $struct['user_extended_struct_default']; } diff --git a/e107_plugins/download/includes/admin.php b/e107_plugins/download/includes/admin.php index 888bb50ff..55c4227d0 100644 --- a/e107_plugins/download/includes/admin.php +++ b/e107_plugins/download/includes/admin.php @@ -1422,7 +1422,7 @@ $columnInfo = array( "; } // End of mirror-related stuff - $download_author = $subAction != "edit" && $download_author == "" ? USERNAME : $download_author;//TODO what if editing an no author specified + $download_author = ($subAction !== "edit" && empty($download_author)) ? USERNAME : $download_author;//TODO what if editing an no author specified $download_author_email = $subAction != "edit" && $download_author_email == "" ? USEREMAIL : $download_author_email; $text .= " diff --git a/e107_plugins/log/admin_config.php b/e107_plugins/log/admin_config.php index cc3b5f082..462ae9cff 100644 --- a/e107_plugins/log/admin_config.php +++ b/e107_plugins/log/admin_config.php @@ -1393,7 +1393,7 @@ function admin_config_adminmenu() $tmp = explode(".", e_QUERY); $action = $tmp[0]; } - if (!isset($action) || ($action == "")) $action = "config"; + if (empty($action)) $action = "config"; $var['config']['text'] = ADSTAT_LAN_35; $var['config']['link'] = 'admin_config.php'; diff --git a/e107_plugins/log/consolidate.php b/e107_plugins/log/consolidate.php index ebdc5f537..37730a852 100644 --- a/e107_plugins/log/consolidate.php +++ b/e107_plugins/log/consolidate.php @@ -470,7 +470,7 @@ class logConsolidate list($pageName,$tmp) = explode("?",$pageName); } - if($pageName == "") + if(empty($pageName)) { $pageName = "index"; } diff --git a/e107_plugins/log/stats.php b/e107_plugins/log/stats.php index 345dbc049..276fa45f6 100644 --- a/e107_plugins/log/stats.php +++ b/e107_plugins/log/stats.php @@ -1119,7 +1119,7 @@ class siteStats break; } } - if($image == "") + if(empty($image)) { $image = "unknown.png"; } diff --git a/e107_plugins/newsletter/admin_config.php b/e107_plugins/newsletter/admin_config.php index 2bc7267ea..a5843eb85 100644 --- a/e107_plugins/newsletter/admin_config.php +++ b/e107_plugins/newsletter/admin_config.php @@ -581,7 +581,7 @@ class newsletter */ function show_options($action) { - if ($action == "") + if (empty($action)) { $action = "main"; } diff --git a/e107_tests/tests/unit/bbcodes/bb_imgTest.php b/e107_tests/tests/unit/bbcodes/bb_imgTest.php new file mode 100644 index 000000000..ef566cb0f --- /dev/null +++ b/e107_tests/tests/unit/bbcodes/bb_imgTest.php @@ -0,0 +1,79 @@ +bb = $this->make('bb_img'); + } + catch(Exception $e) + { + $this->assertTrue(false, "Couldn't load bb_img object"); + } + + } + + public function testToDB() + { + + } + + public function testToHTML() + { + $tests = array( + array( + 'codetext' => '{e_MEDIA_IMAGE}2020-12/5.sm.webp', + 'parm' => '', + 'expected' => '5.sm.webp' + ), + array( + 'codetext' => '{e_MEDIA}images/2020-12/horse.jpg', + 'parm' => 'width=300', + 'expected' => 'Horse' + ), + array( + 'codetext' => '{e_MEDIA_IMAGE}2020-12/horse.jpg', + 'parm' => 'width=300', + 'expected' => 'Horse' + ), + array( + 'codetext' => '{e_THEME}voux/install/gasmask.jpg', + 'parm' => 'width=300&alt=Custom', + 'expected' => "
+\"Custom\"
Custom
+
" + ), + ); + + foreach($tests as $var) + { + $result = $this->bb->toHTML($var['codetext'], $var['parm']); + $result = preg_replace('/"([^"]*)thumb.php/','"thumb.php', $result); // remove the path before thumb.php + + $this->assertSame($var['expected'], $result); + + } + } + + + + + } diff --git a/e107_tests/tests/unit/e_parseTest.php b/e107_tests/tests/unit/e_parseTest.php index 18fb812fa..8f5f511bf 100644 --- a/e107_tests/tests/unit/e_parseTest.php +++ b/e107_tests/tests/unit/e_parseTest.php @@ -65,7 +65,7 @@ TMP; $actual = $this->tp->toHTML($src,true); - $expected = "
Blank Avatar
"; + $expected = "
Blank Avatar
"; $this->assertEquals($expected, $actual, "BBcode parsing failed on [img]"); @@ -1034,6 +1034,24 @@ while($row = $sql->fetch()) $this->tp->setConvertToWebP(false); + $tests = array( + 0 => array( + 'src' => '{e_PLUGIN}gallery/images/butterfly.jpg', + 'parms' => array('w'=>300, 'alt'=>"Custom"), + 'expected' => 'Custom' + ), + + ); + + foreach($tests as $index => $var) + { + $result = $this->tp->toImage($var['src'], $var['parms']); + $result = preg_replace('/"([^"]*)thumb.php/','"thumb.php', $result); + $this->assertSame($var['expected'], $result); + + } + + } public function testThumbSrcSet()