1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10:
11:
12: namespace Nette\Config;
13:
14: use Nette,
15: Nette\Neon;
16:
17:
18:
19: 20: 21: 22: 23:
24: final class ConfigAdapterNeon implements IConfigAdapter
25: {
26:
27: public static $sectionSeparator = ' < ';
28:
29:
30: public static $keySeparator = '.';
31:
32:
33: 34: 35:
36: final public function __construct()
37: {
38: throw new \LogicException("Cannot instantiate static class " . get_class($this));
39: }
40:
41:
42:
43: 44: 45: 46: 47: 48:
49: public static function load($file)
50: {
51: if (!is_file($file) || !is_readable($file)) {
52: throw new \FileNotFoundException("File '$file' is missing or is not readable.");
53: }
54:
55: $neon = Neon::decode(file_get_contents($file));
56:
57: $separator = trim(self::$sectionSeparator);
58: $data = array();
59: foreach ($neon as $secName => $secData) {
60: if ($secData === NULL) { 61: $secData = array();
62: }
63:
64: if (is_array($secData)) {
65: 66: $parts = $separator ? explode($separator, $secName) : array($secName);
67:
68: if (count($parts) > 1) {
69: $parent = trim($parts[1]);
70: $cursor = & $data;
71:
72: foreach (self::$keySeparator ? explode(self::$keySeparator, $parent) : array($parent) as $part) {
73: if (isset($cursor[$part]) && is_array($cursor[$part])) {
74: $cursor = & $cursor[$part];
75: } else {
76: throw new \InvalidStateException("Missing parent section $parent in '$file'.");
77: }
78: }
79: $secData = Nette\ArrayTools::mergeTree($secData, $cursor);
80: }
81:
82: $secName = trim($parts[0]);
83: if ($secName === '') {
84: throw new \InvalidStateException("Invalid empty section name in '$file'.");
85: }
86: }
87:
88: if (self::$keySeparator) {
89: $cursor = & $data;
90: foreach (explode(self::$keySeparator, $secName) as $part) {
91: if (!isset($cursor[$part]) || is_array($cursor[$part])) {
92: $cursor = & $cursor[$part];
93: } else {
94: throw new \InvalidStateException("Invalid section [$secName] in '$file'.");
95: }
96: }
97: } else {
98: $cursor = & $data[$secName];
99: }
100:
101: if (is_array($secData) && is_array($cursor)) {
102: $secData = Nette\ArrayTools::mergeTree($secData, $cursor);
103: }
104:
105: $cursor = $secData;
106: }
107:
108: return $data;
109: }
110:
111:
112:
113: 114: 115: 116: 117: 118:
119: public static function save($config, $file)
120: {
121: if (!file_put_contents($file, "# generated by Nette\n\n" . Neon::encode($config, Neon::BLOCK))) {
122: throw new \IOException("Cannot write file '$file'.");
123: }
124: }
125:
126: }
127: