OSDN Git Service

modieifed setting path only.
[feedblog/feedgenerator.git] / feedgenerator.rb
index 3981fa5..de64c8b 100644 (file)
@@ -22,9 +22,13 @@ LOGINID = "login"
 # ログインパスワード
 PASSWORD = "password"
 # インターフェースのテーブルの幅
-TABLEWIDTH = 800
+TABLEWIDTH = 1000
 # XMLファイル格納先までの相対パス
 XMLPATH = "./../lunardial/xml/"
+# FeedBlogを設置したディレクトリのURL
+HOMEBASE = "https://lunardial.sakura.ne.jp/"
+# 入力されたフルパスURL(HOMEBASE)を置換する文字列
+RELAYPATH = "./"
 # loglist.xmlファイルの定義
 LISTXMLPATH = "#{XMLPATH}loglist.xml"
 # FeedBlog上の表示ページからログ格納ディレクトリまでのパス
@@ -37,6 +41,13 @@ USEFILEMANAGER = true
 FILEMANAGER = "./filemanager.rb"
 # XMLに書き込む際、改行部分を<br>のまま保持するか、改行記号に直すか
 REPLACEBRTAG = false
+# ファイルの書き込み時にENTRYのIDおよびURLを、FEEDオブジェクトから自動生成した値に置換するか否か
+REPLACEENTRYIDANDURL = false
+
+# EXPERIMENTAL AREA START
+TO_HTML_ENTRYTEMPLATE = 'htmltemp/diary.html.erb'
+TO_HTML_MAINTEMPLATE = 'htmltemp/main.html.erb'
+# EXPERIMENTAL AREA END
 
 # バージョン情報を示す文字列です
 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>)"
@@ -56,9 +67,16 @@ class Object
   # _arg[1]_ :: モードの指定。例 : w:utf-8(書き込みモード・UTF-8エンコードでファイルを開く)
   def myopen(*arg)
     mode = arg[1]
-    arg[1] = mode[/[^:]+/] if mode && RUBY_VERSION < "1.8.7" && mode.include?(':')
+    rdonly_p = true
+    case mode
+      when String
+      arg[1] = mode[/[^:]+/] if RUBY_VERSION < "1.8.7" && mode.include?(':')
+      rdonly_p = /\A[^:]*[wa+]/ !~ mode
+      when Numeric
+      rdonly_p = !(mode & (IO::WRONY | IO::RDWR))
+    end
     open(*arg) do |f|
-      f.flock(/\A\w+r/ =~ mode ? File::LOCK_SH : File::LOCK_EX)
+      f.flock(rdonly_p ? File::LOCK_SH : File::LOCK_EX)
       return yield(f)
     end
   end
@@ -97,7 +115,7 @@ class AbstractEntry
     @paramlist.each do |key|
       val = hash[key.to_sym] || hash[key.to_s]
       if val
-        val.strip!
+        val.strip!
         val.gsub!(/\r\n|\r/, "\n")
         @attr[key.to_sym] = CGI.escapeHTML(val)
       else
@@ -190,7 +208,7 @@ class Feed < AbstractEntry
   # Atom XMLファイルを読み込んで解析し、等価なFeedオブジェクトを返却するメソッドです
   #
   # _path_ :: Atom XMLファイルのパス
-  def Feed.readxml(path)
+  def self.readxml(path)
     
     # ファイルを読み込みます
     doc = REXML::Document.new(myopen(path, "r:utf-8"){|f|f.read})
@@ -254,7 +272,8 @@ class Feed < AbstractEntry
   def to_s
     buf = []
     
-    buf.push("<feed #{@attr[:feedattr]}>")
+    # buf.push("<feed #{@attr[:feedattr]}>")
+    buf.push("<feed xml:lang='ja-jp' xmlns='http://www.w3.org/2005/Atom'>");
     buf.push("<title type=\"text\">#{@attr[:title]}</title>")
     buf.push("<subtitle type=\"text\">#{@attr[:subtitle]}</subtitle>")
     buf.push("<link rel=\"self\" type=\"application/atom+xml\" href=\"#{@attr[:self]}\" />")
@@ -270,6 +289,57 @@ class Feed < AbstractEntry
     
     return buf.join("\n")
   end
