Windows Live Writer および Open Live Writer で、公開日付指定で記事を投稿した際に、 metaWeblog API newPost, editPost で送信されてくる dateCreated ( dateTime.iso8601 ) の形式は:

<member>
  <name>dateCreated</name>
  <value>
    <dateTime.iso8601>20181209T12:00:00</dateTime.iso8601>
  </value>
</member>
<member>
  <name>date_created_gmt</name>
  <value>
    <dateTime.iso8601>20181209T12:00:00</dateTime.iso8601>
  </value>
</member>

のような表記となっている。

しかし、メモに投稿しておいた「ISO 8601 規格について」通り、 ISO 8601 規格では日付の基本形式である[20181209]と時刻の拡張形式である[12:00:00]は混在させてはならないので、この形式は規格に違反している。

日付の形式に合わせるならば、[20181209T120000]とするのが正しい。


rn_xmlrpc.php を修正 2018-12-08 (土) 15:12:00+09:00

ソフトウェア

Windows Live Writer, Open Live Writer で投稿する場合に、 Writer 側で metaWeblog API, Movable Type API の2種類のアカウントで問題なく使用できるように API の処理を修正した。

rNote の現状の課題:

rNote の構造上、カテゴリ=ディレクトリなので、そのままでは複数カテゴリを指定された記事を実現できない。現在は、複数カテゴリを指定された記事を投稿された場合、先頭に指定されたカテゴリのみを採用し、残りは破棄している。(シンボリックリンクのような機能を追加すれば実現可能だが・・・。)

複数カテゴリを持てるようにするには仕様の検討が必要だが、記事の属性を表すために、既にキーワードを実装しており、キーワードは複数の属性を表現できるため、カテゴリまで複数持たす必要性を感じない。カテゴリにせよキーワードにせよ、使い道は単語をキーに記事を検索する用途だと思うので、キーワードが実装され検索できる以上カテゴリ複数化はしなくていい気がする。

Windows/Open Live Writer の現状の課題:

やはり追記を書く機能がないこと。 Open Live Writer のソースを読むと内部的には mt_text_more を処理しているので、追記をユーザーインターフェースを追加すればよさそう。画面上の部品のレイアウト変更・部品追加と、ブラウザコントロールの追加管理を実装する必要があるので、ちょっと面倒そう。画面上の構成としては Blog Write のとっている形が一番自然でよいと思う。


rn_xmlrpc.php を修正し、Windows Live Writer, Open Live Writer から日付指定で投稿した場合に、正常に日付が設定されるよう修正した。

記事は、 metaWeblog::newPost, metaWeblog::editPost で投稿され、投稿日時は dateCreated パラメータで送信される。 rn_xmlrpc.php XML-RPC Server 側でこのパラメータを受信して記事の投稿日時を設定し公開するところまではまずできたが、公開された記事の日時が意図したものより9時間前のものになっていた。

こうなる理由を探していて、下のような記事が見つかった。

どうやら、 XML-RPC specification によると、 XML-RPC API では dateCreated は ISO8601 形式で送信されるが、タイムゾーンは送信されないことになっているらしい。

What timezone should be assumed for the dateTime.iso8601 type? UTC? localtime?

Don't assume a timezone. It should be specified by the server in its documentation what assumptions it makes about timezones.

Windows Live Writer / Open Live Writer の XML-RPC 送信データを覗いてみると、 metaWeblog::newPost, metaWeblog::editPost での記事の送信で dateCreated を付加する場合、 “20181207T12:00” のようにタイムゾーンのない ISO 8601 形式で送信されているのが分かった。どうしてそうなるのか推測してみた。

  1. 例えば、 Windows/Open Live Writer から、タイムゾーンが “Asia/Tokyo” の地域で、2018年12月7日21時00分を投稿日時として記事を送信した場合:
  2. Windows/Open Live Writer は、 “20181207T12:00:00+09:00” のような ISO 8601 形式をつくり、 metaWeblog::newPost で記事を送信する。
  3. metaWeblog::newPost の内部で使用されているXML-RPC API が dateCreated の ISO 8601 形式の日付情報から時差の部分を除去してしまい( “20181207T12:00” になる)、その後、それを送信する。
  4. 結果的に、時差の部分が無くなった UTC での投稿日時が送信される。
  5. 送られてきた dateCreated の日時をブログ側でそのまま表示すると、 UTC での日時なので9時間前になる。

ということだろう。

他の XML-RPC クライアントからも、同じ状況の日時が送信されるのか不明だが、恐らく同じなのではないかと思う。

