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