WebSurfer's Home

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

日付表示の変更(3)

by WebSurfer 2010年6月6日 16:20

日付の表示が日本向きでないところがもう一箇所見つかりました。

ウィジェットの Month List または Calendar をクリックして選択されたページを表示したとき、タイトルが日付で表示されるのですが、下の写真のように米国向けの表示になります。

Title の日付表示

どうでもよさそうな細かいこととは思いますが、この際徹底的に直すことにしました(笑)。

この Title をレンダリングしているのはブログアプリのルート直下にある Default.aspx.cs の中の DisplayDateRange メソッドです。

その部分を、ブラウザの言語設定が日本語(ja-JP または ja)になっている場合は、"2010年6月6日" の形式で表示されるよう、以下のように修正しました。

private void DisplayDateRange()
{
  // ・・・中略・・・
  if (!string.IsNullOrEmpty(year) && 
      !string.IsNullOrEmpty(month))
  {
    // ・・・中略・・・
    PostList1.Posts = 
     Post.GetPostsByDate(dateFrom, dateTo).ConvertAll(
       new Converter<Post, IPublishable>(
         delegate(Post p) { return p as IPublishable; }));
    // 以下の部分を修正。
    System.Globalization.CultureInfo ci = 
      System.Threading.Thread.CurrentThread.CurrentUICulture;
    if (ci.Name == "ja-JP" || ci.Name == "ja")
    {
      Title = dateFrom.ToString("yyyy年M月");
    }
    else
    {
      Title = dateFrom.ToString("MMMM yyyy");
    }
  }
  else if (!string.IsNullOrEmpty(year))
  {
    // ・・・中略・・・
  }
  else if (!string.IsNullOrEmpty(specificDate) && 
           specificDate.Length == 10)
  {
    // ・・・中略・・・
    PostList1.Posts = 
     Post.GetPostsByDate(dateFrom, dateTo).ConvertAll(
       new Converter<Post, IPublishable>(
         delegate(Post p) { return p as IPublishable; }));
    // 以下の部分を修正。
    System.Globalization.CultureInfo ci = 
     System.Threading.Thread.CurrentThread.CurrentUICulture;
    if (ci.Name == "ja-JP" || ci.Name == "ja")
    {
      Title = date.ToString("yyyy年M月d日");
    }
    else
    {
      Title = date.ToString("MMMM d. yyyy");
    }
  }
  // ・・・中略・・・
}

Tags:

BlogEngine.NET

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 のみのようです。

Tags:

BlogEngine.NET

reCaptcha の実装

by WebSurfer 2010年5月25日 22:18
reCaptcha の実装

BlogEngine 1.6.1 で新機能として追加された reCaptcha を実装しました。

データのストアが DB で(XML ではなく)、かつ、reCaptcha の Logging を有効にしていると現れるバグがあって、解決に手間取りましたので、そのあたりのことを備忘録として書いておきます。

匿名ユーザーがコメントを書き込もうとすると "Sorry, the following error occurred while processing your comment: コールバックでエラーが発生しました" というメッセージが出て書き込めないことでこの問題に気がつきました。

ググって調べてみると、CodePlex のサイトの Dicsussion のページで同じ問題の報告があって、バグがあることが分かりました。

問題は、以下の 2 つのファイルの中での LoadFromDataStore メソッドの戻り値の処置です。

  • \admin\Pages\RecaptchaLogViewer.aspx.cs
  • \App_Code\Extensions\Recaptcha\RecaptchaControl.cs

ストアが DB の場合は String 型、XML の場合は Stream 型として処置すべきところ、いずれも以下のように Stream 型として処置しているので、DB をストアに使用した場合にエラーとなります。

Stream s = (Stream)BlogService.LoadFromDataStore(BlogEngine.Core.DataStore.ExtensionType.Extension, "RecaptchaLog"); List<RecaptchaLogItem> log = new List<RecaptchaLogItem>(); if (s != null) { System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(List)); log = (List<RecaptchaLogItem>)serializer.Deserialize(s); s.Close(); }

これを以下のように修正しました(CodePlex に出ていたコードと同じ内容です)。

string s = (string)BlogService.LoadFromDataStore(BlogEngine.Core.DataStore.ExtensionType.Extension, "RecaptchaLog"); List<RecaptchaLogItem> log = new List<RecaptchaLogItem>(); if (!String.IsNullOrEmpty(s)) { using (StringReader reader = new StringReader(s)) { System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(List<RecaptchaLogItem>)); log = (List<RecaptchaLogItem>)serializer.Deserialize(reader); } }

BlogEngine.Core の中にある LoadFromDataStore メソッドの方を修正する手もありそうですが、それは止めた方がよさそうです。何故なら、旧版 (1.5) では MemoryStream に変換して return するようにしているのに 1.6.1 で意図的に止めているところを見ると、何らかの理由がありそうなので。

あと、何故、認証されたユーザーなら書き込めるかも調べてみました。理由は、デフォルトの設定では、認証ユーザーの場合 reCaptcha の Logging がスキップされるので、問題のコードに処理が飛ばないためでした。

上記の修正後は CodePlex の Documentation に書いてあったとおりの手順で簡単にインストールでき、とりあえず今のところ問題なく動いています。

でも、ただでさえメールアドレスの入力が面倒なのに、これでさらに面倒になって誰もコメントしてくれなくなってしまうかもしれませんね。(汗)

追伸1
reCaptcha の Key の取得で、登録したドメインでのみ有効するのと、Global Key といってドメインに関係させない 2 つのオプションがあります。取得できる Key の数に制限はないので、自分は、本番用に前者を、開発用に後者を取得して使っています。

追伸2
コントロールパネルで Status の Enabled/Disabled の切り替えを行うと、web.config を書き換えに行くように見えます。これはファイルの中身を書き換えているのではなく、単に timestamp を変更するだけで、その理由はアプリケーションをリサイクルするためだそうです。(最初、これが原因かと思いましたがそうではなかったです。)

Tags:

BlogEngine.NET

About this blog

2010年5月にこのブログを立ち上げました。その後 ブログ2 を追加し、ここは ASP.NET 関係のトピックス、ブログ2はそれ以外のトピックスに分けました。

Calendar

<<  2017年3月  >>
2627281234
567891011
12131415161718
19202122232425
2627282930311
2345678

View posts in large calendar