nessworthy / parsedown-extension-manager
以更SOLID的方式扩展Parsedown。
Requires
- php: >=7.1
- erusev/parsedown: ^1.7
- nessworthy/parsedown-extension: 1.0.1
Requires (Dev)
- phpunit/phpunit: 7.4.4
- roave/security-advisories: dev-master
README
这是一个小项目,介绍了使用 erusev/parsedown 创建和使用markdown扩展的新方法!
需求
- PHP 7.1
安装
只需通过composer安装即可!
composer require nessworthy/parsedown-extension-manager
为什么?
在Parsedown中添加每个扩展都必须通过扩展它、在几个地方注册扩展以及在扩展类中添加1-3个新方法来完成。
在以原始方式添加了一些扩展后,我对markdown类变得越来越“垂直”感到有些沮丧。
因此,我决定改变注册扩展的方式。
有什么新变化?
扩展可以表示为两个接口之一的具体类:ParsedownBlockExtension
,或ParsedownInlineExtension
。
然后,每个扩展都单独实例化并使用添加的registerBlockExtension
或registerInlineExtension
注册到您的Nessworthy\ParsedownExtensionManager\Parsedown
实例中,并将您的扩展传递过去。
Parsedown将以与它通常使用扩展相同的方式使用您的扩展,但每个扩展都是隔离的和可单独扩展的!
使用示例
步骤1:创建您的扩展!
扩展可以实现 \Nessworthy\ParsedownExtensionManager\ParsedownInlineExtension
或 \Nessworthy\ParsedownExtensionManager\ParsedownBlockExtension
。两者都期望方法与您通常添加扩展的方法非常相似。
<?php use \Nessworthy\ParsedownExtensionManager\Parsedown; /** * This is an implementation of the "Add Inline Element" example in the parsedown docs. * @see https://github.com/erusev/parsedown/wiki/Tutorial:-Create-Extensions#add-inline-element */ class ExampleInlineExtension implements \Nessworthy\ParsedownExtensionManager\ParsedownInlineExtension { public function getStartingCharacter(): string { return '{'; } public function run(array $excerpt): ?array { if (preg_match('/^{c:([#\w]\w+)}(.*?){\/c}/', $excerpt['text'], $matches)) { return [ 'extent' => strlen($matches[0]), 'element' => [ 'name' => 'span', 'text' => $matches[2], 'attributes' => [ 'style' => 'color: ' . $matches[1], ], ], ]; } return null; } }
步骤2:实例化并注册您的扩展!
<?php // Create your Parsedown instance. $parsedown = new \Nessworthy\ParsedownExtensionManager\Parsedown(); // Register your Parsedown extensions. $parsedown->registerInlineExtension(new ExampleInlineExtension()); // Use Parsedown as you normally would! $parsedown->parse('Hello {c:#FF00000}world{/c}!'); // "<p>Hello <span style="color: #FF0000">world!</span></p>
有什么限制?
嗯,这是个好问题。告诉我,我会把它放在这里!
Parsedown仍然是基本的,但增加了单独注册扩展的功能。您仍然可以扩展这个类,并以原始方式添加Parsedown扩展!
忽略这一点,这个库利用了__call
并尽可能地做到了这一点。
此外,因为这是另一个Parsedown的扩展,它不会与任何现有的Parsedown扩展一起工作。然而,可以将其他Parsedown扩展简单地转换为与这个库一起工作!
分发扩展
如果您想创建和分享自己的扩展,请随意使用nessworthy\parsedown-extension
元包,它仅包含您需要实现的接口。
扩展文档
在这里我不会详细介绍如何编写Parsedown扩展 - parsedown文档很好地解释了您需要做什么来添加markdown扩展。您方法返回的数据应与您以原始方式扩展markdown时的数据相同。
ParsedownInlineExtension
内联扩展需要两个方法
getStartingCharacter(): string
- 期望您返回一个字符,告诉Parsedown在markdown正文中找到它时开始使用您的扩展。run(array $excerpt): ?array
- 等同于Parsedown的inlineYourExtension($excerpt)
扩展方法。
ParsedownBlockExtension
块扩展始终需要以下四个方法
getStartingCharacter(): string
- 期望您返回一个字符,告诉Parsedown在markdown正文中找到它时开始使用您的扩展。start($line, array $block = null): ?array
- 等同于Parsedown的blockYourExtension($line, $block)
方法。continue($line, array $block): ?array
- 等同于Parsedown的blockYourExtensionContinue($line, $block)
方法。complete(array $block): ?array
- 等同于Parsedown的blockYourExtensionComplete($block)
方法。
接下来是什么?
- 更精确的书面测试!(例如,考虑预注册的内联特殊字符和尚未注册的字符)