この推論をもとに、先ほど紹介した一つ目の記事を参考に、WordPress と同様の動作(タイムゾーンが指定されていなければ日付を UTC として扱う)をするように修正した。記事によると、タイムゾーンがついている場合はそのタイムゾーン情報に従って日付を扱うとされているが、 Windows/Open Live Writer で送信した場合タイムゾーンは無くなることと、そもそもそのようにタイムゾーン付きで ISO 8601 形式の dateCreated を送信してくる動作自体が XML-RPC specification に違反する動作なので、現状この処理(=タイムゾーンがついている場合の動作)は実装していない。

とりあえずは、これで問題なく動作していることを確認した。

2018-12-15 : 上の推論の間違いに気づいたので訂正。

Windows/Open Live Writer が、タイムゾーンが “Asia/Tokyo”の地域で、2018年12月7日21時00分を投稿日時として記事を送信した場合、もし最初に UTC からの時差を付けた ISO 8601 形式の日時を作るのであれば、 “20181207T21:00:00+09:00”とするはずなので、これの時差の部分が除去されても、“20181207T21:00:00”となり、これを PHP はローカル時刻と考えるので、9時間前の時刻にはならない。

ところが実際は9時間前の時刻として表示されるということは、 Windiws/Open Live Writer は最初から UTC の時刻を作成し、しかも末尾に“Z”または“+00:00”を付加していない、あるいは、付加しているが XML-RPC API が “Z”を削除して送信している、ということになる。


気になったので、 Open Live Writer 全体のソースコードを入手して中を覗いてみた。

DhtmkImageVIewers.xml という xml ファイルの中で、どんなものを見つけたら Lightbox を使ったブログだと判断するかが記述されていた。

当該の部分がこれ:

<filePattern>(^|/)lightbox\.js$</filePattern>

つまり、javascript のファイル名は lightbox.js でなければ認識しない。

そこで、使用している lightbox-plus-jquery.js の名前を lightbox.js に変更して試してみた。

2018-12-03

こんな感じに、 Lightbox を認識してくれた。

ファイル名が固定だったとは・・・・・。

実は Open Live Writer だけでなく、 Windows Live Writer も Lightbox を認識した。

ということは、前記事で参考にした Microsoft コミュニティで言われていた「 2.5 から prototype が jQuery に変わったので認識しなくなった」というのは間違いだったということ。 javascript のファイル名が固定だっただけだったのだ。当該記事をよく見ると javascript のファイル名を ‘lightbox-2-6-min.js’ にしているから、そのせいで認識しなかったのだろう。

アプリケーションの開発側が「ファイル名は固定だよ」と一言情報を出してくれていれば済んだことだよなあ・・・。


いろいろなところで紹介されているが(例えばこことか)、 Windows Live Writer は Lightbox に対応しているらしい。

Windows Live Writer でアカウントを作成するときに Lightbox を使用しているブログであると認識されると、画像を貼りつけ選択した状態で画像ツールのプロパティグループにある「リンクオプション」を選ぶと、表示される「ソース画像のオプション」ダイアログに、「Lightbox 2 を有効にする」というチェックボックスが追加され、記事中のタグやエレメントで対応した処理が行われる。

・・・しかし、実際は結局、この機能は動作しないようだ。

2014 年の記事、

Windows live writerのLightbox2.6有効化チェックの表示設定方法

を見ると分かるように、 Lightbox2 では prototype を使用していたが、 Lightbox2.5以降は jQuery を使用するように変わったが、 Windows Live Writer は、 Windows Live Essential 2012 が出た 2012 年以降更新はないまま配布が終了したので、この変更に対応していないため、 Lightbox 対応コードが動作しないようだ。まあ、 Windows Live Writer に関して言えば、問題が発生した 2014 年以前に開発自体が終了していたことから、やむを得ない気がする。

ただ、その後に公開され開発が続いている(はずの) Open live Writer でどうかというと・・・・・私の環境では認識しなかったのだ。 Open Live Writer が初めて公開されたのは 2015 年 12 月 9 日なので、最初の版を開発しているとき、既に Lightbox のこの問題は既知のはずなのだが、なぜかは分からないが動作しない。 Windows Live Writer のコードのままリリースされたのか?

Lightbox2 の動作確認のために、手作業で投稿済みの記事のタグを編集してみたところ、問題なく Lightbox2 が機能したので明らかに Windows/Open Live Writer 側の問題と思われる。現状では、 Lightbox2 を使用したければ、記事を投稿した後に、投稿済み記事を手作業で編集する必要があるが、正直手間で大変である。

まあ、たかがひとつのスクリプトのために、いちいち投稿ツール本体に特別な動作を組み込むという考え方自体非常によろしくないと思うのだが、他に対応する方法が(手作業で大変な労力をかける以外に)ないのだから、この現状は非常に残念である。