function load($file) { Nette\Diagnostics\Debugger::tryError(); $ini = parse_ini_file($file, TRUE); if (Nette\Diagnostics\Debugger::catchError($e)) { throw new Nette\InvalidStateException('parse_ini_file(): ' . $e->getMessage(), 0, $e); } $data = array(); foreach ($ini as $secName => $secData) { if (is_array($secData)) { if (substr($secName, -1) === self::RAW_SECTION) { $secName = substr($secName, 0, -1); } else { $tmp = array(); foreach ($secData as $key => $val) { $cursor =& $tmp; $key = str_replace(self::ESCAPED_KEY_SEPARATOR, "�", $key); foreach (explode(self::KEY_SEPARATOR, $key) as $part) { $part = str_replace("�", self::KEY_SEPARATOR, $part); if (!isset($cursor[$part]) || is_array($cursor[$part])) { $cursor =& $cursor[$part]; } else { throw new Nette\InvalidStateException("Invalid key '{$key}' in section [{$secName}] in file '{$file}'."); } } $cursor = $val; } $secData = $tmp; } $parts = explode(self::INHERITING_SEPARATOR, $secName); if (count($parts) > 1) { $secName = trim($parts[0]); $secData[Config::EXTENDS_KEY] = trim($parts[1]); } } $cursor =& $data; foreach (explode(self::KEY_SEPARATOR, $secName) as $part) { if (!isset($cursor[$part]) || is_array($cursor[$part])) { $cursor =& $cursor[$part]; } else { throw new Nette\InvalidStateException("Invalid section [{$secName}] in file '{$file}'."); } } if (is_array($secData) && is_array($cursor)) { $secData = Config::merge($secData, $cursor); } $cursor = $secData; } return $data; }