/** * @param $file * @return array * @throws \Nette\InvalidArgumentException */ public function getElementsByFile($file) { if (!file_exists($file)) { throw new InvalidArgumentException("File '{$file}' does not exist."); } $ret = array(); $tokenizer = new MacroTokenizer(file_get_contents($file)); while (($word = $tokenizer->fetchWord()) !== FALSE) { if ($word === '{element') { $name = trim($tokenizer->fetchWord(), '}\'"'); $id = trim($tokenizer->fetchWord(), '}\'"'); $ret[$id] = $name; } } return $ret; }
/** * Expands %node.word, %node.array, %node.args, %escape(), %modify(), %var, %raw in code. * * @param string * * @return string */ public function write($mask) { $args = func_get_args(); array_shift($args); $word = strpos($mask, '%node.word') === false ? null : $this->argsTokenizer->fetchWord(); $me = $this; $mask = Nette\Utils\Strings::replace($mask, '#%escape(\\(([^()]*+|(?1))+\\))#', function ($m) use($me) { return $me->escape(substr($m[1], 1, -1)); }); $mask = Nette\Utils\Strings::replace($mask, '#%modify(\\(([^()]*+|(?1))+\\))#', function ($m) use($me) { return $me->formatModifiers(substr($m[1], 1, -1)); }); return Nette\Utils\Strings::replace($mask, '#([,+]\\s*)?%(node\\.word|node\\.array|node\\.args|var|raw)(\\?)?(\\s*\\+\\s*)?()#', function ($m) use($me, $word, &$args) { list(, $l, $macro, $cond, $r) = $m; switch ($macro) { case 'node.word': $code = $me->formatWord($word); break; case 'node.args': $code = $me->formatArgs(); break; case 'node.array': $code = $me->formatArray(); $code = $cond && $code === 'array()' ? '' : $code; break; case 'var': $code = var_export(array_shift($args), true); break; case 'raw': $code = (string) array_shift($args); break; } if ($cond && $code === '') { return $r ? $l : $r; } else { return $l . $code . $r; } }); }