Tag:开源 , 源码 , 控件 , 控件开发 , 皮肤 , Skin , Web Service , AJAX , JQuery , Flex , Silverlight , Javascript , CSS , SQL , 网站开发 , 数据库 , CodeHighlighter为FCKEditor制作代码着色高亮插件

 
您的位置: >> 首页 >> .Net视角 >> 使用CodeHighlighter为FCKEditor制作代码着色高亮插件

使用CodeHighlighter为FCKEditor制作代码着色高亮插件

2009-09-09  来自:CS程序员之窗  字体大小:【  
  • 摘要:FCKeditor是个很不错的在线编辑器,美中不足的是缺少代码着色高亮显示功能。笔者了参考网上资料并结合自己的实践,给大家描述如何使用CodeHighlighter为FCKEditor制作代码着色高亮插件,以给网友们作为参考

        FCKeditor是个很不错的在线编辑器,美中不足的是缺少代码着色高亮显示功能。对于代码高亮着色,网上介绍有Google的SyntaxHighlighter 和actipro 的 CodeHighlighter。

        考虑到SyntaxHighlighter在显示页面中需要做一些操作,感觉不甚方便。于是选择使用CodeHighlighter作为FCKeditor的代码着色插件。其实网上也有这方面的介绍,而笔者也是参考网上并结合自己的实践将自己的操作过程逐一记录,以便于网友参考实践。

        FCKeditor插件开发可以参考FCKeditor官网的文档: 
        http://docs.fckeditor.net/FCKeditor_2.x/Developers_Guide/Customization/Plug-ins
 

第一步:


        我们在FCKeditor/editor/plugins目录下新建一个insertcode目录,并在insertcode目录下新建一个fckplugin.js文件。 在新建的fckplugin.js文件中插入下面的代码:
 

FCKCommands.RegisterCommand('InsertCode', new FCKDialogCommand('InsertCode',
      FCKLang.InsertCode, FCKPlugins.Items['insertcode'].Path + 'insertcode.aspx', 700, 600)) ;

var insertcodeItem = new FCKToolbarButton('InsertCode', FCKLang['InsertCode']) ;

insertcodeItem.IconPath = FCKPlugins.Items['insertcode'].Path + 'code.gif';

FCKToolbarItems.RegisterItem('InsertCode', insertcodeItem);

第二步:

        在FCKeditor/editor/plugins/insertcode目录下创建images,lang,languages目录,在lang目录下新建en.js,zh-cn.js。
        en.js的内容为:
 

FCKLang.InsertCode = 'Insert Codes'; 


        zh-cn.js的内容为:
 

FCKLang.InsertCode = '插入代码'; 

第三步:

        从附件列表中下载CodeHighlighter控件并解压,把CodeHighlighter/bin目录下的  ActiproSoftware.CodeHighlighter.Net20.dll,
ActiproSoftware.Shared.Net20.dll,
CodeHighlighterTest.dll

        三个DLL复制到自己项目的/bin目录,

       将CodeHighlighter/Languages里的Lexers整个目录复制到FCKeditor/editor/plugins/insertcode/languages目录,
CodeHighlighter/Images/OutliningIndicators/目录下的所有图片复制到FCKeditor/editor/plugins/insertcode/images目录,并将附件列表中的code.gif这个图片下载保存到FCKeditor/editor/plugins/insertcode/。
 

第四步:

        在FCKeditor/editor/plugins/insertcode/目录下新建insertcode.aspx,insertcode.aspx内容如下:
 

<%@ Page Language="C#" ValidateRequest="false" %>

<%@ Register TagPrefix="CH" Namespace="ActiproSoftware.CodeHighlighter" Assembly="ActiproSoftware.CodeHighlighter.Net20" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

   

static string code = string.Empty;

protected void btnSubmit_Click(object sender, EventArgs e)

{

    code = txtCode.Text;

    Highlighter.LanguageKey = ddlLangType.SelectedItem.Text;

    Highlighter.OutliningEnabled = chkOutLining.Checked;

    Highlighter.LineNumberMarginVisible = chkLineNum.Checked;

    Highlighter.Text = code;

}

protected void Page_Load(object sender, EventArgs e)

