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]';
}
/**
* 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']);
}
if(empty($imgParms['loading']))
{
$imgParms['loading'] = 'lazy';
}
$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);
}
/**
* 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();
$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.
{
preg_match("/width:([\d]*)[p|x|%|;]*/i", $parm, $m);
if($m[1] > 0)
{
$imgParms['width'] = $m[1];
$imgParms['style'] = str_replace($m[0], '', $imgParms['style']); // strip hard-coded width styling.
}
}
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 . "='" . e107::getParser()->toAttribute($val) . "' ";
}
return $text;
}
return $imgParms;
}
/**
* @param string $code_text
* @param string $parm width=x etc.
* @return string
*/
function toHTML($code_text, $parm)
{
$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 = e107::getParser()->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 defset('CORE_LAN17');
case '2' :
return '';
}
return defset('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 "
";
}
}
}