<?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) . '}';
 
        }
 
    }
 
 
}
 
 
 |