IsaacZ 发表于 2009-5-2 23:28:49

Discuz!7.0 实现PHP代码带颜色高亮显示(完整修订版)

本帖最后由 IsaacZ 于 2009-9-9 02:05 编辑

by 荒野无灯 ~ 四月 19th, 2009.

原创文章(函数phphighlite()来自网络),转载请注明出处。

插件添加步骤如下:

修改include/discuzcode.func.php

查找

function codedisp($code) {

      global $discuzcodes;

      $discuzcodes['pcodecount']++;

      $code = htmlspecialchars(str_replace('\\"', '"', preg_replace("/^[\n\r]*(.+?)[\n\r]*$/is", "\\1", $code)));

      $discuzcodes['codehtml'][$discuzcodes['pcodecount']] = tpl_codedisp($discuzcodes, $code);

      $discuzcodes['codecount']++;

      return "[\tDISCUZ_CODE_$discuzcodes\t]";

}

在下面添加:

//////Discuz!7.0实现PHP代码高亮 by 荒野无灯 blog.thinkstd.cn//////

function phphighlite($code) {
if(!strpos($code,"<?\n") && !strpos($code,'<? ') && substr($code,0,2) != '<?') {
$code = '<'.'?'.trim($code).'?'.'>';
$addedtags = 1;
}
ob_start();
$oldlevel = error_reporting(0);
highlight_string($code);
error_reporting($oldlevel);
$buffer = ob_get_contents();
ob_end_clean();
if ($addedtags) {
$openingpos = strpos($buffer, '?');
$closingpos = strrpos($buffer, '?');
$buffer = substr($buffer, $openingpos+1, $closingpos-($openingpos+1)).substr($buffer, $closingpos+5);
}
$buffer = str_replace('"', "\"", $buffer);
$buffer = str_replace('
', '', $buffer);
return $buffer;
}


function phpcodedisp($code) {
global $discuzcodes;
$discuzcodes['pcodecount']++;


$code = phphighlite(str_replace('\\"', '"', preg_replace("/^[\n\r]*(.+?)[\n\r]*$/is", "\\1", $code)));


$discuzcodes['codehtml'][$discuzcodes['pcodecount']] ="<div class=\"blockcode\"><h5>;PHP代码:</h5><div id=\"code$discuzcodes\"><ol><li>$code</ol></div><em onclick=\"copycode($('code$discuzcodes'));\">复制内容到剪贴板</em></div>";


// $discuzcodes['codehtml'][$discuzcodes['pcodecount']] = tpl_codedisp($discuzcodes, $code);

$discuzcodes['codecount']++;
return "[\tDISCUZ_CODE_$discuzcodes\t]";
}


//////Discuz!7.0实现PHP代码高亮 by 荒野无灯 blog.thinkstd.cn//////

查找:

function discuzcode($message, $smileyoff, $bbcodeoff, $htmlon = 0, $allowsmilies = 1, $allowbbcode = 1, $allowimgcode = 1, $allowhtml = 0, $jammer = 0, $parsetype = '0', $authorid = '0', $allowmediacode = '0', $pid = 0) {
global $discuzcodes, $credits, $tid, $discuz_uid, $highlight, $maxsmilies, $db, $tablepre, $hideattach;

if($parsetype != 1 && !$bbcodeoff && $allowbbcode && (strpos($message, '') || strpos($message, '')) !== FALSE) {
$message = preg_replace("/\s*\(.+?)\[\/code\]\s*/ies", "codedisp('\\1')", $message);
}

在其下加上://////Discuz!7.0实现PHP代码高亮 by 荒野无灯 blog.thinkstd.cn//////
if($parsetype != 1 && !$bbcodeoff && $allowbbcode && (strpos($message, '') || strpos($message, '')) !== FALSE) {

$message = preg_replace("/\s*\(.+?)\[\/php\]\s*/ies", "phpcodedisp('\\1')", $message );

}
//////Discuz!7.0实现PHP代码高亮 by 荒野无灯 blog.thinkstd.cn//////2. 修改 include\js\post.js

找到 function wrapTags(tagname, useoption, selection) 条目,下面找到:

insertText(text, strlen(opentag), strlen(closetag), in_array(tagname, ['code', 'quote', 'free', 'hide']) ? true : false);

修改为:

insertText(text, strlen(opentag), strlen(closetag), in_array(tagname, ['code', 'quote', 'free', 'hide','php']) ? true : false);

查找:

if(in_array(cmd, ['quote', 'code', 'free', 'hide']))

修改为:

if(in_array(cmd, ['quote', 'code', 'php', 'free', 'hide'])) {

查找:

lang['e_code'] = '请输入要插入的代码';

在其下加上:

lang['e_php'] = '请输入要插入的php代码';

查找:

if(wysiwyg) {
if(cmd == 'code') {
text = preg_replace(['<', '>'], ['<', '>'], text);
}

修改为:

if(wysiwyg) {
if(cmd == 'code' || cmd == 'php') {
text = preg_replace(['<', '>'], ['<', '>'], text);
}(IsaacZ注:实际上只修改了第2行。)

3. 修改模板文件

在 \templates\default\seditor.htm 中查找:

<!--{if in_array('code', $seditor)}-->
      <a href="javascript:;" title="{lang e_code}" class="tb_code">Code</a>
    <!--{/if}-->



在其下添加:


<!--{if in_array('php', $seditor)}-->
      <a href="javascript:;" title="{lang e_php}" class="tb_php">;PHP</a>
    <!--{/if}-->



在 \templates\default\css_seditor.htm 中查找:


.editor_tb div a.tb_code { background-position: -3px -461px; }


在其下加上:

.editor_tb div a.tb_php { background-position: -3px -521px; }

在 \templates\default\css_editor.htm 中查找:

#e_cmd_code { background-position: 0 -461px;}


在其下加上:

#e_cmd_php { background-position: 0px -521px; }


最后,进入DZ后台,“工具”->”数据库“->”升级 “,
在”Discuz! 数据库升级 – 请将数据库升级语句粘贴在下面“下的的框中粘贴以下代码(注意,cdb_bbcodes中的cdb_请更改为你自己的表前缀):


INSERT INTO `cdb_bbcodes` (`id`, `available`, `type`, `tag`, `icon`, `replacement`, `example`, `explanation`, `params`, `prompt`, `nest`, `displayorder`) VALUES
(25, 2, 1, 'php', 'cmd_php', '', '', '插入php代码', 1, '', 1, 10);
再点击最下面那个”提交“按钮。

IsaacZ注:如果你在DISCUZ编辑器中曾经添加过其他自定义按钮,则提交命令时可能会遇到错误“MySQL Error : Duplicate entry 25 for key 1”。此时请进入 PhpMyAdmin 看看 cdb_bbcodes 表中最后一个记录的 ID 是几,假设最后一个 ID 是28,我们就把上面代码里面的 25 改成 29。如果你无法进入或不知如何进入 PhpMyAdmin ,则可以直接将 25 改成一个较大的数如35,同样可以解决问题。

将\images\common\editor.gif 替换为 这个
好了,现在,进入DZ后台,“界面”->“编辑器设置”->“ Discuz! 代码”
看下php标签是否躺在那了?在去前台发个帖子看下。

我本地测试的效果:



http://i3.6.cn/cvbnm/ee/3e/90/9a5bf92cc5d57746e8363fcad27207a0.jpg


http://i3.6.cn/cvbnm/5f/02/58/fc2d88019dda70a83b877657d6df1355.jpg


转自:http://blog.thinkstd.com/php/dis ... pdaimagaoliang.html(IsaacZ修改了部分文字表述)
页: [1]
查看完整版本: Discuz!7.0 实现PHP代码带颜色高亮显示(完整修订版)