皆さま、いかがお過ごしでしょうか歌乃です。

以前の記事で紹介したReadingTimeプラグインですが、今回サイトの再構築中に不具合を発見してしまいました。

ReadingTime プラグインは文字数による記事読破予想時間を表示する拡張機能なのですが、設定項目に「画像閲覧時間の追加」というのがあり、ページの閲覧者が画像を見る時間を設定して、その合計を記事読破予想時間に追加するような仕様になっています。

当サイトでも画像コンテンツを多用しているので、画像閲覧時間の追加設定を有効にしていたのですが


(。´・ω・)ん?

grav-readingtime-issue01

お気づき頂けただろうか?

何という事だろう。秒数が「75秒」になっているではないか。

これはいったいどうしたことだろう。

60進法という、明らかに日常からかけ離れた法則を押し付けてくる不条理極まりない「時刻」なんていう存在の癖に、こんどは75進法になったとでもいうのだろうか。私はまたそういう世界線にまよいこんだのか ( ゚Д゚)

原因

ということで原因を調べました。

意外と簡単に見つかりました。
以下は画像閲覧時間が有効になった場合に実行される画像閲覧時間の計算と、算出された画像閲覧時間をページ読破予想時間に追加する処理部分のコードです。

// TwigReadingTimeFilters.php
~~~
      if ($images_in_content > 0) {
        if ($this->validatePattern($options['seconds_per_image'])) {

          // assumes string only contains integers, commas, and whitespace
          $spi = preg_split('/\D+/', trim($options['seconds_per_image']));
          $seconds_images = 0;

          for ($i = 0; $i < $images_in_content; ++$i) {
            $seconds_images += $i < count($spi) ? $spi[$i] : end($spi);
          }

          $minutes_short_count += floor($seconds_images / 60);
          $seconds_short_count += $seconds_images % 60;
        } else {
          $this->grav['log']->error("Plugin 'readingtime' - seconds_per_image failed regex vadation");
        }
      }
~~~

変数 $seconds_short_count には読破予想時間の秒数部分が入っており、そこに画像閲覧時間の合計変数 $seconds_images を60で割った余りを追加する形になっています。

一見これでも問題なく動くように見えますが、$seconds_short_count と $seconds_images がどちらも大きい場合に60を超えるパターンが発生してしまいます。

なので以下のように計算を追加することに。

// TwigReadingTimeFilters.php
~~~
          $minutes_short_count += floor($seconds_images / 60);
          $seconds_short_count += $seconds_images % 60;

          $minutes_short_count += floor($seconds_short_count / 60);
          $seconds_short_count = $seconds_short_count % 60;
~~~

$seconds_short_count を60で再計算して商は $minutes_short_count に追加し、剰余を $seconds_short_count の値とすることで対応しました。


多分これであってるはず。合ってるよね!?(´・ω・`)


Post If you feel like it, I would be happy if you could post it.