mirror of
https://github.com/erusev/parsedown.git
synced 2023-08-10 21:13:06 +03:00
Require State to build and advance blocks
This commit is contained in:
parent
8fd3c77109
commit
2b79d599fb
|
@ -10,13 +10,13 @@ interface Block extends Component
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @param Block|null $Block
|
* @param Block|null $Block
|
||||||
* @param State|null $State
|
|
||||||
* @return static|null
|
* @return static|null
|
||||||
*/
|
*/
|
||||||
public static function build(
|
public static function build(
|
||||||
Context $Context,
|
Context $Context,
|
||||||
Block $Block = null,
|
State $State,
|
||||||
State $State = null
|
Block $Block = null
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,14 +29,14 @@ final class BlockQuote implements ContinuableBlock
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @param Block|null $Block
|
* @param Block|null $Block
|
||||||
* @param State|null $State
|
|
||||||
* @return static|null
|
* @return static|null
|
||||||
*/
|
*/
|
||||||
public static function build(
|
public static function build(
|
||||||
Context $Context,
|
Context $Context,
|
||||||
Block $Block = null,
|
State $State,
|
||||||
State $State = null
|
Block $Block = null
|
||||||
) {
|
) {
|
||||||
if (\preg_match('/^(>[ \t]?+)(.*+)/', $Context->line()->text(), $matches)) {
|
if (\preg_match('/^(>[ \t]?+)(.*+)/', $Context->line()->text(), $matches)) {
|
||||||
$indentOffset = $Context->line()->indentOffset() + $Context->line()->indent() + \strlen($matches[1]);
|
$indentOffset = $Context->line()->indentOffset() + $Context->line()->indent() + \strlen($matches[1]);
|
||||||
|
@ -57,9 +57,10 @@ final class BlockQuote implements ContinuableBlock
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @return self|null
|
* @return self|null
|
||||||
*/
|
*/
|
||||||
public function advance(Context $Context)
|
public function advance(Context $Context, State $State)
|
||||||
{
|
{
|
||||||
if ($Context->previousEmptyLines() > 0) {
|
if ($Context->previousEmptyLines() > 0) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -45,14 +45,14 @@ final class FencedCode implements ContinuableBlock
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @param Block|null $Block
|
* @param Block|null $Block
|
||||||
* @param State|null $State
|
|
||||||
* @return static|null
|
* @return static|null
|
||||||
*/
|
*/
|
||||||
public static function build(
|
public static function build(
|
||||||
Context $Context,
|
Context $Context,
|
||||||
Block $Block = null,
|
State $State,
|
||||||
State $State = null
|
Block $Block = null
|
||||||
) {
|
) {
|
||||||
$marker = \substr($Context->line()->text(), 0, 1);
|
$marker = \substr($Context->line()->text(), 0, 1);
|
||||||
|
|
||||||
|
@ -77,9 +77,10 @@ final class FencedCode implements ContinuableBlock
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @return self|null
|
* @return self|null
|
||||||
*/
|
*/
|
||||||
public function advance(Context $Context)
|
public function advance(Context $Context, State $State)
|
||||||
{
|
{
|
||||||
if ($this->isComplete) {
|
if ($this->isComplete) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -31,21 +31,19 @@ final class Header implements Block
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @param Block|null $Block
|
* @param Block|null $Block
|
||||||
* @param State|null $State
|
|
||||||
* @return static|null
|
* @return static|null
|
||||||
*/
|
*/
|
||||||
public static function build(
|
public static function build(
|
||||||
Context $Context,
|
Context $Context,
|
||||||
Block $Block = null,
|
State $State,
|
||||||
State $State = null
|
Block $Block = null
|
||||||
) {
|
) {
|
||||||
if ($Context->line()->indent() > 3) {
|
if ($Context->line()->indent() > 3) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$State = $State ?: new State;
|
|
||||||
|
|
||||||
$level = \strspn($Context->line()->text(), '#');
|
$level = \strspn($Context->line()->text(), '#');
|
||||||
|
|
||||||
if ($level > 6 || $level < 1) {
|
if ($level > 6 || $level < 1) {
|
||||||
|
|
|
@ -26,14 +26,14 @@ final class IndentedCode implements ContinuableBlock
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @param Block|null $Block
|
* @param Block|null $Block
|
||||||
* @param State|null $State
|
|
||||||
* @return static|null
|
* @return static|null
|
||||||
*/
|
*/
|
||||||
public static function build(
|
public static function build(
|
||||||
Context $Context,
|
Context $Context,
|
||||||
Block $Block = null,
|
State $State,
|
||||||
State $State = null
|
Block $Block = null
|
||||||
) {
|
) {
|
||||||
if (isset($Block) && $Block instanceof Paragraph && ! $Context->previousEmptyLines() > 0) {
|
if (isset($Block) && $Block instanceof Paragraph && ! $Context->previousEmptyLines() > 0) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -48,9 +48,10 @@ final class IndentedCode implements ContinuableBlock
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @return self|null
|
* @return self|null
|
||||||
*/
|
*/
|
||||||
public function advance(Context $Context)
|
public function advance(Context $Context, State $State)
|
||||||
{
|
{
|
||||||
if ($Context->line()->indent() < 4) {
|
if ($Context->line()->indent() < 4) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -55,14 +55,14 @@ final class Markup implements ContinuableBlock
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @param Block|null $Block
|
* @param Block|null $Block
|
||||||
* @param State|null $State
|
|
||||||
* @return static|null
|
* @return static|null
|
||||||
*/
|
*/
|
||||||
public static function build(
|
public static function build(
|
||||||
Context $Context,
|
Context $Context,
|
||||||
Block $Block = null,
|
State $State,
|
||||||
State $State = null
|
Block $Block = null
|
||||||
) {
|
) {
|
||||||
$text = $Context->line()->text();
|
$text = $Context->line()->text();
|
||||||
$rawLine = $Context->line()->rawLine();
|
$rawLine = $Context->line()->rawLine();
|
||||||
|
@ -105,9 +105,10 @@ final class Markup implements ContinuableBlock
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @return self|null
|
* @return self|null
|
||||||
*/
|
*/
|
||||||
public function advance(Context $Context)
|
public function advance(Context $Context, State $State)
|
||||||
{
|
{
|
||||||
$closed = $this->closed;
|
$closed = $this->closed;
|
||||||
$type = $this->type;
|
$type = $this->type;
|
||||||
|
|
|
@ -26,23 +26,24 @@ final class Paragraph implements ContinuableBlock
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @param Block|null $Block
|
* @param Block|null $Block
|
||||||
* @param State|null $State
|
|
||||||
* @return static
|
* @return static
|
||||||
*/
|
*/
|
||||||
public static function build(
|
public static function build(
|
||||||
Context $Context,
|
Context $Context,
|
||||||
Block $Block = null,
|
State $State,
|
||||||
State $State = null
|
Block $Block = null
|
||||||
) {
|
) {
|
||||||
return new self($Context->line()->text());
|
return new self($Context->line()->text());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @return self|null
|
* @return self|null
|
||||||
*/
|
*/
|
||||||
public function advance(Context $Context)
|
public function advance(Context $Context, State $State)
|
||||||
{
|
{
|
||||||
if ($Context->previousEmptyLines() > 0) {
|
if ($Context->previousEmptyLines() > 0) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -22,17 +22,15 @@ final class Reference implements StateUpdatingBlock
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @param Block|null $Block
|
* @param Block|null $Block
|
||||||
* @param State|null $State
|
|
||||||
* @return static|null
|
* @return static|null
|
||||||
*/
|
*/
|
||||||
public static function build(
|
public static function build(
|
||||||
Context $Context,
|
Context $Context,
|
||||||
Block $Block = null,
|
State $State,
|
||||||
State $State = null
|
Block $Block = null
|
||||||
) {
|
) {
|
||||||
$State = $State ?: new State;
|
|
||||||
|
|
||||||
if (\preg_match(
|
if (\preg_match(
|
||||||
'/^\[(.+?)\]:[ ]*+<?(\S+?)>?(?:[ ]+["\'(](.+)["\')])?[ ]*+$/',
|
'/^\[(.+?)\]:[ ]*+<?(\S+?)>?(?:[ ]+["\'(](.+)["\')])?[ ]*+$/',
|
||||||
$Context->line()->text(),
|
$Context->line()->text(),
|
||||||
|
|
|
@ -12,14 +12,14 @@ final class Rule implements Block
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @param Block|null $Block
|
* @param Block|null $Block
|
||||||
* @param State|null $State
|
|
||||||
* @return static|null
|
* @return static|null
|
||||||
*/
|
*/
|
||||||
public static function build(
|
public static function build(
|
||||||
Context $Context,
|
Context $Context,
|
||||||
Block $Block = null,
|
State $State,
|
||||||
State $State = null
|
Block $Block = null
|
||||||
) {
|
) {
|
||||||
if ($Context->line()->indent() > 3) {
|
if ($Context->line()->indent() > 3) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -31,14 +31,14 @@ final class SetextHeader implements AcquisitioningBlock
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @param Block|null $Block
|
* @param Block|null $Block
|
||||||
* @param State|null $State
|
|
||||||
* @return static|null
|
* @return static|null
|
||||||
*/
|
*/
|
||||||
public static function build(
|
public static function build(
|
||||||
Context $Context,
|
Context $Context,
|
||||||
Block $Block = null,
|
State $State,
|
||||||
State $State = null
|
Block $Block = null
|
||||||
) {
|
) {
|
||||||
if (! isset($Block) || ! $Block instanceof Paragraph || $Context->previousEmptyLines() > 0) {
|
if (! isset($Block) || ! $Block instanceof Paragraph || $Context->previousEmptyLines() > 0) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -77,14 +77,14 @@ final class TList implements ContinuableBlock
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @param Block|null $Block
|
* @param Block|null $Block
|
||||||
* @param State|null $State
|
|
||||||
* @return static|null
|
* @return static|null
|
||||||
*/
|
*/
|
||||||
public static function build(
|
public static function build(
|
||||||
Context $Context,
|
Context $Context,
|
||||||
Block $Block = null,
|
State $State,
|
||||||
State $State = null
|
Block $Block = null
|
||||||
) {
|
) {
|
||||||
list($type, $pattern) = (
|
list($type, $pattern) = (
|
||||||
\substr($Context->line()->text(), 0, 1) <= '-'
|
\substr($Context->line()->text(), 0, 1) <= '-'
|
||||||
|
@ -156,9 +156,10 @@ final class TList implements ContinuableBlock
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @return self|null
|
* @return self|null
|
||||||
*/
|
*/
|
||||||
public function advance(Context $Context)
|
public function advance(Context $Context, State $State)
|
||||||
{
|
{
|
||||||
if ($Context->previousEmptyLines() > 0 && \end($this->Lis)->isEmpty()) {
|
if ($Context->previousEmptyLines() > 0 && \end($this->Lis)->isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -218,7 +219,7 @@ final class TList implements ContinuableBlock
|
||||||
$this->markerType,
|
$this->markerType,
|
||||||
$this->markerTypeRegex
|
$this->markerTypeRegex
|
||||||
);
|
);
|
||||||
} elseif ($Context->line()->indent() < $requiredIndent && self::build($Context) !== null) {
|
} elseif ($Context->line()->indent() < $requiredIndent && self::build($Context, $State) !== null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,14 +45,14 @@ final class Table implements AcquisitioningBlock, ContinuableBlock
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @param Block|null $Block
|
* @param Block|null $Block
|
||||||
* @param State|null $State
|
|
||||||
* @return static|null
|
* @return static|null
|
||||||
*/
|
*/
|
||||||
public static function build(
|
public static function build(
|
||||||
Context $Context,
|
Context $Context,
|
||||||
Block $Block = null,
|
State $State,
|
||||||
State $State = null
|
Block $Block = null
|
||||||
) {
|
) {
|
||||||
if (! isset($Block) || ! $Block instanceof Paragraph) {
|
if (! isset($Block) || ! $Block instanceof Paragraph) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -95,9 +95,10 @@ final class Table implements AcquisitioningBlock, ContinuableBlock
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @return self|null
|
* @return self|null
|
||||||
*/
|
*/
|
||||||
public function advance(Context $Context)
|
public function advance(Context $Context, State $State)
|
||||||
{
|
{
|
||||||
if ($Context->previousEmptyLines() > 0) {
|
if ($Context->previousEmptyLines() > 0) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -3,12 +3,14 @@
|
||||||
namespace Erusev\Parsedown\Components;
|
namespace Erusev\Parsedown\Components;
|
||||||
|
|
||||||
use Erusev\Parsedown\Parsing\Context;
|
use Erusev\Parsedown\Parsing\Context;
|
||||||
|
use Erusev\Parsedown\State;
|
||||||
|
|
||||||
interface ContinuableBlock extends Block
|
interface ContinuableBlock extends Block
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @param Context $Context
|
* @param Context $Context
|
||||||
|
* @param State $State
|
||||||
* @return static|null
|
* @return static|null
|
||||||
*/
|
*/
|
||||||
public function advance(Context $Context);
|
public function advance(Context $Context, State $State);
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,7 +90,7 @@ final class Parsedown
|
||||||
&& $CurrentBlock instanceof ContinuableBlock
|
&& $CurrentBlock instanceof ContinuableBlock
|
||||||
&& ! $CurrentBlock instanceof Paragraph
|
&& ! $CurrentBlock instanceof Paragraph
|
||||||
) {
|
) {
|
||||||
$Block = $CurrentBlock->advance($Context);
|
$Block = $CurrentBlock->advance($Context, $State);
|
||||||
|
|
||||||
if (isset($Block)) {
|
if (isset($Block)) {
|
||||||
$CurrentBlock = $Block;
|
$CurrentBlock = $Block;
|
||||||
|
@ -107,7 +107,7 @@ final class Parsedown
|
||||||
);
|
);
|
||||||
|
|
||||||
foreach ($potentialBlockTypes as $blockType) {
|
foreach ($potentialBlockTypes as $blockType) {
|
||||||
$Block = $blockType::build($Context, $CurrentBlock, $State);
|
$Block = $blockType::build($Context, $State, $CurrentBlock);
|
||||||
|
|
||||||
if (isset($Block)) {
|
if (isset($Block)) {
|
||||||
if ($Block instanceof StateUpdatingBlock) {
|
if ($Block instanceof StateUpdatingBlock) {
|
||||||
|
@ -130,7 +130,7 @@ final class Parsedown
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($CurrentBlock) && $CurrentBlock instanceof Paragraph) {
|
if (isset($CurrentBlock) && $CurrentBlock instanceof Paragraph) {
|
||||||
$Block = $CurrentBlock->advance($Context);
|
$Block = $CurrentBlock->advance($Context, $State);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($Block)) {
|
if (isset($Block)) {
|
||||||
|
@ -140,7 +140,7 @@ final class Parsedown
|
||||||
$Blocks[] = $CurrentBlock;
|
$Blocks[] = $CurrentBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
$CurrentBlock = Paragraph::build($Context);
|
$CurrentBlock = Paragraph::build($Context, $State);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user