by WebSurfer
3. July 2011 17:00
BlogEngine.NET 2.0 に標準で実装されている SyntaxHighlighter はバージョン 3.0.83 ですが、BlogEngine.NET 1.6.1 で使っていたバージョン 2.0.320 を使えるようにしました。
これは先の記事 Lightbox Plugin で書いた、バージョン 3.0.83 の shCore.js が取り込まれると、IE6, IE7, IE8 の場合、JavaScript パーサーが jQuery.js をうまく解釈できないという問題に対応するためです。
どのようにしたかというと、Standard のテーマをコピーして別のテーマを作り、その中のマスターページの site.master.cs で、デフォルトの SysntaxHighlighter 3.0.83 が Enable でないときは、2.0.320 のスクリプトと CSS 定義を追加するようにしました。
具体的には以下の通りです。
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using BlogEngine.Core;
using BlogEngine.Core.Web.Extensions;
public partial class MyStyleSite : System.Web.UI.MasterPage
{
private string extensionName = "SyntaxHighlighter";
private static string scriptsFolder =
"SyntaxHighlighter2/scripts";
private static string stylesFolder =
"SyntaxHighlighter2/styles";
protected void Page_Load(object sender, EventArgs e)
{
if (Security.IsAuthenticated)
{
aUser.InnerText =
"Welcome " + Page.User.Identity.Name + "!";
aLogin.InnerText = Resources.labels.logoff;
aLogin.HRef =
Utils.RelativeWebRoot + "Account/login.aspx?logoff";
}
else
{
aLogin.HRef =
Utils.RelativeWebRoot + "Account/login.aspx";
aLogin.InnerText = Resources.labels.login;
}
// デフォルトの SyntaxHighlighter version 3.0.83 が
// Enabled になっていない時は version 2.0.320 の
// スクリプトと css 定義を追加。
ManagedExtension extension =
ExtensionManager.GetExtension(extensionName);
if (extension.Enabled == false)
{
AddJavaScript("shCore.js");
AddJavaScript("shLegacy.js");
AddJavaScript("shBrushCSharp.js");
AddJavaScript("shBrushSql.js");
AddJavaScript("shBrushXml.js");
AddJavaScript("shBrushJScript.js");
AddStylesheet("shCore.css");
AddStylesheet("shThemeDefault.css");
AddStartupScript();
}
}
private void AddJavaScript(string scriptFilename)
{
HtmlGenericControl script =
new HtmlGenericControl("script");
script.Attributes["type"] = "text/javascript";
script.Attributes["src"] =
ResolveScriptUrl(scriptFilename);
Page.Header.Controls.Add(script);
}
private string ResolveScriptUrl(string scriptFilename)
{
return Utils.RelativeWebRoot + "js.axd?path="
+ Utils.RelativeWebRoot + scriptsFolder +
"/" + scriptFilename;
}
private void AddStylesheet(string cssFilename)
{
HtmlLink css = new HtmlLink();
css.Attributes["type"] = "text/css";
css.Attributes["rel"] = "stylesheet";
css.Attributes["href"] =
Utils.RelativeWebRoot + stylesFolder +
"/" + cssFilename;
Page.Header.Controls.Add(css);
}
private void AddStartupScript()
{
Type type = this.GetType();
string scriptname = "SyntaxHighlighterStartupScript";
System.Web.UI.ClientScriptManager manager =
Page.ClientScript;
if (!manager.IsClientScriptBlockRegistered(type,
scriptname))
{
System.Text.StringBuilder sb =
new System.Text.StringBuilder();
sb.AppendLine(
string.Format(
"SyntaxHighlighter.config.clipboardSwf='{0}';",
Utils.RelativeWebRoot + scriptsFolder +
"/clipboard.swf"));
sb.AppendLine("SyntaxHighlighter.all();");
manager.RegisterStartupScript(type, scriptname,
sb.ToString(), true);
}
}
}