「銀杏の木」の左側に、タグクラウドを追加した。

任意で記事に設定する Keys タグのキーワードが何個設定されているかをカウントして表示し、リンクをクリックするとその言葉で検索する形にしてみた。  Keys タグに出てきた数なので、実際の記事中に出現する回数ではない。

この追加のために、 rnote.php 本体と、プラグインの navitools.php, スキンファイルの html.side.skin に変更を加え、 file.cache に書き込まれるエントリに、 Keys タグの内容も追加するようにして実現させた。

navitools.php のプラグインには、新たに、 “tag_cloud” を追加し、

<%=$plugin name="navitools" func="tag_cloud" opt="min_count=3,max_size=200" %>

のような形で呼び出せるようにした。追加した tag_cloud は下の通り。


    //==========================================================================
    // タグクラウド Added by Crabfish
    //==========================================================================
    function tag_cloud($opt)
    {
        global $g_keyslist;            // キーごとの設定回数情報

        //echo 'opt=['.$opt.']<br />';
        //opt に設定されている値を取得する。
        $min_count = 1;
        $max_size = 200;
        if (isset($opt)) {
            $tok = strtok($opt, ",");
            while ($tok) {
                list($lvalue, $rvalue) = explode("=", $tok, 2);
                //echo 'lvalue=['.$lvalue.'] rvalue=['.$rvalue.']<br />';
                switch ($lvalue) {
                case 'min_count':
                    $min_count = intval($rvalue);
                    if ($min_count < 1) $min_count = 1;
                    break;
                case 'max_size':
                    $max_size = intval($rvalue);
                    if ($max_size < 100) $max_size = 100;
                    break;
                }
                $tok = strtok(",");
            }
        }
        //echo 'min_count=['.$min_count.']<br />';
        //echo 'max_size=['.$max_size.']<br />';
        $min = 65536;
        $max = 0;
        //キーの出現回数の最大値、最小値を取得する。
        foreach ($g_keyslist as $k => $v) {
            if ($max < $v) $max = $v;
            if ($min > $v) $min = $v;
        }
        $dif = (($max - $min) > 0) ? ($max - $min) : 1;
        $i = 0;
        $rep = '';
        foreach ($g_keyslist as $k => $v) {
            if ($v >= $min_count) {
                $rep .= '<span class="key"><a style="font-size: '.(($v-$min)/$dif*100+($max_size-100)).'%; line-height: 150%; white-space: nowrap;" href="/ichounoki/rnote/';
                $rep .= MakeLinkUrl().'?m=search&cache=off&q='.$k.'&u=&cmt=1∧=1';
                $rep .= '">'. $k . '</a></span> ';
            }
            $i++;
        }
    
        return $rep;
    }

    //==========================================================================
    // タグクラウド Added by Crabfish
    //==========================================================================
    function tag_cloud($opt)
    {
        global $g_keyslist;            // キーごとの設定回数情報

        //echo 'opt=['.$opt.']<br />';
        //opt に設定されている値を取得する。
        $min_count = 1;
        $max_size = 200;
        if (isset($opt)) {
            $tok = strtok($opt, ",");
            while ($tok) {
                list($lvalue, $rvalue) = explode("=", $tok, 2);
                //echo 'lvalue=['.$lvalue.'] rvalue=['.$rvalue.']<br />';
                switch ($lvalue) {
                case 'min_count':
                    $min_count = intval($rvalue);
                    if ($min_count < 1) $min_count = 1;
                    break;
                case 'max_size':
                    $max_size = intval($rvalue);
                    if ($max_size < 100) $max_size = 100;
                    break;
                }
                $tok = strtok(",");
            }
        }
        //echo 'min_count=['.$min_count.']<br />';
        //echo 'max_size=['.$max_size.']<br />';
        $min = 65536;
        $max = 0;
        //キーの出現回数の最大値、最小値を取得する。
        foreach ($g_keyslist as $k => $v) {
            if ($max < $v) $max = $v;
            if ($min > $v) $min = $v;
        }
        $dif = (($max - $min) > 0) ? ($max - $min) : 1;
        $i = 0;
        $rep = '';
        foreach ($g_keyslist as $k => $v) {
            if ($v >= $min_count) {
                $rep .= '<span class="key"><a style="font-size: '.(($v-$min)/$dif*100+($max_size-100)).'%; line-height: 150%; white-space: nowrap;" href="';
                $rep .= MakeLinkUrl().'?m=search&cache=off&q='.$k.'&u=&cmt=1∧=1';
                $rep .= '">'. $k . '</a></span> ';
            }
            $i++;
        }
    
        return $rep;
    }

min_count は、タグクラウドに表示させる最小出現回数。これ未満の回数のものは表示しない。

