解决Tinection下markdown代码块显示问题

作者: xuzizi 分类: wordpress,杂记 发布时间: 2016-04-05 21:23

使用Tinection,发现使用markdown写文章插入代码会在代码前后加入<code></code>
如下

<code>
public static void main(String[] args) {
        // TODO Auto-generated method stub
        long num=Math.round(-2.6);
        System.out.println(num);
    }
</code>

网上提供了一种方法修改markdown插件里的文件
比如修改jetpack-markdown/lib/markdown/extra.php 中的
$codeblock = "<pre><code>$codeblock\n</code>\</pre>”;
$codeblock = "<pre$pre_attr_str><code>$codeblock</code>\</pre>”;

这2处删除 <code> 标签即可。还有下面这个

function _doFencedCodeBlocks_callback($matches) {
$classname =& $matches[2];
$attrs =& $matches[3];
$codeblock = $matches[4];
$codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);

找到这个地方,注释掉最后一行,这里是禁止把 < 和 > 这两个符号转化为 html 的尖括号。

这种情况下可以解决在线markdown发表文章产生<code>标签

但是这是一种治标不治本的问题,经过大量代码修改测试,发现修改一个地方就可以解决。。。
在模板函数 (functions.php)找到以下代码

function pre_content_filter( $content ) {
    return preg_replace_callback( '|<pre.*>(.*)</pre|isU' , 'convert_pre_entities', $content );
}

修改为

function pre_content_filter( $content ) {
    return preg_replace_callback( '|<pre.*><code.*>(.*)</code></pre|isU' , 'convert_pre_entities', $content );
}

即可解决问题


上文更新完后发现严重的字符转义现象,经过仔细查证
在模板函数 (functions.php)找到以下代码

function convert_pre_entities( $matches ) {
    $code = str_replace( $matches[0], '<div class="precode clearfix"><pre class="prettyprint linenums">'.htmlspecialchars( $matches[1],ENT_COMPAT,'UTF-8' ).'</pre></div', $matches[0] );
    return str_replace("\t", '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', $code);
}

修改为

function convert_pre_entities( $matches ) {
    $code = str_replace( $matches[0], '<div class="precode clearfix"><pre class="prettyprint linenums">'.$matches[1].'</pre></div', $matches[0] );
    return str_replace("\t", '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', $code);
}

即可解决代码转义问题

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注