293 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			293 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
<?php
 | 
						|
 | 
						|
    namespace WMarkDown\Modules;
 | 
						|
 | 
						|
    class Multimedia extends \WMarkDown\Abstracts\Modules{
 | 
						|
 | 
						|
        public function get_next_position($string){
 | 
						|
 | 
						|
            if(
 | 
						|
                $this->more &&
 | 
						|
                $this->from < 0 &&
 | 
						|
                $this->more = preg_match('/^\[\[(images?|slider|videos?|audios?|embed|thumbnails?) ?(([^\]"\'\n\r]+|[\r\n]+|"(([^\\\\"]+|\\\\(.|[\r\n]))*)"|\'(([^\\\\\']+|\\\\(.|[\r\n]))*)\'|\][^\]])+)\]\]/m', $string, $this->matches, PREG_OFFSET_CAPTURE)
 | 
						|
            )
 | 
						|
                $this->from = $this->matches[0][1];
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        private static function multimedia_box($html, $multiple){
 | 
						|
            return '<div class="multimedia-box" data-multiple="' . ($multiple ? "true" : "false") . '">' . $html . '</div>';
 | 
						|
        }
 | 
						|
 | 
						|
        public function image($data){
 | 
						|
            if(!$data)
 | 
						|
                return '';
 | 
						|
 | 
						|
            $images;
 | 
						|
            $text;
 | 
						|
 | 
						|
            if(is_string($data)){
 | 
						|
                if(!preg_match('/^(\[(([^\\\\\]]+|\\\\(.|[\r\n]))*)\]|[^ ]+)( (.+))?$/', trim($data), $matches))
 | 
						|
                    return '';
 | 
						|
                $images = $matches[1][0] == "[" ? json_decode($matches[1], true) : [$matches[1]];
 | 
						|
                $text = isset($matches[6]) ? $matches[6] : null;
 | 
						|
            }else{
 | 
						|
                if(isset($data[0]))
 | 
						|
                    $data = ["images" => $data];
 | 
						|
                $images = $data["images"];
 | 
						|
                $text = isset($data["text"]) && $data["text"] ? $data["text"] : null;
 | 
						|
            };
 | 
						|
 | 
						|
            $html = '';
 | 
						|
            $image_text = $text ? $text : "image";
 | 
						|
 | 
						|
            foreach($images as $image)
 | 
						|
                $html .= '<img src="' . $image . '" alt="' . $image_text . '" />';
 | 
						|
 | 
						|
            return ('
 | 
						|
                <span data-type="image"' . ($text !== null ? ' title="' . $text . '"' : '') . ' data-status="unloaded" data-error-type="ok" onclick="wmarkdown.multimedia.go(this, event);">
 | 
						|
                    <img data-src="' . base64_encode(json_encode($images)) . '" data-i="0"' . ($text !== null ? ' alt="' . $text . '"' : '') . ' onerror="wmarkdown.multimedia.image_try_next(this, event);" />
 | 
						|
                    <span class="image-style"></span>
 | 
						|
                    <noscript>' . $html . '</noscript>
 | 
						|
                    <a href="#" target="_blank"></a>
 | 
						|
                    ' . ($text !== null ? '<span class="text">' . $text . '</span>' : '') . '
 | 
						|
                </span>
 | 
						|
            ');
 | 
						|
        }
 | 
						|
 | 
						|
        public function images($data){
 | 
						|
            return preg_replace_callback('/^([\s\t]+)?(\[(([^\\\\\[\]"\'\r\n]+|"(([^\\\\"\r\n]+|\\\\(.|[\r\n]))*)"|\'(([^\\\\\'\r\n]+|\\\\(.|[\r\n]))*)\'|\\\\(.|[\n\r])|[\r\n])*)\]|[^\r\n]+)( ([^\r\n]+)?)?[\r\n]?$/m', function($values){
 | 
						|
                return ($string = trim($values[0])) ? $this->image($string) : "";
 | 
						|
            }, $data);
 | 
						|
        }
 | 
						|
 | 
						|
        public function video($data){
 | 
						|
            if(!$data)
 | 
						|
                return '';
 | 
						|
 | 
						|
            $videos;
 | 
						|
            $posters;
 | 
						|
            $text;
 | 
						|
 | 
						|
            if(is_string($data)){
 | 
						|
                if(!preg_match('/^(\[(([^\\\\\]]+|\\\\(.|[\r\n]))*)\]|[^ ]+)( (\[(([^\\\\\[]+|\\\\(.|[\r\n]))*)\]|[a-z][a-z\d]{2,}\:\/{2}[^ ]+))?( (.+))?$/im', trim($data), $matches))
 | 
						|
                    return '';
 | 
						|
                $videos = $matches[1][0] == "[" ? json_decode($matches[1], true) : [$matches[1]];
 | 
						|
                $posters = isset($matches[6]) && $matches[6] ? ($matches[6][0] == "[" ? json_decode($matches[6], true) : [$matches[6]]) : null;
 | 
						|
                $text = isset($matches[11]) && $matches[11] ? $matches[11] : null;
 | 
						|
            }else{
 | 
						|
                if(isset($data[0]))
 | 
						|
                    $data = ["videos" => $data];
 | 
						|
                $videos = $data["videos"];
 | 
						|
                $posters = isset($data["posters"]) ? $data["posters"] : null;
 | 
						|
                $text = isset($data["text"]) ? $data["text"] : null;
 | 
						|
            };
 | 
						|
 | 
						|
            $html = '';
 | 
						|
            $video_text = $text ? $text : "video";
 | 
						|
 | 
						|
            foreach($videos as $video)
 | 
						|
                $html .= ('
 | 
						|
                    <video title="' . $video_text . '">
 | 
						|
                        <source src="' . $video . '" type="' . $this->wmarkdown->get_mime($video) . '" />
 | 
						|
                        <span data-i18n="multimedia_no_recognized">Formato no reconocido por el navegador.</span>
 | 
						|
                    </video>
 | 
						|
                ');
 | 
						|
 | 
						|
            return ('
 | 
						|
                <span data-type="video" data-status="unloaded" data-error-type="ok" onclick="wmarkdown.multimedia.go(this, event);">
 | 
						|
                    <video controls data-src="' . base64_encode(json_encode($videos)) . '" data-i="0"' . ($posters ? ' data-posters="' . base64_encode(json_encode($posters)) . '" data-posters-i="0"' : '') . ' onerror="wmarkdown.multimedia.video_try_next(this, event);">
 | 
						|
                        <span data-i18n="multimedia_no_recognized">Formato no reconocido por el navegador.</span>
 | 
						|
                    </video>
 | 
						|
                    <noscript>' . $html . '</noscript>
 | 
						|
                    <a href="#" target="_blank"></a>
 | 
						|
                    ' . ($text !== null ? '<span class="text">' . $text . '</span>' : null) . '
 | 
						|
                </span>
 | 
						|
            ');
 | 
						|
        }
 | 
						|
 | 
						|
        public function videos($data){
 | 
						|
            return preg_replace_callback('/^([\s\t]+)?(\[(([^\\\\\[]+|\\\\(.|[\n\r]))*)\]|[^ ]+)( (\[(([^\\\\\[]+|\\\\(.|[\n\r]))*)\]|[a-z][a-z\d]{2,}\:\/{2}[^ ]+))?( (.+)?)?/im', function($values){
 | 
						|
                return $this->video($values[0]);
 | 
						|
            }, $data);
 | 
						|
        }
 | 
						|
 | 
						|
        private function audio_poster($data){
 | 
						|
            return self::multimedia_box($this->image($data), false);
 | 
						|
        }
 | 
						|
 | 
						|
        public function audio($data, $multiple = null){
 | 
						|
            if(!$data)
 | 
						|
                return '';
 | 
						|
 | 
						|
            $audios;
 | 
						|
            $posters;
 | 
						|
            $text;
 | 
						|
 | 
						|
            if(is_string($data)){
 | 
						|
                if(!preg_match('/^(\[(([^\\\\\]]+|\\\\(.|[\r\n]))*)\]|[^ ]+)( (\[(([^\\\\\[]+|\\\\(.|[\r\n]))*)\]|[a-z][a-z\d]{2,}\:\/{2}[^ ]+))?( (.+))?$/im', trim($data), $matches))
 | 
						|
                    return '';
 | 
						|
                $audios = $matches[1][0] == "[" ? json_decode($matches[1], true) : [$matches[1]];
 | 
						|
                $posters = isset($matches[6]) && $matches[6] ? ($matches[6][0] == "[" ? json_decode($matches[6], true) : [$matches[6]]) : null;
 | 
						|
                $text = isset($matches[11]) && $matches[11] ? $matches[11] : null;
 | 
						|
            }else{
 | 
						|
                if(isset($data[0]))
 | 
						|
                    $data = ["audios" => $data];
 | 
						|
                $audios = $data["audios"];
 | 
						|
                $posters = isset($data["posters"]) ? $data["posters"] : null;
 | 
						|
                $text = isset($data["text"]) ? $data["text"] : null;
 | 
						|
            };
 | 
						|
 | 
						|
            $html = '';
 | 
						|
            $audio_text = $text ? $text : "audio";
 | 
						|
 | 
						|
            foreach($audios as $audio)
 | 
						|
                $html .= ('
 | 
						|
                    <audio title="' . $audio_text . '">
 | 
						|
                        <source src="' . $audio . '" type="' . $this->wmarkdown->get_mime($audio) . '" />
 | 
						|
                        <span data-i18n="multimedia_no_recognized">Formato no reconocido por el navegador.</span>
 | 
						|
                    </audio>
 | 
						|
                ');
 | 
						|
 | 
						|
            return ('
 | 
						|
                <span data-type="audio" data-status="unloaded" data-error-type="ok" onclick="wmarkdown.multimedia.go(this, event);">
 | 
						|
                    <audio controls data-src="' . base64_encode(json_encode($audios)) . '" data-i="0" onerror="wmarkdown.multimedia.audio_try_next(this, event);">
 | 
						|
                        <span data-i18n="multimedia_no_recognized">Formato no reconocido por el navegador.</span>
 | 
						|
                    </audio>
 | 
						|
                    <noscript>' . $html . '</noscript>
 | 
						|
                    <a href="#" target="_blank"></a>
 | 
						|
                    ' . (!empty($posters) ? $this->audio_poster([
 | 
						|
                        "images" => $posters,
 | 
						|
                        "text" => $text
 | 
						|
                    ], $multiple) : ($text !== null ? '<span class="text">' . $text . '</span>' : null)) . '
 | 
						|
                </span>
 | 
						|
            ');
 | 
						|
        }
 | 
						|
 | 
						|
        public function audios($data){
 | 
						|
            return preg_replace_callback('/^([\s\t]+)?(\[(([^\\\\\[]+|\\\\(.|[\n\r]))*)\]|[^ ]+)( (\[(([^\\\\\[]+|\\\\(.|[\n\r]))*)\]|[a-z][a-z\d]{2,}\:\/{2}[^ ]+))?( (.+)?)?/im', function($values){
 | 
						|
                return $this->audio($values[0], true);
 | 
						|
            }, $data);
 | 
						|
        }
 | 
						|
 | 
						|
        private static function check($matches, $is){
 | 
						|
            if(!$matches || count($matches) < 2)
 | 
						|
                return null;
 | 
						|
            foreach(is_array($is) ? $is : [$is] as $i)
 | 
						|
                if(isset($matches[$i]) && $matches[$i])
 | 
						|
                    return $i;
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
 | 
						|
        public function embed($links){
 | 
						|
            if(!$links)
 | 
						|
                return '';
 | 
						|
 | 
						|
            if(!is_array($links))
 | 
						|
                $links = preg_split('/[\r\n]+/', "" . $links);
 | 
						|
 | 
						|
            $html = '';
 | 
						|
            $j = 0;
 | 
						|
 | 
						|
            foreach($links as $link){
 | 
						|
                if(!($link = trim($link)))
 | 
						|
                    continue;
 | 
						|
                $j ++;
 | 
						|
                if(preg_match('/^https?\:\/{2}(www\.)?(youtube\.com\/(embed\/|(((?![\?\&]v\=).)+)?[\?\&]v\=)([^\/\&]+)|youtu\.be\/([^\/\&\?]+))/', $link, $matches) && ($i = self::check($matches, [6, 7])))
 | 
						|
                    $html .= ('
 | 
						|
                        <span data-platform="youtube" data-id="' . $matches[$i] . '" data-status="unmounted">
 | 
						|
                            <noscript>
 | 
						|
                                <iframe
 | 
						|
                                    src="https://www.youtube.com/embed/' . $matches[$i] . '"
 | 
						|
                                    style="position:absolute;top:0em;left:0em;width:100%;height:100%;"
 | 
						|
                                    title="YouTube video player"
 | 
						|
                                    frameborder="0"
 | 
						|
                                    allow="fullscreen; accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
 | 
						|
                                    allowfullscreen="allowfullscreen"
 | 
						|
                                    mozallowfullscreen="mozallowfullscreen"
 | 
						|
                                    msallowfullscreen="msallowfullscreen"
 | 
						|
                                    oallowfullscreen="oallowfullscreen"
 | 
						|
                                    webkitallowfullscreen="webkitallowfullscreen"
 | 
						|
                                allowfullscreen></iframe>
 | 
						|
                            </noscript>
 | 
						|
                        </span>
 | 
						|
                    ');
 | 
						|
                elseif(preg_match('/^https?\:\/{2}((www|player)\.)?vimeo\.com\/(video\/)?(\d+)/', $link, $matches) && ($i = self::check($matches, [4])))
 | 
						|
                    $html .= ('
 | 
						|
                        <span data-platform="vimeo" data-id="' . $matches[$i] . '" data-status="unmounted">
 | 
						|
                            <noscript>
 | 
						|
                                <iframe
 | 
						|
                                    src="https://player.vimeo.com/video/' . $matches[$i] . '"
 | 
						|
                                    style="position:absolute;top:0em;left:0em;width:100%;height:100%;"
 | 
						|
                                    frameborder="0"
 | 
						|
                                    allow="fullscreen; picture-in-picture"
 | 
						|
                                allowfullscreen></iframe>
 | 
						|
                            </noscript>
 | 
						|
                        </span>
 | 
						|
                    ');
 | 
						|
                elseif(preg_match('/^https?\:\/{2}(www\.)?facebook\.com\/((?!\/videos\/).)+\/videos\/(\d+)/', $link, $matches) && ($i = self::check($matches, [3])))
 | 
						|
                    $html .= ('
 | 
						|
                        <span data-platform="facebook" data-id="' . $matches[$i] . '" data-status="unmounted">
 | 
						|
                            <noscript>
 | 
						|
                                <iframe
 | 
						|
                                    src="https://www.facebook.com/video.php?v=' . $matches[$i] . '"
 | 
						|
                                    style="position:absolute;top:0em;left:0em;width:100%;height:100%;border:none;overflow:hidden;"
 | 
						|
                                    scrolling="no"
 | 
						|
                                    frameborder="0"
 | 
						|
                                    allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share"
 | 
						|
                                allowfullscreen></iframe>
 | 
						|
                            </noscript>
 | 
						|
                        </span>
 | 
						|
                    ');
 | 
						|
                elseif(preg_match('/^https?\:\/{2}((www|player)\.)?twitch\.(com|tv)\/(videos\/|\?video\=)(\d+)/', $link, $matches) && ($i = self::check($matches, [5])))
 | 
						|
                    $html .= ('
 | 
						|
                        <span data-platform="twitch" data-id="' . $matches[$i] . '" data-status="unmounted">
 | 
						|
                            <noscript>
 | 
						|
                                <iframe
 | 
						|
                                    src="https://player.twitch.tv/?video=' . $matches[$i] . '&parent=wmarkdown.k3y.pw"
 | 
						|
                                    style="position:absolute;top:0em;left:0em;width:100%;height:100%;"
 | 
						|
                                    scrolling="no"
 | 
						|
                                    frameborder="0"
 | 
						|
                                    allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share"
 | 
						|
                                allowfullscreen></iframe>
 | 
						|
                            </noscript>
 | 
						|
                        </span>
 | 
						|
                    ');
 | 
						|
                else
 | 
						|
                    $j --;
 | 
						|
            };
 | 
						|
 | 
						|
            return '<span data-type="embed" data-links-count="' . count($links) . '">' . $html . '</span>';
 | 
						|
        }
 | 
						|
 | 
						|
        /*public static function process($wmarkdown, $key, $data, $multiple = null){
 | 
						|
            return '<div class="multimedia-box" data-multiple="' . (($multiple !== null ? $multiple : $key[strlen($key) - 1] == "s") ? "true" : "false") . '">' . (
 | 
						|
                $data && method_exists('\WMarkDown\Modules\Multimedia', $key) ?
 | 
						|
                \call_user_func('\WMarkDown\Modules\Multimedia::' . $key, $wmarkdown, $data) :
 | 
						|
                ''
 | 
						|
            ) . '</div>';
 | 
						|
        }*/
 | 
						|
 | 
						|
        public function thumbnails($data){
 | 
						|
            // print_r($data);
 | 
						|
 | 
						|
            return "";
 | 
						|
        }
 | 
						|
 | 
						|
        public function process($string, $modules, $level){
 | 
						|
 | 
						|
            $method = $this->matches[1][0];
 | 
						|
 | 
						|
            // if($method == "images")
 | 
						|
            //     print_r($this->matches);
 | 
						|
 | 
						|
            // $this->html = self::process($this->wmarkdown, $this->matches[1][0], $this->matches[2][0]);
 | 
						|
            $this->html = self::multimedia_box($this->matches[2][0] && method_exists($this, $method) ? $this->$method($this->matches[2][0]) : '', $method[strlen($method) - 1] == "s");
 | 
						|
            $this->length = strlen($this->matches[0][0]);
 | 
						|
            $this->to = $this->from + $this->length;
 | 
						|
            $this->content = $this->matches[2][0];
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
    };
 |