In addition to the default XSLT renderer, it is possible to compile templates to native PHP. You will need a writable directory to save the compiled template as a PHP file.

$configurator->rendering->engine = 'PHP';
$configurator->rendering->engine->cacheDir = '/path/to/dir';

A class name is automatically generated for the renderer class, based on its content. Alternatively, you can specify a class name by setting the className property. The class name and file name of the last generated renderer instance can be accessed via the renderer generator.

$configurator = new s9e\TextFormatter\Configurator;
$configurator->rendering->engine           = 'PHP';
$configurator->rendering->engine->cacheDir = '/tmp';

extract($configurator->finalize());
echo 'Default: ', get_class($renderer), "\n";

$configurator->rendering->engine->className = 'MyRenderer';
extract($configurator->finalize());
echo 'Custom:  ', get_class($renderer), "\n\n";

echo 'Last class: ', $configurator->rendering->engine->lastClassName, "\n";
echo 'Last file:  ', $configurator->rendering->engine->lastFilepath;
Default: Renderer_42d42900e1fe70a3dfadc1c19ebcd948e925d8ba
Custom:  MyRenderer

Last class: MyRenderer
Last file:  /tmp/MyRenderer.php

PHP renderer limitations

Not every XSL element and XPath function is supported by the PHP renderer. One way to detect unsupported templates early in the configuration is to enable the DisallowUncompilableXSL template check.

$configurator = new s9e\TextFormatter\Configurator;

// Add the DisallowUncompilableXSL check
$configurator->templateChecker->append('DisallowUncompilableXSL');

// Create a BBCode with an unsupported element
try
{
    $configurator->BBCodes->addCustom('[x]', '<xsl:processing-instruction name="foo"/>');
}
catch (RuntimeException $e)
{
    echo get_class($e), ': ', $e->getMessage();
}
RuntimeException: xsl:processing-instruction elements are not supported