# ログインパスワード
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上の表示ページからログ格納ディレクトリまでのパス
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>)"
# _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
@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
# 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})
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]}\" />")
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クラス
# 可視・不可視を示すハッシュキーを格納する配列です
@display = {"entryid" => "none", "title" => "",
"summary" => "", "published" => "none",
- "updated" => "none", "url" => "none",
+ "updated" => "none", "url" => "",
"content" => "", "others"=>"none"}
# デバッグモードの場合、全ての入力要素を表示します
# 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})
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!(/(<\/(?:p|h\d|div)(?:>|>))\n/i, '\1')
str.gsub!(/\n/, '<br>') if REPLACEBRTAG
- str.gsub!(/(<(?:(?!>).)*?)#{Regexp.escape(FEEDXMLDIR)}/) { "#$1#{XMLPATH}" }
+ str.gsub!(/(<(?:(?!>).)*?)#{Regexp.escape(RELAYPATH)}/) { "#$1#{HOMEBASE}" }
str
end
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
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
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)を読み込み、管理するクラスです
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
- db["feed"] = Feed.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
- db["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
# 記事編集部分
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"
- db["entry"].each_with_index { |e, i|
- db["entry"][i] = db["editentry"] if e.entryid == cgi["editid"].to_s
- }
- 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
- db["feed"] = Feed.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
- db["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
# 記事削除部分
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
- db["entry"].each_with_index { |e, i|
- delindex = i if e.entryid == cgi["delid"].to_s
- }
- db["entry"].delete_at(delindex) unless delindex == nil
- 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
- db["feed"] = Feed.readxml(XMLPATH + session["filepath"].match(/[^\/]*?$/).to_a[0])
- db["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情報変更部分
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"
# 入力されたログが既に存在するかを確認
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
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
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
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]
# 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"] = ""
# なかった場合は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
# マルチパートフォームの場合の処理です
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"])
# 情報を更新します
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"
# 入力されたログファイルパスが既に存在するかを確認
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
db["error"] << CGI.escapeHTML(exception.to_s).gsub("\n", "<br>")
db["error"] << "</div>"
params["action"] = ""
+ return
end
end
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"])
# 情報を更新します
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"
# 入力されたログファイルパスが既に存在するかを確認
params["action"] = ""
db["error"] = "<br><span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
checkflag = false
- break;
+ return
end
end
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
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
# ビュー部分
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