OSDN Git Service

- Plugin function added.
[feedblog/feedgenerator.git] / feedgenerator.rb
index e3fb316..837a061 100644 (file)
@@ -17,10 +17,10 @@ require 'time'
 require "date"
 require "fileutils"
 
-# ログインID
-LOGINID = "login"
-# ログインパスワード
-PASSWORD = "password"
+# ログイン情報配列
+LOGININFO = [
+{:id => "login", :password => "password", :name => "テストユーザ"}
+]
 # インターフェースのテーブルの幅
 TABLEWIDTH = 1000
 # XMLファイル格納先までの相対パス
@@ -45,11 +45,8 @@ REPLACEBRTAG = false
 REPLACEENTRYIDANDURL = false
 # プラグインディレクトリ
 PLUGINDIR = "./plugins/"
-
-# EXPERIMENTAL AREA START
-TO_HTML_ENTRYTEMPLATE = 'htmltemp/diary.html.erb'
-TO_HTML_MAINTEMPLATE = 'htmltemp/main.html.erb'
-# EXPERIMENTAL AREA END
+# 記事用初期ファイル名
+INITIALXML = "diary.xml"
 
 # バージョン情報を示す文字列です
 APPVERSION = "- FeedGenerator for Ruby version 2.0.0.0 -<br>Copyright(c) 2009 Kureha.H (<a href=\"http://lunardial.sakura.ne.jp/\" target=\"_blank\">http://lunardial.sakura.ne.jp/</a>) & Yui Naruse (<a href=\"http://airemix.com/\" target=\"_blank\">http://airemix.com/</a>)"
@@ -71,10 +68,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|
@@ -229,20 +226,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"
@@ -252,7 +249,7 @@ class Feed < AbstractEntry
                 end
               end
             end
-          when "entry"
+            when "entry"
             # Entry要素は無視します
           else
             # 上記判定以外の全要素は配列に格納します
@@ -398,11 +395,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
             # 上記判定以外の全要素は配列に格納します
@@ -625,9 +622,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
@@ -697,16 +694,18 @@ end
 #
 # プラグインの処理を行うクラスです
 class FeedGenPluginManager
-  def self.exec(mode, feed, entry)
-    l_feed = feed.dup.freeze
-    l_entry = entry.dup.freeze
+  def self.exec(mode, filepath)
+    feed = Feed.readxml(XMLPATH + filepath)
+    entries = Entry.readxml(XMLPATH + filepath)
+    feed.freeze
+    entries.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.new.exec(mode, l_feed, l_entry)
+      plugin_ins.new.exec(mode, feed, entries)
     end
   end
 end
@@ -724,7 +723,7 @@ class Controller
       #        + ... and more
       case params["mode"]
         # ログ選択画面
-      when "logselect"
+        when "logselect"
         session["filepath"] = params["logpath"]
         db["loglist"] = LogList.readxml(LISTXMLPATH)
         # 初期状態で選択されるログは「loglist.xml」の最上に位置するログになります
@@ -733,15 +732,15 @@ 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
@@ -749,10 +748,10 @@ class Controller
             params["mode"] = "error"
           else
             # 成功時はプラグイン処理を実施する
-            FeedGenPluginManager.exec("newentry", db["feed"], Entry.new(params))
+            FeedGenPluginManager.exec("newentry", File.basename(session["filepath"]))
           end
           # 画面を戻った際の処理
-        when "back"
+          when "back"
           session["target_filepath"] = params["target_filepath"]
           db["newentry"] = Entry.new(params)
         else 
@@ -763,21 +762,21 @@ 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
@@ -785,9 +784,9 @@ class Controller
             params["mode"] = "error"
           else
             # 成功時はプラグイン処理を実施する
-            FeedGenPluginManager.exec("editentry", db["feed"], Entry.new(params))
+            FeedGenPluginManager.exec("editentry", File.basename(session["filepath"]))
           end
-        when "back"
+          when "back"
           session["target_filepath"] = params["target_filepath"]
           db["editentry"] = Entry.new(params)
         else
@@ -798,22 +797,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", File.basename(session["filepath"]))
           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"]))
@@ -825,17 +827,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
@@ -844,12 +846,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"]
@@ -873,7 +875,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"]
@@ -890,10 +892,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
@@ -901,7 +903,7 @@ class Controller
             params["action"] = ""
           end
           # 削除処理
-        when "delexec"
+          when "delexec"
           if cgi["logdelindex"].to_i < 1
             params["action"] = ""
             params["mode"] = "error"
@@ -920,7 +922,7 @@ class Controller
           end
           
           # 編集画面
-        when "edit"
+          when "edit"
           db["logeditindex"] = params["logdelindex"].to_i
           
           db["logpath"] = db["loglist"].path[db["logeditindex"]]
@@ -931,7 +933,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
@@ -951,7 +953,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
@@ -998,14 +1000,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"
@@ -1013,7 +1015,7 @@ class Controller
           
           # 全ファイルの初期化を実行する
           # loglist.xmlの初期化
-          loglist = LogList.new(["最新の記事"], ["#{FEEDXMLDIR}diary.xml"], LISTXMLPATH)
+          loglist = LogList.new(["最新の記事"], ["#{FEEDXMLDIR}#{INITIALXML}"], LISTXMLPATH)
           loglist.to_xml
           
           db["loglist"] = LogList.readxml(LISTXMLPATH)
@@ -1044,7 +1046,7 @@ class Controller
         # loglist.xmlが存在するかチェック
         if File.exist?(LISTXMLPATH) == false
           # なかった場合はloglist.xmlを自動生成
-          loglist = LogList.new(["最新の記事"], ["#{FEEDXMLDIR}diary.xml"], LISTXMLPATH)
+          loglist = LogList.new(["最新の記事"], ["#{FEEDXMLDIR}#{INITIALXML}"], LISTXMLPATH)
           loglist.to_xml
           Feed.to_xml(XMLPATH + File.basename(loglist.path[0]), Feed.new({}), [])
         end
@@ -1072,9 +1074,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"])
@@ -1122,7 +1124,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"])
@@ -1172,9 +1174,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"])
@@ -1198,10 +1200,10 @@ class Controller
           end
           
           # diary.xmlを移動します
-          FileUtils.move(XMLPATH + "diary.xml", XMLPATH + File.basename(db["logpath"]))
+          FileUtils.move(XMLPATH + INITIALXML, XMLPATH + File.basename(db["logpath"]))
           # ファイルをアップロードします
           file = FileUploader.new
-          file.upload("diary.xml", db["importxml"])
+          file.upload(INITIALXML, db["importxml"])
           
           # loglist.xmlを更新します
           db["loglist"].path[1, 0] = db["logpath"]
@@ -1214,7 +1216,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"])
@@ -1288,9 +1290,17 @@ def main
   # コントローラー部分
   # セッション管理
   if session["login"] != "true"
-    if (cgi["loginid"] == LOGINID && cgi["password"] == PASSWORD)
-      session["login"] = "true"
-      
+    
+    # ログイン情報を確認
+    LOGININFO.each {|h|
+      if (cgi["loginid"] == h[:id] && cgi["password"] == h[:password])
+        session["login"] = "true"
+        session["name"] = h[:name]
+        break
+      end
+    }
+    
+    if (session["login"] == "true")   
       # ワークフォルダの中をクリーンアップします
       filelist = Dir::entries("./work")
       # 削除条件 : 最終変更日時から1日(60*60*24sec)かつ、ファイルタイプがファイルの場合
@@ -1363,27 +1373,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)
@@ -1409,7 +1419,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