%PDF- %PDF-
Direktori : /www/old2/_music/diplomka/diplomka/src/API/libs/Nette/Config/Adapters/ |
Current File : /www/old2/_music/diplomka/diplomka/src/API/libs/Nette/Config/Adapters/NeonAdapter.php |
<?php /** * This file is part of the Nette Framework (http://nette.org) * * Copyright (c) 2004 David Grudl (http://davidgrudl.com) * * For the full copyright and license information, please view * the file license.txt that was distributed with this source code. */ namespace Nette\Config\Adapters; use Nette, Nette\Config\Helpers, Nette\Utils\Neon; /** * Reading and generating NEON files. * * @author David Grudl */ class NeonAdapter extends Nette\Object implements Nette\Config\IAdapter { /** @internal */ const INHERITING_SEPARATOR = '<', // child < parent PREVENT_MERGING = '!'; /** * Reads configuration from NEON file. * @param string file name * @return array */ public function load($file) { return $this->process((array) Neon::decode(file_get_contents($file))); } private function process(array $arr) { $res = array(); foreach ($arr as $key => $val) { if (substr($key, -1) === self::PREVENT_MERGING) { if (!is_array($val) && $val !== NULL) { throw new Nette\InvalidStateException("Replacing operator is available only for arrays, item '$key' is not array."); } $key = substr($key, 0, -1); $val[Helpers::EXTENDS_KEY] = Helpers::OVERWRITE; } elseif (preg_match('#^(\S+)\s+' . self::INHERITING_SEPARATOR . '\s+(\S+)\z#', $key, $matches)) { if (!is_array($val) && $val !== NULL) { throw new Nette\InvalidStateException("Inheritance operator is available only for arrays, item '$key' is not array."); } list(, $key, $val[Helpers::EXTENDS_KEY]) = $matches; if (isset($res[$key])) { throw new Nette\InvalidStateException("Duplicated key '$key'."); } } if (is_array($val)) { $val = $this->process($val); } elseif ($val instanceof Nette\Utils\NeonEntity) { $val = (object) array('value' => $val->value, 'attributes' => $this->process($val->attributes)); } $res[$key] = $val; } return $res; } /** * Generates configuration in NEON format. * @return string */ public function dump(array $data) { $tmp = array(); foreach ($data as $name => $secData) { if ($parent = Helpers::takeParent($secData)) { $name .= ' ' . self::INHERITING_SEPARATOR . ' ' . $parent; } $tmp[$name] = $secData; } return "# generated by Nette\n\n" . Neon::encode($tmp, Neon::BLOCK); } }