control-freak-ide/server/nodejs/util/docscripts/lib/generator/JsonSerializer.php
plastic-hub-dev-node-saturn 538369cff7 latest
2021-05-12 18:35:18 +02:00

141 lines
3.2 KiB
PHP

<?php
class JsonSerializer extends Serializer
{
protected $header = array('{');
protected $footer = array('}');
protected function lineStarts($line) {
if (preg_match('%^\t"([^"]+)": {%', $line, $match)) {
return $match[1];
}
}
protected function lineEnds($line) {
if (preg_match('%^\t}%', $line, $match)) {
return true;
}
}
protected function linesToRaw($lines) {
$lines[0] = '{';
$lines[count($lines)-1] = '}';
return json_decode(implode("\n", $lines));
}
public function toObject($raw, $id=null) {
return $raw;
}
public function toString($raw, $id=null) {
if (!$id) {
if (!($id = $raw['id'])) {
throw new Exception('toString must be passed an ID or raw object must contain and ID');
}
}
$tab = "\t";
$new_json = "\"$id\": ";
$indent_level = 0;
$in_string = false;
$json = json_encode($raw);
$len = strlen($json);
for ($c = 0; $c < $len; $c++) {
$char = $json{$c};
switch($char) {
case '{':
case '[':
if (!$in_string) {
$new_json .= $char . "\n" . str_repeat($tab, ++$indent_level);
}
else {
$new_json .= $char;
}
break;
case '}':
case ']':
if(!$in_string) {
$new_json .= "\n" . str_repeat($tab, --$indent_level) . $char;
}
else {
$new_json .= $char;
}
break;
case ',':
if (!$in_string) {
$new_json .= ",\n" . str_repeat($tab, $indent_level);
}
else {
$new_json .= $char;
}
break;
case ':':
if (!$in_string) {
$new_json .= ": ";
}
else {
$new_json .= $char;
}
break;
case '"':
if($c > 0 && $json[$c-1] != '\\') {
$in_string = !$in_string;
}
default:
$new_json .= $char;
break;
}
}
return $new_json . ",\n";
}
protected function descend($node, $object) {
if (!is_array($object) && !is_object($object)) {
return $object;
}
foreach ($object as $key => $value) {
switch ($key{0}) {
case '@':
$node[substr($key, 1)] = $value;
break;
case '#':
if ($key == '#mixins') {
foreach ($value as $mixins) {
$scope = $mixins['@scope'];
foreach ($mixins['#mixin'] as $mixin) {
$node['mixins'][$scope][] = $this->descend(array(), $mixin);
}
}
}
elseif (count($value) == 1 && !in_array($key, array('#property', '#method', '#resource', '#parameter', '#provide', '#return-type'))) {
$node[substr($key, 1)] = $this->descend(array(), $value[0]);
}
else {
foreach ($value as $child) {
$node[] = $this->descend(array(), $child);
}
}
break;
default:
if ($key === 'content') {
if (count($object) == 1) {
return $value;
}
$node['content'] = $value;
}
}
}
return $node;
}
public function convertToRaw($object) {
return $this->descend(array(), $object);
}
}
?>