2026-01-09 07:13:59 +00:00

102 lines
2.7 KiB
PHP

<?php
declare(strict_types=1);
namespace PrinsFrank\PdfParser\Document\Dictionary\DictionaryParseContext;
use PrinsFrank\PdfParser\Document\Generic\Parsing\InfiniteBuffer;
/** @internal */
class NestingContext {
private string $currentLevel;
/** @var array<string, DictionaryParseContext> */
private array $nestingContext = [];
/** @var array<string, InfiniteBuffer> */
private array $keyBuffer = [];
/** @var array<string, InfiniteBuffer> */
private array $valueBuffer = [];
public function __construct() {
$this->currentLevel = '';
}
public function incrementNesting(): self {
$this->currentLevel = (string) ($this->keyBuffer[$this->currentLevel] ?? (int) $this->currentLevel + 1);
return $this;
}
public function decrementNesting(): self {
array_pop($this->nestingContext);
$this->currentLevel = (string) array_key_last($this->nestingContext);
return $this;
}
public function setContext(DictionaryParseContext $dictionaryParseContext): self {
$this->nestingContext[$this->currentLevel] = $dictionaryParseContext;
return $this;
}
public function getContext(): DictionaryParseContext {
return $this->nestingContext[$this->currentLevel] ?? DictionaryParseContext::ROOT;
}
public function getKeyBuffer(): InfiniteBuffer {
return $this->keyBuffer[$this->currentLevel] ??= new InfiniteBuffer();
}
public function addToKeyBuffer(string $char): self {
$this->getKeyBuffer()->addChar($char);
return $this;
}
public function removeFromKeyBuffer(int $nChars = 1): self {
$this->getKeyBuffer()->removeChar($nChars);
return $this;
}
public function getValueBuffer(): InfiniteBuffer {
return $this->valueBuffer[$this->currentLevel] ??= new InfiniteBuffer();
}
public function addToValueBuffer(string $char): self {
$this->getValueBuffer()->addChar($char);
return $this;
}
public function removeFromValueBuffer(int $nChars = 1): self {
$this->getValueBuffer()->removeChar($nChars);
return $this;
}
/** @return list<string> */
public function getKeysFromRoot(): array {
$keysFromRoot = [];
foreach ($this->keyBuffer as $keyBuffer) {
$keyBufferString = (string) $keyBuffer;
if ($keyBufferString === '') {
continue;
}
$keysFromRoot[] = $keyBufferString;
}
return $keysFromRoot;
}
public function flush(): self {
($this->valueBuffer[$this->currentLevel] ?? null)?->flush();
($this->keyBuffer[$this->currentLevel] ?? null)?->flush();
return $this;
}
}