Y.A.S.D.

weblogger.el × metaWeblog (タイトルを渡す編)

注:とりあえず現時点では weblogger-start-entry<f> 以外ではテストしていません。

Subject: に書いた文字列が title として Roller 側に渡らないのは, weblogger-api-new-entry が weblogger-api-blogger-new-entry<f> になってるからで, ほんとは weblogger-api-meta-new-entry<f> を使ってほしいところ。 根本的には weblogger-determine-capabilities<f> が悪いんだけど,とりあえず

(setq weblogger-api-new-entry 'weblogger-api-meta-new-entry)

しておくと,metaWeblog.newPost を使ってくれるようになる。 でも今度は Roller 側がエラーを吐く。原因を一言で言うと, そもそも値のないメンバを値 nil の boolean なメンバとして weblogger が request 生成してしまうから。

たとえば draft である *weblogger-entry* バッファには default では Date: フィールドがないんだけど,weblogger.el がこれを parse して (Date . nil) という構造で内部データとして持っていて(ここまでは別によい),最終的に

<member>
  <name>dateCreated</name>
  <value>
    <boolean>0</boolean>
  </value>
</member>

という request を生成しよる。なんでやねん。

同様に,内部データに (mt_tb_ping_urls . nil) と (mt_convert_breaks . nil) という MovableType 用(?) のメンバを勝手に追加しよる。 あと,(link . nil) とか (categories . nil) とかも。値が nil ならメンバごと要らんはず。

というわけで,どのタイミングでこいつらを消すかというのは微妙なところだけど, とりあえずこんな感じで動くには動いた。delq してるところを見ると, 作者は「消してるつもり」なんだろうと思う。 ちょっと泥臭いので,本当はこれより前に消しておいた方がよい気がする。 ただ,実際 boolean false を渡すべきメンバもあるかもなので,「assoc の結果が nil なメンバは 全部消して良い」ということはなくて,どっちにしても項目ごとに泥臭くチェックするしかないとは思う。

--- weblogger.el.orig
+++ weblogger.el
@@ -598,7 +598,7 @@
   (bury-buffer))
 
 
-(defun weblogger-save-entry (&optional publishp &optional arg)
+(defun weblogger-save-entry (&optional publishp arg)
   "Publish the current entry is publishp is set.  With optional
 argument, prompts for the weblog to use."
   (interactive)
@@ -1088,18 +1088,26 @@
 
 (defun weblogger-struct-to-request (entry)
   "Convert the struct to something that can be used in an xml-rpc request."
-  (delq nil
-       (list
-        (assoc "title"        entry)
-        (assoc "authorName"   entry)
-        (assoc "userid"       entry)
-        (assoc "dateCreated"  entry)
-        (cons "mt_tb_ping_urls"   (cdr (assoc "trackbacks"  entry)))
-        (cons "mt_convert_breaks" (weblogger-texttype-id-from-name
-                                   (cdr (assoc "texttype"    entry))))
-        (cons "link"              (cdr (assoc "url"         entry)))
-        (cons "description"       (cdr (assoc "content"     entry)))
-        (cons "categories"        (cdr (assoc "categories"     entry))))))
+  (let ((dateCreated           (assoc "dateCreated" entry))
+       (mt_tb_ping_urls        (cdr (assoc "trackbacks" entry)))
+       (mt_convert_breaks      (cdr (assoc "texttype"    entry)))
+       (link                   (cdr (assoc "url" entry)))
+       (categories             (assoc "categories" entry)))
+    (delq nil
+         (list
+          (assoc "title"        entry)
+          (assoc "authorName"   entry)
+          (assoc "userid"       entry)
+          (when (cdr dateCreated) dateCreated)
+          (when mt_tb_ping_urls
+            (cons "mt_tb_ping_urls" mt_tb_ping_urls))
+          (when mt_convert_breaks
+            (cons "mt_convert_breaks" mt_convert_breaks))
+          (when link
+            (cons "link" link))
+          (cons "description"       (cdr (assoc "content"     entry)))
+          (when (< 0 (length (cdr categories))) categories)
+        ))))
 
 (defun weblogger-server-userid ()
   "Get information on user."

dateCreated をちゃんと Roller 側に渡したい場合は,こんなこともしておくと良いかも。

(defadvice weblogger-save-entry (before TT:insert-date-field)
  "Insert Date: field."
  (goto-line 0)
  (insert (format-time-string "Date: %Y%m%dT%TZ\n" (current-time))))

安易に advice で済ませたくないけど, 残念ながら welogger-new-entry-hook に add-hook するのでは遅い...。

 

 

[Masubi]
Copyright © 1998-2009 Tomoaki TSUMURA. Powered by Apache Roller 4.0.1.
tomoaki@tsumura.info