Vasilis Daloukas
9 years ago
6 changed files with 3079 additions and 3349 deletions
File diff suppressed because it is too large
@ -1,144 +1,144 @@ |
|||
<?php |
|||
|
|||
require( "../../../config.php"); |
|||
include_once("class.Sudoku.php"); |
|||
require( '../header.php'); |
|||
|
|||
$action = optional_param('action', PARAM_ALPHA); // action |
|||
|
|||
if( $action == 'create'){ |
|||
AppendSudokuB(); |
|||
}else |
|||
{ |
|||
showform(); |
|||
} |
|||
|
|||
function showform() |
|||
{ |
|||
$id = required_param('id', PARAM_NUMBER); // action |
|||
|
|||
?> |
|||
<form name="form" method="post" action="create.php"> |
|||
<center> |
|||
<table cellpadding="5"> |
|||
<tr valign="top"> |
|||
<td align="right"><b><?php echo get_string( 'sudoku_create_count', 'game'); ?>:</b></td> |
|||
<td> |
|||
<input type="text" name="count" size="6" value="2" /><br> |
|||
</td> |
|||
</tr> |
|||
<tr><td colspan=2><center><br><input type="submit" value="<?php print_string('sudoku_create_start', 'game') ?>" /></td></tr> |
|||
</table> |
|||
<input type="hidden" name=action value="create" > |
|||
<input type="hidden" name=level1 value="1" > |
|||
<input type="hidden" name=level2 value="10" > |
|||
<input type="hidden" name=id value="<?php echo $id; ?>" /> |
|||
</form> |
|||
|
|||
<?php |
|||
|
|||
} |
|||
|
|||
function AppendSudokuB() |
|||
{ |
|||
global $DB; |
|||
|
|||
$level1 = required_param('level1', PARAM_NUMBER); // action |
|||
$level2 = required_param('level2', PARAM_NUMBER); // action |
|||
$count = required_param('count', PARAM_NUMBER); // action |
|||
|
|||
$level = $level1; |
|||
|
|||
for( $i=1; $i <= $count; $i++) |
|||
{ |
|||
//set_time_limit( 30); |
|||
Create( $si, $sp, $level); |
|||
|
|||
$newrec->data = PackSudoku( $si, $sp); |
|||
if( strlen( $newrec->data) != 81){ |
|||
return 0; |
|||
} |
|||
$newrec->level = $level; |
|||
$newrec->opened = GetOpened( $si); |
|||
|
|||
$DB->insert_record( 'game_sudoku_database', $newrec, true); |
|||
|
|||
$level++; |
|||
if( $level > $level2){ |
|||
$level = $level1; |
|||
} |
|||
|
|||
echo get_string( 'sudoku_creating', 'game', $i)."<br>\r\n"; |
|||
} |
|||
} |
|||
|
|||
function PackSudoku( $si, $sp) |
|||
{ |
|||
$data = ""; |
|||
|
|||
for ($i = 1; $i <= 9; $i++) |
|||
{ |
|||
for ($j = 1; $j <= 9; $j++) |
|||
{ |
|||
$c = &$sp->theSquares[$i]; |
|||
$c = &$c->getCell($j) ; |
|||
$solution = $c->asString( false); |
|||
|
|||
$c = &$si->theSquares[$i] ; |
|||
$c = &$c->getCell($j) ; |
|||
$theSolvedState = $c->solvedState() ; |
|||
|
|||
if( $theSolvedState == 1) { //hint |
|||
$solution = substr( 'ABCDEFGHI', $c->asString( false) - 1, 1); |
|||
} |
|||
|
|||
$data .= $solution; |
|||
} |
|||
} |
|||
|
|||
return $data; |
|||
} |
|||
|
|||
|
|||
function create( &$si, &$sp, $level=1) |
|||
{ |
|||
for( $i=1; $i <= 40; $i++) |
|||
{ |
|||
//set_time_limit( 30); |
|||
$sp = new Sudoku() ; |
|||
$theInitialPosition = $sp->generatePuzzle( 10, 50, $level) ; |
|||
if( count( $theInitialPosition)){ |
|||
break; |
|||
} |
|||
} |
|||
if( $i > 40){ |
|||
return false; |
|||
} |
|||
|
|||
$si = new Sudoku() ; |
|||
|
|||
$si->initializePuzzleFromArray($theInitialPosition); |
|||
|
|||
return true; |
|||
} |
|||
|
|||
function GetOpened( $si) |
|||
{ |
|||
$count = 0; |
|||
|
|||
for ($i = 1; $i <= 9; $i++) |
|||
{ |
|||
for ($j = 1; $j <= 9; $j++) |
|||
{ |
|||
$c = &$si->theSquares[$i] ; |
|||
$c = &$c->getCell($j) ; |
|||
$theSolvedState = $c->solvedState() ; |
|||
|
|||
if( $theSolvedState == 1) //hint |
|||
$count++; |
|||
} |
|||
} |
|||
|
|||
return $count; |
|||
} |
|||
|
|||
<?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/>. |
|||
|
|||
require( "../../../config.php"); |
|||
require_once("class.Sudoku.php"); |
|||
require( '../header.php'); |
|||
|
|||
$action = optional_param('action', PARAM_ALPHA); // The action. |
|||
|
|||
if ($action == 'create') { |
|||
AppendSudokuB(); |
|||
} else { |
|||
showform(); |
|||
} |
|||
|
|||
function showform() { |
|||
$id = required_param('id', PARAM_NUMBER); // The action. |
|||
|
|||
?> |
|||
<form name="form" method="post" action="create.php"> |
|||
<center> |
|||
<table cellpadding="5"> |
|||
<tr valign="top"> |
|||
<td align="right"><b><?php echo get_string( 'sudoku_create_count', 'game'); ?>:</b></td> |
|||
<td> |
|||
<input type="text" name="count" size="6" value="2" /><br> |
|||
</td> |
|||
</tr> |
|||
<tr><td colspan=2><center><br><input type="submit" value="<?php print_string('sudoku_create_start', 'game') ?>" /></td></tr> |
|||
</table> |
|||
<input type="hidden" name=action value="create" > |
|||
<input type="hidden" name=level1 value="1" > |
|||
<input type="hidden" name=level2 value="10" > |
|||
<input type="hidden" name=id value="<?php echo $id; ?>" /> |
|||
</form> |
|||
|
|||
<?php |
|||
} |
|||
|
|||
function appendsudokub() { |
|||
global $DB; |
|||
|
|||
$level1 = required_param('level1', PARAM_NUMBER); |
|||
$level2 = required_param('level2', PARAM_NUMBER); |
|||
$count = required_param('count', PARAM_NUMBER); |
|||
|
|||
$level = $level1; |
|||
|
|||
for ($i = 1; $i <= $count; $i++) { |
|||
create( $si, $sp, $level); |
|||
|
|||
$newrec->data = packsudoku( $si, $sp); |
|||
if (strlen( $newrec->data) != 81) { |
|||
return 0; |
|||
} |
|||
$newrec->level = $level; |
|||
$newrec->opened = GetOpened( $si); |
|||
|
|||
$DB->insert_record( 'game_sudoku_database', $newrec, true); |
|||
|
|||
$level++; |
|||
if ($level > $level2) { |
|||
$level = $level1; |
|||
} |
|||
|
|||
echo get_string( 'sudoku_creating', 'game', $i)."<br>\r\n"; |
|||
} |
|||
} |
|||
|
|||
function packsudoku( $si, $sp) { |
|||
$data = ''; |
|||
|
|||
for ($i = 1; $i <= 9; $i++) { |
|||
for ($j = 1; $j <= 9; $j++) { |
|||
$c = &$sp->thesquares[$i]; |
|||
$c = &$c->getcell($j); |
|||
$solution = $c->asstring( false); |
|||
|
|||
$c = &$si->thesquares[$i]; |
|||
$c = &$c->getCell($j); |
|||
$thesolvedstate = $c->solvedstate(); |
|||
|
|||
if ($thesolvedstate == 1) { |
|||
// Hint. |
|||
$solution = substr( 'ABCDEFGHI', $c->asString( false) - 1, 1); |
|||
} |
|||
|
|||
$data .= $solution; |
|||
} |
|||
} |
|||
|
|||
return $data; |
|||
} |
|||
|
|||
function create( &$si, &$sp, $level=1) { |
|||
for ($i = 1; $i <= 40; $i++) { |
|||
$sp = new sudoku(); |
|||
$theinitialposition = $sp->generatepuzzle( 10, 50, $level); |
|||
if (count( $theinitialposition)) { |
|||
break; |
|||
} |
|||
} |
|||
if ($i > 40) { |
|||
return false; |
|||
} |
|||
|
|||
$si = new sudoku(); |
|||
|
|||
$si->initializepuzzlefromarray( $theinitialposition); |
|||
|
|||
return true; |
|||
} |
|||
|
|||
function getopened( $si) { |
|||
$count = 0; |
|||
|
|||
for ($i = 1; $i <= 9; $i++) { |
|||
for ($j = 1; $j <= 9; $j++) { |
|||
$c = &$si->thesquares[$i]; |
|||
$c = &$c->getcell($j); |
|||
$thesolvedstate = $c->solvedstate(); |
|||
|
|||
if ($thesolvedstate == 1) { |
|||
// Hint. |
|||
$count++; |
|||
} |
|||
} |
|||
} |
|||
|
|||
return $count; |
|||
} |
|||
|
@ -1,33 +1,45 @@ |
|||
<?php // $Id: export.php,v 1.3 2012/07/25 11:16:07 bdaloukas Exp $
|
|||
<?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/>. |
|||
|
|||
require( "../../../config.php"); |
|||
|
|||
export(); |
|||
|
|||
function export() |
|||
{ |
|||
global $CFG; |
|||
|
|||
|
|||
$file = "import.php"; |
|||
$h = fopen($file, 'w') or die("can't open file"); |
|||
|
|||
fwrite( $h, "<?php\r\n");
|
|||
fwrite( $h, "require( \"../../../config.php\");\r\n\r\n"); |
|||
|
|||
if( ($recs=get_records_select( 'game_sudoku_database')) == false) |
|||
print_error('empty'); |
|||
|
|||
$i = 0; |
|||
foreach( $recs as $rec) |
|||
{ |
|||
fwrite( $h, "execute_sql( \"INSERT INTO {game_sudoku_database} ( level, opened, data) ". |
|||
"VALUES ($rec->level, $rec->opened, '$rec->data')\", false);\r\n"); |
|||
if( ++$i % 10 == 0) |
|||
fwrite( $h, "\r\n"); |
|||
} |
|||
fwrite( $h, "\r\necho'Finished importing';"); |
|||
|
|||
fclose($h); |
|||
function export() { |
|||
global $CFG; |
|||
|
|||
$file = "import.php"; |
|||
$h = fopen($file, 'w') or die("can't open file"); |
|||
|
|||
fwrite( $h, "<?php\r\n");
|
|||
fwrite( $h, "require( \"../../../config.php\");\r\n\r\n"); |
|||
|
|||
if (($recs = get_records_select( 'game_sudoku_database')) == false) { |
|||
print_error('empty'); |
|||
} |
|||
|
|||
$i = 0; |
|||
foreach ($recs as $rec) { |
|||
fwrite( $h, "execute_sql( \"INSERT INTO {game_sudoku_database} ( level, opened, data) ". |
|||
"VALUES ($rec->level, $rec->opened, '$rec->data')\", false);\r\n"); |
|||
if (++$i % 10 == 0) { |
|||
fwrite( $h, "\r\n"); |
|||
} |
|||
} |
|||
fwrite( $h, "\r\necho'Finished importing';"); |
|||
|
|||
fclose($h); |
|||
} |
|||
|
File diff suppressed because it is too large
@ -1,495 +1,420 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* Dump structured data, i.e., Objects and Arrays, in either plain text or |
|||
* html. This is a class wrapper for a couple of utility routines that I use |
|||
* all the time. It's handier to have them as a class. |
|||
* |
|||
* Its also the class interface for logging functions that I use in developing |
|||
* web enabled applications. |
|||
* |
|||
* @author Dick Munroe <munroe@csworks.com> |
|||
* @copyright copyright @ by Dick Munroe, 2004 |
|||
* @license http://opensource.org/licenses/gpl-license.php GNU Public License |
|||
* @package StructuredDataDumper |
|||
* @version 1.0.4 |
|||
*/ |
|||
|
|||
// |
|||
// Edit History: |
|||
// |
|||
// Dick Munroe munroe@cworks.com 04-Dec-2004 |
|||
// Initial version created. |
|||
// |
|||
// Dick Munroe munroe@csworks.com 08-Dec-2004 |
|||
// Translate < to < for html output. |
|||
// |
|||
// Dick Munroe munroe@csworks.com 23-Dec-2004 |
|||
// Add interface for writing "stuff". Extend SDD |
|||
// to get things "written". |
|||
// |
|||
// Dick Munroe munroe@csworks.com 25-Dec-2004 |
|||
// If a class extends a base class, but doesn't add |
|||
// data members, a warning winds up appearing when |
|||
// printing. |
|||
// Added a memeber to fetch the state of the logging |
|||
// flag. |
|||
// |
|||
// Dick Munroe munroe@csworks.com 11-Mar-2006 |
|||
// The test for html flag should have assumed that |
|||
// $this can be defined for objects calling SDD::dump. |
|||
// |
|||
// Dick Munroe (munroe@csworks.com) 22-Mar-2006 |
|||
// Add a function to generate "newlines". |
|||
// |
|||
|
|||
class SDD |
|||
{ |
|||
/** |
|||
* HTML to be generated flag. |
|||
*/ |
|||
|
|||
var $m_htmlFlag ; |
|||
|
|||
/** |
|||
* logging flag. |
|||
*/ |
|||
|
|||
var $m_logging = false ; |
|||
|
|||
/** |
|||
* In memory log file. |
|||
*/ |
|||
|
|||
var $m_log = array() ; |
|||
|
|||
/** |
|||
* Constructor. |
|||
* |
|||
* @access public |
|||
* @param boolean $theHTMLFlag [optional] True if HTML is to be generated. |
|||
* If omitted, $_SERVER is used to "guess" the state of |
|||
* the HTML flag. Be default, HTML is generated when |
|||
* accessed by a web server. |
|||
* @param boolean $theLoggingFlag [optional] the state of logging for |
|||
* this object. By default, logging is off. |
|||
*/ |
|||
|
|||
function SDD($theHtmlFlag=null, $theLoggingFlag=false) |
|||
{ |
|||
if ($theHtmlFlag === null) |
|||
{ |
|||
$theHtmlFlag = (!empty($_SERVER['DOCUMENT_ROOT'])) ; |
|||
} |
|||
|
|||
$this->m_htmlFlag = $theHtmlFlag ; |
|||
$this->m_logging = $theLoggingFlag ; |
|||
} |
|||
|
|||
/** |
|||
* Close the log file. |
|||
* |
|||
* @access public |
|||
* @abstract |
|||
*/ |
|||
|
|||
function close() |
|||
{ |
|||
} |
|||
|
|||
/** |
|||
* Dump a structured variable. |
|||
* |
|||
* @static |
|||
* @param mixed $theVariable the variable to be dumped. |
|||
* @param boolean $theHtmlFlag [optional] true if HTML is to be generated, |
|||
* false if plain text is to be generated, null (default) if |
|||
* dump is to guess which to display. |
|||
* @return string The data to be displayed. |
|||
* @link http://www.php.net/manual/en/reserved.variables.php#reserved.variables.server Uses $_SERVER |
|||
*/ |
|||
|
|||
function dump(&$theVariable, $theHtmlFlag=null) |
|||
{ |
|||
if ($theHtmlFlag === null) |
|||
{ |
|||
if (empty($this)) |
|||
{ |
|||
$theHtmlFlag = (!empty($_SERVER['DOCUMENT_ROOT'])) ; |
|||
} |
|||
else |
|||
{ |
|||
if (is_subclass_of($this, "sdd")) |
|||
{ |
|||
$theHtmlFlag = $this->m_htmlFlag ; |
|||
} |
|||
else |
|||
{ |
|||
$theHtmlFlag = (!empty($_SERVER['DOCUMENT_ROOT'])) ; |
|||
} |
|||
} |
|||
} |
|||
|
|||
switch (gettype($theVariable)) |
|||
{ |
|||
case 'array': |
|||
{ |
|||
return SDD::dArray($theVariable, $theHtmlFlag) ; |
|||
} |
|||
|
|||
case 'object': |
|||
{ |
|||
return SDD::dObject($theVariable, $theHtmlFlag) ; |
|||
} |
|||
|
|||
default: |
|||
{ |
|||
return SDD::scalar($theVariable, $theHtmlFlag) ; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Dump the contents of an array. |
|||
* |
|||
* @param array $theArray the array whose contents are to be displayed. |
|||
* @param boolean $theHTMLFlag True if an HTML table is to be generated, |
|||
* false otherwise. |
|||
* @param string $theIndent [optional] Used by SDD::dArray during recursion |
|||
* to get indenting right. |
|||
* @return string The display form of the array. |
|||
*/ |
|||
|
|||
function dArray(&$theArray, $theHTMLFlag, $theIndent = "") |
|||
{ |
|||
$theOutput = array() ; |
|||
|
|||
foreach($theArray as $theIndex => $theValue) |
|||
{ |
|||
if (is_array($theValue)) |
|||
{ |
|||
$theString = SDD::dArray($theValue, $theHTMLFlag, $theIndent . " ") ; |
|||
$theOutput[$theIndex] = substr($theString, 0, strlen($theString) - 1) ; |
|||
} |
|||
else if (is_object($theValue)) |
|||
{ |
|||
$theOutput[$theIndex] = SDD::dObject($theValue, $theHTMLFlag) ; |
|||
} |
|||
else |
|||
{ |
|||
$theOutput[$theIndex] = ($theHTMLFlag ? |
|||
preg_replace('|<|s', '<', var_export($theValue, true)) : |
|||
var_export($theValue, true)) ; |
|||
} |
|||
} |
|||
|
|||
if ($theHTMLFlag) |
|||
{ |
|||
$theString = "<table border=1>\n" ; |
|||
$theString .= "<tr><td align=left>Array (</td></tr>\n" ; |
|||
|
|||
foreach ($theOutput as $theIndex => $theVariableOutput) |
|||
{ |
|||
$theString .= "<tr>\n<td align=right>$theIndex = ></td><td align=left>\n$theVariableOutput\n</td>\n</tr>\n" ; |
|||
} |
|||
|
|||
$theString .= "<tr><td align=left>)</td></tr>\n" ; |
|||
$theString .= "</table>\n" ; |
|||
} |
|||
else |
|||
{ |
|||
$theString = "Array\n$theIndent(\n" ; |
|||
|
|||
foreach ($theOutput as $theIndex => $theVariableOutput) |
|||
{ |
|||
$theString .= "$theIndent [$theIndex] => " . $theVariableOutput . "\n" ; |
|||
} |
|||
|
|||
$theString .= "$theIndent)\n" ; |
|||
} |
|||
|
|||
return $theString ; |
|||
} |
|||
|
|||
/** |
|||
* Dump the contents of an object. |
|||
* |
|||
* Provide a structured display of an object and all the |
|||
* classes from which it was derived. The contents of |
|||
* the object is displayed from most derived to the base |
|||
* class, in order. |
|||
* |
|||
* @param object $theObject the object to be dumped. |
|||
* @param boolean $theHTMLFlag true if HTML is to be generated. |
|||
* @return string the display form of the object. |
|||
*/ |
|||
|
|||
function dObject(&$theObject, $theHTMLFlag) |
|||
{ |
|||
$theObjectVars = get_object_vars($theObject) ; |
|||
|
|||
// |
|||
// Get the inheritance tree starting with the object and going |
|||
// through all the parent classes from there. |
|||
// |
|||
|
|||
$theClass = get_class($theObject) ; |
|||
|
|||
$theClasses[] = $theClass ; |
|||
|
|||
while ($theClass = get_parent_class($theClass)) |
|||
{ |
|||
$theClasses[] = $theClass ; |
|||
} |
|||
|
|||
// |
|||
// Get all the class variables for each class in the inheritance |
|||
// tree. There will be some duplication, but we'll sort that out |
|||
// in the output process. |
|||
// |
|||
|
|||
foreach($theClasses as $theClass) |
|||
{ |
|||
$theClassVars[$theClass] = get_class_vars($theClass) ; |
|||
} |
|||
|
|||
// |
|||
// Put the inheritance tree from base class to most derived order |
|||
// (this is how we get rid of duplication of the variable names) |
|||
// Go through the object variables starting with the base class, |
|||
// capture the output and delete the variable from the object |
|||
// variables. |
|||
// |
|||
|
|||
$theClasses = array_reverse($theClasses) ; |
|||
|
|||
$theOutput = array() ; |
|||
|
|||
foreach ($theClasses as $theClass) |
|||
{ |
|||
$theOutput[$theClass] = array() ; |
|||
|
|||
foreach ($theClassVars[$theClass] as $theVariable => $value) |
|||
{ |
|||
if (array_key_exists($theVariable, $theObjectVars)) |
|||
{ |
|||
if (is_array($theObjectVars[$theVariable])) |
|||
{ |
|||
$theOutput[$theClass][] = $theVariable . " = " . SDD::dArray($theObjectVars[$theVariable], $theHTMLFlag) ; |
|||
} |
|||
else if (is_object($theObjectVars[$theVariable])) |
|||
{ |
|||
$theOutput[$theClass][] = $theVariable . " = " . SDD::dObject($theObjectVars[$theVariable], $theHTMLFlag) ; |
|||
} |
|||
else |
|||
{ |
|||
$theOutput[$theClass][] = |
|||
$theVariable . " = " . |
|||
($theHTMLFlag ? |
|||
preg_replace('|<|s', '<', var_export($theObjectVars[$theVariable], true)) : |
|||
var_export($theObjectVars[$theVariable], true)) ; |
|||
} |
|||
|
|||
unset($theObjectVars[$theVariable]) ; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// |
|||
// Put the classes back in most derived order for generating printable |
|||
// output. |
|||
// |
|||
|
|||
$theClasses = array_reverse($theClasses) ; |
|||
|
|||
if ($theHTMLFlag) |
|||
{ |
|||
$theString = "<table>\n<thead>\n" ; |
|||
|
|||
foreach ($theClasses as $theClass) |
|||
{ |
|||
$theString .= "<th>\n$theClass\n</th>\n" ; |
|||
} |
|||
|
|||
$theString .= "</thead>\n<tr valign=top>\n" ; |
|||
|
|||
foreach ($theClasses as $theClass) |
|||
{ |
|||
$theString .= "<td>\n<table border=1>\n" ; |
|||
|
|||
foreach ($theOutput[$theClass] as $theVariableOutput) |
|||
{ |
|||
$theString .= "<tr>\n<td>\n$theVariableOutput\n</td>\n</tr>\n" ; |
|||
} |
|||
|
|||
$theString .= "</table>\n</td>\n" ; |
|||
} |
|||
|
|||
$theString .= "</tr>\n</table>\n" ; |
|||
} |
|||
else |
|||
{ |
|||
|
|||
$classIndent = "" ; |
|||
|
|||
$classDataIndent = " " ; |
|||
|
|||
$theString = "" ; |
|||
|
|||
foreach ($theClasses as $theClass) |
|||
{ |
|||
$theString .= "{$classIndent}class $theClass\n\n" ; |
|||
|
|||
foreach ($theOutput[$theClass] as $theVariableOutput) |
|||
{ |
|||
$theString .= "$classDataIndent$theVariableOutput\n" ; |
|||
} |
|||
|
|||
$theString .= "\n" ; |
|||
|
|||
$classIndent .= " " ; |
|||
|
|||
$classDataIndent .= " " ; |
|||
} |
|||
} |
|||
|
|||
return $theString ; |
|||
} |
|||
|
|||
/** |
|||
* Write a debugging value to a log file. |
|||
* |
|||
* @access public |
|||
* @abstract |
|||
* @param mixed Data to be logged. |
|||
* @param string $theHeader [optional] string to be emitted prior to |
|||
* logging the data. By default it is a date/time |
|||
* stamp. |
|||
*/ |
|||
|
|||
function log(&$theData, $theHeader=null) |
|||
{ |
|||
$theHeader = date('[Y-m-d H:i:s]: ') . $theHeader ; |
|||
|
|||
if ($this->m_logging) |
|||
{ |
|||
if ($this->m_htmlFlag) |
|||
{ |
|||
$xxx = $this->dump($theData) ; |
|||
if (substr($xxx, 0, 5) == '<pre>') |
|||
{ |
|||
$xxx = '<pre>' . $theHeader . substr($xxx, 5) ; |
|||
} |
|||
else |
|||
{ |
|||
$xxx = $theHeader . $xxx ; |
|||
} |
|||
|
|||
$this->writeLog($xxx) ; |
|||
} |
|||
else |
|||
{ |
|||
$xxx = $theHeader . $this->dump($theData) ; |
|||
$this->writeLog($xxx) ; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* @desc Generate context specific new line equivalents. |
|||
* @param integer [optional] the number of newlines. |
|||
* @param boolean [optional] true if generating html newlines. |
|||
* @return string newlines. |
|||
* @access public |
|||
*/ |
|||
|
|||
function newline($theCount=1, $theHtmlFlag=null) |
|||
{ |
|||
if ($theHtmlFlag === null) |
|||
{ |
|||
if (empty($this)) |
|||
{ |
|||
$theHtmlFlag = (!empty($_SERVER['DOCUMENT_ROOT'])) ; |
|||
} |
|||
else |
|||
{ |
|||
if (is_subclass_of($this, "sdd")) |
|||
{ |
|||
$theHtmlFlag = $this->m_htmlFlag ; |
|||
} |
|||
else |
|||
{ |
|||
$theHtmlFlag = (!empty($_SERVER['DOCUMENT_ROOT'])) ; |
|||
} |
|||
} |
|||
} |
|||
|
|||
if ($theHtmlFlag) |
|||
{ |
|||
return str_repeat("<br />", max($theCount, 0)) . "\n" ; |
|||
} |
|||
else |
|||
{ |
|||
return str_repeat("\n", max($theCount, 0)) ; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Dump any scalar value |
|||
* |
|||
* @param mixed $theVariable the variable to be dumped. |
|||
* @param boolean $theHtmlFlag true if html is to be generated. |
|||
*/ |
|||
|
|||
function scalar(&$theVariable, $theHtmlFlag) |
|||
{ |
|||
if ($theHtmlFlag) |
|||
{ |
|||
return "<pre>" . preg_replace('|<|s', '<', var_export($theVariable, true)) . "</pre>" ; |
|||
} |
|||
else |
|||
{ |
|||
return var_export($theVariable, true) ; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Write data to the log file. |
|||
* |
|||
* @access public |
|||
* @abstract |
|||
* @parameter string $theData [by reference] the data to be written |
|||
* into the log file. |
|||
* @return integer the number of bytes written into the log file. |
|||
*/ |
|||
|
|||
function writeLog(&$theData) |
|||
{ |
|||
return strlen($this->m_log[] = $theData) ; |
|||
} |
|||
|
|||
/** |
|||
* Return the state of the logging flag. |
|||
* |
|||
* @access public |
|||
* @return boolean |
|||
*/ |
|||
|
|||
function getLogging() |
|||
{ |
|||
return $this->m_logging ; |
|||
} |
|||
|
|||
/** |
|||
* Set the state of the logging flag. |
|||
* |
|||
* @access public |
|||
* @return boolean |
|||
*/ |
|||
|
|||
function setLogging($theLogging=false) |
|||
{ |
|||
$this->m_logging = $theLogging ; |
|||
} |
|||
} |
|||
?> |
|||
<?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/>. |
|||
|
|||
/** |
|||
* Dump structured data, i.e., Objects and Arrays, in either plain text or |
|||
* html. This is a class wrapper for a couple of utility routines that I use |
|||
* all the time. It's handier to have them as a class. |
|||
* |
|||
* Its also the class interface for logging functions that I use in developing |
|||
* web enabled applications. |
|||
* |
|||
* @author Dick Munroe <munroe@csworks.com> |
|||
* @copyright copyright @ by Dick Munroe, 2004 |
|||
* @license http://opensource.org/licenses/gpl-license.php GNU Public License |
|||
* @package StructuredDataDumper |
|||
* @version 1.0.4 |
|||
*/ |
|||
|
|||
// |
|||
// Edit History: |
|||
// |
|||
// Dick Munroe munroe@cworks.com 04-Dec-2004 |
|||
// Initial version created. |
|||
// |
|||
// Dick Munroe munroe@csworks.com 08-Dec-2004 |
|||
// Translate < to < for html output. |
|||
// |
|||
// Dick Munroe munroe@csworks.com 23-Dec-2004 |
|||
// Add interface for writing "stuff". Extend SDD |
|||
// to get things "written". |
|||
// |
|||
// Dick Munroe munroe@csworks.com 25-Dec-2004 |
|||
// If a class extends a base class, but doesn't add |
|||
// data members, a warning winds up appearing when |
|||
// printing. |
|||
// Added a memeber to fetch the state of the logging |
|||
// flag. |
|||
// |
|||
// Dick Munroe munroe@csworks.com 11-Mar-2006 |
|||
// The test for html flag should have assumed that |
|||
// $this can be defined for objects calling SDD::dump. |
|||
// |
|||
// Dick Munroe (munroe@csworks.com) 22-Mar-2006 |
|||
// Add a function to generate "newlines". |
|||
// |
|||
|
|||
class sdd { |
|||
/* |
|||
* HTML to be generated flag. |
|||
*/ |
|||
|
|||
protected $m_htmlflag; |
|||
|
|||
/* |
|||
* logging flag. |
|||
*/ |
|||
|
|||
protected $m_logging = false; |
|||
|
|||
/* |
|||
* In memory log file. |
|||
*/ |
|||
|
|||
protected $m_log = array(); |
|||
|
|||
/* |
|||
* Constructor. |
|||
* |
|||
* @access public |
|||
* @param boolean $theHTMLFlag [optional] True if HTML is to be generated. |
|||
* If omitted, $_SERVER is used to "guess" the state of |
|||
* the HTML flag. Be default, HTML is generated when |
|||
* accessed by a web server. |
|||
* @param boolean $theLoggingFlag [optional] the state of logging for |
|||
* this object. By default, logging is off. |
|||
*/ |
|||
|
|||
public function sdd($thehtmlflag = null, $theloggingflag = false) { |
|||
if ($thehtmlflag === null) { |
|||
$thehtmlflag = (!empty($_SERVER['DOCUMENT_ROOT'])); |
|||
} |
|||
|
|||
$this->m_htmlflag = $thehtmlflag; |
|||
$this->m_logging = $theloggingflag; |
|||
} |
|||
|
|||
/* |
|||
* Close the log file. |
|||
* |
|||
* @access public |
|||
* @abstract |
|||
*/ |
|||
|
|||
public function close() { |
|||
} |
|||
|
|||
/* |
|||
* Dump a structured variable. |
|||
* |
|||
* @static |
|||
* @param mixed $theVariable the variable to be dumped. |
|||
* @param boolean $theHtmlFlag [optional] true if HTML is to be generated, |
|||
* false if plain text is to be generated, null (default) if |
|||
* dump is to guess which to display. |
|||
* @return string The data to be displayed. |
|||
* @link http://www.php.net/manual/en/reserved.variables.php#reserved.variables.server Uses $_SERVER |
|||
*/ |
|||
public function dump(&$thevariable, $thehtmlflag = null) { |
|||
if ($thehtmlflag === null) { |
|||
if (empty($this)) { |
|||
$thehtmlflag = (!empty($_SERVER['DOCUMENT_ROOT'])); |
|||
} else { |
|||
if (is_subclass_of($this, "sdd")) { |
|||
$thehtmlflag = $this->m_htmlflag; |
|||
} else { |
|||
$thehtmlflag = (!empty($_SERVER['DOCUMENT_ROOT'])); |
|||
} |
|||
} |
|||
} |
|||
|
|||
switch (gettype($thevariable)) { |
|||
case 'array': |
|||
return SDD::dArray($thevariable, $thehtmlflag); |
|||
case 'object': |
|||
return SDD::dObject($thevariable, $thehtmlflag); |
|||
default: |
|||
return SDD::scalar($thevariable, $thehtmlflag); |
|||
} |
|||
} |
|||
|
|||
/* |
|||
* Dump the contents of an array. |
|||
* |
|||
* @param array $theArray the array whose contents are to be displayed. |
|||
* @param boolean $theHTMLFlag True if an HTML table is to be generated, |
|||
* false otherwise. |
|||
* @param string $theIndent [optional] Used by SDD::dArray during recursion |
|||
* to get indenting right. |
|||
* @return string The display form of the array. |
|||
*/ |
|||
|
|||
public function darray(&$thearray, $thehtmlflag, $theindent = "") { |
|||
$theoutput = array(); |
|||
|
|||
foreach ($thearray as $theindex => $thevalue) { |
|||
if (is_array($thevalue)) { |
|||
$thestring = ssd::dArray($thevalue, $thehtmlflag, $theindent . " "); |
|||
$theoutput[$theindex] = substr($thestring, 0, strlen($thestring) - 1); |
|||
} else if (is_object($thevalue)) { |
|||
$theoutput[$theindex] = sdd::dobject($thevalue, $thehtmlflag); |
|||
} else { |
|||
$theoutput[$theindex] = ($thehtmlflag ? preg_replace('|<|s', '<', |
|||
var_export($thevalue, true)) : var_export($thevalue, true)); |
|||
} |
|||
} |
|||
|
|||
if ($thehtmlflag) { |
|||
$thestring = "<table border=1>\n"; |
|||
$thestring .= "<tr><td align=left>Array (</td></tr>\n"; |
|||
|
|||
foreach ($theoutput as $theindex => $thevariableoutput) { |
|||
$thestring .= "<tr>\n<td align=right>$theindex = ></td><td align=left>\n$thevariableoutput\n</td>\n</tr>\n"; |
|||
} |
|||
|
|||
$thestring .= "<tr><td align=left>)</td></tr>\n"; |
|||
$thestring .= "</table>\n"; |
|||
} else { |
|||
$thestring = "Array\n$theindent(\n"; |
|||
|
|||
foreach ($theoutput as $theindex => $thevariableoutput) { |
|||
$thestring .= "$theindent [$theindex] => " . $thevariableoutput . "\n"; |
|||
} |
|||
|
|||
$thestring .= "$theindent)\n"; |
|||
} |
|||
|
|||
return $thestring; |
|||
} |
|||
|
|||
/* |
|||
* Dump the contents of an object. |
|||
* |
|||
* Provide a structured display of an object and all the |
|||
* classes from which it was derived. The contents of |
|||
* the object is displayed from most derived to the base |
|||
* class, in order. |
|||
* |
|||
* @param object $theObject the object to be dumped. |
|||
* @param boolean $theHTMLFlag true if HTML is to be generated. |
|||
* @return string the display form of the object. |
|||
*/ |
|||
|
|||
public function dobject(&$theobject, $thehtmlflag) { |
|||
$theobjectvars = get_object_vars($theobject); |
|||
|
|||
/* Get the inheritance tree starting with the object and going |
|||
* through all the parent classes from there. |
|||
*/ |
|||
|
|||
$theclass = get_class($theobject); |
|||
|
|||
$theclasses[] = $theclass; |
|||
|
|||
while ($theclass = get_parent_class($theclass)) { |
|||
$theclasses[] = $theclass; |
|||
} |
|||
|
|||
/* Get all the class variables for each class in the inheritance |
|||
* tree. There will be some duplication, but we'll sort that out |
|||
* in the output process. |
|||
*/ |
|||
|
|||
foreach ($theclasses as $theclass) { |
|||
$theclassvars[$theclass] = get_class_vars($theclass); |
|||
} |
|||
|
|||
/* Put the inheritance tree from base class to most derived order |
|||
* (this is how we get rid of duplication of the variable names) |
|||
* Go through the object variables starting with the base class, |
|||
* capture the output and delete the variable from the object |
|||
* variables. |
|||
*/ |
|||
|
|||
$theclasses = array_reverse($theclasses); |
|||
|
|||
$theoutput = array(); |
|||
|
|||
foreach ($theclasses as $theclass) { |
|||
$theoutput[$theclass] = array(); |
|||
|
|||
foreach ($theclassvars[$theclass] as $thevariable => $value) { |
|||
if (array_key_exists($thevariable, $theobjectvars)) { |
|||
if (is_array($theobjectvars[$thevariable])) { |
|||
$theoutput[$theclass][] = $thevariable . " = " . sdd::darray($theobjectvars[$thevariable], $thehtmlflag); |
|||
} else if (is_object($theobjectvars[$thevariable])) { |
|||
$theoutput[$theclass][] = $thevariable . " = " . sdd::dobject($theobjectvars[$thevariable], $thehtmlflag); |
|||
} else { |
|||
$theotput[$theclass][] = $thevariable . " = " . |
|||
($thehtmlflag ? preg_replace('|<|s', '<', var_export( |
|||
$theobjectvars[$thevariable], true)) : var_export($theobjectvars[$thevariable], true)); |
|||
} |
|||
|
|||
unset($theobjectvars[$thevariable]); |
|||
} |
|||
} |
|||
} |
|||
|
|||
/* Put the classes back in most derived order for generating printable |
|||
* output. |
|||
*/ |
|||
$theclasses = array_reverse($theclasses); |
|||
|
|||
if ($thehtmlflag) { |
|||
$thestring = "<table>\n<thead>\n"; |
|||
|
|||
foreach ($theclasses as $theclass) { |
|||
$thestring .= "<th>\n$theclass\n</th>\n"; |
|||
} |
|||
|
|||
$thestring .= "</thead>\n<tr valign=top>\n"; |
|||
|
|||
foreach ($theclasses as $theclass) { |
|||
$thestring .= "<td>\n<table border=1>\n"; |
|||
|
|||
foreach ($theoutput[$theclass] as $thevariableoutput) { |
|||
$thestring .= "<tr>\n<td>\n$thevariableoutput\n</td>\n</tr>\n"; |
|||
} |
|||
|
|||
$thestring .= "</table>\n</td>\n"; |
|||
} |
|||
|
|||
$thestring .= "</tr>\n</table>\n"; |
|||
} else { |
|||
$classindent = ""; |
|||
|
|||
$classdataindent = " "; |
|||
|
|||
$thestring = ""; |
|||
|
|||
foreach ($theclasses as $theclass) { |
|||
$thestring .= "{$classindent}class $theclass\n\n"; |
|||
|
|||
foreach ($theoutput[$theclass] as $thevariableoutput) { |
|||
$thestring .= "$classdataindent$thevariableoutput\n"; |
|||
} |
|||
|
|||
$thestring .= "\n"; |
|||
|
|||
$classindent .= " "; |
|||
|
|||
$classdataindent .= " "; |
|||
} |
|||
} |
|||
|
|||
return $thestring; |
|||
} |
|||
|
|||
/* |
|||
* Write a debugging value to a log file. |
|||
* |
|||
* @access public |
|||
* @abstract |
|||
* @param mixed Data to be logged. |
|||
* @param string $theHeader [optional] string to be emitted prior to |
|||
* logging the data. By default it is a date/time |
|||
* stamp. |
|||
*/ |
|||
|
|||
public function log(&$thedata, $theheader = null) { |
|||
$theheader = date('[Y-m-d H:i:s]: ') . $theheader; |
|||
|
|||
if ($this->m_logging) { |
|||
if ($this->m_htmlflag) { |
|||
$xxx = $this->dump($thedata); |
|||
if (substr($xxx, 0, 5) == '<pre>') { |
|||
$xxx = '<pre>' . $theheader . substr($xxx, 5); |
|||
} else { |
|||
$xxx = $theheader . $xxx; |
|||
} |
|||
|
|||
$this->writeLog($xxx); |
|||
} else { |
|||
$xxx = $theheader . $this->dump($thedata); |
|||
$this->writelog($xxx); |
|||
} |
|||
} |
|||
} |
|||
|
|||
/* |
|||
* @desc Generate context specific new line equivalents. |
|||
* @param integer [optional] the number of newlines. |
|||
* @param boolean [optional] true if generating html newlines. |
|||
* @return string newlines. |
|||
* @access public |
|||
*/ |
|||
|
|||
public function newline($thecount = 1, $thehtmlflag = null) { |
|||
if ($thehtmlflag === null) { |
|||
if (empty($this)) { |
|||
$thehtmlflag = (!empty($_SERVER['DOCUMENT_ROOT'])); |
|||
} else { |
|||
if (is_subclass_of($this, "sdd")) { |
|||
$thehtmlflag = $this->m_htmlflag; |
|||
} else { |
|||
$thehtmlflag = (!empty($_SERVER['DOCUMENT_ROOT'])); |
|||
} |
|||
} |
|||
} |
|||
|
|||
if ($thehtmlflag) { |
|||
return str_repeat("<br />", max($thecount, 0)) . "\n"; |
|||
} else { |
|||
return str_repeat("\n", max($thecount, 0)); |
|||
} |
|||
} |
|||
|
|||
/* |
|||
* Dump any scalar value |
|||
* |
|||
* @param mixed $theVariable the variable to be dumped. |
|||
* @param boolean $theHtmlFlag true if html is to be generated. |
|||
*/ |
|||
|
|||
public function scalar(&$thevariable, $thehtmlflag) { |
|||
if ($thehtmlflag) { |
|||
return "<pre>" . preg_replace('|<|s', '<', var_export($thevariable, true)) . "</pre>"; |
|||
} else { |
|||
return var_export($thevariable, true); |
|||
} |
|||
} |
|||
|
|||
/* |
|||
* Write data to the log file. |
|||
* |
|||
* @access public |
|||
* @abstract |
|||
* @parameter string $theData [by reference] the data to be written |
|||
* into the log file. |
|||
* @return integer the number of bytes written into the log file. |
|||
*/ |
|||
|
|||
public function writelog(&$thedata) { |
|||
return strlen($this->m_log[] = $thedata); |
|||
} |
|||
|
|||
/* |
|||
* Return the state of the logging flag. |
|||
* |
|||
* @access public |
|||
* @return boolean |
|||
*/ |
|||
|
|||
public function getlogging() { |
|||
return $this->m_logging; |
|||
} |
|||
|
|||
/* |
|||
* Set the state of the logging flag. |
|||
* |
|||
* @access public |
|||
* @return boolean |
|||
*/ |
|||
|
|||
public function setlogging($thelogging=false) { |
|||
$this->m_logging = $thelogging; |
|||
} |
|||
} |
|||
|
@ -1,69 +1,75 @@ |
|||
<?php |
|||
|
|||
/** |
|||
* @author Dick Munroe <munroe@csworks.com> |
|||
* @copyright copyright @ by Dick Munroe, 2004 |
|||
* @license http://opensource.org/licenses/gpl-license.php GNU Public License |
|||
* @package StructuredDataDumper |
|||
* @version 1.0.1 |
|||
*/ |
|||
|
|||
// |
|||
// Edit History: |
|||
// |
|||
// Dick Munroe munroe@cworks.com 23-Dec-2004 |
|||
// Initial version created/ |
|||
// |
|||
|
|||
include_once('SDD/class.SDD.php') ; |
|||
|
|||
class logfile extends SDD |
|||
{ |
|||
|
|||
/** |
|||
* The open file handle. |
|||
* |
|||
* @access private |
|||
*/ |
|||
|
|||
var $m_handle ; |
|||
|
|||
/** |
|||
* Constructor |
|||
* |
|||
* @access public |
|||
*/ |
|||
|
|||
function logfile($theFileName) |
|||
{ |
|||
if (file_exists($theFileName)) |
|||
{ |
|||
$this->m_handle = fopen($theFileName, 'a') ; |
|||
} |
|||
else |
|||
{ |
|||
$this->m_handle = fopen($theFileName, 'w') ; |
|||
} |
|||
} |
|||
|
|||
function close() |
|||
{ |
|||
fclose($this->m_handle) ; |
|||
} |
|||
|
|||
/** |
|||
* Write a debugging value to a log file. |
|||
* |
|||
* @access public |
|||
* @abstract |
|||
* @param mixed Data to be logged. |
|||
* @return integer number of bytes written to the log. |
|||
*/ |
|||
|
|||
function log(&$theData) |
|||
{ |
|||
return fwrite($this->m_handle, date('[Y-m-d H:i:s]: ') . $this->dump($theData) . "\n") ; |
|||
} |
|||
|
|||
} |
|||
?> |
|||
<?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/>. |
|||
|
|||
/** |
|||
* @author Dick Munroe <munroe@csworks.com> |
|||
* @copyright copyright @ by Dick Munroe, 2004 |
|||
* @license http://opensource.org/licenses/gpl-license.php GNU Public License |
|||
* @package StructuredDataDumper |
|||
* @version 1.0.1 |
|||
*/ |
|||
|
|||
/* |
|||
* Edit History: |
|||
* |
|||
* Dick Munroe munroe@cworks.com 23-Dec-2004 |
|||
* Initial version created/ |
|||
*/ |
|||
|
|||
require_once('SDD/class.SDD.php'); |
|||
|
|||
class logfile extends SDD { |
|||
|
|||
/* |
|||
* The open file handle. |
|||
* |
|||
* @access private |
|||
*/ |
|||
|
|||
protected $m_handle; |
|||
|
|||
/* |
|||
* Constructor |
|||
* |
|||
* @access public |
|||
*/ |
|||
|
|||
public function logfile($thefilename) { |
|||
if (file_exists($thefilename)) { |
|||
$this->m_handle = fopen($thefilename, 'a'); |
|||
} else { |
|||
$this->m_handle = fopen($thefilename, 'w'); |
|||
} |
|||
} |
|||
|
|||
public function close() { |
|||
fclose($this->m_handle); |
|||
} |
|||
|
|||
/* |
|||
* Write a debugging value to a log file. |
|||
* |
|||
* @access public |
|||
* @abstract |
|||
* @param mixed Data to be logged. |
|||
* @return integer number of bytes written to the log. |
|||
*/ |
|||
|
|||
public function log(&$thedata) { |
|||
return fwrite($this->m_handle, date('[Y-m-d H:i:s]: ') . $this->dump($thedata) . "\n"); |
|||
} |
|||
} |
|||
|
|||
|
Loading…
Reference in new issue