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,45 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\Directives;
use Doctrine\RST\Directives\Directive;
use Doctrine\RST\Nodes\Node;
use Doctrine\RST\Parser;
use Exception;
use function sprintf;
/**
* Renders an image, example :
*
* .. image:: image.jpg
* :width: 100
* :title: An image
*/
final class Image extends Directive
{
public function getName(): string
{
return 'image';
}
/** @param string[] $options */
public function processNode(
Parser $parser,
string $variable,
string $data,
array $options
): ?Node {
$environment = $parser->getEnvironment();
$url = $environment->relativeUrl($data);
if ($url === null) {
throw new Exception(sprintf('Could not build relative url for %s', $data));
}
return $parser->getNodeFactory()->createImageNode($url, $options);
}
}

View file

@ -0,0 +1,30 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\Directives;
use Doctrine\RST\Directives\Directive;
use Doctrine\RST\Nodes\Node;
use Doctrine\RST\Parser;
/**
* Marks the document as LaTeX main
*/
final class LaTeXMain extends Directive
{
public function getName(): string
{
return 'latex-main';
}
/** @param string[] $options */
public function processNode(
Parser $parser,
string $variable,
string $data,
array $options
): ?Node {
return $parser->getNodeFactory()->createMainNode();
}
}

View file

@ -0,0 +1,48 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\Directives;
use Doctrine\RST\Directives\Directive;
use Doctrine\RST\Nodes\Node;
use Doctrine\RST\Parser;
/**
* Add a meta information:
*
* .. meta::
* :key: value
*/
final class Meta extends Directive
{
public function getName(): string
{
return 'meta';
}
/** @param string[] $options */
public function process(
Parser $parser,
?Node $node,
string $variable,
string $data,
array $options
): void {
$document = $parser->getDocument();
$nodeFactory = $parser->getNodeFactory();
foreach ($options as $key => $value) {
$meta = $nodeFactory->createMetaNode($key, $value);
$document->addHeaderNode($meta);
}
if ($node === null) {
return;
}
$document->addNode($node);
}
}

View file

@ -0,0 +1,32 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\Directives;
use Doctrine\RST\Directives\Directive;
use Doctrine\RST\Nodes\Node;
use Doctrine\RST\Parser;
/**
* Adds a stylesheet to a document, example:
*
* .. stylesheet:: style.css
*/
final class Stylesheet extends Directive
{
public function getName(): string
{
return 'stylesheet';
}
/** @param string[] $options */
public function process(
Parser $parser,
?Node $node,
string $variable,
string $data,
array $options
): void {
}
}

View file

@ -0,0 +1,43 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\Directives;
use Doctrine\RST\Directives\Directive;
use Doctrine\RST\Nodes\Node;
use Doctrine\RST\Parser;
/**
* Add a meta title to the document
*
* .. title:: Page title
*/
final class Title extends Directive
{
public function getName(): string
{
return 'title';
}
/** @param string[] $options */
public function process(
Parser $parser,
?Node $node,
string $variable,
string $data,
array $options
): void {
$document = $parser->getDocument();
$document->addHeaderNode(
$parser->getNodeFactory()->createRawNode('\title{' . $data . '}')
);
if ($node === null) {
return;
}
$document->addNode($node);
}
}

View file

@ -0,0 +1,32 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\Directives;
use Doctrine\RST\Directives\Directive;
use Doctrine\RST\Parser;
use function trim;
/**
* Sets the document URL
*/
final class Url extends Directive
{
public function getName(): string
{
return 'url';
}
/** @param string[] $options */
public function processAction(
Parser $parser,
string $variable,
string $data,
array $options
): void {
$environment = $parser->getEnvironment();
$environment->setUrl(trim($data));
}
}

View file

