Primo Committ
This commit is contained in:
61
vendor/league/commonmark/src/Extension/Footnote/Event/AnonymousFootnotesListener.php
vendored
Normal file
61
vendor/league/commonmark/src/Extension/Footnote/Event/AnonymousFootnotesListener.php
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the league/commonmark package.
|
||||
*
|
||||
* (c) Colin O'Dell <colinodell@gmail.com>
|
||||
* (c) Rezo Zero / Ambroise Maupate
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace League\CommonMark\Extension\Footnote\Event;
|
||||
|
||||
use League\CommonMark\Block\Element\Paragraph;
|
||||
use League\CommonMark\Event\DocumentParsedEvent;
|
||||
use League\CommonMark\Extension\Footnote\Node\Footnote;
|
||||
use League\CommonMark\Extension\Footnote\Node\FootnoteBackref;
|
||||
use League\CommonMark\Extension\Footnote\Node\FootnoteRef;
|
||||
use League\CommonMark\Inline\Element\Text;
|
||||
use League\CommonMark\Reference\Reference;
|
||||
use League\CommonMark\Util\ConfigurationAwareInterface;
|
||||
use League\CommonMark\Util\ConfigurationInterface;
|
||||
|
||||
final class AnonymousFootnotesListener implements ConfigurationAwareInterface
|
||||
{
|
||||
/** @var ConfigurationInterface */
|
||||
private $config;
|
||||
|
||||
public function onDocumentParsed(DocumentParsedEvent $event): void
|
||||
{
|
||||
$document = $event->getDocument();
|
||||
$walker = $document->walker();
|
||||
|
||||
while ($event = $walker->next()) {
|
||||
$node = $event->getNode();
|
||||
if ($node instanceof FootnoteRef && $event->isEntering() && null !== $text = $node->getContent()) {
|
||||
// Anonymous footnote needs to create a footnote from its content
|
||||
$existingReference = $node->getReference();
|
||||
$reference = new Reference(
|
||||
$existingReference->getLabel(),
|
||||
'#' . $this->config->get('footnote/ref_id_prefix', 'fnref:') . $existingReference->getLabel(),
|
||||
$existingReference->getTitle()
|
||||
);
|
||||
$footnote = new Footnote($reference);
|
||||
$footnote->addBackref(new FootnoteBackref($reference));
|
||||
$paragraph = new Paragraph();
|
||||
$paragraph->appendChild(new Text($text));
|
||||
$footnote->appendChild($paragraph);
|
||||
$document->appendChild($footnote);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function setConfiguration(ConfigurationInterface $config): void
|
||||
{
|
||||
$this->config = $config;
|
||||
}
|
||||
}
|
||||
100
vendor/league/commonmark/src/Extension/Footnote/Event/GatherFootnotesListener.php
vendored
Normal file
100
vendor/league/commonmark/src/Extension/Footnote/Event/GatherFootnotesListener.php
vendored
Normal file
@@ -0,0 +1,100 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the league/commonmark package.
|
||||
*
|
||||
* (c) Colin O'Dell <colinodell@gmail.com>
|
||||
* (c) Rezo Zero / Ambroise Maupate
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace League\CommonMark\Extension\Footnote\Event;
|
||||
|
||||
use League\CommonMark\Block\Element\Document;
|
||||
use League\CommonMark\Event\DocumentParsedEvent;
|
||||
use League\CommonMark\Extension\Footnote\Node\Footnote;
|
||||
use League\CommonMark\Extension\Footnote\Node\FootnoteBackref;
|
||||
use League\CommonMark\Extension\Footnote\Node\FootnoteContainer;
|
||||
use League\CommonMark\Reference\Reference;
|
||||
use League\CommonMark\Util\ConfigurationAwareInterface;
|
||||
use League\CommonMark\Util\ConfigurationInterface;
|
||||
|
||||
final class GatherFootnotesListener implements ConfigurationAwareInterface
|
||||
{
|
||||
/** @var ConfigurationInterface */
|
||||
private $config;
|
||||
|
||||
public function onDocumentParsed(DocumentParsedEvent $event): void
|
||||
{
|
||||
$document = $event->getDocument();
|
||||
$walker = $document->walker();
|
||||
|
||||
$footnotes = [];
|
||||
while ($event = $walker->next()) {
|
||||
if (!$event->isEntering()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$node = $event->getNode();
|
||||
if (!$node instanceof Footnote) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Look for existing reference with footnote label
|
||||
$ref = $document->getReferenceMap()->getReference($node->getReference()->getLabel());
|
||||
if ($ref !== null) {
|
||||
// Use numeric title to get footnotes order
|
||||
$footnotes[\intval($ref->getTitle())] = $node;
|
||||
} else {
|
||||
// Footnote call is missing, append footnote at the end
|
||||
$footnotes[INF] = $node;
|
||||
}
|
||||
|
||||
/*
|
||||
* Look for all footnote refs pointing to this footnote
|
||||
* and create each footnote backrefs.
|
||||
*/
|
||||
$backrefs = $document->getData(
|
||||
'#' . $this->config->get('footnote/footnote_id_prefix', 'fn:') . $node->getReference()->getDestination(),
|
||||
[]
|
||||
);
|
||||
/** @var Reference $backref */
|
||||
foreach ($backrefs as $backref) {
|
||||
$node->addBackref(new FootnoteBackref(new Reference(
|
||||
$backref->getLabel(),
|
||||
'#' . $this->config->get('footnote/ref_id_prefix', 'fnref:') . $backref->getLabel(),
|
||||
$backref->getTitle()
|
||||
)));
|
||||
}
|
||||
}
|
||||
|
||||
// Only add a footnote container if there are any
|
||||
if (\count($footnotes) === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
$container = $this->getFootnotesContainer($document);
|
||||
|
||||
\ksort($footnotes);
|
||||
foreach ($footnotes as $footnote) {
|
||||
$container->appendChild($footnote);
|
||||
}
|
||||
}
|
||||
|
||||
private function getFootnotesContainer(Document $document): FootnoteContainer
|
||||
{
|
||||
$footnoteContainer = new FootnoteContainer();
|
||||
$document->appendChild($footnoteContainer);
|
||||
|
||||
return $footnoteContainer;
|
||||
}
|
||||
|
||||
public function setConfiguration(ConfigurationInterface $config): void
|
||||
{
|
||||
$this->config = $config;
|
||||
}
|
||||
}
|
||||
86
vendor/league/commonmark/src/Extension/Footnote/Event/NumberFootnotesListener.php
vendored
Normal file
86
vendor/league/commonmark/src/Extension/Footnote/Event/NumberFootnotesListener.php
vendored
Normal file
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the league/commonmark package.
|
||||
*
|
||||
* (c) Colin O'Dell <colinodell@gmail.com>
|
||||
* (c) Rezo Zero / Ambroise Maupate
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace League\CommonMark\Extension\Footnote\Event;
|
||||
|
||||
use League\CommonMark\Event\DocumentParsedEvent;
|
||||
use League\CommonMark\Extension\Footnote\Node\FootnoteRef;
|
||||
use League\CommonMark\Reference\Reference;
|
||||
|
||||
final class NumberFootnotesListener
|
||||
{
|
||||
public function onDocumentParsed(DocumentParsedEvent $event): void
|
||||
{
|
||||
$document = $event->getDocument();
|
||||
$walker = $document->walker();
|
||||
$nextCounter = 1;
|
||||
$usedLabels = [];
|
||||
$usedCounters = [];
|
||||
|
||||
while ($event = $walker->next()) {
|
||||
if (!$event->isEntering()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$node = $event->getNode();
|
||||
|
||||
if (!$node instanceof FootnoteRef) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$existingReference = $node->getReference();
|
||||
$label = $existingReference->getLabel();
|
||||
$counter = $nextCounter;
|
||||
$canIncrementCounter = true;
|
||||
|
||||
if (\array_key_exists($label, $usedLabels)) {
|
||||
/*
|
||||
* Reference is used again, we need to point
|
||||
* to the same footnote. But with a different ID
|
||||
*/
|
||||
$counter = $usedCounters[$label];
|
||||
$label = $label . '__' . ++$usedLabels[$label];
|
||||
$canIncrementCounter = false;
|
||||
}
|
||||
|
||||
// rewrite reference title to use a numeric link
|
||||
$newReference = new Reference(
|
||||
$label,
|
||||
$existingReference->getDestination(),
|
||||
(string) $counter
|
||||
);
|
||||
|
||||
// Override reference with numeric link
|
||||
$node->setReference($newReference);
|
||||
$document->getReferenceMap()->addReference($newReference);
|
||||
|
||||
/*
|
||||
* Store created references in document for
|
||||
* creating FootnoteBackrefs
|
||||
*/
|
||||
if (false === $document->getData($existingReference->getDestination(), false)) {
|
||||
$document->data[$existingReference->getDestination()] = [];
|
||||
}
|
||||
|
||||
$document->data[$existingReference->getDestination()][] = $newReference;
|
||||
|
||||
$usedLabels[$label] = 1;
|
||||
$usedCounters[$label] = $nextCounter;
|
||||
|
||||
if ($canIncrementCounter) {
|
||||
$nextCounter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
53
vendor/league/commonmark/src/Extension/Footnote/FootnoteExtension.php
vendored
Normal file
53
vendor/league/commonmark/src/Extension/Footnote/FootnoteExtension.php
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the league/commonmark package.
|
||||
*
|
||||
* (c) Colin O'Dell <colinodell@gmail.com>
|
||||
* (c) Rezo Zero / Ambroise Maupate
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace League\CommonMark\Extension\Footnote;
|
||||
|
||||
use League\CommonMark\ConfigurableEnvironmentInterface;
|
||||
use League\CommonMark\Event\DocumentParsedEvent;
|
||||
use League\CommonMark\Extension\ExtensionInterface;
|
||||
use League\CommonMark\Extension\Footnote\Event\AnonymousFootnotesListener;
|
||||
use League\CommonMark\Extension\Footnote\Event\GatherFootnotesListener;
|
||||
use League\CommonMark\Extension\Footnote\Event\NumberFootnotesListener;
|
||||
use League\CommonMark\Extension\Footnote\Node\Footnote;
|
||||
use League\CommonMark\Extension\Footnote\Node\FootnoteBackref;
|
||||
use League\CommonMark\Extension\Footnote\Node\FootnoteContainer;
|
||||
use League\CommonMark\Extension\Footnote\Node\FootnoteRef;
|
||||
use League\CommonMark\Extension\Footnote\Parser\AnonymousFootnoteRefParser;
|
||||
use League\CommonMark\Extension\Footnote\Parser\FootnoteParser;
|
||||
use League\CommonMark\Extension\Footnote\Parser\FootnoteRefParser;
|
||||
use League\CommonMark\Extension\Footnote\Renderer\FootnoteBackrefRenderer;
|
||||
use League\CommonMark\Extension\Footnote\Renderer\FootnoteContainerRenderer;
|
||||
use League\CommonMark\Extension\Footnote\Renderer\FootnoteRefRenderer;
|
||||
use League\CommonMark\Extension\Footnote\Renderer\FootnoteRenderer;
|
||||
|
||||
final class FootnoteExtension implements ExtensionInterface
|
||||
{
|
||||
public function register(ConfigurableEnvironmentInterface $environment)
|
||||
{
|
||||
$environment->addBlockParser(new FootnoteParser(), 51);
|
||||
$environment->addInlineParser(new AnonymousFootnoteRefParser(), 35);
|
||||
$environment->addInlineParser(new FootnoteRefParser(), 51);
|
||||
|
||||
$environment->addBlockRenderer(FootnoteContainer::class, new FootnoteContainerRenderer());
|
||||
$environment->addBlockRenderer(Footnote::class, new FootnoteRenderer());
|
||||
|
||||
$environment->addInlineRenderer(FootnoteRef::class, new FootnoteRefRenderer());
|
||||
$environment->addInlineRenderer(FootnoteBackref::class, new FootnoteBackrefRenderer());
|
||||
|
||||
$environment->addEventListener(DocumentParsedEvent::class, [new AnonymousFootnotesListener(), 'onDocumentParsed']);
|
||||
$environment->addEventListener(DocumentParsedEvent::class, [new NumberFootnotesListener(), 'onDocumentParsed']);
|
||||
$environment->addEventListener(DocumentParsedEvent::class, [new GatherFootnotesListener(), 'onDocumentParsed']);
|
||||
}
|
||||
}
|
||||
75
vendor/league/commonmark/src/Extension/Footnote/Node/Footnote.php
vendored
Normal file
75
vendor/league/commonmark/src/Extension/Footnote/Node/Footnote.php
vendored
Normal file
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the league/commonmark package.
|
||||
*
|
||||
* (c) Colin O'Dell <colinodell@gmail.com>
|
||||
* (c) Rezo Zero / Ambroise Maupate
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace League\CommonMark\Extension\Footnote\Node;
|
||||
|
||||
use League\CommonMark\Block\Element\AbstractBlock;
|
||||
use League\CommonMark\Cursor;
|
||||
use League\CommonMark\Reference\ReferenceInterface;
|
||||
|
||||
/**
|
||||
* @method children() AbstractBlock[]
|
||||
*/
|
||||
final class Footnote extends AbstractBlock
|
||||
{
|
||||
/**
|
||||
* @var FootnoteBackref[]
|
||||
*/
|
||||
private $backrefs = [];
|
||||
|
||||
/**
|
||||
* @var ReferenceInterface
|
||||
*/
|
||||
private $reference;
|
||||
|
||||
public function __construct(ReferenceInterface $reference)
|
||||
{
|
||||
$this->reference = $reference;
|
||||
}
|
||||
|
||||
public function canContain(AbstractBlock $block): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function isCode(): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function matchesNextLine(Cursor $cursor): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function getReference(): ReferenceInterface
|
||||
{
|
||||
return $this->reference;
|
||||
}
|
||||
|
||||
public function addBackref(FootnoteBackref $backref): self
|
||||
{
|
||||
$this->backrefs[] = $backref;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return FootnoteBackref[]
|
||||
*/
|
||||
public function getBackrefs(): array
|
||||
{
|
||||
return $this->backrefs;
|
||||
}
|
||||
}
|
||||
37
vendor/league/commonmark/src/Extension/Footnote/Node/FootnoteBackref.php
vendored
Normal file
37
vendor/league/commonmark/src/Extension/Footnote/Node/FootnoteBackref.php
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the league/commonmark package.
|
||||
*
|
||||
* (c) Colin O'Dell <colinodell@gmail.com>
|
||||
* (c) Rezo Zero / Ambroise Maupate
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace League\CommonMark\Extension\Footnote\Node;
|
||||
|
||||
use League\CommonMark\Inline\Element\AbstractInline;
|
||||
use League\CommonMark\Reference\ReferenceInterface;
|
||||
|
||||
/**
|
||||
* Link from the footnote on the bottom of the document back to the reference
|
||||
*/
|
||||
final class FootnoteBackref extends AbstractInline
|
||||
{
|
||||
/** @var ReferenceInterface */
|
||||
private $reference;
|
||||
|
||||
public function __construct(ReferenceInterface $reference)
|
||||
{
|
||||
$this->reference = $reference;
|
||||
}
|
||||
|
||||
public function getReference(): ReferenceInterface
|
||||
{
|
||||
return $this->reference;
|
||||
}
|
||||
}
|
||||
39
vendor/league/commonmark/src/Extension/Footnote/Node/FootnoteContainer.php
vendored
Normal file
39
vendor/league/commonmark/src/Extension/Footnote/Node/FootnoteContainer.php
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the league/commonmark package.
|
||||
*
|
||||
* (c) Colin O'Dell <colinodell@gmail.com>
|
||||
* (c) Rezo Zero / Ambroise Maupate
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace League\CommonMark\Extension\Footnote\Node;
|
||||
|
||||
use League\CommonMark\Block\Element\AbstractBlock;
|
||||
use League\CommonMark\Cursor;
|
||||
|
||||
/**
|
||||
* @method children() AbstractBlock[]
|
||||
*/
|
||||
final class FootnoteContainer extends AbstractBlock
|
||||
{
|
||||
public function canContain(AbstractBlock $block): bool
|
||||
{
|
||||
return $block instanceof Footnote;
|
||||
}
|
||||
|
||||
public function isCode(): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function matchesNextLine(Cursor $cursor): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
56
vendor/league/commonmark/src/Extension/Footnote/Node/FootnoteRef.php
vendored
Normal file
56
vendor/league/commonmark/src/Extension/Footnote/Node/FootnoteRef.php
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the league/commonmark package.
|
||||
*
|
||||
* (c) Colin O'Dell <colinodell@gmail.com>
|
||||
* (c) Rezo Zero / Ambroise Maupate
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace League\CommonMark\Extension\Footnote\Node;
|
||||
|
||||
use League\CommonMark\Inline\Element\AbstractInline;
|
||||
use League\CommonMark\Reference\ReferenceInterface;
|
||||
|
||||
final class FootnoteRef extends AbstractInline
|
||||
{
|
||||
/** @var ReferenceInterface */
|
||||
private $reference;
|
||||
|
||||
/** @var string|null */
|
||||
private $content;
|
||||
|
||||
/**
|
||||
* @param ReferenceInterface $reference
|
||||
* @param string|null $content
|
||||
* @param array<mixed> $data
|
||||
*/
|
||||
public function __construct(ReferenceInterface $reference, ?string $content = null, array $data = [])
|
||||
{
|
||||
$this->reference = $reference;
|
||||
$this->content = $content;
|
||||
$this->data = $data;
|
||||
}
|
||||
|
||||
public function getReference(): ReferenceInterface
|
||||
{
|
||||
return $this->reference;
|
||||
}
|
||||
|
||||
public function setReference(ReferenceInterface $reference): FootnoteRef
|
||||
{
|
||||
$this->reference = $reference;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getContent(): ?string
|
||||
{
|
||||
return $this->content;
|
||||
}
|
||||
}
|
||||
85
vendor/league/commonmark/src/Extension/Footnote/Parser/AnonymousFootnoteRefParser.php
vendored
Normal file
85
vendor/league/commonmark/src/Extension/Footnote/Parser/AnonymousFootnoteRefParser.php
vendored
Normal file
@@ -0,0 +1,85 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the league/commonmark package.
|
||||
*
|
||||
* (c) Colin O'Dell <colinodell@gmail.com>
|
||||
* (c) Rezo Zero / Ambroise Maupate
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace League\CommonMark\Extension\Footnote\Parser;
|
||||
|
||||
use League\CommonMark\Extension\Footnote\Node\FootnoteRef;
|
||||
use League\CommonMark\Inline\Parser\InlineParserInterface;
|
||||
use League\CommonMark\InlineParserContext;
|
||||
use League\CommonMark\Normalizer\SlugNormalizer;
|
||||
use League\CommonMark\Normalizer\TextNormalizerInterface;
|
||||
use League\CommonMark\Reference\Reference;
|
||||
use League\CommonMark\Util\ConfigurationAwareInterface;
|
||||
use League\CommonMark\Util\ConfigurationInterface;
|
||||
|
||||
final class AnonymousFootnoteRefParser implements InlineParserInterface, ConfigurationAwareInterface
|
||||
{
|
||||
/** @var ConfigurationInterface */
|
||||
private $config;
|
||||
|
||||
/** @var TextNormalizerInterface */
|
||||
private $slugNormalizer;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->slugNormalizer = new SlugNormalizer();
|
||||
}
|
||||
|
||||
public function getCharacters(): array
|
||||
{
|
||||
return ['^'];
|
||||
}
|
||||
|
||||
public function parse(InlineParserContext $inlineContext): bool
|
||||
{
|
||||
$container = $inlineContext->getContainer();
|
||||
$cursor = $inlineContext->getCursor();
|
||||
$nextChar = $cursor->peek();
|
||||
if ($nextChar !== '[') {
|
||||
return false;
|
||||
}
|
||||
$state = $cursor->saveState();
|
||||
|
||||
$m = $cursor->match('/\^\[[^\n^\]]+\]/');
|
||||
if ($m !== null) {
|
||||
if (\preg_match('#\^\[([^\]]+)\]#', $m, $matches) > 0) {
|
||||
$reference = $this->createReference($matches[1]);
|
||||
$container->appendChild(new FootnoteRef($reference, $matches[1]));
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
$cursor->restoreState($state);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private function createReference(string $label): Reference
|
||||
{
|
||||
$refLabel = $this->slugNormalizer->normalize($label);
|
||||
$refLabel = \mb_substr($refLabel, 0, 20);
|
||||
|
||||
return new Reference(
|
||||
$refLabel,
|
||||
'#' . $this->config->get('footnote/footnote_id_prefix', 'fn:') . $refLabel,
|
||||
$label
|
||||
);
|
||||
}
|
||||
|
||||
public function setConfiguration(ConfigurationInterface $config): void
|
||||
{
|
||||
$this->config = $config;
|
||||
}
|
||||
}
|
||||
63
vendor/league/commonmark/src/Extension/Footnote/Parser/FootnoteParser.php
vendored
Normal file
63
vendor/league/commonmark/src/Extension/Footnote/Parser/FootnoteParser.php
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the league/commonmark package.
|
||||
*
|
||||
* (c) Colin O'Dell <colinodell@gmail.com>
|
||||
* (c) Rezo Zero / Ambroise Maupate
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace League\CommonMark\Extension\Footnote\Parser;
|
||||
|
||||
use League\CommonMark\Block\Parser\BlockParserInterface;
|
||||
use League\CommonMark\ContextInterface;
|
||||
use League\CommonMark\Cursor;
|
||||
use League\CommonMark\Extension\Footnote\Node\Footnote;
|
||||
use League\CommonMark\Reference\Reference;
|
||||
use League\CommonMark\Util\RegexHelper;
|
||||
|
||||
final class FootnoteParser implements BlockParserInterface
|
||||
{
|
||||
public function parse(ContextInterface $context, Cursor $cursor): bool
|
||||
{
|
||||
if ($cursor->isIndented()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$match = RegexHelper::matchFirst(
|
||||
'/^\[\^([^\n^\]]+)\]\:\s/',
|
||||
$cursor->getLine(),
|
||||
$cursor->getNextNonSpacePosition()
|
||||
);
|
||||
|
||||
if (!$match) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$cursor->advanceToNextNonSpaceOrTab();
|
||||
$cursor->advanceBy(\strlen($match[0]));
|
||||
$str = $cursor->getRemainder();
|
||||
\preg_replace('/^\[\^([^\n^\]]+)\]\:\s/', '', $str);
|
||||
|
||||
if (\preg_match('/^\[\^([^\n^\]]+)\]\:\s/', $match[0], $matches) > 0) {
|
||||
$context->addBlock($this->createFootnote($matches[1]));
|
||||
$context->setBlocksParsed(true);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private function createFootnote(string $label): Footnote
|
||||
{
|
||||
return new Footnote(
|
||||
new Reference($label, $label, $label)
|
||||
);
|
||||
}
|
||||
}
|
||||
72
vendor/league/commonmark/src/Extension/Footnote/Parser/FootnoteRefParser.php
vendored
Normal file
72
vendor/league/commonmark/src/Extension/Footnote/Parser/FootnoteRefParser.php
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the league/commonmark package.
|
||||
*
|
||||
* (c) Colin O'Dell <colinodell@gmail.com>
|
||||
* (c) Rezo Zero / Ambroise Maupate
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace League\CommonMark\Extension\Footnote\Parser;
|
||||
|
||||
use League\CommonMark\Extension\Footnote\Node\FootnoteRef;
|
||||
use League\CommonMark\Inline\Parser\InlineParserInterface;
|
||||
use League\CommonMark\InlineParserContext;
|
||||
use League\CommonMark\Reference\Reference;
|
||||
use League\CommonMark\Util\ConfigurationAwareInterface;
|
||||
use League\CommonMark\Util\ConfigurationInterface;
|
||||
|
||||
final class FootnoteRefParser implements InlineParserInterface, ConfigurationAwareInterface
|
||||
{
|
||||
/** @var ConfigurationInterface */
|
||||
private $config;
|
||||
|
||||
public function getCharacters(): array
|
||||
{
|
||||
return ['['];
|
||||
}
|
||||
|
||||
public function parse(InlineParserContext $inlineContext): bool
|
||||
{
|
||||
$container = $inlineContext->getContainer();
|
||||
$cursor = $inlineContext->getCursor();
|
||||
$nextChar = $cursor->peek();
|
||||
if ($nextChar !== '^') {
|
||||
return false;
|
||||
}
|
||||
|
||||
$state = $cursor->saveState();
|
||||
|
||||
$m = $cursor->match('#\[\^([^\]]+)\]#');
|
||||
if ($m !== null) {
|
||||
if (\preg_match('#\[\^([^\]]+)\]#', $m, $matches) > 0) {
|
||||
$container->appendChild(new FootnoteRef($this->createReference($matches[1])));
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
$cursor->restoreState($state);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private function createReference(string $label): Reference
|
||||
{
|
||||
return new Reference(
|
||||
$label,
|
||||
'#' . $this->config->get('footnote/footnote_id_prefix', 'fn:') . $label,
|
||||
$label
|
||||
);
|
||||
}
|
||||
|
||||
public function setConfiguration(ConfigurationInterface $config): void
|
||||
{
|
||||
$this->config = $config;
|
||||
}
|
||||
}
|
||||
49
vendor/league/commonmark/src/Extension/Footnote/Renderer/FootnoteBackrefRenderer.php
vendored
Normal file
49
vendor/league/commonmark/src/Extension/Footnote/Renderer/FootnoteBackrefRenderer.php
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the league/commonmark package.
|
||||
*
|
||||
* (c) Colin O'Dell <colinodell@gmail.com>
|
||||
* (c) Rezo Zero / Ambroise Maupate
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace League\CommonMark\Extension\Footnote\Renderer;
|
||||
|
||||
use League\CommonMark\ElementRendererInterface;
|
||||
use League\CommonMark\Extension\Footnote\Node\FootnoteBackref;
|
||||
use League\CommonMark\HtmlElement;
|
||||
use League\CommonMark\Inline\Element\AbstractInline;
|
||||
use League\CommonMark\Inline\Renderer\InlineRendererInterface;
|
||||
use League\CommonMark\Util\ConfigurationAwareInterface;
|
||||
use League\CommonMark\Util\ConfigurationInterface;
|
||||
|
||||
final class FootnoteBackrefRenderer implements InlineRendererInterface, ConfigurationAwareInterface
|
||||
{
|
||||
/** @var ConfigurationInterface */
|
||||
private $config;
|
||||
|
||||
public function render(AbstractInline $inline, ElementRendererInterface $htmlRenderer)
|
||||
{
|
||||
if (!($inline instanceof FootnoteBackref)) {
|
||||
throw new \InvalidArgumentException('Incompatible inline type: ' . \get_class($inline));
|
||||
}
|
||||
|
||||
$attrs = $inline->getData('attributes', []);
|
||||
$attrs['class'] = $attrs['class'] ?? $this->config->get('footnote/backref_class', 'footnote-backref');
|
||||
$attrs['rev'] = 'footnote';
|
||||
$attrs['href'] = \mb_strtolower($inline->getReference()->getDestination());
|
||||
$attrs['role'] = 'doc-backlink';
|
||||
|
||||
return ' ' . new HtmlElement('a', $attrs, '↩', true);
|
||||
}
|
||||
|
||||
public function setConfiguration(ConfigurationInterface $configuration)
|
||||
{
|
||||
$this->config = $configuration;
|
||||
}
|
||||
}
|
||||
52
vendor/league/commonmark/src/Extension/Footnote/Renderer/FootnoteContainerRenderer.php
vendored
Normal file
52
vendor/league/commonmark/src/Extension/Footnote/Renderer/FootnoteContainerRenderer.php
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the league/commonmark package.
|
||||
*
|
||||
* (c) Colin O'Dell <colinodell@gmail.com>
|
||||
* (c) Rezo Zero / Ambroise Maupate
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace League\CommonMark\Extension\Footnote\Renderer;
|
||||
|
||||
use League\CommonMark\Block\Element\AbstractBlock;
|
||||
use League\CommonMark\Block\Renderer\BlockRendererInterface;
|
||||
use League\CommonMark\ElementRendererInterface;
|
||||
use League\CommonMark\Extension\Footnote\Node\FootnoteContainer;
|
||||
use League\CommonMark\HtmlElement;
|
||||
use League\CommonMark\Util\ConfigurationAwareInterface;
|
||||
use League\CommonMark\Util\ConfigurationInterface;
|
||||
|
||||
final class FootnoteContainerRenderer implements BlockRendererInterface, ConfigurationAwareInterface
|
||||
{
|
||||
/** @var ConfigurationInterface */
|
||||
private $config;
|
||||
|
||||
public function render(AbstractBlock $block, ElementRendererInterface $htmlRenderer, bool $inTightList = false)
|
||||
{
|
||||
if (!($block instanceof FootnoteContainer)) {
|
||||
throw new \InvalidArgumentException('Incompatible block type: ' . \get_class($block));
|
||||
}
|
||||
|
||||
$attrs = $block->getData('attributes', []);
|
||||
$attrs['class'] = $attrs['class'] ?? $this->config->get('footnote/container_class', 'footnotes');
|
||||
$attrs['role'] = 'doc-endnotes';
|
||||
|
||||
$contents = new HtmlElement('ol', [], $htmlRenderer->renderBlocks($block->children()));
|
||||
if ($this->config->get('footnote/container_add_hr', true)) {
|
||||
$contents = [new HtmlElement('hr', [], null, true), $contents];
|
||||
}
|
||||
|
||||
return new HtmlElement('div', $attrs, $contents);
|
||||
}
|
||||
|
||||
public function setConfiguration(ConfigurationInterface $configuration)
|
||||
{
|
||||
$this->config = $configuration;
|
||||
}
|
||||
}
|
||||
62
vendor/league/commonmark/src/Extension/Footnote/Renderer/FootnoteRefRenderer.php
vendored
Normal file
62
vendor/league/commonmark/src/Extension/Footnote/Renderer/FootnoteRefRenderer.php
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the league/commonmark package.
|
||||
*
|
||||
* (c) Colin O'Dell <colinodell@gmail.com>
|
||||
* (c) Rezo Zero / Ambroise Maupate
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace League\CommonMark\Extension\Footnote\Renderer;
|
||||
|
||||
use League\CommonMark\ElementRendererInterface;
|
||||
use League\CommonMark\Extension\Footnote\Node\FootnoteRef;
|
||||
use League\CommonMark\HtmlElement;
|
||||
use League\CommonMark\Inline\Element\AbstractInline;
|
||||
use League\CommonMark\Inline\Renderer\InlineRendererInterface;
|
||||
use League\CommonMark\Util\ConfigurationAwareInterface;
|
||||
use League\CommonMark\Util\ConfigurationInterface;
|
||||
|
||||
final class FootnoteRefRenderer implements InlineRendererInterface, ConfigurationAwareInterface
|
||||
{
|
||||
/** @var ConfigurationInterface */
|
||||
private $config;
|
||||
|
||||
public function render(AbstractInline $inline, ElementRendererInterface $htmlRenderer)
|
||||
{
|
||||
if (!($inline instanceof FootnoteRef)) {
|
||||
throw new \InvalidArgumentException('Incompatible inline type: ' . \get_class($inline));
|
||||
}
|
||||
|
||||
$attrs = $inline->getData('attributes', []);
|
||||
$class = $attrs['class'] ?? $this->config->get('footnote/ref_class', 'footnote-ref');
|
||||
$idPrefix = $this->config->get('footnote/ref_id_prefix', 'fnref:');
|
||||
|
||||
return new HtmlElement(
|
||||
'sup',
|
||||
[
|
||||
'id' => $idPrefix . \mb_strtolower($inline->getReference()->getLabel()),
|
||||
],
|
||||
new HTMLElement(
|
||||
'a',
|
||||
[
|
||||
'class' => $class,
|
||||
'href' => \mb_strtolower($inline->getReference()->getDestination()),
|
||||
'role' => 'doc-noteref',
|
||||
],
|
||||
$inline->getReference()->getTitle()
|
||||
),
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
public function setConfiguration(ConfigurationInterface $configuration)
|
||||
{
|
||||
$this->config = $configuration;
|
||||
}
|
||||
}
|
||||
64
vendor/league/commonmark/src/Extension/Footnote/Renderer/FootnoteRenderer.php
vendored
Normal file
64
vendor/league/commonmark/src/Extension/Footnote/Renderer/FootnoteRenderer.php
vendored
Normal file
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the league/commonmark package.
|
||||
*
|
||||
* (c) Colin O'Dell <colinodell@gmail.com>
|
||||
* (c) Rezo Zero / Ambroise Maupate
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace League\CommonMark\Extension\Footnote\Renderer;
|
||||
|
||||
use League\CommonMark\Block\Element\AbstractBlock;
|
||||
use League\CommonMark\Block\Renderer\BlockRendererInterface;
|
||||
use League\CommonMark\ElementRendererInterface;
|
||||
use League\CommonMark\Extension\Footnote\Node\Footnote;
|
||||
use League\CommonMark\HtmlElement;
|
||||
use League\CommonMark\Util\ConfigurationAwareInterface;
|
||||
use League\CommonMark\Util\ConfigurationInterface;
|
||||
|
||||
final class FootnoteRenderer implements BlockRendererInterface, ConfigurationAwareInterface
|
||||
{
|
||||
/** @var ConfigurationInterface */
|
||||
private $config;
|
||||
|
||||
/**
|
||||
* @param Footnote $block
|
||||
* @param ElementRendererInterface $htmlRenderer
|
||||
* @param bool $inTightList
|
||||
*
|
||||
* @return HtmlElement
|
||||
*/
|
||||
public function render(AbstractBlock $block, ElementRendererInterface $htmlRenderer, bool $inTightList = false)
|
||||
{
|
||||
if (!($block instanceof Footnote)) {
|
||||
throw new \InvalidArgumentException('Incompatible block type: ' . \get_class($block));
|
||||
}
|
||||
|
||||
$attrs = $block->getData('attributes', []);
|
||||
$attrs['class'] = $attrs['class'] ?? $this->config->get('footnote/footnote_class', 'footnote');
|
||||
$attrs['id'] = $this->config->get('footnote/footnote_id_prefix', 'fn:') . \mb_strtolower($block->getReference()->getLabel());
|
||||
$attrs['role'] = 'doc-endnote';
|
||||
|
||||
foreach ($block->getBackrefs() as $backref) {
|
||||
$block->lastChild()->appendChild($backref);
|
||||
}
|
||||
|
||||
return new HtmlElement(
|
||||
'li',
|
||||
$attrs,
|
||||
$htmlRenderer->renderBlocks($block->children()),
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
public function setConfiguration(ConfigurationInterface $configuration)
|
||||
{
|
||||
$this->config = $configuration;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user