1: <?php
2:
3: 4: 5: 6:
7:
8: namespace Nette\Neon;
9:
10: use Nette;
11:
12:
13: 14: 15: 16: 17:
18: class Encoder
19: {
20: const BLOCK = 1;
21:
22:
23: 24: 25: 26: 27: 28:
29: public function encode($var, $options = NULL)
30: {
31: if ($var instanceof \DateTime) {
32: return $var->format('Y-m-d H:i:s O');
33:
34: } elseif ($var instanceof Entity) {
35: return self::encode($var->value) . '(' . (is_array($var->attributes) ? substr(self::encode($var->attributes), 1, -1) : '') . ')';
36: }
37:
38: if (is_object($var)) {
39: $obj = $var; $var = array();
40: foreach ($obj as $k => $v) {
41: $var[$k] = $v;
42: }
43: }
44:
45: if (is_array($var)) {
46: $isList = !$var || array_keys($var) === range(0, count($var) - 1);
47: $s = '';
48: if ($options & self::BLOCK) {
49: if (count($var) === 0) {
50: return '[]';
51: }
52: foreach ($var as $k => $v) {
53: $v = self::encode($v, self::BLOCK);
54: $s .= ($isList ? '-' : self::encode($k) . ':')
55: . (strpos($v, "\n") === FALSE ? ' ' . $v : "\n\t" . str_replace("\n", "\n\t", $v))
56: . "\n";
57: continue;
58: }
59: return $s;
60:
61: } else {
62: foreach ($var as $k => $v) {
63: $s .= ($isList ? '' : self::encode($k) . ': ') . self::encode($v) . ', ';
64: }
65: return ($isList ? '[' : '{') . substr($s, 0, -2) . ($isList ? ']' : '}');
66: }
67:
68: } elseif (is_string($var) && !is_numeric($var)
69: && !preg_match('~[\x00-\x1F]|^\d{4}|^(true|false|yes|no|on|off|null)\z~i', $var)
70: && preg_match('~^' . Decoder::$patterns[1] . '\z~x', $var)
71: ) {
72: return $var;
73:
74: } elseif (is_float($var)) {
75: $var = json_encode($var);
76: return strpos($var, '.') === FALSE ? $var . '.0' : $var;
77:
78: } else {
79: return json_encode($var);
80: }
81: }
82:
83: }
84: