69 lines
1.6 KiB
PHP
69 lines
1.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/*
|
|
* This file is part of the league/commonmark package.
|
|
*
|
|
* (c) Colin O'Dell <colinodell@gmail.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace League\CommonMark\Reference;
|
|
|
|
final class MemoryLimitedReferenceMap implements ReferenceMapInterface
|
|
{
|
|
private ReferenceMapInterface $decorated;
|
|
|
|
private const MINIMUM_SIZE = 100_000;
|
|
|
|
private int $remaining;
|
|
|
|
public function __construct(ReferenceMapInterface $decorated, int $maxSize)
|
|
{
|
|
$this->decorated = $decorated;
|
|
$this->remaining = \max(self::MINIMUM_SIZE, $maxSize);
|
|
}
|
|
|
|
public function add(ReferenceInterface $reference): void
|
|
{
|
|
$this->decorated->add($reference);
|
|
}
|
|
|
|
public function contains(string $label): bool
|
|
{
|
|
return $this->decorated->contains($label);
|
|
}
|
|
|
|
public function get(string $label): ?ReferenceInterface
|
|
{
|
|
$reference = $this->decorated->get($label);
|
|
if ($reference === null) {
|
|
return null;
|
|
}
|
|
|
|
// Check for expansion limit
|
|
$this->remaining -= \strlen($reference->getDestination()) + \strlen($reference->getTitle());
|
|
if ($this->remaining < 0) {
|
|
return null;
|
|
}
|
|
|
|
return $reference;
|
|
}
|
|
|
|
/**
|
|
* @return \Traversable<string, ReferenceInterface>
|
|
*/
|
|
public function getIterator(): \Traversable
|
|
{
|
|
return $this->decorated->getIterator();
|
|
}
|
|
|
|
public function count(): int
|
|
{
|
|
return $this->decorated->count();
|
|
}
|
|
}
|