Update website

This commit is contained in:
Guilhem Lavaux 2024-11-19 08:02:04 +01:00
parent 4413528994
commit 1d90fbf296
6865 changed files with 1091082 additions and 0 deletions

View file

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\HTML\Renderers;
use Doctrine\RST\Nodes\AnchorNode;
use Doctrine\RST\Renderers\NodeRenderer;
use Doctrine\RST\Templates\TemplateRenderer;
final class AnchorNodeRenderer implements NodeRenderer
{
/** @var AnchorNode */
private $anchorNode;
/** @var TemplateRenderer */
private $templateRenderer;
public function __construct(AnchorNode $anchorNode, TemplateRenderer $templateRenderer)
{
$this->anchorNode = $anchorNode;
$this->templateRenderer = $templateRenderer;
}
public function render(): string
{
return $this->templateRenderer->render('anchor.html.twig', [
'anchorNode' => $this->anchorNode,
]);
}
}

View file

@ -0,0 +1,35 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\HTML\Renderers;
use Doctrine\RST\Nodes\CodeNode;
use Doctrine\RST\Renderers\NodeRenderer;
use Doctrine\RST\Templates\TemplateRenderer;
final class CodeNodeRenderer implements NodeRenderer
{
/** @var CodeNode */
private $codeNode;
/** @var TemplateRenderer */
private $templateRenderer;
public function __construct(CodeNode $codeNode, TemplateRenderer $templateRenderer)
{
$this->codeNode = $codeNode;
$this->templateRenderer = $templateRenderer;
}
public function render(): string
{
if ($this->codeNode->isRaw()) {
return $this->codeNode->getValue();
}
return $this->templateRenderer->render('code.html.twig', [
'codeNode' => $this->codeNode,
]);
}
}

View file

@ -0,0 +1,32 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\HTML\Renderers;
use Doctrine\RST\Nodes\DefinitionListNode;
use Doctrine\RST\Renderers\NodeRenderer;
use Doctrine\RST\Templates\TemplateRenderer;
final class DefinitionListNodeRenderer implements NodeRenderer
{
/** @var DefinitionListNode */
private $definitionListNode;
/** @var TemplateRenderer */
private $templateRenderer;
public function __construct(DefinitionListNode $definitionListNode, TemplateRenderer $templateRenderer)
{
$this->definitionListNode = $definitionListNode;
$this->templateRenderer = $templateRenderer;
}
public function render(): string
{
return $this->templateRenderer->render('definition-list.html.twig', [
'definitionListNode' => $this->definitionListNode,
'definitionList' => $this->definitionListNode->getDefinitionList(),
]);
}
}

View file

@ -0,0 +1,57 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\HTML\Renderers;
use Doctrine\RST\Nodes\DocumentNode;
use Doctrine\RST\Renderers\DocumentNodeRenderer as BaseDocumentRender;
use Doctrine\RST\Renderers\FullDocumentNodeRenderer;
use Doctrine\RST\Renderers\NodeRenderer;
use Doctrine\RST\Templates\TemplateRenderer;
use Gajus\Dindent\Indenter;
final class DocumentNodeRenderer implements NodeRenderer, FullDocumentNodeRenderer
{
/** @var DocumentNode */
private $document;
/** @var TemplateRenderer */
private $templateRenderer;
public function __construct(DocumentNode $document, TemplateRenderer $templateRenderer)
{
$this->document = $document;
$this->templateRenderer = $templateRenderer;
}
public function render(): string
{
return (new BaseDocumentRender($this->document))->render();
}
public function renderDocument(): string
{
$headerNodes = '';
foreach ($this->document->getHeaderNodes() as $node) {
$headerNodes .= $node->render() . "\n";
}
$html = $this->templateRenderer->render('document.html.twig', [
'headerNodes' => $headerNodes,
'bodyNodes' => $this->render(),
]);
if ($this->document->getConfiguration()->getIndentHTML()) {
return $this->indentHTML($html);
}
return $html;
}
private function indentHTML(string $html): string
{
return (new Indenter())->indent($html);
}
}

View file

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\HTML\Renderers;
use Doctrine\RST\Nodes\FigureNode;
use Doctrine\RST\Renderers\NodeRenderer;
use Doctrine\RST\Templates\TemplateRenderer;
final class FigureNodeRenderer implements NodeRenderer
{
/** @var FigureNode */
private $figureNode;
/** @var TemplateRenderer */
private $templateRenderer;
public function __construct(FigureNode $figureNode, TemplateRenderer $templateRenderer)
{
$this->figureNode = $figureNode;
$this->templateRenderer = $templateRenderer;
}
public function render(): string
{
return $this->templateRenderer->render('figure.html.twig', [
'figureNode' => $this->figureNode,
]);
}
}

