namespace Illuminate\View\Compilers;use Illuminate\Support\Arr;use Illuminate\Support\Str;// namespace is so coolclass BladeCompiler extends Compiler implements CompilerInterface{// has father class and api /** * All of the registered extensions. * * @var array */ protected $extensions = [];// all of the registered extension. /** * All custom "directive" handlers. * * This was implemented as a more usable "extend" in 5.1. * * @var array */ protected $customDirectives = [];// All custom "directive" handlers /** * The file currently being compiled. * * @var string */ protected $path;// The file currently being compiled. /** * All of the available compiler functions. * * @var array */ protected $compilers = [ 'Extensions', 'Statements', 'Comments', 'Echos', ];// All of the available compiler functions // a function collection /** * Array of opening and closing tags for raw echos. * * @var array */ protected $rawTags = ['{!!', '!!}'];// Array of opening and closing tags for raw echos. /** * Array of opening and closing tags for regular echos. * * @var array */ protected $contentTags = ['{ {', '}}'];//Array of opening and closing tags for regular echos. /** * Array of opening and closing tags for escaped echos. * * @var array */ protected $escapedTags = ['{ { {', '}}}'];//Array of opening and closing tags for escaped echos. /** * The "regular" / legacy echo string format. * * @var string */ protected $echoFormat = 'e(%s)';// The "regular" /legacy echo string format. /** * Array of footer lines to be added to template. * * @var array */ protected $footer = [];// Array of footer lines to the added to template. /** * Counter to keep track of nested for else statements. * * @var int */ protected $forelseCounter = 0;//Counter to keep track of nested for else statements. /** * Compile the view at the given path. * * @param string $path * @return void */ public function compile($path = null) {//Compile the view at the given path. if ($path) {// $path $this->setPath($path);// path } $contents = $this->compileString($this->files->get($this->getPath()));// contents // get the contents if (! is_null($this->cachePath)) { $this->files->put($this->getCompiledPath($this->getPath()), $contents); }// if not null }// return it, /** * Get the path currently being compiled. * * @return string */ public function getPath() { return $this->path; }// big get just get you want /** * Set the path currently being compiled. * * @param string $path * @return void */ public function setPath($path) { $this->path = $path; }// set Path /** * Compile the given Blade template contents. * * @param string $value * @return string */ public function compileString($value) {//Compile the given Blade template contents. $result = '';// this result $this->footer = [];// this footer // Here we will loop through all of the tokens returned by the Zend lexer and // parse each one into the corresponding valid PHP. We will then have this // template as the correctly rendered PHP that can be rendered natively. foreach (token_get_all($value) as $token) { $result .= is_array($token) ? $this->parseToken($token) : $token; }// token_get_all //loop the token_get_all // If there are any footer lines that need to get added to a template we will // add them here at the end of the template. This gets used mainly for the // template inheritance via the extends keyword that should be appended. if (count($this->footer) > 0) { $result = ltrim($result, PHP_EOL) .PHP_EOL.implode(PHP_EOL, array_reverse($this->footer)); }// append something return $result;//return result } /** * Parse the tokens from the template. * * @param array $token * @return string */ protected function parseToken($token) {//Parse the tokens from the template. list($id, $content) = $token;//get list if ($id == T_INLINE_HTML) {// a special id foreach ($this->compilers as $type) {// loop compile $content = $this->{"compile{$type}"}($content);// this is a good use //$content = $this=>{"compile{$type}"}($content); } } return $content;//return this type }// a classic function type /** * Execute the user defined extensions. * * @param string $value * @return string */ protected function compileExtensions($value) { foreach ($this->extensions as $compiler) { $value = call_user_func($compiler, $value, $this); }// loop extensions and call_user_func return $value; }//Execute the user defined extensions /** * Compile Blade comments into valid PHP. * * @param string $value * @return string */ protected function compileComments($value) { $pattern = sprintf('/%s--((.|\s)*?)--%s/', $this->contentTags[0], $this->contentTags[1]);// get the pattern // a very good function type // just comments return preg_replace($pattern, ' ', $value); }//compile Blade comments into valid PHP /** * Compile Blade echos into valid PHP. * * @param string $value * @return string */ protected function compileEchos($value) {//compile Blade echos into valid PHP. foreach ($this->getEchoMethods() as $method => $length) { $value = $this->$method($value);//get the value }// foreach return $value; }// return $value /** * Get the echo methods in the proper order for compilation. * * @return array */ protected function getEchoMethods() {//Get the echo methods in the proper order for compilation. $methods = [ 'compileRawEchos' => strlen(stripcslashes($this->rawTags[0])), 'compileEscapedEchos' => strlen(stripcslashes($this->escapedTags[0])), 'compileRegularEchos' => strlen(stripcslashes($this->contentTags[0])), ];// set some regular method to use uksort($methods, function ($method1, $method2) use ($methods) { // use user define method to sort the array // Ensure the longest tags are processed first if ($methods[$method1] > $methods[$method2]) { return -1; } if ($methods[$method1] < $methods[$method2]) { return 1; } // Otherwise give preference to raw tags (assuming they've overridden) if ($method1 === 'compileRawEchos') { return -1; } if ($method2 === 'compileRawEchos') { return 1; } if ($method1 === 'compileEscapedEchos') { return -1; } if ($method2 === 'compileEscapedEchos') { return 1; } }); return $methods; }// The methods.