WebSurfer's Home

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

SyntaxHighlighter とフラグメント識別子

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 関係のスクリプトが動くとこの問題が起こるようです。でも、意図的に書き換えているわけではなさそうな感じです。

気にするほどのことでもなさそうですが、原因不明のまま放置するのも気分が良くないし、といって解決策は見つからないしで悩んでいます。

Tags: ,

BlogEngine.NET

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

About this blog

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

Calendar

<<  2017年5月  >>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

View posts in large calendar