taufik-nurrohman/markdown-filter

安全替换 Markdown 文档中的文本。

v1.0.4 2024-04-23 13:53 UTC

This package is auto-updated.

Last update: 2024-09-23 15:05:19 UTC


README

index.php

动机

随着 Markdown 的普及,许多人期待看到新的格式化语法被添加。然而,开发 Markdown 解析器的人通常会坚持 John Gruber 解释过的哲学,即 Markdown 格式化语法的目标是使其尽可能易于阅读。其理念是,Markdown 格式的文档应该可以像纯文本一样发布,而不像被标记或格式化指令标记过。

通常,他们会简单地告诉人们,如果他们的愿望过于复杂或不符合 Markdown 的哲学,就使用原始 HTML 语法。Markdown 解析器通常不会禁止人们这样做。

只知道如何使用 PHP 进行搜索和替换文本的人通常会给出一些简单的建议,例如告诉人们直接在 Markdown 文档中使用正则表达式替换文本,这通常会导致人们在错误的地方替换文本,例如替换应该保持原样的代码块中的文本。

此过滤器可用于将 Markdown 文档的部分分离成块和跨度,这样您就只能在您认为安全的某些块和跨度中替换文本。

用法

此转换器可以使用 Composer 安装,但它不需要任何其他依赖项,仅使用 Composer 的自动包含文件的功能。如果您不使用 Composer,应该能够将 index.php 文件直接包含到您的应用程序中,而不会出现任何问题。

使用 Composer

从命令行界面,导航到您的项目文件夹,然后运行此命令

composer require taufik-nurrohman/markdown-filter

在您的应用程序中包含生成的自动加载文件

<?php

use function x\markdown_filter\row as filter_row;
use function x\markdown_filter\rows as filter_rows;

require 'vendor/autoload.php';

$content = file_get_contents('.\path\to\file.md');

$content = filter_rows($content, function ($block, $status) {
    if (0 === $status || 2 === $status) {
        return $block;
    }
    return filter_row($block, function ($chop, $status) {
        if (0 === $status) {
            return $chop;
        }
        // Safely replace `:)` with `😊`
        return strtr($chop, [':)' => '&#128522;']);
    });
});

// You can now convert the Markdown document to HTML using your preferred Markdown converter
echo (new ParsedownExtra)->text($content);

使用文件

在您的应用程序中包含 index.php 文件

<?php

use function x\markdown_filter\row as filter_row;
use function x\markdown_filter\rows as filter_rows;

require 'index.php';

$content = file_get_contents('.\path\to\file.md');

$content = filter_rows($content, function ($block, $status) {
    if (0 === $status || 2 === $status) {
        return $block;
    }
    return filter_row($block, function ($chop, $status) {
        if (0 === $status) {
            return $chop;
        }
        // Safely replace `:)` with `😊`
        return strtr($chop, [':)' => '&#128522;']);
    });
});

// You can now convert the Markdown document to HTML using your preferred Markdown converter
echo (new ParsedownExtra)->text($content);

$status 变量显示文档的某部分是否适合进行任何类型的文本替换。目前,它可以设置为 012。值为 0 表示文档的这一部分通常不适合进行任何类型的文本替换。它通常包含在代码和原始 HTML 片段中。值为 2 表示一个块可以包含其他块,因此最好也跳过它,因为在这种情况下,缩进通常有不同的含义,直到这个过滤器到达该块的内层内容。

本项目的主要目标是介绍 Markdown 的“嵌入”语法,我认为这种语法以前从未讨论过(对于这种类型的语法)。这就是为什么我在测试页面上实现了这个过滤器,作为一种安全替换语法的工具。

Example

您还可以使用此过滤器删除 Markdown 代码语法中未编写的其他 HTML 标签。人们通常在那里编写 HTML 语法来在您的评论部分分享一段代码。

<?php

use function x\markdown_filter\row as filter_row;
use function x\markdown_filter\rows as filter_rows;

if ('POST' === $_SERVER['REQUEST_METHOD'] && isset($_POST['comment']['content'])) {
    $_POST['comment']['content'] = filter_rows($_POST['comment']['content'], function ($block, $status) {
        if (2 === $status) {
            return $block;
        }
        if (0 === $status) {
            $dent = strspn($block, ' ');
            if ($dent >= 4) {
                return $block; // Code block (indent-style)
            }
            $test = substr($block, $dent);
            if (0 === strpos($test, '```') || 0 === strpos($test, '~~~')) {
                return $block; // Code block (fence-style)
            }
            return strip_tags($block);
        }
        return filter_row($block, function ($chop, $status) {
            if (0 === $status) {
                $test = strspn($chop, '`');
                if ($test > 0 && str_repeat('`', $test) === substr($chop, -$test)) {
                    return $chop; // Code span
                }
            }
            return strip_tags($chop);
        });
    });
}

测试

将此存储库克隆到支持 PHP 的 Web 服务器根目录中,然后您可以使用浏览器打开 test.php 文件。

许可证

本库遵循 MIT 许可协议。如果您从本库中获得了经济利益,请考虑 捐赠 💰