taufik-nurrohman / markdown-filter
安全替换 Markdown 文档中的文本。
Requires
- php: >=7.1
README
动机
随着 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, [':)' => '😊']); }); }); // 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, [':)' => '😊']); }); }); // You can now convert the Markdown document to HTML using your preferred Markdown converter echo (new ParsedownExtra)->text($content);
$status
变量显示文档的某部分是否适合进行任何类型的文本替换。目前,它可以设置为 0
、1
或 2
。值为 0
表示文档的这一部分通常不适合进行任何类型的文本替换。它通常包含在代码和原始 HTML 片段中。值为 2
表示一个块可以包含其他块,因此最好也跳过它,因为在这种情况下,缩进通常有不同的含义,直到这个过滤器到达该块的内层内容。
本项目的主要目标是介绍 Markdown 的“嵌入”语法,我认为这种语法以前从未讨论过(对于这种类型的语法)。这就是为什么我在测试页面上实现了这个过滤器,作为一种安全替换语法的工具。
您还可以使用此过滤器删除 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
文件。