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