WebSurfer's Home

トップ > Blog 2   |   ログイン
APMLフィルター

SyntaxHighlighter 2.0.320 の実装

by WebSurfer 2011年7月3日 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);
    }
  }
}

Tags:

BlogEngine.NET 2.0

About this blog

ここブログ2は日々の出来事、ブログ1はプログラミング関係のトピックスになっています。

Calendar

<<  2024年4月  >>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

View posts in large calendar