libdir.'/filelib.php'); class mediaplugin_filter extends moodle_text_filter { private $eolas_fix_applied = false; function filter($text) { global $CFG, $PAGE; // You should never modify parameters passed to a method or function, it's BAD practice. Create a copy instead. // The reason is that you must always be able to refer to the original parameter that was passed. // For this reason, I changed $text = preg_replace(..,..,$text) into $newtext = preg.... (NICOLAS CONNAULT) // Thanks to Pablo Etcheverry for pointing this out! MDL-10177 // We're using the UFO technique for flash to attain XHTML Strict 1.0 // See: http://www.bobbyvandersluis.com/ufo/ if (!is_string($text)) { // non string data can not be filtered anyway return $text; } $newtext = $text; // fullclone is slow and not needed here if ($CFG->filter_mediaplugin_enable_mp3) { $search = '/]*>.*?<\/a>/is'; $newtext = preg_replace_callback($search, 'mediaplugin_filter_mp3_callback', $newtext); } if ($CFG->filter_mediaplugin_enable_swf) { $search = '/]*>.*?<\/a>/is'; $newtext = preg_replace_callback($search, 'mediaplugin_filter_swf_callback', $newtext); } if ($CFG->filter_mediaplugin_enable_flv) { $search = '/]*>.*?<\/a>/is'; $newtext = preg_replace_callback($search, 'mediaplugin_filter_flv_callback', $newtext); } if ($CFG->filter_mediaplugin_enable_mov) { $search = '/]*>.*?<\/a>/is'; $newtext = preg_replace_callback($search, 'mediaplugin_filter_qt_callback', $newtext); $search = '/]*>.*?<\/a>/is'; $newtext = preg_replace_callback($search, 'mediaplugin_filter_qt_callback', $newtext); $search = '/]*>.*?<\/a>/is'; $newtext = preg_replace_callback($search, 'mediaplugin_filter_qt_callback', $newtext); $search = '/]*>.*?<\/a>/is'; $newtext = preg_replace_callback($search, 'mediaplugin_filter_qt_callback', $newtext); } if ($CFG->filter_mediaplugin_enable_wmv) { $search = '/]*>.*?<\/a>/is'; $newtext = preg_replace_callback($search, 'mediaplugin_filter_wmp_callback', $newtext); } if ($CFG->filter_mediaplugin_enable_mpg) { $search = '/]*>.*?<\/a>/is'; $newtext = preg_replace_callback($search, 'mediaplugin_filter_qt_callback', $newtext); } if ($CFG->filter_mediaplugin_enable_avi) { $search = '/]*>.*?<\/a>/is'; $newtext = preg_replace_callback($search, 'mediaplugin_filter_wmp_callback', $newtext); } if ($CFG->filter_mediaplugin_enable_ram) { $search = '/]*>.*?<\/a>/is'; $newtext = preg_replace_callback($search, 'mediaplugin_filter_real_callback', $newtext); } if ($CFG->filter_mediaplugin_enable_rpm) { $search = '/]*>.*?<\/a>/is'; $newtext = preg_replace_callback($search, 'mediaplugin_filter_real_callback', $newtext); } if ($CFG->filter_mediaplugin_enable_rm) { $search = '/]*>.*?<\/a>/is'; $newtext = preg_replace_callback($search, 'mediaplugin_filter_real_callback', $newtext); } if (!empty($CFG->filter_mediaplugin_enable_youtube)) { $search = '/]*>(.*?)<\/a>/is'; $newtext = preg_replace_callback($search, 'mediaplugin_filter_youtube_callback', $newtext); $search = '/]*>(.*?)<\/a>/is'; $newtext = preg_replace_callback($search, 'mediaplugin_filter_youtube_callback', $newtext); } if (!empty($CFG->filter_mediaplugin_enable_img)) { $search = '/]*>(.*?)<\/a>/is'; $newtext = preg_replace_callback($search, 'mediaplugin_filter_img_callback', $newtext); $search = '/]*>(.*?)<\/a>/is'; $newtext = preg_replace_callback($search, 'mediaplugin_filter_img_callback', $newtext); $search = '/]*>(.*?)<\/a>/is'; $newtext = preg_replace_callback($search, 'mediaplugin_filter_img_callback', $newtext); } if (empty($newtext) or $newtext === $text) { // error or not filtered unset($newtext); return $text; } if (!$this->eolas_fix_applied) { $PAGE->requires->js('/filter/mediaplugin/eolas_fix.js'); $this->eolas_fix_applied = true; } return $newtext; } } ///=========================== /// callback filter functions function mediaplugin_filter_mp3_callback($link) { global $CFG, $OUTPUT, $PAGE; $c = $OUTPUT->filter_mediaplugin_colors(); // You can set this up in your theme/xxx/config.php static $count = 0; $count++; $id = 'filter_mp3_'.time().$count; //we need something unique because it might be stored in text cache $url = addslashes_js($link[1]); $args = Array(); $args['movie'] = $CFG->wwwroot.'/filter/mediaplugin/mp3player.swf?src='.$url; $args['width'] = 90; $args['height'] = 15; $args['majorversion'] = 6; $args['build'] = 40; $args['flashvars'] = $c; $args['quality'] = 'high'; $jsoutput = create_ufo_inline($id, $args); $output = $link[0].'('.get_string('mp3audio', 'filter_mediaplugin').')'.$jsoutput; return $output; } function mediaplugin_filter_swf_callback($link) { global $PAGE; static $count = 0; $count++; $id = 'filter_swf_'.time().$count; //we need something unique because it might be stored in text cache $width = empty($link[3]) ? '400' : $link[3]; $height = empty($link[4]) ? '300' : $link[4]; $url = addslashes_js($link[1]); $args = Array(); $args['movie'] = $url; $args['width'] = $width; $args['height'] = $height; $args['majorversion'] = 6; $args['build'] = 40; $args['allowscriptaccess'] = 'never'; $args['quality'] = 'high'; $jsoutput = create_ufo_inline($id, $args); $output = $link[0].'('.get_string('flashanimation', 'filter_mediaplugin').')'.$jsoutput; return $output; } function mediaplugin_filter_flv_callback($link) { global $CFG, $PAGE; static $count = 0; $count++; $id = 'filter_flv_'.time().$count; //we need something unique because it might be stored in text cache $width = empty($link[3]) ? '480' : $link[3]; $height = empty($link[4]) ? '360' : $link[4]; $url = addslashes_js($link[1]); $args = Array(); $args['movie'] = $CFG->wwwroot.'/filter/mediaplugin/flvplayer.swf?file='.$url; $args['width'] = $width; $args['height'] = $height; $args['majorversion'] = 6; $args['build'] = 40; $args['allowscriptaccess'] = 'never'; $args['quality'] = 'high'; $args['allowfullscreen'] = 'true'; $jsoutput = create_ufo_inline($id, $args); $output = $link[0].'('.get_string('flashvideo', 'filter_mediaplugin').')'.$jsoutput; return $output; } function mediaplugin_filter_real_callback($link, $autostart=false) { $url = addslashes_js($link[1]); $mimetype = mimeinfo('type', $url); $autostart = $autostart ? 'true' : 'false'; // embed kept for now see MDL-8674 return $link[0]. ' '; } /** * Change links to Youtube into embedded Youtube videos */ function mediaplugin_filter_youtube_callback($link, $autostart=false) { $site = addslashes_js($link[1]); $url = addslashes_js($link[2]); $info = addslashes_js($link[3]); return ''. ''. ''. ''. ''. ''; } /** * Change links to images into embedded images */ function mediaplugin_filter_img_callback($link, $autostart=false) { $url = addslashes_js($link[1]); $info = addslashes_js($link[2]); return ''; } /** * Embed video using window media player if available */ function mediaplugin_filter_wmp_callback($link, $autostart=false) { $url = $link[1]; if (empty($link[3]) or empty($link[4])) { $mpsize = ''; $size = 'width="300" height="260"'; $autosize = 'true'; } else { $size = 'width="'.$link[3].'" height="'.$link[4].'"'; $mpsize = $size; $autosize = 'false'; } $mimetype = mimeinfo('type', $url); $autostart = $autostart ? 'true' : 'false'; return $link[0]. ' '; } function mediaplugin_filter_qt_callback($link, $autostart=false) { $url = $link[1]; if (empty($link[3]) or empty($link[4])) { $size = 'width="280" height="210"'; } else { $size = 'width="'.$link[3].'" height="'.$link[4].'"'; } $mimetype = mimeinfo('type', $url); $autostart = $autostart ? 'true' : 'false'; return $link[0]. ' '; }