@ -0,0 +1,39 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\Directives;
use Doctrine\RST\Directives\SubDirective;
use Doctrine\RST\Nodes\Node;
use Doctrine\RST\Parser;
/**
* Wraps a sub document in a div with a given class
*/
final class Wrap extends SubDirective
{
/** @var string */
private $class;
public function __construct(string $class)
{
$this->class = $class;
}
public function getName(): string
{
return $this->class;
}
/** @param string[] $options */
public function processSub(
Parser $parser,
?Node $document,
string $variable,
string $data,
array $options
): ?Node {
return $document;
}
}

View file

@ -0,0 +1,162 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX;
use Doctrine\RST\Directives\Directive;
use Doctrine\RST\Formats\Format;
use Doctrine\RST\LaTeX;
use Doctrine\RST\Nodes;
use Doctrine\RST\Renderers;
use Doctrine\RST\Renderers\CallableNodeRendererFactory;
use Doctrine\RST\Renderers\NodeRendererFactory;
use Doctrine\RST\Templates\TemplateRenderer;
final class LaTeXFormat implements Format
{
/** @var TemplateRenderer */
private $templateRenderer;
public function __construct(TemplateRenderer $templateRenderer)
{
$this->templateRenderer = $templateRenderer;
}
public function getFileExtension(): string
{
return Format::LATEX;
}
/** @return Directive[] */
public function getDirectives(): array
{
return [
new LaTeX\Directives\LaTeXMain(),
new LaTeX\Directives\Image(),
new LaTeX\Directives\Meta(),
new LaTeX\Directives\Stylesheet(),
new LaTeX\Directives\Title(),
new LaTeX\Directives\Url(),
new LaTeX\Directives\Wrap('note'),
];
}
/** @return NodeRendererFactory[] */
public function getNodeRendererFactories(): array
{
return [
Nodes\AnchorNode::class => new CallableNodeRendererFactory(
function (Nodes\AnchorNode $node): LaTeX\Renderers\AnchorNodeRenderer {
return new LaTeX\Renderers\AnchorNodeRenderer(
$node,
$this->templateRenderer
);
}
),
Nodes\CodeNode::class => new CallableNodeRendererFactory(
function (Nodes\CodeNode $node): LaTeX\Renderers\CodeNodeRenderer {
return new LaTeX\Renderers\CodeNodeRenderer(
$node,
$this->templateRenderer
);
}
),
Nodes\ImageNode::class => new CallableNodeRendererFactory(
function (Nodes\ImageNode $node): LaTeX\Renderers\ImageNodeRenderer {
return new LaTeX\Renderers\ImageNodeRenderer(
$node,
$this->templateRenderer
);
}
),
Nodes\ListNode::class => new CallableNodeRendererFactory(
function (Nodes\ListNode $node): LaTeX\Renderers\ListNodeRenderer {
return new LaTeX\Renderers\ListNodeRenderer(
$node,
$this->templateRenderer
);
}
),
Nodes\MetaNode::class => new CallableNodeRendererFactory(
function (Nodes\MetaNode $node): LaTeX\Renderers\MetaNodeRenderer {
return new LaTeX\Renderers\MetaNodeRenderer(
$node,
$this->templateRenderer
);
}
),
Nodes\ParagraphNode::class => new CallableNodeRendererFactory(
function (Nodes\ParagraphNode $node): LaTeX\Renderers\ParagraphNodeRenderer {
return new LaTeX\Renderers\ParagraphNodeRenderer(
$node,
$this->templateRenderer
);
}
),
Nodes\QuoteNode::class => new CallableNodeRendererFactory(
function (Nodes\QuoteNode $node): LaTeX\Renderers\QuoteNodeRenderer {
return new LaTeX\Renderers\QuoteNodeRenderer(
$node,
$this->templateRenderer
);
}
),
Nodes\SeparatorNode::class => new CallableNodeRendererFactory(
function (Nodes\SeparatorNode $node): LaTeX\Renderers\SeparatorNodeRenderer {
return new LaTeX\Renderers\SeparatorNodeRenderer(
$this->templateRenderer
);
}
),
Nodes\TableNode::class => new CallableNodeRendererFactory(
static function (Nodes\TableNode $node): LaTeX\Renderers\TableNodeRenderer {
return new LaTeX\Renderers\TableNodeRenderer(
$node
);
}
),
Nodes\TitleNode::class => new CallableNodeRendererFactory(
function (Nodes\TitleNode $node): LaTeX\Renderers\TitleNodeRenderer {
return new LaTeX\Renderers\TitleNodeRenderer(
$node,
$this->templateRenderer
);
}
),
Nodes\TocNode::class => new CallableNodeRendererFactory(
function (Nodes\TocNode $node): LaTeX\Renderers\TocNodeRenderer {
return new LaTeX\Renderers\TocNodeRenderer(
$node->getEnvironment(),
$node,
$this->templateRenderer
);
}
),
Nodes\DocumentNode::class => new CallableNodeRendererFactory(
function (Nodes\DocumentNode $node): LaTeX\Renderers\DocumentNodeRenderer {
return new LaTeX\Renderers\DocumentNodeRenderer(
$node,
$this->templateRenderer
);
}
),
Nodes\SpanNode::class => new CallableNodeRendererFactory(
function (Nodes\SpanNode $node): LaTeX\Renderers\SpanNodeRenderer {
return new LaTeX\Renderers\SpanNodeRenderer(
$node->getEnvironment(),
$node,
$this->templateRenderer
);
}
),
Nodes\CallableNode::class => new CallableNodeRendererFactory(
static function (Nodes\CallableNode $node): Renderers\CallableNodeRenderer {
return new Renderers\CallableNodeRenderer(
$node
);
}
),
];
}
}

