1
0
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:
Aidan Woods 2019-02-10 18:32:28 +00:00
parent 8fd3c77109
commit 2b79d599fb
No known key found for this signature in database
GPG Key ID: 9A6A8EFAA512BBB9
14 changed files with 58 additions and 53 deletions

View File

@ -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
); );
} }

View File

@ -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;

View File

@ -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;

View File

@ -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) {

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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(),

View File

@ -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;

View File

@ -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;

View File

@ -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;
} }

View File

@ -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;

View File

@ -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);
} }

View File

@ -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);
} }
} }