+  
+  # Feed情報更新メソッド
+  def self.update(path, feed)
+    entrylist = Entry.readxml(path)
+    Feed.to_xml(path, feed, entrylist)
+    
+    true
+  end
+  
+  # XMLファイル出力用メソッドです
+  #
+  # _feed_ :: Feedオブジェクト
+  # _entry_ :: Entryオブジェクトの配列
+  def self.to_xml(path, feed, entrylist_tmp)
+    buf = []
+    entrylist = entrylist_tmp.dup
+    buf.push("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
+    buf.push("#{feed.to_s}\n")
+    entrylist.each { |entry|
+      if REPLACEENTRYIDANDURL
+        entry.entryid.gsub!(/^[^\?]*\?/, "")
+        entry.entryid = feed.url + "?" + entry.entryid
+        entry.url = feed.url + "#" + entry.entryid
+      end
+      buf.push("#{entry.to_s}\n")
+    }
+    buf.push("</feed>")
+    
+    myopen(path, "w") do |f|
+      f.print buf.join("\n")
+    end
+  end
+  
+  # XMLファイル出力用メソッドです
+  #
+  # _feed_ :: Feedオブジェクト
+  # _entry_ :: Entryオブジェクトの配列
+  def self.to_xml_plain(path, feed, entrylist)
+    buf = []
+    buf.push("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
+    buf.push("#{feed.to_s}\n")
+    entrylist.each { |entry|
+      buf.push("#{entry.to_s}\n")
+    }
+    buf.push("</feed>")
+    
+    myopen(path, "w") do |f|
+      f.print buf.join("\n")
+    end
+  end
+  
 end
 
 # = Entryクラス
@@ -292,7 +362,7 @@ class Entry < AbstractEntry
     # 可視・不可視を示すハッシュキーを格納する配列です
     @display = {"entryid" => "none", "title" => "",
       "summary" => "", "published" => "none",
-      "updated" => "none", "url" => "none",
+      "updated" => "none", "url" => "",
       "content" => "", "others"=>"none"}
     
     # デバッグモードの場合、全ての入力要素を表示します
@@ -312,7 +382,7 @@ class Entry < AbstractEntry
   # Atom XMLファイルを読み込んで解析し、等価なEntryオブジェクト配列を返却するメソッドです
   #
   # _path_ :: Atom XMLファイルのパス
-  def Entry.readxml(path)
+  def self.readxml(path)
     
     # ファイルを読み込みます
     doc = REXML::Document.new(myopen(path, "r:utf-8"){|f|f.read})
@@ -347,13 +417,115 @@ class Entry < AbstractEntry
     return entrylist
   end
   
+  # Atom XMLファイルを読み込んで解析し、テンプレートファイルにしたがってHTMLに変換するメソッドです
+  def self.to_html(xmlpath, destpath, entry_temppath, html_temppath)
+    # 引数チェック - 全必須
+    if xmlpath.empty? or destpath.empty? or entry_temppath.empty? or html_temppath.empty?
+      raise ArgumentError
+    end
+    
+    # 必須ファイル存在チェック
+    unless File.exist?(xmlpath) and File.exist?(entry_temppath) and File.exist?(html_temppath)
+      raise IOError
+    end
+    
+    # XML読み込み
+    entrylist = Entry.readxml(xmlpath)
+    
+    body = ''
+    entrylist.each { |e|
+      # Entry毎のHTML表示部分を生成
+      body << e.to_template(entry_temppath)
+    }
+    
+    # HTML全体のテンプレートを生成
+    html_temp = HtmlWriter.new(html_temppath, binding)
+    
+    # HTMLに書き込み
+    myopen(destpath, 'w:utf-8') { |f|
+      f.write(CGI.pretty(html_temp.to_code))
+    }
+  end
+  
+  # Entryをテンプレートに沿って変形するメソッド
+  def to_template(temppath)
+    erb = HtmlWriter.new(temppath, binding)
+    title = CGI.unescapeHTML(@attr[:title])
+    date = @attr[:published]
+    content = CGI.unescapeHTML(@attr[:content])
+    erb.to_code
+  end
+  
+  # Entry挿入メソッド
+  def self.insert(path, entry)
+    feed = Feed.readxml(path)
+    entrylist = Entry.readxml(path)
+    entrylist.unshift entry
+    
+    Feed.to_xml(path, feed, entrylist)
+    
+    true
+  end
+  
+  # Entry更新メソッド
+  def self.update(path, entry)
+    feed = Feed.readxml(path)
+    entrylist = Entry.readxml(path)
+    
+    successed = false
+    entrylist.each_with_index { |e, i|
+      if e.entryid == entry.entryid
+        entrylist[i] = entry 
+        successed = true
+      end
+    }
+    Feed.to_xml(path, feed, entrylist) if successed
+    
+    successed
+  end
+  
+  # Entryロードメソッド
+  def self.select(path, entryid)
+    feed = Feed.readxml(path)
+    entrylist = Entry.readxml(path)
+    
+    entry = nil
+    entrylist.each_with_index { |e, i|
+      entry = entrylist[i].dup if e.entryid == entryid
+    }
+    
+    entry
+  end
+  
+  # Entry消去メソッド
+  def self.delete(path, entryid)
+    feed = Feed.readxml(path)
+    entrylist = Entry.readxml(path)
+    
+    successed = false
+    delete_index = -1
+    entrylist.each_with_index { |e, i|
+      if e.entryid == entryid
+        delete_index = i
+        successed = true
+      end
+    }
+    
+    if successed
+      entrylist.delete_at delete_index
+      Feed.to_xml(path, feed, entrylist)
+    end
+    
+    successed
+  end
+  
   # データソースから読み取ったHTMLを、エディタで編集可能な形式に変換するメソッドです
   def content_for_generator
     str = @attr[:content].dup
-    str.strip!
+    str.strip!
     str.gsub!(/(&lt;\/(?:p|h\d|div)(?:&gt;|>))\n/i, '\1')
     str.gsub!(/\n/, '&lt;br&gt;') if REPLACEBRTAG
-    str.gsub!(/(&lt;(?:(?!&gt;).)*?)#{Regexp.escape(FEEDXMLDIR)}/) { "#$1#{XMLPATH}" }
+    str.gsub!(/(&lt;(?:(?!&gt;).)*?)#{Regexp.escape(RELAYPATH)}/) { "#$1#{HOMEBASE}" }
     str
   end
   
@@ -361,11 +533,11 @@ class Entry < AbstractEntry
   def content_for_blog
     str = @attr[:content].dup
     str = CGI.unescapeHTML(str)
-    str.strip!
+    str.strip!
     str.gsub!(/(\r\n|\n)/, "")
-    str.gsub!(/<br>/i, "\n") if REPLACEBRTAG
-    str.gsub!(/(<br>|<\/p>|<\/h\d>|<\/div>)(?=[^\n])/i) { "#$1\n" } unless REPLACEBRTAG
-    str.gsub!(/(<[^>]*?)#{Regexp.escape(XMLPATH)}/) { "#$1#{FEEDXMLDIR}" }
+    str.gsub!(/<br>|<br[ ]*\/>/i, "\n") if REPLACEBRTAG
+    str.gsub!(/(<br>|<br[ ]*\/>|<\/p>|<\/h\d>|<\/div>)(?=[^\n])/i) { "#$1\n" } unless REPLACEBRTAG
+    str.gsub!(/(<[^>]*?)#{Regexp.escape(HOMEBASE)}/) { "#$1#{RELAYPATH}" }
     CGI.escapeHTML(str)
   end
   
@@ -373,9 +545,9 @@ class Entry < AbstractEntry
   def content_for_view
     str = @attr[:content].dup
     str = CGI.unescapeHTML(str)
-    str.strip!
-    str.gsub!(/<br>/i, "\n") if REPLACEBRTAG
-    str.gsub!(/(<[^>]*?)#{Regexp.escape(FEEDXMLDIR)}/) { "#$1#{XMLPATH}" }
+    str.strip!
+    str.gsub!(/<br>|<br[ ]*\/>/i, "\n") if REPLACEBRTAG
+    str.gsub!(/(<[^>]*?)#{Regexp.escape(RELAYPATH)}/) { "#$1#{HOMEBASE}" }
     str
   end
   
@@ -397,36 +569,6 @@ class Entry < AbstractEntry
   end
 end
 
-# = FeedWriterクラス
-#
-# Atom Feed 1.0 XMLファイルに書き込みを行うクラスです
-class FeedWriter
-  # 初期化メソッドです
-  #
-  # _path_ :: Atom Feed 1.0 XMLファイルの書き込みパス
-  def initialize(path)
-    @path = path
-  end
-  
-  # XMLファイル出力用メソッドです
-  #
-  # _feed_ :: Feedオブジェクト
-  # _entry_ :: Entryオブジェクトの配列
-  def to_xml(feed, entrylist)
-    buf = []
-    buf.push("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
-    buf.push("#{feed.to_s}\n")
-    entrylist.each { |entry|
-      buf.push("#{entry.to_s}\n")
-    }
-    buf.push("</feed>")
-    
-    myopen(@path, "w") do |f|
-      f.print buf.join("\n")
-    end
-  end
-end
-
 # = HtmlWriterクラス
 # 
 # テンプレートファイル(*.erb)を読み込み、管理するクラスです
@@ -554,508 +696,540 @@ end
 # コントローラ部分に相当する処理を受け持つクラスです
 class Controller
   def Controller.NormalForm(cgi, session, params, db)
-    # modeとactionの相関図は以下のようになります。
-    # [mode] + [action]
-    #        + [action]
-    #        + [action]
-    #        + ... and more
-    case params["mode"]
-      # ログ選択画面
-      when "logselect"
-      session["filepath"] = params["logpath"]
-      session["loglist"] = LogList.readxml(LISTXMLPATH)
-      # 初期状態で選択されるログは「loglist.xml」の最上に位置するログになります
-      session["filepath"] = session["loglist"].path[0] if session["filepath"] == nil
-      session["feed"] = Feed.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
-      session["entry"] = Entry.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
-      
-      # 新規記事追加部分
-      when "newentry"
-      case params["action"]
-        # 確認画面
-        when "confirm"
-        session["newentry"] = Entry.new(params)
-        session["newentry"].content = session["newentry"].content_for_blog
-        # 記事の追記を実際にファイルに反映
-        when "exec"
-        session["newentry"] = Entry.new(params)
-        session["entry"].unshift session["newentry"]
-        feedwriter = FeedWriter.new(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
-        feedwriter.to_xml(session["feed"], session["entry"])
-        # 確認画面から戻った場合
-        when "back"
-        session["newentry"] = Entry.new(params)
-      else 
-        # New Diary - Default
-        session["feed"] = Feed.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
-        session["entry"] = Entry.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
-      end
-      
-      # 記事編集部分
-      when "editentry"
-      case params["action"]
-        # 編集画面
-        when "edit"
-        session["editid"] = cgi["editid"].to_s
-        # 確認画面
-        when "confirm"
-        session["editid"] = cgi["editid"].to_s
-        session["editentry"] = Entry.new(params)
-        session["editentry"].content = session["editentry"].content_for_blog
-        # 記事の変更を実際にファイルに反映
-        when "exec"
-        session["editentry"] = Entry.new(params)
-        session["entry"].each_with_index { |e, i|
-          session["entry"][i] = session["editentry"] if e.entryid == cgi["editid"].to_s
-        }
-        feedwriter = FeedWriter.new(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
-        feedwriter.to_xml(session["feed"], session["entry"])
-        # 確認画面から戻った場合
-        when "back"
-        session["editid"] = cgi["editid"].to_s
-        session["editentry"] = Entry.new(params)
-      else
-        # Edit Diary - Default
-        session["feed"] = Feed.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
-        session["entry"] = Entry.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
-      end
-      
-      # 記事削除部分
-      when "delentry"
-      case params["action"]
-        # 確認画面
-        when "confirm"
-        session["delid"] = cgi["delid"].to_s
-        # 記事の削除を実際にファイルに反映
-        when "exec"
-        delindex = nil
-        session["entry"].each_with_index { |e, i|
-          delindex = i if e.entryid == cgi["delid"].to_s
-        }
-        session["entry"].delete_at(delindex) unless delindex == nil
-        feedwriter = FeedWriter.new(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
-        feedwriter.to_xml(session["feed"], session["entry"])
-      else
-        # Delete Diary - Default
-        session["feed"] = Feed.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
-        session["entry"] = Entry.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
-      end
-      
-      # Feed情報変更部分
-      when "editfeed"
-      case params["action"]
-        # 確認画面
-        when "confirm"
-        session["feed"] = Feed.new(params)
-        # 実際にFeed情報の変更をファイルに反映
-        when "exec"
-        session["feed"] = Feed.new(params)
-        feedwriter = FeedWriter.new(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
-        feedwriter.to_xml(session["feed"], session["entry"])
-        # 確認画面から戻った場合
-        when "back"
-        session["feed"] = Feed.new(params)
-      else
+    db.transaction do
+      # modeとactionの相関図は以下のようになります。
+      # [mode] + [action]
+      #        + [action]
+      #        + [action]
+      #        + ... and more
+      case params["mode"]
+        # ログ選択画面
+        when "logselect"
+        session["filepath"] = params["logpath"]
+        db["loglist"] = LogList.readxml(LISTXMLPATH)
+        # 初期状態で選択されるログは「loglist.xml」の最上に位置するログになります
+        session["filepath"] = db["loglist"].path[0] if session["filepath"] == nil
+        db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
+        db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
         
-      end
-      
-      # ログ編集モード
-      when "log"
-      case params["action"]
-        # ログファイルの編集を実際にファイルに反映
-        when "addexec"
-        # 入力されたログが既に存在するかを確認
-        session["loglist"].path.each do |val|
-          if val == cgi["logpath"]
-            # 重複していた場合エラーメッセージを表示し、処理を行わない
-            params["action"] = ""
-            error = "<span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
-            break;
+        # 新規記事追加部分
+        when "newentry"
+        case params["action"]
+          # 確認画面
+          when "confirm"
+          session["target_filepath"] = params["target_filepath"]
+          db["newentry"] = Entry.new(params)
+          db["newentry"].content = db["newentry"].content_for_blog
+          # 記事の追記を実際にファイルに反映
+          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"
           end
+          # 画面を戻った際の処理
+          when "back"
+          session["target_filepath"] = params["target_filepath"]
+          db["newentry"] = Entry.new(params)
+        else 
+          # New Diary - Default
+          session["target_filepath"] = session["filepath"]
+          db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
+          db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
         end
         
-        session["logpath"] = cgi["logpath"]
-        session["logdisplay"] = cgi["logdisplay"]
-        
-        # 入力された内容を保持する配列に追加
-        session["loglist"].path[1, 0] = session["logpath"]
-        session["loglist"].display[1, 0] = session["logdisplay"]
-        session["loglist"].to_xml
-        
-        # 既存のdiary.xmlを指定された名称でコピーして保存
-        FileUtils.copy_file(XMLPATH + session["loglist"].path[0].match(/[^\/]*?$/).to_a[0], XMLPATH + session["logpath"].match(/[^\/]*?$/).to_a[0], true)
-        
-        # 保持している情報を更新する
-        session["loglist"] = LogList.readxml(LISTXMLPATH)
-        session["entry"] = []
-        
-        # 新たなdiary.xmlを生成。この際保持する情報は同一のFeedオブジェクト
-        writer = FeedWriter.new(XMLPATH + session["loglist"].path[0].match(/[^\/]*?$/).to_a[0])
-        writer.to_xml(session["feed"], [])
-        
-        # 確認画面
-        when "addconfirm"
-        # 入力されたログが既に存在するかを確認
-        session["loglist"].path.each do |val|
-          if val == cgi["logpath"]
-            # 重複していた場合エラーメッセージを表示し、処理を行わない
-            params["action"] = ""
-            error = "<span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
-            break;
+        # 記事編集部分
+        when "editentry"
+        case params["action"]
+          # 編集画面
+          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"
+          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"
+          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"
           end
+          when "back"
+          session["target_filepath"] = params["target_filepath"]
+          db["editentry"] = Entry.new(params)
+        else
+          # Edit Diary - Default
+          session["target_filepath"] = session["filepath"]
+          db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
+          db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
         end
         
-        session["logpath"] = cgi["logpath"]
-        session["logdisplay"] = cgi["logdisplay"]
-        
-        if session["logpath"].blank? || session["logdisplay"].blank?
-          params["action"] = ""
+        # 記事削除部分
+        when "delentry"
+        case params["action"]
+          # 確認画面
+          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"
+          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"
+          end
+          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"]))
+        else
+          # Delete Diary - Default
+          session["target_filepath"] = session["filepath"]
+          db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
+          db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
         end
-        when "back"
-        # 削除確認画面
-        when "delconfirm"
-        session["logdelindex"] = params["logdelindex"].to_i
         
-        if session["logdelindex"] == 0
-          params["action"] = ""
-        end
-        # 削除処理
-        when "delexec"
-        session["logdelindex"] = params["logdelindex"].to_i
-        if session["logdelindex"] == 0
-          params["action"] = ""
+        # Feed情報変更部分
+        when "editfeed"
+        case params["action"]
+          # 確認画面
+          when "confirm"
+          session["target_filepath"] = params["target_filepath"]
+          db["feed"] = Feed.new(params)
+          # 実際にFeed情報の変更をファイルに反映
+          when "back"
+          session["target_filepath"] = params["target_filepath"]
+          db["feed"] = Feed.new(params)
+          when "exec"
+          session["target_filepath"] = params["target_filepath"]
+          Feed.update(XMLPATH + File.basename(params["target_filepath"]), Feed.new(params))
         else
-          # 記事ファイルを削除します
-          File.delete(XMLPATH + session["loglist"].path[session["logdelindex"]].match(/[^\/]*?$/).to_s)
-          # ログリストから削除します
-          session["loglist"].path.delete_at(session["logdelindex"])
-          session["loglist"].display.delete_at(session["logdelindex"])
-          session["loglist"].to_xml
-          # 保持している情報を更新する
-          session["loglist"] = LogList.readxml(LISTXMLPATH)
-          session["entry"] = []
+          session["target_filepath"] = session["filepath"]
+          db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
         end
-        # 編集画面
-        when "edit"
-        session["logeditindex"] = params["logdelindex"].to_i
-        
-        session["logpath"] = session["loglist"].path[session["logeditindex"]]
-        session["logdisplay"] = session["loglist"].display[session["logeditindex"]]
         
-        if session["logeditindex"] == 0
-          params["action"] = ""
-        end
-        # 編集確認画面
-        when "editconfirm"
-        session["logeditindex"] = params["logeditindex"].to_i
-        checkflag = true
-        session["loglist"].path.each_with_index do |val, i|
-          if session["logeditindex"] != i
-            if params["logpath"].to_s == session["loglist"].path[i].to_s
-              checkflag = false
+        # ログ編集モード
+        when "log"
+        # 必ず内部データをリフレッシュする
+        db["loglist"] = LogList.readxml(LISTXMLPATH)
+        case params["action"]
+          # ログファイルの編集を実際にファイルに反映
+          when "addexec"
+          # エラーチェック。この段階のエラーは強度のエラーを発する。
+          db["loglist"].path.each do |val|
+            if val == cgi["logpath"]
+              # 重複していた場合エラーメッセージを表示し、処理を行わない
+              params["action"] = ""
+              params["mode"] = "error"
+              db["error"] = "ログファイルの追加中に重大なエラーが発生しました。<br>環境を見直してください。"
+              return
             end
           end
-        end
-        
-        if checkflag == false
-          params["action"] = "edit"
-          session["error"] = "<span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
-        else
-          session["loginsertindex"] = params["loginsertindex"].to_i
           
-          session["logpath"] = params["logpath"].to_s
-          session["logdisplay"] = params["logdisplay"].to_s
-        end
-        # 編集実行
-        when "editexec"
-        session["logeditindex"] = params["logeditindex"].to_i
-        checkflag = true
-        session["loglist"].path.each_with_index do |val, i|
-          if session["logeditindex"] != i
-            if params["logpath"].to_s == session["loglist"].path[i].to_s
-              checkflag = false
+          # 入力された内容を保持する配列に追加
+          db["loglist"].path[1, 0] = cgi["logpath"]
+          db["loglist"].display[1, 0] = cgi["logdisplay"]
+          db["loglist"].to_xml
+          # 既存のdiary.xmlを指定された名称でコピーして保存
+          FileUtils.copy_file(XMLPATH + File.basename(db["loglist"].path[0]), XMLPATH + File.basename(db["logpath"]), true)
+          # 保持している情報を更新する
+          db["loglist"] = LogList.readxml(LISTXMLPATH)
+          db["entry"] = []
+          # 新たなdiary.xmlを生成。この際保持する情報は同一のFeedオブジェクトnew()
+          Feed.to_xml(XMLPATH + File.basename(db["loglist"].path[0]), db["feed"], [])
+          # 確認画面
+          when "addconfirm"
+          # 入力されたログが既に存在するかを確認
+          db["loglist"].path.each do |val|
+            if val == cgi["logpath"]
+              # 重複していた場合エラーメッセージを表示し、処理を行わない
+              params["action"] = ""
+              db["error"] = "<span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
+              return
             end
           end
+          
+          db["logpath"] = cgi["logpath"]
+          db["logdisplay"] = cgi["logdisplay"]
+          
+          if db["logpath"].blank? || db["logdisplay"].blank?
+            params["action"] = ""
+          end
+          when "back"
+          
+          # 削除確認画面
+          when "delconfirm"
+          db["logdelindex"] = params["logdelindex"].to_i
+          
+          if db["logdelindex"] < 1
+            db["error"] = "<span style='color: #ff0000'>ログファイルの削除パラメタが不正です。</span><br>"
+            params["action"] = ""
+          end
+          # 削除処理
+          when "delexec"
+          if cgi["logdelindex"].to_i < 1
+            params["action"] = ""
+            params["mode"] = "error"
+            db["error"] = "ログファイルの削除中に重大なエラーが発生しました。<br>環境を見直してください。"
+            return
+          else
+            # 記事ファイルを削除します
+            File.delete(XMLPATH + File.basename(db["loglist"].path[db["logdelindex"]]))
+            # ログリストから削除します
+            db["loglist"].path.delete_at(cgi["logdelindex"].to_i)
+            db["loglist"].display.delete_at(cgi["logdelindex"].to_i)
+            db["loglist"].to_xml
+            # 保持している情報を更新する
+            db["loglist"] = LogList.readxml(LISTXMLPATH)
+            db["entry"] = []
+          end
+          
+          # 編集画面
+          when "edit"
+          db["logeditindex"] = params["logdelindex"].to_i
+          
+          db["logpath"] = db["loglist"].path[db["logeditindex"]]
+          db["logdisplay"] = db["loglist"].display[db["logeditindex"]]
+          
+          if db["logeditindex"] == 0
+            db["error"] = "<span style='color: #ff0000'>ログファイルの編集パラメタが不正です。</span><br>"
+            params["action"] = ""
+          end
+          # 編集確認画面
+          when "editconfirm"
+          checkflag = true
+          db["loglist"].path.each_with_index do |val, i|
+            if db["logeditindex"] != i
+              if params["logpath"].to_s == db["loglist"].path[i].to_s
+                checkflag = false
+              end
+            end
+          end
+          
+          if checkflag == false
+            params["action"] = "edit"
+            db["error"] = "<span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
+          else
+            db["loginsertindex"] = params["loginsertindex"].to_i
+            
+            db["logpath"] = params["logpath"].to_s
+            db["logdisplay"] = params["logdisplay"].to_s
+          end
+          # 編集実行
+          when "editexec"
+          checkflag = true
+          db["loglist"].path.each_with_index do |val, i|
+            if db["logeditindex"] != i
+              if params["logpath"].to_s == db["loglist"].path[i].to_s
+                checkflag = false
+              end
+            end
+          end
+          
+          if checkflag == false
+            params["action"] = ""
+            params["mode"] = "error"
+            db["error"] = "ログファイルの編集中に重大なエラーが発生しました。<br>環境を見直してください。"
+            return
+          else
+            db["loginsertindex"] = params["loginsertindex"].to_i
+            
+            db["logpath"] = params["logpath"].to_s
+            db["logdisplay"] = params["logdisplay"].to_s
+            
+            # ファイルを移動します
+            if XMLPATH + File.basename(db["loglist"].path[db["logeditindex"]]) != XMLPATH + File.basename(db["logpath"])
+              FileUtils.move(XMLPATH + File.basename(db["loglist"].path[db["logeditindex"]]), XMLPATH + File.basename(db["logpath"]))
+              # ログリストを更新します
+              db["loglist"].path.delete_at(db["logeditindex"])
+              db["loglist"].display.delete_at(db["logeditindex"])
+              db["loglist"].path.insert(db["loginsertindex"] + 1, db["logpath"])
+              db["loglist"].display.insert(db["loginsertindex"] + 1, db["logdisplay"])
+              db["loglist"].to_xml
+            end
+          end
+          
+          # 初期表示画面
+        else
+          # 現在編集中のデータを強制的に最上のファイルパスに変更
+          session["filepath"] = db["loglist"].path[0]
+          
+          # 前月の時刻を作成します
+          prevmonth = (DateTime.now << 1)
+          
+          # 前月の時刻を元に、ディフォルト書式を生成します
+          db["logpath"] = FEEDXMLDIR + prevmonth.strftime("%Y%m") + ".xml"
+          db["logdisplay"] = prevmonth.strftime("%Y年%m月").gsub("年0", "年")
         end
         
-        if checkflag == false
-          params["action"] = "edit"
-          session["error"] = "<span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
-          return
+        # インポートモードの場合の処理
+        when "import"
+        db["loglist"] = LogList.readxml(LISTXMLPATH)
+        
+        # リセットモードの場合の処理
+        when "reset"
+        case params["action"]
+          # リセット実行時の処理
+          when "exec"
+          file = FileUploader.new
+          file.filelist().each { |fname|
+            file.delete(fname) if File.ftype(XMLPATH + fname) == "file"
+          }
+          
+          # 全ファイルの初期化を実行する
+          # loglist.xmlの初期化
+          loglist = LogList.new(["最新の記事"], ["#{FEEDXMLDIR}diary.xml"], LISTXMLPATH)
+          loglist.to_xml
+          
+          db["loglist"] = LogList.readxml(LISTXMLPATH)
+          
+          # diary.xmlの初期化
+          Feed.to_xml(XMLPATH + db["loglist"].path[0].match(/[^\/]*?$/).to_a[0], Feed.new({}), [])
+          
+          # 初期の編集ファイルはloglist.xml上の最も上のファイル
+          session["filepath"] = db["loglist"].path[0]
+          db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
+          db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
+          
+          # 画面の遷移先をトップページにする
+          params["mode"] = ""
+          params["action"] = ""
+          # パラメタ無しの処理
         else
-          session["loginsertindex"] = params["loginsertindex"].to_i
+          # ファイル一覧を取得する
+          filelist = FileUploader.new.filelist()
           
-          session["logpath"] = params["logpath"].to_s
-          session["logdisplay"] = params["logdisplay"].to_s
+          # タイプがファイルのみリストとして取得する
+          db["filelist"] = []
+          filelist.each { |fname| db["filelist"] << fname if File.ftype(XMLPATH + fname) == "file"}
         end
         
-        # ファイルを移動します
-        if XMLPATH + session["loglist"].path[session["logeditindex"]].match(/[^\/]*?$/).to_s != XMLPATH + session["logpath"].match(/[^\/]*?$/).to_s
-          FileUtils.move(XMLPATH + session["loglist"].path[session["logeditindex"]].match(/[^\/]*?$/).to_s, XMLPATH + session["logpath"].match(/[^\/]*?$/).to_s)
-        end
-        # ログリストを更新します
-        session["loglist"].path.delete_at(session["logeditindex"])
-        session["loglist"].display.delete_at(session["logeditindex"])
-        session["loglist"].path.insert(session["loginsertindex"] + 1, session["logpath"])
-        session["loglist"].display.insert(session["loginsertindex"] + 1, session["logdisplay"])
-        session["loglist"].to_xml
-        # 初期表示画面
+        # ログイン時の画面
       else
-        # 初期表示の際に内部保持データをリフレッシュ
-        session["loglist"] = LogList.readxml(LISTXMLPATH)
-        
-        # 現在編集中のデータを強制的に最上のファイルパスに変更
-        session["filepath"] = session["loglist"].path[0]
-        
-        # 前月の時刻を作成します
-        prevmonth = (DateTime.now << 1)
-        
-        # 前月の時刻を元に、ディフォルト書式を生成します
-        session["logpath"] = FEEDXMLDIR + prevmonth.strftime("%Y%m") + ".xml"
-        session["logdisplay"] = prevmonth.strftime("%Y年%m月").gsub("年0", "年")
-      end
-      
-      # インポートモードの場合の処理
-      when "import"
-      session["loglist"] = LogList.readxml(LISTXMLPATH)
-      
-      # リセットモードの場合の処理
-      when "reset"
-      case params["action"]
-        # リセット実行時の処理
-        when "exec"
-        file = FileUploader.new
-        file.filelist().each { |fname|
-          file.delete(fname) if File.ftype(XMLPATH + fname) == "file"
-        }
-        
-        # 全ファイルの初期化を実行する
-        # loglist.xmlの初期化
-        loglist = LogList.new(["最新の記事"], ["#{FEEDXMLDIR}diary.xml"], LISTXMLPATH)
-        loglist.to_xml
-        writer = FeedWriter.new(XMLPATH + loglist.path[0].match(/[^\/]*?$/).to_a[0])
-        writer.to_xml(Feed.new({}), [])
+        # loglist.xmlが存在するかチェック
+        if File.exist?(LISTXMLPATH) == false
+          # なかった場合はloglist.xmlを自動生成
+          loglist = LogList.new(["最新の記事"], ["#{FEEDXMLDIR}diary.xml"], LISTXMLPATH)
+          loglist.to_xml
+          Feed.to_xml(XMLPATH + File.basename(loglist.path[0]), Feed.new({}), [])
+        end
         
-        session["loglist"] = LogList.readxml(LISTXMLPATH)
+        db["loglist"] = LogList.readxml(LISTXMLPATH)
         
-        # diary.xmlの初期化
-        writer = FeedWriter.new(XMLPATH + session["loglist"].path[0].match(/[^\/]*?$/).to_a[0])
-        writer.to_xml(Feed.new({}), [])
+        # diary.xmlが存在するかチェック
+        if File.exist?(XMLPATH + File.basename(db["loglist"].path[0])) == false
+          # なかった場合はdiary.xmlを自動生成
+          Feed.to_xml(XMLPATH + File.basename(db["loglist"].path[0]), Feed.new({}), [])
+        end
         
         # 初期の編集ファイルはloglist.xml上の最も上のファイル
-        session["filepath"] = session["loglist"].path[0]
-        session["feed"] = Feed.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0].to_s)
-        session["entry"] = Entry.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0].to_s)
-        
-        # 画面の遷移先をトップページにする
-        params["mode"] = ""
-        params["action"] = ""
-        # パラメタ無しの処理
-      else
-        # ファイル一覧を取得する
-        filelist = FileUploader.new.filelist()
-        
-        # タイプがファイルのみリストとして取得する
-        session["filelist"] = []
-        filelist.each { |fname| session["filelist"] << fname if File.ftype(XMLPATH + fname) == "file"}
+        session["filepath"] = db["loglist"].path[0] if session["filepath"] == nil
+        db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
+        db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
       end
-      
-      # ログイン時の画面
-    else
-      # loglist.xmlが存在するかチェック
-      if File.exist?(LISTXMLPATH) == false
-        # なかった場合はloglist.xmlを自動生成
-        loglist = LogList.new(["最新の記事"], ["#{FEEDXMLDIR}diary.xml"], LISTXMLPATH)
-        loglist.to_xml
-        writer = FeedWriter.new(XMLPATH + loglist.path[0].match(/[^\/]*?$/).to_a[0])
-        writer.to_xml(Feed.new({}), [])
-      end
-      
-      session["loglist"] = LogList.readxml(LISTXMLPATH)
-      
-      # diary.xmlが存在するかチェック
-      if File.exist?(XMLPATH + session["loglist"].path[0].match(/[^\/]*?$/).to_a[0]) == false
-        # なかった場合はdiary.xmlを自動生成
-        writer = FeedWriter.new(XMLPATH + session["loglist"].path[0].match(/[^\/]*?$/).to_a[0])
-        writer.to_xml(Feed.new({}), [])
-      end
-      
-      # 初期の編集ファイルはloglist.xml上の最も上のファイル
-      session["filepath"] = session["loglist"].path[0] if session["filepath"] == nil
-      session["feed"] = Feed.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0].to_s)
-      session["entry"] = Entry.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0].to_s)
     end
   end
   
   # マルチパートフォームの場合の処理です
   def Controller.MultiForm(cgi, session, params, db)
-    case params["mode"]
-      # 特定位置に挿入する場合の処理
-      when "insert"
-      case params["action"]
-        when "exec"
-        # 入出力をチェックします
-        session["logpath"] = Controller.get_mpart_value(cgi["logpath"])
-        session["loginsertindex"] = cgi["loginsertindex"].read.to_i
-        session["logdisplay"] = Controller.get_mpart_value(cgi["logdisplay"])
-        
-        # 0位置への挿入防止
-        if session["loginsertindex"] == 0
-          params["action"] = ""
-          session["error"] = "<br><span style='color: #ff0000'>ラジオボックスでログの挿入位置を選択してください!</span><br>"
-          return
-        end
-        
-        if session["logpath"] == FEEDXMLDIR || session["logdisplay"].blank?
-          params["action"] = ""
-          session["error"] = "<br><span style='color: #ff0000'>インポートファイル、及び、ログの表示名は空欄にできません。</span><br>"
-          return
-        end
-        
-        # ファイルを実際にアップロードします
-        file = FileUploader.new
-        file.upload(session["logpath"], session["importxml"])
-        
-        # loglist.xmlを更新します
-        session["loglist"].path[session["loginsertindex"], 0] = session["logpath"]
-        session["loglist"].display[session["loginsertindex"], 0] = session["logdisplay"]
-        session["loglist"].to_xml
-        
-        # 情報を更新します
-        session["loglist"] = LogList.readxml(LISTXMLPATH)
-        session["filepath"] = session["loglist"].path[0] if session["filepath"] == nil
-        session["feed"] = Feed.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0].to_s)
-        session["entry"] = Entry.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0].to_s)
-        
-        when "confirm"
-        # 入力されたログファイルパスが既に存在するかを確認
-        checkflag = true
-        session["logpath"] = Controller.get_mpart_value(cgi["logpath"])
-        session["loglist"].path.each do |val|
-          if val == session["logpath"]
-            # 重複していた場合エラーメッセージを表示し、処理を行わない
-            session["logpath"] = ""
+    db.transaction do
+      # loglist.xmlをロードします
+      db["loglist"] = LogList.readxml(LISTXMLPATH)
+      case params["mode"]
+        # 特定位置に挿入する場合の処理
+        when "insert"
+        case params["action"]
+          when "exec"
+          # この段階のエラーに対しては強度のエラーを発する
+          checkflag = true
+          db["logpath"] = Controller.get_mpart_value(cgi["logpath"])
+          db["loglist"].path.each do |val|
+            if val == db["logpath"]
+              # 重複していた場合エラーメッセージを表示し、処理を行わない
+              db["logpath"] = ""
+              params["action"] = ""
+              params["mode"] = "error"
+              db["error"] = "ログファイルの追加中に重大なエラーが発生しました。"
+              return
+            end
+          end
+          
+          db["loginsertindex"] = cgi["loginsertindex"].read.to_i
+          db["logdisplay"] = Controller.get_mpart_value(cgi["logdisplay"])
+          
+          # 0位置への挿入防止
+          if db["loginsertindex"] == 0
             params["action"] = ""
-            session["error"] = "<br><span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
-            checkflag = false
-            break;
+            params["mode"] = "error"
+            db["error"] = "ログファイルの追加中に重大なエラーが発生しました。"
+            return
           end
-        end
-        
-        if checkflag == true
-          session["loginsertindex"] = cgi["loginsertindex"].read.to_i
-          session["logdisplay"] = Controller.get_mpart_value(cgi["logdisplay"])
-          session["importxml"] = cgi["updata"].read
           
-          # XMLの整合性をチェックします
-          begin
-            REXML::Document.new(Controller.fix_updata_enc(session["importxml"].to_s))
-          rescue => exception
-            session["error"] = "<br><span style='color: #ff0000'>不正な整形のXMLです!ファイルを見直してください。</span><br>"
-            session["error"] << "<div class='divstyle' style='width: 560px; color: #ff0000; text-align: left;'>"
-            session["error"] << CGI.escapeHTML(exception.to_s).gsub("\n", "<br>")
-            session["error"] << "</div>"
+          if File.basename(db["logpath"]).blank? || db["logdisplay"].blank?
             params["action"] = ""
+            params["mode"] = "error"
+            db["error"] = "ログファイルの追加中に重大なエラーが発生しました。"
+            return
           end
-        end
-        
-        # 0位置への挿入防止
-        if session["loginsertindex"] == 0
-          params["action"] = ""
-          session["error"] = "<br><span style='color: #ff0000'>ラジオボックスでログの挿入位置を選択してください!</span><br>"
-        end
-        
-        if session["logpath"] == FEEDXMLDIR || session["logdisplay"].blank?
-          params["action"] = ""
-          session["error"] = "<br><span style='color: #ff0000'>インポートファイル、及び、ログの表示名は空欄にできません。</span><br>"
-        end
-      else
-        # loglist.xmlをロードします
-        session["loglist"] = LogList.readxml(LISTXMLPATH)
-      end
-      
-      # diary.xmlを入れ替える処理
-      when "replace"
-      case params["action"]
-        when "exec"
-        # 入力されたログファイルパスが既に存在するかを確認
-        checkflag = true
-        session["logpath"] = Controller.get_mpart_value(cgi["logpath"])
-        session["logdisplay"] = Controller.get_mpart_value(cgi["logdisplay"])
-        session["loglist"].path.each do |val|
-          if val == session["logpath"]
-            # 重複していた場合エラーメッセージを表示し、処理を行わない
+          
+          # ファイルを実際にアップロードします
+          file = FileUploader.new
+          file.upload(db["logpath"], db["importxml"])
+          
+          # loglist.xmlを更新します
+          db["loglist"].path[db["loginsertindex"], 0] = db["logpath"]
+          db["loglist"].display[db["loginsertindex"], 0] = db["logdisplay"]
+          db["loglist"].to_xml
+          
+          # 情報を更新します
+          db["loglist"] = LogList.readxml(LISTXMLPATH)
+          session["filepath"] = db["loglist"].path[0] if session["filepath"] == nil
+          db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
+          db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
+          
+          when "confirm"
+          # 入力されたログファイルパスが既に存在するかを確認
+          checkflag = true
+          db["logpath"] = Controller.get_mpart_value(cgi["logpath"])
+          db["loglist"].path.each do |val|
+            if val == db["logpath"]
+              # 重複していた場合エラーメッセージを表示し、処理を行わない
+              db["logpath"] = ""
+              params["action"] = ""
+              db["error"] = "<br><span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
+              checkflag = false
+              return
+            end
+          end
+          
+          if checkflag
+            db["loginsertindex"] = cgi["loginsertindex"].read.to_i
+            db["logdisplay"] = Controller.get_mpart_value(cgi["logdisplay"])
+            db["importxml"] = cgi["updata"].read
+            
+            # XMLの整合性をチェックします
+            begin
+              REXML::Document.new(Controller.fix_updata_enc(db["importxml"].to_s))
+            rescue => exception
+              db["error"] = "<br><span style='color: #ff0000'>不正な整形のXMLです!ファイルを見直してください。</span><br>"
+              db["error"] << "<div class='divstyle' style='width: 560px; color: #ff0000; text-align: left;'>"
+              db["error"] << CGI.escapeHTML(exception.to_s).gsub("\n", "<br>")
+              db["error"] << "</div>"
+              params["action"] = ""
+              return
+            end
+          end
+          
+          # 0位置への挿入防止
+          if db["loginsertindex"] == 0
             params["action"] = ""
-            session["error"] = "<br><span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
-            checkflag = false
+            db["error"] = "<br><span style='color: #ff0000'>ラジオボックスでログの挿入位置を選択してください!</span><br>"
             return
           end
-        end
-        
-        if session["logpath"].blank? || session["logdisplay"].blank? || session["importxml"].blank?
-          params["action"] = ""
-          session["error"] = "<span style='color: #ff0000'>インポートファイル、及び、ログの表示名、ログのパスは空欄にできません。</span><br>"
-          return
-        end
-        
-        # diary.xmlを移動します
-        FileUtils.move(XMLPATH + "diary.xml", XMLPATH + session["logpath"].match(/[^\/]*?$/).to_s)
-        # ファイルをアップロードします
-        file = FileUploader.new
-        file.upload("diary.xml", session["importxml"])
-        
-        # loglist.xmlを更新します
-        session["loglist"].path[1, 0] = session["logpath"]
-        session["loglist"].display[1, 0] = session["logdisplay"]
-        session["loglist"].to_xml
-        
-        # 情報を更新します
-        session["loglist"] = LogList.readxml(LISTXMLPATH)
-        session["filepath"] = session["loglist"].path[0] if session["filepath"] == nil
-        session["feed"] = Feed.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0].to_s)
-        session["entry"] = Entry.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0].to_s)
-        
-        when "confirm"
-        # 入力されたログファイルパスが既に存在するかを確認
-        checkflag = true
-        session["logpath"] = Controller.get_mpart_value(cgi["logpath"])
-        session["loglist"].path.each do |val|
-          if val == session["logpath"]
-            # 重複していた場合エラーメッセージを表示し、処理を行わない
+          
+          if db["logpath"] == FEEDXMLDIR || db["logdisplay"].blank?
             params["action"] = ""
