源码网,源码论坛,源码之家,商业源码,游戏源码下载,discuz插件,棋牌源码下载,精品源码论坛

 找回密码
 立即注册
查看: 659|回复: 16

[网页编辑器] fckeditor 代码语法高亮

[复制链接]

7万

主题

861

回帖

32万

积分

论坛元老

Rank: 8Rank: 8

积分
329525
发表于 2009-6-21 15:54:13 | 显示全部楼层 |阅读模式
这两个星期有点空,就再研究了一下语法高亮的问题,找了一下FCKeditor官方网站,发现2.5.1稳定版已经出来了,首先替换掉旧的2.0。呵呵,我喜欢使用新版。
        
        
            先是IE:
1、遗留的问题:隐藏的源码和格式化后的代码有会有问题。
经上次研究的结果,两处的代码有可能不对,主要是HTML的特别代码,像代码里有标签,JavaScript代码里有&alt等。这里的解决方法很简单:只要替换一下就可以了,不过要注意,在进行格式化之前就进行替换。因为隐藏的代码也是要替换的,最后取的时候也要替换回去,但是要反顺序。代码如下:
[U]复制代码[/U] 代码如下:
.replace(/&/g, "&")
.replace(//g,'>');
2、在FCKeditor里很多控件都有右键菜单可以修改其属性,代码高亮我也想增加一个!到FCKeditor官方网站找了一遍成功的增加了,代码如下(代码放在fckplugin.js):
[U]复制代码[/U] 代码如下:
// 添加右键菜单
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):
[U]复制代码[/U] 代码如下:
// 添加双击事件
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):
[U]复制代码[/U] 代码如下:
/ /双击事件处理代码
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):
[U]复制代码[/U] 代码如下:
// 单击事件处理代码
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增加一个在线上传图片的插件,这样在别处转载文章时就方便多了,点一下就可以自动上传所有图片,哈哈哈。。。
回复

使用道具 举报

2

主题

1万

回帖

73

积分

注册会员

Rank: 2

积分
73
发表于 2022-12-14 06:21:16 | 显示全部楼层
谢谢您的分享!
回复 支持 反对

使用道具 举报

7

主题

1万

回帖

288

积分

中级会员

Rank: 3Rank: 3

积分
288
发表于 2023-6-12 09:07:24 | 显示全部楼层
还不错啊
回复 支持 反对

使用道具 举报

0

主题

1万

回帖

66

积分

注册会员

Rank: 2

积分
66
发表于 2023-6-24 04:03:07 | 显示全部楼层
撒旦撒旦撒擦擦擦擦
回复 支持 反对

使用道具 举报

0

主题

1万

回帖

100

积分

注册会员

Rank: 2

积分
100
发表于 2023-7-23 21:31:10 | 显示全部楼层
需要很久了终于找到了
回复 支持 反对

使用道具 举报

1

主题

1万

回帖

93

积分

注册会员

Rank: 2

积分
93
发表于 2023-8-15 22:59:08 | 显示全部楼层
。。。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

1

主题

1万

回帖

176

积分

注册会员

Rank: 2

积分
176
发表于 2023-8-24 15:34:40 | 显示全部楼层
这个源码还可以
回复 支持 反对

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2023-8-29 22:34:01 | 显示全部楼层
怕怕怕怕怕怕怕怕怕怕怕怕怕怕
回复 支持 反对

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2024-4-26 07:21:47 | 显示全部楼层
快更新啊,我擦
回复 支持 反对

使用道具 举报

3

主题

1万

回帖

172

积分

注册会员

Rank: 2

积分
172
发表于 2024-4-27 17:48:52 | 显示全部楼层
有什么好的服务器
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

手机版|小黑屋|网站地图|源码论坛 ( 海外版 )

GMT+8, 2024-9-20 00:56 , Processed in 0.199641 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表