View file

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\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.tex.twig', [
'anchorNode' => $this->anchorNode,
]);
}
}

View file

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\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
{
return $this->templateRenderer->render('code.tex.twig', [
'codeNode' => $this->codeNode,
]);
}
}

View file

@ -0,0 +1,50 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\Renderers;
use Doctrine\RST\Nodes\DocumentNode;
use Doctrine\RST\Nodes\MainNode;
use Doctrine\RST\Renderers\DocumentNodeRenderer as BaseDocumentRender;
use Doctrine\RST\Renderers\FullDocumentNodeRenderer;
use Doctrine\RST\Renderers\NodeRenderer;
use Doctrine\RST\Templates\TemplateRenderer;
use function count;
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
{
return $this->templateRenderer->render('document.tex.twig', [
'isMain' => $this->isMain(),
'document' => $this->document,
'body' => $this->render(),
]);
}
private function isMain(): bool
{
return count($this->document->getNodes(static function ($node): bool {
return $node instanceof MainNode;
})) !== 0;
}
}

View file

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\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.tex.twig', [
'imageNode' => $this->imageNode,
]);
}
}

View file

@ -0,0 +1,15 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\Renderers;
use Doctrine\RST\Renderers\NodeRenderer;
final class LaTexMainNodeRenderer implements NodeRenderer
{
public function render(): string
{
return '';
}
}

View file

@ -0,0 +1,36 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\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.tex.twig';
if ($this->listNode->isOrdered()) {
$template = 'enumerated-list.tex.twig';
}
return $this->templateRenderer->render($template, [
'listNode' => $this->listNode,
]);
}
}

View file

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\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.tex.twig', [
'metaNode' => $this->metaNode,
]);
}
}

View file

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\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.tex.twig', [
'paragraphNode' => $this->paragraphNode,
]);
}
}

View file

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\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.tex.twig', [
'quoteNode' => $this->quoteNode,
]);
}
}

View file

@ -0,0 +1,24 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\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.tex.twig');
}
}

View file

