1<?php 2/** 3 * DokuWiki Plugin html5video (Syntax Component) 4 * 5 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 6 * @author Jason van Gumster (Fweeb) <jason@monsterjavaguns.com> 7 * 8 * Parts borrowed from the videogg plugin written by Ludovic Kiefer, 9 * which is based on Christophe Benz' Dailymotion plugin, which, in turn, 10 * is based on Ikuo Obataya's Youtube plugin. Whew... 11 * 12 * Currently only supports webm videos 13 */ 14 15// must be run within Dokuwiki 16if (!defined('DOKU_INC')) die(); 17 18if (!defined('DOKU_LF')) define('DOKU_LF', "\n"); 19if (!defined('DOKU_TAB')) define('DOKU_TAB', "\t"); 20if (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); 21 22require_once DOKU_PLUGIN.'syntax.php'; 23 24class syntax_plugin_html5video_video extends DokuWiki_Syntax_Plugin { 25 26 public function getType() { 27 return 'substition'; 28 } 29 30 public function getPType() { 31 return 'block'; 32 } 33 34 public function getSort() { 35 return 159; 36 } 37 38 public function connectTo($mode) { 39 // Kind of a nasty regex, but it allows us to avoid using a 40 // plugin-specific prefix. We can use syntax directly from Media 41 // Manager. 42 // http://gskinner.com/RegExr is a big help 43 $this->Lexer->addSpecialPattern('\{\{[^}]*(?:(?:webm)|(?:ogv)|(?:mp4))(?:\|(?:\d{2,4}x\d{2,4})?(?:\|(?:loop)?,?(?:autoplay)?(?:,loop)?)?)? ?\}\}',$mode,'plugin_html5video_video'); 44 } 45 46 public function handle($match, $state, $pos, &$handler){ 47 $params = substr($match, strlen('{{'), - strlen('}}')); //Strip markup 48 if(strpos($params, ' ') === 0) { // Space as first character 49 if(substr_compare($params, ' ', -1, 1) === 0) { // Space a front and back = centered 50 $params = trim($params); 51 $params = 'center|' . $params; 52 } 53 else { // Only space at front = right-aligned 54 $params = trim($params); 55 $params = 'right|' . $params; 56 } 57 } 58 elseif(substr_compare($params, ' ', -1, 1) === 0) { // Space only as last character = left-aligned 59 $params = trim($params); 60 $params = 'left|' . $params; 61 } 62 else { // No space padding = inline 63 $params = 'inline|' . $params; 64 } 65 return array(state, explode('|', $params)); 66 } 67 68 public function render($mode, &$renderer, $data) { 69 if($mode != 'xhtml') return false; 70 71 list($state, $params) = $data; 72 list($video_align, $video_url, $video_size, $video_attr) = $params; 73 74 if($video_align == "center") { 75 $align = "margin: 0 auto;"; 76 } 77 elseif($video_align == "left") { 78 $align = "float: left;"; 79 } 80 elseif($video_align == "right") { 81 $align = "float: right;"; 82 } 83 else { // Inline 84 $align = ""; 85 } 86 87 if(!substr_count($video_url, '/')) { 88 $video_url = ml($video_url); 89 } 90 91 if(substr($video_url, -4) != 'webm' && substr($video_url, -3) != 'ogv' && substr($video_url, -3) != 'mp4') { 92 $renderer->doc .= "Error: The video must be in webm, ogv, or mp4 format.<br />" . $video_url; 93 return false; 94 } 95 96 if(is_null($video_size) or !substr_count($video_size, 'x')) { 97 $width = 640; 98 $height = 360; 99 } 100 else { 101 $obj_dimensions = explode('x', $video_size); 102 $width = $obj_dimensions[0]; 103 $height = $obj_dimensions[1]; 104 } 105 106 if(is_null($video_attr)) { 107 $attr = ""; 108 } 109 else { 110 $arr_attr = explode(',', $video_attr); 111 if(count($arr_attr) == 1) { 112 if($arr_attr[0] == "loop") { 113 $attr = 'loop="loop"'; 114 } 115 elseif($arr_attr[0] == "autoplay") { 116 $attr = 'autoplay="autoplay"'; 117 } 118 } 119 elseif(count($arr_attr) == 2) { 120 if($arr_attr[0] != $arr_attr[1]) { 121 $attr = 'loop="loop" autoplay="autoplay"'; 122 } 123 else { 124 $renderer->doc .= "Error: Duplicate parameters.<br />"; 125 return false; 126 } 127 } 128 else { 129 $renderer->doc .= "Error: Wrong number of parameters.<br />"; 130 return false; 131 } 132 } 133 134 $obj = '<video src="' . $video_url . '" width="' . $width . '" height="' . $height . '" controls="controls" ' . $attr . '></video>'; 135 if($align != "") { 136 $obj = '<div style="width: ' . $width . 'px; ' . $align . '">' . $obj . '</div>'; 137 } 138 139 $renderer->doc .= $obj; 140 return true; 141 } 142 private function _getAlts($filename) { 143 return false; 144 } 145} 146