rNote-re について

rNote-re は、 Woody-Rinn さん作 rNote を冬星がいろいろといじったものです。

主な特徴:

  • PHP のカレントバージョンである PHP8, PHP7 で動作するように修正(残念ながら rNote は PHP7 以上では動作しないのです。)。
  • オンラインでの記事書き込みツールを管理画面に用意。(とみらさんの rnotepad.php の修正版。)
  • XML-RPC を用いた記事の投稿が可能。画像ファイルを挿入した記事の投稿も可能。( Open Live Writer で動作確認済み。)対応 API は MovableType, Blogger, MetaWeblog 。
  • プラグインの種別を拡張し、 rNote 標準の「ナビゲーションツール系プラグイン」( body スキンで使用)、「管理画面プラグイン」( rnoteadmin.php から呼び出される)に加え、「コールバックプラグイン」を追加。
  • 投稿されたコメントを管理画面で承認して初めて公開されるように「コメントの承認制」を導入。

rNote-re は公開する予定は今のところありません。 rNote-re に関するページは、あくまで冬星が自分で確認・参照するために作成しています。


以前、「ブログにタグクラウドを追加してみた」に書いたとおり、 rNote にタグクラウドの処理を追加したが、そのときは、 rnote.php 本体に実装して実現した。

最近、コールバックプラグインの処理を実装したので、これを使ってタグクラウドの処理もプラグイン化することにした。

rnote.php の CreateHTML() が呼ばれるタイミングで起動されるコールバックプラグインを追加し、これを "createhtml" タイプとして追加した。

このコールバックプラグインが呼ばれると、グローバル変数 $g_keyslist を、タグと参照回数の連想配列として初期化する。

一方で、スキンから呼び出される(コールバックではない)プラグインが、 $g_keyslist の内容をもとにタグクラウドを生成し出力するようにした。

今回ちょっと面白いのは、上記2つのプラグイン(コールバックプラグインとコールバックではないプラグイン)を、1つのクラスとして実装し、1つの .php ファイルの中に記述したことだ。

つまり、1つのクラスで2つの種類のプラグインを表現している。こういうこともできるのだと我ながら感心した。

この記事のリンク元 | 9 | 8 |

この記事のリンク用URL&トラックバックURL : https://red-souls.jp/ichounoki/rnote/works/software/20190815_210316931286.htm


rNote の検索プラグイン search.php の動作を修正した。

search.php は、各記事の .xml ファイルを全て読み込み検索処理を行うが、その際、 .xml ファイル内のタグの内容だけでなく、タグ自身も検索対象に含むかどうかを選択するフラグがある。

このフラグがデフォルトで true にセットされていた。なので、検索文字列として rNote と入力した場合、全ての記事がヒットしていた。

これでは意味がないので、 記事の .xml ファイルのタグ自身は検索対象から外すよう、フラグを false にした。

ところが、このときの動作として、

  $entry_buf = _file_get_contents(DIR_DATA . $fname);