{

    if (!Page.IsPostBack)

    {

        CodeHighlighterConfiguration config = (CodeHighlighterConfiguration)ConfigurationManager.GetSection("codeHighlighter");

        string[] keys = new string[config.LanguageConfigs.Keys.Count];

        config.LanguageConfigs.Keys.CopyTo(keys, 0);

        Array.Sort(keys);

        foreach (string key in keys)

        {

            ddlLangType.Items.Add(key);

        }

        ddlLangType.SelectedIndex = ddlLangType.Items.IndexOf(ddlLangType.Items.FindByText("C#"));

    }

}

protected void CodeHighlighter_PostRender(object sender, EventArgs e)

{

    if (!string.IsNullOrEmpty(Highlighter.Output))

    {

        lblCode.Text = Highlighter.Output.Replace(" ", " ").Replace("\n", "<br />");

        Response.Write("<scr" + "ipt>window.parent.SetOkButton( true );</scr" + "ipt>");

    }

}

</script>

<html xmlns="http://www.w3.org/1999/xhtml">

<head id="Head1" runat="server">

<title>插入脚本代码</title>

<script src="../../dialog/common/fck_dialog_common.js" type="text/javascript"></script>

<script type="text/javascript">

var oEditor = window.parent.InnerDialogLoaded() ;

// Gets the document DOM

var oDOM = oEditor.FCK.EditorDocument ;

var oActiveEl = oEditor.FCKSelection.GetSelectedElement() ;

window.onload = function()

{

//window.parent.SetOkButton( false );

}

function Ok()

{

    if(GetE('txtCode').value == '')

    {

        alert("代码内容不能为空!");

        return false;

    }

    oEditor.FCK.InsertHtml(document.getElementById("lblCode").innerHTML) ;

    return true ;

}

</script>

<style type="text/css">

.langType

{

padding-bottom: 5px;

}

.btnRun

{

padding-top: 5px;

text-align: right;

}

pre

{

background-color: #f4f4f4;

border-style: solid;

border-width: 1px;

border-color: #C0C0C0;

font-family: Courier New, monospace;

font-size: 10pt;

}

</style>

</head>

<body>

<form id="form1" runat="server">

<div>

<div class="langType">

语言类型:<asp:DropDownList ID="ddlLangType" runat="server">

</asp:DropDownList>

<asp:CheckBox ID="chkOutLining" Text="折叠代码" runat="server" Checked="true" />

<asp:CheckBox ID="chkLineNum" Text="允许行号" runat="server" Checked="false" />

</div>

<div>

<asp:TextBox ID="txtCode" runat="server" TextMode="multiline" Width="640px" Height="390px"></asp:TextBox>

</div>

<div class="btnRun">

<asp:Button ID="btnSubmit" runat="server" Text=" 转 换 " OnClick="btnSubmit_Click" />

<pre id="pre1" style="display: none;">

<CH:CodeHighlighter runat="server" ID="Highlighter" OnPostRender="CodeHighlighter_PostRender" />

</pre>

<asp:Label ID="lblCode" Style="display: none;" runat="server"></asp:Label>

</div>

</div>

</form>

</body>

</html>

 

第五步:

        接下来修改FCKeditor/fckconfig.js,在原文件中我们能找到// FCKConfig.Plugins.Add( 'autogrow' ) ;这段代码,在这段代码下一行插入:
 

FCKConfig.Plugins.Add( 'insertcode' , 'zh-cn' ) ;

        并在
 

FCKConfig.ToolbarSets["Default"]

中增加一项:'InsertCode' 如下面所示范
 

