implement Header entity support

This commit is contained in:
yggverse 2024-06-24 04:46:15 +03:00
parent a68ec839e4
commit 889cca12b5
3 changed files with 150 additions and 0 deletions

View file

@ -32,6 +32,20 @@ class Document
break; break;
// Header
case Parser\Header::match($line):
$this->_entities[] = new Entity\Header(
Parser\Header::getLevel(
$line
),
Parser\Header::getText(
$line
)
);
break;
// Link // Link
case Parser\Link::match($line): case Parser\Link::match($line):

73
src/Entity/Header.php Normal file
View file

@ -0,0 +1,73 @@
<?php
declare(strict_types=1);
namespace Yggverse\Gemtext\Entity;
class Header
{
public const TAG = '#';
private int $_level;
private ?string $_text;
public function __construct(
int $level,
?string $text = null
) {
$this->setLevel(
$level
);
$this->setText(
$text
);
}
public function setLevel(
int $level
): void
{
if (!in_array($level, [1, 2, 3]))
{
throw new \Exception(
_('Incorrect header level')
);
}
$this->_level = $level;
}
public function getLevel(): int
{
return $this->_level;
}
public function setText(
?string $text
): void
{
if ($text)
{
$text = trim(
$text
);
}
$this->_text = $text;
}
public function getText(): ?string
{
return $this->_text;
}
public function toString(): string
{
return str_repeat(
self::TAG,
$this->_level
) . $this->_text;
}
}

63
src/Parser/Header.php Normal file
View file

@ -0,0 +1,63 @@
<?php
declare(strict_types=1);
namespace Yggverse\Gemtext\Parser;
class Header
{
public static function match(
string $line,
array &$matches = []
): bool
{
return (bool) preg_match(
'/^(?<level>#{1,3})(?<text>.*)$/m',
$line,
$matches
);
}
public static function getLevel(
string $line
): ?int
{
$matches = [];
if (self::match($line, $matches))
{
if (isset($matches['level']))
{
return (int) strlen(
$matches['level']
);
}
}
return null;
}
public static function getText(
string $line
): ?string
{
$matches = [];
if (self::match($line, $matches))
{
if (isset($matches['text']))
{
$text = trim(
$matches['text']
);
if ($text)
{
return $text;
}
}
}
return null;
}
}