View file

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\HTML\Renderers;
use Doctrine\RST\Nodes\ImageNode;
use Doctrine\RST\Renderers\NodeRenderer;
use Doctrine\RST\Templates\TemplateRenderer;
final class ImageNodeRenderer implements NodeRenderer
{
/** @var ImageNode */
private $imageNode;
/** @var TemplateRenderer */
private $templateRenderer;
public function __construct(ImageNode $imageNode, TemplateRenderer $templateRenderer)
{
$this->imageNode = $imageNode;
$this->templateRenderer = $templateRenderer;
}
public function render(): string
{
return $this->templateRenderer->render('image.html.twig', [
'imageNode' => $this->imageNode,
]);
}
}

View file

@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\HTML\Renderers;
use Doctrine\RST\Nodes\ListNode;
use Doctrine\RST\Renderers\NodeRenderer;
use Doctrine\RST\Templates\TemplateRenderer;
final class ListNodeRenderer implements NodeRenderer
{
/** @var ListNode */
private $listNode;
/** @var TemplateRenderer */
private $templateRenderer;
public function __construct(ListNode $listNode, TemplateRenderer $templateRenderer)
{
$this->listNode = $listNode;
$this->templateRenderer = $templateRenderer;
}
public function render(): string
{
$template = 'bullet-list.html.twig';
if ($this->listNode->isOrdered()) {
$template = 'enumerated-list.html.twig';
}
return $this->templateRenderer->render($template, ['listNode' => $this->listNode]);
}
}

View file

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\HTML\Renderers;
use Doctrine\RST\Nodes\MetaNode;
use Doctrine\RST\Renderers\NodeRenderer;
use Doctrine\RST\Templates\TemplateRenderer;
final class MetaNodeRenderer implements NodeRenderer
{
/** @var MetaNode */
private $metaNode;
/** @var TemplateRenderer */
private $templateRenderer;
public function __construct(MetaNode $metaNode, TemplateRenderer $templateRenderer)
{
$this->metaNode = $metaNode;
$this->templateRenderer = $templateRenderer;
}
public function render(): string
{
return $this->templateRenderer->render('meta.html.twig', [
'metaNode' => $this->metaNode,
]);
}
}

View file

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\HTML\Renderers;
use Doctrine\RST\Nodes\ParagraphNode;
use Doctrine\RST\Renderers\NodeRenderer;
use Doctrine\RST\Templates\TemplateRenderer;
final class ParagraphNodeRenderer implements NodeRenderer
{
/** @var ParagraphNode */
private $paragraphNode;
/** @var TemplateRenderer */
private $templateRenderer;
public function __construct(ParagraphNode $paragraphNode, TemplateRenderer $templateRenderer)
{
$this->paragraphNode = $paragraphNode;
$this->templateRenderer = $templateRenderer;
}
public function render(): string
{
return $this->templateRenderer->render('paragraph.html.twig', [
'paragraphNode' => $this->paragraphNode,
]);
}
}

View file

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\HTML\Renderers;
use Doctrine\RST\Nodes\QuoteNode;
use Doctrine\RST\Renderers\NodeRenderer;
use Doctrine\RST\Templates\TemplateRenderer;
final class QuoteNodeRenderer implements NodeRenderer
{
/** @var QuoteNode */
private $quoteNode;
/** @var TemplateRenderer */
private $templateRenderer;
public function __construct(QuoteNode $quoteNode, TemplateRenderer $templateRenderer)
{
$this->quoteNode = $quoteNode;
$this->templateRenderer = $templateRenderer;
}
public function render(): string
{
return $this->templateRenderer->render('quote.html.twig', [
'quoteNode' => $this->quoteNode,
]);
}
}

View file

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\HTML\Renderers;
use Doctrine\RST\Nodes\SectionBeginNode;
use Doctrine\RST\Renderers\NodeRenderer;
use Doctrine\RST\Templates\TemplateRenderer;
final class SectionBeginNodeRenderer implements NodeRenderer
{
/** @var SectionBeginNode */
private $sectionBeginNode;
/** @var TemplateRenderer */
private $templateRenderer;
public function __construct(SectionBeginNode $sectionBeginNode, TemplateRenderer $templateRenderer)
{
$this->sectionBeginNode = $sectionBeginNode;
$this->templateRenderer = $templateRenderer;
}
public function render(): string
{
return $this->templateRenderer->render('section-begin.html.twig', [
'sectionBeginNode' => $this->sectionBeginNode,
]);
}
}

