| 
<?php
 /**
 * Tool_JIT
 *
 * @package Tool
 * @since 09.02.2009
 * @version 0.1
 * @author Thomas Schäfer
 *
 * @desc build a json object for the JIT Lib
 *
 * @see http://blog.thejit.org/javascript-information-visualization-toolkit-jit/
 * @example
 * <code>
 * $node     = Tool_JIT::getInstance();
 * $node    ->set("190","Pearl Jam")
 ->addChild(
 Tool_JIT::getInstance()
 ->set("306208","Pearl Jam & Cypress Hill")
 ->add("Pearl Jam","collaboration")
 ->addChild(
 Tool_JIT::getInstance()
 ->set("84","Cypress Hill")
 ->add("Pearl Jam & Cypress Hill","collaboration")
 ->addChild()
 )
 );
 echo $node->render();
 </code>
 */
 class Tool_JIT {
 
 /**
 * var static $iCounter
 * @desc used for id attachment
 */
 private static $iCounter = 0;
 
 /**
 * @var node
 */
 private static $instance;
 
 /**
 * @var $node
 */
 private $node;
 
 public function __construct(){}
 
 /**
 * getInstance
 */
 public function getInstance(){
 if(empty(self::$instance)) {
 return new Tool_JIT;
 }
 return self::$instance;
 }
 
 /*
 * set
 * @desc set id and node caption
 * @param string id
 * @param string $caption
 * @return self
 */
 public function set($id, $caption) {
 $this->node = new stdClass;
 $this->node->id = $id . "_". Tool_JIT::$iCounter;
 $this->node->name = $caption;
 $this->node->data = array();
 
 Tool_JIT::$iCounter++;
 return $this;
 }
 
 /**
 * add
 * @desc add a key/value pair
 * @param string $key
 * @param mixed $value
 * @return self
 */
 public function add($key,$value) {
 if(empty($this->node->data) or !array_key_exists("data",$this->node)) {
 $this->node->data = array();
 }
 $data = new stdClass;
 $data->key = $key;
 $data->value = $value;
 $this->node->data[] = $data;
 return $this;
 }
 
 /**
 * to
 * @desc connect a node with its parent
 * @param string $strNodeTo
 * @param integer $weight
 * @return self
 */
 public function to($strNodeTo, $weight) {
 if(empty($this->node->adjacencies) or !array_key_exists("adjacencies",$this->node)) {
 $this->node->adjacencies = array();
 }
 $nodeTo = new stdClass;
 $nodeTo->nodeTo = $strNodeTo;
 
 $nodeTo->data = array();
 
 $nodeToData = new stdClass;
 $nodeToData->weight = 3;
 
 $nodeTo->data[] = $nodeToData;
 $this->node->adjacencies[] = $nodeTo;
 return $this;
 }
 
 /**
 * addChild
 * @desc add a new node as child
 * @param Tool_JIT $node
 * @return self
 */
 public function addChild($node = null) {
 if(is_null($node) or $node instanceof Tool_JIT)
 {
 if(empty($this->node->children) or !array_key_exists("children",$this->node)) {
 $this->node->children = array();
 }
 $this->node->children[] = $node;
 }
 return $this;
 }
 
 /**
 * get
 * @desc returns the data tree
 * @return mixed
 */
 public function get() {
 return $this->node;
 }
 
 /**
 * render
 * @desc renders the Tool_JIT-Object as JSON
 * @return string
 */
 public function render() {
 return Tool_JIT::toJSON($this->get());
 }
 
 /**
 * toJSON
 * @param mixed $data
 * @param bool $escape
 * return $mixed
 */
 public static function toJSON($data=null, $escape=true)
 {
 if (is_null($data)){
 return '';
 }
 if ($data === false){
 return 'false';
 }
 if ($data === true){
 return 'true';
 }
 if (is_scalar($data)) {
 $data = addslashes($data);
 $data = preg_replace('{(</)(script)}i', "$1'+'$2", $data);
 if(
 empty($escape) or
 preg_match("/^([0-9]{1,14})$/",$data) or
 preg_match("/^(\+?((([0-9]+(\.)?)|([0-9]*\.[0-9]+))([eE][+-]?[0-9]+)?))$/",$data) or
 is_bool($data)
 ) {
 $data = stripslashes($data);
 $data = str_replace("\n", "", $data);
 $data = str_replace("\r", "", $data);
 $data = str_replace("\t", "", $data);
 return trim($data);
 }else{
 $data = str_replace("\n", "", $data);
 $data = str_replace("\r", "", $data);
 $data = str_replace("\t", "", $data);
 return "\"".trim($data)."\"";
 }
 
 }
 $isList = true;
 for ($i=0, reset($data); $i<count($data); $i++, next($data)){
 if (key($data) !== $i) {
 $isList = false; break;
 }
 }
 $result = array();
 if ($isList) {
 foreach ($data as $v){
 if((is_scalar($v) and (
 preg_match("/^([0-9]{1,14})$/",$v)) or
 is_bool($v)
 )) {
 $result[] = Tool_JIT::toJSON($v,false);
 } else {
 if($v instanceof Tool_JIT)
 $result[] = Tool_JIT::toJSON($v->get());
 else
 $result[] = Tool_JIT::toJSON($v);
 }
 }
 return '[' . join(',', $result) . ']';
 } else {
 foreach ($data as $key => $value){
 $result[] = Tool_JIT::toJSON($key) . ':' . Tool_JIT::toJSON($value);
 }
 return '{' . join(',', $result) . '}';
 }
 }
 
 }
 
 |