Extending Parsedown involves adding elements to the $InlineTypes
and $BlockTypes
arrays, then adding methods to handle them.
Italics
I use <i>
a lot, to indicate transliterated words. So I use could use "/"
to indicate that:
/Shabbat/ is a Hebrew word
becomes <i>Shabbat</i> is a Hebrew word
. To do that:
do
class myParsedown extends Parsedown{
function __construct(){
$this->InlineTypes['/'] []= 'Italic';
// after adding all the new inline types, create the list of characters
$this->inlineMarkerList = implode ('', array_keys($this->InlineTypes));
// allow the character to be escaped by '\'
$this->specialCharacters []= '/';
}
protected function inlineItalic($excerpt){
if (preg_match('#^/(.+?)/#', $excerpt['text'], $matches)) {
return array(
'extent' => strlen($matches[0]),
'element' => array(
'name' => 'i',
'handler' => array(
'function' => 'lineElements',
'argument' => $matches[1],
'destination' => 'elements'
)
)
);
}
}
Now, my transliterated words are almost always Hebrew, so I can automatically add the lang=he
attribute:
protected function inlineItalic($excerpt){
if (preg_match('#^/(.+?)/#', $excerpt['text'], $matches)) {
return array(
'extent' => strlen($matches[0]),
'element' => array(
'name' => 'i',
'handler' => array(
'function' => 'lineElements',
'argument' => $matches[1],
'destination' => 'elements'
),
'attributes' => array('lang' => 'he') // Add attributes
)
);
}
}
and now /Shabbat/ is a Hebrew word
becomes <i lang=he>Shabbat</i> is a Hebrew word
.
Cite
I also use the <cite>
. I'm running out of single characters to indicate elements, so I'm going to redefine "-"
. I don't need two different markers for <em>
.
function __construct(){
$this->InlineTypes['_'] = ['Cite']; // redefinition; I am replacing the old array (which was ['Emphasis'])
// ... rest of the constructor as above
}
protected function inlineCite($excerpt){
if (preg_match('#^_(.+?)_#', $excerpt['text'], $matches)) {
return array(
'extent' => strlen($matches[0]),
'element' => array(
'name' => 'cite',
'handler' => array(
'function' => 'lineElements',
'argument' => $matches[1],
'destination' => 'elements'
)
)
);
}
And now _A Tale of Two Cities_
becomes <cite>A Tale of Two Cities</cite>
Leave a Reply