[ Index ] |
PHP Cross Reference of moodle-2.8 |
[Summary view] [Print] [Text view]
1 <?php 2 3 // This file is part of Moodle - http://moodle.org/ 4 // 5 // Moodle is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // Moodle is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU General Public License for more details. 14 // 15 // You should have received a copy of the GNU General Public License 16 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 17 18 /** 19 * This plugin is used to access files by providing an url 20 * 21 * @since Moodle 2.0 22 * @package repository_url 23 * @copyright 2010 Dongsheng Cai {@link http://dongsheng.org} 24 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 25 */ 26 require_once($CFG->dirroot . '/repository/lib.php'); 27 require_once(dirname(__FILE__).'/locallib.php'); 28 29 /** 30 * repository_url class 31 * A subclass of repository, which is used to download a file from a specific url 32 * 33 * @since Moodle 2.0 34 * @package repository_url 35 * @copyright 2009 Dongsheng Cai {@link http://dongsheng.org} 36 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 37 */ 38 class repository_url extends repository { 39 var $processedfiles = array(); 40 41 /** 42 * @param int $repositoryid 43 * @param object $context 44 * @param array $options 45 */ 46 public function __construct($repositoryid, $context = SYSCONTEXTID, $options = array()){ 47 global $CFG; 48 parent::__construct($repositoryid, $context, $options); 49 $this->file_url = optional_param('file', '', PARAM_URL); 50 } 51 52 public function check_login() { 53 if (!empty($this->file_url)) { 54 return true; 55 } else { 56 return false; 57 } 58 } 59 /** 60 * @return mixed 61 */ 62 public function print_login() { 63 $strdownload = get_string('download', 'repository'); 64 $strname = get_string('rename', 'repository_url'); 65 $strurl = get_string('url', 'repository_url'); 66 if ($this->options['ajax']) { 67 $url = new stdClass(); 68 $url->label = $strurl.': '; 69 $url->id = 'fileurl'; 70 $url->type = 'text'; 71 $url->name = 'file'; 72 73 $ret['login'] = array($url); 74 $ret['login_btn_label'] = get_string('download', 'repository_url'); 75 $ret['allowcaching'] = true; // indicates that login form can be cached in filepicker.js 76 return $ret; 77 } else { 78 echo <<<EOD 79 <table> 80 <tr> 81 <td>{$strurl}: </td><td><input name="file" type="text" /></td> 82 </tr> 83 </table> 84 <input type="submit" value="{$strdownload}" /> 85 EOD; 86 87 } 88 } 89 90 /** 91 * @param mixed $path 92 * @param string $search 93 * @return array 94 */ 95 public function get_listing($path='', $page='') { 96 global $CFG, $OUTPUT; 97 $ret = array(); 98 $ret['list'] = array(); 99 $ret['nosearch'] = true; 100 $ret['norefresh'] = true; 101 $ret['nologin'] = true; 102 103 $this->parse_file(null, $this->file_url, $ret, true); 104 return $ret; 105 } 106 107 /** 108 * Parses one file (either html or css) 109 * 110 * @param string $baseurl (optional) URL of the file where link to this file was found 111 * @param string $relativeurl relative or absolute link to the file 112 * @param array $list 113 * @param bool $mainfile true only for main HTML false and false for all embedded/linked files 114 */ 115 protected function parse_file($baseurl, $relativeurl, &$list, $mainfile = false) { 116 if (preg_match('/([\'"])(.*)\1/', $relativeurl, $matches)) { 117 $relativeurl = $matches[2]; 118 } 119 if (empty($baseurl)) { 120 $url = $relativeurl; 121 } else { 122 $url = htmlspecialchars_decode(url_to_absolute($baseurl, $relativeurl)); 123 } 124 if (in_array($url, $this->processedfiles)) { 125 // avoid endless recursion 126 return; 127 } 128 $this->processedfiles[] = $url; 129 $curl = new curl; 130 $curl->setopt(array('CURLOPT_FOLLOWLOCATION' => true, 'CURLOPT_MAXREDIRS' => 3)); 131 $msg = $curl->head($url); 132 $info = $curl->get_info(); 133 if ($info['http_code'] != 200) { 134 if ($mainfile) { 135 $list['error'] = $msg; 136 } 137 } else { 138 $csstoanalyze = ''; 139 if ($mainfile && (strstr($info['content_type'], 'text/html') || empty($info['content_type']))) { 140 // parse as html 141 $htmlcontent = $curl->get($info['url']); 142 $ddoc = new DOMDocument(); 143 @$ddoc->loadHTML($htmlcontent); 144 // extract <img> 145 $tags = $ddoc->getElementsByTagName('img'); 146 foreach ($tags as $tag) { 147 $url = $tag->getAttribute('src'); 148 $this->add_image_to_list($info['url'], $url, $list); 149 } 150 // analyse embedded css (<style>) 151 $tags = $ddoc->getElementsByTagName('style'); 152 foreach ($tags as $tag) { 153 if ($tag->getAttribute('type') == 'text/css') { 154 $csstoanalyze .= $tag->textContent."\n"; 155 } 156 } 157 // analyse links to css (<link type='text/css' href='...'>) 158 $tags = $ddoc->getElementsByTagName('link'); 159 foreach ($tags as $tag) { 160 if ($tag->getAttribute('type') == 'text/css' && strlen($tag->getAttribute('href'))) { 161 $this->parse_file($info['url'], $tag->getAttribute('href'), $list); 162 } 163 } 164 } else if (strstr($info['content_type'], 'css')) { 165 // parse as css 166 $csscontent = $curl->get($info['url']); 167 $csstoanalyze .= $csscontent."\n"; 168 } else if (strstr($info['content_type'], 'image/')) { 169 // download this file 170 $this->add_image_to_list($info['url'], $info['url'], $list); 171 } else { 172 $list['error'] = get_string('validfiletype', 'repository_url'); 173 } 174 175 // parse all found css styles 176 if (strlen($csstoanalyze)) { 177 $urls = extract_css_urls($csstoanalyze); 178 if (!empty($urls['property'])) { 179 foreach ($urls['property'] as $url) { 180 $this->add_image_to_list($info['url'], $url, $list); 181 } 182 } 183 if (!empty($urls['import'])) { 184 foreach ($urls['import'] as $cssurl) { 185 $this->parse_file($info['url'], $cssurl, $list); 186 } 187 } 188 } 189 } 190 } 191 protected function add_image_to_list($baseurl, $url, &$list) { 192 if (empty($list['list'])) { 193 $list['list'] = array(); 194 } 195 $src = url_to_absolute($baseurl, htmlspecialchars_decode($url)); 196 foreach ($list['list'] as $image) { 197 if ($image['source'] == $src) { 198 return; 199 } 200 } 201 $list['list'][] = array( 202 'title'=>$this->guess_filename($url, ''), 203 'source'=>$src, 204 'thumbnail'=>$src, 205 'thumbnail_height'=>84, 206 'thumbnail_width'=>84 207 ); 208 } 209 public function guess_filename($url, $type) { 210 $pattern = '#\/([\w_\?\-.]+)$#'; 211 $matches = null; 212 preg_match($pattern, $url, $matches); 213 if (empty($matches[1])) { 214 return $url; 215 } else { 216 return $matches[1]; 217 } 218 } 219 220 public function supported_returntypes() { 221 return (FILE_INTERNAL | FILE_EXTERNAL); 222 } 223 224 /** 225 * Return the source information 226 * 227 * @param stdClass $url 228 * @return string|null 229 */ 230 public function get_file_source_info($url) { 231 return $url; 232 } 233 234 /** 235 * file types supported by url downloader plugin 236 * 237 * @return array 238 */ 239 public function supported_filetypes() { 240 return array('web_image'); 241 } 242 243 /** 244 * Is this repository accessing private data? 245 * 246 * @return bool 247 */ 248 public function contains_private_data() { 249 return false; 250 } 251 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 20:29:05 2014 | Cross-referenced by PHPXref 0.7.1 |