@ -0,0 +1,103 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\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 is_string;
use function substr;
use function trim;
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.tex.twig', ['text' => $text]);
}
public function strongEmphasis(string $text): string
{
return $this->templateRenderer->render('strong-emphasis.tex.twig', ['text' => $text]);
}
public function nbsp(): string
{
return $this->templateRenderer->render('nbsp.tex.twig');
}
public function br(): string
{
return $this->templateRenderer->render('br.tex.twig');
}
public function literal(string $text): string
{
return $this->templateRenderer->render('literal.tex.twig', ['text' => $text]);
}
/** @param mixed[] $attributes */
public function link(?string $url, string $title, array $attributes = []): string
{
$type = 'href';
if (is_string($url) && $url !== '' && $url[0] === '#') {
$type = 'ref';
$url = substr($url, 1);
$url = $url !== '' ? '#' . $url : '';
$url = $this->environment->getUrl() . $url;
}
return $this->templateRenderer->render('link.tex.twig', [
'type' => $type,
'url' => $url,
'title' => $title,
'attributes' => $attributes,
]);
}
public function escape(string $span): string
{
return $span;
}
/** @param mixed[] $value */
public function reference(ResolvedReference $reference, array $value): string
{
$text = (bool) $value['text'] ? $value['text'] : $reference->getTitle();
$url = $reference->getUrl();
if ($value['anchor'] !== '') {
$url .= $value['anchor'];
}
if ($text === null) {
$text = '';
}
if ($url === null) {
$url = '';
}
return $this->link($url, trim($text));
}
}

View file

@ -0,0 +1,57 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\Renderers;
use Doctrine\RST\Nodes\TableNode;
use Doctrine\RST\Renderers\NodeRenderer;
use function count;
use function implode;
use function max;
final class TableNodeRenderer implements NodeRenderer
{
/** @var TableNode */
private $tableNode;
public function __construct(TableNode $tableNode)
{
$this->tableNode = $tableNode;
}
public function render(): string
{
$cols = 0;
$rows = [];
foreach ($this->tableNode->getData() as $row) {
$rowTex = '';
$cols = max($cols, count($row->getColumns()));
foreach ($row->getColumns() as $n => $col) {
$rowTex .= $col->render();
if ((int) $n + 1 >= count($row->getColumns())) {
continue;
}
$rowTex .= ' & ';
}
$rowTex .= ' \\\\' . "\n";
$rows[] = $rowTex;
}
$aligns = [];
for ($i = 0; $i < $cols; $i++) {
$aligns[] = 'l';
}
$aligns = '|' . implode('|', $aligns) . '|';
$rows = "\\hline\n" . implode("\\hline\n", $rows) . "\\hline\n";
return "\\begin{tabular}{" . $aligns . "}\n" . $rows . "\n\\end{tabular}\n";
}
}

View file

@ -0,0 +1,42 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\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
{
$type = 'chapter';
if ($this->titleNode->getLevel() > 1) {
$type = 'section';
for ($i = 2; $i < $this->titleNode->getLevel(); $i++) {
$type = 'sub' . $type;
}
}
return $this->templateRenderer->render('title.tex.twig', [
'type' => $type,
'titleNode' => $this->titleNode,
]);
}
}

View file

@ -0,0 +1,51 @@
<?php
declare(strict_types=1);
namespace Doctrine\RST\LaTeX\Renderers;
use Doctrine\RST\Environment;
use Doctrine\RST\Nodes\TocNode;
use Doctrine\RST\Renderers\NodeRenderer;
use Doctrine\RST\Templates\TemplateRenderer;
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
{
$tocItems = [];
foreach ($this->tocNode->getFiles() as $file) {
$reference = $this->environment->resolve('doc', $file);
if ($reference === null) {
continue;
}
$url = $this->environment->relativeUrl($reference->getUrl());
$tocItems[] = ['url' => $url];
}
return $this->templateRenderer->render('toc.tex.twig', [
'tocNode' => $this->tocNode,
'tocItems' => $tocItems,
]);
}
}