nessworthy/parsedown-extension-manager

以更SOLID的方式扩展Parsedown。

1.0.5 2020-06-13 18:29 UTC

This package is auto-updated.

Last update: 2024-09-14 04:31:33 UTC


README

这是一个小项目,介绍了使用 erusev/parsedown 创建和使用markdown扩展的新方法!

需求

  • PHP 7.1

安装

只需通过composer安装即可!

composer require nessworthy/parsedown-extension-manager

为什么?

在Parsedown中添加每个扩展都必须通过扩展它、在几个地方注册扩展以及在扩展类中添加1-3个新方法来完成。

在以原始方式添加了一些扩展后,我对markdown类变得越来越“垂直”感到有些沮丧。

因此,我决定改变注册扩展的方式。

有什么新变化?

扩展可以表示为两个接口之一的具体类:ParsedownBlockExtension,或ParsedownInlineExtension

然后,每个扩展都单独实例化并使用添加的registerBlockExtensionregisterInlineExtension注册到您的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)方法。

接下来是什么?

  • 更精确的书面测试!(例如,考虑预注册的内联特殊字符和尚未注册的字符)