OSDN Git Service

- Add plugin function
[feedblog/feedgenerator.git] / feedgenerator.rb
index de64c8b..9acf606 100644 (file)
@@ -43,6 +43,8 @@ FILEMANAGER = "./filemanager.rb"
 REPLACEBRTAG = false
 # ファイルの書き込み時にENTRYのIDおよびURLを、FEEDオブジェクトから自動生成した値に置換するか否か
 REPLACEENTRYIDANDURL = false
+# プラグインディレクトリ
+PLUGINDIR = "./plugins/"
 
 # EXPERIMENTAL AREA START
 TO_HTML_ENTRYTEMPLATE = 'htmltemp/diary.html.erb'
@@ -69,10 +71,10 @@ class Object
     mode = arg[1]
     rdonly_p = true
     case mode
-      when String
+    when String
       arg[1] = mode[/[^:]+/] if RUBY_VERSION < "1.8.7" && mode.include?(':')
       rdonly_p = /\A[^:]*[wa+]/ !~ mode
-      when Numeric
+    when Numeric
       rdonly_p = !(mode & (IO::WRONY | IO::RDWR))
     end
     open(*arg) do |f|
@@ -227,20 +229,20 @@ class Feed < AbstractEntry
       elm.elements.each { |child|
         begin
           case child.name
-            when "id"
+          when "id"
             xml[:feedid] = child.text
-            when "title", "subtitle", "updated", "rights"
+          when "title", "subtitle", "updated", "rights"
             xml[child.name.to_sym] = child.text
-            when "author"
+          when "author"
             child.elements.each do |gchild|
               case gchild.name
-                when "name"
+              when "name"
                 xml[:aname] = gchild.text
-                when "email"
+              when "email"
                 xml[:amail] = gchild.text
               end
             end
-            when "link"
+          when "link"
             child.attributes.each do |k, v|
               if k == "rel"
                 if v == "self"
@@ -250,7 +252,7 @@ class Feed < AbstractEntry
                 end
               end
             end
-            when "entry"
+          when "entry"
             # Entry要素は無視します
           else
             # 上記判定以外の全要素は配列に格納します
@@ -396,11 +398,11 @@ class Entry < AbstractEntry
       elm.elements.each do |child|
         begin
           case child.name
-            when "id"
+          when "id"
             xml[:entryid] = child.text
-            when "link"
+          when "link"
             xml[:url] = child.attributes["href"]
-            when "title", "summary", "summary", "published", "updated", "content"
+          when "title", "summary", "summary", "published", "updated", "content"
             xml[child.name.to_sym] = child.text
           else
             # 上記判定以外の全要素は配列に格納します
@@ -623,9 +625,9 @@ class LogList
     doc.elements.each("list/file") { |elm|
       elm.elements.each {|child|
         case child.name
-          when "display"
+        when "display"
           @display.push(child.text)
-          when "path"
+        when "path"
           @path.push(child.text)
         else 
           # With no action
@@ -691,6 +693,24 @@ class FileUploader
   end
 end
 
+# = Pluginクラス
+#
+# プラグインの処理を行うクラスです
+class FeedGenPluginManager
+  def self.exec(mode, feed, entries)
+    l_feed = feed.dup.freeze
+    l_entries = entries.dup.freeze
+    Dir.foreach(PLUGINDIR) do |fn|
+      next unless File.extname(fn) == '.rb'
+      require File.join(PLUGINDIR, fn)
+      plugin_name = "FeedGenPlugins::"
+      plugin_name << File.basename(fn).gsub(/\.rb\Z/, "")
+      plugin_ins = plugin_name.split(/::/).inject(Object) { |c,name| c.const_get(name) }
+      plugin_ins.exec(l_feed, l_entries)
+    end
+  end
+end
+
 # = Controllerクラス
 #
 # コントローラ部分に相当する処理を受け持つクラスです
@@ -704,7 +724,7 @@ class Controller
       #        + ... and more
       case params["mode"]
         # ログ選択画面
-        when "logselect"
+      when "logselect"
         session["filepath"] = params["logpath"]
         db["loglist"] = LogList.readxml(LISTXMLPATH)
         # 初期状態で選択されるログは「loglist.xml」の最上に位置するログになります
@@ -713,23 +733,26 @@ class Controller
         db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
         
         # 新規記事追加部分
-        when "newentry"
+      when "newentry"
         case params["action"]
           # 確認画面
-          when "confirm"
+        when "confirm"
           session["target_filepath"] = params["target_filepath"]
           db["newentry"] = Entry.new(params)
           db["newentry"].content = db["newentry"].content_for_blog
           # 記事の追記を実際にファイルに反映
-          when "exec"
+        when "exec"
           session["target_filepath"] = params["target_filepath"]
           successed = Entry.insert(XMLPATH + File.basename(params["target_filepath"]), Entry.new(params))
           unless successed
             db["error"] = "日記の新規追加に失敗しました。" 
             params["mode"] = "error"
+          else
+            # 成功時はプラグイン処理を実施する
+            FeedGenPluginManager.exec("newentry", db["feed"], db["entry"])
           end
           # 画面を戻った際の処理
-          when "back"
+        when "back"
           session["target_filepath"] = params["target_filepath"]
           db["newentry"] = Entry.new(params)
         else 
@@ -740,28 +763,31 @@ class Controller
         end
         
         # 記事編集部分
-        when "editentry"
+      when "editentry"
         case params["action"]
           # 編集画面
-          when "edit"
+        when "edit"
           session["target_filepath"] = params["target_filepath"]
           session["editid"] = cgi["editid"].to_s
           db["editentry"] = Entry.select(XMLPATH + File.basename(session["target_filepath"]), session["editid"])
           # 確認画面
-          when "confirm"
+        when "confirm"
           session["target_filepath"] = params["target_filepath"]
           session["editid"] = cgi["editid"].to_s
           db["editentry"] = Entry.new(params)
           db["editentry"].content = db["editentry"].content_for_blog
           # 記事の変更を実際にファイルに反映
-          when "exec"
+        when "exec"
           session["target_filepath"] = params["target_filepath"]
           successed = Entry.update(XMLPATH + File.basename(params["target_filepath"]), Entry.new(params))
           unless successed
             db["error"] = "日記の編集処理に失敗しました。<br>該当の日記が既に存在しない可能性があります。" 
             params["mode"] = "error"
+          else
+            # 成功時はプラグイン処理を実施する
+            FeedGenPluginManager.exec("editentry", db["feed"], db["entry"])
           end
-          when "back"
+        when "back"
           session["target_filepath"] = params["target_filepath"]
           db["editentry"] = Entry.new(params)
         else
@@ -772,22 +798,25 @@ class Controller
         end
         
         # 記事削除部分
-        when "delentry"
+      when "delentry"
         case params["action"]
           # 確認画面
-          when "confirm"
+        when "confirm"
           session["target_filepath"] = params["target_filepath"]
           session["delid"] = cgi["delid"].to_s
           db["delentry"] = Entry.select(XMLPATH + File.basename(session["target_filepath"]), session["delid"])
           # 記事の削除を実際にファイルに反映
-          when "exec"
+        when "exec"
           session["target_filepath"] = params["target_filepath"]
           successed = Entry.delete(XMLPATH + File.basename(params["target_filepath"]), cgi["delid"].to_s)
           unless successed
             db["error"] = "日記の編集処理に失敗しました。<br>該当の日記が既に存在しない可能性があります。" 
             params["mode"] = "error"
+          else
+            # 成功時はプラグイン処理を実施する
+            FeedGenPluginManager.exec("delentry", db["feed"], db["entry"])
           end
-          when "back"
+        when "back"
           session["target_filepath"] = params["target_filepath"]
           db["feed"] = Feed.readxml(XMLPATH + File.basename(session["target_filepath"]))
           db["entry"] = Entry.readxml(XMLPATH + File.basename(session["target_filepath"]))
@@ -799,17 +828,17 @@ class Controller
         end
         
         # Feed情報変更部分
-        when "editfeed"
+      when "editfeed"
         case params["action"]
           # 確認画面
-          when "confirm"
+        when "confirm"
           session["target_filepath"] = params["target_filepath"]
           db["feed"] = Feed.new(params)
           # 実際にFeed情報の変更をファイルに反映
-          when "back"
+        when "back"
           session["target_filepath"] = params["target_filepath"]
           db["feed"] = Feed.new(params)
-          when "exec"
+        when "exec"
           session["target_filepath"] = params["target_filepath"]
           Feed.update(XMLPATH + File.basename(params["target_filepath"]), Feed.new(params))
         else
@@ -818,12 +847,12 @@ class Controller
         end
         
         # ログ編集モード
-        when "log"
+      when "log"
         # 必ず内部データをリフレッシュする
         db["loglist"] = LogList.readxml(LISTXMLPATH)
         case params["action"]
           # ログファイルの編集を実際にファイルに反映
-          when "addexec"
+        when "addexec"
           # エラーチェック。この段階のエラーは強度のエラーを発する。
           db["loglist"].path.each do |val|
             if val == cgi["logpath"]
@@ -847,7 +876,7 @@ class Controller
           # 新たなdiary.xmlを生成。この際保持する情報は同一のFeedオブジェクトnew()
           Feed.to_xml(XMLPATH + File.basename(db["loglist"].path[0]), db["feed"], [])
           # 確認画面
-          when "addconfirm"
+        when "addconfirm"
           # 入力されたログが既に存在するかを確認
           db["loglist"].path.each do |val|
             if val == cgi["logpath"]
@@ -864,10 +893,10 @@ class Controller
           if db["logpath"].blank? || db["logdisplay"].blank?
             params["action"] = ""
           end
-          when "back"
+        when "back"
           
           # 削除確認画面
-          when "delconfirm"
+        when "delconfirm"
           db["logdelindex"] = params["logdelindex"].to_i
           
           if db["logdelindex"] < 1
@@ -875,7 +904,7 @@ class Controller
             params["action"] = ""
           end
           # 削除処理
-          when "delexec"
+        when "delexec"
           if cgi["logdelindex"].to_i < 1
             params["action"] = ""
             params["mode"] = "error"
@@ -894,7 +923,7 @@ class Controller
           end
           
           # 編集画面
-          when "edit"
+        when "edit"
           db["logeditindex"] = params["logdelindex"].to_i
           
           db["logpath"] = db["loglist"].path[db["logeditindex"]]
@@ -905,7 +934,7 @@ class Controller
             params["action"] = ""
           end
           # 編集確認画面
-          when "editconfirm"
+        when "editconfirm"
           checkflag = true
           db["loglist"].path.each_with_index do |val, i|
             if db["logeditindex"] != i
@@ -925,7 +954,7 @@ class Controller
             db["logdisplay"] = params["logdisplay"].to_s
           end
           # 編集実行
-          when "editexec"
+        when "editexec"
           checkflag = true
           db["loglist"].path.each_with_index do |val, i|
             if db["logeditindex"] != i
@@ -972,14 +1001,14 @@ class Controller
         end
         
         # インポートモードの場合の処理
-        when "import"
+      when "import"
         db["loglist"] = LogList.readxml(LISTXMLPATH)
         
         # リセットモードの場合の処理
-        when "reset"
+      when "reset"
         case params["action"]
           # リセット実行時の処理
-          when "exec"
+        when "exec"
           file = FileUploader.new
           file.filelist().each { |fname|
             file.delete(fname) if File.ftype(XMLPATH + fname) == "file"
@@ -1046,9 +1075,9 @@ class Controller
       db["loglist"] = LogList.readxml(LISTXMLPATH)
       case params["mode"]
         # 特定位置に挿入する場合の処理
-        when "insert"
+      when "insert"
         case params["action"]
-          when "exec"
+        when "exec"
           # この段階のエラーに対しては強度のエラーを発する
           checkflag = true
           db["logpath"] = Controller.get_mpart_value(cgi["logpath"])
@@ -1096,7 +1125,7 @@ class Controller
           db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
           db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
           
-          when "confirm"
+        when "confirm"
           # 入力されたログファイルパスが既に存在するかを確認
           checkflag = true
           db["logpath"] = Controller.get_mpart_value(cgi["logpath"])
@@ -1146,9 +1175,9 @@ class Controller
         end
         
         # diary.xmlを入れ替える処理
-        when "replace"
+      when "replace"
         case params["action"]
-          when "exec"
+        when "exec"
           # この段階のエラーに対しては強度のエラーを発する
           checkflag = true
           db["logpath"] = Controller.get_mpart_value(cgi["logpath"])
@@ -1188,7 +1217,7 @@ class Controller
           db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
           db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
           
-          when "confirm"
+        when "confirm"
           # 入力されたログファイルパスが既に存在するかを確認
           checkflag = true
           db["logpath"] = Controller.get_mpart_value(cgi["logpath"])
@@ -1343,27 +1372,27 @@ def main
       htmlwriter = HtmlWriter.new("./erbtemp/login.html.erb", binding)
     else
       case params["mode"]
-        when "selectlog"
+      when "selectlog"
         htmlwriter = HtmlWriter.new("./erbtemp/select.html.erb", binding)
-        when "newentry"
+      when "newentry"
         htmlwriter = HtmlWriter.new("./erbtemp/newentry.html.erb", binding)
-        when "editentry"
+      when "editentry"
         htmlwriter = HtmlWriter.new("./erbtemp/editentry.html.erb", binding)
-        when "delentry"
+      when "delentry"
         htmlwriter = HtmlWriter.new("./erbtemp/delentry.html.erb", binding)
-        when "editfeed"
+      when "editfeed"
         htmlwriter = HtmlWriter.new("./erbtemp/editfeed.html.erb", binding)
-        when "log"
+      when "log"
         htmlwriter = HtmlWriter.new("./erbtemp/log.html.erb", binding)
-        when "insert"
+      when "insert"
         htmlwriter = HtmlWriter.new("./erbtemp/insertfeed.html.erb", binding)
-        when "replace"
+      when "replace"
         htmlwriter = HtmlWriter.new("./erbtemp/replacefeed.html.erb", binding)
-        when "import"
+      when "import"
         htmlwriter = HtmlWriter.new("./erbtemp/indeximport.html.erb", binding)
-        when "reset"
+      when "reset"
         htmlwriter = HtmlWriter.new("./erbtemp/reset.html.erb", binding)
-        when "error"
+      when "error"
         htmlwriter = HtmlWriter.new("./erbtemp/error.html.erb", binding)
       else
         htmlwriter = HtmlWriter.new("./erbtemp/index.html.erb", binding)
@@ -1389,7 +1418,7 @@ begin
 rescue => evar
   # エラーが発生した場合、それを画面に表示します
   detail = ("%s: %s (%s)\n" %
-  [evar.backtrace[0], evar.message, evar.send('class')]) +
-  evar.backtrace[1..-1].join("\n")
+            [evar.backtrace[0], evar.message, evar.send('class')]) +
+    evar.backtrace[1..-1].join("\n")
   puts "content-type: text/html\n\n<plaintext>\n" + detail
 end