-            session["error"] = "<br><span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
-            checkflag = false
-            break;
+            db["error"] = "<br><span style='color: #ff0000'>インポートファイル、及び、ログの表示名は空欄にできません。</span><br>"
+            return
           end
+          
+        else
         end
         
-        if checkflag == true
-          session["logdisplay"] = Controller.get_mpart_value(cgi["logdisplay"])
-          session["importxml"] = cgi["updata"].read
+        # diary.xmlを入れ替える処理
+        when "replace"
+        case params["action"]
+          when "exec"
+          # この段階のエラーに対しては強度のエラーを発する
+          checkflag = true
+          db["logpath"] = Controller.get_mpart_value(cgi["logpath"])
+          db["loglist"].path.each do |val|
+            if val == db["logpath"]
+              # 重複していた場合エラーメッセージを表示し、処理を行わない
+              params["action"] = ""
+              params["mode"] = "error"
+              db["error"] = "ログファイルの追加中に重大なエラーが発生しました。"
+              return
+            end
+          end
+          
+          db["logdisplay"] = Controller.get_mpart_value(cgi["logdisplay"])
           
-          # XMLの整合性をチェックします
-          begin
-            REXML::Document.new(Controller.fix_updata_enc(session["importxml"].to_s))
-          rescue => exception
-            session["error"] = "<br><span style='color: #ff0000'>不正な整形のXMLです!ファイルを見直してください。</span><br>"
-            session["error"] << "<div class='divstyle' style='width: 560px; color: #ff0000; text-align: left;'>"
-            session["error"] << CGI.escapeHTML(exception.to_s).gsub("\n", "<br>")
-            session["error"] << "</div>"
+          if File.basename(db["logpath"]).blank? || db["logdisplay"].blank? || db["importxml"].blank?
             params["action"] = ""
