1
0
mirror of https://github.com/erusev/parsedown.git synced 2025-10-04 02:11:52 +02:00
Files
php-parsedown/src/Components/Inlines/SoftBreak.php

99 lines
2.6 KiB
PHP

<?php
namespace Erusev\Parsedown\Components\Inlines;
use Erusev\Parsedown\AST\Handler;
use Erusev\Parsedown\AST\StateRenderable;
use Erusev\Parsedown\Components\BacktrackingInline;
use Erusev\Parsedown\Components\Inline;
use Erusev\Parsedown\Configurables\Breaks;
use Erusev\Parsedown\Html\Renderables\Container;
use Erusev\Parsedown\Html\Renderables\Element;
use Erusev\Parsedown\Html\Renderables\Text;
use Erusev\Parsedown\Parsing\Excerpt;
use Erusev\Parsedown\State;
final class SoftBreak implements BacktrackingInline
{
use WidthTrait;
/** @var int */
private $position;
/**
* @param int $width
* @param int $position
*/
private function __construct($width, $position)
{
$this->width = $width;
$this->position = $position;
}
/**
* @param Excerpt $Excerpt
* @param State $State
* @return static|null
*/
public static function build(Excerpt $Excerpt, State $State)
{
$marker = \substr($Excerpt->text(), 0, 1);
if ($marker !== "\n") {
return null;
}
$context = $Excerpt->context();
$offset = $Excerpt->offset();
$trimTrailingWhitespaceBefore = \rtrim(\substr($context, 0, $offset), ' ');
$trimLeadingWhitespaceAfter = \ltrim(\substr($context, $offset + 1), ' ');
$contentLenBefore = \strlen($trimTrailingWhitespaceBefore);
$contentLenAfter = \strlen($trimLeadingWhitespaceAfter);
$originalLen = \strlen($context);
$afterWidth = $originalLen - $offset - $contentLenAfter;
return new self($offset + $afterWidth - $contentLenBefore, $contentLenBefore);
}
/**
* Return an integer to declare that the inline should be treated as if it
* started from that position in the excerpt given to static::build.
* Return null to use the excerpt offset value.
* @return int|null
* */
public function modifyStartPositionTo()
{
return $this->position;
}
/**
* @return Handler<Text|Container>
*/
public function stateRenderable()
{
return new Handler(
/** @return Text|Container */
function (State $State) {
if ($State->get(Breaks::class)->isEnabled()) {
return new Container([
Element::selfClosing('br', []),
new Text("\n")
]);
}
return new Text("\n");
}
);
}
/**
* @return Text
*/
public function bestPlaintext()
{
return new Text("\n");
}
}