View file

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\HTML\Renderers;
use Doctrine\RST\Nodes\SectionEndNode;
use Doctrine\RST\Renderers\NodeRenderer;
use Doctrine\RST\Templates\TemplateRenderer;
final class SectionEndNodeRenderer implements NodeRenderer
{
/** @var SectionEndNode */
private $sectionEndNode;
/** @var TemplateRenderer */
private $templateRenderer;
public function __construct(SectionEndNode $sectionEndNode, TemplateRenderer $templateRenderer)
{
$this->sectionEndNode = $sectionEndNode;
$this->templateRenderer = $templateRenderer;
}
public function render(): string
{
return $this->templateRenderer->render('section-end.html.twig', [
'sectionEndNode' => $this->sectionEndNode,
]);
}
}

View file

@ -0,0 +1,24 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\HTML\Renderers;
use Doctrine\RST\Renderers\NodeRenderer;
use Doctrine\RST\Templates\TemplateRenderer;
final class SeparatorNodeRenderer implements NodeRenderer
{
/** @var TemplateRenderer */
private $templateRenderer;
public function __construct(TemplateRenderer $templateRenderer)
{
$this->templateRenderer = $templateRenderer;
}
public function render(): string
{
return $this->templateRenderer->render('separator.html.twig');
}
}

View file

@ -0,0 +1,102 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\HTML\Renderers;
use Doctrine\RST\Environment;
use Doctrine\RST\Nodes\SpanNode;
use Doctrine\RST\References\ResolvedReference;
use Doctrine\RST\Renderers\SpanNodeRenderer as BaseSpanNodeRenderer;
use Doctrine\RST\Templates\TemplateRenderer;
use function htmlspecialchars;
use function trim;
use const ENT_COMPAT;
final class SpanNodeRenderer extends BaseSpanNodeRenderer
{
/** @var TemplateRenderer */
private $templateRenderer;
public function __construct(
Environment $environment,
SpanNode $span,
TemplateRenderer $templateRenderer
) {
parent::__construct($environment, $span);
$this->templateRenderer = $templateRenderer;
}
public function emphasis(string $text): string
{
return $this->templateRenderer->render('emphasis.html.twig', ['text' => $text]);
}
public function strongEmphasis(string $text): string
{
return $this->templateRenderer->render('strong-emphasis.html.twig', ['text' => $text]);
}
public function nbsp(): string
{
return $this->templateRenderer->render('nbsp.html.twig');
}
public function br(): string
{
return $this->templateRenderer->render('br.html.twig');
}
public function literal(string $text): string
{
return $this->templateRenderer->render('literal.html.twig', ['text' => $text]);
}
/** @param mixed[] $attributes */
public function link(?string $url, string $title, array $attributes = []): string
{
$url = (string) $url;
return $this->templateRenderer->render('link.html.twig', [
'url' => $this->environment->generateUrl($url),
'title' => $title,
'attributes' => $attributes,
]);
}
public function escape(string $span): string
{
return htmlspecialchars($span, ENT_COMPAT);
}
/** @param mixed[] $value */
public function reference(ResolvedReference $reference, array $value): string
{
$text = (bool) $value['text'] ? $value['text'] : ($reference->getTitle() ?? '');
$text = trim($text);
// reference to another document
if ($reference->getUrl() !== null) {
$url = $reference->getUrl();
if ($value['anchor'] !== null) {
$url .= '#' . $value['anchor'];
}
$link = $this->link($url, $text, $reference->getAttributes());
// reference to anchor in existing document
} elseif ($value['url'] !== null) {
$url = $this->environment->getLink($value['url']);
$link = $this->link($url, $text, $reference->getAttributes());
} else {
$link = $this->link('#', $text . ' (unresolved reference)', $reference->getAttributes());
}
return $link;
}
}

View file

