Vasilis Daloukas
9 years ago
12 changed files with 35 additions and 1265 deletions
@ -1,749 +0,0 @@ |
|||||
<?php |
|
||||
// This file is part of Moodle - http://moodle.org/ |
|
||||
// |
|
||||
// Moodle is free software: you can redistribute it and/or modify |
|
||||
// it under the terms of the GNU General Public License as published by |
|
||||
// the Free Software Foundation, either version 3 of the License, or |
|
||||
// (at your option) any later version. |
|
||||
// |
|
||||
// Moodle is distributed in the hope that it will be useful, |
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
// GNU General Public License for more details. |
|
||||
// |
|
||||
// You should have received a copy of the GNU General Public License |
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|
||||
|
|
||||
/** |
|
||||
* This is a very rough importer for odt |
|
||||
* |
|
||||
* The script supports book |
|
||||
* Is based on class office from http://www.phpclasses.org/browse/package/2586.html |
|
||||
* |
|
||||
* @version $Id: importodt.php,v 1.5 2012/07/25 11:16:04 bdaloukas Exp $ |
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License |
|
||||
* @package game |
|
||||
**/ |
|
||||
|
|
||||
require_once("../../../config.php"); |
|
||||
require_once( "../header.php"); |
|
||||
require_once("../locallib.php"); |
|
||||
|
|
||||
$subchapter = optional_param('subchapter', '', PARAM_ALPHA); |
|
||||
$overwrite = optional_param('overwrite', 0, PARAM_INT); |
|
||||
$attempt = game_getattempt( $game, $detail); |
|
||||
$bookid = $game->bookid; |
|
||||
if ($bookid == 0) { |
|
||||
print_error( get_string( 'bookquiz_not_select_book', 'game')); |
|
||||
} |
|
||||
|
|
||||
if ($form = data_submitted()) { |
|
||||
// Filename. |
|
||||
if (empty($_FILES['newfile'])) { |
|
||||
// File was just uploaded. |
|
||||
notify(get_string("uploadproblem") ); |
|
||||
} |
|
||||
|
|
||||
if ((!is_uploaded_file($_FILES['newfile']['tmp_name']) or $_FILES['newfile']['size'] == 0)) { |
|
||||
notify(get_string("uploadnofilefound") ); |
|
||||
} else { |
|
||||
// Valid file is found. |
|
||||
if (readdata( $course->id, 'game', $dirtemp, $rlevels, $rtitles, $rtexts, $dirfordelete)) { |
|
||||
// First try to reall all of the data in. |
|
||||
if ($overwrite) { |
|
||||
game_bookquiz_deletebook( $course->id, $bookid); |
|
||||
} |
|
||||
// Parse all the html files into objects. |
|
||||
$pageobjects = extract_data( $course->id, 'book', $bookid, $dirtemp, $subchapter, $rlevels, $rtitles, $rtexts); |
|
||||
clean_temp( $dirfordelete); // All done with files so dump em. |
|
||||
|
|
||||
// Function to preps the data to be sent to DB. |
|
||||
$objects = game_bookquiz_create_objects( $pageobjects, $bookid); |
|
||||
|
|
||||
if (!game_bookquiz_save_objects( $objects)) { |
|
||||
// Sends it to DB. |
|
||||
print_error('could not save'); |
|
||||
} |
|
||||
} else { |
|
||||
print_error('could not get data'); |
|
||||
} |
|
||||
|
|
||||
print_continue("{$CFG->wwwroot}/mod/game/view.php?id=$cm->id"); |
|
||||
echo $OUTPUT->footer($course); |
|
||||
exit; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
// Print upload form. |
|
||||
|
|
||||
print_heading_with_help( get_string( "bookquiz_import_odt", "game"), "importodt", "game"); |
|
||||
|
|
||||
echo $OUTPUT->box_start('center'); |
|
||||
?> |
|
||||
<form id="theform" enctype="multipart/form-data" method="post"> |
|
||||
<input type="hidden" name="id" value="<?php echo $cm->id; ?>" /> |
|
||||
<table cellpadding="5"> |
|
||||
|
|
||||
<tr><td align="right"><b> |
|
||||
<?php print_string("upload"); ?> :</td><td> |
|
||||
<input name="newfile" type="file" size="50" /> |
|
||||
|
|
||||
<tr valign="top"> |
|
||||
<td valign="top" align="right"> |
|
||||
<b><?php echo get_string( 'bookquiz_subchapter', 'game');?>:</b> |
|
||||
</td> |
|
||||
<td> |
|
||||
<input name="subchapter" type="checkbox" value="1" checked="1" /> </td> |
|
||||
</tr> |
|
||||
|
|
||||
<tr valign="top"><td align="right"><b></b></td><td align="left"><select id="overwrite" name="overwrite" > |
|
||||
<option value="0" selected="selected">Προσθήκη στο τέλος</option> |
|
||||
<option value="1">Αντικατάσταση</option> |
|
||||
</select> |
|
||||
</td></tr> |
|
||||
|
|
||||
</td></tr><tr><td> </td><td> |
|
||||
<input type="submit" name="save" value="<?php echo get_string("uploadthisfile"); ?>" /> |
|
||||
</td></tr> |
|
||||
|
|
||||
</table> |
|
||||
</form> |
|
||||
<?php |
|
||||
echo $OUTPUT->box_end(); |
|
||||
|
|
||||
echo $OUTPUT->footer($course); |
|
||||
|
|
||||
// START OF FUNCTIONS. |
|
||||
|
|
||||
// The rbasedir variable contains the directory where the temp files are. |
|
||||
// At the end the directory must be deleted. |
|
||||
function readdata( $courseid, $modname, &$rbasedir, &$rlevels, &$rtitles, &$rtexts, &$dirfordelete) { |
|
||||
// This function expects a odt file to be uploaded. Then it parses the content.xml to determine. |
|
||||
// Then copies the images. |
|
||||
global $CFG; |
|
||||
|
|
||||
// Create a random upload directory in temp. |
|
||||
$newdir = $CFG->dataroot."/temp/$modname"; |
|
||||
if (!file_exists( $newdir)) { |
|
||||
mkdir( $newdir); |
|
||||
} |
|
||||
|
|
||||
$i = 1; |
|
||||
srand((double)microtime() * 1000000); |
|
||||
while (true) { |
|
||||
$rbasedir = "$modname/$i-".rand(0, 10000); |
|
||||
$newdir = $CFG->dataroot.'/temp/'.$rbasedir; |
|
||||
if (!file_exists( $newdir)) { |
|
||||
mkdir( $newdir); |
|
||||
$newdir .= '/'; |
|
||||
break; |
|
||||
} |
|
||||
$i++; |
|
||||
} |
|
||||
$dirfordelete = $rbasedir; |
|
||||
$rbasedir .= '/'; |
|
||||
|
|
||||
$zipfile = $_FILES["newfile"]["name"]; |
|
||||
$tempzipfile = $_FILES["newfile"]["tmp_name"]; |
|
||||
|
|
||||
// Creates our directory. |
|
||||
$pathparts = pathinfo($zipfile); |
|
||||
// Takes off the extension. |
|
||||
$dirname = substr($zipfile, 0, strpos($zipfile, '.'.$pathparts['extension'])); |
|
||||
if (!file_exists($newdir.$dirname)) { |
|
||||
mkdir($newdir.$dirname); |
|
||||
} |
|
||||
|
|
||||
// Move our uploaded file to temp/game. |
|
||||
move_uploaded_file( $tempzipfile, $newdir.$zipfile); |
|
||||
|
|
||||
// If the file ends with .lnk then use .odt instead. |
|
||||
if (substr( $zipfile, -4) == ".lnk") { |
|
||||
$zipfile = substr( $zipfile, 0, -4).".odt"; |
|
||||
} |
|
||||
|
|
||||
// Unzip it! |
|
||||
unzip_file ( $newdir.$zipfile, $newdir.$dirname, false); |
|
||||
|
|
||||
$rbasedir .= $dirname; // Update the base. |
|
||||
$newdir .= $dirname; |
|
||||
|
|
||||
// This is the file where we get the names of the files for the slides (in the correct order too). |
|
||||
$content = $newdir.'/content.xml'; |
|
||||
$data = file_get_contents( $content); |
|
||||
|
|
||||
$content = $newdir.'/styles.xml'; |
|
||||
if (file_exists( $content)) { |
|
||||
$datastyle = file_get_contents( $content); |
|
||||
} else { |
|
||||
$datastyle = ''; |
|
||||
} |
|
||||
|
|
||||
oo_game_convert_ver2( $data, $datastyle, $rlevels, $rtitles, $rtexts); |
|
||||
|
|
||||
return true; |
|
||||
} |
|
||||
|
|
||||
function oo_game_convert_ver2( $data, $datastyle, &$rlevels, &$rtitles, &$rtexts) { |
|
||||
$rlevels = array(); |
|
||||
$rtitles = array(); |
|
||||
$rtexts = array(); |
|
||||
|
|
||||
// We have tables, encode it here so all <text:p in them don't get preg_match_all few lines later. |
|
||||
if (ereg('table:table', $data)) { |
|
||||
$data = str_replace('<table:table', '<text:p text:style-name="RKRK"><table:table', $data); |
|
||||
$data = str_replace('</table:table>', '</table:table></text:p>', $data); |
|
||||
$data = preg_replace('#<table:table(.*?)</table:table>#es', "base64_encode('\\1')", $data); |
|
||||
} |
|
||||
|
|
||||
$styles = array(); |
|
||||
game_bookquiz_convert_ver2_computestyles( $datastyle, $styles, true); |
|
||||
game_bookquiz_convert_ver2_computestyles( $data, $styles, false); |
|
||||
|
|
||||
game_bookquiz_splitsections($data, $positions, $inputs, $titles, $titleframes, $texts); |
|
||||
for ($i = 0; $i < count( $positions); $i++) { |
|
||||
preg_match_all( "#text:outline-level=\"([0-9]*)\"#es", $inputs[ $i], $matches); |
|
||||
$levels = $matches[ 1]; |
|
||||
if (count( $levels) > 0) { |
|
||||
$level = $levels[ 0]; |
|
||||
} else { |
|
||||
$level = 0; |
|
||||
} |
|
||||
|
|
||||
$rlevels[] = $level; |
|
||||
$rtitles[] = strip_tags( $titles[ $i]); |
|
||||
|
|
||||
$textframe = game_bookquiz_convert($titleframes[ $i], $styles, $images); |
|
||||
$text = game_bookquiz_convert($texts[ $i], $styles, $images); |
|
||||
|
|
||||
if ($textframe != '') { |
|
||||
$text = $textframe.'<br>'.$text; |
|
||||
} |
|
||||
|
|
||||
echo "<hr><b>".$titles[ $i]."</b><br>".$text."\r\n\r\n\r\n\r\n"; |
|
||||
|
|
||||
$rtexts[] = $text; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
function extract_data( $courseid, $modname, $id, $basedir, $subchapter, $levels, $titles, $texts) { |
|
||||
global $CFG; |
|
||||
global $matches; |
|
||||
|
|
||||
$dirtemp = $CFG->dataroot.'/temp/'.$basedir; |
|
||||
|
|
||||
for ($i = 0; $i < count( $levels); $i++) { |
|
||||
echo $levels[ $i]." ".$titles[ $i]."<br>"; |
|
||||
} |
|
||||
|
|
||||
$extractedpages = array(); |
|
||||
|
|
||||
// Directory for images. |
|
||||
make_mod_upload_directory( $courseid); // Make sure moddata is made. |
|
||||
make_upload_directory( $courseid.'/moddata/'.$modname, false); |
|
||||
// We store our images in a subfolder in here. |
|
||||
make_upload_directory( $courseid.'/moddata/'.$modname."/".$id, false); |
|
||||
|
|
||||
$imagedir = $CFG->dataroot.'/'.$courseid.'/moddata/'.$modname."/".$id; |
|
||||
|
|
||||
if ($CFG->slasharguments) { |
|
||||
$imagelink = $CFG->wwwroot.'/file.php/'.$courseid.'/moddata/'.$modname."/".$id; |
|
||||
} else { |
|
||||
$imagelink = $CFG->wwwroot.'/file.php?file=/'.$courseid.'/moddata/'.$modname."/".$id; |
|
||||
} |
|
||||
|
|
||||
// Try to make a unique subfolder to store the images. |
|
||||
$i = 1; |
|
||||
while (true) { |
|
||||
$newdir = $imagedir.'/'.$i; |
|
||||
if (!file_exists( $newdir)) { |
|
||||
// Ok doesnt exist so make the directory and update our paths. |
|
||||
mkdir( $newdir); |
|
||||
$imagedir = $newdir; |
|
||||
$imagelink = $imagelink.'/'.$i; |
|
||||
break; |
|
||||
} |
|
||||
$i++; |
|
||||
} |
|
||||
|
|
||||
for ($i = 0; $i < count( $titles); $i++) { |
|
||||
// Start building our page. |
|
||||
$page = new stdClass; |
|
||||
$page->title = $titles[ $i]; |
|
||||
$page->content = $texts[ $i]; |
|
||||
$page->subchapter = ( $levels[ $i] >= 2); |
|
||||
|
|
||||
// Check if the nexts are subchapters. |
|
||||
for ($j = $i + 1; $j < count( $titles); $j++) { |
|
||||
if ($levels[ $j] > 2) { |
|
||||
$page->content .= '<br><b><u>'.$titles[ $j].'</u></b><br>'.$texts[ $j]; |
|
||||
$i = $j; |
|
||||
continue; |
|
||||
} |
|
||||
break; |
|
||||
} |
|
||||
|
|
||||
preg_match_all('#="Pictures/([a-z .A-Z_0-9]*)"#es', $page->content, $imgs); |
|
||||
|
|
||||
foreach ($imgs[1] as $img) { |
|
||||
$src = $dirtemp.'/Pictures/'.$img; |
|
||||
$dest = $imagedir.'/'.$img; |
|
||||
rename( $src, $dest); |
|
||||
|
|
||||
$page->content = str_replace( "Pictures/$img", $imagelink."/".$img, $page->content); |
|
||||
} |
|
||||
|
|
||||
// Add the page to the array. |
|
||||
$extractedpages[] = $page; |
|
||||
} // End $pages foreach loop. |
|
||||
|
|
||||
return $extractedpages; |
|
||||
} |
|
||||
|
|
||||
/* |
|
||||
Clean up the temp directory |
|
||||
*/ |
|
||||
function clean_temp( $base) { |
|
||||
global $CFG; |
|
||||
|
|
||||
// This function is broken, use it to clean up later. |
|
||||
// Should only clean up what we made as well because someone else could be importing ppt as well. |
|
||||
$dir = $CFG->dataroot.'/temp/'.$base; |
|
||||
|
|
||||
remove_dir( $dir); |
|
||||
} |
|
||||
|
|
||||
/* |
|
||||
Creates objects an chapter object that is to be inserted into the database |
|
||||
*/ |
|
||||
function game_bookquiz_create_objects( $pageobjects, $bookid) { |
|
||||
global $DB; |
|
||||
|
|
||||
$chapters = array(); |
|
||||
|
|
||||
$lastpagenum = $DB->get_field('book_chapters', 'MAX(pagenum) as num', array( 'bookid' => $bookid)); |
|
||||
|
|
||||
foreach ($pageobjects as $pageobject) { |
|
||||
$chapter = new stdClass; |
|
||||
|
|
||||
// Same for all chapters. |
|
||||
$chapter->bookid = $bookid; |
|
||||
$chapter->pagenum = ++$lastpagenum; |
|
||||
$chapter->timecreated = time(); |
|
||||
$chapter->timemodified = time(); |
|
||||
$chapter->subchapter = 0; |
|
||||
|
|
||||
if ($pageobject->title == '') { |
|
||||
$chapter->title = "Page $count"; // No title set so make a generic one. |
|
||||
} else { |
|
||||
$chapter->title = addslashes($pageobject->title); |
|
||||
} |
|
||||
$chapter->subchapter = $pageobject->subchapter; |
|
||||
|
|
||||
$content = str_replace("\n", '', $pageobject->content); |
|
||||
$content = str_replace("\r", '', $content); |
|
||||
$content = str_replace(' ', '', $content); // Puts in returns? |
|
||||
$content = '<p>'.$content.'</p>'; |
|
||||
|
|
||||
$chapter->content = addslashes( $content); |
|
||||
|
|
||||
$chapters[] = $chapter; |
|
||||
} |
|
||||
|
|
||||
return $chapters; |
|
||||
} |
|
||||
|
|
||||
// Save the chapter objects to the database. |
|
||||
function game_bookquiz_save_objects($chapters) { |
|
||||
global $DB; |
|
||||
|
|
||||
// Nothing fancy, just save them all in order. |
|
||||
foreach ($chapters as $chapter) { |
|
||||
if (!$newid = $DB->insert_record('book_chapters', $chapter)) { |
|
||||
print_error('Could not insert to table book_chapters'); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
return true; |
|
||||
} |
|
||||
|
|
||||
// Splits the data to. |
|
||||
function game_bookquiz_splitsections($data, &$positions, &$inputs, &$titles, &$titleframes, &$texts) { |
|
||||
preg_match_all('#<text:h (.*?)>(.*?)</text:h>#es', $data, $matches, PREG_OFFSET_CAPTURE); |
|
||||
|
|
||||
$in = $matches[ 1]; |
|
||||
$title = $matches[ 2]; |
|
||||
|
|
||||
$positions = array(); |
|
||||
$inputs = array(); |
|
||||
$titles = array(); |
|
||||
|
|
||||
$oldposition = 0; |
|
||||
$oldlen = 0; |
|
||||
for ($i = 0; $i < count( $in); $i++) { |
|
||||
$inputs[] = $in[ $i][ 0]; |
|
||||
|
|
||||
$newposition = $in[ $i][ 1]; |
|
||||
$positions[] = $newposition; |
|
||||
|
|
||||
$titlenet = $title[ $i][ 0]; |
|
||||
$titleframe = ''; |
|
||||
|
|
||||
// Frames inside header. |
|
||||
preg_match_all('#<draw:frame (.*?)>(.*?)</draw:frame>#es', $titlenet, $titlematches, PREG_OFFSET_CAPTURE); |
|
||||
$frames = $titlematches[ 2]; |
|
||||
if (count( $frames) > 0) { |
|
||||
for ($j = 0; $j < count( $frames); $j++) { |
|
||||
$titleframe .= $frames[ $j][ 0]; |
|
||||
$titlenet = substr( $titlenet, $frames[ $j][ 1] + strlen( $frames[ $j][ 0]) + 13); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
$titles[] = $titlenet; |
|
||||
$titleframes[] = $titleframe; |
|
||||
|
|
||||
if ($i > 0) { |
|
||||
$texts[] = substr( $data, $oldposition + $oldlen, $newposition - $oldposition - $oldlen); |
|
||||
} |
|
||||
|
|
||||
$oldlen = strlen( $title[ $i][ 0]) + strlen( $in[ $i][ 0]) + 10; |
|
||||
$oldposition = $newposition; |
|
||||
} |
|
||||
$newposition = strlen( $data); |
|
||||
$texts[] = substr( $data, $oldposition + $oldlen, $newposition - $oldposition - $oldlen); |
|
||||
} |
|
||||
|
|
||||
function game_bookquiz_convert( $data, $styles, &$images) { |
|
||||
$images = array(); |
|
||||
|
|
||||
// Get data. |
|
||||
preg_match_all('#<text:p text:style-name="([a-z A-Z_0-9]*)">(.*?)</text:p>#es', $data, $text); |
|
||||
$originals = $text[ 0]; |
|
||||
$names = $text[ 1]; |
|
||||
$texts = $text[ 2]; |
|
||||
|
|
||||
for ($i = 0; $i < count( $texts); $i++) { |
|
||||
$name = $names[ $i]; |
|
||||
$text = $texts[ $i]; |
|
||||
|
|
||||
// Repairs draw:frame. |
|
||||
$pattern = "#<draw:frame draw:style-name=\"([a-z .A-Z_0-9]*)\" (.*?)<draw:image xlink:href=\"Pictures/([a-z .A-Z_0-9]*)(.*?)</draw:frame>#es"; |
|
||||
preg_match_all( $pattern, $text, $matches); |
|
||||
if (count( $matches[ 1]) ) { |
|
||||
$new = game_bookquiz_convert_image( $matches, $styles, $images); |
|
||||
$data = str_replace( $originals[ $i], $new, $data); |
|
||||
} else if ($name == 'RKRK') { |
|
||||
$new = game_bookquiz_convert_RKRK( $text); |
|
||||
$data = str_replace( $originals[ $i], $new, $data); |
|
||||
} else { |
|
||||
$new = '<P>'.game_bookquiz_convert_text( $text, $styles).'</P>'; |
|
||||
$data = str_replace( $originals[ $i], $new, $data); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
// Repairs text:span text:style-name. |
|
||||
preg_match_all( '#<text:span text:style-name="([a-z .A-Z_0-9]*)">(.*?)</text:span>#es', $data, $text); |
|
||||
$originals = $text[ 0]; |
|
||||
$names = $text[ 1]; |
|
||||
$texts = $text[ 2]; |
|
||||
for ($i = 0; $i < count( $texts); $i++) { |
|
||||
$name = $names[ $i]; |
|
||||
$text = $texts[ $i]; |
|
||||
|
|
||||
$pattern = "#<draw:frame draw:style-name=\"([a-z .A-Z_0-9]*)\" (.*?)<draw:image xlink:href=\"Pictures/([a-z .A-Z_0-9]*)(.*?)</draw:frame>#es"; |
|
||||
preg_match_all( $pattern, $text, $matches); |
|
||||
if (count( $matches[ 1]) ) { |
|
||||
$new = game_bookquiz_convert_image( $matches, $styles, $images); |
|
||||
$data = str_replace( $originals[ $i], $new, $data); |
|
||||
} else if ($name == 'RKRK') { |
|
||||
$new = game_bookquiz_convert_RKRK( $text); |
|
||||
$data = str_replace( $originals[ $i], $new, $data); |
|
||||
} else { |
|
||||
$new = "<span ".$styles[ $name].'>'.game_bookquiz_convert_text( $text, $styles).'</span>'; |
|
||||
$data = str_replace( $originals[ $i], $new, $data); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
// Repairs text:a. |
|
||||
preg_match_all( '#<text:a (.*?) xlink:href="(.*?)">(.*?)</text:a>#es', $data, $text); |
|
||||
$originals = $text[ 0]; |
|
||||
$hrefs = $text[ 2]; |
|
||||
$texts = $text[ 3]; |
|
||||
for ($i = 0; $i < count( $texts); $i++) { |
|
||||
$href = $hrefs[ $i]; |
|
||||
$text = $texts[ $i]; |
|
||||
|
|
||||
$new = "<a href=\"$href\">$text</a>"; |
|
||||
$data = str_replace( $originals[ $i], $new, $data); |
|
||||
} |
|
||||
|
|
||||
// Repair text:list. |
|
||||
preg_match_all( '#<text:list text:style-name="([a-z A-Z_0-9]*)">(.*?)</text:list>#es', $data, $text); |
|
||||
$originals = $text[ 0]; |
|
||||
$names = $text[ 1]; |
|
||||
$texts = $text[ 2]; |
|
||||
|
|
||||
for ($i = 0; $i < count( $texts); $i++) { |
|
||||
$new = '<UL>'.$texts[ $i].'</UL>'; |
|
||||
$data = str_replace( $originals[ $i], $new, $data); |
|
||||
|
|
||||
// I have to repair the listitems. |
|
||||
preg_match_all( '#<text:list-item>(.*?)</text:list-item>#es', $data, $listitems); |
|
||||
$originallistitems = $listitems[ 0]; |
|
||||
$items = $listitems[ 1]; |
|
||||
for ($j = 0; $j < count( $items); $j++) { |
|
||||
$new = '<LI>'.$items[ $j]; |
|
||||
$data = str_replace( $originallistitems[ $j], $new, $data); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
$data = str_replace( '<text:line-break/>', '<br>', $data); |
|
||||
|
|
||||
return $data; |
|
||||
} |
|
||||
|
|
||||
function game_bookquiz_convert_text( $text, $styles) { |
|
||||
$pattern = "#<text:span text:style-name=\"([a-z .A-Z_0-9]*)\">(.*?)</text:span>#es"; |
|
||||
preg_match_all( $pattern, $text, $matches); |
|
||||
|
|
||||
$originals = $matches[ 0]; |
|
||||
$names = $matches[ 1]; |
|
||||
$spantexts = $matches[ 2]; |
|
||||
|
|
||||
for ($i = 0; $i < count( $names); $i++) { |
|
||||
$name = $names[ $i]; |
|
||||
$style = $styles[ $name]; |
|
||||
|
|
||||
$new = "<text:span style=\"$style\">".$spantexts[ $i]."</text:span>"; |
|
||||
$text = str_replace( $originals[ $i], $new, $text); |
|
||||
} |
|
||||
|
|
||||
return $text; |
|
||||
} |
|
||||
|
|
||||
function game_bookquiz_convert_image( $matches, $xmlstyles, &$images) { |
|
||||
$ret = ''; |
|
||||
|
|
||||
$styles = $matches[ 1]; |
|
||||
$pictures = $matches[ 3]; |
|
||||
|
|
||||
for ($j = 0; $j < count( $pictures); $j++) { |
|
||||
$style = $styles[ $j]; |
|
||||
|
|
||||
$ret .= '<div class="'.$style.'"><img src="Pictures/'.$pictures[$j].'"></div>'; |
|
||||
$images[] = $pictures[$j]; |
|
||||
} |
|
||||
|
|
||||
return $ret; |
|
||||
} |
|
||||
|
|
||||
function game_bookquiz_convert_rkrk( $text) { |
|
||||
$table = base64_decode($text); |
|
||||
$table = stripslashes($table); |
|
||||
$table = strtr($table, array('</table:table>' => '</table>', '<table:table-row>' => '<tr>', '</table:table-row>' => '</tr>', '</table:table-cell>' => '</td>', '</table:table-header-rows>' => '', '<table:table-header-rows>' => '', '>' => ">\n", '</text:p>' => '')); |
|
||||
|
|
||||
preg_match_all('#table:name="(.*?)" table:style-name="(.*?)">#es', $table, $repl); |
|
||||
foreach ($repl[0] as $val) { |
|
||||
$table = str_replace($val, '<table border="1"><tr>', $table); |
|
||||
} |
|
||||
|
|
||||
preg_match_all('#<text:p text:style-name="(.*?)">#es', $table, $repl); |
|
||||
foreach ($repl[0] as $key => $val) { |
|
||||
$table = str_replace($val, '', $table); |
|
||||
} |
|
||||
|
|
||||
preg_match_all('#<table:table-column (.*?)">#es', $table, $repl); |
|
||||
foreach ($repl[0] as $val) { |
|
||||
$table = str_replace($val, '', $table); |
|
||||
} |
|
||||
|
|
||||
preg_match_all('#<table:table-cell table:style-name="(.*?)" office:value-type=(.*?)">#es', $table, $repl); |
|
||||
foreach ($repl[0] as $val) { |
|
||||
$table = str_replace($val, '<td>', $table); |
|
||||
} |
|
||||
|
|
||||
// Maybe there are a lot of pictures inside a table. |
|
||||
preg_match_all('#xlink:href="Pictures/([a-z.A-Z_0-9]*)"#es', $table, $repl); |
|
||||
foreach ($repl[ 1] as $picture) { |
|
||||
$table = str_replace('<draw:image xlink:href="Pictures/'.$picture.'" xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad"/>', '<img src="Pictures/'.$picture.'">', $table); |
|
||||
} |
|
||||
if (strpos( $table, "</table>") === false) { |
|
||||
$table .= "</table>"; |
|
||||
} |
|
||||
|
|
||||
$ret = '<BR>'.$table.'<BR>'; |
|
||||
|
|
||||
return $ret; |
|
||||
} |
|
||||
|
|
||||
function game_bookquiz_deletebook( $courseid, $bookid) { |
|
||||
global $CFG; |
|
||||
|
|
||||
if (!delete_records( 'book_chapters', 'bookid', $bookid)) { |
|
||||
print_error( "Can't delete records from book_chapters bookid=$bookid"); |
|
||||
} |
|
||||
|
|
||||
game_full_rmdir( "$CFG->dataroot/$courseid/moddata/book/$bookid"); |
|
||||
} |
|
||||
|
|
||||
function game_bookquiz_convert_ver2_computestyles( $data, &$styles, $isstyle) { |
|
||||
preg_match_all('#<style:style style:name="(.*?)"(.*?)>(.*?)</style:style>#es', $data, $style); |
|
||||
|
|
||||
$stylenames = $style[ 1]; |
|
||||
$styleinfos = $style[ 2]; |
|
||||
$styledatas = $style[ 3]; |
|
||||
for ($i = 0; $i < count( $stylenames); $i++) { |
|
||||
$name = $stylenames[ $i]; |
|
||||
|
|
||||
$change = false; |
|
||||
for (;;) { |
|
||||
$pos1 = strpos( $styledatas[ $i], 'style:parent-style-name'); |
|
||||
$pos2 = strpos( $styledatas[ $i], '/>'); |
|
||||
if (($pos1 === false) or ($pos2 === false)) { |
|
||||
break; |
|
||||
} |
|
||||
if ($pos1 > $pos2) { |
|
||||
break; |
|
||||
} |
|
||||
|
|
||||
// Is a parent style. |
|
||||
$s = substr( $styledatas[ $i], 0, $pos2 + 2); |
|
||||
game_bookquiz_convertstyle_parent( $s, $styles); |
|
||||
|
|
||||
$styledatas[ $i] = substr( $styledatas[ $i], $pos2 + 2); |
|
||||
$change = true; |
|
||||
} |
|
||||
|
|
||||
if ($change) { |
|
||||
// Must to recompute name, styledatas, styleinfos. |
|
||||
preg_match_all('#<style:style style:name="(.*?)"(.*?)>(.*?)</style:style>#es', $data, $style); |
|
||||
$name = $style[ 1][ 0]; |
|
||||
$styleinfos[ $i] = $style[ 2][ 0]; |
|
||||
$styledatas[ $i] = $style[ 3][ 0]; |
|
||||
} |
|
||||
|
|
||||
$styles[ $name] = game_bookquiz_convertstyle( $styledatas[ $i], $styleinfos[ $i], $styles); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
function game_bookquiz_convertstyle_parent( $data, &$styles) { |
|
||||
$styleitems = array(); |
|
||||
|
|
||||
preg_match_all( '#(.*?)style:name="(.*?)"(.*?)style:parent-style-name="(.*?)"(.*?)#es', $data, $infos); |
|
||||
$names = $infos[ 2]; |
|
||||
$parents = $infos[ 4]; |
|
||||
if (count( $parents)) { |
|
||||
if (array_key_exists( $parents[ 0], $styles)) { |
|
||||
// Is a child style. Must to copy the properties of the parent style. |
|
||||
$a = explode( ';', $styles[ $parents[ 0]]); |
|
||||
foreach ($a as $s) { |
|
||||
$pos = strpos( $s, ':'); |
|
||||
$key = substr( $s, 0, $pos); |
|
||||
$item = substr( $s, $pos + 1); |
|
||||
if ($item == '') { |
|
||||
continue; |
|
||||
} |
|
||||
$styleitems[ $key] = $item; |
|
||||
} |
|
||||
} |
|
||||
$name = $names[ 0]; |
|
||||
} |
|
||||
|
|
||||
$style = ''; |
|
||||
foreach ($styleitems as $key => $item) { |
|
||||
$style .= ';'.$key.':'.$item; |
|
||||
} |
|
||||
|
|
||||
$styles[ $name] = substr( $style, 1); |
|
||||
} |
|
||||
|
|
||||
function game_bookquiz_convertstyle( $data, $styleinfo, $styles) { |
|
||||
$styleitems = array(); |
|
||||
|
|
||||
preg_match_all( '#<style:paragraph-properties (.*?)/>#es', $data, $infos); |
|
||||
$lines = $infos[ 1]; |
|
||||
if (count( $lines)) { |
|
||||
$line = $lines[ 0]; |
|
||||
|
|
||||
if ($line != '') { |
|
||||
game_bookquiz_convertstyle_paragraph( $line, $styleitems); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
preg_match_all( '#<style:text-properties (.*?)/>#es', $data, $infos); |
|
||||
$lines = $infos[ 1]; |
|
||||
if (count( $lines)) { |
|
||||
$line = $lines[ 0]; |
|
||||
|
|
||||
if ($line != '') { |
|
||||
game_bookquiz_convertstyle_textproperties( $line, $styleitems); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
if (count( $styleitems) == 0) { |
|
||||
return ''; |
|
||||
} |
|
||||
|
|
||||
$style = ''; |
|
||||
foreach ($styleitems as $key => $item) { |
|
||||
$style .= ';'.$key.':'.$item; |
|
||||
} |
|
||||
|
|
||||
return substr( $style, 1); |
|
||||
} |
|
||||
|
|
||||
function game_bookquiz_convertstyle_paragraph( $line, &$styleitems) { |
|
||||
preg_match_all( '#(.*?)=(.*?) #es', $line.' ', $datas); |
|
||||
$data1 = $datas[ 1]; |
|
||||
$data2 = $datas[ 2]; |
|
||||
|
|
||||
$ret = ''; |
|
||||
for ($i = 0; $i < count( $data1); $i++) { |
|
||||
$eq1 = $data1[ $i]; |
|
||||
$eq2 = $data2[ $i]; |
|
||||
|
|
||||
if ((substr( $eq2, 0, 1) == '"') and (substr( $eq2, -1, 1) == '"')) { |
|
||||
$eq2 = substr( $eq2, 1, -1); |
|
||||
} |
|
||||
|
|
||||
switch ($eq1) { |
|
||||
case 'fo:text-align': |
|
||||
$styleitems[ 'align'] = $eq2; |
|
||||
break; |
|
||||
case 'fo:background-color': |
|
||||
$styleitems[ 'background-color'] = $eq2; |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
function game_bookquiz_convertstyle_textproperties( $line, &$styleitems) { |
|
||||
preg_match_all( '#(.*?)=(.*?) #es', $line.' ', $datas); |
|
||||
$data1 = $datas[ 1]; |
|
||||
$data2 = $datas[ 2]; |
|
||||
|
|
||||
$ret = ''; |
|
||||
for ($i = 0; $i < count( $data1); $i++) { |
|
||||
$eq1 = $data1[ $i]; |
|
||||
$eq2 = $data2[ $i]; |
|
||||
|
|
||||
if ((substr( $eq2, 0, 1) == '"') and (substr( $eq2, -1, 1) == '"')) { |
|
||||
$eq2 = substr( $eq2, 1, -1); |
|
||||
} |
|
||||
|
|
||||
switch( $eq1) { |
|
||||
case 'fo:font-size': |
|
||||
case 'fo:color': |
|
||||
case 'fo:background-color': |
|
||||
case 'fo:font-style': |
|
||||
case 'fo:font-weight': |
|
||||
$styleitems[ substr( $eq1, 3)] = $eq2; |
|
||||
break; |
|
||||
case 'style_text_underline_style': |
|
||||
if ($eq2 == 'solid') { |
|
||||
$styleitems[ 'text-decoration'] = 'underline'; |
|
||||
} |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
} |
|
@ -1,480 +0,0 @@ |
|||||
<?php |
|
||||
// This file is part of Moodle - http://moodle.org/ |
|
||||
// |
|
||||
// Moodle is free software: you can redistribute it and/or modify |
|
||||
// it under the terms of the GNU General Public License as published by |
|
||||
// the Free Software Foundation, either version 3 of the License, or |
|
||||
// (at your option) any later version. |
|
||||
// |
|
||||
// Moodle is distributed in the hope that it will be useful, |
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
// GNU General Public License for more details. |
|
||||
// |
|
||||
// You should have received a copy of the GNU General Public License |
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|
||||
|
|
||||
/** |
|
||||
* This is a very rough importer for powerpoint slides |
|
||||
* Export a powerpoint presentation with powerpoint as html pages |
|
||||
* Do it with office 2002 (I think?) and no special settings |
|
||||
* Then zip the directory with all of the html pages |
|
||||
* and the zip file is what you want to upload |
|
||||
* |
|
||||
* The script supports book and lesson. |
|
||||
* |
|
||||
* @version $Id: importppt.php,v 1.3 2012/07/25 11:16:05 bdaloukas Exp $ |
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License |
|
||||
* @package lesson |
|
||||
**/ |
|
||||
|
|
||||
require_once("../../config.php"); |
|
||||
require_once("locallib.php"); |
|
||||
|
|
||||
$id = required_param('id', PARAM_INT); // Course Module ID. |
|
||||
$pageid = optional_param('pageid', '', PARAM_INT); // Page ID. |
|
||||
global $matches; |
|
||||
|
|
||||
if (! $cm = get_coursemodule_from_id('lesson', $id)) { |
|
||||
print_error('Course Module ID was incorrect'); |
|
||||
} |
|
||||
|
|
||||
if (! $course = $DB->get_record('course', array( 'id' => $cm->course))) { |
|
||||
print_error('Course is misconfigured'); |
|
||||
} |
|
||||
|
|
||||
// Allows for adaption for multiple modules. |
|
||||
if (!$modname = $DB->get_field('modules', 'name', array( 'id' => $cm->module))) { |
|
||||
print_error('Could not find module name'); |
|
||||
} |
|
||||
|
|
||||
if (! $mod = $DB->get_record($modname, array( "id" => $cm->instance))) { |
|
||||
print_error('Course module is incorrect'); |
|
||||
} |
|
||||
|
|
||||
require_login($course->id, false); |
|
||||
$context = get_context_instance(CONTEXT_MODULE, $cm->id); |
|
||||
require_capability('mod/lesson:edit', $context); |
|
||||
|
|
||||
$strimportppt = get_string("importppt", "lesson"); |
|
||||
$strlessons = get_string("modulenameplural", "lesson"); |
|
||||
|
|
||||
echo $OUTPUT->heading("$strimportppt", " $strimportppt", |
|
||||
"<a href=\"index.php?id=$course->id\">$strlessons</a>". |
|
||||
" -> <a href=\"{$CFG->wwwroot}/mod/$modname/view.php?id=$cm->id\">".format_string($mod->name, true)."</a>-> $strimportppt"); |
|
||||
|
|
||||
if ($form = data_submitted()) { // Filename. |
|
||||
if (empty($_FILES['newfile'])) { // File was just uploaded. |
|
||||
notify(get_string("uploadproblem") ); |
|
||||
} |
|
||||
|
|
||||
if ((!is_uploaded_file($_FILES['newfile']['tmp_name']) or $_FILES['newfile']['size'] == 0)) { |
|
||||
notify(get_string("uploadnofilefound") ); |
|
||||
} else { |
|
||||
// Valid file is found. |
|
||||
if ($rawpages = readdata($_FILES, $course->id, $modname)) { |
|
||||
// First try to reall all of the data in. |
|
||||
// parse all the html files into objects. |
|
||||
$pageobjects = extract_data($rawpages, $course->id, $mod->name, $modname); |
|
||||
clean_temp(); // All done with files so dump em. |
|
||||
|
|
||||
$modcreateobjects = $modname.'_create_objects'; |
|
||||
$modsaveobjects = $modname.'_save_objects'; |
|
||||
|
|
||||
// Function to preps the data to be sent to DB. |
|
||||
$objects = $modcreateobjects($pageobjects, $mod->id); |
|
||||
|
|
||||
if (! $modsaveobjects($objects, $mod->id, $pageid)) { |
|
||||
// Sends it to DB. |
|
||||
print_error( 'could not save'); |
|
||||
} |
|
||||
} else { |
|
||||
print_error('could not get data'); |
|
||||
} |
|
||||
|
|
||||
echo "<hr>"; |
|
||||
print_continue("{$CFG->wwwroot}/mod/$modname/view.php?id=$cm->id"); |
|
||||
echo $OUTPUT->footer($course); |
|
||||
exit; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
// Print upload form. |
|
||||
print_heading_with_help($strimportppt, "importppt", "lesson"); |
|
||||
|
|
||||
echo $OUTPUT->box_start('center'); |
|
||||
echo "<form id=\"theform\" enctype=\"multipart/form-data\" method=\"post\">"; |
|
||||
echo "<input type=\"hidden\" name=\"id\" value=\"$cm->id\" />\n"; |
|
||||
echo "<input type=\"hidden\" name=\"pageid\" value=\"$pageid\" />\n"; |
|
||||
echo "<table cellpadding=\"5\">"; |
|
||||
|
|
||||
echo "<tr><td align=\"right\">"; |
|
||||
print_string("upload"); |
|
||||
echo ":</td><td>"; |
|
||||
echo "<input name=\"newfile\" type=\"file\" size=\"50\" />"; |
|
||||
echo "</td></tr><tr><td> </td><td>"; |
|
||||
echo "<input type=\"submit\" name=\"save\" value=\"".get_string("uploadthisfile")."\" />"; |
|
||||
echo "</td></tr>"; |
|
||||
|
|
||||
echo "</table>"; |
|
||||
echo "</form>"; |
|
||||
echo $OUTPUT->box_end(); |
|
||||
|
|
||||
echo $OUTPUT->footer($course); |
|
||||
|
|
||||
// START OF FUNCTIONS. |
|
||||
|
|
||||
/* this function expects a zip file to be uploaded. Then it parses |
|
||||
* outline.htm to determine the slide path. Then parses each |
|
||||
* slide to get data for the content |
|
||||
*/ |
|
||||
function readdata($file, $courseid, $modname) { |
|
||||
|
|
||||
global $CFG; |
|
||||
|
|
||||
// Create an upload directory in temp. |
|
||||
make_upload_directory('temp/'.$modname); |
|
||||
|
|
||||
$base = $CFG->dataroot."/temp/$modname/"; |
|
||||
|
|
||||
$zipfile = $_FILES["newfile"]["name"]; |
|
||||
$tempzipfile = $_FILES["newfile"]["tmp_name"]; |
|
||||
|
|
||||
// Create our directory. |
|
||||
$pathparts = pathinfo($zipfile); |
|
||||
// Take off the extension. |
|
||||
$dirname = substr($zipfile, 0, strpos($zipfile, '.'.$pathparts['extension'])); |
|
||||
if (!file_exists($base.$dirname)) { |
|
||||
mkdir($base.$dirname); |
|
||||
} |
|
||||
|
|
||||
// Move our uploaded file to temp/lesson. |
|
||||
move_uploaded_file($tempzipfile, $base.$zipfile); |
|
||||
|
|
||||
// Unzip it! |
|
||||
unzip_file($base.$zipfile, $base, false); |
|
||||
|
|
||||
$base = $base.$dirname; // Update the base. |
|
||||
|
|
||||
// This is the file where we get the names of the files for the slides (in the correct order too). |
|
||||
$outline = $base.'/outline.htm'; |
|
||||
|
|
||||
$pages = array(); |
|
||||
|
|
||||
if (file_exists($outline) and is_readable($outline)) { |
|
||||
$outlinecontents = file_get_contents($outline); |
|
||||
$filenames = array(); |
|
||||
// This gets all of our files names. |
|
||||
preg_match_all("/javascript:GoToSld\('(.*)'\)/", $outlinecontents, $filenames); |
|
||||
|
|
||||
// File $pages with the contents of all of the slides. |
|
||||
foreach ($filenames[1] as $file) { |
|
||||
$path = $base.'/'.$file; |
|
||||
if (is_readable($path)) { |
|
||||
$pages[$path] = file_get_contents($path); |
|
||||
} else { |
|
||||
return false; |
|
||||
} |
|
||||
} |
|
||||
} else { |
|
||||
// Cannot find the outline, so grab all files that start with slide. |
|
||||
$dh = opendir($base); |
|
||||
while (false !== ($file = readdir($dh))) { // Read throug the directory. |
|
||||
if ('slide' == substr($file, 0, 5)) { |
|
||||
// Check for name (may want to check extension later). |
|
||||
$path = $base.'/'.$file; |
|
||||
if (is_readable($path)) { |
|
||||
$pages[$path] = file_get_contents($path); |
|
||||
} else { |
|
||||
return false; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
ksort($pages); // Order them by file name. |
|
||||
} |
|
||||
|
|
||||
if (empty($pages)) { |
|
||||
return false; |
|
||||
} |
|
||||
|
|
||||
return $pages; |
|
||||
} |
|
||||
|
|
||||
/* This function attempts to extract the content out of the slides |
|
||||
* the slides are ugly broken xml. and the xml is broken... yeah... |
|
||||
*/ |
|
||||
function extract_data($pages, $courseid, $lessonname, $modname) { |
|
||||
|
|
||||
global $CFG; |
|
||||
global $matches; |
|
||||
|
|
||||
$extratedpages = array(); |
|
||||
|
|
||||
// Directory for images. |
|
||||
make_mod_upload_directory($courseid); // Make sure moddata is made. |
|
||||
// We store our images in a subfolder in here. |
|
||||
make_upload_directory($courseid.'/moddata/'.$modname, false); |
|
||||
|
|
||||
$imagedir = $CFG->dataroot.'/'.$courseid.'/moddata/'.$modname; |
|
||||
|
|
||||
if ($CFG->slasharguments) { |
|
||||
$imagelink = $CFG->wwwroot.'/file.php/'.$courseid.'/moddata/'.$modname; |
|
||||
} else { |
|
||||
$imagelink = $CFG->wwwroot.'/file.php?file=/'.$courseid.'/moddata/'.$modname; |
|
||||
} |
|
||||
|
|
||||
// Try to make a unique subfolder to store the images. |
|
||||
$lessonname = str_replace(' ', '_', $lessonname); // Get rid of spaces. |
|
||||
$i = 0; |
|
||||
while (true) { |
|
||||
if (!file_exists($imagedir.'/'.$lessonname.$i)) { |
|
||||
// Ok doesnt exist so make the directory and update our paths. |
|
||||
mkdir($imagedir.'/'.$lessonname.$i); |
|
||||
$imagedir = $imagedir.'/'.$lessonname.$i; |
|
||||
$imagelink = $imagelink.'/'.$lessonname.$i; |
|
||||
break; |
|
||||
} |
|
||||
$i++; |
|
||||
} |
|
||||
|
|
||||
foreach ($pages as $file => $content) { |
|
||||
/* to make life easier on our preg_match_alls, we strip out all tags except |
|
||||
* for div and img (where our content is). We want div because sometimes we |
|
||||
* can identify the content in the div based on the div's class |
|
||||
*/ |
|
||||
|
|
||||
$tags = '<div><img>'; // Should also allow <b><i>. |
|
||||
$string = strip_tags($content, $tags); |
|
||||
|
|
||||
$matches = array(); |
|
||||
/* this will look for a non nested tag that is closed |
|
||||
* want to allow <b><i>(maybe more) tags but when we do that |
|
||||
* the preg_match messes up. |
|
||||
*/ |
|
||||
preg_match_all("/(<([\w]+)[^>]*>)([^<\\2>]*)(<\/\\2>)/", $string, $matches); |
|
||||
|
|
||||
$pathparts = pathinfo($file); |
|
||||
// Get rid of the extension. |
|
||||
$file = substr($pathparts['basename'], 0, strpos($pathparts['basename'], '.')); |
|
||||
|
|
||||
$imgs = array(); |
|
||||
// This preg matches all images. |
|
||||
preg_match_all("/<img[^>]*(src\=\"(".$file."\_image[^>^\"]*)\"[^>]*)>/i", $string, $imgs); |
|
||||
|
|
||||
// Start building our page. |
|
||||
$page = new stdClass; |
|
||||
$page->title = ''; |
|
||||
$page->contents = array(); |
|
||||
$page->images = array(); |
|
||||
$page->source = $pathparts['basename']; // Need for book only. |
|
||||
|
|
||||
/* This foreach keeps the style intact. |
|
||||
* Found it doesn't help much. But if you want back uncomment |
|
||||
* this foreach and uncomment the line with the comment imgstyle in it. |
|
||||
* Also need to comment out |
|
||||
* the $page->images[]... line in the next foreach |
|
||||
*/ |
|
||||
foreach ($imgs[2] as $img) { |
|
||||
copy($pathparts['dirname'].'/'.$img, $imagedir.'/'.$img); |
|
||||
// Comment out this line if you are using the above foreach loop. |
|
||||
$page->images[] = "<img src=\"$imagelink/$img\" title=\"$img\" />"; |
|
||||
} |
|
||||
for ($i = 0; $i < count($matches[1]); $i++) { // Go through all of our div matches. |
|
||||
$class = isolate_class($matches[1][$i]); // First step in isolating the class. |
|
||||
|
|
||||
// Check for any static classes. |
|
||||
switch ($class) { |
|
||||
case 'T': // Class T is used for Titles. |
|
||||
$page->title = $matches[3][$i]; |
|
||||
break; |
|
||||
// I would guess that all bullet lists would start with B then go to B1, B2, etc. |
|
||||
case 'B': |
|
||||
// B1-B4 are just insurance, should just hit B and all be taken care of. |
|
||||
case 'B1': |
|
||||
case 'B2': |
|
||||
case 'B3': |
|
||||
case 'B4': |
|
||||
// This is a recursive function that will grab all the bullets and rebuild the list in html. |
|
||||
$page->contents[] = build_list('<ul>', $i, 0); |
|
||||
break; |
|
||||
default: |
|
||||
if ($matches[3][$i] != ' ') { // Odd crap generated... sigh. |
|
||||
if (substr($matches[3][$i], 0, 1) == ':') {// Check for leading : ..hate MS . |
|
||||
$page->contents[] = substr($matches[3][$i], 1); // Get rid of :. |
|
||||
} else { |
|
||||
$page->contents[] = $matches[3][$i]; |
|
||||
} |
|
||||
} |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
// Add the page to the array. |
|
||||
$extratedpages[] = $page; |
|
||||
|
|
||||
} // End $pages foreach loop. |
|
||||
|
|
||||
return $extratedpages; |
|
||||
} |
|
||||
|
|
||||
// A recursive function to build a html list. |
|
||||
function build_list($list, &$i, $depth) { |
|
||||
global $matches; // Not sure why I global this... |
|
||||
|
|
||||
while ($i < count($matches[1])) { |
|
||||
$class = isolate_class($matches[1][$i]); |
|
||||
|
|
||||
if (strstr($class, 'B')) { // Make sure we are still working with bullet classes. |
|
||||
if ($class == 'B') { |
|
||||
$thisdepth = 0; // Calling class B depth 0. |
|
||||
} else { |
|
||||
// Set the depth number. So B1 is depth 1 and B2 is depth 2 and so on. |
|
||||
$thisdepth = substr($class, 1); |
|
||||
if (!is_numeric($thisdepth)) { |
|
||||
print_error( 'Depth not parsed!'); |
|
||||
} |
|
||||
if ($thisdepth < $depth) { |
|
||||
// We are moving back a level in the nesting. |
|
||||
break; |
|
||||
} |
|
||||
if ($thisdepth > $depth) { |
|
||||
// We are moving in a lvl in nesting. |
|
||||
$list .= '<ul>'; |
|
||||
$list = build_list($list, $i, $thisdepth); |
|
||||
// Once we return back, should go to the start of the while. |
|
||||
continue; |
|
||||
} |
|
||||
// No depth changes, so add the match to our list. |
|
||||
if ($cleanstring = ppt_clean_text($matches[3][$i])) { |
|
||||
$list .= '<li>'.ppt_clean_text($matches[3][$i]).'</li>'; |
|
||||
} |
|
||||
$i++; |
|
||||
} else { |
|
||||
// Not a B class, so get out of here... |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
// End the list and return it. |
|
||||
$list .= '</ul>'; |
|
||||
return $list; |
|
||||
} |
|
||||
|
|
||||
// Given an html tag, this function will. |
|
||||
function isolate_class($string) { |
|
||||
if ($class = strstr($string, 'class=')) { |
|
||||
// First step in isolating the class. |
|
||||
// This gets rid of <div blawblaw class= there are no "" or '' around the clas name ...sigh... |
|
||||
$class = substr($class, strpos($class, '=') + 1); |
|
||||
if (strstr($class, ' ')) { |
|
||||
// Spaces found, so cut off everything off after the first space. |
|
||||
return substr($class, 0, strpos($class, ' ')); |
|
||||
} else { |
|
||||
// No spaces so nothing else in the div tag, cut off the >. |
|
||||
return substr($class, 0, strpos($class, '>')); |
|
||||
} |
|
||||
} else { |
|
||||
// No class defined in the tag. |
|
||||
return ''; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
// This function strips off the random chars that ppt puts infront of bullet lists. |
|
||||
function ppt_clean_text($string) { |
|
||||
$chop = 1; // Default: just a single char infront of the content. |
|
||||
|
|
||||
// Look for any other crazy things that may be infront of the content. |
|
||||
if (strstr($string, '<') and strpos($string, '<') == 0) { |
|
||||
// Look for the < in the sting and make sure it is in the front. |
|
||||
$chop = 4; // Increase the $chop. |
|
||||
} |
|
||||
// May need to add more later.... |
|
||||
|
|
||||
$string = substr($string, $chop); |
|
||||
|
|
||||
if ($string != ' ') { |
|
||||
return $string; |
|
||||
} else { |
|
||||
return false; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
// Clean up the temp directory. |
|
||||
function clean_temp() { |
|
||||
global $CFG; |
|
||||
/* this function is broken, use it to clean up later |
|
||||
* should only clean up what we made as well because someone else could be importing ppt as well |
|
||||
* delDirContents($CFG->dataroot.'/temp/lesson'); |
|
||||
*/ |
|
||||
} |
|
||||
|
|
||||
// Creates objects an chapter object that is to be inserted into the database. |
|
||||
function book_create_objects($pageobjects, $bookid) { |
|
||||
$chapters = array(); |
|
||||
$chapter = new stdClass; |
|
||||
|
|
||||
// Same for all chapters. |
|
||||
$chapter->bookid = $bookid; |
|
||||
$chapter->pagenum = $DB->count_records('book_chapters', array( 'bookid' => $bookid)) + 1; |
|
||||
$chapter->timecreated = time(); |
|
||||
$chapter->timemodified = time(); |
|
||||
$chapter->subchapter = 0; |
|
||||
|
|
||||
$i = 1; |
|
||||
foreach ($pageobjects as $pageobject) { |
|
||||
$page = prep_page($pageobject, $i); // Get title and contents. |
|
||||
$chapter->importsrc = addslashes($pageobject->source); // Add the source. |
|
||||
$chapter->title = $page->title; |
|
||||
$chapter->content = $page->contents; |
|
||||
$chapters[] = $chapter; |
|
||||
|
|
||||
// Increment our page number and our counter. |
|
||||
$chapter->pagenum = $chapter->pagenum + 1; |
|
||||
$i++; |
|
||||
} |
|
||||
|
|
||||
return $chapters; |
|
||||
} |
|
||||
|
|
||||
// Builds the title and content strings from an object. |
|
||||
function prep_page($pageobject, $count) { |
|
||||
if ($pageobject->title == '') { |
|
||||
$page->title = "Page $count"; // No title set so make a generic one. |
|
||||
} else { |
|
||||
$page->title = addslashes($pageobject->title); |
|
||||
} |
|
||||
|
|
||||
$page->contents = ''; |
|
||||
|
|
||||
// Nab all the images first. |
|
||||
foreach ($pageobject->images as $image) { |
|
||||
$image = str_replace("\n", '', $image); |
|
||||
$image = str_replace("\r", '', $image); |
|
||||
$image = str_replace("'", '"', $image); // Imgstyle. |
|
||||
|
|
||||
$page->contents .= addslashes($image); |
|
||||
} |
|
||||
// Go through the contents array and put <p> tags around each element and strip out \n which I have found to be uneccessary. |
|
||||
foreach ($pageobject->contents as $content) { |
|
||||
$content = str_replace("\n", '', $content); |
|
||||
$content = str_replace("\r", '', $content); |
|
||||
$content = str_replace(' ', '', $content); // Puts in returns? |
|
||||
$content = '<p>'.$content.'</p>'; |
|
||||
$page->contents .= addslashes($content); |
|
||||
} |
|
||||
return $page; |
|
||||
} |
|
||||
|
|
||||
// Save the chapter objects to the database. |
|
||||
function book_save_objects($chapters, $bookid, $pageid='0') { |
|
||||
global $DB; |
|
||||
|
|
||||
// Nothing fancy, just save them all in order. |
|
||||
foreach ($chapters as $chapter) { |
|
||||
if (!$chapter->id = $DB->insert_record('book_chapters', $chapter)) { |
|
||||
print_error('Could not update your book'); |
|
||||
} |
|
||||
} |
|
||||
return true; |
|
||||
} |
|
Loading…
Reference in new issue