FCKConfig.ToolbarSets["Default"] = [

     ['Source','DocProps','-','Save','NewPage','Preview','-','Templates'],

     ['Cut','Copy','Paste','PasteText','PasteWord','-','Print','SpellCheck'],

     ['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],

     ['Form','Checkbox','Radio','TextField','Textarea','Select','Button','ImageButton','HiddenField'],

     '/',

     ['Bold','Italic','Underline','StrikeThrough','-','Subscript','Superscript'],

     ['OrderedList','UnorderedList','-','Outdent','Indent','Blockquote','CreateDiv'],

     ['JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],

     ['Link','Unlink','Anchor','InsertCode'],

     ['Image','Flash','Table','Rule','Smiley','SpecialChar','PageBreak'],

     '/',

     ['Style','FontFormat','FontName','FontSize'],

     ['TextColor','BGColor'],

     ['FitWindow','ShowBlocks','-','About']         // No comma for the last row.

] ;

第六步:

        最后修改Web.config文件:(请参考CodeHighlighter/Web.config)

在<configuration>里插入:
 

<configSections>

     <section name="codeHighlighter" requirePermission="false" 
      type
="ActiproSoftware.CodeHighlighter.CodeHighlighterConfigurationSectionHandler, 
      ActiproSoftware.CodeHighlighter.Net20
" />

</configSections>


在<system.web></system.web>后插入:
 

<codeHighlighter>

         <cache languageTimeout="3" />

         <keywordLinking enabled="true" target="_blank" defaultKeywordCollectionKey="ActiproKeywords">

              <keywordCollection key="ActiproKeywords">

                   <explicitKeyword tokenKey="IdentifierToken" patternValue="Actipro" url="http://www.actiprosoftware.com" caseSensitive="false" />

                   <explicitKeyword tokenKey="IdentifierToken" patternValue="CodeHighlighter" url="http://www.codehighlighter.com" caseSensitive="false" />

              </keywordCollection>

         </keywordLinking>

         <languages>

              <language key="Assembly" definitionPath="~/Languages/Lexers/ActiproSoftware.Assembly.xml" />

              <language key="BatchFile"
               
definitionPath="~/Languages/Lexers/ActiproSoftware.BatchFile.xml" />

              <language key="C#" definitionPath="~/Languages/Lexers/ActiproSoftware.CSharp.xml" />

              <language key="CSS" definitionPath="~/Languages/Lexers/ActiproSoftware.CSS.xml" />

              <language key="HTML" definitionPath="~/Languages/Lexers/ActiproSoftware.HTML.xml" />

              <language key="INIFile" definitionPath="~/Languages/Lexers/ActiproSoftware.INIFile.xml" />

              <language key="Java" definitionPath="~/Languages/Lexers/ActiproSoftware.Java.xml" />

              <language key="JScript" definitionPath="~/Languages/Lexers/ActiproSoftware.JScript.xml" />

              <language key="Lua" definitionPath="~/Languages/Lexers/ActiproSoftware.Lua.xml" />

              <language key="MSIL" definitionPath="~/Languages/Lexers/ActiproSoftware.MSIL.xml" />

              <language key="Pascal" definitionPath="~/Languages/Lexers/ActiproSoftware.Pascal.xml" />

              <language key="Perl" definitionPath="~/Languages/Lexers/ActiproSoftware.Perl.xml" />

              <language key="PHP" definitionPath="~/Languages/Lexers/ActiproSoftware.PHP.xml" />

              <language key="PowerShell"
               
definitionPath="~/Languages/Lexers/ActiproSoftware.PowerShell.xml" />

              <language key="Python" definitionPath="~/Languages/Lexers/ActiproSoftware.Python.xml" />

              <language key="SQL" definitionPath="~/Languages/Lexers/ActiproSoftware.SQL.xml" />

              <language key="VB.NET" definitionPath="~/Languages/Lexers/ActiproSoftware.VBDotNet.xml" />

              <language key="VBScript" definitionPath="~/Languages/Lexers/ActiproSoftware.VBScript.xml" />

              <language key="XAML" definitionPath="~/Languages/Lexers/ActiproSoftware.XAML.xml" />

              <language key="XML" definitionPath="~/Languages/Lexers/ActiproSoftware.XML.xml" />

         </languages>

         <lineNumberMargin foreColor="Teal" paddingCharacter=" " visible="true" />

         <outlining enabled="true" imagesPath="~/Images/OutliningIndicators/" />

         <spacesInTabs count="4" />

     </codeHighlighter>

这次的插件就完工了。这种方法可以说是一劳永逸,以后更换高版本的FCKeditor时,只需要修改fckconfig.js将这个插件加入就可以了

 

作者:黑浪

相关文章: