WebSurfer's Home

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

Slug の使用

by WebSurfer 2010年6月8日 22:25

URL に使用できる ASCII 文字のみを使って、ポストのタイトルの別名を作って、それを Slug に設定してやれば、そのとおり URL に表示されることを知りました。

例えば、ポストのタイトルが "湘南" だとして、最初に投稿する際 Slug には何も設定しないと、BlogEngine が自動的に "湘南" を "e6b998e58d97" に変換して Slug に設定します。

その結果、ブラウザのアドレスバーなどに表示される URL が、以下のような訳のわからない文字になります。

.../post/2010/05/16/e6b998e58d97.aspx

これは、"湘南" のままでは URL の文字として使用できないので、UrlEncode して、さらに '%' を取り除いた文字列に変換しているからです。(何故 '%' まで取り除いているかは不明)

上記の例は、まだ 2 文字だから我慢出来る範囲かもしれませんが、日本語のタイトルが長くなると、延々と訳のわからない文字列が続いて(全角 1 文字が半角 6 文字に変換されますので)、見栄えが非常によろしくないです。

BlogEngine の自動変換に任せず、自分で Slug に "Shonan" と設定すれば、そのポストの URL は以下のようになります。

.../post/2010/05/16/Shonan.aspx

こうすれば、URL から内容が類推できるようになりますし、それに何といっても見栄え(これが大事(笑))が大幅に改善されるのがいいです。

以前のポスト、BlogEngine の修正 で、「検索」で検索結果の URL 情報が一行に収まらないため、その部分のコードをコメントアウトして表示しないようにしましたが、これによって問題がなくなったので復活させました。

Tags:

BlogEngine.NET

日本語の文字化けの問題(3)

by WebSurfer 2010年6月8日 16:49

Tag cloud の中で日本語の Tag をクリックすると、Tag に関連するポストは正しく表示されるものの、ブラウザのタイトル表示が文字化けします。

例えば、Tag cloud の中の "湘南" をクリックすると、タイトルは All posts tagged '湘南' となるべきところ、All posts tagged 'e6b998e58d97' となってしまいます。

タイトルは、アプリケーションルート直下にある Default.aspx.cs の DisplayTags メソッドの中で、以下のように設定されます。

base.Title = " All posts tagged '" + 
    Request.QueryString["tag"].Substring(1) + "'";

ところが、このクエリ文字列は、UrlEncode してから '%' を除去しているので、上記では UrlDecode されません。(UrlEncode と '%' の除去は、widgets\Tag cloud\widget.ascx.cs の中で Utils.RemoveIllegalCharacters メソッドを使って行っています)

これは DisplayTags メソッドを以下のように直して対応しました。

private void DisplayTags()
{
  if (!string.IsNullOrEmpty(Request.QueryString["tag"]))
  {
    PostList1.ContentBy = ServingContentBy.Tag;
    List<Post> posts = 
      Post.GetPostsByTag(Request.QueryString["tag"].Substring(1));
    PostList1.Posts = 
      posts.ConvertAll(new Converter<Post, IPublishable>(p => p as IPublishable));
    foreach (string t in posts[0].Tags)
    {
      if (Utils.RemoveIllegalCharacters(t).Equals(
         Request.QueryString["tag"].Substring(1),
         StringComparison.OrdinalIgnoreCase))
      {
        base.Title = " All posts tagged '" + t + "'";
        break;
      }
    }
    base.AddMetaTag("description", 
      Server.HtmlEncode(BlogSettings.Instance.Description));
  }
}

ところが、ポスト欄の左下に「Tag: XXXX」というリンクがありますが、この URL のクエリ文字列は UrlEncode がされたのみになっています。('%' は除去されていない。例えば、"湘南" は "%e6%b9%98%e5%8d%97" となります)

これをクリックすると、Tag cloud の中のリンクをクリックしたのと同様に、Default.aspx.cs の DisplayTags メソッドの中で処置されます。そこで、GetPostsByTag メソッドで再度 RemoveIllegalCharacters が引数の文字列に適用され、'%' は除去されるので、正しく Tag に関連する posts が得られますが、foreach の中で一致する t がない(if 文の条件が true にならない)のでタイトルが設定されません。

その結果、ブラウザのタイトルは、All posts tagged 'XXXX' としたいところ、 http://surferonwww.info/BlogEngine... のようになってしまいます。

これは、BlogEngine.Core の中の Web\Controls\PostViewBase.cs の TagLinks メソッドを以下のように直して対応しました。

protected virtual string TagLinks(string separator)
{
  if (Post.Tags.Count == 0)
    return null;

  string[] tags = new string[Post.Tags.Count];
  string link = "<a href=\"{0}/{1}\" rel=\"tag\">{2}</a>";
  string path = Utils.RelativeWebRoot + "?tag=";
  for (int i = 0; i < Post.Tags.Count; i++)
  {
    string tag = Post.Tags[i];
    // 以下で、オリジナルの HttpUtility.UrlEncode(tag) を変更。
    tags[i] = string.Format(CultureInfo.InvariantCulture, 
      link, path, BlogEngine.Core.Utils.RemoveIllegalCharacters(tag), 
      HttpUtility.HtmlEncode(tag));
  }
  return string.Join(separator, tags);
}

クエリ文字列は UrlEncode だけでよさそうな気がしましたが、わざわざ Widget の Tag cloud の方で RemoveIllegalCharacters を使うように変更したのは何か理由がありそうなので、それに合わせることにしました。

Tags: ,

BlogEngine.NET

日付表示の変更(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

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。

Calendar

<<  2024年3月  >>
252627282912
3456789
10111213141516
17181920212223
24252627282930
31123456

View posts in large calendar