123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488 |
- <?php
- /*
- ==============================================================================
- Dokeos - elearning and course management software
-
- Copyright (c) 2004 Dokeos S.A.
- Copyright (c) 2003 Ghent University (UGent)
- Copyright (c) 2001 Universite catholique de Louvain (UCL)
- Copyright (c) Istvan Mandak
-
- For a full list of contributors, see "credits.txt".
- The full license can be read in "license.txt".
-
- This program 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 2
- of the License, or (at your option) any later version.
-
- See the GNU General Public License for more details.
-
- Contact: Dokeos, 181 rue Royale, B-1000 Brussels, Belgium, info@dokeos.com
- ==============================================================================
- */
- /**
- ==============================================================================
- * Code library for HotPotatoes integration.
- *
- * @author Istvan Mandak
- * @package dokeos.exercise
- ==============================================================================
- */
- $dbTable = Database::get_course_table(DOCUMENT_TABLE);
- /**
- * Creates a hotpotato directory
- *
- * If a directory of that name already exists, don't create any. If a file of that name exists, remove it and create a directory
- * @param string Wanted path
- * @return boolean Always true so far
- */
- function hotpotatoes_init($baseWorkDir)
- {
- //global $_course, $_uid;
- $documentPath=$baseWorkDir.'/';
- if (!is_dir($documentPath))
- {
- if (is_file($documentPath))
- {
- @unlink($documentPath);
- }
- @mkdir($documentPath);
- return true;
- }else{
- //if this directory already exists, return false
- return false;
- }
- //why create a .htaccess here?
- //if (!is_file($documentPath.".htacces"))
- //{
- // if (!($fp = fopen($documentPath.".htaccess", "w"))) {
- // }
- // $str = "order deny,allow\nallow from all";
- // if (!fwrite($fp,$str)) { }
- //}
- }
- /**
- * Gets the title of the quizz file given as parameter
- * @param string File name
- * @param string File path
- * @return string The exercise title
- */
- function GetQuizName($fname,$fpath)
- {
- $title = "";
- $title = GetComment($fname);
-
- if($title=="")
- {
- if (!($fp = fopen($fpath.$fname, "r"))) {
- //die("could not open Quiz input");
- return GetFileName($fname);
- }
-
- $contents = fread($fp, filesize($fpath.$fname));
- fclose($fp);
-
- $contents = strtolower($contents);
-
- $pattern = array ( 1 => "title>", 2 => "/title>");
-
- $s_contents = substr($contents,0,strpos($contents,$pattern["2"])-1);
- $e_contents = substr($s_contents,strpos($contents,$pattern["1"])+strlen($pattern["1"]),strlen($s_contents));
-
- $title = $e_contents;
- }
- return $title;
-
- }
- /**
- * Gets the comment about a file from the corresponding database record
- * @param string File path
- * @return string Comment from the database record
- */
- function GetComment($path)
- {
- global $dbTable;
- $query = "select comment from $dbTable where path='$path'";
- $result = api_sql_query($query,__FILE__,__LINE__);
- while($row = mysql_fetch_array($result))
- {
- return $row[0];
- }
- return "";
- }
- /**
- * Sets the comment in the database for a particular path
- * @param string File path
- * @param string Comment to set
- * @return string Result of the database operation (api_sql_query will output some message directly on error anyway)
- */
- function SetComment($path,$comment)
- {
- global $dbTable;
- $query = "update $dbTable set comment='$comment' where path='$path'";
- $result = api_sql_query($query,__FILE__,__LINE__);
- return "$result";
- }
- /**
- * Get the name of the file from a path (without the extension)
- *
- * This assumes the path is made of elements split by '/', not '\' or '\\'
- * @param string Path
- * @return string File name
- */
- function GetFileName($fname)
- {
- $name = explode('/',$fname);
- $name = $name[sizeof($name)-1];
- return $name;
- }
- /**
- * Reads the file contents into a string
- * @param string Urlencoded path
- * @return string The file contents
- */
- function ReadFileCont($full_file_path)
- {
- if (!($fp = fopen(urldecode($full_file_path), "r"))) {
- // if (!($fp = fopen($full_file_path, "r"))) {
- return "";
- }
- $contents = fread($fp, filesize($full_file_path));
- fclose($fp);
- return $contents;
- }
- /**
- * Writes the file contents into the file given
- * @param string Urlencoded path
- * @param string The file contents
- */
- function WriteFileCont($full_file_path,$content)
- {
- if (!($fp = fopen(urldecode($full_file_path), "w"))) {
- //die("could not open Quiz input");
- }
- fwrite($fp,$content);
- fclose($fp);
- }
- /**
- * Gets the name of an img whose path is given (without directories or extensions)
- * @param string An image tag (<img src="...." ...>)
- * @return string The image file name or an empty string
- * @uses GetFileName No comment
- */
- function GetImgName($imgtag)
- { // select src tag from img tag
- $match = array();
- //preg_match('/(src=(["\'])1.*(["\'])1)/i',$imgtag,$match); //src
- preg_match('/src(\s)*=(\s)*[\'"]([^\'"]*)[\'"]/i',$imgtag,$match); //get the img src as contained between " or '
- //list($key,$srctag)=each($match);
- $src=$match[3];
- //$src = substr($srctag,5,(strlen($srctag)-7));
- if (stristr($src,"http")===false) // valid or invalid image name
- {
-
- if($src=="")
- { return ""; }
- else
- {
- $tmp_src = GetFileName($src) ;
- if ($tmp_src == "")
- {
- return $src;
- } else {
- return $tmp_src;
- }
- }
- }
- else //the img tag contained "http", which means it is probably external. Ignore it.
- {
- return "";
- }
- }
- /**
- * Gets the source path of an image tag
- * @param string An image tag
- * @return string The image source or ""
- */
- function GetSrcName($imgtag)
- { // select src tag from img tag
- $match = array();
- preg_match("|(src=\".*\" )|U",$imgtag,$match); //src
- list($key,$srctag)=each($match);
- $src = substr($srctag,5,(strlen($srctag)-7));
- if (stristr($src,"http")==false) // valid or invalid image name
- {
- return $src;
- }
- else
- { return ""; }
- }
- /**
- * Gets the image parameters from an image path
- * @param string File name
- * @param string File path
- * @param reference Reference to a list of image parameters (emptied, then used to return results)
- * @param reference Reference to a counter of images (emptied, then used to return results)
- */
- function GetImgParams($fname,$fpath,&$imgparams,&$imgcount)
- { //select img tags from context
- $imgparams = array();
- //phpinfo();
- $contents = ReadFileCont("$fpath"."$fname");
- $matches = array();
- preg_match_all("(<img .*>)",$contents,$matches);
- $imgcount = 0;
- while (list($int,$match)=each($matches))
- {
- //each match consists of a key and a value
- while(list($key,$imgtag)=each($match))
- {
- $imgname = GetImgName($imgtag);
- if ($imgname!="" && !in_array($imgname,$imgparams)){
- array_push($imgparams,$imgname); // name (+ type) of the images in the html test
- $imgcount = $imgcount + 1; // number of images in the html test
- }
- }
- }
- }
- /**
- * Generates a list of hidden fields with the image params given as parameter to this function
- * @param array List of image parameters
- * @return string String containing the hidden parameters built from the list given
- */
- function GenerateHiddenList($imgparams)
- {
- $list = "";
- if(is_array($imgparams)){
- while (list($int,$string)=each($imgparams))
- {
- $list .= "<input type=\"hidden\" name=\"imgparams[]\" value=\"$string\" />\n";
- }
- }
- return $list;
- }
- /**
- * Searches for a node in the given array
- * @param reference Reference to the array to search
- * @param string Node we are looking for in the array
- * @return mixed Node name or false if not found
- */
- function myarraysearch(&$array,$node)
- {
- $match = FALSE;
- $tmp_array = array();
- for($i=0;$i<count($array);$i++)
- {
- if (!strcmp($array[$i],$node))
- {
- $match = $node;
- }
- else
- { array_push($tmp_array,$array[$i]); }
- }
- $array = $tmp_array;
- return $match;
- }
- /**
- * Look for the image name into an array
- * @param reference Reference to an array to search
- * @param string String to look for
- * @return mixed String given if found, false otherwise
- * @uses myarraysearch This function is just an additional layer on the myarraysearch() function
- */
- function CheckImageName(&$imgparams,$string)
- {
- $checked = myarraysearch($imgparams,$string);
- return $checked;
- }
- /**
- * Replaces an image tag by ???
- * @param string The content to replace
- * @return string The modified content
- */
- function ReplaceImgTag($content)
- {
- $newcontent = $content;
- $matches = array();
- preg_match_all("(<img .*>)",$content,$matches);
- $imgcount = 0;
- while (list($int,$match)=each($matches))
- {
- while(list($key,$imgtag)=each($match))
- {
- $imgname = GetSrcName($imgtag);
- if ($imgname=="") {} // valid or invalid image name
- else {
-
- $prehref = $imgname;
- $posthref = GetFileName($imgname);
- $newcontent = str_replace($prehref,$posthref,$newcontent);
- }
- }
- }
- return $newcontent;
- }
- /**
- * Fills the folder name up to a certain length with "0"
- * @param string Original folder name
- * @param integer Length to reach
- * @return string Modified folder name
- */
- function FillFolderName($name,$nsize)
- {
- $str = "";
- for($i=0;$i < $nsize-strlen($name);$i++)
- {
- $str .= "0";
- }
- $str .= $name;
- return $str;
- }
- /**
- * Generates the HotPotato folder tree
- * @param string Folder path
- * @return string Folder name (modified)
- */
- function GenerateHpFolder($folder)
- {
- $filelist = array();
- if ($dir = @opendir($folder)) {
- while (($file = readdir($dir)) !== false) {
- if ( $file != ".") {
- if ($file != "..")
- {
- $full_name = $folder."/".$file;
- if (is_dir($full_name))
- {
- $filelist[] = $file;
- }
- }
- }
- }
- }
- $w = 0;
- do {
- $name = FillFolderName(mt_rand(1,99999),6);
- $checked = myarraysearch($filelist,$name);
- //as long as we find the name in the array, continue looping. As soon as we have a new element, quit
- if ($checked) { $w = 1; }
- else { $w = 0; }
- } while ($w==1);
-
- return $name;
- }
- /**
- * Gets the folder name (strip down path)
- * @param string Path
- * @return string Folder name stripped down
- */
- function GetFolderName($fname)
- {
- $name = explode('/',$fname);
- $name = $name[sizeof($name)-2];
- return $name;
- }
- /**
- * Gets the folder path (withouth the name of the folder itself) ?
- * @param string Path
- * @return string Path stripped down
- */
- function GetFolderPath($fname)
- {
- $str = "";
- $name = explode('/',$fname);
- for($i=0;$i < sizeof($name)-1; $i++)
- { $str = $str.$name[$i]."/"; }
- return $str;
- }
- /**
- * Checks if there are subfolders
- * @param string Path
- * @return integer 1 if a subfolder was found, 0 otherwise
- */
- function CheckSubFolder($path)
- {
- $folder = GetFolderPath($path);
- $dflag = 0;
- if ($dir = @opendir($folder)) {
- while (($file = readdir($dir)) !== false) {
- if ( $file != ".") {
- if ($file != "..") {
- $full_name = $folder."/".$file;
- if (is_dir($full_name)) {
- $dflag = 1; // first directory
- }
- }
- }
- }
- }
- return $dflag;
- }
- /**
- * Hotpotato Garbage Collector
- * @param string Path
- * @param integer Flag
- * @param integer User id
- * @return void No return value, but echoes results
- */
- function HotPotGCt($folder,$flag,$userID)
- { // Garbage Collector
- $filelist = array();
- if ($dir = @opendir($folder)) {
- while (($file = readdir($dir)) !== false) {
- if ( $file != ".") {
- if ($file != "..")
- {
- $full_name = $folder."/".$file;
- if (is_dir($full_name))
- {
- HotPotGCt($folder."/".$file,$flag,$userID);
- }
- else
- {
- $filelist[] = $file;
- }
- }
- }
- }
- closedir($dir);
- }
- while (list ($key, $val) = each ($filelist))
- {
- if (stristr($val,$userID.".t.html"))
- {
- if ($flag == 1)
- {
- my_delete($folder."/".$val);
- }
- else
- {
- echo $folder."/".$val."<br />";
- }
- }
- }
- }
- ?>
|