Example #1
0
 function parse($path, array $var = array(), $maxDepth = null)
 {
     $file = $this->basePath . '/' . ltrim($path, '/');
     $meta = array();
     foreach (array(dirname(dirname($file)), dirname($file)) as $v) {
         $v .= '/_meta.txt';
         if (file_exists($v)) {
             $meta = array_merge_recursive($meta, $this->parseArr($this->getContent($v), $maxDepth));
         }
     }
     $content = $this->getContent($file);
     // parse here doc
     $hereDoc = array();
     $content = preg_replace_callback('/<<<(.+)>>>/sm', function (&$node) use(&$hereDoc) {
         $hereDoc[] = $node[1];
         return '\\d' . (count($hereDoc) - 1);
     }, $content);
     $arr = $this->parseArr($content, $maxDepth);
     if (array_key_exists('_meta', $arr)) {
         if (!empty($arr['_meta'])) {
             $meta = array_merge_recursive($meta, $arr['_meta']);
         }
         unset($arr['_meta']);
     }
     if (!empty($meta['_unset'])) {
         Helper_Array::unsetr($meta, $meta['_unset']);
         unset($meta['_unset']);
     }
     foreach ($arr as $k => $v) {
         if (null == $v) {
             unset($arr[$k]);
             continue;
         }
         $parent = $meta;
         // unset
         if (!empty($v['_unset'])) {
             Helper_Array::unsetr($parent, $v['_unset']);
             unset($v['_unset']);
         }
         // default
         if (!empty($parent['default'])) {
             list($v, $temp) = array($parent['default'], $v);
             Helper_Array::merger($v, $temp);
         }
         // replace
         Helper_Array::pregReplacer('/^\\\\k$/', $k, $v);
         // key clean
         Helper_Array::pregKeyReplacer('/^\\\\s(\\d+)$/', '\\1', $v);
         // prefix
         if (!empty($parent['prefix'])) {
             Helper_Array::prefixr($v, $parent['prefix']);
         }
         // suffix
         if (!empty($parent['suffix'])) {
             Helper_Array::suffixr($v, $parent['suffix']);
         }
         // wraper
         if (!empty($parent['wraper'])) {
             Helper_Array::wraperr($v, $parent['wraper']);
         }
         // var replace
         if (!empty($var)) {
             array_walk_recursive($v, function (&$v, $k, $var) {
                 if (is_string($v)) {
                     preg_match_all('/\\{\\$(\\w+)\\}/', $v, $matches);
                     if (!empty($matches[1])) {
                         foreach ($matches[1] as $v1) {
                             if (isset($var[$v1])) {
                                 $v = str_replace('{$' . $v1 . '}', $var[$v1], $v);
                             }
                         }
                     }
                 }
             }, $var);
         }
         // \d 恢复
         $search = $replace = array();
         for ($i = 0; $i < count($hereDoc); $i++) {
             $search[] = '/^\\\\d' . $i . '$/';
             $replace[] = $hereDoc[$i];
         }
         Helper_Array::pregReplacer($search, $replace, $v);
         $arr[$k] = $v;
     }
     // \h自继承
     $funcH = function (array &$subject) use(&$funcH, $arr) {
         foreach ($subject as $k => &$v) {
             if ('\\h' === $k) {
                 $key = explode(' ', $v);
                 $value = Helper_Array::current($arr, $key);
                 $key = array_pop($key);
                 $subject[$key] = $value;
                 unset($subject[$k]);
             } elseif (is_array($v)) {
                 call_user_func_array($funcH, array(&$v));
             }
         }
     };
     $funcH($arr);
     // \i 包含
     $dir = dirname($file) . '/_inc';
     Helper_Array::pregReplaceCallbackr('/\\\\i(.+)/', function ($node) use($dir) {
         $file = $dir . '/' . trim($node[1]);
         if (file_exists($file)) {
             return file_get_contents($file);
         }
     }, $arr);
     return $arr;
 }