OSDN Git Service

modieifed setting path only.
[feedblog/feedgenerator.git] / feedgenerator.rb
index 3b19933..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)を読み込み、管理するクラスです
@@ -564,32 +706,37 @@ class Controller
         # ログ選択画面
         when "logselect"
         session["filepath"] = params["logpath"]
-        session["loglist"] = LogList.readxml(LISTXMLPATH)
+        db["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])
+        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 "newentry"
         case params["action"]
           # 確認画面
           when "confirm"
-          session["newentry"] = Entry.new(params)
-          session["newentry"].content = session["newentry"].content_for_blog
+          session["target_filepath"] = params["target_filepath"]
+          db["newentry"] = Entry.new(params)
+          db["newentry"].content = db["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"])
-          # 確認画面から戻った場合
+          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["newentry"] = Entry.new(params)
+          session["target_filepath"] = params["target_filepath"]
+          db["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])
+          session["target_filepath"] = session["filepath"]
+          db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
+          db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
         end
         
         # 記事編集部分
@@ -597,28 +744,31 @@ class Controller
         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
-          session["editentry"] = Entry.new(params)
-          session["editentry"].content = session["editentry"].content_for_blog
+          db["editentry"] = Entry.new(params)
+          db["editentry"].content = db["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"])
-          # 確認画面から戻った場合
+          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["editid"] = cgi["editid"].to_s
-          session["editentry"] = Entry.new(params)
+          session["target_filepath"] = params["target_filepath"]
+          db["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])
+          session["target_filepath"] = session["filepath"]
+          db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
+          db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
         end
         
         # 記事削除部分
@@ -626,20 +776,26 @@ class Controller
         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"
-          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"])
+          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["feed"] = Feed.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
-          session["entry"] = Entry.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
+          session["target_filepath"] = session["filepath"]
+          db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
+          db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
         end
         
         # Feed情報変更部分
@@ -647,112 +803,113 @@ class Controller
         case params["action"]
           # 確認画面
           when "confirm"
-          session["feed"] = Feed.new(params)
+          session["target_filepath"] = params["target_filepath"]
+          db["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)
+          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
-          
+          session["target_filepath"] = session["filepath"]
+          db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
         end
         
         # ログ編集モード
         when "log"
+        # 必ず内部データをリフレッシュする
+        db["loglist"] = LogList.readxml(LISTXMLPATH)
         case params["action"]
           # ログファイルの編集を実際にファイルに反映
           when "addexec"
-          # 入力されたログが既に存在するかを確認
-          session["loglist"].path.each do |val|
+          # エラーチェック。この段階のエラーは強度のエラーを発する。
+          db["loglist"].path.each do |val|
             if val == cgi["logpath"]
               # 重複していた場合エラーメッセージを表示し、処理を行わない
               params["action"] = ""
-              error = "<span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
-              break;
+              params["mode"] = "error"
+              db["error"] = "ログファイルの追加中に重大なエラーが発生しました。<br>環境を見直してください。"
+              return
             end
           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
-          
+          db["loglist"].path[1, 0] = cgi["logpath"]
+          db["loglist"].display[1, 0] = cgi["logdisplay"]
+          db["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)
-          
+          FileUtils.copy_file(XMLPATH + File.basename(db["loglist"].path[0]), XMLPATH + File.basename(db["logpath"]), 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"], [])
-          
+          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"
           # 入力されたログが既に存在するかを確認
-          session["loglist"].path.each do |val|
+          db["loglist"].path.each do |val|
             if val == cgi["logpath"]
               # 重複していた場合エラーメッセージを表示し、処理を行わない
               params["action"] = ""
-              error = "<span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
-              break;
+              db["error"] = "<span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
+              return
             end
           end
           
-          session["logpath"] = cgi["logpath"]
-          session["logdisplay"] = cgi["logdisplay"]
+          db["logpath"] = cgi["logpath"]
+          db["logdisplay"] = cgi["logdisplay"]
           
-          if session["logpath"].blank? || session["logdisplay"].blank?
+          if db["logpath"].blank? || db["logdisplay"].blank?
             params["action"] = ""
           end
           when "back"
+          
           # 削除確認画面
           when "delconfirm"
-          session["logdelindex"] = params["logdelindex"].to_i
+          db["logdelindex"] = params["logdelindex"].to_i
           
-          if session["logdelindex"] == 0
+          if db["logdelindex"] < 1
+            db["error"] = "<span style='color: #ff0000'>ログファイルの削除パラメタが不正です。</span><br>"
             params["action"] = ""
           end
           # 削除処理
           when "delexec"
-          session["logdelindex"] = params["logdelindex"].to_i
-          if session["logdelindex"] == 0
+          if cgi["logdelindex"].to_i < 1
             params["action"] = ""
+            params["mode"] = "error"
+            db["error"] = "ログファイルの削除中に重大なエラーが発生しました。<br>環境を見直してください。"
+            return
           else
             # 記事ファイルを削除します
-            File.delete(XMLPATH + session["loglist"].path[session["logdelindex"]].match(/[^\/]*?$/).to_s)
+            File.delete(XMLPATH + File.basename(db["loglist"].path[db["logdelindex"]]))
             # ログリストから削除します
-            session["loglist"].path.delete_at(session["logdelindex"])
-            session["loglist"].display.delete_at(session["logdelindex"])
-            session["loglist"].to_xml
+            db["loglist"].path.delete_at(cgi["logdelindex"].to_i)
+            db["loglist"].display.delete_at(cgi["logdelindex"].to_i)
+            db["loglist"].to_xml
             # 保持している情報を更新する
-            session["loglist"] = LogList.readxml(LISTXMLPATH)
-            session["entry"] = []
+            db["loglist"] = LogList.readxml(LISTXMLPATH)
+            db["entry"] = []
           end
+          
           # 編集画面
           when "edit"
-          session["logeditindex"] = params["logdelindex"].to_i
+          db["logeditindex"] = params["logdelindex"].to_i
           
-          session["logpath"] = session["loglist"].path[session["logeditindex"]]
-          session["logdisplay"] = session["loglist"].display[session["logeditindex"]]
+          db["logpath"] = db["loglist"].path[db["logeditindex"]]
+          db["logdisplay"] = db["loglist"].display[db["logeditindex"]]
           
-          if session["logeditindex"] == 0
+          if db["logeditindex"] == 0
+            db["error"] = "<span style='color: #ff0000'>ログファイルの編集パラメタが不正です。</span><br>"
             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
+          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
@@ -760,65 +917,63 @@ class Controller
           
           if checkflag == false
             params["action"] = "edit"
-            session["error"] = "<span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
+            db["error"] = "<span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
           else
-            session["loginsertindex"] = params["loginsertindex"].to_i
+            db["loginsertindex"] = params["loginsertindex"].to_i
             
-            session["logpath"] = params["logpath"].to_s
-            session["logdisplay"] = params["logdisplay"].to_s
+            db["logpath"] = params["logpath"].to_s
+            db["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
+          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"
-            session["error"] = "<span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
+            params["action"] = ""
+            params["mode"] = "error"
+            db["error"] = "ログファイルの編集中に重大なエラーが発生しました。<br>環境を見直してください。"
             return
           else
-            session["loginsertindex"] = params["loginsertindex"].to_i
+            db["loginsertindex"] = params["loginsertindex"].to_i
+            
+            db["logpath"] = params["logpath"].to_s
+            db["logdisplay"] = params["logdisplay"].to_s
             
-            session["logpath"] = params["logpath"].to_s
-            session["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
           
-          # ファイルを移動します
-          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]
+          session["filepath"] = db["loglist"].path[0]
           
           # 前月の時刻を作成します
           prevmonth = (DateTime.now << 1)
           
           # 前月の時刻を元に、ディフォルト書式を生成します
-          session["logpath"] = FEEDXMLDIR + prevmonth.strftime("%Y%m") + ".xml"
-          session["logdisplay"] = prevmonth.strftime("%Y年%m月").gsub("年0", "年")
+          db["logpath"] = FEEDXMLDIR + prevmonth.strftime("%Y%m") + ".xml"
+          db["logdisplay"] = prevmonth.strftime("%Y年%m月").gsub("年0", "年")
         end
         
         # インポートモードの場合の処理
         when "import"
-        session["loglist"] = LogList.readxml(LISTXMLPATH)
+        db["loglist"] = LogList.readxml(LISTXMLPATH)
         
         # リセットモードの場合の処理
         when "reset"
@@ -834,19 +989,16 @@ class Controller
           # 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({}), [])
           
-          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({}), [])
+          Feed.to_xml(XMLPATH + db["loglist"].path[0].match(/[^\/]*?$/).to_a[0], Feed.new({}), [])
           
           # 初期の編集ファイルは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)
+          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"] = ""
@@ -857,8 +1009,8 @@ class Controller
           filelist = FileUploader.new.filelist()
           
           # タイプがファイルのみリストとして取得する
-          session["filelist"] = []
-          filelist.each { |fname| session["filelist"] << fname if File.ftype(XMLPATH + fname) == "file"}
+          db["filelist"] = []
+          filelist.each { |fname| db["filelist"] << fname if File.ftype(XMLPATH + fname) == "file"}
         end
         
         # ログイン時の画面
@@ -868,23 +1020,21 @@ class Controller
           # なかった場合は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({}), [])
+          Feed.to_xml(XMLPATH + File.basename(loglist.path[0]), Feed.new({}), [])
         end
         
-        session["loglist"] = LogList.readxml(LISTXMLPATH)
+        db["loglist"] = LogList.readxml(LISTXMLPATH)
         
         # diary.xmlが存在するかチェック
-        if File.exist?(XMLPATH + session["loglist"].path[0].match(/[^\/]*?$/).to_a[0]) == false
+        if File.exist?(XMLPATH + File.basename(db["loglist"].path[0])) == false
           # なかった場合はdiary.xmlを自動生成
-          writer = FeedWriter.new(XMLPATH + session["loglist"].path[0].match(/[^\/]*?$/).to_a[0])
-          writer.to_xml(Feed.new({}), [])
+          Feed.to_xml(XMLPATH + File.basename(db["loglist"].path[0]), 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)
+        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
     end
   end
@@ -892,135 +1042,193 @@ class Controller
   # マルチパートフォームの場合の処理です
   def Controller.MultiForm(cgi, session, params, db)
     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"] = ""
+            params["mode"] = "error"
+            db["error"] = "ログファイルの追加中に重大なエラーが発生しました。"
+            return
+          end
+          
+          if File.basename(db["logpath"]).blank? || db["logdisplay"].blank?
+            params["action"] = ""
+            params["mode"] = "error"
+            db["error"] = "ログファイルの追加中に重大なエラーが発生しました。"
+            return
+          end
+          
           # ファイルを実際にアップロードします
           file = FileUploader.new
-          file.upload(session["logpath"], session["importxml"])
+          file.upload(db["logpath"], db["importxml"])
           
           # loglist.xmlを更新します
-          session["loglist"].path[session["loginsertindex"], 0] = session["logpath"]
-          session["loglist"].display[session["loginsertindex"], 0] = session["logdisplay"]
-          session["loglist"].to_xml
+          db["loglist"].path[db["loginsertindex"], 0] = db["logpath"]
+          db["loglist"].display[db["loginsertindex"], 0] = db["logdisplay"]
+          db["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)
+          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
-          session["logpath"] = Controller.get_mpart_value(cgi["logpath"])
-          session["loglist"].path.each do |val|
-            if val == session["logpath"]
+          db["logpath"] = Controller.get_mpart_value(cgi["logpath"])
+          db["loglist"].path.each do |val|
+            if val == db["logpath"]
               # 重複していた場合エラーメッセージを表示し、処理を行わない
-              session["logpath"] = ""
+              db["logpath"] = ""
               params["action"] = ""
-              session["error"] = "<br><span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
+              db["error"] = "<br><span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
               checkflag = false
-              break;
+              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
+          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(session["importxml"].to_s))
+              REXML::Document.new(Controller.fix_updata_enc(db["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>"
+              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 session["loginsertindex"] == 0
+          if db["loginsertindex"] == 0
             params["action"] = ""
-            session["error"] = "<br><span style='color: #ff0000'>ラジオボックスでログの挿入位置を選択してください!</span><br>"
+            db["error"] = "<br><span style='color: #ff0000'>ラジオボックスでログの挿入位置を選択してください!</span><br>"
+            return
           end
           
-          if session["logpath"] == FEEDXMLDIR || session["logdisplay"].blank?
+          if db["logpath"] == FEEDXMLDIR || db["logdisplay"].blank?
             params["action"] = ""
-            session["error"] = "<br><span style='color: #ff0000'>インポートファイル、及び、ログの表示名は空欄にできません。</span><br>"
+            db["error"] = "<br><span style='color: #ff0000'>インポートファイル、及び、ログの表示名は空欄にできません。</span><br>"
+            return
           end
+          
         else
-          # loglist.xmlをロードします
-          session["loglist"] = LogList.readxml(LISTXMLPATH)
         end
         
         # 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"])
+          
+          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 + session["logpath"].match(/[^\/]*?$/).to_s)
+          FileUtils.move(XMLPATH + "diary.xml", XMLPATH + File.basename(db["logpath"]))
           # ファイルをアップロードします
           file = FileUploader.new
-          file.upload("diary.xml", session["importxml"])
+          file.upload("diary.xml", db["importxml"])
           
           # loglist.xmlを更新します
-          session["loglist"].path[1, 0] = session["logpath"]
-          session["loglist"].display[1, 0] = session["logdisplay"]
-          session["loglist"].to_xml
+          db["loglist"].path[1, 0] = db["logpath"]
+          db["loglist"].display[1, 0] = db["logdisplay"]
+          db["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)
+          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
-          session["logpath"] = Controller.get_mpart_value(cgi["logpath"])
-          session["loglist"].path.each do |val|
-            if val == session["logpath"]
+          db["logpath"] = Controller.get_mpart_value(cgi["logpath"])
+          db["loglist"].path.each do |val|
+            if val == db["logpath"]
               # 重複していた場合エラーメッセージを表示し、処理を行わない
               params["action"] = ""
-              session["error"] = "<br><span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
+              db["error"] = "<br><span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
               checkflag = false
-              break;
+              return
             end
           end
           
           if checkflag == true
-            session["logdisplay"] = Controller.get_mpart_value(cgi["logdisplay"])
-            session["importxml"] = cgi["updata"].read
+            db["logdisplay"] = Controller.get_mpart_value(cgi["logdisplay"])
+            db["importxml"] = cgi["updata"].read
             
             # XMLの整合性をチェックします
             begin
-              REXML::Document.new(Controller.fix_updata_enc(session["importxml"].to_s))
+              REXML::Document.new(Controller.fix_updata_enc(db["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>"
+              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 session["logpath"].blank? || session["logdisplay"].blank? || session["importxml"].blank?
+          if db["logpath"].blank? || db["logdisplay"].blank? || db["importxml"].blank?
             params["action"] = ""
-            session["error"] = "<span style='color: #ff0000'>インポートファイル、及び、ログの表示名、ログのパスは空欄にできません。</span><br>"
+            db["error"] = "<br><span style='color: #ff0000'>インポートファイル、及び、ログの表示名、ログのパスは空欄にできません。</span><br>"
+            return
           end
+          
         else
-          # loglist.xmlをロードします
-          session["loglist"] = LogList.readxml(LISTXMLPATH)
         end
+        
       else
-        # loglist.xmlをロードします
-        session["loglist"] = LogList.readxml(LISTXMLPATH)
       end
     end
   end
@@ -1081,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")
@@ -1093,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
     
     # ビュー部分
@@ -1140,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