2015年7月2日

記事抜粋の処理がうまくいかないことがある


 トップページの記事抜粋が「半角と全角」が混ざった記事で正しく動かないケースがありましたので暫定的な対処方法

現象と不具合が発生する場所と対処方法


 現在の記事抜粋は、Javascriptを使って記事から文字列の切り出しを行っています。 切り出しが正しく動作しない事例がいくつか見られましたので対処します。

不具合の現象


記事の抜粋が53文字より長く表示されることがありました。 全角文字(日本語文字)と半角文字(アルファベットなど)が混ざった文章の場合で組み合わせによって発生したり、しなかったり。

不具合が発生するプログラムの場所 


 不具合が発生する場所を探してみると、Javascript中substringコマンドが想定していいた通りに動作していません。

 substring構文は、str.substring(0,切り出す文字数)として利用することで文字列中から任意の長さの文字を取り出すことができます。 (0は文字列初めからという意味)

現状は切り出し文字長は固定ですのでとても単純な処理ですが、渡す文字列によっては正しく処理できないことがあるということでしょう。

 全角文字(2byteコード)を処理する場合に良くおこる不具合としては、全角文字が半分で表示されてしまうことです。 ただ、今回は文字カウントが行われない事で長い文字列(抜粋)が表示されてしまっているようです。

 全文が表示されるわけではありませんのでsubstring内で文字数のカウントが動作しないことが起こるということでしょう。

対処方法(一時的な対処)


 現在の処理をみると、<data:post.body/> で記事本文全文を処理させています。 ここを<data:post.snippet/>とすることで抜粋を生成する元の文字列を140文字としてsubstringへ渡すこととします。

これまでに変更してきたテンプレートの相違部分:
          <div class='topIndexSnippet'>
            <div expr:id='&quot;&quot; + data:post.id'><data:post.snippet/></div>
            <script type='text/javascript'>createSummary(&quot;summary<data:post.id/>&quot;);
            </script>
            <span class='jump-link' style='float:right;padding-top:20px;'><a expr:href='data:post.url + &quot;#more&quot;' expr:title='data:post.title'><data:post.jumpText/></a></span>
          </div>

 処理文字数を減らすことで不具合に遭遇する可能性を減らすこと、処理が少しだけ早くなること、最悪ケースでも140文字表示の抜粋が表示されることですみます。

 本質的な対処としては、全角・半角まじり文であっても正しく切り出し処理ができるプログラムコードを作成する必要があるとおもいます。