/**
 * Rendering is the process of pushing the document buffers into the template
 * placeholders, retrieving data from the document and pushing it into
 * the application response buffer.
 *
 * @return  void
 *
 * @since   3.2
 */
protected function render()
{
    // Setup the document options.
    $this->docOptions['template'] = $this->get('theme');
    $this->docOptions['file'] = $this->get('themeFile', 'index.php');
    $this->docOptions['params'] = $this->get('themeParams');
    $this->docOptions['csp_nonce'] = $this->get('csp_nonce');
    $this->docOptions['templateInherits'] = $this->get('themeInherits');
    if ($this->get('themes.base')) {
        $this->docOptions['directory'] = $this->get('themes.base');
    } else {
        $this->docOptions['directory'] = \defined('JPATH_THEMES') ? JPATH_THEMES : (\defined('JPATH_BASE') ? JPATH_BASE : __DIR__) . '/themes';
    }
    // Parse the document.
    $this->document->parse($this->docOptions);
    // Trigger the onBeforeRender event.
    PluginHelper::importPlugin('system');
    $this->triggerEvent('onBeforeRender');
    $caching = false;
    if ($this->isClient('site') && $this->get('caching') && $this->get('caching', 2) == 2 && !Factory::getUser()->get('id')) {
        $caching = true;
    }
    // Render the document.
    $data = $this->document->render($caching, $this->docOptions);
    // Set the application output data.
    $this->setBody($data);
    // Trigger the onAfterRender event.
    $this->triggerEvent('onAfterRender');
    // Mark afterRender in the profiler.
    JDEBUG ? $this->profiler->mark('afterRender') : null;
}