Files
2021-02-26 22:23:13 +08:00

2.6 KiB

Rendering

From version 1.2

To render an AST generated by Peast you need to create an instance of the Renderer class and associate a Formatter to it:

$source = "var a;";
//Generate the AST
$ast = Peast\Peast::latest($source, $options)->parse();
//Create the renderer
$renderer = new Peast\Renderer;
//Associate the formatter
$renderer->setFormatter(new Peast\Formatter\PrettyPrint);
//Render the AST
echo $renderer->render($ast); //"var a;"

Formatters

A Formatter specifies how the Renderer must format the nodes to produce the output. Peast implements 3 formatters: PrettyPrint, Compact and Expanded.

For example using this source code:

if (fn(param)) alert("Ok");
else alert("Fail");
PrettyPrint

Produces a well formatted version of the code.

if (fn(param)) {
    alert("Ok");
} else {
    alert("Fail");
}
Compact

Produces a compact version of the code by removing whitespaces and optional brackets.

if (fn(param))alert("Ok");else alert("Fail");
Expanded

An expanded version of PrettyPrint.

if ( fn( param ) )
{
    alert( "Ok" );
} else
{
    alert( "Fail" );
}

Custom Formatter

Peast allows you to create your own formatter. You can do it by creating a class that extends Peast\Formatter\Base class and overwriting its protected properties:

class MyFormatter extends Peast\Formatter\Base {
    //Use Windows style line endings
    protected $newLine = "\r\n";
}
$renderer = new Peast\Renderer;
$renderer->setFormatter(new MyFormatter);
echo $renderer->render($ast);

Available properties are:

  • $newLine: line separator string (default: "\n")
  • $indentation: indentation string (default: "\t")
  • $newLineBeforeCurlyBracket: if true, open curly brackets of code blocks will be put on a new line (default: false)
  • $alwaysWrapBlocks: if true, curly brackets around code blocks will always be inserted, also when they are optional (default: true)
  • $spacesAroundOperators: if true, a space will be inserted before and after operators (default: true)
  • $spacesInsideRoundBrackets: if true, content inside round brackets will be surrounded by spaces (default: false)

Shortcut method

Every syntax node has its own render method that you can use as a shortcut. For example:

$ast = Peast\Peast::latest($source, $options)->parse();
$ast->render(new Peast\Formatter\PrettyPrint);
//Equivalent to
$ast = Peast\Peast::latest($source, $options)->parse();
$renderer = new Peast\Renderer;
$renderer->setFormatter(new Peast\Formatter\PrettyPrint);
$renderer->render($ast);