1
0
mirror of https://github.com/erusev/parsedown.git synced 2023-08-10 21:13:06 +03:00

Implement BlockQuote

This commit is contained in:
Aidan Woods 2019-01-20 02:25:04 +00:00
parent 3094329950
commit c50deda690
No known key found for this signature in database
GPG Key ID: 9A6A8EFAA512BBB9
2 changed files with 113 additions and 40 deletions

View File

@ -0,0 +1,113 @@
<?php
namespace Erusev\Parsedown\Components\Blocks;
use Erusev\Parsedown\AST\Handler;
use Erusev\Parsedown\AST\StateRenderable;
use Erusev\Parsedown\Components\Block;
use Erusev\Parsedown\Components\ContinuableBlock;
use Erusev\Parsedown\Html\Renderables\Element;
use Erusev\Parsedown\Parsedown;
use Erusev\Parsedown\Parsing\Context;
use Erusev\Parsedown\Parsing\Line;
use Erusev\Parsedown\Parsing\Lines;
use Erusev\Parsedown\State;
final class BlockQuote implements ContinuableBlock
{
use ContinuableBlockDefaultInterrupt, BlockAcquisition;
/** @var Lines */
private $Lines;
/**
* @param Lines $Lines
*/
public function __construct($Lines)
{
$this->Lines = $Lines;
}
/**
* @param Context $Context
* @param Block|null $Block
* @param State|null $State
* @return static|null
*/
public static function build(
Context $Context,
Block $Block = null,
State $State = null
) {
if (\preg_match('/^(>[ \t]?+)(.*+)/', $Context->line()->text(), $matches)) {
$indentOffset = $Context->line()->indentOffset() + $Context->line()->indent() + \strlen($matches[1]);
$recoveredSpaces = 0;
if (\strlen($matches[1]) === 2 && \substr($matches[1], 1, 1) === "\t") {
$recoveredSpaces = Line::tabShortage(2, $Context->line()->indentOffset() + $Context->line()->indent());
}
return new self(
Lines::fromTextLines(
\str_repeat(' ', $recoveredSpaces) . $matches[2],
$indentOffset
)
);
}
return null;
}
/**
* @param Context $Context
* @return self|null
*/
public function continue(Context $Context)
{
if ($this->interrupted) {
return null;
}
if ($Context->line()->text()[0] === '>' and \preg_match('/^(>[ \t]?+)(.*+)/', $Context->line()->text(), $matches)) {
$indentOffset = $Context->line()->indentOffset() + $Context->line()->indent() + \strlen($matches[1]);
$recoveredSpaces = 0;
if (\strlen($matches[1]) === 2 && \substr($matches[1], 1, 1) === "\t") {
$recoveredSpaces = Line::tabShortage(2, $Context->line()->indentOffset() + $Context->line()->indent());
}
$Lines = $this->Lines->appendingTextLines(
\str_repeat(' ', $recoveredSpaces) . $matches[2],
$indentOffset
);
return new self($Lines);
}
if (! $Context->previousEmptyLines() > 0) {
$indentOffset = $Context->line()->indentOffset() + $Context->line()->indent();
$Lines = $this->Lines->appendingTextLines($Context->line()->text(), $indentOffset);
return new self($Lines);
}
return null;
}
/**
* @return Handler<Element>
*/
public function stateRenderable(Parsedown $Parsedown)
{
return new Handler(
/** @return Element */
function (State $State) use ($Parsedown) {
return new Element(
'blockquote',
[],
$State->applyTo($Parsedown->lines($this->Lines))
);
}
);
}
}

View File

@ -636,46 +636,6 @@ class Parsedown
return $Block;
}
#
# Quote
protected function blockQuote(Context $Context)
{
if (\preg_match('/^>[ ]?+(.*+)/', $Context->line()->text(), $matches)) {
$Block = [
'element' => [
'name' => 'blockquote',
'handler' => [
'function' => 'linesElements',
'argument' => Lines::fromTextLines($matches[1], 0),
'destination' => 'elements',
]
],
];
return $Block;
}
}
protected function blockQuoteContinue(Context $Context, array $Block)
{
if ($Context->previousEmptyLines() > 0) {
return;
}
if ($Context->line()->text()[0] === '>' and \preg_match('/^>[ ]?+(.*+)/', $Context->line()->text(), $matches)) {
$Block['element']['handler']['argument'] = $Block['element']['handler']['argument']->appendingTextLines($matches[1], 0);
return $Block;
}
if (! $Context->previousEmptyLines() > 0) {
$Block['element']['handler']['argument'] = $Block['element']['handler']['argument']->appendingTextLines($Context->line()->text(), 0);
return $Block;
}
}
#
# Rule