value) || empty($field->value['media_src'])) { return; } $data = array_merge(array( 'media_src' => '', 'media_text' => '', 'media_type' => (string) $fieldParams->get('mediatype', 'embed'), 'media_target' => (string) $fieldParams->get('media_target', ''), 'media_class' => (string) $fieldParams->get('media_class', ''), 'media_caption' => '', 'media_supported' => array('img', 'video', 'audio', 'iframe', 'a') ), $field->value); // convert to object $data = (object) $data; // convert legacy value if (isset($data->src)) { $data->media_src = $data->src; } // clean Joomla 4 media stuff if ($pos = strpos($data->media_src, '#')) { $data->media_src = substr($data->media_src, 0, $pos); } $allowable = array( 'img' => 'jpg,jpeg,png,gif', 'audio' => 'mp3,m4a,mp4a,ogg', 'video' => 'mp4,mp4v,mpeg,mov,webm', 'iframe' => 'doc,docx,odg,odp,ods,odt,pdf,ppt,pptx,txt,xcf,xls,xlsx,csv' ); // get file extension to determine tag $extension = File::getExt($data->media_src); // lowercase $extension = strtolower($extension); // get tag from extension array_walk($allowable, function ($values, $key) use ($extension, &$tag) { if (in_array($extension, explode(',', $values))) { $tag = $key; } }); // reset media_type as link if (false == in_array($tag, $data->media_supported)) { $data->media_type = 'link'; } // reset tag type if ($data->media_type == 'link') { $tag = 'a'; } $attribs = array(); if ($data->media_class) { $data->media_class = preg_replace('/[^A-Z0-9_- ]/i', '', $data->media_class); $attribs['class'] = trim($data->media_class); } $text = ''; if ($data->media_text) { $text = htmlentities($data->media_text, ENT_COMPAT, 'UTF-8', true); } switch ($tag) { case 'a': default: $element = '%s'; break; case 'img': $element = '%s'; $attribs['width'] = isset($data->media_width) ? $data->media_width : ''; $attribs['height'] = isset($data->media_height) ? $data->media_height : ''; $attribs['loading'] = 'lazy'; break; case 'audio': $element = ''; $attribs['controls'] = 'controls'; if ($text) { $attribs['title'] = $text; } break; case 'video': $element = ''; $attribs['controls'] = 'controls'; $attribs['width'] = isset($data->media_width) ? $data->media_width : ''; $attribs['height'] = isset($data->media_height) ? $data->media_height : ''; if ($text) { $attribs['title'] = $text; } break; case 'iframe': $element = ''; $attribs['frameborder'] = 0; $attribs['width'] = isset($data->media_width) ? $data->media_width : '100%'; $attribs['height'] = isset($data->media_height) ? $data->media_height : '100%'; $attribs['loading'] = 'lazy'; if ($text) { $attribs['title'] = $text; } break; } if ($data->media_type == 'embed' && $data->media_caption) { $fig_attribs = ''; $caption_class = (string) $fieldParams->get('media_caption_class', ''); if ($caption_class) { $caption_class = preg_replace('/[^A-Z0-9_- ]/i', '', $caption_class); $fig_attribs = ' class="' . $caption_class . '"'; } $element = '' . $element . '
' . htmlentities($data->media_caption, ENT_COMPAT, 'UTF-8', true) . '
'; } $buffer = ''; // remove some common characters $path = preg_replace('#[\+\\\?\#%&<>"\'=\[\]\{\},;@\^\(\)£€$]#', '', $data->media_src); // trim $path = trim($path); // check for valid path after clean if ($path) { // clean path $path = Path::clean($path); // create full path $fullpath = JPATH_SITE . '/' . trim($path, '/'); // check path is valid if (is_file($fullpath)) { // set text as basename if not an image if (!$text && $data->media_type == "link") { $text = basename($path); if ($data->media_target) { if ($data->media_target == 'download') { $attribs['download'] = $path; } else { $attribs['target'] = $data->media_target; } } } $buffer .= sprintf( $element, htmlentities($path, ENT_COMPAT, 'UTF-8', true), ArrayHelper::toString($attribs), $text ); } } echo $buffer;