書名羅列スクリプト改 reading.php

投稿日:

書名を羅列したHTMLを作成するPHPスクリプトってのを公開しましたところ、稚拙なスクリプトにも関らずそれなりの反応や要望を頂きました。

頂いた要望は

  • EUCだけじゃなくUTF-8やSJISのサイトにも対応させて欲しい
  • 画像が表示出来るといい
  • 表示はSSI式よりもJavaScript式のほうが好ましい

    ざっとこんな感じ。

    ということで、拙作スクリプトを上記要望に添えるようなカタチになるよう書き換えてみました。


    「SJISやUTF-8対応」は、マルチバイト文字列(mbstring)関数が有れば簡単です。最終的に出力する文字列のうち、日本語のものをmb_convert_encoding()で変換すればいいだけ。(内部的にはEUC-JPのまま)

    こうして見ると、多コード対応は最初からしてても良かったですね(^_^;)

    画像表示は、ちょっと苦労しました。

    Amazonのサムネイルサイズ画像は

    https://images-jp.amazon.com/images/P/4757512260.09.THUMBZZZ.jpg <IMG SRC="https://images-jp.amazon.com/images/P/4757512260.09.THUMBZZZ.jpg">

    例えば↑こんなURLで表現されます。

    で、「上記画像をリクエストしてエラーが返って来た場合」という処理を実験してみたのですが、これが上手くいかない。何故か、エラーが出ません。

    実験を繰り返した結果、どうも「https://images-jp.amazon.com/images/P」以下へのリクエストで「存在しないファイル名」を指定した場合、1*1ピクセルの透明画像を返してくる→エラーを返して来ない模様。

    これは言うまでもなく(画像が存在しなくても赤い『×』が出ない、という意味で)非常に良い手なのですが、画像の有無を調べたい場合にはちょっと困る→思案の末、エラーではなく「取得した画像の横幅」を調べるようにしました。

    まず一番小さな(=回線負荷の少ない)サムネイルファイルを探し、これが駄目なら標準サイズ画像を探し、これも無い場合は自前の「無いよ画像」のファイル名を返す...というアルゴリズムで画像ファイル名を生成します。(たぶんどこかで同様の、もっと高級な関数が公開されてると思うんですが、見つけられませんでした(^^;;)

    そのため、羅列する本の数にもよりますが、「ファイル生成」ボタンを押すと、ちょっと考え込んで返ってくるまで時間が掛かります(^_^;) これはファイル作成時に裏でAmazonと通信し、ファイルが有るか無いかを1つ1つ判定しているため。

    JavaScriptでの表示は、こちらで組み込ませて頂いたプチログを、大いに参考にさせて貰いました。外部スタイルシートの使い方とかも、殆どココからパクらせて(^^;貰ってます。重ねて感謝!

    ファイル名 パーミッション ファイル内容
    reading.php 644 スクリプト本体
    reading.log 666 ログファイル
    reading.inc 666 出力JavaScriptファイル
    reading.css 644 スタイルシート
    no-image.png 644 「無いよ」画像

    スクリプト側の設定部分は先頭部に集中してます。

    //初期設定
    $logfile = "reading.log"; //ログファイル名
    $outputfile = "reading.inc"; //出力ファイル名
    $maxcount = 10; //最大ログ数
    $str_width = 100; //書名の最大表示文字幅
    $label = "読みかけの本"; //書名表示部のタイトルラベル
    $close = "true"; //ファイル作成後のウインドウ閉
    $thumb = "true"; //サムネイル表示
    $password = "password"; //動作時のパスワード

    $encoding = "EUC-JP";
    //出力ファイルのエンコーディング形式
    //EUC-JP, UTF-8, SJIS等を指定してください

    $amazon = "crusherfactor-22";
    //AmazonのアソシエイトID。持ってない場合は空にしときませう

    $style = 'https://crusherfactory.net/~yas_/reading/reading.css';
    //スタイルシートのパス

    $noimage = "reading/no-image.png";
    //サムネイルファイルが無い場合に表示する「無いよ」画像。
    //MT等で「呼出元ファイルのディレクトリ変更が予想される」場合は
    //相対指定でなく、ちゃんとURLで指定

    //表示形態等については添付のスタイルシートで調整のこと

    //初期設定終了

    たぶん、太線部さえ設定すればそれで動くだろうと思います。なお、当スクリプトは文字コード/改行コードにEUC/LFを使っているのでWindows付属のメモ帳等では書き換えできません。EUC対応のエディターを使ってください。

    あとは、スタイルシートも含めて適当に変えてください。「文字幅」ってのは「半角文字何文字分に相当する幅か」ということです。全角文字のみだと「設定数値の半分」数の文字が表示されます。

    BookMarkletは前と同じで大丈夫です。Amazonで羅列したい本を表示した状態でBookMarkletを呼び出し、「送信」を押して「ファイル作成」を押すことでインクルードされるJavaScriptファイル「reading.inc」が生成されます。

    040911a.gif

    その後、HTML(またはXHTML)の書名を表示したい部分に

    <script language="JavaScript" src="https://crusherfactory.net/%7Eyas_/reading/reading.inc"></script>

    とか書いておけばOK!(^_^)

    なお、このサイトではたまたまMovable Typeのサイドバーに組み込んで使ってますが、MTの機能を何も使ってないスタンドアロンなスクリプト→mbstring可能なPHPが使える環境であれば、HTMLな非blogサイトでもそのまま使えます。