noi / parsedown-newline
是Parsedown的扩展,用于防止日语中的不必要空格。
This package is not auto-updated.
Last update: 2024-09-22 07:38:01 UTC
README
此扩展向Parsedown的HTML转换添加以下行为
- 按照一定规则删除全角字符相邻的换行符(
\n
)
此处理可以消除使用日语(全角字符)编写的Markdown中
- 换行位置出现“无意空白”的问题
。
例如,以下这样的Markdown可读性糟糕的权宜之计不再需要
- 为了避开空白,不得不将段落写成一行横长的形式
- 为了避开空白,不得不在每行长度极端变化的情况下在英数字或符号后换行
请查看以下动作示例。
动作示例
Markdown
このように日本語で
複数行入力するとき、
改行は空白を意図していません。
Parsedown转换后的HTML显示
このように日本語で 複数行入力するとき、 改行は空白を意図していません。
^^^(ここに空白) ^^^(ここにも空白)
在“日语”和“多行”之间,“那么”和“换行”之间有空格。
包含此扩展转换后的HTML显示
このように日本語で複数行入力するとき、改行は空白を意図していません。
没有空格。
Parsedown在HTML转换时,将Markdown上的换行符\n
(换行符)保留原样。 \n
在HTML中以空白的形式显示。
这种空白在原本用于分词的英语等许多语言中不会引起问题,但在基本不进行分词的日语中,就像上述示例中那样,会变成有点令人烦恼的间隙。
此扩展在HTML转换时删除导致无意空白的\n
。
因此,在用日语编写Markdown的情况下,也可以不用在意换行位置而随意输入。
换行处理规则
HTML转换时的换行处理条件如下
- 如果换行前后都是半角字符,则保留
\n
。 - 如果换行前后都是英数字(全角和半角均适用),则保留
\n
。 - 如果换行前后其中一方是特别指定的字符种类,则保留
\n
。 - 其他情况下,由于换行前后都是全角字符相邻,因此删除
\n
。
基本上,认为全角字符相邻的换行不是有意留白的,因此将其删除。 作为例外,在应该保持单词间分词的文字种类之间,换行是有意留白的,因此保留\n
。
此换行处理不适用于代码块。
另外,如果想在HTML上也解释Markdown上的换行符为换行(<br>
),则不要使用此扩展,而是使用Parsedown标准中的Parsedown::setBreaksEnabled()
。
换行处理规则的微调
如果遵循“全角字符与半角字符之间必须留白”之类的排版规则编写Markdown,则需要在换行位置也保持一致性。
但是,将此扩展组合后,默认行为是删除全角字符相邻的换行,因此
全角 ABC
全角
这样的Markdown("全角 ABC\n全角
")的\n
在转换后的HTML中也会消失。 这种HTML的显示会
全角 ABC全角
变成("ABC"后面没有空格),违反了排版规则,变成了不正确的HTML。
在这种情况下,需要遵守特定字符种类留白的规则,可以通过以下方法调整换行处理规则
setSingleByteCharsSeparated($bool)
-- 半角字符用setSingleByteAlphaSeparated($bool)
-- 半角字母用setSingleByteNumericSeparated($bool)
-- 半角数字用setSingleByteSymbolSeparated($bool)
-- 半角符号用setMultiByteAlphaSeparated($bool)
-- 全角字母用setMultiByteNumericSeparated($bool)
-- 全角数字用
通过将这些方法指定为true
,将不再删除相邻的换行。
例如,将setSingleByteCharsSeparated(true)
设置为,如果换行前后其中一方是半角字符,则另一方即使是全角字符也保留\n
。 前述示例中,换行不会删除,将得到所需的显示结果
全角 ABC 全角
。
请根据您的文书的书写规则调整上述方法。
安装 - 安装方法
请通过以下命令在Composer中执行。
$ composer require noi/parsedown-newline "*" $ composer require erusev/parsedown-extra "*"
或者,在composer.json
中包含以下行。
{ "require": { "noi/parsedown-newline": "*", "erusev/parsedown-extra": "*" } }
如果不使用Markdown Extra的扩展语法,则不需要erusev/parsedown-extra
的行。
如果不在Composer中管理包,则在include_path
的任何一个中创建Noi/
目录,并将lib/
以下的所有文件放在那里。
用法 - 扩展的集成方法
方法1: 使用 Noi\ParsedownNewline
/ Noi\ParsedownExtraNewline
这些类是分别将本扩展集成到Parsedown
和ParsedownExtra
的实现的类。
可以直接使用new
,也可以定义派生类并集成其他扩展来使用。
<?php $pd = new \Noi\ParsedownNewline(); // or new \Noi\ParsedownExtraNewline(); echo $pd->text("Parsedownは\nとても\n便利"); // Output: <p>Parsedownはとても便利</p>
方法2: 集成到自定义的Parsedown
派生类中
如果您有自己的Parsedown
派生类,请将其trait集成到其中。
如下所示,使用Noi\Parsedown\JapaneseNewlineTrait
<?php class YourParsedown extends \Parsedown /* or \ParsedownExtra or etc. */ { use \Noi\Parsedown\JapaneseNewlineTrait; //... }
注意
如果满足以下条件之一,则不能仅使用use
来集成
- 要集成的类(例如,上述的
YourParsedown
)中重新定义了unmarkedText()
- 同时使用其他trait也定义了
unmarkedText()
如果为1,则本扩展的unmarkedText()
会被覆盖,因此无法生效。 如果为2,则将发生方法名冲突错误。
为了解决这些问题,需要编写竞争回避代码。 请参考用法3。
用法3: 编写竞争回避代码
此扩展的trait覆盖了unmarkedText()
。
同时使用其他trait也定义了unmarkedText()
的情况,由于将发生方法名冲突错误,因此不能直接集成。 为了解决这个问题,需要编写竞争回避代码。
请按以下方式定义集成类
<?php use Noi\Parsedown\JapaneseNewlineTrait; use AnotherExtensionTrait; class YourSuperDuperParsedown extends ... { // 1. 競合Extension側のunmarkedText()に別名を付ける use JapaneseNewlineTrait, AnotherExtensionTrait { AnotherExtensionTrait::unmarkedText as unmarkedText_Another; } // 2. 実装クラスにunmarkedText()を定義 protected function unmarkedText($text) { // 3. unmarkedText()の中で、競合Extension側のunmarkedText()を別名で呼ぶ $text = $this->unmarkedText_Another($text); // 4. 3の結果をunmarkedJapaneseNewline()の引数に渡す return $this->unmarkedJapaneseNewline($text); } }
关键是,在实现类的unmarkedText()
内执行
- 竞争Extension的
unmarkedText()
的别名 - 执行
JapaneseNewlineTrait::unmarkedJapaneseNewline()
。
许可证
是MIT许可证。 在许可证限制范围内,无论是商业用途还是非商业用途都可以自由使用。
在MIT许可证下发布的代码 - 有关详细信息,请参阅LICENSE
文件。