89eca146a50b17016e3efdde4e5b84134e94d45f
[moodle.git] / backup / cc / entities.class.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16 /**
17  * @package   moodlecore
18  * @subpackage backup-imscc
19  * @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
20  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
21  */
23 defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
25 class entities {
27     public function load_xml_resource ($path_to_file) {
29         $resource = new DOMDocument();
31         cc2moodle::log_action('Load the XML resource file: ' . $path_to_file);
33         if (!$resource->load($path_to_file)) {
34             cc2moodle::log_action('Cannot load the XML resource file: ' . $path_to_file, true);
35         }
37         return $resource;
38     }
40     public function update_sources ($html, $root_path = '') {
42         $document = new DOMDocument();
44         @$document->loadHTML($html);
46         $tags = array('img' => 'src' , 'a' => 'href');
48         foreach ($tags as $tag => $attribute) {
50             $elements = $document->getElementsByTagName($tag);
52             foreach ($elements as $element) {
54                 $attribute_value = $element->getAttribute($attribute);
55                 $protocol = parse_url($attribute_value, PHP_URL_SCHEME);
57                 if (empty($protocol)) {
58                     $attribute_value = str_replace("\$IMS-CC-FILEBASE\$", "", $attribute_value);
59                     $attribute_value = $this->full_path($root_path . "/" . $attribute_value, "/");
60                     $attribute_value = "\$@FILEPHP@\$" . "/" . $attribute_value;
61                 }
63                 $element->setAttribute($attribute, $attribute_value);
64             }
65         }
67         $html = $this->clear_doctype($document->saveHTML());
69         return $html;
70     }
72     public function full_path ($path, $dir_sep = DIRECTORY_SEPARATOR) {
74         $token = '$IMS-CC-FILEBASE$';
75         $path = str_replace($token, '', $path);
77         if (is_string($path) && ($path != '')) {
78             $dir_sep;
79             $dot_dir = '.';
80             $up_dir = '..';
81             $length = strlen($path);
82             $rtemp = trim($path);
83             $start = strrpos($path, $dir_sep);
84             $can_continue = ($start !== false);
85             $result = $can_continue ? '' : $path;
86             $rcount = 0;
88             while ($can_continue) {
90                 $dir_part = ($start !== false) ? substr($rtemp, $start + 1, $length - $start) : $rtemp;
91                 $can_continue = ($dir_part !== false);
93                 if ($can_continue) {
94                     if ($dir_part != $dot_dir) {
95                         if ($dir_part == $up_dir) {
96                             $rcount++;
97                         } else {
98                             if ($rcount > 0) {
99                                 $rcount --;
100                             } else {
101                                 $result = ($result == '') ? $dir_part : $dir_part . $dir_sep . $result;
102                             }
103                         }
104                     }
105                     $rtemp = substr($path, 0, $start);
106                     $start = strrpos($rtemp, $dir_sep);
107                     $can_continue = (($start !== false) || (strlen($rtemp) > 0));
108                 }
109             }
110         }
112         return $result;
114     }
116     public function include_titles ($html) {
118         $document = new DOMDocument();
119         @$document->loadHTML($html);
121         $images = $document->getElementsByTagName('img');
123         foreach ($images as $image) {
125             $src = $image->getAttribute('src');
126             $alt = $image->getAttribute('alt');
127             $title = $image->getAttribute('title');
129             $filename = pathinfo($src);
130             $filename = $filename['filename'];
132             $alt = empty($alt) ? $filename : $alt;
133             $title = empty($title) ? $filename : $title;
135             $image->setAttribute('alt', $alt);
136             $image->setAttribute('title', $title);
137         }
139         $html = $this->clear_doctype($document->saveHTML());
141         return $html;
142     }
144     public function get_external_xml ($identifier) {
146         $response = '';
148         $xpath = cc2moodle::newx_path(cc2moodle::$manifest, cc2moodle::$namespaces);
150         $files = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $identifier . '"]/imscc:file/@href');
152         if (empty($files)) {
153             $response = '';
154         } else {
155             $response = $files->item(0)->nodeValue;
156         }
158         return $response;
159     }
161     public function move_files ($files, $destination_folder) {
163         if (!empty($files)) {
165             foreach ($files as $file) {
167                 $source = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $file->nodeValue;
168                 $destination = $destination_folder . DIRECTORY_SEPARATOR . $file->nodeValue;
170                 $destination_directory = dirname($destination);
172                 cc2moodle::log_action('Copy the file: ' . $source . ' to ' . $destination);
174                 //echo 'Copy the file: ' . $source . ' to ' . $destination . '<br>';
176                 if (!file_exists($destination_directory)) {
177                     mkdir($destination_directory, 0777, true);
178                 }
180                 $copy_success = @copy($source, $destination);
182                 if (!$copy_success) {
183                     notify('WARNING: Cannot copy the file ' . $source . ' to ' . $destination);
184                     cc2moodle::log_action('Cannot copy the file ' . $source . ' to ' . $destination, false);
185                 }
186             }
187         }
188     }
190     private function get_all_files () {
192         $all_files = array();
194         $xpath = cc2moodle::newx_path(cc2moodle::$manifest, cc2moodle::$namespaces);
196         $types = array('associatedcontent/imscc_xmlv1p0/learning-application-resource',
197                        'webcontent',
198                       );
200         foreach ($types as $type) {
202             $files = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@type="' . $type . '"]/imscc:file/@href');
204             if (!empty($files)) {
205                 foreach ($files as $file) {
206                     $all_files[] = $file;
207                 }
208             }
210             unset($files);
211         }
213         $all_files = empty($all_files) ? '' : $all_files;
215         return $all_files;
216     }
218     public function move_all_files() {
220         $files = $this->get_all_files();
222         if (!empty($files)) {
223             $this->move_files($files, cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'course_files', true);
224         }
226     }
228     private function clear_doctype ($html) {
230         return preg_replace('/^<!DOCTYPE.+?>/',
231                             '',
232                             str_replace(array('<html>' , '</html>' , '<body>' , '</body>'),
233                                         array('' , '' , '' , ''),
234                                         $html));
235     }
237     public function generate_random_string ($length = 6) {
239         $response = '';
240         $source = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
242         if ($length > 0) {
244             $response = '';
245             $source = str_split($source, 1);
247             for ($i = 1; $i <= $length; $i++) {
248                 mt_srand((double) microtime() * 1000000);
249                 $num = mt_rand(1, count($source));
250                 $response .= $source[$num - 1];
251             }
252         }
254         return $response;
255     }
257     public function truncate_text ($text, $max, $remove_html) {
259         if ($max > 10) {
260             $text = substr($text, 0, ($max - 6)) . ' [...]';
261         } else {
262             $text = substr($text, 0, $max);
263         }
265         $text = $remove_html ? strip_tags($text) : $text;
267         return $text;
268     }