if(!$this->bSearchTags){

$entry_buf = strip_tags($entry_buf);

というように、 strip_tags() の結果を使用して検索している。これだと、記事内の全てのタグの内容が無条件に検索対象になってしまうので、意図しない結果をもたらす。これではまずい。

そこで、検索対象とするタグを Title, Text, Addition, Keys に限定することにした。それぞれ、記事の題名、本文、追記、キーワードである。

これで、例えば rNote を検索文字列に指定した場合でも、正しく rNote が題名、本文、追記、キーワードに含まれる場合のみヒットするようになった。

この記事のリンク元 | 9 | 8 |

この記事のリンク用URL&トラックバックURL : https://red-souls.jp/ichounoki/rnote/software/20190815_110247206760.htm


cookie の処理の問題、解決 2019-08-14 (水) 18:47:06+09:00

ソフトウェア

もう解決しました(笑)。

管理画面用プラグイン化した rnotepad.php のクラスの冒頭で <script> タグで直書きされていた javascript コードを、丸ごと変数に代入しておき、 disp() メソッドで作られるページの中身に javascript 部分を追加する形にすることで、他のプラグインの実行時に影響しないようにすることができた。

直書きされているとなぜ、動作設定プラグインの実行時にも javascript が出力されてしまうかというと、動作設定プラグインで「この内容で設定する」ボタンを押した場合に、値が post され ranoteadmin.php が読み込み直されるときに、ボタンの表示部分の処理で、全てのプラグインの require_once での読み込み処理が走り、そこで javascript が読まれて出力されてしまっていた。

今回は、これを、 rnotepad クラスの disp() メソッドが呼ばれたときにだけ出力するようにしたので、他のプラグインへの影響をなくすことができたというわけだ。

意外と早く完全な解決方法が見つかってよかった。

同時に、 config.php (動作設定プラグイン)のバグも修正することができた。

こちらは、setcookie() で cookie が設定されたときに、その設定内容がリロードされるまで $_COOKIE に変更内容が反映されないことに気づかず、 filter_input(INPUT_COOKIE,COOKIE_TESTFLAG) を実行して cookie の値を取得してしまっていたため、リロードがかかるまでラジオボタンの位置の変更が反映されなかった。 $_COOKIE[COOKIE_TESTFLAG] で読み取る方法に戻すことで、修正することができた。( setcookie() 直後に $_COOKIE に変更後の値を直接代入しておく処理はオリジナルの状態から書かれていた。)

この記事のリンク元 | 9 | 8 |

この記事のリンク用URL&トラックバックURL : https://red-souls.jp/ichounoki/rnote/software/20190814_184706405292.htm


うーん、困った 2019-08-14 (水) 14:37:23+09:00

ソフトウェア

rnotepad を管理者画面に組み込んだのは良かったが、問題が起きた。

「動作設定」を実現させているプラグイン config.php 内で cookie を使用しているのだが、 setcookie() 関数が動作しなくなってしまった。

理由を調べて分かったが、「setcookie」によると setcookie() は、

ほかのヘッダ情報と同様に、 クッキーは、スクリプトによる他のあらゆる出力よりも前に 送信される必要があります(これはHTTPプロトコルの制約です)。 や タグはもちろん 空白も含め、あらゆる出力よりも前にこの関数をコールするようにしなければなりません。

ということだが、 rnotepad.php では、 javascript を使用している。

それのどこがいけないかというと、 rnoteadmin.php の動作として、管理画面用のプラグインを順にファイルから require_once() で読み込む。そのとき読み込んだプラグイン内に javascript のコードが含まれていると、その場で

<script type="text/javascript"> 〜 </script>

が出力されてしまうのだ。その結果、 setcookie() は失敗する。

動作設定の画面で「この内容で設定する」ボタンを押すと、 config.php が呼ばれ、毎回上のような動作になるので、必ず setcookie() は失敗してしまう。

これを回避するには、先日実装したコールバックプラグインの機能を使い、新たに「 rnoteadmin.php が読み込まれ、管理画面用プラグインが読み込まれる前に実行するコールバック」を追加し実装するしかないが、そうすると、 config.php の処理が2つのファイルに分かれてしまい、見通しが非常に悪くなるのでやりたくない。

いっそ、 config.php の今の実装を見直し、「携帯用ページをテスト」のフラグを他の項目同様 cookie ではなく config.ini を用いるように変更してしまえば cookie を使わないので、とりあえず問題は回避されるが、 cookie を使わずに特定のブラウザからのみ携帯用ページを表示させてテストするという動作を実現させる方法が分からない。それに、 cookie の使用をやめて回避したのでは、今後 cookie を使用したくなったときに困るので、これは単なる逃げであり解決ではない。

う〜ん、これは困った・・・。どうすべきか。

この記事のリンク元 | 10 | 8 |

この記事のリンク用URL&トラックバックURL : https://red-souls.jp/ichounoki/rnote/software/20190814_143723512439.htm