+            params["mode"] = "error"
+            db["error"] = "ログファイルの追加中に重大なエラーが発生しました。"
+            return
           end
+          
+          # diary.xmlを移動します
+          FileUtils.move(XMLPATH + "diary.xml", XMLPATH + File.basename(db["logpath"]))
+          # ファイルをアップロードします
+          file = FileUploader.new
+          file.upload("diary.xml", db["importxml"])
+          
+          # loglist.xmlを更新します
+          db["loglist"].path[1, 0] = db["logpath"]
+          db["loglist"].display[1, 0] = db["logdisplay"]
+          db["loglist"].to_xml
+          
+          # 情報を更新します
+          db["loglist"] = LogList.readxml(LISTXMLPATH)
+          session["filepath"] = db["loglist"].path[0] if session["filepath"] == nil
+          db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
+          db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
+          
+          when "confirm"
+          # 入力されたログファイルパスが既に存在するかを確認
+          checkflag = true
+          db["logpath"] = Controller.get_mpart_value(cgi["logpath"])
+          db["loglist"].path.each do |val|
+            if val == db["logpath"]
+              # 重複していた場合エラーメッセージを表示し、処理を行わない
+              params["action"] = ""
+              db["error"] = "<br><span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
+              checkflag = false
+              return
+            end
+          end
+          
+          if checkflag == true
+            db["logdisplay"] = Controller.get_mpart_value(cgi["logdisplay"])
+            db["importxml"] = cgi["updata"].read
+            
+            # XMLの整合性をチェックします
+            begin
+              REXML::Document.new(Controller.fix_updata_enc(db["importxml"].to_s))
+            rescue => exception
+              db["error"] = "<br><span style='color: #ff0000'>不正な整形のXMLです!ファイルを見直してください。</span><br>"
+              db["error"] << "<div class='divstyle' style='width: 560px; color: #ff0000; text-align: left;'>"
+              db["error"] << CGI.escapeHTML(exception.to_s).gsub("\n", "<br>")
+              db["error"] << "</div>"
+              params["action"] = ""
+              return
+            end
+          end
+          
+          if db["logpath"].blank? || db["logdisplay"].blank? || db["importxml"].blank?
+            params["action"] = ""
+            db["error"] = "<br><span style='color: #ff0000'>インポートファイル、及び、ログの表示名、ログのパスは空欄にできません。</span><br>"
+            return
+          end
+          
+        else
         end
         