max_size は、タグクラウドを表示する際に、タグの出現回数に応じてフォントサイズを変えるようにしたので、その際の最大表示パーセント値。最小サイズは100%固定にした。

タグクラウドは一時期のように流行ってはいないが、実装作業は楽しかった。

[コメントの受付は終了しています ]
この記事のリンク元 | 1 |

mt_allow_comment の値を確認 2018-12-16 (日) 00:51:38+09:00

ソフトウェア

Open Live Writer を用いて metaWeblog::newPost, metaWeblog::editPost で投稿して、 mt_allow_comment に何が送られてくるか確かめた。

None を選んで投稿したとき:

<member>
   <name>mt_allow_comments</name>
   <value>
   <int>0</int>
   </value>
  </member>

が、送られてきた。

Open を選んで投稿したとき:

<member>
   <name>mt_allow_comments</name>
   <value>
   <int>1</int>
   </value>
  </member>

が、送られてきた。

Closed を選んで投稿したとき:

<member>
   <name>mt_allow_comments</name>
   <value>
   <int>2</int>
   </value>
  </member>

が、送られてきた。


64ビット関係のPHP7の日時を扱う関数、クラスが64ビットの unix time を何の問題もなく処理できるか、ふと気になったのでこちらを参考に、試してみた。

(1) strtotime は32ビットを超える日時は、入力される年が4桁までなら正しく unix time を出力できるが、5桁以上は正しく出力できない。

(例)
var_dump(strtotime('9999-12-23'));
(結果)int 253401490800
var_dump(strtotime('12345-12-23'));
(結果)int 1135308840

(2) strftime は32ビットを超える unix time は、結果の年が4桁までなら正しく変換できるが、5桁以上は変換できない。

(例)
print strftime("%Y-%m-%d %w %H:%M:%S", 253401490800);
(結果)9999-12-23 4 00:00:00
print strftime("%Y-%m-%d %w %H:%M:%S", 2534014908000);
(結果)

(3) date は、32 ビットを超える unix time を正しく日時に変換できる。

(例)
print date("Y-m-d H:i:s", 2534014908000);
(結果)82269-09-26 15:00:00

(4) DateTime クラスは、32ビットを超える unix time を正しく日時に変換できるが、日時から unix time への変換は年が5桁以上になる場合は正しく変換できない。

(例)
$d = new DateTime();
$d->setTimestamp(2534014908000);
echo $d->format('Y-m-d\TH:i:s u v');
(結果)82269-09-26T15:00:00 000000 000
$d = new DateTime('12345-12-23');
print $d->getTimestamp();
(結果)1135308840

上のような結果になった。

とりあえず、西暦9999年までは、どの関数、クラスを使っても問題ないようだが、年が5桁以上になると正常動作しないものがちらほらあるので、すっきりとはしない。PHP7より前の Windows のPHPでは、 int のサイズはプラットフォームに依らず32ビット固定だったが、PHP7でせっかく64ビットにも対応したのだから、標準関数、クラスも完璧に動作するようにコードを書いて欲しかった。


オリジナルの rNote では、記事表示部分の上に表示されるナビゲーション部分、

>「」へのコーナーを表示中です。(全部で???件の投稿があります。)

の部分も、サブカテゴリのディレクトリ works/software を作り、カテゴリ名に「冬星のソフトウェア」と指定した場合に、

>「ホーム/works/ソフトウェア

のように表示されてしまう。

これを、

>「ホーム/works/冬星のソフトウェア」のコーナーを表示中です。(全部で???件の投稿があります。)

のように表示できるように修正した。

rnote.php の function Navi_ForthBack(&$fi,$opt) の中の、

    // Category name
    $d0 = explode("/",$dir);
    if(isset($category_name[''])) $cn=$category_name['']; else $cn='Home';
    $category = '<a href="'.MakeLinkUrl().'">'.$cn.'</a>';
    $dd = '';
    foreach($d0 as $a) if($a){
        $cn = $a; if(isset($category_name[$cn])) $cn=$category_name[$cn];
        $dd .= $a.'/';
        $category .= '/<a href="'.MakeLinkUrl($dd).'">'.$cn.'</a>';
    }

の部分を、下のように修正する。

    // Category name
    $d0 = explode("/",$dir);
    if(isset($category_name[''])) $cn=$category_name['']; else $cn='Home';
    $category = '<a href="'.MakeLinkUrl().'">'.$cn.'</a>';
    $dd = '';
    $cd = '';
    foreach($d0 as $a) if($a){
        if ($cd == '') $cd = $a; else $cd .= '/' . $a;
        if(isset($category_name[$cd])) $cn=$category_name[$cd];
        $dd .= $a.'/';
        $category .= '/<a href="'.MakeLinkUrl($dd).'">'.$cn.'</a>';
    }

これで、希望するような形で表示されるようになる。

キーワード: rNote ナビゲーション