10-25-04
require_once($CFG->dirroot.'/backup/bb/xsl_emulate_xslt.inc');
function get_subdirs($directory){
$opendirectory = opendir( $directory );
while(false !== ($filename = readdir($opendirectory))) {
if (is_dir($directory.$filename) and $filename != ".." and $filename != "."){
$subdirs[] = $filename;
}
}
closedir($opendirectory);
return $subdirs;
}
function choose_bb_xsl($manifest){
$f = fopen($manifest,"r");
$buffer = fgets($f, 400);
$buffer = fgets($f, 400);
fclose($f);
if (strstr($buffer,"xmlns:bb=\"http://www.blackboard.com/content-packaging/\"")){
return "bb6_to_moodle.xsl";
}
return "bb5.5_to_moodle.xsl";
}
function blackboard_convert($dir){
global $CFG, $OUTPUT;
throw new coding_exception('bb_convert was not converted to new file api yet, sorry');
// Check for a Blackboard manifest file
if (is_readable($dir.'/imsmanifest.xml') && !is_readable($dir.'/moodle.xml')){
if (!function_exists('xslt_create')) { // XSLT MUST be installed for this to work
echo $OUTPUT->notification('You need the XSLT library installed in PHP to open this Blackboard file');
return false;
}
//Select the proper XSL file
$xslt_file = choose_bb_xsl($dir.'/imsmanifest.xml');
//TODO: Use the get_string function for this
echo "
Converting Blackboard export";
// The XSL file must be in the same directory as the Blackboard files when it is processed
if (!copy($CFG->dirroot."/backup/bb/$xslt_file", "$dir/$xslt_file")) {
echo $OUTPUT->notification('Could not copy the XSLT file to '."$dir/$xslt_file");
return false;
}
// Change to that directory
$startdir = getcwd();
chdir($dir);
// Process the Blackboard XML files with the chosen XSL file.
// The imsmanifest contains all the XML files and their relationships.
// The XSL processor will open them as needed.
$xsltproc = xslt_create();
if (!xslt_process($xsltproc, 'imsmanifest.xml', "$dir/$xslt_file", "$dir/moodle.xml")) {
echo $OUTPUT->notification('Failed writing xml file');
chdir($startdir);
return false;
}
// Copy the Blackboard course files into the moodle course_files structure
$subdirs = get_subdirs($dir."/");
mkdir("$dir/course_files", $CFG->directorypermissions);
foreach ($subdirs as $subdir){
rename($subdir, "course_files/$subdir");
rename_hexfiles($subdir);
}
chdir($startdir);
// Blackboard export successfully converted
return true;
}
// This is not a Blackboard export
return true;
}
/**
* grabs all files in the directory, checks if the filenames start with a ! or @
* then checks to see if the name is a hex - if so, it translates/renames correctly.
*
* @param string $subdir - the directory to parse.
*
*/
function rename_hexfiles($subdir) {
//this bit of code grabs all files in the directory, and if they start with ! or @, performs the name conversion
if ($handle = opendir("course_files/$subdir")) {
while ($file = readdir($handle)) {
if ($file == '..' or $file == '.') { //don't bother processing these!
continue;
}
if(substr($file,0,1)=="!" || substr($file,0,1)=="@"){
$outputfilename = "";
$filebase = substr($file,1,strrpos($file,".")-1);
if (ctype_xdigit($filebase)) { //check if this name is a hex - if not, don't bother to rename
$filenamesplit = str_split($filebase,2);
foreach($filenamesplit as $hexvalue){
$outputfilename .= chr(hexdec($hexvalue));
}
$outputfilename .= strrchr($file,".");
rename("course_files/$subdir/$file","course_files/$subdir/$outputfilename");
}
}
}
closedir($handle);
}
}