-        if session["logpath"].blank? || session["logdisplay"].blank? || session["importxml"].blank?
-          params["action"] = ""
-          session["error"] = "<span style='color: #ff0000'>インポートファイル、及び、ログの表示名、ログのパスは空欄にできません。</span><br>"
-        end
       else
-        # loglist.xmlをロードします
-        session["loglist"] = LogList.readxml(LISTXMLPATH)
       end
-    else
-      # loglist.xmlをロードします
-      session["loglist"] = LogList.readxml(LISTXMLPATH)
     end
   end
   
@@ -1115,6 +1289,9 @@ def main
       # PStore破損チェック!
       begin
         db = PStore.new("./work/#{session.session_id}.dat")
+        db.transaction do
+          db["error"] = ""
+        end
       rescue
         # PStoreファイルを破棄する
         File.delete("./work/#{session.session_id}.dat")
@@ -1127,20 +1304,32 @@ def main
       
       # フォームによって挙動を変更します
       if cgi["mode"].respond_to?(:read) && cgi["action"].respond_to?(:read)
-        session["error"] = ""
         params["mode"] = cgi["mode"].read
         params["action"] = cgi["action"].read
         Controller.MultiForm(cgi, session, params, db)
       else
         Controller.NormalForm(cgi, session, params, db)
       end
