解析:sub/superscript
Parsedown: sub/superscript
Parsedown 1.8.0-beta-5 doesn't have a builtin syntax for sub/superscript. Although CommonMark doesn't specify such syntax, several other lightweight markup languages (ex: Parsedown Extreme, Textile) 的当前版本使用类似于以下的语法:
in: 19^th^
out: 19<sup>th</sup>
in: H~2~O
out: H<sub>2</sub>O
问题
应该采取哪些步骤来修改 Parsedown.php
文件并包含此类语法?
注意: 这个问题已经在其他时候出现过 (Parsedown, add sub/superscript)。但是,仍然没有分步指南解释应该在 Parsedown.php
文件中进行哪些修改才能实现此目的。
在 $InlineTypes
中附加 Superscript
和 Tilde
:
protected $InlineTypes = array(
'!' => array('Image'),
'&' => array('SpecialCharacter'),
'*' => array('Emphasis'),
':' => array('Url'),
'<' => array('UrlTag', 'EmailTag', 'Markup'),
'[' => array('Link'),
'_' => array('Emphasis'),
'`' => array('Code'),
'~' => array('Tilde'),
'^' => array('Superscript'),
'\' => array('EscapeSequence'),
);
定义方法 inlineSuperscript
。它看起来应该很像 inlineStrikethrough
:
protected function inlineSuperscript($Excerpt)
{
if (preg_match('/^\^(.+?)\^/', $Excerpt['text'], $matches))
{
return array(
'extent' => strlen($matches[0]),
'element' => array(
'name' => 'sup',
'handler' => array(
'function' => 'lineElements',
'argument' => $matches[1],
'destination' => 'elements',
)
),
);
}
}
定义方法 inlineTilde
并删除方法 inlineStrikethrough
。它看起来应该很像 inlineEmphasis
:
protected function inlineTilde($Excerpt)
{
if ( ! isset($Excerpt['text'][1]))
{
return;
}
$marker = $Excerpt['text'][0];
if ($Excerpt['text'][1] === $marker and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches))
{
$emphasis = 'del';
}
elseif (preg_match('/^~(?=\S)(.+?)(?<=\S)~/', $Excerpt['text'], $matches))
{
$emphasis = 'sub';
}
else
{
return;
}
return array(
'extent' => strlen($matches[0]),
'element' => array(
'name' => $emphasis,
'handler' => array(
'function' => 'lineElements',
'argument' => $matches[1],
'destination' => 'elements',
)
),
);
}
将新符号添加到 $inlineMarkerList
:
protected $inlineMarkerList = '!*_&[:<`~\^';
Parsedown 1.8.0-beta-5 doesn't have a builtin syntax for sub/superscript. Although CommonMark doesn't specify such syntax, several other lightweight markup languages (ex: Parsedown Extreme, Textile) 的当前版本使用类似于以下的语法:
in: 19^th^
out: 19<sup>th</sup>
in: H~2~O
out: H<sub>2</sub>O
问题
应该采取哪些步骤来修改 Parsedown.php
文件并包含此类语法?
注意: 这个问题已经在其他时候出现过 (Parsedown, add sub/superscript)。但是,仍然没有分步指南解释应该在 Parsedown.php
文件中进行哪些修改才能实现此目的。
在
$InlineTypes
中附加Superscript
和Tilde
:protected $InlineTypes = array( '!' => array('Image'), '&' => array('SpecialCharacter'), '*' => array('Emphasis'), ':' => array('Url'), '<' => array('UrlTag', 'EmailTag', 'Markup'), '[' => array('Link'), '_' => array('Emphasis'), '`' => array('Code'), '~' => array('Tilde'), '^' => array('Superscript'), '\' => array('EscapeSequence'), );
定义方法
inlineSuperscript
。它看起来应该很像inlineStrikethrough
:protected function inlineSuperscript($Excerpt) { if (preg_match('/^\^(.+?)\^/', $Excerpt['text'], $matches)) { return array( 'extent' => strlen($matches[0]), 'element' => array( 'name' => 'sup', 'handler' => array( 'function' => 'lineElements', 'argument' => $matches[1], 'destination' => 'elements', ) ), ); } }
定义方法
inlineTilde
并删除方法inlineStrikethrough
。它看起来应该很像inlineEmphasis
:protected function inlineTilde($Excerpt) { if ( ! isset($Excerpt['text'][1])) { return; } $marker = $Excerpt['text'][0]; if ($Excerpt['text'][1] === $marker and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches)) { $emphasis = 'del'; } elseif (preg_match('/^~(?=\S)(.+?)(?<=\S)~/', $Excerpt['text'], $matches)) { $emphasis = 'sub'; } else { return; } return array( 'extent' => strlen($matches[0]), 'element' => array( 'name' => $emphasis, 'handler' => array( 'function' => 'lineElements', 'argument' => $matches[1], 'destination' => 'elements', ) ), ); }
将新符号添加到
$inlineMarkerList
:protected $inlineMarkerList = '!*_&[:<`~\^';