欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

fckeditor 代码语法高亮

程序员文章站 2022-06-16 19:51:16
先是ie: 1、遗留的问题:隐藏的源码和格式化后的代码有会有问题。 经上次研究的结果,两处的代码有可能不对,主要是html的特别代码,像代码里有标签
,...
先是ie:
1、遗留的问题:隐藏的源码和格式化后的代码有会有问题。
经上次研究的结果,两处的代码有可能不对,主要是html的特别代码,像代码里有标签<div>,javascript代码里有&alt等。这里的解决方法很简单:只要替换一下就可以了,不过要注意,在进行格式化之前就进行替换。因为隐藏的代码也是要替换的,最后取的时候也要替换回去,但是要反顺序。代码如下:
复制代码 代码如下:

.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g,'>');

2、在fckeditor里很多控件都有右键菜单可以修改其属性,代码高亮我也想增加一个!到fckeditor官方网站找了一遍成功的增加了,代码如下(代码放在fckplugin.js):
复制代码 代码如下:

// 添加右键菜单
fck.contextmenu.registerlistener( {
additems : function( menu, tag, tagname )
{
if (!tag)
return;

var odiv = tag;

// 循环的作用看一下代码就知道了,是为了选择高亮代码的最顶层元素
while (odiv.parentnode){
if (odiv.tagname == usingtag && odiv.classname == usingflag)
break;
odiv = odiv.parentnode;
}

// under what circumstances do we display this option
if ( odiv.tagname == usingtag && odiv.classname == usingflag )//&& (tag._fckhighlighter || tag.parentelement._fckhighlighter) )
{
fckselection.selectnode( odiv ) ;
// when the option is displayed, show a separator the command
menu.addseparator() ;
// the command needs the registered command name, the title for the context menu, and the icon path
menu.additem( 'highlighter', fcklang['dlgsyntaxhighlighterproperty'], ohighlighteritem.iconpath ) ;
}
}}
);

3、试用了一下效果,发现双击修改时只能双击代码行数左边的灰色才能弹出修改。我觉得不大方便,如果双击代码处也可以弹出修改就方便多了!嘿嘿,答案是肯定的,之前的代码已经注册了div标签的双击事件,所以再注册一下格式化后的代码用到的span和li标签就可以了,代码如下(代码放在fckplugin.js):
复制代码 代码如下:

// 添加双击事件
fck.registerdoubleclickhandler( fckhighlighter.ondoubleclick, usingtag ) ; // 双击灰色栏
fck.registerdoubleclickhandler( fckhighlighter.ondoubleclick, 'span' ) ; // 双击代码
fck.registerdoubleclickhandler( fckhighlighter.ondoubleclick, 'li' ) ; // 双击代码区空白
// 添加双击事件
fck.registerdoubleclickhandler( fckhighlighter.ondoubleclick, usingtag ) ; // 双击灰色栏
fck.registerdoubleclickhandler( fckhighlighter.ondoubleclick, 'span' ) ; // 双击代码
fck.registerdoubleclickhandler( fckhighlighter.ondoubleclick, 'li' ) ; // 双击代码区空白

4、再试一下,发现双击代码行数这里可以进行修改。但是双击代码就不行,拿不到隐藏的源码。原因是因为在代码里双击的不是顶层元素,那简单,修改一下双击的代码,取得顶层元素就ok了(代码放在fckplugin.js):
复制代码 代码如下:

/ /双击事件处理代码
fckhighlighter.ondoubleclick = function( div ){
var odiv = div;

// 循环的作用看一下代码就知道了,是为了选择高亮代码的最顶层元素
while (odiv.parentnode){
if (odiv.tagname == usingtag && odiv.classname == usingflag)
break;
odiv = odiv.parentnode;
}

if(odiv.tagname == usingtag && odiv.classname == usingflag) {
fckselection.selectnode( odiv ) ;
fckcommands.getcommand( 'highlighter' ).execute() ;
}
}

5、把编辑转到源代码再转回来的时候发现高亮的代码已经不可以编辑了。研究之下发现是用于标识的属性没有了,因为这个标识的属性是非标准的html属性。这个也好办,反正顶层的class属性没用,就直接拿来用就可以了。这个简单,我就不给代码了。
ie里的修改算是完成了,而且比较完美。
再来ff:
  本人用系统,用软件都用得比较杂,有时候会用用ff,所以修改的东西一定要支持ff。再说,fckeditor本身是兼容ie和ff的,增加的插件只支持ie有点说不过去。
1、首先试用了一下效果:发现已经可以插入,不过不可以修改。双击事件也有效,但也是不能修改。这个原因是因为ff跟ie不同,ie里可以把div标签直接选择,ff里不可以。所以要加一个单击的事件,让代码帮助ff选择顶层元素,原始代码是从fckeditor的placeholder插件里copy过来的(代码放在fckplugin.js):
复制代码 代码如下:

// 单击事件处理代码
fckhighlighter._clicklistener = function( e )
{
var odiv = e.target;

// 循环的作用看一下代码就知道了,是为了选择高亮代码的最顶层元素
while (odiv.parentnode){
if (odiv.tagname == usingtag && odiv.classname == usingflag)
break;
odiv = odiv.parentnode;
}

if ( odiv.tagname == usingtag && odiv.classname == usingflag )
fckselection.selectnode( odiv ) ;
}

fckhighlighter._setupclicklistener = function (){
if (fckbrowserinfo.isgecko)
fck.editordocument.addeventlistener( 'click', fckhighlighter._clicklistener, true ) ;
}

// 添加单击事件
fck.events.attachevent( 'onaftersethtml', fckhighlighter._setupclicklistener ) ;

// 添加右键菜单
fck.contextmenu.registerlistener( {
additems : function( menu, tag, tagname )
{
if (!tag)
return;

var odiv = tag;

// 循环的作用看一下代码就知道了,是为了选择高亮代码的最顶层元素
while (odiv.parentnode){
if (odiv.tagname == usingtag && odiv.classname == usingflag)
break;
odiv = odiv.parentnode;
}

// under what circumstances do we display this option
if ( odiv.tagname == usingtag && odiv.classname == usingflag )//&& (tag._fckhighlighter || tag.parentelement._fckhighlighter) )
{
fckselection.selectnode( odiv ) ;
// when the option is displayed, show a separator the command
menu.addseparator() ;
// the command needs the registered command name, the title for the context menu, and the icon path
menu.additem( 'highlighter', fcklang['dlgsyntaxhighlighterproperty'], ohighlighteritem.iconpath ) ;
}
}}
);

注明:这个需要修改fckeditor的核心代码,因为我发现在2.5.1版本在ff下不可以修改选择的元素,但是最新的2.6测试版就可以。所以需要修改_source\internals\fckselection_gecko.js文件里的getselectedelement函数,并且使用官方工具fckpackager.exe重新打包javascript代码,这个我有空再写一下。
  到这里已经差不多了,其中还有一些小问题没有说,例如:高亮的代码里可以直接修改(为标签增加一个contenteditable='false'就完了),js代码兼容要使用parentnode不要使用parentelement等。
  本来想在添加代码的窗口也增加一个实时语法高亮的编辑器,不过上网找了一下用得比较多的codepress和editarea都存在一些bug,特别是在ie7下,所以还是暂时不添加了。日后再修改。
  增加这个插件修改的容易比较多,如果你遇到什么问题可以留言,我会尽力为你解答。
  下一步再为fckeditor增加一个在线上传图片的插件,这样在别处转载文章时就方便多了,点一下就可以自动上传所有图片,哈哈哈。。。