gl-website-deployer/vendor/doctrine/rst-parser/lib/Configuration.php
2024-11-19 08:02:04 +01:00

382 lines
11 KiB
PHP

<?php
declare(strict_types=1);
namespace Doctrine\RST;
use Doctrine\Common\EventArgs;
use Doctrine\Common\EventManager;
use Doctrine\RST\Formats\Format;
use Doctrine\RST\Formats\InternalFormat;
use Doctrine\RST\HTML\HTMLFormat;
use Doctrine\RST\LaTeX\LaTeXFormat;
use Doctrine\RST\NodeFactory\DefaultNodeFactory;
use Doctrine\RST\NodeFactory\NodeFactory;
use Doctrine\RST\NodeFactory\NodeInstantiator;
use Doctrine\RST\Nodes\NodeTypes;
use Doctrine\RST\Renderers\NodeRendererFactory;
use Doctrine\RST\Templates\TemplateEngineAdapter;
use Doctrine\RST\Templates\TemplateRenderer;
use Doctrine\RST\Templates\TwigAdapter;
use Doctrine\RST\Templates\TwigTemplateRenderer;
use RuntimeException;
use Twig\Environment as TwigEnvironment;
use function sprintf;
use function sys_get_temp_dir;
class Configuration
{
public const THEME_DEFAULT = 'default';
public const OUTPUT_FORMAT_CONSOLE = 'console';
public const OUTPUT_FORMAT_GITHUB = 'github';
/** @var string */
private $cacheDir;
/** @var string[] */
private $customTemplateDirs = [];
/** @var string */
private $theme = self::THEME_DEFAULT;
/** @var string */
private $baseUrl = '';
/** @var callable|null */
private $baseUrlEnabledCallable;
/** @var bool */
private $abortOnError = true;
/** @var bool */
private $silentOnError = false;
/** @var bool */
private $warningsAsError = false;
/** @psalm-var self::OUTPUT_FORMAT_* */
private $outputFormat = self::OUTPUT_FORMAT_CONSOLE;
/** @var bool */
private $ignoreInvalidReferences = false;
/** @var bool */
private $indentHTML = false;
/** @var int */
private $initialHeaderLevel = 1;
/** @var bool */
private $useCachedMetas = true;
/** @var string */
private $fileExtension = Format::HTML;
/** @var string */
private $sourceFileExtension = 'rst';
/** @var TemplateRenderer */
private $templateRenderer;
/** @var Format[] */
private $formats;
/** @var NodeFactory|null */
private $nodeFactory;
/** @var EventManager */
private $eventManager;
/** @var TemplateEngineAdapter */
private $templateEngineAdapter;
public function __construct()
{
$this->cacheDir = sys_get_temp_dir() . '/doctrine-rst-parser';
$this->eventManager = new EventManager();
$this->templateEngineAdapter = new TwigAdapter($this);
$this->templateRenderer = new TwigTemplateRenderer($this);
$this->formats = [
Format::HTML => new InternalFormat(new HTMLFormat($this->templateRenderer)),
Format::LATEX => new InternalFormat(new LaTeXFormat($this->templateRenderer)),
];
}
public function getCacheDir(): string
{
return $this->cacheDir;
}
public function setCacheDir(string $cacheDir): void
{
$this->cacheDir = $cacheDir;
}
public function getTemplateRenderer(): TemplateRenderer
{
return $this->templateRenderer;
}
public function setTemplateRenderer(TemplateRenderer $templateRenderer): void
{
$this->templateRenderer = $templateRenderer;
}
/** @return mixed|TwigEnvironment */
public function getTemplateEngine()
{
return $this->templateEngineAdapter->getTemplateEngine();
}
/** @return string[] */
public function getCustomTemplateDirs(): array
{
return $this->customTemplateDirs;
}
/** @param string[] $customTemplateDirs */
public function setCustomTemplateDirs(array $customTemplateDirs): void
{
$this->customTemplateDirs = $customTemplateDirs;
}
public function addCustomTemplateDir(string $customTemplateDir): void
{
$this->customTemplateDirs[] = $customTemplateDir;
}
public function getTheme(): string
{
return $this->theme;
}
public function setTheme(string $theme): void
{
$this->theme = $theme;
}
public function getBaseUrl(): string
{
return $this->baseUrl;
}
public function setBaseUrl(string $baseUrl): self
{
$this->baseUrl = $baseUrl;
return $this;
}
public function setBaseUrlEnabledCallable(?callable $baseUrlEnabledCallable): void
{
$this->baseUrlEnabledCallable = $baseUrlEnabledCallable;
}
public function getBaseUrlEnabledCallable(): ?callable
{
return $this->baseUrlEnabledCallable;
}
public function isBaseUrlEnabled(string $path): bool
{
if ($this->baseUrl === '') {
return false;
}
if ($this->baseUrlEnabledCallable !== null) {
$baseUrlEnabledCallable = $this->baseUrlEnabledCallable;
return $baseUrlEnabledCallable($path);
}
return true;
}
public function isAbortOnError(): bool
{
return $this->abortOnError;
}
public function abortOnError(bool $abortOnError): void
{
$this->abortOnError = $abortOnError;
}
public function silentOnError(bool $silentOnError = true): void
{
$this->silentOnError = $silentOnError;
}
public function isSilentOnError(): bool
{
return $this->silentOnError;
}
public function treatWarningsAsError(bool $warningsAsError): void
{
$this->warningsAsError = $warningsAsError;
}
public function isWarningsAsError(): bool
{
return $this->warningsAsError;
}
/** @psalm-return self::OUTPUT_FORMAT_* */
final public function getOutputFormat(): string
{
return $this->outputFormat;
}
/** @psalm-param self::OUTPUT_FORMAT_* $outputFormat */
final public function setOutputFormat(string $outputFormat): void
{
$this->outputFormat = $outputFormat;
}
public function getIgnoreInvalidReferences(): bool
{
return $this->ignoreInvalidReferences;
}
public function setIgnoreInvalidReferences(bool $ignoreInvalidReferences): void
{
$this->ignoreInvalidReferences = $ignoreInvalidReferences;
}
public function setIndentHTML(bool $indentHTML): void
{
$this->indentHTML = $indentHTML;
}
public function getIndentHTML(): bool
{
return $this->indentHTML;
}
public function setInitialHeaderLevel(int $initialHeaderLevel): void
{
$this->initialHeaderLevel = $initialHeaderLevel;
}
public function getInitialHeaderLevel(): int
{
return $this->initialHeaderLevel;
}
public function setUseCachedMetas(bool $useCachedMetas): void
{
$this->useCachedMetas = $useCachedMetas;
}
public function getUseCachedMetas(): bool
{
return $this->useCachedMetas;
}
public function getFileExtension(): string
{
return $this->fileExtension;
}
public function setFileExtension(string $fileExtension): void
{
$this->fileExtension = $fileExtension;
}
public function getNodeFactory(Environment $environment): NodeFactory
{
if ($this->nodeFactory !== null) {
return $this->nodeFactory;
}
return new DefaultNodeFactory(
$this->eventManager,
$this->createNodeInstantiator($environment, NodeTypes::DOCUMENT, Nodes\DocumentNode::class),
$this->createNodeInstantiator($environment, NodeTypes::SPAN, Nodes\SpanNode::class),
$this->createNodeInstantiator($environment, NodeTypes::TOC, Nodes\TocNode::class),
$this->createNodeInstantiator($environment, NodeTypes::TITLE, Nodes\TitleNode::class),
$this->createNodeInstantiator($environment, NodeTypes::SEPARATOR, Nodes\SeparatorNode::class),
$this->createNodeInstantiator($environment, NodeTypes::CODE, Nodes\CodeNode::class),
$this->createNodeInstantiator($environment, NodeTypes::QUOTE, Nodes\QuoteNode::class),
$this->createNodeInstantiator($environment, NodeTypes::PARAGRAPH, Nodes\ParagraphNode::class),
$this->createNodeInstantiator($environment, NodeTypes::ANCHOR, Nodes\AnchorNode::class),
$this->createNodeInstantiator($environment, NodeTypes::LIST, Nodes\ListNode::class),
$this->createNodeInstantiator($environment, NodeTypes::TABLE, Nodes\TableNode::class),
$this->createNodeInstantiator($environment, NodeTypes::DEFINITION_LIST, Nodes\DefinitionListNode::class),
$this->createNodeInstantiator($environment, NodeTypes::WRAPPER, Nodes\WrapperNode::class),
$this->createNodeInstantiator($environment, NodeTypes::FIGURE, Nodes\FigureNode::class),
$this->createNodeInstantiator($environment, NodeTypes::IMAGE, Nodes\ImageNode::class),
$this->createNodeInstantiator($environment, NodeTypes::META, Nodes\MetaNode::class),
$this->createNodeInstantiator($environment, NodeTypes::RAW, Nodes\RawNode::class),
$this->createNodeInstantiator($environment, NodeTypes::DUMMY, Nodes\DummyNode::class),
$this->createNodeInstantiator($environment, NodeTypes::MAIN, Nodes\MainNode::class),
$this->createNodeInstantiator($environment, NodeTypes::BLOCK, Nodes\BlockNode::class),
$this->createNodeInstantiator($environment, NodeTypes::CALLABLE, Nodes\CallableNode::class),
$this->createNodeInstantiator($environment, NodeTypes::SECTION_BEGIN, Nodes\SectionBeginNode::class),
$this->createNodeInstantiator($environment, NodeTypes::SECTION_END, Nodes\SectionEndNode::class)
);
}
public function setNodeFactory(NodeFactory $nodeFactory): void
{
$this->nodeFactory = $nodeFactory;
}
public function setEventManager(EventManager $eventManager): void
{
$this->eventManager = $eventManager;
}
public function getEventManager(): EventManager
{
return $this->eventManager;
}
public function dispatchEvent(string $eventName, ?EventArgs $eventArgs = null): void
{
$this->eventManager->dispatchEvent($eventName, $eventArgs);
}
public function addFormat(Format $format): void
{
$this->formats[$format->getFileExtension()] = $format;
}
public function getFormat(): Format
{
if (! isset($this->formats[$this->fileExtension])) {
throw new RuntimeException(
sprintf('Format %s does not exist.', $this->fileExtension)
);
}
return $this->formats[$this->fileExtension];
}
public function getSourceFileExtension(): string
{
return $this->sourceFileExtension;
}
private function createNodeInstantiator(Environment $environment, string $type, string $nodeClassName): NodeInstantiator
{
return new NodeInstantiator(
$type,
$nodeClassName,
$environment,
$this->getNodeRendererFactory($nodeClassName),
$this->eventManager
);
}
private function getNodeRendererFactory(string $nodeClassName): ?NodeRendererFactory
{
return $this->getFormat()->getNodeRendererFactories()[$nodeClassName] ?? null;
}
}