OSDN Git Service

modieifed setting path only.
[feedblog/feedgenerator.git] / feedgenerator.rb
index bcbc3f6..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
@@ -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.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
   
@@ -363,9 +535,9 @@ class Entry < AbstractEntry
     str = CGI.unescapeHTML(str)
     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
   
@@ -374,8 +546,8 @@ class Entry < AbstractEntry
     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.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)を読み込み、管理するクラスです
@@ -567,23 +709,34 @@ class Controller
         db["loglist"] = LogList.readxml(LISTXMLPATH)
         # 初期状態で選択されるログは「loglist.xml」の最上に位置するログになります
         session["filepath"] = db["loglist"].path[0] if session["filepath"] == nil
-        db["feed"] = Feed.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
-        db["entry"] = Entry.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
+        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["target_filepath"] = params["target_filepath"]
           db["newentry"] = Entry.new(params)
           db["newentry"].content = db["newentry"].content_for_blog
           # 記事の追記を実際にファイルに反映
           when "exec"
-          db["entry"].unshift db["newentry"]
-          feedwriter = FeedWriter.new(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
-          feedwriter.to_xml(db["feed"], db["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["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
         
         # 記事編集部分
@@ -591,17 +744,31 @@ class Controller
         case params["action"]
           # 編集画面
           when "edit"
-          db["editindex"] = cgi["editindex"].to_i
+          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"
-          db["entry"][db["editindex"]] = db["editentry"]
-          feedwriter = FeedWriter.new(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
-          feedwriter.to_xml(db["feed"], db["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["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
         
         # 記事削除部分
@@ -609,12 +776,26 @@ class Controller
         case params["action"]
           # 確認画面
           when "confirm"
-          db["delindex"] = cgi["delindex"].to_i
+          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"
-          db["entry"].delete_at(db["delindex"])
-          feedwriter = FeedWriter.new(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
-          feedwriter.to_xml(db["feed"], db["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["target_filepath"] = session["filepath"]
+          db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
+          db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
         end
         
         # Feed情報変更部分
@@ -622,32 +803,49 @@ class Controller
         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"
-          feedwriter = FeedWriter.new(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
-          feedwriter.to_xml(db["feed"], db["entry"])
+          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"
+          # エラーチェック。この段階のエラーは強度のエラーを発する。
+          db["loglist"].path.each do |val|
+            if val == cgi["logpath"]
+              # 重複していた場合エラーメッセージを表示し、処理を行わない
+              params["action"] = ""
+              params["mode"] = "error"
+              db["error"] = "ログファイルの追加中に重大なエラーが発生しました。<br>環境を見直してください。"
+              return
+            end
+          end
+          
           # 入力された内容を保持する配列に追加
-          db["loglist"].path[1, 0] = db["logpath"]
-          db["loglist"].display[1, 0] = db["logdisplay"]
+          db["loglist"].path[1, 0] = cgi["logpath"]
+          db["loglist"].display[1, 0] = cgi["logdisplay"]
           db["loglist"].to_xml
           # 既存のdiary.xmlを指定された名称でコピーして保存
-          FileUtils.copy_file(XMLPATH + db["loglist"].path[0].match(/[^\/]*?$/).to_a[0], XMLPATH + db["logpath"].match(/[^\/]*?$/).to_a[0], true)
+          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オブジェクト
-          writer = FeedWriter.new(XMLPATH + db["loglist"].path[0].match(/[^\/]*?$/).to_a[0])
-          writer.to_xml(db["feed"], [])
+          # 新たなdiary.xmlを生成。この際保持する情報は同一のFeedオブジェクトnew()
+          Feed.to_xml(XMLPATH + File.basename(db["loglist"].path[0]), db["feed"], [])
           # 確認画面
           when "addconfirm"
           # 入力されたログが既に存在するかを確認
@@ -655,8 +853,8 @@ class Controller
             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
           
@@ -667,28 +865,34 @@ class Controller
             params["action"] = ""
           end
           when "back"
+          
           # 削除確認画面
           when "delconfirm"
           db["logdelindex"] = params["logdelindex"].to_i
           
-          if db["logdelindex"] == 0
+          if db["logdelindex"] < 1
+            db["error"] = "<span style='color: #ff0000'>ログファイルの削除パラメタが不正です。</span><br>"
             params["action"] = ""
           end
           # 削除処理
           when "delexec"
-          if db["logdelindex"] == 0
+          if cgi["logdelindex"].to_i < 1
             params["action"] = ""
+            params["mode"] = "error"
+            db["error"] = "ログファイルの削除中に重大なエラーが発生しました。<br>環境を見直してください。"
+            return
           else
             # 記事ファイルを削除します
-            File.delete(XMLPATH + db["loglist"].path[db["logdelindex"]].match(/[^\/]*?$/).to_s)
+            File.delete(XMLPATH + File.basename(db["loglist"].path[db["logdelindex"]]))
             # ログリストから削除します
-            db["loglist"].path.delete_at(db["logdelindex"])
-            db["loglist"].display.delete_at(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
@@ -697,11 +901,11 @@ class Controller
           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
@@ -722,21 +926,40 @@ class Controller
           end
           # 編集実行
           when "editexec"
-          # ファイルを移動します
-          if XMLPATH + db["loglist"].path[db["logeditindex"]].match(/[^\/]*?$/).to_s != XMLPATH + db["logpath"].match(/[^\/]*?$/).to_s
-            FileUtils.move(XMLPATH + db["loglist"].path[db["logeditindex"]].match(/[^\/]*?$/).to_s, XMLPATH + db["logpath"].match(/[^\/]*?$/).to_s)
+          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
-          # ログリストを更新します
-          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
+          
+          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
-          # 初期表示の際に内部保持データをリフレッシュ
-          db["loglist"] = LogList.readxml(LISTXMLPATH)
-          
           # 現在編集中のデータを強制的に最上のファイルパスに変更
           session["filepath"] = db["loglist"].path[0]
           
@@ -766,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({}), [])
           
           db["loglist"] = LogList.readxml(LISTXMLPATH)
           
           # diary.xmlの初期化
-          writer = FeedWriter.new(XMLPATH + db["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"] = db["loglist"].path[0]
-          db["feed"] = Feed.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0].to_s)
-          db["entry"] = Entry.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0].to_s)
+          db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
+          db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
           
           # 画面の遷移先をトップページにする
           params["mode"] = ""
@@ -800,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
         
         db["loglist"] = LogList.readxml(LISTXMLPATH)
         
         # diary.xmlが存在するかチェック
-        if File.exist?(XMLPATH + db["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 + db["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"] = db["loglist"].path[0] if session["filepath"] == nil
-        db["feed"] = Feed.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0].to_s)
-        db["entry"] = Entry.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0].to_s)
+        db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
+        db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
       end
     end
   end
@@ -824,11 +1042,45 @@ 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(db["logpath"], db["importxml"])
@@ -841,8 +1093,8 @@ class Controller
           # 情報を更新します
           db["loglist"] = LogList.readxml(LISTXMLPATH)
           session["filepath"] = db["loglist"].path[0] if session["filepath"] == nil
-          db["feed"] = Feed.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0].to_s)
-          db["entry"] = Entry.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0].to_s)
+          db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
+          db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
           
           when "confirm"
           # 入力されたログファイルパスが既に存在するかを確認
@@ -855,11 +1107,11 @@ class Controller
               params["action"] = ""
               db["error"] = "<br><span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
               checkflag = false
-              break;
+              return
             end
           end
           
-          if checkflag == true
+          if checkflag
             db["loginsertindex"] = cgi["loginsertindex"].read.to_i
             db["logdisplay"] = Controller.get_mpart_value(cgi["logdisplay"])
             db["importxml"] = cgi["updata"].read
@@ -873,6 +1125,7 @@ class Controller
               db["error"] << CGI.escapeHTML(exception.to_s).gsub("\n", "<br>")
               db["error"] << "</div>"
               params["action"] = ""
+              return
             end
           end
           
@@ -880,23 +1133,46 @@ class Controller
           if db["loginsertindex"] == 0
             params["action"] = ""
             db["error"] = "<br><span style='color: #ff0000'>ラジオボックスでログの挿入位置を選択してください!</span><br>"
+            return
           end
           
           if db["logpath"] == FEEDXMLDIR || db["logdisplay"].blank?
             params["action"] = ""
             db["error"] = "<br><span style='color: #ff0000'>インポートファイル、及び、ログの表示名は空欄にできません。</span><br>"
+            return
           end
+          
         else
-          # loglist.xmlをロードします
-          db["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 + db["logpath"].match(/[^\/]*?$/).to_s)
+          FileUtils.move(XMLPATH + "diary.xml", XMLPATH + File.basename(db["logpath"]))
           # ファイルをアップロードします
           file = FileUploader.new
           file.upload("diary.xml", db["importxml"])
@@ -909,8 +1185,8 @@ class Controller
           # 情報を更新します
           db["loglist"] = LogList.readxml(LISTXMLPATH)
           session["filepath"] = db["loglist"].path[0] if session["filepath"] == nil
-          db["feed"] = Feed.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0].to_s)
-          db["entry"] = Entry.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0].to_s)
+          db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
+          db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
           
           when "confirm"
           # 入力されたログファイルパスが既に存在するかを確認
@@ -922,7 +1198,7 @@ class Controller
               params["action"] = ""
               db["error"] = "<br><span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
               checkflag = false
-              break;
+              return
             end
           end
           
@@ -939,20 +1215,20 @@ class Controller
               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"] = "<span style='color: #ff0000'>インポートファイル、及び、ログの表示名、ログのパスは空欄にできません。</span><br>"
+            db["error"] = "<br><span style='color: #ff0000'>インポートファイル、及び、ログの表示名、ログのパスは空欄にできません。</span><br>"
+            return
           end
+          
         else
-          # loglist.xmlをロードします
-          db["loglist"] = LogList.readxml(LISTXMLPATH)
         end
+        
       else
-        # loglist.xmlをロードします
-        db["loglist"] = LogList.readxml(LISTXMLPATH)
       end
     end
   end
@@ -1034,13 +1310,26 @@ def main
       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
     
     # ビュー部分
@@ -1074,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