@ -0,0 +1,54 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\HTML\Renderers;
use Doctrine\RST\Nodes\TableNode;
use Doctrine\RST\Renderers\NodeRenderer;
use Doctrine\RST\Templates\TemplateRenderer;
use LogicException;
use function sprintf;
final class TableNodeRenderer implements NodeRenderer
{
/** @var TableNode */
private $tableNode;
/** @var TemplateRenderer */
private $templateRenderer;
public function __construct(TableNode $tableNode, TemplateRenderer $templateRenderer)
{
$this->tableNode = $tableNode;
$this->templateRenderer = $templateRenderer;
}
public function render(): string
{
$headers = $this->tableNode->getHeaders();
$rows = $this->tableNode->getData();
$tableHeaderRows = [];
foreach ($headers as $k => $isHeader) {
if ($isHeader === false) {
continue;
}
if (! isset($rows[$k])) {
throw new LogicException(sprintf('Row "%d" should be a header, but that row does not exist.', $k));
}
$tableHeaderRows[] = $rows[$k];
unset($rows[$k]);
}
return $this->templateRenderer->render('table.html.twig', [
'tableNode' => $this->tableNode,
'tableHeaderRows' => $tableHeaderRows,
'tableRows' => $rows,
]);
}
}

View file

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\HTML\Renderers;
use Doctrine\RST\Nodes\TitleNode;
use Doctrine\RST\Renderers\NodeRenderer;
use Doctrine\RST\Templates\TemplateRenderer;
final class TitleNodeRenderer implements NodeRenderer
{
/** @var TitleNode */
private $titleNode;
/** @var TemplateRenderer */
private $templateRenderer;
public function __construct(TitleNode $titleNode, TemplateRenderer $templateRenderer)
{
$this->titleNode = $titleNode;
$this->templateRenderer = $templateRenderer;
}
public function render(): string
{
return $this->templateRenderer->render('header-title.html.twig', [
'titleNode' => $this->titleNode,
]);
}
}

View file

@ -0,0 +1,141 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\HTML\Renderers;
use Doctrine\RST\Environment;
use Doctrine\RST\Nodes\TocNode;
use Doctrine\RST\Renderers\NodeRenderer;
use Doctrine\RST\Templates\TemplateRenderer;
use function count;
use function is_array;
final class TocNodeRenderer implements NodeRenderer
{
/** @var Environment */
private $environment;
/** @var TocNode */
private $tocNode;
/** @var TemplateRenderer */
private $templateRenderer;
public function __construct(Environment $environment, TocNode $tocNode, TemplateRenderer $templateRenderer)
{
$this->environment = $environment;
$this->tocNode = $tocNode;
$this->templateRenderer = $templateRenderer;
}
public function render(): string
{
$options = $this->tocNode->getOptions();
if (isset($options['hidden'])) {
return '';
}
$tocItems = [];
foreach ($this->tocNode->getFiles() as $file) {
$reference = $this->environment->resolve('doc', $file);
if ($reference === null) {
continue;
}
$url = $this->environment->relativeUrl($reference->getUrl());
$this->buildLevel($url, $reference->getTitles(), 1, $tocItems, $file);
}
return $this->templateRenderer->render('toc.html.twig', [
'tocNode' => $this->tocNode,
'tocItems' => $tocItems,
]);
}
/**
* @param mixed[]|array $titles
* @param mixed[] $tocItems
*/
private function buildLevel(
?string $url,
array $titles,
int $level,
array &$tocItems,
string $file
): void {
foreach ($titles as $k => $entry) {
[$title, $children] = $entry;
[$title, $target] = $this->generateTarget(
$url,
$title,
// don't add anchor for first h1 in a different file (link directly to the file)
! ($level === 1 && $k === 0 && $file !== '/' . $this->environment->getCurrentFileName())
);
$tocItem = [
'targetId' => $this->generateTargetId($target),
'targetUrl' => $this->environment->generateUrl($target),
'title' => $title,
'level' => $level,
'children' => [],
];
// render children until we hit the configured maxdepth
if (count($children) > 0 && ! $this->tocNode->isTitlesOnly() && $level < $this->tocNode->getDepth()) {
$this->buildLevel($url, $children, $level + 1, $tocItem['children'], $file);
}
$tocItems[] = $tocItem;
}
}
private function generateTargetId(string $target): string
{
return Environment::slugify($target);
}
/**
* @param string[]|string $title
*
* @return mixed[]
*/
private function generateTarget(?string $url, $title, bool $withAnchor): array
{
$target = $url;
if ($withAnchor) {
$anchor = $this->generateAnchorFromTitle($title);
$target .= '#' . $anchor;
}
if (is_array($title)) {
[$title, $target] = $title;
$reference = $this->environment->resolve('doc', $target);
if ($reference === null) {
return [$title, $target];
}
$target = $this->environment->relativeUrl($reference->getUrl());
}
return [$title, $target];
}
/** @param string[]|string $title */
private function generateAnchorFromTitle($title): string
{
$slug = is_array($title)
? $title[1]
: $title;
return Environment::slugify($slug);
}
}