by WebSurfer
2020年5月4日 13:36
ここ「ブログ1」は BlogEngine.NET 1.6.1 を利用しており、そのプラグインとして用意されている SyntaxHighlighter のバージョンは 2.0.320 です。今回それをバージョン 3.0.83 にアップグレードしました。
理由は、バージョン 2.0.320 は Flash を利用しているのですが、Flash はセキュリティ上の問題があるらしく最新のブラウザではデフォルトで無効になっており、その警告が煩わしかったからです。バージョン 3.0.83 は Flash を使っていません。
バージョン 2.0.320 と 3.0.83 で表示がどのように変わるかというと、以下の画像の通りです。
2.0.320
3.0.83
自分としてはバージョン 2.0.320 の表示の方が好みなのですが、Flash に対するブラウザの警告の煩わしさに負けました。(笑)
どのようにしたかと言うと、「ブログ2」の BlogEngine.NET 2.0.0.36 のプラグインとして用意されている SyntaxHighlighter 3.0.83 のファイルをコピーしてきて、それを使えるようコードを追加しました。
具体的には先の記事「SyntaxHighlighter 2.0.320 の実装」で書いたのと同様なことをしたわけです。(先の記事はデフォルトの 3.0.83 を 2.0.320 に切り替えられるようにしたが、ここでは逆にデフォルトの 2.0.320 を 3.0.83 に切り替えられるようにした)
簡単に言うと、「ブログ1」のアプリケーションルート直下に新たに SyntaxHighlighter3 フォルダを追加。その下の scripts, styles フォルダの中に「ブログ2」から 3.0.83 用の .js, .css ファイルをコピー。マスターページ site.master でデフォルトの SysntaxHighlighter が Enable か否かを判定し Enable でないときは 3.0.83 の .js と .css の参照をレンダリングするコードを追加です。
以前、バージョン 3.0.83 の shCore.js が取り込まれると、IE6 ~ IE8 で JavaScript パーサーが jQuery.js をうまく解釈できないという問題があったのですが、IE11 では問題はなくなっています。なので、「ブログ1」と「ブログ2」どちらも SyntaxHighlighter 3.0.83 を使うように設定を変えました。
by WebSurfer
2010年6月11日 12:35
IE6 または IE8 で(IE5 以前、IE7 は試してません)、SyntaxHighlighter を使用しているページの URL にフラグメント識別子を追加して要求すると、HTML の title タグに設定したタイトルがフラグメント識別子に書き換えられてしまうという問題が見つかりました。
どうも IE と SyntaxHighlighter の相性の問題のようで、Firefox 3.6.3, Opera 10.53, Safari 4.0.5 では問題なかったです。
このブログで試すには、以下のリンクをクリックしてみてください。
タイトルがフラグメント識別子に書き換えられる例
ブラウザにはまず上記リンクの URL がタイトルとして表示され、次に受信した HTML コードの title タグに設定されたタイトル "SyntaxHighlighter" に書き換えられ、最後にフラグメント識別子 "#fragment" に書き換えられるはずです。
原因が特定できていませんが、クライアント側のみの問題で、SyntaxHighlighter 関係のスクリプトが動くとこの問題が起こるようです。でも、意図的に書き換えているわけではなさそうな感じです。
気にするほどのことでもなさそうですが、原因不明のまま放置するのも気分が良くないし、といって解決策は見つからないしで悩んでいます。
by WebSurfer
2010年5月29日 17:07
SyntaxHighlighter 2.0 Extension For BlogEngine.NET を導入してみました。前のエントリのコード表示と比べて、かなり見栄えがよくなったと思いますが、いかがでしょうか?
private void RemoveSetting(string settingName)
{
foreach (ManagedExtension x in ExtensionManager.Extensions)
{
if (x.Name == extensionName)
{
// x.Initialized(settingName) ではコンパイルエラー。以下に変更
if (x.Initialized(ExtensionManager.GetSettings(extensionName, settingName)))
{
foreach (ExtensionSettings y in x.Settings)
{
if (y.Name == settingName)
{
x.Settings.Remove(y);
break;
}
}
ExtensionManager.SaveToStorage(x);
}
break;
}
}
}
このソースコードは CodePlex のサイト から入手できます。
SyntaxHighlighter の 本家のサイト からダウンロードできるのは JavaScript と CSS のみですが、CodePlex からダウンロードできるものは、それらに加えて、BlogEmgine.NET に統合して操作するためのコード(Admin.aspx, Admin.aspx.cs, SyntaxHighlighter.cs)が含まれています。
ただし、Admin.aspx.cs にバグがあって、修正しないとエラーで動きません。上記の 8 行目(ハイライトした行)のように修正すれば OK です。
このコードは、JavaScript や CSS を追加したり削除したりした場合、それをコントロールパネルに反映させるためのものです。
例えば、不要な JavaScript を scripts フォルダから削除した場合、コントロールパネルの Brushes の一覧から当該アイテムを削除するには、[Update Brush List] ボタンをクリックしますが、そのときに RemoveSetting メソッドを使うようです。
BlogEngine と SyntaxHighlighter をキーワードにググってみても、上記の問題が報���されているページは見あたらなかったのが不思議です。
Initialized メソッドは、ManagedExtension クラスの中で以下のように定義されていて、引数が String のオーバーロードもないので、上記のように直さないとコンパイラも通らないのですが。
public bool Initialized(ExtensionSettings xs)
{
if (xs != null)
{
foreach (ExtensionSettings setItem in _settings)
{
if (setItem.Name == xs.Name)
{
if (setItem.Parameters.Count == xs.Parameters.Count)
{
return true;
}
}
}
}
return false;
}
---------------------------------------------------
2010/5/31 追記
IE8 以外のブラウザでどう見えるか試してみましたが、Firefox 3.6.3, Safari 4.0.5 では表示が乱れ、クリップボードで取得したコードをメモ帳にペーストすると改行がうまくいきません。IE6, Opera 10.53 も若干問題ありでした。IE7 は試せる環境がないので分かりません。どうも、問題ないのは IE8 のみのようです。