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

Allow substitution of blocks and inlines

This commit is contained in:
Aidan Woods 2021-10-15 19:25:47 +01:00
parent 4553515e8e
commit 4af22ec41a
No known key found for this signature in database
GPG Key ID: 9A6A8EFAA512BBB9
4 changed files with 77 additions and 0 deletions

View File

@ -101,6 +101,45 @@ final class BlockTypes implements Configurable
);
}
/**
* @param class-string<Block> $searchBlockType
* @param class-string<Block> $replacementBlockType
*/
public function replacing($searchBlockType, $replacementBlockType): self
{
$replacer = self::makeReplacer($searchBlockType, $replacementBlockType);
return new self(
\array_map($replacer, $this->blockTypes),
$replacer($this->unmarkedBlockTypes)
);
}
/**
* @param class-string<Block> $searchBlockType
* @param class-string<Block> $replacementBlockType
* @return \Closure(list<class-string<Block>>):list<class-string<Block>>
*/
private static function makeReplacer($searchBlockType, $replacementBlockType)
{
/**
* @param list<class-string<Block>> $blockTypes
* @return list<class-string<Block>>
*/
return function ($blockTypes) use ($searchBlockType, $replacementBlockType) {
return \array_map(
/**
* @param class-string<Block> $blockType
* @return class-string<Block>
*/
function ($blockType) use ($searchBlockType, $replacementBlockType) {
return $blockType === $searchBlockType ? $replacementBlockType : $blockType;
},
$blockTypes
);
};
}
/**
* @param string $marker
* @param list<class-string<Block>> $newBlockTypes

View File

@ -68,6 +68,35 @@ final class InlineTypes implements Configurable
return new self($inlineTypes);
}
/**
* @param class-string<Inline> $searchInlineType
* @param class-string<Inline> $replacementInlineType
*/
public function replacing($searchInlineType, $replacementInlineType): self
{
return new self(
\array_map(
/**
* @param list<class-string<Inline>> $inlineTypes
* @return list<class-string<Inline>>
*/
function ($inlineTypes) use ($searchInlineType, $replacementInlineType) {
return \array_map(
/**
* @param class-string<Inline> $inlineType
* @return class-string<Inline>
*/
function ($inlineType) use ($searchInlineType, $replacementInlineType) {
return $inlineType === $searchInlineType ? $replacementInlineType : $inlineType;
},
$inlineTypes
);
},
$this->inlineTypes
)
);
}
/**
* @param string $marker
* @param list<class-string<Inline>> $newInlineTypes

View File

@ -2,6 +2,7 @@
namespace Erusev\Parsedown\Tests\Configurables;
use Erusev\Parsedown\Components\Blocks\FencedCode;
use Erusev\Parsedown\Components\Blocks\IndentedCode;
use Erusev\Parsedown\Components\Blocks\Markup;
use Erusev\Parsedown\Components\Blocks\Rule;
@ -41,5 +42,9 @@ final class BlockTypesTest extends TestCase
$BlockTypes = $BlockTypes->addingUnmarkedLowPrecedence([IndentedCode::class]);
$this->assertSame([Markup::class, IndentedCode::class, Rule::class], $BlockTypes->markedBy('@'));
$this->assertSame([Rule::class, Markup::class, IndentedCode::class], $BlockTypes->unmarked());
$BlockTypes = $BlockTypes->replacing(IndentedCode::class, FencedCode::class);
$this->assertSame([Markup::class, FencedCode::class, Rule::class], $BlockTypes->markedBy('@'));
$this->assertSame([Rule::class, Markup::class, FencedCode::class], $BlockTypes->unmarked());
}
}

View File

@ -5,6 +5,7 @@ namespace Erusev\Parsedown\Tests\Configurables;
use Erusev\Parsedown\Components\Inlines\Code;
use Erusev\Parsedown\Components\Inlines\Emphasis;
use Erusev\Parsedown\Components\Inlines\Link;
use Erusev\Parsedown\Components\Inlines\Url;
use Erusev\Parsedown\Configurables\InlineTypes;
use PHPUnit\Framework\TestCase;
@ -28,5 +29,8 @@ final class InlineTypesTest extends TestCase
$InlineTypes = $InlineTypes->addingLowPrecedence('@', [Link::class]);
$this->assertSame([Code::class, Emphasis::class, Link::class], $InlineTypes->markedBy('@'));
$InlineTypes = $InlineTypes->replacing(Link::class, Url::class);
$this->assertSame([Code::class, Emphasis::class, Url::class], $InlineTypes->markedBy('@'));
}
}