+      
+      # エラー画面移行時はセッション情報を破棄する
+      if params["mode"] == "error"
+        session["login"] = nil
+        session["logini"] = nil
+        session["password"] = nil
+        session.delete
+      end
     end
     
     # メニューとして表示されるHTML文字列です
+    if params["target_filepath"].blank?
+      menu = "<div class=\"divstyle\" style=\"width: #{TABLEWIDTH}px;\"><div class=\"divstyle\" align=\"center\" style=\"margin-bottom: 5px;\">現在編集中のファイル : #{session["filepath"]} "
+    else
+      menu = "<div class=\"divstyle\" style=\"width: #{TABLEWIDTH}px;\"><div class=\"divstyle\" align=\"center\" style=\"margin-bottom: 5px;\">現在編集中のファイル : #{session["target_filepath"]} "
+    end
     if USEFILEMANAGER == true
-      menu = "<div class=\"divstyle\" style=\"width: #{TABLEWIDTH}px;\"><div class=\"divstyle\" align=\"center\" style=\"margin-bottom: 5px;\">現在編集中のファイル : #{session["filepath"]} [ <a href=\"#{cgi.script_name}?mode=selectlog\">他のファイルを選択</a> ]</div>[ <a href=\"#{cgi.script_name}\">トップページ</a> | 記事管理 ( <a href=\"#{cgi.script_name}?mode=newentry\">作成</a> | <a href=\"#{cgi.script_name}?mode=editentry\">編集</a> | <a href=\"#{cgi.script_name}?mode=delentry\">消去</a> )  | <a href=\"#{cgi.script_name}?mode=editfeed\">XML情報編集</a> | <a href=\"#{cgi.script_name}?mode=log\">ログ管理</a> | <a href=\"#{cgi.script_name}?mode=import\">インポート</a> | <a href=\"#{FILEMANAGER}\" target=\"_blank\">ファイル管理</a> | <a href=\"#{cgi.script_name}?mode=reset\">初期化</a> | <a href=\"#{cgi.script_name}?mode=logout\">ログアウト</a> ]</div>"
+      menu += "[ <a href=\"#{cgi.script_name}?mode=selectlog\">他のファイルを選択</a> ]</div>[ <a href=\"#{cgi.script_name}\">トップページ</a> | 記事管理 ( <a href=\"#{cgi.script_name}?mode=newentry\">作成</a> | <a href=\"#{cgi.script_name}?mode=editentry\">編集</a> | <a href=\"#{cgi.script_name}?mode=delentry\">消去</a> )  | <a href=\"#{cgi.script_name}?mode=editfeed\">XML情報編集</a> | <a href=\"#{cgi.script_name}?mode=log\">ログ管理</a> | <a href=\"#{cgi.script_name}?mode=import\">インポート</a> | <a href=\"#{FILEMANAGER}\" target=\"_blank\">ファイル管理</a> | <a href=\"#{cgi.script_name}?mode=reset\">初期化</a> | <a href=\"#{cgi.script_name}?mode=logout\">ログアウト</a> ]</div>"
     else
-      menu = "<div class=\"divstyle\" style=\"width: #{TABLEWIDTH}px;\"><div class=\"divstyle\" align=\"center\" style=\"margin-bottom: 5px;\">現在編集中のファイル : #{session["filepath"]} [ <a href=\"#{cgi.script_name}?mode=selectlog\">他のファイルを選択</a> ]</div>[ <a href=\"#{cgi.script_name}\">トップページ</a> | 記事管理 ( <a href=\"#{cgi.script_name}?mode=newentry\">作成</a> | <a href=\"#{cgi.script_name}?mode=editentry\">編集</a> | <a href=\"#{cgi.script_name}?mode=delentry\">消去</a> )  | <a href=\"#{cgi.script_name}?mode=editfeed\">XML情報編集</a> | <a href=\"#{cgi.script_name}?mode=log\">ログ管理</a> | <a href=\"#{cgi.script_name}?mode=import\">インポート</a> | <a href=\"#{cgi.script_name}?mode=reset\">初期化</a> | <a href=\"#{cgi.script_name}?mode=logout\">ログアウト</a> ]</div>"
+      menu += "[ <a href=\"#{cgi.script_name}?mode=selectlog\">他のファイルを選択</a> ]</div>[ <a href=\"#{cgi.script_name}\">トップページ</a> | 記事管理 ( <a href=\"#{cgi.script_name}?mode=newentry\">作成</a> | <a href=\"#{cgi.script_name}?mode=editentry\">編集</a> | <a href=\"#{cgi.script_name}?mode=delentry\">消去</a> )  | <a href=\"#{cgi.script_name}?mode=editfeed\">XML情報編集</a> | <a href=\"#{cgi.script_name}?mode=log\">ログ管理</a> | <a href=\"#{cgi.script_name}?mode=import\">インポート</a> | <a href=\"#{cgi.script_name}?mode=reset\">初期化</a> | <a href=\"#{cgi.script_name}?mode=logout\">ログアウト</a> ]</div>"
     end
     
     # ビュー部分
@@ -1174,6 +1363,8 @@ def main
         htmlwriter = HtmlWriter.new("./erbtemp/indeximport.html.erb", binding)
         when "reset"
         htmlwriter = HtmlWriter.new("./erbtemp/reset.html.erb", binding)
+        when "error"
+        htmlwriter = HtmlWriter.new("./erbtemp/error.html.erb", binding)
       else
         htmlwriter = HtmlWriter.new("./erbtemp/index.html.erb", binding)
       end