• R/O
  • HTTP
  • SSH
  • HTTPS

feedgenerator: Commit

rubyで構築された、Atom Feedの管理ツールです


Commit MetaInfo

Revision606484a32eb7a8062252b29991905b98eb42fa33 (tree)
Time2013-09-10 00:12:55
AuthorKureha Hisame <kureha@gmai...>
CommiterKureha Hisame

Log Message

- All desing updated.
- All module modified.

Change Summary

Incremental Difference

--- a/.gitignore
+++ b/.gitignore
@@ -4,4 +4,7 @@
44 *.loadpath
55 *.project
66 *.dat
7-plugins/*
\ No newline at end of file
7+*.prefs
8+logs/*
9+plugins/*
10+plugins_exclude*
\ No newline at end of file
--- /dev/null
+++ b/common.rb
@@ -0,0 +1,111 @@
1+#!/usr/local/bin/ruby
2+# -*- coding: utf-8 -*-
3+#
4+#= 共通ライブラリ集
5+#
6+#Autohr:: Kureha Hisame (http://lunardial.sakura.ne.jp/)
7+#Version:: 1.0.0.0
8+#Copyright:: Copyright 2013 Kureha Hisame (http://lunardial.sakura.ne.jp/)
9+#License:: GPLv3
10+
11+require "logger"
12+
13+# = WebLoggerクラス
14+#
15+# ロガーを取得する為のクラスです
16+class WebLogger
17+ @@max_log_size = 10 * 1024 * 1024
18+
19+ def self.get_logger(script_name = "", log_dir = "", release_flag = false)
20+ if script_name.empty?
21+ log_filename = "#{log_dir}/default.log"
22+ log_filename_bk = "#{log_dir}/default.log.bk.log"
23+ else
24+ log_filename = "#{log_dir}/" + File.basename(script_name, ".*") + ".log"
25+ log_filename_bk = "#{log_dir}/" + File.basename(script_name, ".*") + ".bk.log"
26+ end
27+ if File.exist?(log_filename)
28+ status = File::stat(log_filename)
29+ if status.size > @@max_log_size
30+ File.rename(log_filename, log_filename_bk)
31+ end
32+ end
33+
34+ logger = Object::Logger.new(log_filename)
35+
36+ if release_flag == true
37+ logger.level = Object::Logger::ERROR
38+ else
39+ logger.level = Object::Logger::DEBUG
40+ end
41+
42+ logger
43+ end
44+end
45+
46+# = HtmlWriterクラス
47+#
48+# テンプレートファイル(*.erb)を読み込み、管理するクラスです
49+class HtmlWriter
50+ # 初期化メソッドです
51+ #
52+ # _template_ :: テンプレートファイル(*.erb)のパス
53+ # _binding_ :: binding変数
54+ def initialize(template, binding)
55+ @erb = ERB.new(myopen(template, "r:utf-8") {|f| f.read}, nil, "-")
56+ @binding = binding
57+ end
58+
59+ # テンプレートファイルの文字列を返却するメソッドです
60+ def to_code
61+ @erb.result(@binding)
62+ end
63+end
64+
65+
66+# = Objectクラス
67+#
68+# 基本クラスのオーバーライドを行います
69+class Object
70+ # myopenメソッド
71+ #
72+ # ruby-1.9.x以降ではファイルを開いた際、エンコードの指定を行わないとエラーの原因になります。
73+ # ただしruby-1.8.6以前はエンコードの指定に対応していないため、独自メソッドを定義してファイルの入出力を行います。
74+ #
75+ # _arg[0]_ :: 入出力を行うファイルのパス
76+ # _arg[1]_ :: モードの指定。例 : w:utf-8(書き込みモード・UTF-8エンコードでファイルを開く)
77+ def myopen(*arg)
78+ mode = arg[1]
79+ rdonly_p = true
80+ case mode
81+ when String
82+ arg[1] = mode[/[^:]+/] if RUBY_VERSION < "1.8.7" && mode.include?(':')
83+ rdonly_p = /\A[^:]*[wa+]/ !~ mode
84+ when Numeric
85+ rdonly_p = !(mode & (IO::WRONY | IO::RDWR))
86+ end
87+ open(*arg) do |f|
88+ f.flock(rdonly_p ? File::LOCK_SH : File::LOCK_EX)
89+ return yield(f)
90+ end
91+ end
92+end
93+
94+class NilClass
95+ def blank?
96+ nil?
97+ end
98+end
99+
100+class Array
101+ def blank?
102+ empty?
103+ end
104+end
105+
106+class String
107+ def blank?
108+ empty?
109+ end
110+end
111+
--- /dev/null
+++ b/css/PIE.htc
@@ -0,0 +1,96 @@
1+<!--
2+PIE: CSS3 rendering for IE
3+Version 1.0.0
4+http://css3pie.com
5+Dual-licensed for use under the Apache License Version 2.0 or the General Public License (GPL) Version 2.
6+-->
7+<PUBLIC:COMPONENT lightWeight="true">
8+<!-- saved from url=(0014)about:internet -->
9+<PUBLIC:ATTACH EVENT="oncontentready" FOR="element" ONEVENT="init()" />
10+<PUBLIC:ATTACH EVENT="ondocumentready" FOR="element" ONEVENT="init()" />
11+<PUBLIC:ATTACH EVENT="ondetach" FOR="element" ONEVENT="cleanup()" />
12+
13+<script type="text/javascript">
14+var doc = element.document;var f=window.PIE;
15+if(!f){f=window.PIE={F:"-pie-",nb:"Pie",La:"pie_",Ac:{TD:1,TH:1},cc:{TABLE:1,THEAD:1,TBODY:1,TFOOT:1,TR:1,INPUT:1,TEXTAREA:1,SELECT:1,OPTION:1,IMG:1,HR:1},fc:{A:1,INPUT:1,TEXTAREA:1,SELECT:1,BUTTON:1},Gd:{submit:1,button:1,reset:1},aa:function(){}};try{doc.execCommand("BackgroundImageCache",false,true)}catch(aa){}for(var ba=4,Z=doc.createElement("div"),ca=Z.getElementsByTagName("i"),ga;Z.innerHTML="<!--[if gt IE "+ ++ba+"]><i></i><![endif]--\>",ca[0];);f.O=ba;if(ba===6)f.F=f.F.replace(/^-/,"");f.ja=
16+doc.documentMode||f.O;Z.innerHTML='<v:shape adj="1"/>';ga=Z.firstChild;ga.style.behavior="url(#default#VML)";f.zc=typeof ga.adj==="object";(function(){var a,b=0,c={};f.p={Za:function(d){if(!a){a=doc.createDocumentFragment();a.namespaces.add("css3vml","urn:schemas-microsoft-com:vml")}return a.createElement("css3vml:"+d)},Ba:function(d){return d&&d._pieId||(d._pieId="_"+ ++b)},Eb:function(d){var e,g,j,i,h=arguments;e=1;for(g=h.length;e<g;e++){i=h[e];for(j in i)if(i.hasOwnProperty(j))d[j]=i[j]}return d},
17+Rb:function(d,e,g){var j=c[d],i,h;if(j)Object.prototype.toString.call(j)==="[object Array]"?j.push([e,g]):e.call(g,j);else{h=c[d]=[[e,g]];i=new Image;i.onload=function(){j=c[d]={h:i.width,f:i.height};for(var k=0,n=h.length;k<n;k++)h[k][0].call(h[k][1],j);i.onload=null};i.src=d}}}})();f.Na={gc:function(a,b,c,d){function e(){k=j>=90&&j<270?b:0;n=j<180?c:0;m=b-k;p=c-n}function g(){for(;j<0;)j+=360;j%=360}var j=d.sa;d=d.zb;var i,h,k,n,m,p,r,t;if(d){d=d.coords(a,b,c);i=d.x;h=d.y}if(j){j=j.jd();g();e();
18+if(!d){i=k;h=n}d=f.Na.tc(i,h,j,m,p);a=d[0];d=d[1]}else if(d){a=b-i;d=c-h}else{i=h=a=0;d=c}r=a-i;t=d-h;if(j===void 0){j=!r?t<0?90:270:!t?r<0?180:0:-Math.atan2(t,r)/Math.PI*180;g();e()}return{sa:j,xc:i,yc:h,td:a,ud:d,Wd:k,Xd:n,rd:m,sd:p,kd:r,ld:t,rc:f.Na.dc(i,h,a,d)}},tc:function(a,b,c,d,e){if(c===0||c===180)return[d,b];else if(c===90||c===270)return[a,e];else{c=Math.tan(-c*Math.PI/180);a=c*a-b;b=-1/c;d=b*d-e;e=b-c;return[(d-a)/e,(c*d-b*a)/e]}},dc:function(a,b,c,d){a=c-a;b=d-b;return Math.abs(a===0?
19+b:b===0?a:Math.sqrt(a*a+b*b))}};f.ea=function(){this.Gb=[];this.oc={}};f.ea.prototype={ba:function(a){var b=f.p.Ba(a),c=this.oc,d=this.Gb;if(!(b in c)){c[b]=d.length;d.push(a)}},Ha:function(a){a=f.p.Ba(a);var b=this.oc;if(a&&a in b){delete this.Gb[b[a]];delete b[a]}},xa:function(){for(var a=this.Gb,b=a.length;b--;)a[b]&&a[b]()}};f.Oa=new f.ea;f.Oa.Rd=function(){var a=this,b;if(!a.Sd){b=doc.documentElement.currentStyle.getAttribute(f.F+"poll-interval")||250;(function c(){a.xa();setTimeout(c,b)})();
20+a.Sd=1}};(function(){function a(){f.L.xa();window.detachEvent("onunload",a);window.PIE=null}f.L=new f.ea;window.attachEvent("onunload",a);f.L.ta=function(b,c,d){b.attachEvent(c,d);this.ba(function(){b.detachEvent(c,d)})}})();f.Qa=new f.ea;f.L.ta(window,"onresize",function(){f.Qa.xa()});(function(){function a(){f.mb.xa()}f.mb=new f.ea;f.L.ta(window,"onscroll",a);f.Qa.ba(a)})();(function(){function a(){c=f.kb.md()}function b(){if(c){for(var d=0,e=c.length;d<e;d++)f.attach(c[d]);c=0}}var c;if(f.ja<9){f.L.ta(window,
21+"onbeforeprint",a);f.L.ta(window,"onafterprint",b)}})();f.lb=new f.ea;f.L.ta(doc,"onmouseup",function(){f.lb.xa()});f.he=function(){function a(h){this.Y=h}var b=doc.createElement("length-calc"),c=doc.body||doc.documentElement,d=b.style,e={},g=["mm","cm","in","pt","pc"],j=g.length,i={};d.position="absolute";d.top=d.left="-9999px";for(c.appendChild(b);j--;){d.width="100"+g[j];e[g[j]]=b.offsetWidth/100}c.removeChild(b);d.width="1em";a.prototype={Kb:/(px|em|ex|mm|cm|in|pt|pc|%)$/,ic:function(){var h=
22+this.Jd;if(h===void 0)h=this.Jd=parseFloat(this.Y);return h},yb:function(){var h=this.ae;if(!h)h=this.ae=(h=this.Y.match(this.Kb))&&h[0]||"px";return h},a:function(h,k){var n=this.ic(),m=this.yb();switch(m){case "px":return n;case "%":return n*(typeof k==="function"?k():k)/100;case "em":return n*this.xb(h);case "ex":return n*this.xb(h)/2;default:return n*e[m]}},xb:function(h){var k=h.currentStyle.fontSize,n,m;if(k.indexOf("px")>0)return parseFloat(k);else if(h.tagName in f.cc){m=this;n=h.parentNode;
23+return f.n(k).a(n,function(){return m.xb(n)})}else{h.appendChild(b);k=b.offsetWidth;b.parentNode===h&&h.removeChild(b);return k}}};f.n=function(h){return i[h]||(i[h]=new a(h))};return a}();f.Ja=function(){function a(e){this.X=e}var b=f.n("50%"),c={top:1,center:1,bottom:1},d={left:1,center:1,right:1};a.prototype={zd:function(){if(!this.ac){var e=this.X,g=e.length,j=f.v,i=j.qa,h=f.n("0");i=i.na;h=["left",h,"top",h];if(g===1){e.push(new j.ob(i,"center"));g++}if(g===2){i&(e[0].k|e[1].k)&&e[0].d in c&&
24+e[1].d in d&&e.push(e.shift());if(e[0].k&i)if(e[0].d==="center")h[1]=b;else h[0]=e[0].d;else if(e[0].W())h[1]=f.n(e[0].d);if(e[1].k&i)if(e[1].d==="center")h[3]=b;else h[2]=e[1].d;else if(e[1].W())h[3]=f.n(e[1].d)}this.ac=h}return this.ac},coords:function(e,g,j){var i=this.zd(),h=i[1].a(e,g);e=i[3].a(e,j);return{x:i[0]==="right"?g-h:h,y:i[2]==="bottom"?j-e:e}}};return a}();f.Ka=function(){function a(b,c){this.h=b;this.f=c}a.prototype={a:function(b,c,d,e,g){var j=this.h,i=this.f,h=c/d;e=e/g;if(j===
25+"contain"){j=e>h?c:d*e;i=e>h?c/e:d}else if(j==="cover"){j=e<h?c:d*e;i=e<h?c/e:d}else if(j==="auto"){i=i==="auto"?g:i.a(b,d);j=i*e}else{j=j.a(b,c);i=i==="auto"?j/e:i.a(b,d)}return{h:j,f:i}}};a.Kc=new a("auto","auto");return a}();f.Ec=function(){function a(b){this.Y=b}a.prototype={Kb:/[a-z]+$/i,yb:function(){return this.ad||(this.ad=this.Y.match(this.Kb)[0].toLowerCase())},jd:function(){var b=this.Vc,c;if(b===undefined){b=this.yb();c=parseFloat(this.Y,10);b=this.Vc=b==="deg"?c:b==="rad"?c/Math.PI*180:
26+b==="grad"?c/400*360:b==="turn"?c*360:0}return b}};return a}();f.Jc=function(){function a(c){this.Y=c}var b={};a.Qd=/\s*rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d+|\d*\.\d+)\s*\)\s*/;a.Fb={aliceblue:"F0F8FF",antiquewhite:"FAEBD7",aqua:"0FF",aquamarine:"7FFFD4",azure:"F0FFFF",beige:"F5F5DC",bisque:"FFE4C4",black:"000",blanchedalmond:"FFEBCD",blue:"00F",blueviolet:"8A2BE2",brown:"A52A2A",burlywood:"DEB887",cadetblue:"5F9EA0",chartreuse:"7FFF00",chocolate:"D2691E",coral:"FF7F50",cornflowerblue:"6495ED",
27+cornsilk:"FFF8DC",crimson:"DC143C",cyan:"0FF",darkblue:"00008B",darkcyan:"008B8B",darkgoldenrod:"B8860B",darkgray:"A9A9A9",darkgreen:"006400",darkkhaki:"BDB76B",darkmagenta:"8B008B",darkolivegreen:"556B2F",darkorange:"FF8C00",darkorchid:"9932CC",darkred:"8B0000",darksalmon:"E9967A",darkseagreen:"8FBC8F",darkslateblue:"483D8B",darkslategray:"2F4F4F",darkturquoise:"00CED1",darkviolet:"9400D3",deeppink:"FF1493",deepskyblue:"00BFFF",dimgray:"696969",dodgerblue:"1E90FF",firebrick:"B22222",floralwhite:"FFFAF0",
28+forestgreen:"228B22",fuchsia:"F0F",gainsboro:"DCDCDC",ghostwhite:"F8F8FF",gold:"FFD700",goldenrod:"DAA520",gray:"808080",green:"008000",greenyellow:"ADFF2F",honeydew:"F0FFF0",hotpink:"FF69B4",indianred:"CD5C5C",indigo:"4B0082",ivory:"FFFFF0",khaki:"F0E68C",lavender:"E6E6FA",lavenderblush:"FFF0F5",lawngreen:"7CFC00",lemonchiffon:"FFFACD",lightblue:"ADD8E6",lightcoral:"F08080",lightcyan:"E0FFFF",lightgoldenrodyellow:"FAFAD2",lightgreen:"90EE90",lightgrey:"D3D3D3",lightpink:"FFB6C1",lightsalmon:"FFA07A",
29+lightseagreen:"20B2AA",lightskyblue:"87CEFA",lightslategray:"789",lightsteelblue:"B0C4DE",lightyellow:"FFFFE0",lime:"0F0",limegreen:"32CD32",linen:"FAF0E6",magenta:"F0F",maroon:"800000",mediumauqamarine:"66CDAA",mediumblue:"0000CD",mediumorchid:"BA55D3",mediumpurple:"9370D8",mediumseagreen:"3CB371",mediumslateblue:"7B68EE",mediumspringgreen:"00FA9A",mediumturquoise:"48D1CC",mediumvioletred:"C71585",midnightblue:"191970",mintcream:"F5FFFA",mistyrose:"FFE4E1",moccasin:"FFE4B5",navajowhite:"FFDEAD",
30+navy:"000080",oldlace:"FDF5E6",olive:"808000",olivedrab:"688E23",orange:"FFA500",orangered:"FF4500",orchid:"DA70D6",palegoldenrod:"EEE8AA",palegreen:"98FB98",paleturquoise:"AFEEEE",palevioletred:"D87093",papayawhip:"FFEFD5",peachpuff:"FFDAB9",peru:"CD853F",pink:"FFC0CB",plum:"DDA0DD",powderblue:"B0E0E6",purple:"800080",red:"F00",rosybrown:"BC8F8F",royalblue:"4169E1",saddlebrown:"8B4513",salmon:"FA8072",sandybrown:"F4A460",seagreen:"2E8B57",seashell:"FFF5EE",sienna:"A0522D",silver:"C0C0C0",skyblue:"87CEEB",
31+slateblue:"6A5ACD",slategray:"708090",snow:"FFFAFA",springgreen:"00FF7F",steelblue:"4682B4",tan:"D2B48C",teal:"008080",thistle:"D8BFD8",tomato:"FF6347",turquoise:"40E0D0",violet:"EE82EE",wheat:"F5DEB3",white:"FFF",whitesmoke:"F5F5F5",yellow:"FF0",yellowgreen:"9ACD32"};a.prototype={parse:function(){if(!this.Ua){var c=this.Y,d;if(d=c.match(a.Qd)){this.Ua="rgb("+d[1]+","+d[2]+","+d[3]+")";this.Yb=parseFloat(d[4])}else{if((d=c.toLowerCase())in a.Fb)c="#"+a.Fb[d];this.Ua=c;this.Yb=c==="transparent"?0:
32+1}}},U:function(c){this.parse();return this.Ua==="currentColor"?c.currentStyle.color:this.Ua},fa:function(){this.parse();return this.Yb}};f.ha=function(c){return b[c]||(b[c]=new a(c))};return a}();f.v=function(){function a(c){this.$a=c;this.ch=0;this.X=[];this.Ga=0}var b=a.qa={Ia:1,Wb:2,z:4,Lc:8,Xb:16,na:32,K:64,oa:128,pa:256,Ra:512,Tc:1024,URL:2048};a.ob=function(c,d){this.k=c;this.d=d};a.ob.prototype={Ca:function(){return this.k&b.K||this.k&b.oa&&this.d==="0"},W:function(){return this.Ca()||this.k&
33+b.Ra}};a.prototype={de:/\s/,Kd:/^[\+\-]?(\d*\.)?\d+/,url:/^url\(\s*("([^"]*)"|'([^']*)'|([!#$%&*-~]*))\s*\)/i,nc:/^\-?[_a-z][\w-]*/i,Yd:/^("([^"]*)"|'([^']*)')/,Bd:/^#([\da-f]{6}|[\da-f]{3})/i,be:{px:b.K,em:b.K,ex:b.K,mm:b.K,cm:b.K,"in":b.K,pt:b.K,pc:b.K,deg:b.Ia,rad:b.Ia,grad:b.Ia},fd:{rgb:1,rgba:1,hsl:1,hsla:1},next:function(c){function d(p,r){p=new a.ob(p,r);if(!c){k.X.push(p);k.Ga++}return p}function e(){k.Ga++;return null}var g,j,i,h,k=this;if(this.Ga<this.X.length)return this.X[this.Ga++];for(;this.de.test(this.$a.charAt(this.ch));)this.ch++;
34+if(this.ch>=this.$a.length)return e();j=this.ch;g=this.$a.substring(this.ch);i=g.charAt(0);switch(i){case "#":if(h=g.match(this.Bd)){this.ch+=h[0].length;return d(b.z,h[0])}break;case '"':case "'":if(h=g.match(this.Yd)){this.ch+=h[0].length;return d(b.Tc,h[2]||h[3]||"")}break;case "/":case ",":this.ch++;return d(b.pa,i);case "u":if(h=g.match(this.url)){this.ch+=h[0].length;return d(b.URL,h[2]||h[3]||h[4]||"")}}if(h=g.match(this.Kd)){i=h[0];this.ch+=i.length;if(g.charAt(i.length)==="%"){this.ch++;
35+return d(b.Ra,i+"%")}if(h=g.substring(i.length).match(this.nc)){i+=h[0];this.ch+=h[0].length;return d(this.be[h[0].toLowerCase()]||b.Lc,i)}return d(b.oa,i)}if(h=g.match(this.nc)){i=h[0];this.ch+=i.length;if(i.toLowerCase()in f.Jc.Fb||i==="currentColor"||i==="transparent")return d(b.z,i);if(g.charAt(i.length)==="("){this.ch++;if(i.toLowerCase()in this.fd){g=function(p){return p&&p.k&b.oa};h=function(p){return p&&p.k&(b.oa|b.Ra)};var n=function(p,r){return p&&p.d===r},m=function(){return k.next(1)};
36+if((i.charAt(0)==="r"?h(m()):g(m()))&&n(m(),",")&&h(m())&&n(m(),",")&&h(m())&&(i==="rgb"||i==="hsa"||n(m(),",")&&g(m()))&&n(m(),")"))return d(b.z,this.$a.substring(j,this.ch));return e()}return d(b.Xb,i)}return d(b.na,i)}this.ch++;return d(b.Wb,i)},D:function(){return this.X[this.Ga-- -2]},all:function(){for(;this.next(););return this.X},ma:function(c,d){for(var e=[],g,j;g=this.next();){if(c(g)){j=true;this.D();break}e.push(g)}return d&&!j?null:e}};return a}();var ha=function(a){this.e=a};ha.prototype=
37+{Z:0,Od:function(){var a=this.qb,b;return!a||(b=this.o())&&(a.x!==b.x||a.y!==b.y)},Td:function(){var a=this.qb,b;return!a||(b=this.o())&&(a.h!==b.h||a.f!==b.f)},hc:function(){var a=this.e,b=a.getBoundingClientRect(),c=f.ja===9,d=f.O===7,e=b.right-b.left;return{x:b.left,y:b.top,h:c||d?a.offsetWidth:e,f:c||d?a.offsetHeight:b.bottom-b.top,Hd:d&&e?a.offsetWidth/e:1}},o:function(){return this.Z?this.Va||(this.Va=this.hc()):this.hc()},Ad:function(){return!!this.qb},cb:function(){++this.Z},hb:function(){if(!--this.Z){if(this.Va)this.qb=
38+this.Va;this.Va=null}}};(function(){function a(b){var c=f.p.Ba(b);return function(){if(this.Z){var d=this.$b||(this.$b={});return c in d?d[c]:(d[c]=b.call(this))}else return b.call(this)}}f.B={Z:0,ka:function(b){function c(d){this.e=d;this.Zb=this.ia()}f.p.Eb(c.prototype,f.B,b);c.$c={};return c},j:function(){var b=this.ia(),c=this.constructor.$c;return b?b in c?c[b]:(c[b]=this.la(b)):null},ia:a(function(){var b=this.e,c=this.constructor,d=b.style;b=b.currentStyle;var e=this.wa,g=this.Fa,j=c.Yc||(c.Yc=
39+f.F+e);c=c.Zc||(c.Zc=f.nb+g.charAt(0).toUpperCase()+g.substring(1));return d[c]||b.getAttribute(j)||d[g]||b.getAttribute(e)}),i:a(function(){return!!this.j()}),H:a(function(){var b=this.ia(),c=b!==this.Zb;this.Zb=b;return c}),va:a,cb:function(){++this.Z},hb:function(){--this.Z||delete this.$b}}})();f.Sb=f.B.ka({wa:f.F+"background",Fa:f.nb+"Background",cd:{scroll:1,fixed:1,local:1},fb:{"repeat-x":1,"repeat-y":1,repeat:1,"no-repeat":1},sc:{"padding-box":1,"border-box":1,"content-box":1},Pd:{top:1,right:1,
40+bottom:1,left:1,center:1},Ud:{contain:1,cover:1},eb:{Ma:"backgroundClip",z:"backgroundColor",da:"backgroundImage",Pa:"backgroundOrigin",S:"backgroundPosition",T:"backgroundRepeat",Sa:"backgroundSize"},la:function(a){function b(s){return s&&s.W()||s.k&k&&s.d in t}function c(s){return s&&(s.W()&&f.n(s.d)||s.d==="auto"&&"auto")}var d=this.e.currentStyle,e,g,j,i=f.v.qa,h=i.pa,k=i.na,n=i.z,m,p,r=0,t=this.Pd,v,l,q={M:[]};if(this.wb()){e=new f.v(a);for(j={};g=e.next();){m=g.k;p=g.d;if(!j.P&&m&i.Xb&&p===
41+"linear-gradient"){v={ca:[],P:p};for(l={};g=e.next();){m=g.k;p=g.d;if(m&i.Wb&&p===")"){l.color&&v.ca.push(l);v.ca.length>1&&f.p.Eb(j,v);break}if(m&n){if(v.sa||v.zb){g=e.D();if(g.k!==h)break;e.next()}l={color:f.ha(p)};g=e.next();if(g.W())l.db=f.n(g.d);else e.D()}else if(m&i.Ia&&!v.sa&&!l.color&&!v.ca.length)v.sa=new f.Ec(g.d);else if(b(g)&&!v.zb&&!l.color&&!v.ca.length){e.D();v.zb=new f.Ja(e.ma(function(s){return!b(s)},false))}else if(m&h&&p===","){if(l.color){v.ca.push(l);l={}}}else break}}else if(!j.P&&
42+m&i.URL){j.Ab=p;j.P="image"}else if(b(g)&&!j.$){e.D();j.$=new f.Ja(e.ma(function(s){return!b(s)},false))}else if(m&k)if(p in this.fb&&!j.bb)j.bb=p;else if(p in this.sc&&!j.Wa){j.Wa=p;if((g=e.next())&&g.k&k&&g.d in this.sc)j.ub=g.d;else{j.ub=p;e.D()}}else if(p in this.cd&&!j.bc)j.bc=p;else return null;else if(m&n&&!q.color)q.color=f.ha(p);else if(m&h&&p==="/"&&!j.Xa&&j.$){g=e.next();if(g.k&k&&g.d in this.Ud)j.Xa=new f.Ka(g.d);else if(g=c(g)){m=c(e.next());if(!m){m=g;e.D()}j.Xa=new f.Ka(g,m)}else return null}else if(m&
43+h&&p===","&&j.P){j.Hb=a.substring(r,e.ch-1);r=e.ch;q.M.push(j);j={}}else return null}if(j.P){j.Hb=a.substring(r);q.M.push(j)}}else this.Bc(f.ja<9?function(){var s=this.eb,o=d[s.S+"X"],u=d[s.S+"Y"],x=d[s.da],y=d[s.z];if(y!=="transparent")q.color=f.ha(y);if(x!=="none")q.M=[{P:"image",Ab:(new f.v(x)).next().d,bb:d[s.T],$:new f.Ja((new f.v(o+" "+u)).all())}]}:function(){var s=this.eb,o=/\s*,\s*/,u=d[s.da].split(o),x=d[s.z],y,z,B,E,D,C;if(x!=="transparent")q.color=f.ha(x);if((E=u.length)&&u[0]!=="none"){x=
44+d[s.T].split(o);y=d[s.S].split(o);z=d[s.Pa].split(o);B=d[s.Ma].split(o);s=d[s.Sa].split(o);q.M=[];for(o=0;o<E;o++)if((D=u[o])&&D!=="none"){C=s[o].split(" ");q.M.push({Hb:D+" "+x[o]+" "+y[o]+" / "+s[o]+" "+z[o]+" "+B[o],P:"image",Ab:(new f.v(D)).next().d,bb:x[o],$:new f.Ja((new f.v(y[o])).all()),Wa:z[o],ub:B[o],Xa:new f.Ka(C[0],C[1])})}}});return q.color||q.M[0]?q:null},Bc:function(a){var b=f.ja>8,c=this.eb,d=this.e.runtimeStyle,e=d[c.da],g=d[c.z],j=d[c.T],i,h,k,n;if(e)d[c.da]="";if(g)d[c.z]="";if(j)d[c.T]=
45+"";if(b){i=d[c.Ma];h=d[c.Pa];n=d[c.S];k=d[c.Sa];if(i)d[c.Ma]="";if(h)d[c.Pa]="";if(n)d[c.S]="";if(k)d[c.Sa]=""}a=a.call(this);if(e)d[c.da]=e;if(g)d[c.z]=g;if(j)d[c.T]=j;if(b){if(i)d[c.Ma]=i;if(h)d[c.Pa]=h;if(n)d[c.S]=n;if(k)d[c.Sa]=k}return a},ia:f.B.va(function(){return this.wb()||this.Bc(function(){var a=this.e.currentStyle,b=this.eb;return a[b.z]+" "+a[b.da]+" "+a[b.T]+" "+a[b.S+"X"]+" "+a[b.S+"Y"]})}),wb:f.B.va(function(){var a=this.e;return a.style[this.Fa]||a.currentStyle.getAttribute(this.wa)}),
46+qc:function(){var a=0;if(f.O<7){a=this.e;a=""+(a.style[f.nb+"PngFix"]||a.currentStyle.getAttribute(f.F+"png-fix"))==="true"}return a},i:f.B.va(function(){return(this.wb()||this.qc())&&!!this.j()})});f.Vb=f.B.ka({wc:["Top","Right","Bottom","Left"],Id:{thin:"1px",medium:"3px",thick:"5px"},la:function(){var a={},b={},c={},d=false,e=true,g=true,j=true;this.Cc(function(){for(var i=this.e.currentStyle,h=0,k,n,m,p,r,t,v;h<4;h++){m=this.wc[h];v=m.charAt(0).toLowerCase();k=b[v]=i["border"+m+"Style"];n=i["border"+
47+m+"Color"];m=i["border"+m+"Width"];if(h>0){if(k!==p)g=false;if(n!==r)e=false;if(m!==t)j=false}p=k;r=n;t=m;c[v]=f.ha(n);m=a[v]=f.n(b[v]==="none"?"0":this.Id[m]||m);if(m.a(this.e)>0)d=true}});return d?{J:a,Zd:b,gd:c,ee:j,hd:e,$d:g}:null},ia:f.B.va(function(){var a=this.e,b=a.currentStyle,c;a.tagName in f.Ac&&a.offsetParent.currentStyle.borderCollapse==="collapse"||this.Cc(function(){c=b.borderWidth+"|"+b.borderStyle+"|"+b.borderColor});return c}),Cc:function(a){var b=this.e.runtimeStyle,c=b.borderWidth,
48+d=b.borderColor;if(c)b.borderWidth="";if(d)b.borderColor="";a=a.call(this);if(c)b.borderWidth=c;if(d)b.borderColor=d;return a}});(function(){f.jb=f.B.ka({wa:"border-radius",Fa:"borderRadius",la:function(b){var c=null,d,e,g,j,i=false;if(b){e=new f.v(b);var h=function(){for(var k=[],n;(g=e.next())&&g.W();){j=f.n(g.d);n=j.ic();if(n<0)return null;if(n>0)i=true;k.push(j)}return k.length>0&&k.length<5?{tl:k[0],tr:k[1]||k[0],br:k[2]||k[0],bl:k[3]||k[1]||k[0]}:null};if(b=h()){if(g){if(g.k&f.v.qa.pa&&g.d===
49+"/")d=h()}else d=b;if(i&&b&&d)c={x:b,y:d}}}return c}});var a=f.n("0");a={tl:a,tr:a,br:a,bl:a};f.jb.Dc={x:a,y:a}})();f.Ub=f.B.ka({wa:"border-image",Fa:"borderImage",fb:{stretch:1,round:1,repeat:1,space:1},la:function(a){var b=null,c,d,e,g,j,i,h=0,k=f.v.qa,n=k.na,m=k.oa,p=k.Ra;if(a){c=new f.v(a);b={};for(var r=function(l){return l&&l.k&k.pa&&l.d==="/"},t=function(l){return l&&l.k&n&&l.d==="fill"},v=function(){g=c.ma(function(l){return!(l.k&(m|p))});if(t(c.next())&&!b.fill)b.fill=true;else c.D();if(r(c.next())){h++;
50+j=c.ma(function(l){return!l.W()&&!(l.k&n&&l.d==="auto")});if(r(c.next())){h++;i=c.ma(function(l){return!l.Ca()})}}else c.D()};a=c.next();){d=a.k;e=a.d;if(d&(m|p)&&!g){c.D();v()}else if(t(a)&&!b.fill){b.fill=true;v()}else if(d&n&&this.fb[e]&&!b.repeat){b.repeat={f:e};if(a=c.next())if(a.k&n&&this.fb[a.d])b.repeat.Ob=a.d;else c.D()}else if(d&k.URL&&!b.src)b.src=e;else return null}if(!b.src||!g||g.length<1||g.length>4||j&&j.length>4||h===1&&j.length<1||i&&i.length>4||h===2&&i.length<1)return null;if(!b.repeat)b.repeat=
51+{f:"stretch"};if(!b.repeat.Ob)b.repeat.Ob=b.repeat.f;a=function(l,q){return{t:q(l[0]),r:q(l[1]||l[0]),b:q(l[2]||l[0]),l:q(l[3]||l[1]||l[0])}};b.slice=a(g,function(l){return f.n(l.k&m?l.d+"px":l.d)});if(j&&j[0])b.J=a(j,function(l){return l.W()?f.n(l.d):l.d});if(i&&i[0])b.Da=a(i,function(l){return l.Ca()?f.n(l.d):l.d})}return b}});f.Ic=f.B.ka({wa:"box-shadow",Fa:"boxShadow",la:function(a){var b,c=f.n,d=f.v.qa,e;if(a){e=new f.v(a);b={Da:[],Bb:[]};for(a=function(){for(var g,j,i,h,k,n;g=e.next();){i=g.d;
52+j=g.k;if(j&d.pa&&i===",")break;else if(g.Ca()&&!k){e.D();k=e.ma(function(m){return!m.Ca()})}else if(j&d.z&&!h)h=i;else if(j&d.na&&i==="inset"&&!n)n=true;else return false}g=k&&k.length;if(g>1&&g<5){(n?b.Bb:b.Da).push({fe:c(k[0].d),ge:c(k[1].d),blur:c(k[2]?k[2].d:"0"),Vd:c(k[3]?k[3].d:"0"),color:f.ha(h||"currentColor")});return true}return false};a(););}return b&&(b.Bb.length||b.Da.length)?b:null}});f.Uc=f.B.ka({ia:f.B.va(function(){var a=this.e.currentStyle;return a.visibility+"|"+a.display}),la:function(){var a=
53+this.e,b=a.runtimeStyle;a=a.currentStyle;var c=b.visibility,d;b.visibility="";d=a.visibility;b.visibility=c;return{ce:d!=="hidden",nd:a.display!=="none"}},i:function(){return false}});f.u={R:function(a){function b(c,d,e,g){this.e=c;this.s=d;this.g=e;this.parent=g}f.p.Eb(b.prototype,f.u,a);return b},Cb:false,Q:function(){return false},Ea:f.aa,Lb:function(){this.m();this.i()&&this.V()},ib:function(){this.Cb=true},Mb:function(){this.i()?this.V():this.m()},sb:function(a,b){this.vc(a);for(var c=this.ra||
54+(this.ra=[]),d=a+1,e=c.length,g;d<e;d++)if(g=c[d])break;c[a]=b;this.I().insertBefore(b,g||null)},za:function(a){var b=this.ra;return b&&b[a]||null},vc:function(a){var b=this.za(a),c=this.Ta;if(b&&c){c.removeChild(b);this.ra[a]=null}},Aa:function(a,b,c,d){var e=this.rb||(this.rb={}),g=e[a];if(!g){g=e[a]=f.p.Za("shape");if(b)g.appendChild(g[b]=f.p.Za(b));if(d){c=this.za(d);if(!c){this.sb(d,doc.createElement("group"+d));c=this.za(d)}}c.appendChild(g);a=g.style;a.position="absolute";a.left=a.top=0;a.behavior=
55+"url(#default#VML)"}return g},vb:function(a){var b=this.rb,c=b&&b[a];if(c){c.parentNode.removeChild(c);delete b[a]}return!!c},kc:function(a){var b=this.e,c=this.s.o(),d=c.h,e=c.f,g,j,i,h,k,n;c=a.x.tl.a(b,d);g=a.y.tl.a(b,e);j=a.x.tr.a(b,d);i=a.y.tr.a(b,e);h=a.x.br.a(b,d);k=a.y.br.a(b,e);n=a.x.bl.a(b,d);a=a.y.bl.a(b,e);d=Math.min(d/(c+j),e/(i+k),d/(n+h),e/(g+a));if(d<1){c*=d;g*=d;j*=d;i*=d;h*=d;k*=d;n*=d;a*=d}return{x:{tl:c,tr:j,br:h,bl:n},y:{tl:g,tr:i,br:k,bl:a}}},ya:function(a,b,c){b=b||1;var d,e,
56+g=this.s.o();e=g.h*b;g=g.f*b;var j=this.g.G,i=Math.floor,h=Math.ceil,k=a?a.Jb*b:0,n=a?a.Ib*b:0,m=a?a.tb*b:0;a=a?a.Db*b:0;var p,r,t,v,l;if(c||j.i()){d=this.kc(c||j.j());c=d.x.tl*b;j=d.y.tl*b;p=d.x.tr*b;r=d.y.tr*b;t=d.x.br*b;v=d.y.br*b;l=d.x.bl*b;b=d.y.bl*b;e="m"+i(a)+","+i(j)+"qy"+i(c)+","+i(k)+"l"+h(e-p)+","+i(k)+"qx"+h(e-n)+","+i(r)+"l"+h(e-n)+","+h(g-v)+"qy"+h(e-t)+","+h(g-m)+"l"+i(l)+","+h(g-m)+"qx"+i(a)+","+h(g-b)+" x e"}else e="m"+i(a)+","+i(k)+"l"+h(e-n)+","+i(k)+"l"+h(e-n)+","+h(g-m)+"l"+i(a)+
57+","+h(g-m)+"xe";return e},I:function(){var a=this.parent.za(this.N),b;if(!a){a=doc.createElement(this.Ya);b=a.style;b.position="absolute";b.top=b.left=0;this.parent.sb(this.N,a)}return a},mc:function(){var a=this.e,b=a.currentStyle,c=a.runtimeStyle,d=a.tagName,e=f.O===6,g;if(e&&(d in f.cc||d==="FIELDSET")||d==="BUTTON"||d==="INPUT"&&a.type in f.Gd){c.borderWidth="";d=this.g.w.wc;for(g=d.length;g--;){e=d[g];c["padding"+e]="";c["padding"+e]=f.n(b["padding"+e]).a(a)+f.n(b["border"+e+"Width"]).a(a)+(f.O!==
58+8&&g%2?1:0)}c.borderWidth=0}else if(e){if(a.childNodes.length!==1||a.firstChild.tagName!=="ie6-mask"){b=doc.createElement("ie6-mask");d=b.style;d.visibility="visible";for(d.zoom=1;d=a.firstChild;)b.appendChild(d);a.appendChild(b);c.visibility="hidden"}}else c.borderColor="transparent"},ie:function(){},m:function(){this.parent.vc(this.N);delete this.rb;delete this.ra}};f.Rc=f.u.R({i:function(){var a=this.ed;for(var b in a)if(a.hasOwnProperty(b)&&a[b].i())return true;return false},Q:function(){return this.g.Pb.H()},
59+ib:function(){if(this.i()){var a=this.jc(),b=a,c;a=a.currentStyle;var d=a.position,e=this.I().style,g=0,j=0;j=this.s.o();var i=j.Hd;if(d==="fixed"&&f.O>6){g=j.x*i;j=j.y*i;b=d}else{do b=b.offsetParent;while(b&&b.currentStyle.position==="static");if(b){c=b.getBoundingClientRect();b=b.currentStyle;g=(j.x-c.left)*i-(parseFloat(b.borderLeftWidth)||0);j=(j.y-c.top)*i-(parseFloat(b.borderTopWidth)||0)}else{b=doc.documentElement;g=(j.x+b.scrollLeft-b.clientLeft)*i;j=(j.y+b.scrollTop-b.clientTop)*i}b="absolute"}e.position=
60+b;e.left=g;e.top=j;e.zIndex=d==="static"?-1:a.zIndex;this.Cb=true}},Mb:f.aa,Nb:function(){var a=this.g.Pb.j();this.I().style.display=a.ce&&a.nd?"":"none"},Lb:function(){this.i()?this.Nb():this.m()},jc:function(){var a=this.e;return a.tagName in f.Ac?a.offsetParent:a},I:function(){var a=this.Ta,b;if(!a){b=this.jc();a=this.Ta=doc.createElement("css3-container");a.style.direction="ltr";this.Nb();b.parentNode.insertBefore(a,b)}return a},ab:f.aa,m:function(){var a=this.Ta,b;if(a&&(b=a.parentNode))b.removeChild(a);
61+delete this.Ta;delete this.ra}});f.Fc=f.u.R({N:2,Ya:"background",Q:function(){var a=this.g;return a.C.H()||a.G.H()},i:function(){var a=this.g;return a.q.i()||a.G.i()||a.C.i()||a.ga.i()&&a.ga.j().Bb},V:function(){var a=this.s.o();if(a.h&&a.f){this.od();this.pd()}},od:function(){var a=this.g.C.j(),b=this.s.o(),c=this.e,d=a&&a.color,e,g;if(d&&d.fa()>0){this.lc();a=this.Aa("bgColor","fill",this.I(),1);e=b.h;b=b.f;a.stroked=false;a.coordsize=e*2+","+b*2;a.coordorigin="1,1";a.path=this.ya(null,2);g=a.style;
62+g.width=e;g.height=b;a.fill.color=d.U(c);c=d.fa();if(c<1)a.fill.opacity=c}else this.vb("bgColor")},pd:function(){var a=this.g.C.j(),b=this.s.o();a=a&&a.M;var c,d,e,g,j;if(a){this.lc();d=b.h;e=b.f;for(j=a.length;j--;){b=a[j];c=this.Aa("bgImage"+j,"fill",this.I(),2);c.stroked=false;c.fill.type="tile";c.fillcolor="none";c.coordsize=d*2+","+e*2;c.coordorigin="1,1";c.path=this.ya(0,2);g=c.style;g.width=d;g.height=e;if(b.P==="linear-gradient")this.bd(c,b);else{c.fill.src=b.Ab;this.Nd(c,j)}}}for(j=a?a.length:
63+0;this.vb("bgImage"+j++););},Nd:function(a,b){var c=this;f.p.Rb(a.fill.src,function(d){var e=c.e,g=c.s.o(),j=g.h;g=g.f;if(j&&g){var i=a.fill,h=c.g,k=h.w.j(),n=k&&k.J;k=n?n.t.a(e):0;var m=n?n.r.a(e):0,p=n?n.b.a(e):0;n=n?n.l.a(e):0;h=h.C.j().M[b];e=h.$?h.$.coords(e,j-d.h-n-m,g-d.f-k-p):{x:0,y:0};h=h.bb;p=m=0;var r=j+1,t=g+1,v=f.O===8?0:1;n=Math.round(e.x)+n+0.5;k=Math.round(e.y)+k+0.5;i.position=n/j+","+k/g;i.size.x=1;i.size=d.h+"px,"+d.f+"px";if(h&&h!=="repeat"){if(h==="repeat-x"||h==="no-repeat"){m=
64+k+1;t=k+d.f+v}if(h==="repeat-y"||h==="no-repeat"){p=n+1;r=n+d.h+v}a.style.clip="rect("+m+"px,"+r+"px,"+t+"px,"+p+"px)"}}})},bd:function(a,b){var c=this.e,d=this.s.o(),e=d.h,g=d.f;a=a.fill;d=b.ca;var j=d.length,i=Math.PI,h=f.Na,k=h.tc,n=h.dc;b=h.gc(c,e,g,b);h=b.sa;var m=b.xc,p=b.yc,r=b.Wd,t=b.Xd,v=b.rd,l=b.sd,q=b.kd,s=b.ld;b=b.rc;e=h%90?Math.atan2(q*e/g,s)/i*180:h+90;e+=180;e%=360;v=k(r,t,h,v,l);g=n(r,t,v[0],v[1]);i=[];v=k(m,p,h,r,t);n=n(m,p,v[0],v[1])/g*100;k=[];for(h=0;h<j;h++)k.push(d[h].db?d[h].db.a(c,
65+b):h===0?0:h===j-1?b:null);for(h=1;h<j;h++){if(k[h]===null){m=k[h-1];b=h;do p=k[++b];while(p===null);k[h]=m+(p-m)/(b-h+1)}k[h]=Math.max(k[h],k[h-1])}for(h=0;h<j;h++)i.push(n+k[h]/g*100+"% "+d[h].color.U(c));a.angle=e;a.type="gradient";a.method="sigma";a.color=d[0].color.U(c);a.color2=d[j-1].color.U(c);if(a.colors)a.colors.value=i.join(",");else a.colors=i.join(",")},lc:function(){var a=this.e.runtimeStyle;a.backgroundImage="url(about:blank)";a.backgroundColor="transparent"},m:function(){f.u.m.call(this);
66+var a=this.e.runtimeStyle;a.backgroundImage=a.backgroundColor=""}});f.Gc=f.u.R({N:4,Ya:"border",Q:function(){var a=this.g;return a.w.H()||a.G.H()},i:function(){var a=this.g;return a.G.i()&&!a.q.i()&&a.w.i()},V:function(){var a=this.e,b=this.g.w.j(),c=this.s.o(),d=c.h;c=c.f;var e,g,j,i,h;if(b){this.mc();b=this.wd(2);i=0;for(h=b.length;i<h;i++){j=b[i];e=this.Aa("borderPiece"+i,j.stroke?"stroke":"fill",this.I());e.coordsize=d*2+","+c*2;e.coordorigin="1,1";e.path=j.path;g=e.style;g.width=d;g.height=c;
67+e.filled=!!j.fill;e.stroked=!!j.stroke;if(j.stroke){e=e.stroke;e.weight=j.Qb+"px";e.color=j.color.U(a);e.dashstyle=j.stroke==="dashed"?"2 2":j.stroke==="dotted"?"1 1":"solid";e.linestyle=j.stroke==="double"&&j.Qb>2?"ThinThin":"Single"}else e.fill.color=j.fill.U(a)}for(;this.vb("borderPiece"+i++););}},wd:function(a){var b=this.e,c,d,e,g=this.g.w,j=[],i,h,k,n,m=Math.round,p,r,t;if(g.i()){c=g.j();g=c.J;r=c.Zd;t=c.gd;if(c.ee&&c.$d&&c.hd){if(t.t.fa()>0){c=g.t.a(b);k=c/2;j.push({path:this.ya({Jb:k,Ib:k,
68+tb:k,Db:k},a),stroke:r.t,color:t.t,Qb:c})}}else{a=a||1;c=this.s.o();d=c.h;e=c.f;c=m(g.t.a(b));k=m(g.r.a(b));n=m(g.b.a(b));b=m(g.l.a(b));var v={t:c,r:k,b:n,l:b};b=this.g.G;if(b.i())p=this.kc(b.j());i=Math.floor;h=Math.ceil;var l=function(o,u){return p?p[o][u]:0},q=function(o,u,x,y,z,B){var E=l("x",o),D=l("y",o),C=o.charAt(1)==="r";o=o.charAt(0)==="b";return E>0&&D>0?(B?"al":"ae")+(C?h(d-E):i(E))*a+","+(o?h(e-D):i(D))*a+","+(i(E)-u)*a+","+(i(D)-x)*a+","+y*65535+","+2949075*(z?1:-1):(B?"m":"l")+(C?d-
69+u:u)*a+","+(o?e-x:x)*a},s=function(o,u,x,y){var z=o==="t"?i(l("x","tl"))*a+","+h(u)*a:o==="r"?h(d-u)*a+","+i(l("y","tr"))*a:o==="b"?h(d-l("x","br"))*a+","+i(e-u)*a:i(u)*a+","+h(e-l("y","bl"))*a;o=o==="t"?h(d-l("x","tr"))*a+","+h(u)*a:o==="r"?h(d-u)*a+","+h(e-l("y","br"))*a:o==="b"?i(l("x","bl"))*a+","+i(e-u)*a:i(u)*a+","+i(l("y","tl"))*a;return x?(y?"m"+o:"")+"l"+z:(y?"m"+z:"")+"l"+o};b=function(o,u,x,y,z,B){var E=o==="l"||o==="r",D=v[o],C,F;if(D>0&&r[o]!=="none"&&t[o].fa()>0){C=v[E?o:u];u=v[E?u:
70+o];F=v[E?o:x];x=v[E?x:o];if(r[o]==="dashed"||r[o]==="dotted"){j.push({path:q(y,C,u,B+45,0,1)+q(y,0,0,B,1,0),fill:t[o]});j.push({path:s(o,D/2,0,1),stroke:r[o],Qb:D,color:t[o]});j.push({path:q(z,F,x,B,0,1)+q(z,0,0,B-45,1,0),fill:t[o]})}else j.push({path:q(y,C,u,B+45,0,1)+s(o,D,0,0)+q(z,F,x,B,0,0)+(r[o]==="double"&&D>2?q(z,F-i(F/3),x-i(x/3),B-45,1,0)+s(o,h(D/3*2),1,0)+q(y,C-i(C/3),u-i(u/3),B,1,0)+"x "+q(y,i(C/3),i(u/3),B+45,0,1)+s(o,i(D/3),1,0)+q(z,i(F/3),i(x/3),B,0,0):"")+q(z,0,0,B-45,1,0)+s(o,0,1,
71+0)+q(y,0,0,B,1,0),fill:t[o]})}};b("t","l","r","tl","tr",90);b("r","t","b","tr","br",0);b("b","r","l","br","bl",-90);b("l","b","t","bl","tl",-180)}}return j},m:function(){if(this.ec||!this.g.q.i())this.e.runtimeStyle.borderColor="";f.u.m.call(this)}});f.Tb=f.u.R({N:5,Md:["t","tr","r","br","b","bl","l","tl","c"],Q:function(){return this.g.q.H()},i:function(){return this.g.q.i()},V:function(){this.I();var a=this.g.q.j(),b=this.g.w.j(),c=this.s.o(),d=this.e,e=this.uc;f.p.Rb(a.src,function(g){function j(s,
72+o,u,x,y){s=e[s].style;var z=Math.max;s.width=z(o,0);s.height=z(u,0);s.left=x;s.top=y}function i(s,o,u){for(var x=0,y=s.length;x<y;x++)e[s[x]].imagedata[o]=u}var h=c.h,k=c.f,n=f.n("0"),m=a.J||(b?b.J:{t:n,r:n,b:n,l:n});n=m.t.a(d);var p=m.r.a(d),r=m.b.a(d);m=m.l.a(d);var t=a.slice,v=t.t.a(d),l=t.r.a(d),q=t.b.a(d);t=t.l.a(d);j("tl",m,n,0,0);j("t",h-m-p,n,m,0);j("tr",p,n,h-p,0);j("r",p,k-n-r,h-p,n);j("br",p,r,h-p,k-r);j("b",h-m-p,r,m,k-r);j("bl",m,r,0,k-r);j("l",m,k-n-r,0,n);j("c",h-m-p,k-n-r,m,n);i(["tl",
73+"t","tr"],"cropBottom",(g.f-v)/g.f);i(["tl","l","bl"],"cropRight",(g.h-t)/g.h);i(["bl","b","br"],"cropTop",(g.f-q)/g.f);i(["tr","r","br"],"cropLeft",(g.h-l)/g.h);i(["l","r","c"],"cropTop",v/g.f);i(["l","r","c"],"cropBottom",q/g.f);i(["t","b","c"],"cropLeft",t/g.h);i(["t","b","c"],"cropRight",l/g.h);e.c.style.display=a.fill?"":"none"},this)},I:function(){var a=this.parent.za(this.N),b,c,d,e=this.Md,g=e.length;if(!a){a=doc.createElement("border-image");b=a.style;b.position="absolute";this.uc={};for(d=
74+0;d<g;d++){c=this.uc[e[d]]=f.p.Za("rect");c.appendChild(f.p.Za("imagedata"));b=c.style;b.behavior="url(#default#VML)";b.position="absolute";b.top=b.left=0;c.imagedata.src=this.g.q.j().src;c.stroked=false;c.filled=false;a.appendChild(c)}this.parent.sb(this.N,a)}return a},Ea:function(){if(this.i()){var a=this.e,b=a.runtimeStyle,c=this.g.q.j().J;b.borderStyle="solid";if(c){b.borderTopWidth=c.t.a(a)+"px";b.borderRightWidth=c.r.a(a)+"px";b.borderBottomWidth=c.b.a(a)+"px";b.borderLeftWidth=c.l.a(a)+"px"}this.mc()}},
75+m:function(){var a=this.e.runtimeStyle;a.borderStyle="";if(this.ec||!this.g.w.i())a.borderColor=a.borderWidth="";f.u.m.call(this)}});f.Hc=f.u.R({N:1,Ya:"outset-box-shadow",Q:function(){var a=this.g;return a.ga.H()||a.G.H()},i:function(){var a=this.g.ga;return a.i()&&a.j().Da[0]},V:function(){function a(C,F,O,H,M,P,I){C=b.Aa("shadow"+C+F,"fill",d,j-C);F=C.fill;C.coordsize=n*2+","+m*2;C.coordorigin="1,1";C.stroked=false;C.filled=true;F.color=M.U(c);if(P){F.type="gradienttitle";F.color2=F.color;F.opacity=
76+0}C.path=I;l=C.style;l.left=O;l.top=H;l.width=n;l.height=m;return C}var b=this,c=this.e,d=this.I(),e=this.g,g=e.ga.j().Da;e=e.G.j();var j=g.length,i=j,h,k=this.s.o(),n=k.h,m=k.f;k=f.O===8?1:0;for(var p=["tl","tr","br","bl"],r,t,v,l,q,s,o,u,x,y,z,B,E,D;i--;){t=g[i];q=t.fe.a(c);s=t.ge.a(c);h=t.Vd.a(c);o=t.blur.a(c);t=t.color;u=-h-o;if(!e&&o)e=f.jb.Dc;u=this.ya({Jb:u,Ib:u,tb:u,Db:u},2,e);if(o){x=(h+o)*2+n;y=(h+o)*2+m;z=x?o*2/x:0;B=y?o*2/y:0;if(o-h>n/2||o-h>m/2)for(h=4;h--;){r=p[h];E=r.charAt(0)==="b";
77+D=r.charAt(1)==="r";r=a(i,r,q,s,t,o,u);v=r.fill;v.focusposition=(D?1-z:z)+","+(E?1-B:B);v.focussize="0,0";r.style.clip="rect("+((E?y/2:0)+k)+"px,"+(D?x:x/2)+"px,"+(E?y:y/2)+"px,"+((D?x/2:0)+k)+"px)"}else{r=a(i,"",q,s,t,o,u);v=r.fill;v.focusposition=z+","+B;v.focussize=1-z*2+","+(1-B*2)}}else{r=a(i,"",q,s,t,o,u);q=t.fa();if(q<1)r.fill.opacity=q}}}});f.Pc=f.u.R({N:6,Ya:"imgEl",Q:function(){var a=this.g;return this.e.src!==this.Xc||a.G.H()},i:function(){var a=this.g;return a.G.i()||a.C.qc()},V:function(){this.Xc=
78+j;this.Cd();var a=this.Aa("img","fill",this.I()),b=a.fill,c=this.s.o(),d=c.h;c=c.f;var e=this.g.w.j(),g=e&&e.J;e=this.e;var j=e.src,i=Math.round,h=e.currentStyle,k=f.n;if(!g||f.O<7){g=f.n("0");g={t:g,r:g,b:g,l:g}}a.stroked=false;b.type="frame";b.src=j;b.position=(d?0.5/d:0)+","+(c?0.5/c:0);a.coordsize=d*2+","+c*2;a.coordorigin="1,1";a.path=this.ya({Jb:i(g.t.a(e)+k(h.paddingTop).a(e)),Ib:i(g.r.a(e)+k(h.paddingRight).a(e)),tb:i(g.b.a(e)+k(h.paddingBottom).a(e)),Db:i(g.l.a(e)+k(h.paddingLeft).a(e))},
79+2);a=a.style;a.width=d;a.height=c},Cd:function(){this.e.runtimeStyle.filter="alpha(opacity=0)"},m:function(){f.u.m.call(this);this.e.runtimeStyle.filter=""}});f.Oc=f.u.R({ib:f.aa,Mb:f.aa,Nb:f.aa,Lb:f.aa,Ld:/^,+|,+$/g,Fd:/,+/g,gb:function(a,b){(this.pb||(this.pb=[]))[a]=b||void 0},ab:function(){var a=this.pb,b;if(a&&(b=a.join(",").replace(this.Ld,"").replace(this.Fd,","))!==this.Wc)this.Wc=this.e.runtimeStyle.background=b},m:function(){this.e.runtimeStyle.background="";delete this.pb}});f.Mc=f.u.R({ua:1,
80+Q:function(){return this.g.C.H()},i:function(){var a=this.g;return a.C.i()||a.q.i()},V:function(){var a=this.g.C.j(),b,c,d=0,e,g;if(a){b=[];if(c=a.M)for(;e=c[d++];)if(e.P==="linear-gradient"){g=this.vd(e.Wa);g=(e.Xa||f.Ka.Kc).a(this.e,g.h,g.f,g.h,g.f);b.push("url(data:image/svg+xml,"+escape(this.xd(e,g.h,g.f))+") "+this.dd(e.$)+" / "+g.h+"px "+g.f+"px "+(e.bc||"")+" "+(e.Wa||"")+" "+(e.ub||""))}else b.push(e.Hb);a.color&&b.push(a.color.Y);this.parent.gb(this.ua,b.join(","))}},dd:function(a){return a?
81+a.X.map(function(b){return b.d}).join(" "):"0 0"},vd:function(a){var b=this.e,c=this.s.o(),d=c.h;c=c.f;var e;if(a!=="border-box")if((e=this.g.w.j())&&(e=e.J)){d-=e.l.a(b)+e.l.a(b);c-=e.t.a(b)+e.b.a(b)}if(a==="content-box"){a=f.n;e=b.currentStyle;d-=a(e.paddingLeft).a(b)+a(e.paddingRight).a(b);c-=a(e.paddingTop).a(b)+a(e.paddingBottom).a(b)}return{h:d,f:c}},xd:function(a,b,c){var d=this.e,e=a.ca,g=e.length,j=f.Na.gc(d,b,c,a);a=j.xc;var i=j.yc,h=j.td,k=j.ud;j=j.rc;var n,m,p,r,t;n=[];for(m=0;m<g;m++)n.push(e[m].db?
82+e[m].db.a(d,j):m===0?0:m===g-1?j:null);for(m=1;m<g;m++)if(n[m]===null){r=n[m-1];p=m;do t=n[++p];while(t===null);n[m]=r+(t-r)/(p-m+1)}b=['<svg width="'+b+'" height="'+c+'" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="g" gradientUnits="userSpaceOnUse" x1="'+a/b*100+'%" y1="'+i/c*100+'%" x2="'+h/b*100+'%" y2="'+k/c*100+'%">'];for(m=0;m<g;m++)b.push('<stop offset="'+n[m]/j+'" stop-color="'+e[m].color.U(d)+'" stop-opacity="'+e[m].color.fa()+'"/>');b.push('</linearGradient></defs><rect width="100%" height="100%" fill="url(#g)"/></svg>');
83+return b.join("")},m:function(){this.parent.gb(this.ua)}});f.Nc=f.u.R({T:"repeat",Sc:"stretch",Qc:"round",ua:0,Q:function(){return this.g.q.H()},i:function(){return this.g.q.i()},V:function(){var a=this,b=a.g.q.j(),c=a.g.w.j(),d=a.s.o(),e=b.repeat,g=e.f,j=e.Ob,i=a.e,h=0;f.p.Rb(b.src,function(k){function n(Q,R,U,V,W,Y,X,S,w,A){K.push('<pattern patternUnits="userSpaceOnUse" id="pattern'+G+'" x="'+(g===l?Q+U/2-w/2:Q)+'" y="'+(j===l?R+V/2-A/2:R)+'" width="'+w+'" height="'+A+'"><svg width="'+w+'" height="'+
84+A+'" viewBox="'+W+" "+Y+" "+X+" "+S+'" preserveAspectRatio="none"><image xlink:href="'+v+'" x="0" y="0" width="'+r+'" height="'+t+'" /></svg></pattern>');J.push('<rect x="'+Q+'" y="'+R+'" width="'+U+'" height="'+V+'" fill="url(#pattern'+G+')" />');G++}var m=d.h,p=d.f,r=k.h,t=k.f,v=a.Dd(b.src,r,t),l=a.T,q=a.Sc;k=a.Qc;var s=Math.ceil,o=f.n("0"),u=b.J||(c?c.J:{t:o,r:o,b:o,l:o});o=u.t.a(i);var x=u.r.a(i),y=u.b.a(i);u=u.l.a(i);var z=b.slice,B=z.t.a(i),E=z.r.a(i),D=z.b.a(i);z=z.l.a(i);var C=m-u-x,F=p-o-
85+y,O=r-z-E,H=t-B-D,M=g===q?C:O*o/B,P=j===q?F:H*x/E,I=g===q?C:O*y/D;q=j===q?F:H*u/z;var K=[],J=[],G=0;if(g===k){M-=(M-(C%M||M))/s(C/M);I-=(I-(C%I||I))/s(C/I)}if(j===k){P-=(P-(F%P||P))/s(F/P);q-=(q-(F%q||q))/s(F/q)}k=['<svg width="'+m+'" height="'+p+'" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">'];n(0,0,u,o,0,0,z,B,u,o);n(u,0,C,o,z,0,O,B,M,o);n(m-x,0,x,o,r-E,0,E,B,x,o);n(0,o,u,F,0,B,z,H,u,q);if(b.fill)n(u,o,C,F,z,B,O,H,M||I||O,q||P||H);n(m-x,o,x,F,r-E,B,E,H,x,P);n(0,
86+p-y,u,y,0,t-D,z,D,u,y);n(u,p-y,C,y,z,t-D,O,D,I,y);n(m-x,p-y,x,y,r-E,t-D,E,D,x,y);k.push("<defs>"+K.join("\n")+"</defs>"+J.join("\n")+"</svg>");a.parent.gb(a.ua,"url(data:image/svg+xml,"+escape(k.join(""))+") no-repeat border-box border-box");h&&a.parent.ab()},a);h=1},Dd:function(){var a={};return function(b,c,d){var e=a[b],g;if(!e){e=new Image;g=doc.createElement("canvas");e.src=b;g.width=c;g.height=d;g.getContext("2d").drawImage(e,0,0);e=a[b]=g.toDataURL()}return e}}(),Ea:f.Tb.prototype.Ea,m:function(){var a=
87+this.e.runtimeStyle;this.parent.gb(this.ua);a.borderColor=a.borderStyle=a.borderWidth=""}});f.kb=function(){function a(l,q){l.className+=" "+q}function b(l){var q=v.slice.call(arguments,1),s=q.length;setTimeout(function(){if(l)for(;s--;)a(l,q[s])},0)}function c(l){var q=v.slice.call(arguments,1),s=q.length;setTimeout(function(){if(l)for(;s--;){var o=q[s];o=t[o]||(t[o]=new RegExp("\\b"+o+"\\b","g"));l.className=l.className.replace(o,"")}},0)}function d(l){function q(){if(!U){var w,A,L=f.ja,T=l.currentStyle,
88+N=T.getAttribute(g)==="true",da=T.getAttribute(i)!=="false",ea=T.getAttribute(h)!=="false";S=T.getAttribute(j);S=L>7?S!=="false":S==="true";if(!R){R=1;l.runtimeStyle.zoom=1;T=l;for(var fa=1;T=T.previousSibling;)if(T.nodeType===1){fa=0;break}fa&&a(l,p)}J.cb();if(N&&(A=J.o())&&(w=doc.documentElement||doc.body)&&(A.y>w.clientHeight||A.x>w.clientWidth||A.y+A.f<0||A.x+A.h<0)){if(!Y){Y=1;f.mb.ba(q)}}else{U=1;Y=R=0;f.mb.Ha(q);if(L===9){G={C:new f.Sb(l),q:new f.Ub(l),w:new f.Vb(l)};Q=[G.C,G.q];K=new f.Oc(l,
89+J,G);w=[new f.Mc(l,J,G,K),new f.Nc(l,J,G,K)]}else{G={C:new f.Sb(l),w:new f.Vb(l),q:new f.Ub(l),G:new f.jb(l),ga:new f.Ic(l),Pb:new f.Uc(l)};Q=[G.C,G.w,G.q,G.G,G.ga,G.Pb];K=new f.Rc(l,J,G);w=[new f.Hc(l,J,G,K),new f.Fc(l,J,G,K),new f.Gc(l,J,G,K),new f.Tb(l,J,G,K)];l.tagName==="IMG"&&w.push(new f.Pc(l,J,G,K));K.ed=w}I=[K].concat(w);if(w=l.currentStyle.getAttribute(f.F+"watch-ancestors")){w=parseInt(w,10);A=0;for(N=l.parentNode;N&&(w==="NaN"||A++<w);){H(N,"onpropertychange",C);H(N,"onmouseenter",x);
90+H(N,"onmouseleave",y);H(N,"onmousedown",z);if(N.tagName in f.fc){H(N,"onfocus",E);H(N,"onblur",D)}N=N.parentNode}}if(S){f.Oa.ba(o);f.Oa.Rd()}o(1)}if(!V){V=1;L<9&&H(l,"onmove",s);H(l,"onresize",s);H(l,"onpropertychange",u);ea&&H(l,"onmouseenter",x);if(ea||da)H(l,"onmouseleave",y);da&&H(l,"onmousedown",z);if(l.tagName in f.fc){H(l,"onfocus",E);H(l,"onblur",D)}f.Qa.ba(s);f.L.ba(M)}J.hb()}}function s(){J&&J.Ad()&&o()}function o(w){if(!X)if(U){var A,L=I.length;F();for(A=0;A<L;A++)I[A].Ea();if(w||J.Od())for(A=
91+0;A<L;A++)I[A].ib();if(w||J.Td())for(A=0;A<L;A++)I[A].Mb();K.ab();O()}else R||q()}function u(){var w,A=I.length,L;w=event;if(!X&&!(w&&w.propertyName in r))if(U){F();for(w=0;w<A;w++)I[w].Ea();for(w=0;w<A;w++){L=I[w];L.Cb||L.ib();L.Q()&&L.Lb()}K.ab();O()}else R||q()}function x(){b(l,k)}function y(){c(l,k,n)}function z(){b(l,n);f.lb.ba(B)}function B(){c(l,n);f.lb.Ha(B)}function E(){b(l,m)}function D(){c(l,m)}function C(){var w=event.propertyName;if(w==="className"||w==="id")u()}function F(){J.cb();for(var w=
92+Q.length;w--;)Q[w].cb()}function O(){for(var w=Q.length;w--;)Q[w].hb();J.hb()}function H(w,A,L){w.attachEvent(A,L);W.push([w,A,L])}function M(){if(V){for(var w=W.length,A;w--;){A=W[w];A[0].detachEvent(A[1],A[2])}f.L.Ha(M);V=0;W=[]}}function P(){if(!X){var w,A;M();X=1;if(I){w=0;for(A=I.length;w<A;w++){I[w].ec=1;I[w].m()}}S&&f.Oa.Ha(o);f.Qa.Ha(o);I=J=G=Q=l=null}}var I,K,J=new ha(l),G,Q,R,U,V,W=[],Y,X,S;this.Ed=q;this.update=o;this.m=P;this.qd=l}var e={},g=f.F+"lazy-init",j=f.F+"poll",i=f.F+"track-active",
93+h=f.F+"track-hover",k=f.La+"hover",n=f.La+"active",m=f.La+"focus",p=f.La+"first-child",r={background:1,bgColor:1,display:1},t={},v=[];d.yd=function(l){var q=f.p.Ba(l);return e[q]||(e[q]=new d(l))};d.m=function(l){l=f.p.Ba(l);var q=e[l];if(q){q.m();delete e[l]}};d.md=function(){var l=[],q;if(e){for(var s in e)if(e.hasOwnProperty(s)){q=e[s];l.push(q.qd);q.m()}e={}}return l};return d}();f.supportsVML=f.zc;f.attach=function(a){f.ja<10&&f.zc&&f.kb.yd(a).Ed()};f.detach=function(a){f.kb.m(a)}};
94+var $=element;function init(){if(doc.media!=="print"){var a=window.PIE;a&&a.attach($)}}function cleanup(){if(doc.media!=="print"){var a=window.PIE;if(a){a.detach($);$=0}}}$.readyState==="complete"&&init();
95+</script>
96+</PUBLIC:COMPONENT>
--- /dev/null
+++ b/css/base.css
@@ -0,0 +1,395 @@
1+@charset "utf-8";
2+
3+/** 基本設定 **/
4+body {
5+ margin: 0px;
6+ padding: 0px;
7+ background-color: #ffffff;
8+ color: #1E4080;
9+ font-size: 12px;
10+ font-family: 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', 'メイリオ', Meiryo, 'MS Pゴシック', sans-serif;
11+ line-height: 18px;
12+ -webkit-text-size-adjust: 100%;
13+}
14+
15+a img {
16+ border-style: none;
17+}
18+
19+/** メニュー部分 **/
20+div.menu_wrapper {
21+ display: table;
22+ width: 100%;
23+ background-color: #1E4080;
24+ border-bottom: 1px solid #8888BE;
25+ padding-bottom: 5px;
26+ margin-bottom: 10px;
27+ vertical-align: bottom;
28+ padding-top: 5px;
29+}
30+div.menu {
31+ width: 930px;
32+ margin-left: auto;
33+ margin-right: auto;
34+ display: table;
35+}
36+ul.menu {
37+ display: block;
38+ margin: 0px 0px 0px 0px;
39+ padding: 0px 0px 0px 0px;
40+ list-style: none;
41+}
42+li.menu_left {
43+ display: inline;
44+ float: left;
45+ width: 138px;
46+ border: 1px solid #8888BE;
47+ text-align: center;
48+ background-color: #ffffff;
49+ padding: 10px 18px 10px 18px;
50+ margin-right: 5px;
51+ margin-left: 5px;
52+ margin-top: 3px;
53+ margin-bottom: 3px;
54+ text-decoration: none;
55+ border-radius: 8px;
56+ behavior: url("./css/PIE.htc");
57+}
58+a.menu {
59+ color: #1E4080;
60+ text-decoration: none;
61+}
62+a:hover.menu {
63+ color: #67A7CC;
64+ text-decoration: none;
65+}
66+
67+/** 見出し設定 **/
68+h1 {
69+ font-weight: bold;
70+ font-size: 20px;
71+ line-height: 26px;
72+ margin-top: 0px;
73+ margin-bottom: 20px;
74+ border-bottom: 1px solid #A5A5BE;
75+ text-align: left;
76+ padding-top: 14px;
77+ padding-bottom: 10px;
78+ padding-left: 10px;
79+}
80+h2 {
81+ font-weight: normal;
82+ font-size: 16px;
83+ line-height: 22px;
84+ margin-top: 0px;
85+ margin-bottom: 16px;
86+}
87+
88+/** その他強調 **/
89+.shadow {
90+ box-shadow: 2px 4px 10px #666666;
91+ behavior: url("./css/PIE.htc");
92+}
93+.red {
94+ color: #ff0000;
95+}
96+.border_red {
97+ border-color: #ff0000;
98+}
99+
100+/** コンテンツ用DIV **/
101+div.contents {
102+ display: table;
103+ width: 920px;
104+ margin-left: auto;
105+ margin-right: auto;
106+ margin-bottom: 20px;
107+ border: 1px solid #A5A5BE;
108+ box-shadow: 2px 4px 10px #cacaca;
109+ background-color: #ffffff;
110+ border-radius: 10px;
111+ behavior: url("./css/PIE.htc");
112+}
113+div.middlemargin_bottom {
114+ margin-bottom: 20px;
115+}
116+div.nomargin_bottom {
117+ margin-bottom: 0px;
118+}
119+div.section_header {
120+ display: table;
121+ width: 920px;
122+ height: 20px;
123+ background-color: #000000;
124+ background-repeat: no-repeat;
125+ margin-left: auto;
126+ margin-right: auto;
127+ margin-bottom: 30px;
128+}
129+div.wrapper {
130+ width: 100%;
131+ padding-top: 20px;
132+ padding-bottom: 20px;
133+ margin-bottom: 40px;
134+}
135+div.left {
136+ text-align: left;
137+}
138+div.center {
139+ text-align: center;
140+}
141+div.right {
142+ text-align: right;
143+}
144+div.padding_normal {
145+ padding: 5px 3px;
146+}
147+
148+/** コンテンツ(小) **/
149+div.small_contents {
150+ display: table;
151+ width: 600px;
152+ margin-left: auto;
153+ margin-right: auto;
154+ margin-bottom: 40px;
155+ border: 1px solid #A5A5BE;
156+ background-color: #ffffff;
157+ box-shadow: 2px 4px 10px #cacaca;
158+ border-radius: 10px;
159+ behavior: url("./css/PIE.htc");
160+}
161+
162+/** 選択中ファイル用 **/
163+div.select_file {
164+ display: table;
165+ width: 920px;
166+ margin-left: auto;
167+ margin-right: auto;
168+ margin-bottom: 20px;
169+ border: 1px solid #A5A5BE;
170+ box-shadow: 2px 4px 5px #cacaca;
171+ background-color: #ffffff;
172+ border-radius: 10px;
173+ behavior: url("./css/PIE.htc");
174+ padding: 5px 0px;
175+}
176+
177+/** インフォ・エラー用 **/
178+div.info {
179+ margin-left: auto;
180+ margin-right: auto;
181+ font-weight: bold;
182+}
183+div.info_contents {
184+ color: #008822;
185+ border: 1px solid #008822;
186+}
187+div.info_contens_inner {
188+ margin-left: 20px;
189+}
190+h1.info {
191+ color: #008822;
192+ border-bottom: 1px solid #008822;
193+}
194+div.error {
195+ margin-left: auto;
196+ margin-right: auto;
197+ font-weight: bold;
198+ color: #ff0000;
199+}
200+div.error_contents {
201+ color: #ff0000;
202+ border: 1px solid #ff0000;
203+}
204+div.error_contens_inner {
205+ margin-left: 20px;
206+}
207+h1.error {
208+ color: #ff0000;
209+ border-bottom: 1px solid #ff0000;
210+}
211+
212+/** フッタ用部位 **/
213+div.bottom_area {
214+ display: table;
215+ width: 920px;
216+ margin-left: auto;
217+ margin-right: auto;
218+ text-align: center;
219+ padding-bottom: 40px;
220+}
221+
222+/** デフォルトテーブル構成 **/
223+table {
224+ margin-left: auto;
225+ margin-right: auto;
226+}
227+
228+th {
229+ border: 1px solid #1E4080;
230+ background-color: #1E4080;
231+ color: #ffffff;
232+}
233+
234+td {
235+ border: 1px solid #1E4080;
236+}
237+
238+td.small {
239+ width: 350px;
240+}
241+
242+th.small {
243+ width: 200px;
244+}
245+
246+td.normal {
247+ width: 580px;
248+}
249+
250+th.normal {
251+ width: 300px;
252+}
253+
254+td.large {
255+ width: 680px;
256+}
257+
258+th.large {
259+ width: 530px;
260+}
261+
262+td.maximum {
263+ width: 880px;
264+}
265+
266+th.maximum {
267+ width: 880px;
268+}
269+
270+td.padding_normal {
271+ padding: 5px 3px;
272+}
273+
274+th.padding_normal {
275+ padding: 5px 3px;
276+}
277+
278+td.default_word_break {
279+ word-break: break-all;
280+}
281+
282+td.hr {
283+ height: 1px;
284+ background-color: #ffffff;
285+ border: none;
286+}
287+
288+/** ファイルリスト一覧 **/
289+table.filelist {
290+ width: 96%;
291+}
292+
293+th.filelist {
294+ text-align: center;
295+ vertical-align: middle;
296+ color: #ffffff;
297+ border: 1px solid #1E4080;
298+ background-color: #1E4080;
299+ padding: 4px;
300+}
301+
302+td.filelist {
303+ text-align: center;
304+ vertical-align: middle;
305+ border: 1px solid #1E4080;
306+ padding: 4px;
307+}
308+
309+div.filelist {
310+ width: 95%;
311+ margin-left: auto;
312+ margin-right: auto;
313+ padding: 5px;
314+ border: 1px solid #A5A5BE;
315+ box-shadow: 2px 4px 10px #cacaca;
316+ background-color: #ffffff;
317+ border-radius: 3px;
318+ behavior: url("./css/PIE.htc");
319+}
320+
321+/** 共通 **/
322+.left {
323+ text-align: left;
324+}
325+
326+.center {
327+ text-align: center;
328+}
329+
330+.right {
331+ text-align: right;
332+}
333+
334+.top {
335+ vertical-align: top;
336+}
337+
338+.middle {
339+ vertical-align: middle;
340+}
341+
342+.bottom {
343+ vertical-align: bottom;
344+}
345+
346+/** インプット部品 **/
347+input.border {
348+ border: 1px solid #A0A0FF;
349+}
350+input.max_width {
351+ width: 98%;
352+}
353+input.middle_width {
354+ width: 250px;
355+}
356+textarea.border {
357+ border: 1px solid #A0A0FF;
358+}
359+
360+/** リンクタグ設定 **/
361+a {
362+ color: #67A7CC;
363+}
364+a:hover {
365+ color: #A3D8F6;
366+}
367+a:visited {
368+}
369+a:active {
370+}
371+
372+a.button {
373+ color: #000000;
374+ border: 1px solid #666666;
375+ background-color: #ffffff;
376+ padding: 16px 22px 15px 22px;
377+ text-decoration: none;
378+ border-radius: 10px;
379+ box-shadow: 2px 4px 10px #cacaca;
380+ behavior: url("./css/PIE.htc");
381+}
382+a:hover.button {
383+ color: #ffffff;
384+ border: 1px solid #000000;
385+ background-color: #333333;
386+}
387+
388+/** メディアクエリー用 **/
389+div[name="for_pc"] {
390+ display: table;
391+}
392+
393+div[name="for_smartphone"] {
394+ display: none;
395+}
--- /dev/null
+++ b/css/reset.css
@@ -0,0 +1,159 @@
1+/*
2+html5doctor.com Reset Stylesheet
3+v1.4
4+2009-07-27
5+Author: Richard Clark - http://richclarkdesign.com
6+*/
7+
8+html, body, div, span, object, iframe,
9+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
10+abbr, address, cite, code,
11+del, dfn, em, img, ins, kbd, q, samp,
12+small, strong, sub, sup, var,
13+b, i,
14+dl, dt, dd, ol, ul, li,
15+fieldset, form, label, legend,
16+table, caption, tbody, tfoot, thead, tr, th, td,
17+article, aside, dialog, figure, footer, header,
18+hgroup, menu, nav, section,
19+time, mark, audio, video {
20+ margin:0;
21+ padding:0;
22+ border:0;
23+ outline:0;
24+ font-size:100%;
25+ vertical-align:baseline;
26+ background:transparent;
27+}
28+body {
29+ line-height:1;
30+}
31+
32+article, aside, dialog, figure, footer, header,
33+hgroup, nav, section {
34+ display:block;
35+}
36+
37+nav ul {
38+ list-style:none;
39+}
40+
41+blockquote, q {
42+ quotes:none;
43+}
44+
45+blockquote:before, blockquote:after,
46+q:before, q:after {
47+ content:'';
48+ content:none;
49+}
50+
51+a {
52+ margin:0;
53+ padding:0;
54+ border:0;
55+ font-size:100%;
56+ vertical-align:baseline;
57+ background:transparent;
58+}
59+
60+ins {
61+ background-color:#ff9;
62+ color:#000;
63+ text-decoration:none;
64+}
65+
66+mark {
67+ background-color:#ff9;
68+ color:#000;
69+ font-style:italic;
70+ font-weight:bold;
71+}
72+
73+del {
74+ text-decoration: line-through;
75+}
76+
77+abbr[title], dfn[title] {
78+ border-bottom:1px dotted #000;
79+ cursor:help;
80+}
81+
82+table {
83+ border-collapse:collapse;
84+ border-spacing:0;
85+}
86+
87+hr {
88+ display:block;
89+ height:1px;
90+ border:0;
91+ border-top:1px solid #cccccc;
92+ margin:1em 0;
93+ padding:0;
94+}
95+
96+input, select {
97+ vertical-align:middle;
98+}
99+
100+html{
101+ overflow-y:scroll;
102+}
103+
104+html,body,#wrap {
105+ height:100%;
106+}
107+
108+body > #wrap{
109+ height:auto;
110+ min-height:100%;
111+}
112+
113+body{
114+ font-family:'Lucida Grande','Hiragino Kaku Gothic ProN',Meiryo, sans-serif;
115+ line-height:1.8;
116+ color:#333;
117+ font-size:14px;
118+}
119+
120+#wrap {
121+ width: 100%;
122+}
123+
124+/*======================================
125+
126+ 逕サ蜒上�險ュ螳
127+
128+=======================================*/
129+img{
130+ border-style:none;
131+ vertical-align:bottom;
132+}
133+
134+/*======================================
135+
136+ Clearfix縺ョ鬲疲ウ
137+
138+=======================================*/
139+/* Clearfix */
140+.clearfix:after {
141+ content: " ";
142+ display: block;
143+ height: 0;
144+ clear: both;
145+ visibility: hidden;
146+}
147+.clearfix {
148+ display: inline-block;
149+ min-height: 1%;
150+}
151+/* Hides from IE-mac \*/
152+
153+* html .clearfix {
154+ height: 1%;
155+}
156+.clearfix {
157+ display: block;
158+}
159+/* End hide from IE-Mac */
\ No newline at end of file
--- /dev/null
+++ b/define.rb
@@ -0,0 +1,57 @@
1+#!/usr/local/bin/ruby
2+# -*- coding: utf-8 -*-
3+#
4+#= Atom Feed 1.0を管理するWEBアプリケーション
5+#
6+#Autohr:: Kureha Hisame (http://lunardial.sakura.ne.jp/) & Yui Naruse (http://airemix.com/)
7+#Version:: 3.0.0.0
8+#Copyright:: Copyright 2009 FeedBlog Project (http://sourceforge.jp/projects/feedblog/)
9+#License:: GPLv3
10+
11+# ログイン情報配列
12+LOGININFO = [
13+ {:id => "login", :password => "password", :name => "テストユーザ"}
14+]
15+# インターフェースのテーブルの幅
16+TABLEWIDTH = 1000
17+# XMLファイル格納先までの相対パス
18+XMLPATH = "./../lunardial/xml/"
19+# FeedBlogを設置したディレクトリのURL
20+HOMEBASE = "https://lunardial.sakura.ne.jp/"
21+# 入力されたフルパスURL(HOMEBASE)を置換する文字列
22+RELAYPATH = "./"
23+# loglist.xmlファイルの定義
24+LISTXMLPATH = "#{XMLPATH}loglist.xml"
25+# FeedBlog上の表示ページからログ格納ディレクトリまでのパス
26+FEEDXMLDIR = "./xml/"
27+# デバッガモード
28+DEBUG = false
29+# ファイルマネージャー機能を使用するならtrue
30+USEFILEMANAGER = true
31+# ファイルマネージャー機能スクリプト(filemanager.rb)のパス
32+FILEMANAGER = "./filemanager.rb"
33+# XMLに書き込む際、改行部分を<br>のまま保持するか、改行記号に直すか
34+REPLACEBRTAG = false
35+# ファイルの書き込み時にENTRYのIDおよびURLを、FEEDオブジェクトから自動生成した値に置換するか否か
36+REPLACEENTRYIDANDURL = false
37+# プラグインディレクトリ
38+PLUGINDIR = "./plugins/"
39+# 記事用初期ファイル名
40+INITIALXML = "diary.xml"
41+
42+# 画像フォルダの場所を定義
43+IMGPATH = "./../lunardial/xml/img/"
44+# アップロード可能な最大ファイルサイズ
45+UPLOADLIMIT = 2 * 1024 * 1024
46+
47+# ログディレクトリ
48+LOG_DIR = "./logs/"
49+# 開発用ログを出力するか?
50+LOG_RELEASE_MODE = false
51+
52+# バージョン情報を示す文字列です
53+APPVERSION = "- FeedGenerator for Ruby version 4.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>)"
54+# タイトル領域に表示される文字列です
55+APPTITLE = "FeedGenerator for Ruby version 4.0.0.0"
56+
57+
--- a/erbtemp/delentry.html.erb
+++ b/erbtemp/delentry.html.erb
@@ -1,110 +1,110 @@
1+<!DOCTYPE html>
12 <html>
2- <head>
3- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
4- <title><%= APPTITLE %></title>
5- <link rel="stylesheet" href="./erbtemp/stylesheet.css" type="text/css">
6- <script type="text/javascript">
7- function switchsubmit(form, action){
8- document.getElementsByName("action").item(0).value = action;
9- form.submit();
10- }
11- </script>
12- </head>
13- <body>
14- <br>
15- <%= menu %>
16- <br>
17- <div class="divstyle" style="width: <%= TABLEWIDTH %>px;">
18- <form action="<%= cgi.script_name %>" method="POST">
19- <input type="hidden" name="target_filepath" value="<%= session["target_filepath"] %>"><% case params["action"]
3+ <head>
4+ <%= htmlparts["headtag"] %>
5+ <%= htmlparts['headjs_switchpost'] %>
6+ </head>
7+ <body>
8+ <form action="<%= cgi.script_name %>" method="POST">
9+ <div class="menu_wrapper">
10+ <%= htmlparts["menu"] %>
11+ </div>
12+ <%= htmlparts["selectfile"] %>
13+ <%= htmlparts["infoarea"] %>
14+ <div class="contents">
15+ <h1>記事削除</h1>
16+ <input type="hidden" name="target_filepath" value="<%= session["target_filepath"] %>"><% case params["action"]
2017 when "confirm" %>
2118 <input type="hidden" name="delid" value="<%= session["delid"] %>">
22- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
19+  ■ 次の記事を削除します。よろしいですか?
20+ <br>
21+ <table>
2322 <tbody>
24- <tr>
25- <td colspan="2" class="formheader">
26- ■ 以下の内容の記事を削除します。よろしいですか?
27- </td>
28- </tr>
2923 <% db.transaction do
3024 entry = db["delentry"]
3125 entry.paramlist.each do |val| %>
3226 <tr style="display: <%= entry.display[val] %>;">
33- <td class="formnavi" style="width: 140px;">
27+ <th class="small middle padding_normal">
3428 <%= entry.name[val] %>
35- </td>
36- <td class="forminput">
29+ </th>
30+ <td class="large middle padding_normal">
3731 <% if val != "content" %><%= entry.send(val) %><% else %><%= entry.content_for_view %><% end %>
3832 </td>
3933 </tr>
34+ <tr style="display: <%= entry.display[val] %>;">
35+ <td class="hr"></td>
36+ <td class="hr"></td>
37+ </tr>
4038 <% end %>
4139 <% end %>
4240 </tbody>
4341 </table>
4442 <br>
45- <input type="hidden" name="mode" value="delentry"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, 'back')"> <input type="button" value="確定" onclick="switchsubmit(this.form, 'exec')"><% when "exec" %>
46- <table align="center" style="width: <%= TABLEWIDTH %>px">
47- <tbody>
48- <tr>
49- <td class="forminput" style="text-align: center;">
50- 記事の削除が完了しました。
51- </td>
52- </tr>
53- </tbody>
54- </table>
43+ <div class="center">
44+ <input type="hidden" name="mode" value="delentry"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, 'back')"> <input type="button" value="確定" onclick="switchsubmit(this.form, 'exec')">
45+ </div>
5546 <br>
56- <a href="<%= cgi.script_name %>">メニューに戻る</a>
5747 <% else %>
5848 <% db.transaction do %>
59- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
49+ <table>
6050 <tbody>
6151 <tr>
62- <td class="formheader" colspan="3">
63- ■ 削除する記事を選択してください。
64- </td>
65- </tr>
66- <tr>
67- <td class="formheader">
52+ <td class="center" style="width: 50px;">
6853  
6954 </td>
70- <td class="formheader" style="text-align: center;">
55+ <th class="large center padding_normal">
7156 記事のタイトル
72- </td>
73- <td class="formheader" style="text-align: center;">
57+ </th>
58+ <th class="small center padding_normal">
7459 最終更新時間
75- </td>
60+ </th>
61+ </tr>
62+ <tr>
63+ <td class="hr"></td>
64+ <td class="hr"></td>
65+ <td class="hr"></td>
7666 </tr>
7767 <% db["entry"].each_with_index do |entry, i| %>
7868 <tr>
79- <td class="forminput" style="width: 30px; text-align: center;">
69+ <td class="center padding_normal">
8070 <% if params["action"] == "back" and session["delid"] == entry.entryid %>
8171 <input type="radio" name="delid" value="<%= entry.send("entryid") %>" checked="checked"><% else %>
8272 <input type="radio" name="delid" value="<%= entry.send("entryid") %>"><% end %>
8373 </td>
84- <td class="forminput">
74+ <td class="left padding_normal default_word_break">
8575 <%= entry.send("title") %>
8676 </td>
87- <td class="forminput" style="width: 150px; text-align: center;">
77+ <td class="center padding_normal">
8878 <%= entry.send("published").gsub("+09:00", "").gsub("T", " ") %>
8979 </td>
9080 </tr>
81+ <tr>
82+ <td class="hr"></td>
83+ <td class="hr"></td>
84+ <td class="hr"></td>
85+ </tr>
9186 <% end %>
9287 </tbody>
9388 </table>
9489 <br>
9590 <% if db["entry"].length != 0 %>
96- <input type="hidden" name="mode" value="delentry"><input type="hidden" name="action" value="confirm"><input type="submit" value="確認"><% else %>
97- 削除対象となる記事が存在しません。
91+ <div class="center">
92+ <input type="hidden" name="mode" value="delentry"><input type="hidden" name="action" value="confirm"><input type="submit" value="確認">
93+ </div>
94+ <br>
95+ <% else %>
96+ <div class="center">
97+ 削除対象となる記事が存在しません。
98+ </div>
9899 <br>
99100 <br>
100101 <% end %>
101102 <% end %>
102103 <% end %>
103- </form>
104- </div>
105- <br>
106- <div class="divstyle" style="border: none;">
107- <%= APPVERSION %>
108- </div>
109- </body>
104+ </div>
105+ <div class="bottom_area">
106+ <%= APPVERSION %>
107+ </div>
108+ </form>
109+ </body>
110110 </html>
--- a/erbtemp/editentry.html.erb
+++ b/erbtemp/editentry.html.erb
@@ -1,9 +1,9 @@
1+<!DOCTYPE html>
12 <html>
2- <head>
3- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
4- <title><%= APPTITLE %></title>
5- <link rel="stylesheet" href="./erbtemp/stylesheet.css" type="text/css">
6- <% unless cgi.user_agent =~ /(iPod|iPhone|iPad|Android)/ %>
3+ <head>
4+ <%= htmlparts["headtag"] %>
5+ <%= htmlparts['headjs_switchpost'] %>
6+ <% unless cgi.user_agent =~ /(iPod|iPhone|iPad|Android)/ %>
77 <link rel="stylesheet" type="text/css" href="./yui/build/menu/assets/skins/sam/menu.css" />
88 <link rel="stylesheet" type="text/css" href="./yui/build/button/assets/skins/sam/button.css" />
99 <link rel="stylesheet" type="text/css" href="./yui/build/fonts/fonts-min.css" />
@@ -136,158 +136,175 @@
136136 margin: 0;
137137 padding: 0;
138138 }
139+
140+ body {
141+ font-family: 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', 'メイリオ', Meiryo, 'MS Pゴシック', sans-serif;
142+ font-size: 12px;
143+ line-height: 18px;
144+ }
139145 </style>
140146 <% end %>
141- </head>
142- <body class="yui-skin-sam">
143- <br>
144- <%= menu %>
145- <br>
146- <div class="divstyle" style="width: <%= TABLEWIDTH %>px;">
147- <form action="<%= cgi.script_name %>" method="POST">
148- <input type="hidden" name="target_filepath" value="<%= session["target_filepath"] %>"><% case params["action"]
147+ </head>
148+ <body class="yui-skin-sam">
149+ <form action="<%= cgi.script_name %>" method="POST">
150+ <div class="menu_wrapper">
151+ <%= htmlparts["menu"] %>
152+ </div>
153+ <%= htmlparts["selectfile"] %>
154+ <%= htmlparts["infoarea"] %>
155+ <div class="contents">
156+ <h1>記事編集</h1>
157+ <input type="hidden" name="target_filepath" value="<%= session["target_filepath"] %>"><% case params["action"]
149158 when "confirm" %>
150159 <input type="hidden" name="editid" value="<%= session["editid"] %>">
151- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
160+ <table>
152161 <tbody>
153- <tr>
154- <td colspan="2" class="formheader">
155- ■ 入力内容を確認してください
156- </td>
157- </tr>
158162 <% db.transaction do
159163 entry = db["editentry"]
160164 entry.paramlist.each do |val| %>
161165 <tr style="display: <%= entry.display[val] %>;">
162- <td class="formnavi" style="width: 140px;">
166+ <th class="small middle padding_normal">
163167 <%= entry.name[val] %>
164- </td>
165- <td class="forminput">
168+ </th>
169+ <td class="large middle padding_normal">
166170 <input type="hidden" name="<%= val %>" value="<%= entry.send(val) %>"><% if val != "content" %><%= entry.send(val) %><% else %><%= entry.content_for_view %><% end %>
167171 </td>
168- </tr><% end %>
172+ </tr>
173+ <tr style="display: <%= entry.display[val] %>;">
174+ <td class="hr"></td>
175+ <td class="hr"></td>
176+ </tr>
177+ <% end %>
169178 <% end %>
170179 </tbody>
171180 </table>
172181 <br>
173- <input type="hidden" name="mode" value="editentry"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, 'back')"> <input type="button" value="確定" onclick="switchsubmit(this.form, 'exec')"><% when "exec" %>
174- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px">
175- <tbody>
176- <tr>
177- <td class="forminput" style="text-align: center;">
178- 記事の編集が完了しました。
179- </td>
180- </tr>
181- </tbody>
182- </table>
182+ <div class="center">
183+ <input type="hidden" name="mode" value="editentry"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, 'back')"> <input type="button" value="確定" onclick="switchsubmit(this.form, 'exec')">
184+ </div>
183185 <br>
184- <a href="<%= cgi.script_name %>">メニューに戻る</a>
185186 <% when "edit" %>
186187 <input type="hidden" name="editid" value="<%= session["editid"] %>">
187- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
188+ <table>
188189 <tbody>
189- <tr>
190- <td colspan="2" class="formheader">
191- ■ 記事編集
192- <br>
193- </td>
194- </tr>
195190 <% db.transaction do
196191 entry = db["editentry"]
197192 entry.paramlist.each do |val| %>
198193 <tr style="display: <%= entry.display[val] %>;">
199- <td class="formnavi" style="width: 140px;">
194+ <th class="small middle padding_normal">
200195 <%= entry.name[val] %>
201- </td>
202- <td class="forminput">
196+ </th>
197+ <td class="large middle padding_normal center">
203198 <% if val == "content" %>
204- <textarea name="<%= val %>" rows="10" style="width: 100%" id="contenteditor"><%= entry.content_for_generator %></textarea>
199+ <textarea name="<%= val %>" rows="10" class="max_width" id="contenteditor"><%= entry.content_for_generator %></textarea>
205200 <% elsif val == "updated" %>
206- <input type="text" name="<%= val %>" value="<%= Time.now.iso8601 %>" style="width: 100%;"><% else %>
207- <input type="text" name="<%= val %>" value="<%= entry.send(val) %>" style="width: 100%;"><% end %>
201+ <input type="text" name="<%= val %>" value="<%= Time.now.iso8601 %>" class="max_width"><% else %>
202+ <input type="text" name="<%= val %>" value="<%= entry.send(val) %>" class="max_width"><% end %>
208203 </td>
209- </tr><% end %>
204+ </tr>
205+ <tr style="display: <%= entry.display[val] %>;">
206+ <td class="hr"></td>
207+ <td class="hr"></td>
208+ </tr>
209+ <% end %>
210210 <% end %>
211211 </tbody>
212212 </table>
213213 <br>
214- <input type="hidden" name="mode" value="editentry"><input type="hidden" name="action" value="confirm"><input type="submit" value="確認"><% when "back" %>
214+ <div class="center">
215+ <input type="hidden" name="mode" value="editentry"><input type="hidden" name="action" value="confirm"><input type="submit" value="確認">
216+ </div>
217+ <br>
218+ <% when "back" %>
215219 <input type="hidden" name="editid" value="<%= session["editid"] %>">
216- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
220+ <table>
217221 <tbody>
218- <tr>
219- <td colspan="2" class="formheader">
220- ■ 記事内容
221- <br>
222- </td>
223- </tr>
224222 <% db.transaction do
225223 entry = db["editentry"]
226224 entry.paramlist.each do |val| %>
227225 <tr style="display: <%= entry.display[val] %>;">
228- <td class="formnavi" style="width: 140px;">
226+ <th class="small middle padding_normal">
229227 <%= entry.name[val] %>
230- </td>
231- <td class="forminput">
228+ </th>
229+ <td class="large middle padding_normal center">
232230 <% if val == "content" %>
233- <textarea name="<%= val %>" rows="10" style="width: 100%" id="contenteditor"><%= entry.content_for_generator %></textarea>
231+ <textarea name="<%= val %>" rows="10" class="max_width" id="contenteditor"><%= entry.content_for_generator %></textarea>
234232 <% else %>
235- <input type="text" name="<%= val %>" value="<%= entry.send(val) %>" style="width: 100%;"><% end %>
233+ <input type="text" name="<%= val %>" value="<%= entry.send(val) %>" class="max_width"><% end %>
236234 </td>
237- </tr><% end %>
235+ </tr>
236+ <tr style="display: <%= entry.display[val] %>;">
237+ <td class="hr"></td>
238+ <td class="hr"></td>
239+ </tr>
240+ <% end %>
238241 <% end %>
239242 </tbody>
240243 </table>
241244 <br>
242- <input type="hidden" name="mode" value="editentry"><input type="hidden" name="action" value="confirm"><input type="submit" class="wymupdate" value="確認"><% else %>
245+ <div class="center">
246+ <input type="hidden" name="mode" value="editentry"><input type="hidden" name="action" value="confirm"><input type="submit" class="wymupdate" value="確認">
247+ </div>
248+ <br>
249+ <% else %>
243250 <% db.transaction do %>
244- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
251+ <table>
245252 <tbody>
246253 <tr>
247- <td class="formheader" colspan="3">
248- ■ 編集する記事を選択してください。
249- </td>
250- </tr>
251- <tr>
252- <td class="formheader">
254+ <td class="center" style="width: 50px;">
253255  
254256 </td>
255- <td class="formheader" style="text-align: center;">
257+ <th class="large center padding_normal">
256258 記事のタイトル
257- </td>
258- <td class="formheader" style="text-align: center;">
259+ </th>
260+ <th class="small center padding_normal">
259261 最終更新時間
260- </td>
262+ </th>
263+ </tr>
264+ <tr>
265+ <td class="hr"></td>
266+ <td class="hr"></td>
267+ <td class="hr"></td>
261268 </tr>
262269 <% db["entry"].each_with_index do |entry, i| %>
263270 <tr>
264- <td class="forminput" style="width: 30px; text-align: center;">
271+ <td class="center padding_normal">
265272 <input type="radio" name="editid" value="<%= entry.send("entryid") %>">
266273 </td>
267- <td class="forminput">
274+ <td class="left padding_normal default_word_break">
268275 <%= entry.send("title") %>
269276 </td>
270- <td class="forminput" style="width: 150px; text-align: center;">
277+ <td class="center padding_normal">
271278 <%= entry.send("published").gsub("+09:00", "").gsub("T", " ") %>
272279 </td>
273280 </tr>
281+ <tr>
282+ <td class="hr"></td>
283+ <td class="hr"></td>
284+ <td class="hr"></td>
285+ </tr>
274286 <% end %>
275287 </tbody>
276288 </table>
277289 <br>
278290 <% if db["entry"].length != 0 %>
279- <input type="hidden" name="mode" value="editentry"><input type="hidden" name="action" value="edit"><input type="submit" value="編集"><% else %>
280- 編集対象となる記事が存在しません。
291+ <div class="center">
292+ <input type="hidden" name="mode" value="editentry"><input type="hidden" name="action" value="edit"><input type="submit" value="編集">
293+ </div>
294+ <br>
295+ <% else %>
296+ <div class="center">
297+ 編集対象となる記事が存在しません。
298+ </div>
281299 <br>
282300 <br>
283301 <% end %>
284302 <% end %>
285303 <% end %>
286- </form>
287- </div>
288- <br>
289- <div class="divstyle" style="border: none;">
290- <%= APPVERSION %>
291- </div>
292- </body>
304+ </div>
305+ <div class="bottom_area">
306+ <%= APPVERSION %>
307+ </div>
308+ </form>
309+ </body>
293310 </html>
--- a/erbtemp/editfeed.html.erb
+++ b/erbtemp/editfeed.html.erb
@@ -1,101 +1,93 @@
1+<!DOCTYPE html>
12 <html>
2- <head>
3- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
4- <title><%= APPTITLE %></title>
5- <link rel="stylesheet" href="./erbtemp/stylesheet.css" type="text/css">
6- <script type="text/javascript">
7- function switchsubmit(form, action){
8- document.getElementsByName("action").item(0).value = action;
9- form.submit();
10- }
11-
12- function autocomp_feedid(){
3+ <head>
4+ <%= htmlparts["headtag"] %>
5+ <%= htmlparts['headjs_switchpost'] %>
6+ <script>
7+ function autocomp_feedid(){
138 document.getElementsByName("feedid").item(0).value = document.getElementsByName("url").item(0).value;
149 }
1510 </script>
16- </head>
17- <body>
18- <br>
19- <%= menu %>
20- <br>
21- <div class="divstyle" style="width: <%= TABLEWIDTH %>px;">
22- <form action="<%= cgi.script_name %>" method="POST">
23- <input type="hidden" name="target_filepath" value="<%= session["target_filepath"] %>">
11+ </head>
12+ <body>
13+ <form action="<%= cgi.script_name %>" method="POST">
14+ <div class="menu_wrapper">
15+ <%= htmlparts["menu"] %>
16+ </div>
17+ <%= htmlparts["selectfile"] %>
18+ <%= htmlparts["infoarea"] %>
19+ <div class="contents">
20+ <h1>基本情報編集</h1>
21+ <input type="hidden" name="target_filepath" value="<%= session["target_filepath"] %>">
2422 <% case params["action"]
2523 when "confirm" %>
26- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
24+ <table>
2725 <tbody>
28- <tr>
29- <td colspan="2" class="formheader">
30- ■ 入力内容を確認してください
31- </td>
32- </tr>
3326 <% db.transaction do
3427 feed = db["feed"]
3528 feed.paramlist.each do |val| %>
3629 <tr style="display: <%= feed.display[val] %>;">
37- <td class="formnavi" style="width: 200px;">
30+ <th class="small middle padding_normal">
3831 <%= feed.name[val] %>
39- </td>
40- <td class="forminput">
32+ </th>
33+ <td class="large left padding_normal">
4134 <%= feed.send(val) %>
4235 <input type="hidden" name="<%= val %>" value="<%= feed.send(val) %>">
4336 </td>
44- </tr><% end %>
37+ </tr>
38+ <tr style="display: <%= feed.display[val] %>;">
39+ <td class="hr"></td>
40+ <td class="hr"></td>
41+ </tr>
42+ <% end %>
4543 <% end %>
4644 </tbody>
4745 </table>
4846 <br>
49- <input type="hidden" name="mode" value="editfeed"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, 'back')"> <input type="button" value="確定" onclick="switchsubmit(this.form, 'exec')"><% when "exec" %>
50- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
51- <tbody>
52- <tr>
53- <td class="forminput" style="text-align: center;">
54- 記事の情報を更新しました。
55- </td>
56- </tr>
57- </tbody>
58- </table>
47+ <div class="center">
48+ <input type="hidden" name="mode" value="editfeed"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, 'back')"> <input type="button" value="確定" onclick="switchsubmit(this.form, 'exec')">
49+ </div>
5950 <br>
60- <a href="<%= cgi.script_name %>">メニューに戻る</a>
6151 <% else %>
62- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
52+ <table>
6353 <tbody>
64- <tr>
65- <td colspan="2" class="formheader">
66- ■ XML情報編集
67- <br>
68- </td>
69- </tr>
7054 <% db.transaction do
7155 feed = db["feed"]
7256 feed.paramlist.each do |val| %>
7357 <tr style="display: <%= feed.display[val] %>;">
74- <td class="formnavi" style="width: 200px;">
58+ <th class="small middle padding_normal">
7559 <%= feed.name[val] %>
76- </td>
77- <td class="forminput">
60+ </th>
61+ <td class="large middle padding_normal center">
7862 <% date = Time.now.iso8601 %>
7963 <% if val == "updated" %>
80- <input type="text" name="<%= val %>" value="<%= date %>" style="width: 100%"><% elsif val == "url" %>
81- <input type="text" name="<%= val %>" value="<%= feed.send(val) %>" style="width: 100%" onchange="autocomp_feedid();"><% elsif val == "feedid" %>
82- <input type="text" name="<%= val %>" value="<%= feed.send(val) %>" style="width: 100%">
64+ <input type="text" name="<%= val %>" value="<%= date %>" class="max_width"><% elsif val == "url" %>
65+ <input type="text" name="<%= val %>" value="<%= feed.send(val) %>" class="max_width" onchange="autocomp_feedid();"><% elsif val == "feedid" %>
66+ <input type="text" name="<%= val %>" value="<%= feed.send(val) %>" class="max_width">
8367 <br>
84- <span style="font-style: italic;">通常ウェブページのidはあなたのウェブページURLと同一のものを使用してください。</span>
68+ <span style="font-style: italic;">通常、ウェブページのID情報は、あなたのウェブページURLと同一のものを使用することを推奨します。</span>
8569 <% else %>
86- <input type="text" name="<%= val %>" value="<%= feed.send(val) %>" style="width: 100%"><% end %>
70+ <input type="text" name="<%= val %>" value="<%= feed.send(val) %>" class="max_width"><% end %>
8771 </td>
88- </tr><% end %>
72+ </tr>
73+ <tr style="display: <%= feed.display[val] %>;">
74+ <td class="hr"></td>
75+ <td class="hr"></td>
76+ </tr>
77+ <% end %>
8978 <% end %>
9079 </tbody>
9180 </table>
9281 <br>
93- <input type="hidden" name="mode" value="editfeed"><input type="hidden" name="action" value="confirm"><input type="submit" value="確認"><% end %>
94- </form>
95- </div>
96- <br>
97- <div class="divstyle" style="border: none;">
98- <%= APPVERSION %>
99- </div>
100- </body>
82+ <div class="center">
83+ <input type="hidden" name="mode" value="editfeed"><input type="hidden" name="action" value="confirm"><input type="submit" value="確認">
84+ </div>
85+ <br>
86+ <% end %>
87+ </div>
88+ <div class="bottom_area">
89+ <%= APPVERSION %>
90+ </div>
91+ </form>
92+ </body>
10193 </html>
--- a/erbtemp/error.html.erb
+++ b/erbtemp/error.html.erb
@@ -1,48 +1,21 @@
1+<!DOCTYPE html>
12 <html>
2- <head>
3- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
4- <title><%= APPTITLE %></title>
5- <link rel="stylesheet" href="./erbtemp/stylesheet.css" type="text/css">
6- </head>
7- <body>
8- <div class="divstyle" style="width: <%= TABLEWIDTH %>px;">
9- <table align="center">
10- <tbody>
11- <tr>
12- <td style="width: <%= (TABLEWIDTH - 20) %>px;" class="formnavi">
13- ■ エラーが発生しました!
14- <br>
15- </td>
16- </tr>
17- <tr>
18- <td class="forminput">
19- ▼ エラー詳細 :
20- <br>
21- <table>
22- <tbody>
23- <tr>
24- <td style="color: #ff0000; width: <%= (TABLEWIDTH - 30) %>px;" class="forminput">
25- <% db.transaction do %>
26- <%= db["error"] %>
27- <% end %>
28- </td>
29- </tr>
30- </tbody>
31- </table>
32- <br>
33- <div style="text-align: center; width: 100%;">
34- [ <a href="<%= cgi.script_name %>?mode=logout">ログアウトする</a>
35- ]
36- </div>
37- <br>
38- </td>
39- </tr>
40- </tbody>
41- </table>
42- </div>
43- <br>
44- <div class="divstyle" style="border: none;">
45- <%= APPVERSION %>
46- </div>
47- </body>
3+ <head>
4+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
5+ <title><%= APPTITLE %></title>
6+ <link rel="stylesheet" href="./css/reset.css" type="text/css"/>
7+ <link rel="stylesheet" href="./css/base.css" type="text/css"/>
8+ </head>
9+ <body>
10+ <br>
11+ <br>
12+ <div class="small_contents center">
13+ <h1>エラーが発生しました。</h1>
14+  <%= session["error"] %>
15+ </div>
16+ <div class="bottom_area">
17+ <%= APPVERSION %>
18+ </div>
19+ </body>
4820 </html>
21+
--- a/erbtemp/exception.html.erb
+++ b/erbtemp/exception.html.erb
@@ -1,59 +1,30 @@
1+<!DOCTYPE html>
12 <html>
2- <head>
3- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
4- <title><%= APPTITLE %></title>
5- <link rel="stylesheet" href="./erbtemp/stylesheet.css" type="text/css">
6- </head>
7- <body>
8- <div class="divstyle" style="width: <%= TABLEWIDTH %>px;">
9- <table align="center">
10- <tbody>
11- <tr>
12- <td style="width: <%= (TABLEWIDTH - 20) %>px;" class="formnavi">
13- ■ エラーが発生しました!アプリケーションの設定を見直してください。
14- <br>
15- </td>
16- </tr>
17- <tr>
18- <td class="forminput">
19- ▼ エラー詳細 :
20- <br>
21- <table>
22- <tbody>
23- <tr>
24- <td style="color: #ff0000; width: <%= (TABLEWIDTH - 30) %>px;" class="forminput">
25- <%= CGI.escapeHTML(exception.to_s).gsub("\n", "<br>") %>
26- </td>
27- </tr>
28- </tbody>
29- </table>
30- ▼ バックトレース :
31- <br>
32- <table>
33- <tbody>
34- <tr>
35- <td style="color: #ff0000; width: <%= (TABLEWIDTH - 30) %>px;" class="forminput">
36- <% exception.backtrace.each do |val| %>
37- <%= CGI.escapeHTML(val.to_s) + "<br>" %>
38- <% end %>
39- </td>
40- </tr>
41- </tbody>
42- </table>
43- <br>
44- <div style="text-align: center; width: 100%;">
45- [ <a href="<%= cgi.script_name %>?mode=logout">ログアウトする</a>
46- ]
47- </div>
48- <br>
49- </td>
50- </tr>
51- </tbody>
52- </table>
53- </div>
54- <br>
55- <div class="divstyle" style="border: none;">
56- <%= APPVERSION %>
57- </div>
58- </body>
3+ <head>
4+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
5+ <title><%= APPTITLE %></title>
6+ <link rel="stylesheet" href="./css/reset.css" type="text/css"/>
7+ <link rel="stylesheet" href="./css/base.css" type="text/css"/>
8+ </head>
9+ <body>
10+ <br>
11+ <br>
12+ <div class="small_contents left">
13+ <h1>エラーが発生しました。</h1>
14+  ■ エラー詳細 :
15+ <br>
16+  <%= CGI.escapeHTML(exception.to_s).gsub("\n", "<br>") %>
17+ <br>
18+ <br>
19+  ■ バックトレース :
20+ <br>
21+ <% exception.backtrace.each do |val| %>
22+  <%= CGI.escapeHTML(val.to_s) + "<br>" %>
23+ <% end %>
24+ <br>
25+ </div>
26+ <div class="bottom_area">
27+ <%= APPVERSION %>
28+ </div>
29+ </body>
5930 </html>
--- a/erbtemp/fileindex.html.erb
+++ b/erbtemp/fileindex.html.erb
@@ -1,23 +1,24 @@
1+<!DOCTYPE html>
12 <html>
2- <head>
3- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
4- <title><%= APPTITLE %></title>
5- <link rel="stylesheet" href="./erbtemp/stylesheet.css" type="text/css"/>
6- </head>
7- <body>
8- <br>
9- <br>
10- <div class="divstyle" style="width: 400px; padding: 15px;">
11- FileManager for Ruby
12- <br>
13- <br>
14- 認証されていません。FeedGenerator for Rubyから起動してください。
15- <br>
16- <br>
17- </div>
18- <br>
19- <div class="divstyle" style="border: none;">
20- <%= APPVERSION %>
21- </div>
22- </body>
3+ <head>
4+ <%= htmlparts["headtag"] %>
5+ </head>
6+ <body>
7+ <br>
8+ <br>
9+ <div class="small_contents center">
10+ <form action="<%= cgi.script_name %>" method="POST">
11+ <br>
12+ <%= APPTITLE %>
13+ <br>
14+ <br>
15+ ユーザ認証されていません。
16+ <br>
17+ <br>
18+ </form>
19+ </div>
20+ <div class="bottom_area">
21+ <%= APPVERSION %>
22+ </div>
23+ </body>
2324 </html>
--- a/erbtemp/filemanager.html.erb
+++ b/erbtemp/filemanager.html.erb
@@ -1,158 +1,268 @@
1+<!DOCTYPE html>
12 <html>
2- <head>
3- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
4- <title><%= APPTITLE %></title>
5- <link rel="stylesheet" href="./erbtemp/stylesheet.css" type="text/css">
6- <script type="text/javascript">
7- function switchsubmit(form, action, arg){
8- document.getElementsByName("action").item(0).value = action;
9- document.getElementsByName("arg").item(0).value = arg;
10- document.getElementById(form).submit();
11- }
12-
13- function checkall(formid, flag){
14- var form = document.getElementById(formid);
15- for (i = 0; i < form.length; i++) {
16- if (form.elements[i].type == "checkbox") {
17- form.elements[i].checked = flag;
18- }
19- }
20- }
21- </script>
22- </head>
23- <body>
24- <div class="divstyle" style="width: <%= TABLEWIDTH %>px;">
25- <form id="fileform" action="<%= cgi.script_name %>" method="POST" enctype="multipart/form-data">
26- <% unless session["info"] == "" %>
27- <div class="divstyle" align="center" style="margin-bottom: 4px;">
28- <%= session["info"] %>
29- </div>
30- <% end %>
31- <% unless session["error"] == "" %>
32- <div class="divstyle" align="center" style="color: #ff0000; margin-bottom: 4px;">
33- <%= session["error"] %>
34- </div>
35- <% end %>
36- <div class="divstyle" align="center">
37- アップロードするファイルを選択してください。&nbsp;(アップロード上限サイズ : <%= (UPLOADLIMIT / 1024 / 1024 ) %>MB)
38- </div>
39- <br>
40- <table align="center">
41- <tbody>
42- <tr>
43- <td>
44- </td>
45- <td>
46- <input type="file" name="updata">
47- </td>
48- </tr>
49- <tr>
50- <td colspan="2" style="text-align: center;">
51- <input type="button" value="アップロード" onclick="javascript:switchsubmit('fileform', 'upload', '')">
52- </td>
53- </tr>
54- </tbody>
55- </table>
56- <br>
57- <div class="divstyle" align="center">
58- 現在のディレクトリ : <span style="font-weight: bold;">/<a href="javascript:switchsubmit('fileform', 'cd_abs', '0')">root</a>/<% session["relpath_list"].split("/").each_with_index { |rp, i| %><a href="javascript:switchsubmit('fileform', 'cd_abs', '<%= (i + 1) %>')"><%= rp %></a>/<% } %></span>&nbsp;[<a href="javascript:switchsubmit('fileform', 'refresh', '')">更新</a>]
59- </div>
60- <br>
61- <input type="text" name="dirname">&nbsp;<input type="button" value="フォルダ作成" onclick="javascript:switchsubmit('fileform', 'mkdir', '')">
62- <br>
63- <br>
64- <input type="button" value="全選択" onclick="checkall('fileform', true)">&nbsp;<input type="button" value="全解除" onclick="checkall('fileform', false)">&nbsp;<input type="button" value="マークしたファイルを削除" onclick="javascript:switchsubmit('fileform', 'delete', '')">
65- <br>
66- <br>
67- <table align="center" style="width: 90%">
68- <tbody>
69- <tr>
70- <td class="formnavi" style="text-align: center; padding: 2px;">
71- 削除
72- </td>
73- <td class="formnavi" style="text-align: center; padding: 2px;">
74- ファイル名
75- </td>
76- <td class="formnavi" style="text-align: center; padding: 2px;">
77- ファイルタイプ
78- </td>
79- <td class="formnavi" style="text-align: center; padding: 2px;">
80- ファイルサイズ
81- </td>
82- <td class="formnavi" style="text-align: center; padding: 2px;">
83- 最終更新時間
84- </td>
85- </tr>
86- <% unless IMGPATH == session["pwd"] %>
87- <tr>
88- <td class="formnavi" style="text-align: center; padding: 2px;">
89- &nbsp;
90- </td>
91- <td class="forminput" style="text-align: center; padding: 2px;">
92- <span style="font-weight: bold;">[ <a href="javascript:switchsubmit('fileform', 'cd', '..')">Parent Directory</a>&nbsp;]</span>
93- </td>
94- <td class="forminput" style="text-align: center; padding: 2px;">
95- -
96- </td>
97- <td class="forminput" style="text-align: center; padding: 2px;">
98- -
99- </td>
100- <td class="forminput" style="text-align: center; padding: 2px;">
101- -
102- </td>
103- </tr>
104- <% end %>
105- <% session["filelist"].each do |fname| %>
106- <% if session["fileinfo"][fname][:ftype] == "directory" %>
107- <tr>
108- <td class="formnavi" style="text-align: center; padding: 2px;">
109- <input type="checkbox" name="filename_<%= fname %>" value="delete">
110- </td>
111- <td class="forminput" style="text-align: center; padding: 2px;">
112- <span style="font-weight: bold;">[ <a href="javascript:switchsubmit('fileform', 'cd', '<%= fname %>')"><%= fname %></a>&nbsp;]</span>
113- </td>
114- <td class="forminput" style="text-align: center; padding: 2px;">
115- <%= session["fileinfo"][fname][:ftype] %>
116- </td>
117- <td class="forminput" style="text-align: center; padding: 2px;">
118- -
119- </td>
120- <td class="forminput" style="text-align: center; padding: 2px;">
121- <%= session["fileinfo"][fname][:ctime].strftime("%Y年%m月%d日 %H時%M分%S秒") %>
122- </td>
123- </tr>
124- <% end %>
125- <% end %>
126- <% session["filelist"].each do |fname| %>
127- <% if session["fileinfo"][fname][:ftype] == "file" %>
128- <tr>
129- <td class="formnavi" style="text-align: center; padding: 2px;">
130- <input type="checkbox" name="filename_<%= fname %>" value="delete">
131- </td>
132- <td class="forminput" style="text-align: center; padding: 2px;">
133- <a href="<%= session["pwd"] %><%= fname %>" target="_blank"><%= fname %></a>
134- </td>
135- <td class="forminput" style="text-align: center; padding: 2px;">
136- <%= session["fileinfo"][fname][:ftype] %>
137- </td>
138- <td class="forminput" style="text-align: center; padding: 2px;">
139- <%= session["fileinfo"][fname][:size] %>KB
140- </td>
141- <td class="forminput" style="text-align: center; padding: 2px;">
142- <%= session["fileinfo"][fname][:ctime].strftime("%Y年%m月%d日 %H時%M分%S秒") %>
143- </td>
144- </tr>
145- <% end %>
146- <% end %>
147- </tbody>
148- </table>
149- <br>
150- <input type="hidden" name="relpath_list" value="<%= session["relpath_list"] %>"><input type="hidden" name="mode" value="file"><input type="hidden" name="action" value=""><input type="hidden" name="arg" value="">
151- </form>
152- </div>
153- <br>
154- <div class="divstyle" style="border: none;">
155- <%= APPVERSION %>
156- </div>
157- </body>
3+ <head>
4+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
5+ <title><%= APPTITLE %></title>
6+ <link rel="stylesheet" href="./css/reset.css" type="text/css"/>
7+ <link rel="stylesheet" href="./css/base.css" type="text/css"/>
8+ <script type="text/javascript" src="./js/jquery-1.6.1.min.js"></script>
9+ <script type="text/javascript">
10+ function switchsubmit(form, action, arg) {
11+ $("*[name=action]").val(action);
12+ $("*[name=arg]").val(arg);
13+ $("#" + form).submit();
14+ }
15+
16+ function sortchange(sort_type) {
17+ var now_sort_type = $("#sort_type").val();
18+ var now_sort_reverse = $("#sort_reverse").val();
19+
20+ if (sort_type == now_sort_type) {
21+ if (now_sort_reverse == "true") {
22+ $("#sort_reverse").val("false");
23+ } else {
24+ $("#sort_reverse").val("true");
25+ }
26+ } else {
27+ $("#sort_type").val(sort_type);
28+ $("#sort_reverse").val("false");
29+ }
30+
31+ switchsubmit('fileform', 'refresh', '');
32+ }
33+
34+ function checkall(formid, flag) {
35+ var form = document.getElementById(formid);
36+ for ( i = 0; i < form.length; i++) {
37+ if (form.elements[i].type == "checkbox") {
38+ form.elements[i].checked = flag;
39+ }
40+ }
41+ }
42+
43+ function autoRename() {
44+ $("#file_rename").val(+new Date())
45+ }
46+
47+ function addExtension(ext) {
48+ $("#file_rename").val($("#file_rename").val() + '.' + ext)
49+ }
50+ </script>
51+ </head>
52+ <body>
53+ <form id="fileform" action="<%= cgi.script_name %>" method="POST" enctype="multipart/form-data">
54+ <div class="menu_wrapper">
55+ <div class="menu">
56+ <ul class="menu">
57+ <li class="menu_left">
58+ <a href="#file_upload" class="menu">ファイルアップロード</a>
59+ </li>
60+ <li class="menu_left">
61+ <a href="#file_manage" class="menu">ファイル操作</a>
62+ </li>
63+ <li class="menu_left">
64+ <a href="#" class="menu" onclick="javascript: window.close();">ウインドウを閉じる</a>
65+ </li>
66+ </ul>
67+ </div>
68+ </div>
69+ <% unless session["info"] == "" %>
70+ <div class="contents info_contents">
71+ <h1 class="info">以下の操作を実施しました</h1>
72+ <div class="info_contens_inner">
73+ <%= session["info"] %>
74+ </div>
75+ <br>
76+ </div>
77+ <% end %>
78+ <% unless session["error"] == "" %>
79+ <div class="contents error_contents">
80+ <h1 class="error">エラーが発生しました</h1>
81+ <div class="error_contens_inner">
82+ <%= session["error"] %>
83+ </div>
84+ <br>
85+ </div>
86+ <% end %>
87+ <div class="contents">
88+ <h1>
89+ <a name="file_upload">ファイルアップロード</a>
90+ </h1>
91+   アップロードするファイルを選択してください。&nbsp;(アップロード上限サイズ : <%= (UPLOADLIMIT / 1024 / 1024 ) %>MB)
92+ <br>
93+ <br>
94+ <table>
95+ <tr>
96+ <th class="normal middle"> ファイルアップロード </th>
97+ <td class="padding_normal normal left">
98+ <input type="file" name="updata">
99+ <br>
100+ <input type="checkbox" name="thumbs" id="thumbs" value="true" checked="checked">
101+ &nbsp; <label for="thumbs">サムネイル自動生成(拡張子jpg,pngのファイルのみ有効)</label></td>
102+ </tr>
103+ <tr>
104+ <td class="hr"></td>
105+ <td class="hr"></td>
106+ </tr>
107+ <tr>
108+ <th class="normal middle">(オプション)アップロード後のファイル名を指定</th>
109+ <td class="padding_normal normal left">
110+ <input type="text" id="file_rename" name="file_rename" class="middle_width border">
111+ &nbsp;
112+ <input type="button" value="ファイル名自動生成" onclick="javascript: autoRename();">
113+ &nbsp;
114+ <input type="button" value=".jpg" onclick="javascript: addExtension('jpg')">
115+ &nbsp;
116+ <input type="button" value=".png" onclick="javascript: addExtension('png')">
117+ <br>
118+ ファイル名は拡張子を含めて指定して下さい。 </td>
119+ </tr>
120+ </table>
121+ <br>
122+ <div class="center">
123+ <input type="button" value="アップロード" onclick="javascript:switchsubmit('fileform', 'upload', '')">
124+ </div>
125+ <br>
126+ </div>
127+ <div class="contents">
128+ <h1><a name="file_manage">ファイル操作</a></h1>
129+ <table>
130+ <tr>
131+ <th class="normal middle">フォルダ作成</th>
132+ <td class="padding_normal normal left">
133+ <input type="text" name="dirname" class="middle_width border">&nbsp;<input type="button" value="フォルダ作成" onclick="javascript:switchsubmit('fileform', 'mkdir', '')">
134+ </td>
135+ </tr>
136+ <tr>
137+ <td class="hr"></td>
138+ <td class="hr"></td>
139+ </tr>
140+ <tr>
141+ <th class="normal middle">ファイル・フォルダリネーム</th>
142+ <td class="padding_normal normal left">
143+ <input type="text" name="destname" class="middle_width border">&nbsp;<input type="button" value="リネーム実施" onclick="javascript:switchsubmit('fileform', 'move', '')">
144+ </td>
145+ </tr>
146+ <tr>
147+ <td class="hr"></td>
148+ <td class="hr"></td>
149+ </tr>
150+ <tr>
151+ <th class="normal middle">ファイル・フォルダ削除</th>
152+ <td class="padding_normal normal left">
153+ <input type="button" value="削除実施" onclick="javascript:switchsubmit('fileform', 'delete', '')">
154+ <br>
155+ ファイル一覧から削除したいファイル・フォルダを選択した後「削除実施」ボタンを押して下さい。
156+ <br>
157+ (※ フォルダは中身が空ではない場合、削除が実施できません)
158+ </td>
159+ </tr>
160+ <tr>
161+ <td class="hr"></td>
162+ <td class="hr"></td>
163+ </tr>
164+ </table>
165+ <br>
166+ <br>
167+ <div class="filelist center">
168+ 現在の表示中のディレクトリ : <span style="font-weight: bold;">/<a href="javascript:switchsubmit('fileform', 'cd_abs', '0')">root</a>/<% session["relpath_list"].split("/").each_with_index { |rp, i| %><a href="javascript:switchsubmit('fileform', 'cd_abs', '<%= (i + 1) %>')"><%= rp %></a>/<% } %></span>&nbsp;[<a href="javascript:switchsubmit('fileform', 'refresh', '')">更新</a>]
169+ </div>
170+ <br>
171+ <table class="filelist">
172+ <tbody>
173+ <tr>
174+ <th class="filelist">
175+ 選択
176+ </th>
177+ <th class="filelist">
178+ <a href="javascript:sortchange('name')"><% if session["sort_type"] == "name" %><strong><% if session["sort_reverse"] == "true" %>▲&nbsp;<% else %>▼&nbsp;<% end %><% end %>ファイル名<% if session["sort_type"] == "name" %></strong><% end %></a>
179+ </th>
180+ <th class="filelist">
181+ <a href="javascript:sortchange('ftype')"><% if session["sort_type"] == "ftype" %><strong><% if session["sort_reverse"] == "true" %>▲&nbsp;<% else %>▼&nbsp;<% end %><% end %>ファイルタイプ<% if session["sort_type"] == "ftype" %></strong><% end %></a>
182+ </th>
183+ <th class="filelist">
184+ <a href="javascript:sortchange('size')"><% if session["sort_type"] == "size" %><strong><% if session["sort_reverse"] == "true" %>▲&nbsp;<% else %>▼&nbsp;<% end %><% end %>ファイルサイズ<% if session["sort_type"] == "size" %></strong><% end %></a>
185+ </th>
186+ <th class="filelist">
187+ <a href="javascript:sortchange('mtime')"><% if session["sort_type"] == "mtime" %><strong><% if session["sort_reverse"] == "true" %>▲&nbsp;<% else %>▼&nbsp;<% end %><% end %>最終更新時間<% if session["sort_type"] == "mtime" %></strong><% end %></a>
188+ </th>
189+ </tr>
190+ <% unless IMGPATH == session["pwd"] %>
191+ <tr>
192+ <td class="filelist">
193+ &nbsp;
194+ </td>
195+ <td class="filelist">
196+ <span style="font-weight: bold;">[ <a href="javascript:switchsubmit('fileform', 'cd', '..')">Parent Directory</a>&nbsp;]</span>
197+ </td>
198+ <td class="filelist">
199+ -
200+ </td>
201+ <td class="filelist">
202+ -
203+ </td>
204+ <td class="filelist">
205+ -
206+ </td>
207+ </tr>
208+ <% end %>
209+ <% session["filelist"].each do |fname| %>
210+ <% if session["fileinfo"][fname][:ftype] == "directory" %>
211+ <tr>
212+ <td class="filelist">
213+ <input type="checkbox" name="filename_<%= fname %>" value="true">
214+ </td>
215+ <td class="filelist">
216+ <span style="font-weight: bold;">[ <a href="javascript:switchsubmit('fileform', 'cd', '<%= fname %>')"><%= fname %></a>&nbsp;]</span>
217+ </td>
218+ <td class="filelist">
219+ <%= session["fileinfo"][fname][:ftype] %>
220+ </td>
221+ <td class="filelist">
222+ -
223+ </td>
224+ <td class="filelist">
225+ <%= session["fileinfo"][fname][:mtime].strftime("%Y年%m月%d日 %H時%M分%S秒") %>
226+ </td>
227+ </tr>
228+ <% end %>
229+ <% if session["fileinfo"][fname][:ftype] == "file" %>
230+ <tr>
231+ <td class="filelist">
232+ <input type="checkbox" name="filename_<%= fname %>" value="true">
233+ </td>
234+ <td class="filelist">
235+ <a href="<%= session["pwd"] %><%= fname %>" target="_blank"><%= fname %></a>
236+ </td>
237+ <td class="filelist">
238+ <%= session["fileinfo"][fname][:ftype] %>
239+ </td>
240+ <td class="filelist">
241+ <%= session["fileinfo"][fname][:size] %>KB
242+ </td>
243+ <td class="filelist">
244+ <%= session["fileinfo"][fname][:mtime].strftime("%Y年%m月%d日 %H時%M分%S秒") %>
245+ </td>
246+ </tr>
247+ <% end %>
248+ <% end %>
249+ </tbody>
250+ </table>
251+ <div>
252+ &nbsp; <input type="button" value="全て選択" onclick="checkall('fileform', true)">&nbsp;<input type="button" value="全て解除" onclick="checkall('fileform', false)">
253+ </div>
254+ <br>
255+ <br>
256+ </div>
257+ <div class="bottom_area">
258+ <%= APPVERSION %>
259+ </div>
260+ <input type="hidden" name="relpath_list" value="<%= session["relpath_list"] %>">
261+ <input type="hidden" name="mode" value="file">
262+ <input type="hidden" name="action" value="">
263+ <input type="hidden" name="arg" value="">
264+ <input type="hidden" id="sort_type" name="sort_type" value="<%= session["sort_type"] %>">
265+ <input type="hidden" id="sort_reverse" name="sort_reverse" value="<%= session["sort_reverse"] %>">
266+ </form>
267+ </body>
158268 </html>
--- a/erbtemp/index.html.erb
+++ b/erbtemp/index.html.erb
@@ -1,88 +1,49 @@
1+<!DOCTYPE html>
12 <html>
2- <head>
3- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
4- <title><%= APPTITLE %></title>
5- <link rel="stylesheet" href="./erbtemp/stylesheet.css" type="text/css">
6- </head>
7- <body>
8- <br>
9- <%= menu %>
10- <br>
11- <div class="divstyle" style="width: <%= TABLEWIDTH %>px;">
12- <table align="center">
13- <tbody>
14- <tr>
15- <td class="formheader" style="width: <%= (TABLEWIDTH - 20) %>px;">
16- ■ 機能一覧
17- </td>
18- </tr>
19- <tr>
20- <td style="text-align: left;" class="forminput">
21- ■ 現在編集中のファイル - 記事モードで編集可能なXMLファイル名を表示します
22- <br>
23-    + [ <a href="<%= cgi.script_name %>?mode=selectlog">他のファイルを選択</a>
24- ] - 記事モードで編集するXMLファイルを選択します
25- </td>
26- </tr>
27- <tr>
28- <td style="text-align: left;" class="forminput">
29- ■ 記事管理
30- <br>
31-    + [ <a href="<%= cgi.script_name %>?mode=newentry">作成</a>
32- ] - 新規に記事を作成します
33- <br>
34-    + [ <a href="<%= cgi.script_name %>?mode=editentry">編集</a>
35- ] - 既に存在する記事を編集します
36- <br>
37-    + [ <a href="<%= cgi.script_name %>?mode=delentry">削除</a>
38- ] - 既に存在する記事を削除します
39- <br>
40- </td>
41- </tr>
42- <tr>
43- <td style="text-align: left;" class="forminput">
44- ■ <a href="<%= cgi.script_name %>?mode=editfeed">XML情報編集</a>
45- - XML本体に付加する情報を編集します
46- </td>
47- </tr>
48- <tr>
49- <td style="text-align: left;" class="forminput">
50- ■ <a href="<%= cgi.script_name %>?mode=log">ログ管理</a>
51- <br>
52-    + [ 作成 ] - 最新のXMLファイルに付加する情報だけを残し、記事を全て過去ログとして名前をつけて保存します
53- <br>
54-    + [ 編集 ] - 既に存在するログの情報・ファイル名・順序を編集します
55- <br>
56-    + [ 削除 ] - 既に存在するログの削除を行います
57- <br>
58- </td>
59- </tr>
60- <tr>
61- <td style="text-align: left;" class="forminput">
62- ■ <a href="<%= cgi.script_name %>?mode=import">インポート</a>
63- - 既存のFeed XMLファイルを取り込みます
64- </td>
65- </tr>
66- <% if USEFILEMANAGER == true %>
67- <tr>
68- <td style="text-align: left;" class="forminput">
69- ■ <a href="<%= FILEMANAGER %>" target="_blank">ファイルマネージャ</a>
70- - 記事に使用する画像ファイル等のアップロード、削除が可能です
71- </td>
72- </tr>
73- <% end %>
74- <tr>
75- <td style="text-align: left;" class="forminput">
76- ■ <a href="<%= cgi.script_name %>?mode=reset">初期化</a>
77- - 現存する全てのログを初期化し、空のdiary.xml及びloglist.xmlのみを再配置します。
78- </td>
79- </tr>
80- </tbody>
81- </table>
82- </div>
83- <br>
84- <div class="divstyle" style="border: none;">
85- <%= APPVERSION %>
86- </div>
87- </body>
3+ <head>
4+ <%= htmlparts["headtag"] %>
5+ </head>
6+ <body>
7+ <br>
8+ <br>
9+ <div class="small_contents center">
10+ <form action="<%= cgi.script_name %>" method="POST">
11+ <br>
12+ <%= APPTITLE %>
13+ <br>
14+ <br>
15+ <table>
16+ <tr>
17+ <th class="small padding_normal"> ユーザID </th>
18+ <td class="small padding_normal">
19+ <input type="text" name="loginid" value="<%= params["loginid"] %>" class="max_width border">
20+ </td>
21+ </tr>
22+ <tr>
23+ <td class="hr"></td>
24+ <td class="hr"></td>
25+ </tr>
26+ <tr>
27+ <th class="small padding_normal"> パスワード </th>
28+ <td class="small padding_normal">
29+ <input type="password" name="password" value="<%= params["password"] %>" class="max_width border">
30+ </td>
31+ </tr>
32+ </table>
33+ <br>
34+ <input type="submit" value="ログインを実行する">
35+ <br>
36+ <% unless session["error"] == "" %>
37+ <br>
38+ <div class="error">
39+ <%= session["error"] %>
40+ </div>
41+ <% end %>
42+ <br>
43+ </form>
44+ </div>
45+ <div class="bottom_area">
46+ <%= APPVERSION %>
47+ </div>
48+ </body>
8849 </html>
--- a/erbtemp/indeximport.html.erb
+++ b/erbtemp/indeximport.html.erb
@@ -1,53 +1,36 @@
1+<!DOCTYPE html>
12 <html>
2- <head>
3- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
4- <title><%= APPTITLE %></title>
5- <link rel="stylesheet" href="./erbtemp/stylesheet.css" type="text/css">
6- <script type="text/javascript">
7- function switchsubmit(form, action){
8- document.getElementsByName("action").item(0).value = action;
9- form.submit();
10- }
11- </script>
12- </head>
13- <body>
14- <% db.transaction do %>
15- <br>
16- <%= menu %>
17- <br>
18- <div class="divstyle" style="width: <%= TABLEWIDTH %>px;">
19- <table align="center" style="width: <%= TABLEWIDTH - 20 %>px">
20- <tbody>
21- <tr>
22- <td class="formheader">
23- ■ インポート機能
24- </td>
25- </tr>
26- <tr>
27- <td class="forminput">
28- <span style="font-weight: bold;">[ 注意! ]</span>
29- <br>
30-  インポート処理を行った後は、必ずFeedGeneratorのトップページに戻るか、一度ログアウトの後ログインしてから作業を再開してください。インポートデータが破壊される可能性があります。
31- </td>
32- </tr>
33- <tr>
34- <td class="forminput">
35- ■ 既存のFeed XMLファイルを読み込む
36- <br>
37-    + [ <a href="<%= cgi.script_name %>?mode=insert">挿入モード</a>
38- ] - インポートデータをログファイルとして追加します。
39- <br>
40-    + [ <a href="<%= cgi.script_name %>?mode=replace">置換モード</a>
41- ] - インポートデータをdiary.xmlとして置き換えます。既存のdiary.xmlはログファイルとして保存します。
42- </td>
43- </tr>
44- </tbody>
45- </table>
46- </div>
47- <br>
48- <div class="divstyle" style="border: none;">
49- <%= APPVERSION %>
50- </div>
51- <% end %>
52- </body>
3+ <head>
4+ <%= htmlparts["headtag"] %>
5+ <%= htmlparts['headjs_switchpost'] %>
6+ </head>
7+ <body>
8+ <form action="<%= cgi.script_name %>" method="POST">
9+ <div class="menu_wrapper">
10+ <%= htmlparts["menu"] %>
11+ </div>
12+ <%= htmlparts["selectfile"] %>
13+ <%= htmlparts["infoarea"] %>
14+ <div class="contents">
15+ <h1>ファイルインポート</h1>
16+  <span style="font-weight: bold;">[ 注意! ]</span>
17+ <br>
18+  インポート処理を行った後は、必ずトップページに戻るか、一度ログアウト→ログインしてから作業を再開してください。
19+ <br>
20+  インポートデータが破壊される可能性があります。
21+ <br>
22+ <br>
23+  ■ 既存のFeed XMLファイルを読み込む
24+ <br>
25+   + [ <a href="<%= cgi.script_name %>?mode=insert">挿入モード</a>] - インポートデータをログファイルとして追加します。
26+ <br>
27+   + [ <a href="<%= cgi.script_name %>?mode=replace">置換モード</a>] - インポートデータをdiary.xmlとして置き換えます。既存のdiary.xmlはログファイルとして保存します。
28+ <br>
29+ <br>
30+ </div>
31+ <div class="bottom_area">
32+ <%= APPVERSION %>
33+ </div>
34+ </form>
35+ </body>
5336 </html>
--- a/erbtemp/insertfeed.html.erb
+++ b/erbtemp/insertfeed.html.erb
@@ -1,165 +1,189 @@
1+<!DOCTYPE html>
12 <html>
2- <head>
3- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
4- <title><%= APPTITLE %></title>
5- <link rel="stylesheet" href="./erbtemp/stylesheet.css" type="text/css">
6- <script type="text/javascript">
7- function switchsubmit(form, action){
8- document.getElementsByName("action").item(0).value = action;
9- form.submit();
10- }
11- </script>
12- </head>
13- <body>
14- <% db.transaction do %>
15- <br>
16- <%= menu %>
17- <br>
18- <div class="divstyle" style="width: <%= TABLEWIDTH %>px;">
19- <form action="<%= cgi.script_name %>" method="POST" enctype="multipart/form-data">
20- <% case params["action"]
3+ <head>
4+ <%= htmlparts["headtag"] %>
5+ <%= htmlparts['headjs_switchpost'] %>
6+ </head>
7+ <body>
8+ <form action="<%= cgi.script_name %>" method="POST" enctype="multipart/form-data">
9+ <div class="menu_wrapper">
10+ <%= htmlparts["menu"] %>
11+ </div>
12+ <%= htmlparts["selectfile"] %>
13+ <%= htmlparts["infoarea"] %>
14+ <% db.transaction do %>
15+ <div class="contents">
16+ <h1>ファイルインポート</h1>
17+ <% case params["action"]
2118 when "confirm" %>
22- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
19+  ■ 赤色の位置にログを挿入します
20+ <br>
21+ <br>
22+ <table>
2323 <tbody>
24- <tr>
25- <td class="formheader" colspan="3">
26- ■ 赤色の位置にログを挿入します
27- </td>
28- </tr>
29- <tr>
30- <td colspan="" style="text-align: center;" class="formnavi">
24+ <tr>
25+ <th class="large center padding_normal">
3126 ログファイルのパス
32- </td>
33- <td style="text-align: center;" class="formnavi">
27+ </th>
28+ <th class="small center padding_normal">
3429 ログの表示名
35- </td>
30+ </th>
31+ </tr>
32+ <tr>
33+ <td class="hr"></td>
34+ <td class="hr"></td>
3635 </tr>
3736 <% written = false %>
3837 <% db["loglist"].path.each_with_index do |log, i| %>
3938 <% if i == db["loginsertindex"] %>
4039 <tr>
41- <td style="text-align: center;" class="forminputhilight">
40+ <td class="center padding_normal red border_red">
4241 <%= db["logpath"] %>
4342 <input type="hidden" name="logpath" value="<%= db["logpath"] %>">
4443 </td>
45- <td style="text-align: center;" class="forminputhilight">
44+ <td class="center padding_normal red border_red">
4645 <%= db["logdisplay"] %>
4746 <input type="hidden" name="logdisplay" value="<%= db["logdisplay"] %>">
4847 </td>
49- </tr><% written = true %>
48+ </tr>
49+ <tr>
50+ <td class="hr"></td>
51+ <td class="hr"></td>
52+ </tr>
53+ <% written = true %>
5054 <% end %>
5155 <tr>
52- <td style="text-align: center;" class="forminput">
56+ <td class="center padding_normal">
5357 <%= log %>
5458 </td>
55- <td style="text-align: center;" class="forminput">
59+ <td class="center padding_normal">
5660 <%= db["loglist"].display[i] %>
5761 </td>
5862 </tr>
63+ <tr>
64+ <td class="hr"></td>
65+ <td class="hr"></td>
66+ </tr>
5967 <% end %>
6068 <% if written == false %>
6169 <tr>
62- <td style="text-align: center;" class="forminputhilight">
70+ <td class="center padding_normal red border_red">
6371 <%= db["logpath"] %>
6472 <input type="hidden" name="logpath" value="<%= db["logpath"] %>">
6573 </td>
66- <td style="text-align: center;" class="forminputhilight">
74+ <td class="center padding_normal red border_red">
6775 <%= db["logdisplay"] %>
6876 <input type="hidden" name="logdisplay" value="<%= db["logdisplay"] %>">
6977 </td>
70- </tr><% end %>
71- </tbody>
72- </table>
73- <br>
74- <input type="hidden" name="loginsertindex" value="<%= db["loginsertindex"] %>"><input type="hidden" name="mode" value="insert"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, '')"> <input type="button" value="確定" onclick="switchsubmit(this.form, 'exec')"><% when "exec" %>
75- <table align="center" style="width: <%= TABLEWIDTH %>px">
76- <tbody>
78+ </tr>
7779 <tr>
78- <td class="forminput" style="text-align: center;">
79- インポート処理が完了しました。
80- </td>
80+ <td class="hr"></td>
81+ <td class="hr"></td>
8182 </tr>
83+ <% end %>
8284 </tbody>
8385 </table>
8486 <br>
85- <a href="<%= cgi.script_name %>">トップページに戻る</a>
87+ <div class="center">
88+ <input type="hidden" name="loginsertindex" value="<%= db["loginsertindex"] %>"><input type="hidden" name="mode" value="insert"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, '')"> <input type="button" value="確定" onclick="switchsubmit(this.form, 'exec')">
89+ </div>
90+ <br>
91+ <br>
8692 <% else %>
87- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
93+  ■ 指定されたログの後にインポートされたファイルを挿入します
94+ <br>
95+ <br>
96+ <table>
8897 <tbody>
8998 <tr>
90- <td class="formheader" colspan="3">
91- ■ 指定されたログの後にインポートされたファイルを挿入します
92- </td>
93- </tr>
94- <tr>
95- <td class="formnavi" style="width: 30px;">
99+ <td class="center" style="width: 50px;">
96100  
97101 </td>
98- <td colspan="" style="text-align: center;" class="formnavi">
102+ <th class="normal center padding_normal">
99103 ログファイルのパス
100- </td>
101- <td style="text-align: center;" class="formnavi">
104+ </th>
105+ <th class="normal center padding_normal">
102106 ログの表示名
103- </td>
107+ </th>
108+ </tr>
109+ <tr>
110+ <td class="hr"></td>
111+ <td class="hr"></td>
112+ <td class="hr"></td>
104113 </tr>
105114 <% index = 1 %>
106115 <% db["loglist"].path.each_with_index do |log, i| %>
107116 <tr>
108- <td style="text-align: center; width: 30px;" class="forminput">
117+ <td class="center padding_normal">
109118 <% if index == 1 %>
110119 <input type="radio" name="loginsertindex" value="<%= index %>" checked="checked"><% else %>
111120 <input type="radio" name="loginsertindex" value="<%= index %>"><% end %>
112121 </td>
113- <td style="text-align: center;" class="forminput">
122+ <td class="center padding_normal">
114123 <%= log %>
115124 </td>
116- <td style="text-align: center;" class="forminput">
125+ <td class="center padding_normal">
117126 <%= db["loglist"].display[i] %>
118127 </td>
119128 </tr>
129+ <tr>
130+ <td class="hr"></td>
131+ <td class="hr"></td>
132+ <td class="hr"></td>
133+ </tr>
120134 <% index = index + 1 %>
121135 <% end %>
122136 </tbody>
123137 </table>
124138 <br>
125- <table align="center" style="width: 600px;">
139+ <table>
126140 <tbody>
127141 <tr>
128- <td class="formnavi" style="width: 200px;">
142+ <th class="small middle padding_normal">
129143 インポートファイル
130- </td>
131- <td class="forminput">
132- <input type="file" name="updata" style="width: 100%;">
144+ </th>
145+ <td class="large middle padding_normal center">
146+ <input type="file" name="updata" class="max_width">
133147 </td>
134148 </tr>
135149 <tr>
136- <td class="formnavi" style="width: 200px;">
150+ <td class="hr"></td>
151+ <td class="hr"></td>
152+ </tr>
153+ <tr>
154+ <th class="small middle padding_normal">
137155 インポート後のファイルパス
138- </td>
139- <td class="forminput">
140- <input type="text" name="logpath" style="width: 100%;">
156+ </th>
157+ <td class="large middle padding_normal center">
158+ <input type="text" name="logpath" class="max_width">
141159 </td>
142160 </tr>
143161 <tr>
144- <td class="formnavi">
162+ <td class="hr"></td>
163+ <td class="hr"></td>
164+ </tr>
165+ <tr>
166+ <th class="small middle padding_normal">
145167 ファイルのインポート表示名
146- </td>
147- <td class="forminput">
148- <input type="text" name="logdisplay" style="width: 100%;">
168+ </th>
169+ <td class="large middle padding_normal center">
170+ <input type="text" name="logdisplay" class="max_width">
149171 </td>
150172 </tr>
151173 </tbody>
152- </table><%= db["error"] %>
174+ </table>
175+ <br>
176+ <div class="center">
177+ <input type="hidden" name="mode" value="insert"><input type="hidden" name="action" value=""><input type="button" value="確認" onclick="switchsubmit(this.form, 'confirm')">
178+ </div>
153179 <br>
154- <input type="hidden" name="mode" value="insert"><input type="hidden" name="action" value=""><input type="button" value="確認" onclick="switchsubmit(this.form, 'confirm')">
155180 <br>
156181 <% end %>
157- </form>
158- </div>
159- <br>
160- <div class="divstyle" style="border: none;">
161- <%= APPVERSION %>
162- </div>
163- <% end %>
164- </body>
182+ </div>
183+ <% end %>
184+ <div class="bottom_area">
185+ <%= APPVERSION %>
186+ </div>
187+ </form>
188+ </body>
165189 </html>
--- a/erbtemp/log.html.erb
+++ b/erbtemp/log.html.erb
@@ -1,351 +1,394 @@
1+<!DOCTYPE html>
12 <html>
2- <head>
3- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
4- <title><%= APPTITLE %></title>
5- <link rel="stylesheet" href="./erbtemp/stylesheet.css" type="text/css">
6- <script type="text/javascript">
7- function switchsubmit(form, action){
8- document.getElementsByName("action").item(0).value = action;
9- form.submit();
10- }
11- </script>
12- </head>
13- <body>
14- <br>
15- <%= menu %>
16- <br>
17- <div class="divstyle" style="width: <%= TABLEWIDTH %>px;">
18- <form action="<%= cgi.script_name %>" method="POST">
19- <% case params["action"] when "addconfirm" %>
3+ <head>
4+ <%= htmlparts["headtag"] %>
5+ <%= htmlparts['headjs_switchpost'] %>
6+ </head>
7+ <body>
8+ <form action="<%= cgi.script_name %>" method="POST">
9+ <div class="menu_wrapper">
10+ <%= htmlparts["menu"] %>
11+ </div>
12+ <%= htmlparts["selectfile"] %>
13+ <%= htmlparts["infoarea"] %>
14+ <div class="contents">
15+ <h1>ログ管理</h1>
16+ <% case params["action"] when "addconfirm" %>
2017 <% db.transaction do %>
21- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
18+  ■ 赤枠の位置に現在の記事をログとして保存します
19+ <br>
20+ <br>
21+ <table>
2222 <tbody>
2323 <tr>
24- <td colspan="2" class="formheader">
25- ■ 赤枠の位置に現在の記事をログとして保存します
24+ <th class="normal center padding_normal">
25+ ログファイルのパス
26+ </th>
27+ <th class="normal center padding_normal">
28+ ログの表示名
29+ </th>
30+ </tr>
31+ <tr>
32+ <td class="hr"></td>
33+ <td class="hr"></td>
34+ </tr>
35+ <% db["loglist"].path.each_with_index do |log, i| %>
36+ <tr>
37+ <td class="center padding_normal">
38+ <%= log %>
39+ </td>
40+ <td class="center padding_normal">
41+ <%= db["loglist"].display[i] %>
42+ </td>
43+ </tr>
44+ <tr>
45+ <td class="hr"></td>
46+ <td class="hr"></td>
47+ </tr>
48+ <% if i == 0 %>
49+ <tr>
50+ <td class="center padding_normal red border_red">
51+ <%= db["logpath"] %>
52+ <input type="hidden" name="logpath" value="<%= db["logpath"] %>">
53+ </td>
54+ <td class="center padding_normal red border_red">
55+ <%= db["logdisplay"] %>
56+ <input type="hidden" name="logdisplay" value="<%= db["logdisplay"] %>">
2657 </td>
2758 </tr>
2859 <tr>
29- <td style="width: 306px; text-align: center;" class="formnavi">
60+ <td class="hr"></td>
61+ <td class="hr"></td>
62+ </tr>
63+ <% end %>
64+ <% end %>
65+ <% end %>
66+ </tbody>
67+ </table>
68+ <br>
69+ <div class="center">
70+ <input type="hidden" name="mode" value="log"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, 'back')"> <input type="button" value="確定" onclick="switchsubmit(this.form, 'addexec')">
71+ </div>
72+ <br>
73+ <br>
74+ <% when "delconfirm" %>
75+ <% db.transaction do %>
76+ <input type="hidden" name="logdelindex" value="<%= db["logdelindex"] %>">
77+  ■ 赤枠の位置のログを削除します。よろしいですか?
78+ <br>
79+ <br>
80+ <table>
81+ <tbody>
82+ <tr>
83+ <th class="normal center padding_normal">
3084 ログファイルのパス
85+ </th>
86+ <th class="normal center padding_normal">
87+ ログの表示名
88+ </th>
89+ </tr>
90+ <tr>
91+ <td class="hr"></td>
92+ <td class="hr"></td>
93+ </tr>
94+ <% db["loglist"].path.each_with_index do |log, i| %>
95+ <% if db["logdelindex"] != i %>
96+ <tr>
97+ <td class="center padding_normal">
98+ <%= log %>
99+ </td>
100+ <td class="center padding_normal">
101+ <%= db["loglist"].display[i] %>
102+ </td>
103+ </tr>
104+ <tr>
105+ <td class="hr"></td>
106+ <td class="hr"></td>
107+ </tr>
108+ <% else %>
109+ <tr>
110+ <td class="center padding_normal red border_red">
111+ <%= log %>
112+ </td>
113+ <td class="center padding_normal red border_red">
114+ <%= db["loglist"].display[i] %>
115+ </td>
116+ </tr>
117+ <tr>
118+ <td class="hr"></td>
119+ <td class="hr"></td>
120+ </tr>
121+ <% end %>
122+ <% end %>
123+ <% end %>
124+  </tbody>
125+ </table>
126+ <br>
127+ <div class="center">
128+ <input type="hidden" name="mode" value="log"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, 'back')"> <input type="button" value="確定" onclick="switchsubmit(this.form, 'delexec')">
129+ </div>
130+ <br>
131+ <br>
132+ <% when "edit" %>
133+ <% db.transaction do %>
134+  ■ ログファイル管理
135+ <br>
136+  赤枠のログを入力された名前で、チェックされたログの後に挿入します。
137+ <br>
138+ <br>
139+ <table>
140+ <tbody>
141+ <tr>
142+ <td class="center" style="width: 50px;">
143+  
144+ </td>
145+ <th class="normal center padding_normal">
146+ ログファイルのパス
147+ </th>
148+ <th class="normal center padding_normal">
149+ ログの表示名
150+ </th>
151+ </tr>
152+ <tr>
153+ <td class="hr"></td>
154+ <td class="hr"></td>
155+ <td class="hr"></td>
156+ </tr>
157+ <% editcounter = 0 %>
158+ <% db["loglist"].path.each_with_index do |log, i| %>
159+ <% if db["logeditindex"] != i %>
160+ <tr>
161+ <td class="center padding_normal">
162+ <% if db["logeditindex"] == (i + 1) %>
163+ <input type="radio" name="loginsertindex" value="<%= editcounter %>" checked="checked"><% else %>
164+ <input type="radio" name="loginsertindex" value="<%= editcounter %>"><% end %>
165+ </td>
166+ <td class="center padding_normal">
167+ <%= log %>
168+ </td>
169+ <td class="center padding_normal">
170+ <%= db["loglist"].display[i] %>
171+ </td>
172+ </tr>
173+ <tr>
174+ <td class="hr"></td>
175+ <td class="hr"></td>
176+ <td class="hr"></td>
177+ </tr>
178+ <% editcounter = editcounter + 1 %>
179+ <% else %>
180+ <tr>
181+ <td class="center padding_normal red border_red">
182+  
183+ </td>
184+ <td class="center padding_normal red border_red">
185+ <%= log %>
186+ </td>
187+ <td class="center padding_normal red border_red">
188+ <%= db["loglist"].display[i] %>
189+ </td>
190+ </tr>
191+ <tr>
192+ <td class="hr"></td>
193+ <td class="hr"></td>
194+ <td class="hr"></td>
195+ </tr>
196+ <% end %>
197+ <% end %>
198+ </tbody>
199+ </table>
200+ <br>
201+ <br>
202+  ■ <%= db["logpath"] %>の新しい情報を入力してください
203+ <br>
204+ <br>
205+ <table>
206+ <tbody>
207+ <tr>
208+ <th class="small middle padding_normal">
209+ ログのパス
210+ </th>
211+ <td class="large middle padding_normal center">
212+ <input type="text" name="logpath" class="max_width" value="<%= db["logpath"] %>">
31213 </td>
32- <td style="text-align: center;" class="formnavi">
214+ </tr>
215+ <tr>
216+ <td class="hr"></td>
217+ <td class="hr"></td>
218+ </tr>
219+ <tr>
220+ <th class="small middle padding_normal">
33221 ログの表示名
222+ </th>
223+ <td class="large middle padding_normal center">
224+ <input type="text" name="logdisplay" class="max_width" value="<%= db["logdisplay"] %>">
34225 </td>
35226 </tr>
227+ </tbody>
228+ </table>
229+ <br>
230+ <div class="center">
231+ <input type="hidden" name="logeditindex" value="<%= db["logeditindex"] %>"><input type="hidden" name="logdelindex" value="<%= db["logeditindex"] %>"><input type="hidden" name="mode" value="log"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, 'back')"> <input type="button" value="確認" onclick="switchsubmit(this.form, 'editconfirm')">
232+ </div>
233+ <br>
234+ <br>
235+ <% end %>
236+ <% when "editconfirm" %>
237+ <% db.transaction do %>
238+  ■ 確認
239+ <br>
240+  以下のように変更を適用します。よろしいですか?
241+ <br>
242+ <br>
243+ <table>
244+ <tbody>
245+ <tr>
246+ <th class="normal center padding_normal">
247+ ログファイルのパス
248+ </th>
249+ <th class="normal center padding_normal">
250+ ログの表示名
251+ </th>
252+ </tr>
253+ <tr>
254+ <td class="hr"></td>
255+ <td class="hr"></td>
256+ </tr>
257+ <% editcounter = 0 %>
36258 <% db["loglist"].path.each_with_index do |log, i| %>
259+ <% if db["logeditindex"] != i %>
37260 <tr>
38- <td style="text-align: center;" class="forminput">
261+ <td class="center padding_normal">
39262 <%= log %>
40263 </td>
41- <td style="text-align: center;" class="forminput">
264+ <td class="center padding_normal">
42265 <%= db["loglist"].display[i] %>
43266 </td>
44267 </tr>
45- <% if i == 0 %>
46268 <tr>
47- <td style="text-align: center;" class="forminputhilight">
269+ <td class="hr"></td>
270+ <td class="hr"></td>
271+ </tr>
272+ <% if editcounter == db["loginsertindex"] %>
273+ <tr>
274+ <td class="center padding_normal red border_red">
48275 <%= db["logpath"] %>
49276 <input type="hidden" name="logpath" value="<%= db["logpath"] %>">
50277 </td>
51- <td style="text-align: center;" class="forminputhilight">
278+ <td class="center padding_normal red border_red">
52279 <%= db["logdisplay"] %>
53280 <input type="hidden" name="logdisplay" value="<%= db["logdisplay"] %>">
54281 </td>
55- </tr><% end %>
282+ </tr>
283+ <tr>
284+ <td class="hr"></td>
285+ <td class="hr"></td>
286+ </tr>
287+ <% end %>
288+ <% editcounter = editcounter + 1 %>
56289 <% end %>
57290 <% end %>
58291 </tbody>
59292 </table>
60293 <br>
61- <input type="hidden" name="mode" value="log"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, 'back')"> <input type="button" value="確定" onclick="switchsubmit(this.form, 'addexec')"><% when "addexec" %>
62- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
294+ <br>
295+ <div class="center">
296+ <input type="hidden" name="logdelindex" value="<%= db["logeditindex"] %>"><input type="hidden" name="mode" value="log"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, 'edit')"> <input type="button" value="確定" onclick="switchsubmit(this.form, 'editexec')">
297+ </div>
298+ <br>
299+ <br>
300+ <% end %>
301+ <% else %>
302+ <% db.transaction do %>
303+  ■ ログファイル管理
304+ <br>
305+  現在の<%= db["loglist"].path[0] %>をログとして保存します。その後loglist.xmlを変更します。
306+ <br>
307+ <br>
308+ <table>
63309 <tbody>
64310 <tr>
65- <td class="forminput" style="text-align: center;">
66- ログファイルの作成が完了しました。
311+ <td class="center" style="width: 50px;">
312+  
313+ </td>
314+ <th class="large center padding_normal">
315+ ログファイルのパス
316+ </th>
317+ <th class="small center padding_normal">
318+ ログの表示名
319+ </th>
320+ </tr>
321+ <tr>
322+ <td class="hr"></td>
323+ <td class="hr"></td>
324+ <td class="hr"></td>
325+ </tr>
326+ <% db["loglist"].path.each_with_index do |log, i| %>
327+ <tr>
328+ <td class="center padding_normal">
329+ <% if i != 0 %>
330+ <input type="radio" name="logdelindex" value="<%= i %>"><% else %> <% end %>
331+ </td>
332+ <td class="left padding_normal">
333+ <%= log %>
334+ </td>
335+ <td class="center padding_normal">
336+ <%= db["loglist"].display[i] %>
67337 </td>
68338 </tr>
339+ <tr>
340+ <td class="hr"></td>
341+ <td class="hr"></td>
342+ <td class="hr"></td>
343+ </tr>
344+ <% end %>
69345 </tbody>
70346 </table>
71347 <br>
72- <a href="<%= cgi.script_name %>">メニューに戻る</a>
73- <% when "delconfirm" %>
74- <div class="divstyle" align="center">
75- <% db.transaction do %>
76- <input type="hidden" name="logdelindex" value="<%= db["logdelindex"] %>">
77- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
78- <tbody>
79- <tr>
80- <td colspan="2" class="formheader">
81- ■ 赤枠の位置のログを削除します。よろしいですか?
82- </td>
83- </tr>
84- <tr>
85- <td style="width: 306px; text-align: center;" class="formnavi">
86- ログファイルのパス
87- </td>
88- <td style="text-align: center;" class="formnavi">
89- ログの表示名
90- </td>
91- </tr>
92- <% db["loglist"].path.each_with_index do |log, i| %>
93- <% if db["logdelindex"] != i %>
94- <tr>
95- <td style="text-align: center;" class="forminput">
96- <%= log %>
97- </td>
98- <td style="text-align: center;" class="forminput">
99- <%= db["loglist"].display[i] %>
100- </td>
101- </tr>
102- <% else %>
103- <tr>
104- <td style="text-align: center;" class="forminputhilight">
105- <%= log %>
106- </td>
107- <td style="text-align: center;" class="forminputhilight">
108- <%= db["loglist"].display[i] %>
109- </td>
110- </tr>
111- <% end %>
112- <% end %>
113- <% end %>
114- </tbody>
115- </table>
116- <br>
117- <input type="hidden" name="mode" value="log"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, 'back')"> <input type="button" value="確定" onclick="switchsubmit(this.form, 'delexec')"><% when "delexec" %>
118- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
119- <tbody>
120- <tr>
121- <td class="forminput" style="text-align: center;">
122- ログファイルの削除が完了しました。
123- </td>
124- </tr>
125- </tbody>
126- </table>
127- <br>
128- <a href="<%= cgi.script_name %>">メニューに戻る</a>
129- <% when "edit" %>
130- <% db.transaction do %>
131- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
132- <tbody>
133- <tr>
134- <td colspan="3" class="formheader">
135- ■ ログファイル管理
136- <br>
137- 赤枠のログを入力された名前で、チェックされたログの後に挿入します。
138- <br>
139- </td>
140- </tr>
141- <tr>
142- <td class="formnavi">
143-  
144- </td>
145- <td style="text-align: center;" class="formnavi">
146- ログファイルのパス
147- </td>
148- <td style="text-align: center;" class="formnavi">
149- ログの表示名
150- </td>
151- </tr>
152- <% editcounter = 0 %>
153- <% db["loglist"].path.each_with_index do |log, i| %>
154- <% if db["logeditindex"] != i %>
155- <tr>
156- <td style="text-align: center; width: 30px;" class="forminput">
157- <% if db["logeditindex"] == (i + 1) %>
158- <input type="radio" name="loginsertindex" value="<%= editcounter %>" checked="checked"><% else %>
159- <input type="radio" name="loginsertindex" value="<%= editcounter %>"><% end %>
160- </td>
161- <td style="text-align: center;" class="forminput">
162- <%= log %>
163- </td>
164- <td style="text-align: center;" class="forminput">
165- <%= db["loglist"].display[i] %>
166- </td>
167- </tr>
168- <% editcounter = editcounter + 1 %>
169- <% else %>
170- <tr>
171- <td style="text-align: center; width: 30px;" class="forminputhilight">
172-  
173- </td>
174- <td style="text-align: center;" class="forminputhilight">
175- <%= log %>
176- </td>
177- <td style="text-align: center;" class="forminputhilight">
178- <%= db["loglist"].display[i] %>
179- </td>
180- </tr>
181- <% end %>
182- <% end %>
183- </tbody>
184- </table>
185- <br>
186- <table align="center">
187- <tbody>
188- <tr>
189- <td colspan="2" class="forminput">
190- ■ <%= db["logpath"] %>の新しい情報を入力してください
191- </td>
192- <tr>
193- <td style="text-align: right;">
194- ログのパス
195- </td>
196- <td>
197- <input type="text" name="logpath" style="width: 100%" value="<%= db["logpath"] %>">
198- </td>
199- </tr>
200- <tr>
201- <td style="text-align: right;">
202- ログの表示名
203- </td>
204- <td>
205- <input type="text" name="logdisplay" style="width: 100%" value="<%= db["logdisplay"] %>">
206- </td>
207- </tr>
208- </tbody>
209- </table><%= db["error"] %>
210- <br>
211- <input type="hidden" name="logeditindex" value="<%= db["logeditindex"] %>"><input type="hidden" name="logdelindex" value="<%= db["logeditindex"] %>"><input type="hidden" name="mode" value="log"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, 'back')"> <input type="button" value="確認" onclick="switchsubmit(this.form, 'editconfirm')"><% end %>
212- <% when "editconfirm" %>
213- <% db.transaction do %>
214- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
215- <tbody>
216- <tr>
217- <td colspan="3" class="formheader">
218- ■ 確認
219- <br>
220- 以下のように変更を適用します。よろしいですか?
221- <br>
222- </td>
223- </tr>
224- <tr>
225- <td style="text-align: center;" class="formnavi">
226- ログファイルのパス
227- </td>
228- <td style="text-align: center;" class="formnavi">
229- ログの表示名
230- </td>
231- </tr>
232- <% editcounter = 0 %>
233- <% db["loglist"].path.each_with_index do |log, i| %>
234- <% if db["logeditindex"] != i %>
235- <tr>
236- <td style="text-align: center;" class="forminput">
237- <%= log %>
238- </td>
239- <td style="text-align: center;" class="forminput">
240- <%= db["loglist"].display[i] %>
241- </td>
242- </tr>
243- <% if editcounter == db["loginsertindex"] %>
244- <tr>
245- <td style="text-align: center;" class="forminputhilight">
246- <%= db["logpath"] %>
247- <input type="hidden" name="logpath" value="<%= db["logpath"] %>">
248- </td>
249- <td style="text-align: center;" class="forminputhilight">
250- <%= db["logdisplay"] %>
251- <input type="hidden" name="logdisplay" value="<%= db["logdisplay"] %>">
252- </td>
253- </tr><% end %>
254- <% editcounter = editcounter + 1 %>
255- <% end %>
256- <% end %>
257- </tbody>
258- </table>
259- <br>
260- <br>
261- <input type="hidden" name="logdelindex" value="<%= db["logeditindex"] %>"><input type="hidden" name="mode" value="log"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, 'edit')"> <input type="button" value="確定" onclick="switchsubmit(this.form, 'editexec')"><% end %>
262- <% when "editexec" %>
263- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
264- <tbody>
265- <tr>
266- <td class="forminput" style="text-align: center;">
267- ログファイルの編集が完了しました。
268- </td>
269- </tr>
270- </tbody>
271- </table>
272- <br>
273- <a href="<%= cgi.script_name %>">メニューに戻る</a>
274- <% else %>
275- <% db.transaction do %>
276- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
277- <tbody>
278- <tr>
279- <td colspan="3" class="formheader">
280- ■ ログファイル管理
281- <br>
282- (現在の<%= db["loglist"].path[0] %>をログとして保存します。その後loglist.xmlを変更します。)
283- <br>
284- </td>
285- </tr>
286- <tr>
287- <td class="formnavi">
288-  
289- </td>
290- <td colspan="" style="text-align: center;" class="formnavi">
291- ログファイルのパス
292- </td>
293- <td style="text-align: center;" class="formnavi">
294- ログの表示名
295- </td>
296- </tr>
297- <% db["loglist"].path.each_with_index do |log, i| %>
298- <tr>
299- <td style="text-align: center; width: 30px;" class="forminput">
300- <% if i != 0 %>
301- <input type="radio" name="logdelindex" value="<%= i %>"><% else %> <% end %>
302- </td>
303- <td style="text-align: center;" class="forminput">
304- <%= log %>
305- </td>
306- <td style="text-align: center;" class="forminput">
307- <%= db["loglist"].display[i] %>
308- </td>
309- </tr>
310- <% end %>
311- </tbody>
312- </table>
313- <br>
314- <input type="button" value="編集" onclick="switchsubmit(this.form, 'edit')"> <input type="button" value="削除" onclick="switchsubmit(this.form, 'delconfirm')">
315- <br>
316- <br>
317- <table align="center">
318- <tbody>
319- <tr>
320- <td colspan="2" class="forminput">
321- ■ 現在のdiary.xmlを保存する情報を設定してください
322- </td>
323- <tr>
324- <td style="text-align: right;">
325- ログのパス
326- </td>
327- <td>
328- <input type="text" name="logpath" style="width: 100%" value="<%= db["logpath"] %>">
329- </td>
330- </tr>
331- <tr>
332- <td style="text-align: right;">
333- ログの表示名
334- </td>
335- <td>
336- <input type="text" name="logdisplay" style="width: 100%" value="<%= db["logdisplay"] %>">
337- </td>
338- </tr>
339- </tbody>
340- </table><%= db["error"] %>
341- <br>
342- <input type="hidden" name="mode" value="log"><input type="hidden" name="action" value=""><input type="button" value="確定" onclick="switchsubmit(this.form, 'addconfirm')"><% end %>
343- <% end %>
344- </form>
345- </div>
346- <br>
347- <div class="divstyle" style="border: none;">
348- <%= APPVERSION %>
349- </div>
350- </body>
351- </html>
348+ <div class="center">
349+ <input type="button" value="編集" onclick="switchsubmit(this.form, 'edit')"> <input type="button" value="削除" onclick="switchsubmit(this.form, 'delconfirm')">
350+ </div>
351+ <br>
352+  ■ 現在のdiary.xmlを保存する為の情報を入力してください
353+ <br>
354+ <br>
355+ <table>
356+ <tbody>
357+ <tr>
358+ <th class="small middle padding_normal">
359+ ログのパス
360+ </th>
361+ <td class="large middle padding_normal center">
362+ <input type="text" name="logpath" class="max_width" value="<%= db["logpath"] %>">
363+ </td>
364+ </tr>
365+ <tr>
366+ <td class="hr"></td>
367+ <td class="hr"></td>
368+ <td class="hr"></td>
369+ </tr>
370+ <tr>
371+ <th class="small middle padding_normal">
372+ ログの表示名
373+ </th>
374+ <td class="large middle padding_normal center">
375+ <input type="text" name="logdisplay" class="max_width" value="<%= db["logdisplay"] %>">
376+ </td>
377+ </tr>
378+ </tbody>
379+ </table>
380+ <br>
381+ <div class="center">
382+ <input type="hidden" name="mode" value="log"><input type="hidden" name="action" value=""><input type="button" value="確定" onclick="switchsubmit(this.form, 'addconfirm')">
383+ </div>
384+ <br>
385+ <br>
386+ <% end %>
387+ <% end %>
388+ </div>
389+ <div class="bottom_area">
390+ <%= APPVERSION %>
391+ </div>
392+ </form>
393+ </body>
394+</html>
--- /dev/null
+++ b/erbtemp/menu.html.erb
@@ -0,0 +1,112 @@
1+<!DOCTYPE html>
2+<html>
3+ <head>
4+ <%= htmlparts["headtag"] %>
5+ <body>
6+ <form action="<%= cgi.script_name %>" method="POST">
7+ <div class="menu_wrapper">
8+ <%= htmlparts["menu"] %>
9+ </div>
10+ <%= htmlparts["selectfile"] %>
11+ <%= htmlparts["infoarea"] %>
12+ <div class="contents">
13+ <h1>
14+ <a name="#">メニュー</a>
15+ </h1>
16+ <table>
17+ <tr>
18+ <th class="maximum left padding_normal">
19+ ■ 機能一覧
20+ </th>
21+ </tr>
22+ <tr>
23+ <td class="hr"></td>
24+ </tr>
25+ <tr>
26+ <td class="maximum padding_normal">
27+ ■ 現在編集中のファイル - 記事モードで編集可能なXMLファイル名を表示します
28+ <br>
29+    + [ <a href="<%= cgi.script_name %>?mode=selectlog">他のファイルを選択</a>
30+ ] - 記事モードで編集するXMLファイルを選択します
31+ </td>
32+ </tr>
33+ <tr>
34+ <td class="hr"></td>
35+ </tr>
36+ <tr>
37+ <td class="maximum padding_normal">
38+ ■ 記事管理
39+ <br>
40+    + [ <a href="<%= cgi.script_name %>?mode=newentry">作成</a>
41+ ] - 新規に記事を作成します
42+ <br>
43+    + [ <a href="<%= cgi.script_name %>?mode=editentry">編集</a>
44+ ] - 既に存在する記事を編集します
45+ <br>
46+    + [ <a href="<%= cgi.script_name %>?mode=delentry">削除</a>
47+ ] - 既に存在する記事を削除します
48+ <br>
49+ </td>
50+ </tr>
51+ <tr>
52+ <td class="hr"></td>
53+ </tr>
54+ <tr>
55+ <td class="maximum padding_normal">
56+ ■ <a href="<%= cgi.script_name %>?mode=editfeed">基本情報編集</a>
57+ - XML本体に付加する基本情報を編集します
58+ </td>
59+ </tr>
60+ <tr>
61+ <td class="hr"></td>
62+ </tr>
63+ <tr>
64+ <td class="maximum padding_normal">
65+ ■ <a href="<%= cgi.script_name %>?mode=log">ログ管理</a>
66+ <br>
67+    + [ 作成 ] - 最新のXMLファイルに付加する情報だけを残し、記事を全て過去ログとして名前をつけて保存します
68+ <br>
69+    + [ 編集 ] - 既に存在するログの情報・ファイル名・順序を編集します
70+ <br>
71+    + [ 削除 ] - 既に存在するログの削除を行います
72+ <br>
73+ </td>
74+ </tr>
75+ <tr>
76+ <td class="hr"></td>
77+ </tr>
78+ <tr>
79+ <td class="maximum padding_normal">
80+ ■ <a href="<%= cgi.script_name %>?mode=import">インポート</a>
81+ - 既存のFeed XMLファイルを取り込みます
82+ </td>
83+ </tr>
84+ <tr>
85+ <td class="hr"></td>
86+ </tr>
87+ <% if USEFILEMANAGER == true %>
88+ <tr>
89+ <td class="maximum padding_normal">
90+ ■ <a href="<%= FILEMANAGER %>" target="_blank">ファイルマネージャ</a>
91+ - 記事に使用する画像ファイル等のアップロード、削除が可能です
92+ </td>
93+ </tr>
94+ <tr>
95+ <td class="hr"></td>
96+ </tr>
97+ <% end %>
98+ <tr>
99+ <td class="maximum padding_normal">
100+ ■ <a href="<%= cgi.script_name %>?mode=reset">初期化</a>
101+ - 現存する全てのログを初期化し、空のdiary.xml及びloglist.xmlのみを再配置します。
102+ </td>
103+ </tr>
104+ </table>
105+ <br>
106+ </div>
107+ <div class="bottom_area">
108+ <%= APPVERSION %>
109+ </div>
110+ </form>
111+ </body>
112+</html>
--- a/erbtemp/newentry.html.erb
+++ b/erbtemp/newentry.html.erb
@@ -1,9 +1,9 @@
1+<!DOCTYPE html>
12 <html>
2- <head>
3- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
4- <title><%= APPTITLE %></title>
5- <link rel="stylesheet" href="./erbtemp/stylesheet.css" type="text/css">
6- <% unless cgi.user_agent =~ /(iPod|iPhone|iPad|Android)/ %>
3+ <head>
4+ <%= htmlparts["headtag"] %>
5+ <%= htmlparts['headjs_switchpost'] %>
6+ <% unless cgi.user_agent =~ /(iPod|iPhone|iPad|Android)/ %>
77 <link rel="stylesheet" type="text/css" href="./yui/build/menu/assets/skins/sam/menu.css" />
88 <link rel="stylesheet" type="text/css" href="./yui/build/button/assets/skins/sam/button.css" />
99 <link rel="stylesheet" type="text/css" href="./yui/build/fonts/fonts-min.css" />
@@ -136,60 +136,56 @@
136136 margin: 0;
137137 padding: 0;
138138 }
139+
140+ body {
141+ font-family: 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', 'メイリオ', Meiryo, 'MS Pゴシック', sans-serif;
142+ font-size: 12px;
143+ line-height: 18px;
144+ }
139145 </style>
140146 <% end %>
141- </head>
142- <body class="yui-skin-sam">
143- <br>
144- <%= menu %>
145- <br>
146- <div class="divstyle" style="width: <%= TABLEWIDTH %>px;">
147- <form action="<%= cgi.script_name %>" method="POST">
148- <input type="hidden" name="target_filepath" value="<%= session["target_filepath"] %>"><% case params["action"]
147+ </head>
148+ <body class="yui-skin-sam">
149+ <form action="<%= cgi.script_name %>" method="POST">
150+ <div class="menu_wrapper">
151+ <%= htmlparts["menu"] %>
152+ </div>
153+ <%= htmlparts["selectfile"] %>
154+ <%= htmlparts["infoarea"] %>
155+ <div class="contents">
156+ <h1>記事作成</h1>
157+ <input type="hidden" name="target_filepath" value="<%= session["target_filepath"] %>">
158+ <% case params["action"]
149159 when "confirm" %>
150- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
160+ <table>
151161 <tbody>
152- <tr>
153- <td colspan="2" class="formheader">
154- ■ 入力内容を確認してください
155- </td>
156- </tr>
157162 <% db.transaction do
158163 entry = db["newentry"]
159164 entry.paramlist.each do |val| %>
160165 <tr style="display: <%= entry.display[val] %>;">
161- <td class="formnavi" style="width: 140px;">
166+ <th class="small middle padding_normal">
162167 <%= entry.name[val] %>
163- </td>
164- <td class="forminput">
168+ </th>
169+ <td class="large middle padding_normal">
165170 <input type="hidden" name="<%= val %>" value="<%= entry.send(val) %>"><% if val != "content" %><%= entry.send(val) %><% else %><%= entry.content_for_view %><% end %>
166171 </td>
167- </tr><% end %>
172+ </tr>
173+ <tr style="display: <%= entry.display[val] %>;">
174+ <td class="hr"></td>
175+ <td class="hr"></td>
176+ </tr>
177+ <% end %>
168178 <% end %>
169179 </tbody>
170180 </table>
171181 <br>
172- <input type="hidden" name="mode" value="newentry"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, 'back')"> <input type="button" value="確定" onclick="switchsubmit(this.form, 'exec')"><% when "exec" %>
173- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
174- <tbody>
175- <tr>
176- <td class="forminput" style="text-align: center;">
177- 記事の書き込みが完了しました。
178- </td>
179- </tr>
180- </tbody>
181- </table>
182+ <div class="center">
183+ <input type="hidden" name="mode" value="newentry"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, 'back')"> <input type="button" value="確定" onclick="switchsubmit(this.form, 'exec')">
184+ </div>
182185 <br>
183- <a href="<%= cgi.script_name %>">メニューに戻る</a>
184186 <% when "back" %>
185- <table style="width: <%= (TABLEWIDTH - 20) %>px;">
187+ <table>
186188 <tbody>
187- <tr>
188- <td colspan="2" class="formheader">
189- ■ 新規作成
190- <br>
191- </td>
192- </tr>
193189 <% db.transaction do
194190 if cgi["action"] == "back"
195191 entry = db["newentry"]
@@ -198,30 +194,32 @@
198194 end
199195 entry.paramlist.each do |val| %>
200196 <tr style="display: <%= entry.display[val] %>;">
201- <td class="formnavi" style="width: 140px;">
197+ <th class="small middle padding_normal">
202198 <%= entry.name[val] %>
203- </td>
204- <td class="forminput">
199+ </th>
200+ <td class="large left padding_normal">
205201 <% if val != "content" %>
206- <input type="text" name="<%= val %>" value="<%= entry.send(val) %>" style="width: 100%"><% else %>
207- <textarea name="<%= val %>" rows="10" style="width: 100%" id="contenteditor"><%= entry.content_for_generator %></textarea>
202+ <input type="text" name="<%= val %>" value="<%= entry.send(val) %>" class="max_width"><% else %>
203+ <textarea name="<%= val %>" rows="10" class="max_width" id="contenteditor"><%= entry.content_for_generator %></textarea>
208204 <% end %>
209205 </td>
210206 </tr>
207+ <tr style="display: <%= entry.display[val] %>;">
208+ <td class="hr"></td>
209+ <td class="hr"></td>
210+ </tr>
211211 <% end %>
212212 <% end %>
213213 </tbody>
214214 </table>
215215 <br>
216- <input type="hidden" name="mode" value="newentry"><input type="hidden" name="action" value="confirm"><input type="submit" value="確認"><% else %>
217- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
216+ <div class="center">
217+ <input type="hidden" name="mode" value="newentry"><input type="hidden" name="action" value="confirm"><input type="submit" value="確認">
218+ </div>
219+ <br>
220+ <% else %>
221+ <table>
218222 <tbody>
219- <tr>
220- <td colspan="2" class="formheader">
221- ■ 新規作成
222- <br>
223- </td>
224- </tr>
225223 <% db.transaction do
226224 if cgi["action"] == "back"
227225 entry = db["newentry"]
@@ -230,30 +228,38 @@
230228 end
231229 entry.paramlist.each do |val| %>
232230 <tr style="display: <%= entry.display[val] %>;">
233- <td class="formnavi" style="width: 140px;">
231+ <th class="small middle padding_normal">
234232 <%= entry.name[val] %>
235- </td>
236- <td class="forminput">
233+ </th>
234+ <td class="large left padding_normal">
237235 <% date = Time.now.iso8601 %>
238236 <% if val == "content" %>
239- <textarea name="<%= val %>" rows="10" style="width: 100%" id="contenteditor"><% if entry.content.empty? %><p><br></p><% else %><%= entry.content_for_generator %><% end %></textarea>
237+ <textarea name="<%= val %>" rows="10" class="max_width" id="contenteditor"><% if entry.content.empty? %><p><br></p><% else %><%= entry.content_for_generator %><% end %></textarea>
240238 <% elsif val == "entryid" %>
241- <input type="text" name="<%= val %>" value="<%= db["feed"].feedid %>?<%= date %>" style="width: 100%"><% elsif val == "updated" || val == "published" %>
242- <input type="text" name="<%= val %>" value="<%= date %>" style="width: 100%"><% elsif val == "url" %>
243- <input type="text" name="<%= val %>" value="<%= db["feed"].url %>#<%= db["feed"].feedid %>?<%= date %>" style="width: 100%"><% else %>
244- <input type="text" name="<%= val %>" value="<%= entry.send(val) %>" style="width: 100%"><% end %>
239+ <input type="text" name="<%= val %>" value="<%= db["feed"].feedid %>?<%= date %>" class="max_width"><% elsif val == "updated" || val == "published" %>
240+ <input type="text" name="<%= val %>" value="<%= date %>" class="max_width"><% elsif val == "url" %>
241+ <input type="text" name="<%= val %>" value="<%= db["feed"].url %>#<%= db["feed"].feedid %>?<%= date %>" class="max_width"><% else %>
242+ <input type="text" name="<%= val %>" value="<%= entry.send(val) %>" class="max_width"><% end %>
245243 </td>
246- </tr><% end %>
244+ </tr>
245+ <tr style="display: <%= entry.display[val] %>;">
246+ <td class="hr"></td>
247+ <td class="hr"></td>
248+ </tr>
249+ <% end %>
247250 <% end %>
248251 </tbody>
249252 </table>
250253 <br>
251- <input type="hidden" name="mode" value="newentry"><input type="hidden" name="action" value="confirm"><input type="submit" class="wymupdate" value="確認"><% end %>
252- </form>
253- </div>
254- <br>
255- <div class="divstyle" style="border: none;">
256- <%= APPVERSION %>
257- </div>
258- </body>
254+ <div class="center">
255+ <input type="hidden" name="mode" value="newentry"><input type="hidden" name="action" value="confirm"><input type="submit" class="wymupdate" value="確認">
256+ </div>
257+ <br>
258+ <% end %>
259+ </div>
260+ <div class="bottom_area">
261+ <%= APPVERSION %>
262+ </div>
263+ </form>
264+ </body>
259265 </html>
--- /dev/null
+++ b/erbtemp/notlogined.html.erb
@@ -0,0 +1,34 @@
1+<html>
2+ <head>
3+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
4+ <title><%= APPTITLE %></title>
5+ <link rel="stylesheet" href="./erbtemp/stylesheet.css" type="text/css"/>
6+ </head>
7+ <body>
8+ <br>
9+ <br>
10+ <div class="divstyle" style="width: 400px; padding: 15px;">
11+ <form action="<%= cgi.script_name %>" method="POST">
12+ FeedGenerator for Ruby
13+ <br>
14+ <br>
15+ <table align="center">
16+ <tbody>
17+ <tr>
18+ <td>
19+ <br>
20+ ユーザが認証されていません。
21+ <br>
22+ トップページで再認証して下さい。
23+ </td>
24+ </tr>
25+ </tbody>
26+ </table>
27+ </form>
28+ </div>
29+ <br>
30+ <div class="divstyle" style="border: none;">
31+ <%= APPVERSION %>
32+ </div>
33+ </body>
34+</html>
--- /dev/null
+++ b/erbtemp/parts_headjs_switchpost.html.erb
@@ -0,0 +1,6 @@
1+<script type="text/javascript">
2+ function switchsubmit(form, action){
3+ document.getElementsByName("action").item(0).value = action;
4+ form.submit();
5+ }
6+ </script>
\ No newline at end of file
--- /dev/null
+++ b/erbtemp/parts_headtag.html.erb
@@ -0,0 +1,5 @@
1+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
2+ <title><%= APPTITLE %></title>
3+ <link rel="stylesheet" href="./css/reset.css" type="text/css"/>
4+ <link rel="stylesheet" href="./css/base.css" type="text/css"/>
5+ <script type="text/javascript" src="./js/jquery-1.6.1.min.js"></script>
\ No newline at end of file
--- /dev/null
+++ b/erbtemp/parts_infoarea.html.erb
@@ -0,0 +1,18 @@
1+<% unless session["info"] == "" %>
2+ <div class="contents info_contents">
3+ <h1 class="info">以下の操作を実施しました</h1>
4+ <div class="info_contens_inner">
5+ <%= session["info"] %>
6+ </div>
7+ <br>
8+ </div>
9+ <% end %>
10+ <% unless session["error"] == "" %>
11+ <div class="contents error_contents">
12+ <h1 class="error">エラーが発生しました</h1>
13+ <div class="error_contens_inner">
14+ <%= session["error"] %>
15+ </div>
16+ <br>
17+ </div>
18+ <% end %>
--- /dev/null
+++ b/erbtemp/parts_menu.html.erb
@@ -0,0 +1,36 @@
1+<div class="menu">
2+ <ul class="menu">
3+ <li class="menu_left">
4+ <a href="<%= cgi.script_name %>" class="menu">トップページ</a>
5+ </li>
6+ <li class="menu_left">
7+ <a href="<%= cgi.script_name %>?mode=newentry" class="menu">記事作成</a>
8+ </li>
9+ <li class="menu_left">
10+ <a href="<%= cgi.script_name %>?mode=editentry" class="menu">記事編集</a>
11+ </li>
12+ <li class="menu_left">
13+ <a href="<%= cgi.script_name %>?mode=delentry" class="menu">記事削除</a>
14+ </li>
15+ <li class="menu_left">
16+ <a href="<%= cgi.script_name %>?mode=editfeed" class="menu">基本情報編集</a>
17+ </li>
18+ <li class="menu_left">
19+ <a href="<%= cgi.script_name %>?mode=log" class="menu">ログ管理</a>
20+ </li>
21+ <li class="menu_left">
22+ <a href="<%= cgi.script_name %>?mode=import" class="menu">インポート</a>
23+ </li>
24+ <% if USEFILEMANAGER == true %>
25+ <li class="menu_left">
26+ <a href="<%= FILEMANAGER %>" class="menu" target="_blank">ファイル操作</a>
27+ </li>
28+ <% end %>
29+ <li class="menu_left">
30+ <a href="<%= cgi.script_name %>?mode=reset" class="menu">初期化</a>
31+ </li>
32+ <li class="menu_left">
33+ <a href="<%= cgi.script_name %>?mode=logout" class="menu">ログアウト</a>
34+ </li>
35+ </ul>
36+ </div>
\ No newline at end of file
--- /dev/null
+++ b/erbtemp/parts_selectfile.html.erb
@@ -0,0 +1,9 @@
1+<div class="select_file center">
2+ 現在編集中のファイル:
3+ <% if params["target_filepath"].blank? %>
4+ <%= session["filepath"] %>
5+ <% else %>
6+ <%= session["target_filepath"] %>
7+ <% end %>
8+ [ <a href="<%= cgi.script_name %>?mode=selectlog">他のファイルを選択</a> ]
9+ </div>
\ No newline at end of file
--- a/erbtemp/replacefeed.html.erb
+++ b/erbtemp/replacefeed.html.erb
@@ -1,124 +1,136 @@
1+<!DOCTYPE html>
12 <html>
2- <head>
3- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
4- <title><%= APPTITLE %></title>
5- <link rel="stylesheet" href="./erbtemp/stylesheet.css" type="text/css">
6- <script type="text/javascript">
7- function switchsubmit(form, action){
8- document.getElementsByName("action").item(0).value = action;
9- form.submit();
10- }
11- </script>
12- </head>
13- <body>
14- <% db.transaction do %>
15- <br>
16- <%= menu %>
17- <br>
18- <div class="divstyle" style="width: <%= TABLEWIDTH %>px;">
19- <form action="<%= cgi.script_name %>" method="POST" enctype="multipart/form-data">
20- <% case params["action"]
3+ <head>
4+ <%= htmlparts["headtag"] %>
5+ <%= htmlparts['headjs_switchpost'] %>
6+ </head>
7+ <body>
8+ <form action="<%= cgi.script_name %>" method="POST" enctype="multipart/form-data">
9+ <div class="menu_wrapper">
10+ <%= htmlparts["menu"] %>
11+ </div>
12+ <%= htmlparts["selectfile"] %>
13+ <%= htmlparts["infoarea"] %>
14+ <% db.transaction do %>
15+ <div class="contents">
16+ <h1>基本情報編集</h1>
17+ <% case params["action"]
2118 when "confirm" %>
22- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
19+  ■ diary.xmlが以下の赤色の位置にログとして挿入されます
20+ <br>
21+ <br>
22+ <table>
2323 <tbody>
2424 <tr>
25- <td class="formheader" colspan="3">
26- ■ diary.xmlが以下の赤色の位置にログとして挿入されます
27- </td>
28- </tr>
29- <tr>
30- <td colspan="" style="text-align: center;" class="formnavi">
25+ <th class="large center padding_normal">
3126 ログファイルのパス
32- </td>
33- <td style="text-align: center;" class="formnavi">
27+ </th>
28+ <th class="small center padding_normal">
3429 ログの表示名
35- </td>
30+ </th>
31+ </tr>
32+ <tr>
33+ <td class="hr"></td>
34+ <td class="hr"></td>
3635 </tr>
3736 <% db["loglist"].path.each_with_index do |log, i| %>
3837 <tr>
39- <td style="text-align: center;" class="forminput">
38+ <td class="center padding_normal">
4039 <%= log %>
4140 </td>
42- <td style="text-align: center;" class="forminput">
41+ <td class="center padding_normal">
4342 <%= db["loglist"].display[i] %>
4443 </td>
4544 </tr>
45+ <tr>
46+ <td class="hr"></td>
47+ <td class="hr"></td>
48+ </tr>
4649 <% if i == 0 %>
4750 <tr>
48- <td style="text-align: center;" class="forminputhilight">
51+ <td class="center padding_normal red border_red">
4952 <%= db["logpath"] %>
5053 <input type="hidden" name="logpath" value="<%= db["logpath"] %>">
5154 </td>
52- <td style="text-align: center;" class="forminputhilight">
55+ <td class="center padding_normal red border_red">
5356 <%= db["logdisplay"] %>
5457 <input type="hidden" name="logdisplay" value="<%= db["logdisplay"] %>">
5558 </td>
56- </tr><% end %>
57- <% end %>
58- </tbody>
59- </table>
60- <br>
61- <input type="hidden" name="mode" value="replace"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, '')"> <input type="button" value="確定" onclick="switchsubmit(this.form, 'exec')"><% when "exec" %>
62- <table align="center" style="width: <%= TABLEWIDTH %>px">
63- <tbody>
59+ </tr>
6460 <tr>
65- <td class="forminput" style="text-align: center;">
66- インポート処理が完了しました。
67- </td>
61+ <td class="hr"></td>
62+ <td class="hr"></td>
6863 </tr>
64+ <% end %>
65+ <% end %>
6966 </tbody>
7067 </table>
7168 <br>
72- <a href="<%= cgi.script_name %>">トップページに戻る</a>
69+ <div class="center">
70+ <input type="hidden" name="mode" value="replace"><input type="hidden" name="action" value=""><input type="button" value="戻る" onclick="switchsubmit(this.form, '')"> <input type="button" value="確定" onclick="switchsubmit(this.form, 'exec')">
71+ </div>
72+ <br>
73+ <br>
7374 <% else %>
74- <table align="center" style="width: <%= TABLEWIDTH - 20 %>px;">
75+  ■ diary.xmlとして保存するファイルを選択してください
76+ <br>
77+ <br>
78+ <table>
7579 <tbody>
7680 <tr>
77- <td colspan="2" class="formnavi">
78- ■ diary.xmlとして保存するファイルを選択してください
79- </td>
80- </tr>
81- <tr>
82- <td class="formnavi" style="width: 200px;">
81+ <th class="small middle padding_normal">
8382 インポートファイル
84- </td>
85- <td class="forminput">
86- <input type="file" name="updata" style="width: 100%;">
83+ </th>
84+ <td class="large middle padding_normal center">
85+ <input type="file" name="updata" class="max_width">
8786 </td>
8887 </tr>
8988 <tr>
90- <td colspan="2" class="formnavi">
91- ■ 現在のdiary.xmlを保存する情報を設定してください
92- </td>
89+ <td class="hr"></td>
90+ <td class="hr"></td>
9391 </tr>
92+ </tbody>
93+ </table>
94+ <br>
95+  ■ 現在のdiary.xmlを保存する情報を設定してください
96+ <br>
97+ <br>
98+ <table>
99+ <tbody>
94100 <tr>
95- <td class="formnavi" style="width: 200px;">
101+ <th class="small middle padding_normal">
96102 ログ化されたdiary.xmlのパス
97- </td>
98- <td class="forminput">
99- <input type="text" name="logpath" style="width: 100%;">
103+ </th>
104+ <td class="large middle padding_normal center">
105+ <input type="text" name="logpath" class="max_width">
100106 </td>
101107 </tr>
102108 <tr>
103- <td class="formnavi" style="width: 200px;">
109+ <td class="hr"></td>
110+ <td class="hr"></td>
111+ </tr>
112+ <tr>
113+ <th class="small middle padding_normal">
104114 ログ化されたdiary.xmlの表示名
105- </td>
106- <td class="forminput">
107- <input type="text" name="logdisplay" style="width: 100%;">
115+ </th>
116+ <td class="large middle padding_normal center">
117+ <input type="text" name="logdisplay" class="max_width">
108118 </td>
109119 </tr>
110120 </tbody>
111- </table><%= db["error"] %>
121+ </table>
122+ <br>
123+ <div class="center">
124+ <input type="hidden" name="mode" value="replace"><input type="hidden" name="action" value=""><input type="button" value="確認" onclick="switchsubmit(this.form, 'confirm')">
125+ </div>
112126 <br>
113- <input type="hidden" name="mode" value="replace"><input type="hidden" name="action" value=""><input type="button" value="確認" onclick="switchsubmit(this.form, 'confirm')">
114127 <br>
115128 <% end %>
116- </form>
117- </div>
118- <br>
119- <div class="divstyle" style="border: none;">
120- <%= APPVERSION %>
121- </div>
122- <% end %>
123- </body>
129+ </div>
130+ <% end %>
131+ <div class="bottom_area">
132+ <%= APPVERSION %>
133+ </div>
134+ </form>
135+ </body>
124136 </html>
--- a/erbtemp/reset.html.erb
+++ b/erbtemp/reset.html.erb
@@ -1,8 +1,8 @@
1+<!DOCTYPE html>
12 <html>
2- <head>
3- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
4- <title><%= APPTITLE %></title>
5- <link rel="stylesheet" href="./erbtemp/stylesheet.css" type="text/css">
3+ <head>
4+ <%= htmlparts["headtag"] %>
5+ <%= htmlparts['headjs_switchpost'] %>
66 <script type="text/javascript">
77 /**
88 * ページのロード時に呼ばれるメソッド
@@ -52,72 +52,53 @@
5252 }
5353 }
5454 </script>
55- </head>
56- <body onload="loadexec()">
57- <br>
58- <%= menu %>
59- <br>
60- <% db.transaction do %>
61- <div class="divstyle" style="width: <%= TABLEWIDTH %>px;">
62- <form action="<%= cgi.script_name %>" method="POST">
63- <table align="center" style="width: <%= (TABLEWIDTH - 20) %>px;">
64- <tbody>
65- <tr>
66- <td class="formnavi" style="text-align: left;">
67- <span style="font-weight: bold;">
68- ■ 初期化機能</a>
69- </td>
70- </tr>
71- <tr>
72- <td class="forminput" style="text-align: left;">
73- <span style="font-weight: bold;">[ 説明 ]</span>
74- <br>
75-  この機能を使用することで、日記に関するデータ全てを消去することができます。
76- <br>
77-  初期化処理を行うと、ディレクトリ [ <%= XMLPATH %>] の中のファイルを全て消去します。その後空のdiary.xmlとloglist.xmlを生成して設置します。消去前のAtom Feedの情報は一切保持されませんので気をつけてください。
78- <br>
79- <table align="center" style="width: 80%; margin-top: 8px; margin-bottom: 8px;">
80- <tbody>
81- <tr>
82- <td class="formnavi" style="text-align: center; padding: 3px;">
83- [ <%= XMLPATH %>] ディレクトリ内部のファイル一覧
84- </td>
85- </tr>
86- <% db["filelist"].each do |fname| %>
87- <tr>
88- <td class="forminput" style="text-align: center; padding: 3px;">
89- <a href="<%= XMLPATH %><%= fname %>" target="_blank"><%= fname %></a>
90- </td>
91- </tr>
92- <% end %>
93- </tbody>
94- </table>
95- </td>
96- </tr>
97- <tr>
98- <td class="forminput" style="text-align: left;">
99- <span style="font-weight: bold; color: #ff0000">[ 注意! ]</span>
100- <br>
101-  初期化後にリセットしたデータを戻すことは出来ません!初期化を行う前に、入念に検討を行ってください。
102- <br>
103- </td>
104- </tr>
105- <tr>
106- <td class="forminput" style="text-align: center;">
107- <input type="button" value="ロック解除" onclick="unlock('initButton')"> <input type="hidden" name="mode" value="reset"><input type="hidden" name="action" value=""><input type="button" value="初期化を行う" onclick="beforeexec(this.form, 'exec')" disabled="true" id="initButton">
108- </td>
109- </tr>
110- </tbody>
111- </table>
112- <br>
113- <a href="<%= cgi.script_name %>">メニューに戻る</a>
114- <br>
115- </form>
116- </div>
117- <% end %>
118- <br>
119- <div class="divstyle" style="border: none;">
120- <%= APPVERSION %>
121- </div>
122- </body>
55+ </head>
56+ <body>
57+ <form action="<%= cgi.script_name %>" method="POST">
58+ <div class="menu_wrapper">
59+ <%= htmlparts["menu"] %>
60+ </div>
61+ <%= htmlparts["selectfile"] %>
62+ <%= htmlparts["infoarea"] %>
63+ <% db.transaction do %>
64+ <div class="contents">
65+ <h1>初期化機能</h1>
66+  <span style="font-weight: bold;">[ 説明 ]</span>
67+ <br>
68+  この機能を使用することで、記事に関するデータ全てを消去することができます。
69+ <br>
70+  初期化処理を行うと、ディレクトリ [ <%= XMLPATH %>] の中のファイルを全て消去します。その後空のdiary.xmlとloglist.xmlを生成して設置します。消去前のAtom Feedの情報は一切保持されませんので気をつけてください。
71+ <br>
72+ <br>
73+ <table>
74+ <tr>
75+ <th class="maximum center padding_normal">
76+ [ <%= XMLPATH %>] ディレクトリ内部のファイル一覧
77+ </th>
78+ </tr>
79+ <% db["filelist"].each do |fname| %>
80+ <tr>
81+ <td class="maximum center padding_normal">
82+ <a href="<%= XMLPATH %><%= fname %>" target="_blank"><%= fname %></a>
83+ </td>
84+ </tr>
85+ <% end %>
86+ </table>
87+ <br>
88+  <span style="font-weight: bold; color: #ff0000">[ 注意! ]</span>
89+ <br>
90+  初期化後にリセットしたデータを戻すことは出来ません!初期化を行う前に、入念に検討を行ってください。
91+ <br>
92+ <br>
93+ <div class="center">
94+ <input type="button" value="ロック解除" onclick="unlock('initButton')"> <input type="hidden" name="mode" value="reset"><input type="hidden" name="action" value=""><input type="button" value="初期化を行う" onclick="beforeexec(this.form, 'exec')" disabled="true" id="initButton">
95+ </div>
96+ <br>
97+ </div>
98+ <% end %>
99+ <div class="bottom_area">
100+ <%= APPVERSION %>
101+ </div>
102+ </form>
103+ </body>
123104 </html>
--- a/erbtemp/select.html.erb
+++ b/erbtemp/select.html.erb
@@ -1,64 +1,77 @@
1+<!DOCTYPE html>
12 <html>
2- <head>
3- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
4- <title><%= APPTITLE %></title>
5- <link rel="stylesheet" href="./erbtemp/stylesheet.css" type="text/css">
6- </head>
7- <body>
8- <br>
9- <%= menu %>
10- <br>
11- <div class="divstyle" style="width: <%= TABLEWIDTH %>px;">
12- <form action="<%= cgi.script_name %>" method="POST">
13- <table align="center">
3+ <head>
4+ <%= htmlparts["headtag"] %>
5+ <%= htmlparts['headjs_switchpost'] %>
6+ </head>
7+ <body>
8+ <form action="<%= cgi.script_name %>" method="POST">
9+ <div class="menu_wrapper">
10+ <%= htmlparts["menu"] %>
11+ </div>
12+ <%= htmlparts["selectfile"] %>
13+ <%= htmlparts["infoarea"] %>
14+ <div class="contents">
15+ <h1>編集ファイル選択</h1>
16+ <table align="center">
1417 <tbody>
1518 <tr>
16- <td colspan="4" class="formheader" style="width: <%= (TABLEWIDTH - 20) %>px;">
17- ■ 編集するファイルを選択してください。
18- </td>
19- </tr>
20- <tr>
21- <td style="text-align: center;" class="formnavi">
19+ <th class="middle padding_normal" style="width: 50px;">
2220  
23- </td>
24- <td style="text-align: center;" class="formnavi">
21+ </th>
22+ <th class="normal middle padding_normal">
2523 ログファイルの説明
26- </td>
27- <td style="text-align: center;" class="formnavi">
24+ </th>
25+ <th class="normal middle padding_normal">
2826 ログファイルパス
29- </td>
30- <td style="text-align: center;" class="formnavi">
27+ </th>
28+ <th class="middle padding_normal" style="width: 100px;">
3129 開く
32- </td>
30+ </th>
31+ </tr>
32+ <tr>
33+ <td class="hr"></td>
34+ <td class="hr"></td>
35+ <td class="hr"></td>
36+ <td class="hr"></td>
3337 </tr>
3438 <% db.transaction do %>
3539 <% db["loglist"].display.each_with_index do |val, i| %>
3640 <tr>
37- <td style="text-align: center; width: 25px;" class="forminput">
41+ <td class="middle padding_normal center">
3842 <input type="radio" name="logpath" value="<%= db["loglist"].path[i] %>"<% if db["loglist"].path[i] == session["filepath"] %>checked="checked"<% end %>>
3943 </td>
40- <td style="text-align: center;" class="forminput">
44+ <td class="middle padding_normal center">
4145 <%= db["loglist"].display[i] %>
4246 </td>
43- <td style="text-align: center;" class="forminput">
47+ <td class="middle padding_normal center">
4448 <%= db["loglist"].path[i] %>
4549 </td>
46- <td style="text-align: center;" class="forminput">
50+ <td class="middle padding_normal center">
4751 [ <a href="<%= XMLPATH + db["loglist"].path[i].match(/[^\/]*?$/).to_a[0] %>" target="_blank">OPEN</a>
4852 ]
4953 </td>
5054 </tr>
55+ <tr>
56+ <td class="hr"></td>
57+ <td class="hr"></td>
58+ <td class="hr"></td>
59+ <td class="hr"></td>
60+ </tr>
5161 <% end %>
5262 <% end %>
5363 </tbody>
5464 </table>
5565 <br>
56- <input type="hidden" name="mode" value="logselect"><input type="submit" value="選択">
57- </form>
58- </div>
59- <br>
60- <div class="divstyle" style="border: none;">
61- <%= APPVERSION %>
62- </div>
63- </body>
66+ <div class="center">
67+ <input type="hidden" name="mode" value="logselect"><input type="submit" value="選択">
68+ </div>
69+ <br>
70+ <br>
71+ </div>
72+ <div class="bottom_area">
73+ <%= APPVERSION %>
74+ </div>
75+ </form>
76+ </body>
6477 </html>
--- a/erbtemp/stylesheet.css
+++ /dev/null
@@ -1,114 +0,0 @@
1-body {
2- font-size: 9pt;
3- line-height: 13pt;
4- font-family: 'MS Pゴシック', sans-serif;
5- color: #1E4080;
6- background-image: url('../img/background.jpg');
7- background-color: white;
8- background-repeat: no-repeat;
9- background-attachment: fixed;
10- background-position: right bottom;
11- text-align: center;
12- margin-left: auto;
13- margin-right: auto;
14- -webkit-text-size-adjust: none;
15-}
16-
17-table {
18- border-width: 0px 0px 0px 0px;
19-}
20-
21-td {
22- font-size: 9pt;
23- line-height: 13pt;
24- font-family: 'MS Pゴシック', sans-serif;
25-}
26-
27-td.formheader {
28- font-size: 9pt;
29- line-height: 13pt;
30- font-family: 'MS Pゴシック', sans-serif;
31- font-weight: bold;
32- padding: 3px;
33- border: 1px solid #C5C5DE;
34- background-color: #FAFAFF;
35-}
36-
37-td.forminput {
38- font-size: 9pt;
39- line-height: 13pt;
40- font-family: 'MS Pゴシック', sans-serif;
41- padding: 5px;
42- border: 1px dotted #C5C5DE;
43-}
44-
45-td.forminputhilight {
46- font-size: 9pt;
47- line-height: 13pt;
48- font-family: 'MS Pゴシック', sans-serif;
49- padding: 5px;
50- border: 1px dotted #BEA5A5;
51- background-color: #FFFAFA;
52-}
53-
54-td.formnavi {
55- font-size: 9pt;
56- line-height: 13pt;
57- font-family: 'MS Pゴシック', sans-serif;
58- padding: 5px;
59- border: 1px solid #C5C5DE;
60- background-color: #FAFAFF;
61-}
62-
63-a:link {
64- text-decoration: none;
65- color: #A5A5BE;
66-}
67-
68-a:visited {
69- text-decoration: none;
70- color: #A5A5BE;
71-}
72-
73-a:active {
74- text-decoration: none;
75- color: #A5A5BE;
76-}
77-
78-a:hover {
79- text-decoration: underline;
80- color: #A5A5BE;
81-}
82-
83-div.divstyle {
84- font-size: 9pt;
85- line-height: 13pt;
86- text-align: center;
87- margin-left: auto;
88- margin-right: auto;
89- padding: 5px;
90- border: 1px solid #A5A5BE;
91-}
92-
93-input {
94- font-size: 9pt;
95- line-height: 13pt;
96- font-family: 'MS Pゴシック', sans-serif;
97- color: #1E4080;
98- border: 1px dotted #BABAFE;
99- background-color: #F5F5FF;
100-}
101-
102-textarea {
103- font-size: 9pt;
104- line-height: 13pt;
105- font-family: 'MS Pゴシック', sans-serif;
106- color: #1E4080;
107- border: 1px dotted #BABAFE;
108- background-color: #F5F5FF;
109-}
110-
111-.menu_link {
112- text-decoration: none;
113- color: #A5A5BE;
114-}
--- a/feedgenerator.rb
+++ b/feedgenerator.rb
@@ -1,1425 +1,1412 @@
1-#!/usr/local/bin/ruby
2-# -*- coding: utf-8 -*-
3-#
4-#= Atom Feed 1.0を管理するWEBアプリケーション
5-#
6-#Autohr:: Kureha Hisame (http://lunardial.sakura.ne.jp/) & Yui Naruse (http://airemix.com/)
7-#Version:: 2.0.0.0
8-#Copyright:: Copyright 2009 FeedBlog Project (http://sourceforge.jp/projects/feedblog/)
9-#License:: GPLv3
10-
11-require "cgi"
12-require "cgi/session"
13-require "erb"
14-require "rexml/document"
15-require "pstore"
16-require 'time'
17-require "date"
18-require "fileutils"
19-
20-# ログイン情報配列
21-LOGININFO = [
22-{:id => "login", :password => "password", :name => "テストユーザ"}
23-]
24-# インターフェースのテーブルの幅
25-TABLEWIDTH = 1000
26-# XMLファイル格納先までの相対パス
27-XMLPATH = "./../lunardial/xml/"
28-# FeedBlogを設置したディレクトリのURL
29-HOMEBASE = "https://lunardial.sakura.ne.jp/"
30-# 入力されたフルパスURL(HOMEBASE)を置換する文字列
31-RELAYPATH = "./"
32-# loglist.xmlファイルの定義
33-LISTXMLPATH = "#{XMLPATH}loglist.xml"
34-# FeedBlog上の表示ページからログ格納ディレクトリまでのパス
35-FEEDXMLDIR = "./xml/"
36-# デバッガモード
37-DEBUG = false
38-# ファイルマネージャー機能を使用するならtrue
39-USEFILEMANAGER = true
40-# ファイルマネージャー機能スクリプト(filemanager.rb)のパス
41-FILEMANAGER = "./filemanager.rb"
42-# XMLに書き込む際、改行部分を<br>のまま保持するか、改行記号に直すか
43-REPLACEBRTAG = false
44-# ファイルの書き込み時にENTRYのIDおよびURLを、FEEDオブジェクトから自動生成した値に置換するか否か
45-REPLACEENTRYIDANDURL = false
46-# プラグインディレクトリ
47-PLUGINDIR = "./plugins/"
48-# 記事用初期ファイル名
49-INITIALXML = "diary.xml"
50-
51-# バージョン情報を示す文字列です
52-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>)"
53-# タイトル領域に表示される文字列です
54-APPTITLE = "FeedGenerator for Ruby version 2.0.0.0"
55-
56-# = Objectクラス
57-#
58-# 基本クラスのオーバーライドを行います
59-class Object
60- # myopenメソッド
61- #
62- # ruby-1.9.x以降ではファイルを開いた際、エンコードの指定を行わないとエラーの原因になります。
63- # ただしruby-1.8.6以前はエンコードの指定に対応していないため、独自メソッドを定義してファイルの入出力を行います。
64- #
65- # _arg[0]_ :: 入出力を行うファイルのパス
66- # _arg[1]_ :: モードの指定。例 : w:utf-8(書き込みモード・UTF-8エンコードでファイルを開く)
67- def myopen(*arg)
68- mode = arg[1]
69- rdonly_p = true
70- case mode
71- when String
72- arg[1] = mode[/[^:]+/] if RUBY_VERSION < "1.8.7" && mode.include?(':')
73- rdonly_p = /\A[^:]*[wa+]/ !~ mode
74- when Numeric
75- rdonly_p = !(mode & (IO::WRONY | IO::RDWR))
76- end
77- open(*arg) do |f|
78- f.flock(rdonly_p ? File::LOCK_SH : File::LOCK_EX)
79- return yield(f)
80- end
81- end
82-end
83-
84-class NilClass
85- def blank?
86- nil?
87- end
88-end
89-
90-class Array
91- def blank?
92- empty?
93- end
94-end
95-
96-class String
97- def blank?
98- empty?
99- end
100-end
101-
102-# = Feed/Entryのスーパークラス
103-#
104-# 入出力用のメソッドなど、共通する機能を提供します
105-class AbstractEntry
106- # 初期化メソッドです
107- #
108- # _hash_ :: 値を格納したhash配列。superfeed.new(CGI::Session.new(new CGI).params)のようにして使う。
109- def initialize(hash)
110- # 内部データ保持用のハッシュ配列です
111- @attr = {}
112-
113- # 引数を格納します
114- @paramlist.each do |key|
115- val = hash[key.to_sym] || hash[key.to_s]
116- if val
117- val.strip!
118- val.gsub!(/\r\n|\r/, "\n")
119- @attr[key.to_sym] = CGI.escapeHTML(val)
120- else
121- # 空の場合の対策
122- @attr[key.to_sym] = ""
123- end
124- end
125-
126- # 可視・不可視を示すハッシュキーを格納する配列です
127- @display = {}
128-
129- # ハッシュキーの日本語説明を格納する配列です
130- @name = []
131- end
132-
133- # Accessor
134- attr_reader :attr, :paramlist, :name, :display
135-
136- # 内部の@attrハッシュにアクセスする手段を提供するメソッドです
137- #
138- # AbstractEntry.attr[:title]にアクセスしたい場合はAbstractEntry.titleで可能になります。
139- # AbstractEntry.send("title")という方法でもアクセス可能です。
140- def method_missing(methname, *args)
141- methname = methname.to_s
142-
143- if methname[-1] == ?=
144- # setter
145- raise ArgumentError, "wrong number of arguments (#{args.length} for 1)" unless args.length == 1
146- methname.chop!
147- methname = @paramlist.find{|par|par == methname}
148- return @attr[methname.to_sym] = args[0] if methname
149- else
150- # getter
151- raise ArgumentError, "wrong number of arguments (#{args.length} for 0)" unless args.empty?
152- return @attr[methname.to_sym] if @attr.key?(methname.to_sym)
153- end
154- # attr上にキーがない値を入れようとした場合はNoMethodError
155- raise NoMethodError
156- end
157-
158- def [](key)
159- @attr[key.to_sym]
160- end
161-
162- def []=(key, value)
163- @attr[key.to_sym] = value
164- end
165-end
166-
167-# = Feedクラス
168-#
169-# Feedの基礎情報を保有するクラスです
170-class Feed < AbstractEntry
171- # 初期化メソッドです
172- #
173- # _hash_ :: 値を格納したhash配列。feed.new(CGI::Session.new(new CGI).params)のようにして使います。
174- def initialize(hash)
175- # 内部データ保持用のハッシュ配列です
176- @attr = {}
177-
178- # 内部データの項目名を格納する配列です
179- @paramlist = ["feedattr", "title", "subtitle", "self", "url", "updated", "feedid", "rights", "aname", "amail", "others"]
180-
181- # AbstractEntryのinitializeメソッドを呼び出し、値を@attr配列に格納します
182- super(hash)
183-
184- # 可視・不可視を示すハッシュキーを格納する配列です
185- @display = {"feedattr" => "none", "title" => "", "subtitle" => "",
186- "self" => "", "url" => "",
187- "updated" => "none", "feedid" => "",
188- "rights" => "", "aname" => "",
189- "amail" => "", "others" => "none"}
190-
191- # デバッグモードの場合、全ての入力要素を表示します
192- if DEBUG == true
193- @display.each do |key, val|
194- @display[key] = ""
195- end
196- end
197-
198- # ハッシュキーの日本語説明を格納する配列です
199- @name = {"feedattr" => "feedの保持している属性", "title" => "ウェブページのタイトル", "subtitle" => "ウェブページの簡単な説明",
200- "self" => "このXMLファイルのURL", "url" => "ウェブページのURL",
201- "updated" => "XMLファイルの最終更新日", "feedid" => "あなたのページ独自のID",
202- "rights" => "ページの著作権表記", "aname" => "ページの製作者",
203- "amail" => "ページ製作者のメールアドレス", "others" => "その他の要素"}
204-
205- end
206-
207- # Atom XMLファイルを読み込んで解析し、等価なFeedオブジェクトを返却するメソッドです
208- #
209- # _path_ :: Atom XMLファイルのパス
210- def self.readxml(path)
211-
212- # ファイルを読み込みます
213- doc = REXML::Document.new(myopen(path, "r:utf-8"){|f|f.read})
214- xml = {}
215- others = []
216-
217- # Feedの属性値を取得します
218- xmlattr = []
219- doc.elements["feed"].attributes.each_attribute do |attr|
220- xmlattr.push("#{attr.to_string} ")
221- end
222- xml[:feedattr] = xmlattr.join("\n").gsub(/"/, "'")
223-
224- # XML解析部分です。各element毎に判定を行います
225- doc.elements.each("feed") do |elm|
226- elm.elements.each { |child|
227- begin
228- case child.name
229- when "id"
230- xml[:feedid] = child.text
231- when "title", "subtitle", "updated", "rights"
232- xml[child.name.to_sym] = child.text
233- when "author"
234- child.elements.each do |gchild|
235- case gchild.name
236- when "name"
237- xml[:aname] = gchild.text
238- when "email"
239- xml[:amail] = gchild.text
240- end
241- end
242- when "link"
243- child.attributes.each do |k, v|
244- if k == "rel"
245- if v == "self"
246- xml[:self] = child.attributes["href"]
247- elsif v == "alternate"
248- xml[:url] = child.attributes["href"]
249- end
250- end
251- end
252- when "entry"
253- # Entry要素は無視します
254- else
255- # 上記判定以外の全要素は配列に格納します
256- others.push(child.to_s)
257- end
258- rescue NoMethodError
259- end
260-
261- }
262- end
263-
264- # Others要素を結合して代入します
265- xml[:others] = others.join("\n")
266- feed = Feed.new(xml)
267- return feed
268- end
269-
270- # 内部に保持している情報を、Atom Feed1.0形式の文字列に出力するメソッドです
271- def to_s
272- buf = []
273-
274- # buf.push("<feed #{@attr[:feedattr]}>")
275- buf.push("<feed xml:lang='ja-jp' xmlns='http://www.w3.org/2005/Atom'>");
276- buf.push("<title type=\"text\">#{@attr[:title]}</title>")
277- buf.push("<subtitle type=\"text\">#{@attr[:subtitle]}</subtitle>")
278- buf.push("<link rel=\"self\" type=\"application/atom+xml\" href=\"#{@attr[:self]}\" />")
279- buf.push("<link rel=\"alternate\" type=\"text/html\" href=\"#{@attr[:url]}\" />")
280- buf.push("<updated>#{Time.now.iso8601}</updated>")
281- buf.push("<id>#{@attr[:feedid]}</id>")
282- buf.push("<rights type=\"text\">#{@attr[:rights]}</rights>")
283- buf.push("<author>")
284- buf.push("\t<name>#{@attr[:aname]}</name>")
285- buf.push("\t<email>#{@attr[:amail]}</email>")
286- buf.push("</author>")
287- buf.push("#{CGI.unescapeHTML(@attr[:others])}") if @attr[:others] != ""
288-
289- return buf.join("\n")
290- end
291-
292- # Feed情報更新メソッド
293- def self.update(path, feed)
294- entrylist = Entry.readxml(path)
295- Feed.to_xml(path, feed, entrylist)
296-
297- true
298- end
299-
300- # XMLファイル出力用メソッドです
301- #
302- # _feed_ :: Feedオブジェクト
303- # _entry_ :: Entryオブジェクトの配列
304- def self.to_xml(path, feed, entrylist_tmp)
305- buf = []
306- entrylist = entrylist_tmp.dup
307- buf.push("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
308- buf.push("#{feed.to_s}\n")
309- entrylist.each { |entry|
310- if REPLACEENTRYIDANDURL
311- entry.entryid.gsub!(/^[^\?]*\?/, "")
312- entry.entryid = feed.url + "?" + entry.entryid
313- entry.url = feed.url + "#" + entry.entryid
314- end
315- buf.push("#{entry.to_s}\n")
316- }
317- buf.push("</feed>")
318-
319- myopen(path, "w") do |f|
320- f.print buf.join("\n")
321- end
322- end
323-
324- # XMLファイル出力用メソッドです
325- #
326- # _feed_ :: Feedオブジェクト
327- # _entry_ :: Entryオブジェクトの配列
328- def self.to_xml_plain(path, feed, entrylist)
329- buf = []
330- buf.push("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
331- buf.push("#{feed.to_s}\n")
332- entrylist.each { |entry|
333- buf.push("#{entry.to_s}\n")
334- }
335- buf.push("</feed>")
336-
337- myopen(path, "w") do |f|
338- f.print buf.join("\n")
339- end
340- end
341-
342-end
343-
344-# = Entryクラス
345-#
346-# Entryの基礎情報を保有するクラスです
347-class Entry < AbstractEntry
348- # 初期化メソッドです
349- #
350- # _hash_ :: 値を格納したhash配列。entry.new(CGI::Session.new(new CGI).params)のようにして使います。
351- def initialize(hash)
352- # 内部データ保持用のハッシュ配列です
353- @attr = {}
354-
355- # 内部データの項目名を格納する配列です
356- @paramlist = ["entryid", "title", "summary", "published", "updated", "url", "content", "others"]
357-
358- # AbstractEntryのinitializeメソッドを呼び出し、値を@attr配列に格納します
359- super(hash)
360-
361- # 可視・不可視を示すハッシュキーを格納する配列です
362- @display = {"entryid" => "none", "title" => "",
363- "summary" => "", "published" => "none",
364- "updated" => "none", "url" => "",
365- "content" => "", "others"=>"none"}
366-
367- # デバッグモードの場合、全ての入力要素を表示します
368- if DEBUG == true
369- @display.each do |key, val|
370- @display[key] = ""
371- end
372- end
373-
374- # ハッシュキーの日本語説明を格納する配列です
375- @name = {"entryid" => "記事固有のID", "title" => "記事のタイトル",
376- "summary" => "記事の簡単な説明", "published" => "記事の出版時刻",
377- "updated" => "記事の更新時刻", "url" => "記事へのURLアドレス",
378- "content" => "記事の本文", "others"=>"その他の項目"}
379- end
380-
381- # Atom XMLファイルを読み込んで解析し、等価なEntryオブジェクト配列を返却するメソッドです
382- #
383- # _path_ :: Atom XMLファイルのパス
384- def self.readxml(path)
385-
386- # ファイルを読み込みます
387- doc = REXML::Document.new(myopen(path, "r:utf-8"){|f|f.read})
388- entrylist = []
389- xml = {}
390-
391- # XML解析部分です。各element毎に判定を行います
392- doc.elements.each("feed/entry") do |elm|
393- xml = {}
394- others = []
395- elm.elements.each do |child|
396- begin
397- case child.name
398- when "id"
399- xml[:entryid] = child.text
400- when "link"
401- xml[:url] = child.attributes["href"]
402- when "title", "summary", "summary", "published", "updated", "content"
403- xml[child.name.to_sym] = child.text
404- else
405- # 上記判定以外の全要素は配列に格納します
406- others.push(child.to_s)
407- end
408- rescue NoMethodError
409- end
410- end
411- # Others要素を結合して代入します
412- xml[:others] = others.join("\n")
413- entrylist.push(Entry.new(xml))
414- end
415-
416- return entrylist
417- end
418-
419- # Atom XMLファイルを読み込んで解析し、テンプレートファイルにしたがってHTMLに変換するメソッドです
420- def self.to_html(xmlpath, destpath, entry_temppath, html_temppath)
421- # 引数チェック - 全必須
422- if xmlpath.empty? or destpath.empty? or entry_temppath.empty? or html_temppath.empty?
423- raise ArgumentError
424- end
425-
426- # 必須ファイル存在チェック
427- unless File.exist?(xmlpath) and File.exist?(entry_temppath) and File.exist?(html_temppath)
428- raise IOError
429- end
430-
431- # XML読み込み
432- entrylist = Entry.readxml(xmlpath)
433-
434- body = ''
435- entrylist.each { |e|
436- # Entry毎のHTML表示部分を生成
437- body << e.to_template(entry_temppath)
438- }
439-
440- # HTML全体のテンプレートを生成
441- html_temp = HtmlWriter.new(html_temppath, binding)
442-
443- # HTMLに書き込み
444- myopen(destpath, 'w:utf-8') { |f|
445- f.write(CGI.pretty(html_temp.to_code))
446- }
447- end
448-
449- # Entryをテンプレートに沿って変形するメソッド
450- def to_template(temppath)
451- erb = HtmlWriter.new(temppath, binding)
452- title = CGI.unescapeHTML(@attr[:title])
453- date = @attr[:published]
454- content = CGI.unescapeHTML(@attr[:content])
455- erb.to_code
456- end
457-
458- # Entry挿入メソッド
459- def self.insert(path, entry)
460- feed = Feed.readxml(path)
461- entrylist = Entry.readxml(path)
462- entrylist.unshift entry
463-
464- Feed.to_xml(path, feed, entrylist)
465-
466- true
467- end
468-
469- # Entry更新メソッド
470- def self.update(path, entry)
471- feed = Feed.readxml(path)
472- entrylist = Entry.readxml(path)
473-
474- successed = false
475- entrylist.each_with_index { |e, i|
476- if e.entryid == entry.entryid
477- entrylist[i] = entry
478- successed = true
479- end
480- }
481- Feed.to_xml(path, feed, entrylist) if successed
482-
483- successed
484- end
485-
486- # Entryロードメソッド
487- def self.select(path, entryid)
488- feed = Feed.readxml(path)
489- entrylist = Entry.readxml(path)
490-
491- entry = nil
492- entrylist.each_with_index { |e, i|
493- entry = entrylist[i].dup if e.entryid == entryid
494- }
495-
496- entry
497- end
498-
499- # Entry消去メソッド
500- def self.delete(path, entryid)
501- feed = Feed.readxml(path)
502- entrylist = Entry.readxml(path)
503-
504- successed = false
505- delete_index = -1
506- entrylist.each_with_index { |e, i|
507- if e.entryid == entryid
508- delete_index = i
509- successed = true
510- end
511- }
512-
513- if successed
514- entrylist.delete_at delete_index
515- Feed.to_xml(path, feed, entrylist)
516- end
517-
518- successed
519- end
520-
521- # データソースから読み取ったHTMLを、エディタで編集可能な形式に変換するメソッドです
522- def content_for_generator
523- str = @attr[:content].dup
524- str.strip!
525- str.gsub!(/(&lt;\/(?:p|h\d|div)(?:&gt;|>))\n/i, '\1')
526- str.gsub!(/\n/, '&lt;br&gt;') if REPLACEBRTAG
527- str.gsub!(/(&lt;(?:(?!&gt;).)*?)#{Regexp.escape(RELAYPATH)}/) { "#$1#{HOMEBASE}" }
528- str
529- end
530-
531- # エディタで編集されたCONTENT要素を、データソースに書き込める形式に変換するメソッドです
532- def content_for_blog
533- str = @attr[:content].dup
534- str = CGI.unescapeHTML(str)
535- str.strip!
536- str.gsub!(/(\r\n|\n)/, "")
537- str.gsub!(/<br>|<br[ ]*\/>/i, "\n") if REPLACEBRTAG
538- str.gsub!(/(<br>|<br[ ]*\/>|<\/p>|<\/h\d>|<\/div>)(?=[^\n])/i) { "#$1\n" } unless REPLACEBRTAG
539- str.gsub!(/(<[^>]*?)#{Regexp.escape(HOMEBASE)}/) { "#$1#{RELAYPATH}" }
540- CGI.escapeHTML(str)
541- end
542-
543- # 確認画面で表示されるCONTENT要素を生成するメソッドです
544- def content_for_view
545- str = @attr[:content].dup
546- str = CGI.unescapeHTML(str)
547- str.strip!
548- str.gsub!(/<br>|<br[ ]*\/>/i, "\n") if REPLACEBRTAG
549- str.gsub!(/(<[^>]*?)#{Regexp.escape(RELAYPATH)}/) { "#$1#{HOMEBASE}" }
550- str
551- end
552-
553- # 内部に保持している情報を、Atom Feed1.0形式の文字列に出力するメソッドです
554- def to_s
555- buf = []
556- buf.push("<entry>")
557- buf.push("<id>#{@attr[:entryid]}</id>")
558- buf.push("<title>#{@attr[:title]}</title>")
559- buf.push("<summary>#{@attr[:summary]}</summary>")
560- buf.push("<published>#{@attr[:published]}</published>")
561- buf.push("<updated>#{@attr[:updated]}</updated>")
562- buf.push("<link href=\"#{@attr[:url]}\" />")
563- buf.push("<content type=\"html\">#{@attr[:content]}</content>")
564- buf.push("#{CGI.unescapeHTML(@attr[:others])}") if @attr[:others] != ""
565- buf.push("</entry>")
566-
567- return buf.join("\n")
568- end
569-end
570-
571-# = HtmlWriterクラス
572-#
573-# テンプレートファイル(*.erb)を読み込み、管理するクラスです
574-class HtmlWriter
575- # 初期化メソッドです
576- #
577- # _template_ :: テンプレートファイル(*.erb)のパス
578- # _binding_ :: binding変数
579- def initialize(template, binding)
580- @erb = ERB.new(myopen(template, "r:utf-8") {|f| f.read}, nil, "-")
581- @binding = binding
582- end
583-
584- # テンプレートファイルの文字列を返却するメソッドです
585- def to_code
586- @erb.result(@binding)
587- end
588-end
589-
590-# = LogListクラス
591-#
592-# loglist.xmlにかかわる入出力を行います
593-class LogList
594- # 初期化メソッドです
595- #
596- # _display_ :: 画面表示用文字の配列
597- # _path_ :: XMLファイルパスの配列
598- # _logpath_ :: loglist.xmlのパス
599- def initialize(display, path, logpath)
600- @display = display
601- @path = path
602- @logpath = logpath
603- end
604-
605- attr_accessor :display, :path, :logpath
606-
607- # loglist.xmlファイルを読み込んで解析し、LogListオブジェクトを返却するメソッドです
608- #
609- # _logpath_ :: loglist.xmlへのパス
610- def LogList.readxml(logpath)
611-
612- # ファイルを読み込みます
613- lines = []
614- myopen(logpath, "r:utf-8") { |f|
615- lines = f.readlines
616- }
617-
618- doc = REXML::Document.new(lines.join("\n"))
619- @display = []
620- @path = []
621-
622- doc.elements.each("list/file") { |elm|
623- elm.elements.each {|child|
624- case child.name
625- when "display"
626- @display.push(child.text)
627- when "path"
628- @path.push(child.text)
629- else
630- # With no action
631- end
632- }
633- }
634-
635- return LogList.new(@display, @path, logpath)
636- end
637-
638- # loglist.xmlにオブジェクトの内容を反映するメソッドです
639- def to_xml
640- buf = []
641- buf.push("<list>")
642- path.each_with_index do |path, i|
643- buf.push("<file>")
644- buf.push("<display>#{@display[i]}</display>")
645- buf.push("<path>#{@path[i]}</path>")
646- buf.push("</file>")
647- end
648- buf.push("</list>")
649-
650- myopen(@logpath, "w") do |f|
651- f.print buf.join("\n")
652- end
653- end
654-
655-end
656-
657-# = FileUploaderクラス
658-#
659-# 画像の管理を行うクラスです
660-class FileUploader
661- # 初期化メソッドです
662- def initialize
663- end
664-
665- # ファイルの一覧を取得し、ファイル名称を格納した配列を返却します
666- def filelist
667- arr = Dir::entries(XMLPATH).sort
668- arr.delete(".")
669- arr.delete("..")
670-
671- return arr
672- end
673-
674- # ファイルの消去を実行します
675- #
676- # _name_ :: 消去するファイル名
677- def delete(name)
678- File.delete(XMLPATH + name.match(/[^\/]*?$/).to_a[0])
679- end
680-
681- # ファイルのアップロードを実行します
682- #
683- # _name_ :: アップロードファイルの名称
684- # _img_ :: アップロードファイル
685- def upload(name, img)
686- open(XMLPATH + File.basename(name), "w") do |f|
687- f.binmode
688- f.write img
689- end
690- end
691-end
692-
693-# = Pluginクラス
694-#
695-# プラグインの処理を行うクラスです
696-class FeedGenPluginManager
697- def self.exec(mode, filepath)
698- feed = Feed.readxml(XMLPATH + filepath)
699- entries = Entry.readxml(XMLPATH + filepath)
700- feed.freeze
701- entries.freeze
702- Dir.foreach(PLUGINDIR) do |fn|
703- next unless File.extname(fn) == '.rb'
704- require File.join(PLUGINDIR, fn)
705- plugin_name = "FeedGenPlugins::"
706- plugin_name << File.basename(fn).gsub(/\.rb\Z/, "")
707- plugin_ins = plugin_name.split(/::/).inject(Object) { |c,name| c.const_get(name) }
708- plugin_ins.new.exec(mode, feed, entries)
709- end
710- end
711-end
712-
713-# = Controllerクラス
714-#
715-# コントローラ部分に相当する処理を受け持つクラスです
716-class Controller
717- def Controller.NormalForm(cgi, session, params, db)
718- db.transaction do
719- # modeとactionの相関図は以下のようになります。
720- # [mode] + [action]
721- # + [action]
722- # + [action]
723- # + ... and more
724- case params["mode"]
725- # ログ選択画面
726- when "logselect"
727- session["filepath"] = params["logpath"]
728- db["loglist"] = LogList.readxml(LISTXMLPATH)
729- # 初期状態で選択されるログは「loglist.xml」の最上に位置するログになります
730- session["filepath"] = db["loglist"].path[0] if session["filepath"] == nil
731- db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
732- db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
733-
734- # 新規記事追加部分
735- when "newentry"
736- case params["action"]
737- # 確認画面
738- when "confirm"
739- session["target_filepath"] = params["target_filepath"]
740- db["newentry"] = Entry.new(params)
741- db["newentry"].content = db["newentry"].content_for_blog
742- # 記事の追記を実際にファイルに反映
743- when "exec"
744- session["target_filepath"] = params["target_filepath"]
745- successed = Entry.insert(XMLPATH + File.basename(params["target_filepath"]), Entry.new(params))
746- unless successed
747- db["error"] = "日記の新規追加に失敗しました。"
748- params["mode"] = "error"
749- else
750- # 成功時はプラグイン処理を実施する
751- FeedGenPluginManager.exec("newentry", File.basename(session["filepath"]))
752- end
753- # 画面を戻った際の処理
754- when "back"
755- session["target_filepath"] = params["target_filepath"]
756- db["newentry"] = Entry.new(params)
757- else
758- # New Diary - Default
759- session["target_filepath"] = session["filepath"]
760- db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
761- db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
762- end
763-
764- # 記事編集部分
765- when "editentry"
766- case params["action"]
767- # 編集画面
768- when "edit"
769- session["target_filepath"] = params["target_filepath"]
770- session["editid"] = cgi["editid"].to_s
771- db["editentry"] = Entry.select(XMLPATH + File.basename(session["target_filepath"]), session["editid"])
772- # 確認画面
773- when "confirm"
774- session["target_filepath"] = params["target_filepath"]
775- session["editid"] = cgi["editid"].to_s
776- db["editentry"] = Entry.new(params)
777- db["editentry"].content = db["editentry"].content_for_blog
778- # 記事の変更を実際にファイルに反映
779- when "exec"
780- session["target_filepath"] = params["target_filepath"]
781- successed = Entry.update(XMLPATH + File.basename(params["target_filepath"]), Entry.new(params))
782- unless successed
783- db["error"] = "日記の編集処理に失敗しました。<br>該当の日記が既に存在しない可能性があります。"
784- params["mode"] = "error"
785- else
786- # 成功時はプラグイン処理を実施する
787- FeedGenPluginManager.exec("editentry", File.basename(session["filepath"]))
788- end
789- when "back"
790- session["target_filepath"] = params["target_filepath"]
791- db["editentry"] = Entry.new(params)
792- else
793- # Edit Diary - Default
794- session["target_filepath"] = session["filepath"]
795- db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
796- db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
797- end
798-
799- # 記事削除部分
800- when "delentry"
801- case params["action"]
802- # 確認画面
803- when "confirm"
804- session["target_filepath"] = params["target_filepath"]
805- session["delid"] = cgi["delid"].to_s
806- db["delentry"] = Entry.select(XMLPATH + File.basename(session["target_filepath"]), session["delid"])
807- # 記事の削除を実際にファイルに反映
808- when "exec"
809- session["target_filepath"] = params["target_filepath"]
810- successed = Entry.delete(XMLPATH + File.basename(params["target_filepath"]), cgi["delid"].to_s)
811- unless successed
812- db["error"] = "日記の編集処理に失敗しました。<br>該当の日記が既に存在しない可能性があります。"
813- params["mode"] = "error"
814- else
815- # 成功時はプラグイン処理を実施する
816- FeedGenPluginManager.exec("delentry", File.basename(session["filepath"]))
817- end
818- when "back"
819- session["target_filepath"] = params["target_filepath"]
820- db["feed"] = Feed.readxml(XMLPATH + File.basename(session["target_filepath"]))
821- db["entry"] = Entry.readxml(XMLPATH + File.basename(session["target_filepath"]))
822- else
823- # Delete Diary - Default
824- session["target_filepath"] = session["filepath"]
825- db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
826- db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
827- end
828-
829- # Feed情報変更部分
830- when "editfeed"
831- case params["action"]
832- # 確認画面
833- when "confirm"
834- session["target_filepath"] = params["target_filepath"]
835- db["feed"] = Feed.new(params)
836- # 実際にFeed情報の変更をファイルに反映
837- when "back"
838- session["target_filepath"] = params["target_filepath"]
839- db["feed"] = Feed.new(params)
840- when "exec"
841- session["target_filepath"] = params["target_filepath"]
842- Feed.update(XMLPATH + File.basename(params["target_filepath"]), Feed.new(params))
843- else
844- session["target_filepath"] = session["filepath"]
845- db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
846- end
847-
848- # ログ編集モード
849- when "log"
850- # 必ず内部データをリフレッシュする
851- db["loglist"] = LogList.readxml(LISTXMLPATH)
852- case params["action"]
853- # ログファイルの編集を実際にファイルに反映
854- when "addexec"
855- # エラーチェック。この段階のエラーは強度のエラーを発する。
856- db["loglist"].path.each do |val|
857- if val == cgi["logpath"]
858- # 重複していた場合エラーメッセージを表示し、処理を行わない
859- params["action"] = ""
860- params["mode"] = "error"
861- db["error"] = "ログファイルの追加中に重大なエラーが発生しました。<br>環境を見直してください。"
862- return
863- end
864- end
865-
866- # 入力された内容を保持する配列に追加
867- db["loglist"].path[1, 0] = cgi["logpath"]
868- db["loglist"].display[1, 0] = cgi["logdisplay"]
869- db["loglist"].to_xml
870- # 既存のdiary.xmlを指定された名称でコピーして保存
871- FileUtils.copy_file(XMLPATH + File.basename(db["loglist"].path[0]), XMLPATH + File.basename(db["logpath"]), true)
872- # 保持している情報を更新する
873- db["loglist"] = LogList.readxml(LISTXMLPATH)
874- db["entry"] = []
875- # 新たなdiary.xmlを生成。この際保持する情報は同一のFeedオブジェクトnew()
876- Feed.to_xml(XMLPATH + File.basename(db["loglist"].path[0]), db["feed"], [])
877- # 確認画面
878- when "addconfirm"
879- # 入力されたログが既に存在するかを確認
880- db["loglist"].path.each do |val|
881- if val == cgi["logpath"]
882- # 重複していた場合エラーメッセージを表示し、処理を行わない
883- params["action"] = ""
884- db["error"] = "<span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
885- return
886- end
887- end
888-
889- db["logpath"] = cgi["logpath"]
890- db["logdisplay"] = cgi["logdisplay"]
891-
892- if db["logpath"].blank? || db["logdisplay"].blank?
893- params["action"] = ""
894- end
895- when "back"
896-
897- # 削除確認画面
898- when "delconfirm"
899- db["logdelindex"] = params["logdelindex"].to_i
900-
901- if db["logdelindex"] < 1
902- db["error"] = "<span style='color: #ff0000'>ログファイルの削除パラメタが不正です。</span><br>"
903- params["action"] = ""
904- end
905- # 削除処理
906- when "delexec"
907- if cgi["logdelindex"].to_i < 1
908- params["action"] = ""
909- params["mode"] = "error"
910- db["error"] = "ログファイルの削除中に重大なエラーが発生しました。<br>環境を見直してください。"
911- return
912- else
913- # 記事ファイルを削除します
914- File.delete(XMLPATH + File.basename(db["loglist"].path[db["logdelindex"]]))
915- # ログリストから削除します
916- db["loglist"].path.delete_at(cgi["logdelindex"].to_i)
917- db["loglist"].display.delete_at(cgi["logdelindex"].to_i)
918- db["loglist"].to_xml
919- # 保持している情報を更新する
920- db["loglist"] = LogList.readxml(LISTXMLPATH)
921- db["entry"] = []
922- end
923-
924- # 編集画面
925- when "edit"
926- db["logeditindex"] = params["logdelindex"].to_i
927-
928- db["logpath"] = db["loglist"].path[db["logeditindex"]]
929- db["logdisplay"] = db["loglist"].display[db["logeditindex"]]
930-
931- if db["logeditindex"] == 0
932- db["error"] = "<span style='color: #ff0000'>ログファイルの編集パラメタが不正です。</span><br>"
933- params["action"] = ""
934- end
935- # 編集確認画面
936- when "editconfirm"
937- checkflag = true
938- db["loglist"].path.each_with_index do |val, i|
939- if db["logeditindex"] != i
940- if params["logpath"].to_s == db["loglist"].path[i].to_s
941- checkflag = false
942- end
943- end
944- end
945-
946- if checkflag == false
947- params["action"] = "edit"
948- db["error"] = "<span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
949- else
950- db["loginsertindex"] = params["loginsertindex"].to_i
951-
952- db["logpath"] = params["logpath"].to_s
953- db["logdisplay"] = params["logdisplay"].to_s
954- end
955- # 編集実行
956- when "editexec"
957- checkflag = true
958- db["loglist"].path.each_with_index do |val, i|
959- if db["logeditindex"] != i
960- if params["logpath"].to_s == db["loglist"].path[i].to_s
961- checkflag = false
962- end
963- end
964- end
965-
966- if checkflag == false
967- params["action"] = ""
968- params["mode"] = "error"
969- db["error"] = "ログファイルの編集中に重大なエラーが発生しました。<br>環境を見直してください。"
970- return
971- else
972- db["loginsertindex"] = params["loginsertindex"].to_i
973-
974- db["logpath"] = params["logpath"].to_s
975- db["logdisplay"] = params["logdisplay"].to_s
976-
977- # ファイルを移動します
978- if XMLPATH + File.basename(db["loglist"].path[db["logeditindex"]]) != XMLPATH + File.basename(db["logpath"])
979- FileUtils.move(XMLPATH + File.basename(db["loglist"].path[db["logeditindex"]]), XMLPATH + File.basename(db["logpath"]))
980- # ログリストを更新します
981- db["loglist"].path.delete_at(db["logeditindex"])
982- db["loglist"].display.delete_at(db["logeditindex"])
983- db["loglist"].path.insert(db["loginsertindex"] + 1, db["logpath"])
984- db["loglist"].display.insert(db["loginsertindex"] + 1, db["logdisplay"])
985- db["loglist"].to_xml
986- end
987- end
988-
989- # 初期表示画面
990- else
991- # 現在編集中のデータを強制的に最上のファイルパスに変更
992- session["filepath"] = db["loglist"].path[0]
993-
994- # 前月の時刻を作成します
995- prevmonth = (DateTime.now << 1)
996-
997- # 前月の時刻を元に、ディフォルト書式を生成します
998- db["logpath"] = FEEDXMLDIR + prevmonth.strftime("%Y%m") + ".xml"
999- db["logdisplay"] = prevmonth.strftime("%Y年%m月").gsub("年0", "年")
1000- end
1001-
1002- # インポートモードの場合の処理
1003- when "import"
1004- db["loglist"] = LogList.readxml(LISTXMLPATH)
1005-
1006- # リセットモードの場合の処理
1007- when "reset"
1008- case params["action"]
1009- # リセット実行時の処理
1010- when "exec"
1011- file = FileUploader.new
1012- file.filelist().each { |fname|
1013- file.delete(fname) if File.ftype(XMLPATH + fname) == "file"
1014- }
1015-
1016- # 全ファイルの初期化を実行する
1017- # loglist.xmlの初期化
1018- loglist = LogList.new(["最新の記事"], ["#{FEEDXMLDIR}#{INITIALXML}"], LISTXMLPATH)
1019- loglist.to_xml
1020-
1021- db["loglist"] = LogList.readxml(LISTXMLPATH)
1022-
1023- # diary.xmlの初期化
1024- Feed.to_xml(XMLPATH + db["loglist"].path[0].match(/[^\/]*?$/).to_a[0], Feed.new({}), [])
1025-
1026- # 初期の編集ファイルはloglist.xml上の最も上のファイル
1027- session["filepath"] = db["loglist"].path[0]
1028- db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
1029- db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
1030-
1031- # 画面の遷移先をトップページにする
1032- params["mode"] = ""
1033- params["action"] = ""
1034- # パラメタ無しの処理
1035- else
1036- # ファイル一覧を取得する
1037- filelist = FileUploader.new.filelist()
1038-
1039- # タイプがファイルのみリストとして取得する
1040- db["filelist"] = []
1041- filelist.each { |fname| db["filelist"] << fname if File.ftype(XMLPATH + fname) == "file"}
1042- end
1043-
1044- # ログイン時の画面
1045- else
1046- # loglist.xmlが存在するかチェック
1047- if File.exist?(LISTXMLPATH) == false
1048- # なかった場合はloglist.xmlを自動生成
1049- loglist = LogList.new(["最新の記事"], ["#{FEEDXMLDIR}#{INITIALXML}"], LISTXMLPATH)
1050- loglist.to_xml
1051- Feed.to_xml(XMLPATH + File.basename(loglist.path[0]), Feed.new({}), [])
1052- end
1053-
1054- db["loglist"] = LogList.readxml(LISTXMLPATH)
1055-
1056- # diary.xmlが存在するかチェック
1057- if File.exist?(XMLPATH + File.basename(db["loglist"].path[0])) == false
1058- # なかった場合はdiary.xmlを自動生成
1059- Feed.to_xml(XMLPATH + File.basename(db["loglist"].path[0]), Feed.new({}), [])
1060- end
1061-
1062- # 初期の編集ファイルはloglist.xml上の最も上のファイル
1063- session["filepath"] = db["loglist"].path[0] if session["filepath"] == nil
1064- db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
1065- db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
1066- end
1067- end
1068- end
1069-
1070- # マルチパートフォームの場合の処理です
1071- def Controller.MultiForm(cgi, session, params, db)
1072- db.transaction do
1073- # loglist.xmlをロードします
1074- db["loglist"] = LogList.readxml(LISTXMLPATH)
1075- case params["mode"]
1076- # 特定位置に挿入する場合の処理
1077- when "insert"
1078- case params["action"]
1079- when "exec"
1080- # この段階のエラーに対しては強度のエラーを発する
1081- checkflag = true
1082- db["logpath"] = Controller.get_mpart_value(cgi["logpath"])
1083- db["loglist"].path.each do |val|
1084- if val == db["logpath"]
1085- # 重複していた場合エラーメッセージを表示し、処理を行わない
1086- db["logpath"] = ""
1087- params["action"] = ""
1088- params["mode"] = "error"
1089- db["error"] = "ログファイルの追加中に重大なエラーが発生しました。"
1090- return
1091- end
1092- end
1093-
1094- db["loginsertindex"] = cgi["loginsertindex"].read.to_i
1095- db["logdisplay"] = Controller.get_mpart_value(cgi["logdisplay"])
1096-
1097- # 0位置への挿入防止
1098- if db["loginsertindex"] == 0
1099- params["action"] = ""
1100- params["mode"] = "error"
1101- db["error"] = "ログファイルの追加中に重大なエラーが発生しました。"
1102- return
1103- end
1104-
1105- if File.basename(db["logpath"]).blank? || db["logdisplay"].blank?
1106- params["action"] = ""
1107- params["mode"] = "error"
1108- db["error"] = "ログファイルの追加中に重大なエラーが発生しました。"
1109- return
1110- end
1111-
1112- # ファイルを実際にアップロードします
1113- file = FileUploader.new
1114- file.upload(db["logpath"], db["importxml"])
1115-
1116- # loglist.xmlを更新します
1117- db["loglist"].path[db["loginsertindex"], 0] = db["logpath"]
1118- db["loglist"].display[db["loginsertindex"], 0] = db["logdisplay"]
1119- db["loglist"].to_xml
1120-
1121- # 情報を更新します
1122- db["loglist"] = LogList.readxml(LISTXMLPATH)
1123- session["filepath"] = db["loglist"].path[0] if session["filepath"] == nil
1124- db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
1125- db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
1126-
1127- when "confirm"
1128- # 入力されたログファイルパスが既に存在するかを確認
1129- checkflag = true
1130- db["logpath"] = Controller.get_mpart_value(cgi["logpath"])
1131- db["loglist"].path.each do |val|
1132- if val == db["logpath"]
1133- # 重複していた場合エラーメッセージを表示し、処理を行わない
1134- db["logpath"] = ""
1135- params["action"] = ""
1136- db["error"] = "<br><span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
1137- checkflag = false
1138- return
1139- end
1140- end
1141-
1142- if checkflag
1143- db["loginsertindex"] = cgi["loginsertindex"].read.to_i
1144- db["logdisplay"] = Controller.get_mpart_value(cgi["logdisplay"])
1145- db["importxml"] = cgi["updata"].read
1146-
1147- # XMLの整合性をチェックします
1148- begin
1149- REXML::Document.new(Controller.fix_updata_enc(db["importxml"].to_s))
1150- rescue => exception
1151- db["error"] = "<br><span style='color: #ff0000'>不正な整形のXMLです!ファイルを見直してください。</span><br>"
1152- db["error"] << "<div class='divstyle' style='width: 560px; color: #ff0000; text-align: left;'>"
1153- db["error"] << CGI.escapeHTML(exception.to_s).gsub("\n", "<br>")
1154- db["error"] << "</div>"
1155- params["action"] = ""
1156- return
1157- end
1158- end
1159-
1160- # 0位置への挿入防止
1161- if db["loginsertindex"] == 0
1162- params["action"] = ""
1163- db["error"] = "<br><span style='color: #ff0000'>ラジオボックスでログの挿入位置を選択してください!</span><br>"
1164- return
1165- end
1166-
1167- if db["logpath"] == FEEDXMLDIR || db["logdisplay"].blank?
1168- params["action"] = ""
1169- db["error"] = "<br><span style='color: #ff0000'>インポートファイル、及び、ログの表示名は空欄にできません。</span><br>"
1170- return
1171- end
1172-
1173- else
1174- end
1175-
1176- # diary.xmlを入れ替える処理
1177- when "replace"
1178- case params["action"]
1179- when "exec"
1180- # この段階のエラーに対しては強度のエラーを発する
1181- checkflag = true
1182- db["logpath"] = Controller.get_mpart_value(cgi["logpath"])
1183- db["loglist"].path.each do |val|
1184- if val == db["logpath"]
1185- # 重複していた場合エラーメッセージを表示し、処理を行わない
1186- params["action"] = ""
1187- params["mode"] = "error"
1188- db["error"] = "ログファイルの追加中に重大なエラーが発生しました。"
1189- return
1190- end
1191- end
1192-
1193- db["logdisplay"] = Controller.get_mpart_value(cgi["logdisplay"])
1194-
1195- if File.basename(db["logpath"]).blank? || db["logdisplay"].blank? || db["importxml"].blank?
1196- params["action"] = ""
1197- params["mode"] = "error"
1198- db["error"] = "ログファイルの追加中に重大なエラーが発生しました。"
1199- return
1200- end
1201-
1202- # diary.xmlを移動します
1203- FileUtils.move(XMLPATH + INITIALXML, XMLPATH + File.basename(db["logpath"]))
1204- # ファイルをアップロードします
1205- file = FileUploader.new
1206- file.upload(INITIALXML, db["importxml"])
1207-
1208- # loglist.xmlを更新します
1209- db["loglist"].path[1, 0] = db["logpath"]
1210- db["loglist"].display[1, 0] = db["logdisplay"]
1211- db["loglist"].to_xml
1212-
1213- # 情報を更新します
1214- db["loglist"] = LogList.readxml(LISTXMLPATH)
1215- session["filepath"] = db["loglist"].path[0] if session["filepath"] == nil
1216- db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
1217- db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
1218-
1219- when "confirm"
1220- # 入力されたログファイルパスが既に存在するかを確認
1221- checkflag = true
1222- db["logpath"] = Controller.get_mpart_value(cgi["logpath"])
1223- db["loglist"].path.each do |val|
1224- if val == db["logpath"]
1225- # 重複していた場合エラーメッセージを表示し、処理を行わない
1226- params["action"] = ""
1227- db["error"] = "<br><span style='color: #ff0000'>同一のファイルが存在します!別の名前を指定してください。</span><br>"
1228- checkflag = false
1229- return
1230- end
1231- end
1232-
1233- if checkflag == true
1234- db["logdisplay"] = Controller.get_mpart_value(cgi["logdisplay"])
1235- db["importxml"] = cgi["updata"].read
1236-
1237- # XMLの整合性をチェックします
1238- begin
1239- REXML::Document.new(Controller.fix_updata_enc(db["importxml"].to_s))
1240- rescue => exception
1241- db["error"] = "<br><span style='color: #ff0000'>不正な整形のXMLです!ファイルを見直してください。</span><br>"
1242- db["error"] << "<div class='divstyle' style='width: 560px; color: #ff0000; text-align: left;'>"
1243- db["error"] << CGI.escapeHTML(exception.to_s).gsub("\n", "<br>")
1244- db["error"] << "</div>"
1245- params["action"] = ""
1246- return
1247- end
1248- end
1249-
1250- if db["logpath"].blank? || db["logdisplay"].blank? || db["importxml"].blank?
1251- params["action"] = ""
1252- db["error"] = "<br><span style='color: #ff0000'>インポートファイル、及び、ログの表示名、ログのパスは空欄にできません。</span><br>"
1253- return
1254- end
1255-
1256- else
1257- end
1258-
1259- else
1260- end
1261- end
1262- end
1263-
1264- # Formのenctypeがmultypartだった場合、入力された値をrubyバージョンに左右されずに読み取るメソッドです。
1265- def Controller.get_mpart_value(cgi_param)
1266- if RUBY_VERSION >= "1.9.0"
1267- cgi_param[0..cgi_param.length].to_s
1268- else
1269- cgi_param.read.to_s
1270- end
1271- end
1272-
1273- # アップロードされたXMLをバージョンに左右されずに読み取るために、ruby-1.9.1以上ではエンコーディングを強制指定します
1274- def Controller.fix_updata_enc(file_to_s)
1275- if RUBY_VERSION >= "1.9.0"
1276- file_to_s.force_encoding("UTF-8")
1277- else
1278- file_to_s
1279- end
1280- end
1281-
1282-end
1283-
1284-def main
1285- # SESSION変数、パラメータなどを取得します
1286- cgi = CGI.new
1287- session = CGI::Session.new(cgi)
1288- params = Hash[*cgi.params.to_a.map{|k, v| [k, v[0].to_s]}.flatten]
1289-
1290- # コントローラー部分
1291- # セッション管理
1292- if session["login"] != "true"
1293-
1294- # ログイン情報を確認
1295- LOGININFO.each {|h|
1296- if (cgi["loginid"] == h[:id] && cgi["password"] == h[:password])
1297- session["login"] = "true"
1298- session["name"] = h[:name]
1299- break
1300- end
1301- }
1302-
1303- if (session["login"] == "true")
1304- # ワークフォルダの中をクリーンアップします
1305- filelist = Dir::entries("./work")
1306- # 削除条件 : 最終変更日時から1日(60*60*24sec)かつ、ファイルタイプがファイルの場合
1307- filelist.each do |file|
1308- File.delete("./work/#{file}") if Time.now - File.ctime("./work/#{file}") > 86400 && File.ftype("./work/#{file}") == "file"
1309- end
1310- end
1311- end
1312-
1313- # ログアウト処理
1314- if params["mode"] == "logout"
1315- session["login"] = nil
1316- session.delete
1317- end
1318-
1319- begin
1320- # メインコントローラー
1321- # セッションが有効な場合のも実行します
1322- if session["login"] == "true"
1323- # PStore破損チェック!
1324- begin
1325- db = PStore.new("./work/#{session.session_id}.dat")
1326- db.transaction do
1327- db["error"] = ""
1328- end
1329- rescue
1330- # PStoreファイルを破棄する
1331- File.delete("./work/#{session.session_id}.dat")
1332- # PStoreが破損していた場合はセッション情報を破棄する
1333- session["login"] = nil
1334- session.delete
1335- end
1336-
1337- # フォームによって挙動を変更します
1338- if cgi["mode"].respond_to?(:read) && cgi["action"].respond_to?(:read)
1339- params["mode"] = cgi["mode"].read
1340- params["action"] = cgi["action"].read
1341- Controller.MultiForm(cgi, session, params, db)
1342- else
1343- Controller.NormalForm(cgi, session, params, db)
1344- end
1345-
1346- # エラー画面移行時はセッション情報を破棄する
1347- if params["mode"] == "error"
1348- session["login"] = nil
1349- session.delete
1350- end
1351- end
1352-
1353- # メニューとして表示されるHTML文字列です
1354- if params["target_filepath"].blank?
1355- menu = "<div class=\"divstyle\" style=\"width: #{TABLEWIDTH}px;\"><div class=\"divstyle\" align=\"center\" style=\"margin-bottom: 5px;\">現在編集中のファイル : #{session["filepath"]} "
1356- else
1357- menu = "<div class=\"divstyle\" style=\"width: #{TABLEWIDTH}px;\"><div class=\"divstyle\" align=\"center\" style=\"margin-bottom: 5px;\">現在編集中のファイル : #{session["target_filepath"]} "
1358- end
1359- if USEFILEMANAGER == true
1360- 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>"
1361- else
1362- 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>"
1363- end
1364-
1365- # ビュー部分
1366- # modeとactionの相関図は以下のようになります。
1367- # [mode] + [action]
1368- # + [action]
1369- # + [action]
1370- # + ... and more
1371- if session["login"] != "true"
1372- # セッションが存在しない場合は強制的にトップページに遷移
1373- htmlwriter = HtmlWriter.new("./erbtemp/login.html.erb", binding)
1374- else
1375- case params["mode"]
1376- when "selectlog"
1377- htmlwriter = HtmlWriter.new("./erbtemp/select.html.erb", binding)
1378- when "newentry"
1379- htmlwriter = HtmlWriter.new("./erbtemp/newentry.html.erb", binding)
1380- when "editentry"
1381- htmlwriter = HtmlWriter.new("./erbtemp/editentry.html.erb", binding)
1382- when "delentry"
1383- htmlwriter = HtmlWriter.new("./erbtemp/delentry.html.erb", binding)
1384- when "editfeed"
1385- htmlwriter = HtmlWriter.new("./erbtemp/editfeed.html.erb", binding)
1386- when "log"
1387- htmlwriter = HtmlWriter.new("./erbtemp/log.html.erb", binding)
1388- when "insert"
1389- htmlwriter = HtmlWriter.new("./erbtemp/insertfeed.html.erb", binding)
1390- when "replace"
1391- htmlwriter = HtmlWriter.new("./erbtemp/replacefeed.html.erb", binding)
1392- when "import"
1393- htmlwriter = HtmlWriter.new("./erbtemp/indeximport.html.erb", binding)
1394- when "reset"
1395- htmlwriter = HtmlWriter.new("./erbtemp/reset.html.erb", binding)
1396- when "error"
1397- htmlwriter = HtmlWriter.new("./erbtemp/error.html.erb", binding)
1398- else
1399- htmlwriter = HtmlWriter.new("./erbtemp/index.html.erb", binding)
1400- end
1401- end
1402- rescue => exception
1403- # エラーが発生した場合、それを画面に表示します
1404- htmlwriter = HtmlWriter.new("./erbtemp/exception.html.erb", binding)
1405- end
1406-
1407- # 実際にHTMLを出力します
1408- begin
1409- cgi.out{htmlwriter.to_code}
1410- rescue => exception
1411- # エラーが発生した場合、それを画面に表示します
1412- htmlwriter = HtmlWriter.new("./erbtemp/exception.html.erb", binding)
1413- cgi.out{htmlwriter.to_code}
1414- end
1415-end
1416-
1417-begin
1418- main
1419-rescue => evar
1420- # エラーが発生した場合、それを画面に表示します
1421- detail = ("%s: %s (%s)\n" %
1422- [evar.backtrace[0], evar.message, evar.send('class')]) +
1423- evar.backtrace[1..-1].join("\n")
1424- puts "content-type: text/html\n\n<plaintext>\n" + detail
1425-end
1+#!/usr/local/bin/ruby
2+# -*- coding: utf-8 -*-
3+#
4+#= Atom Feed 1.0を管理するWEBアプリケーション
5+#
6+#Autohr:: Kureha Hisame (http://lunardial.sakura.ne.jp/) & Yui Naruse (http://airemix.com/)
7+#Version:: 3.0.0.0
8+#Copyright:: Copyright 2009 FeedBlog Project (http://sourceforge.jp/projects/feedblog/)
9+#License:: GPLv3
10+
11+require "cgi"
12+require "cgi/session"
13+require "erb"
14+require "rexml/document"
15+require "pstore"
16+require 'time'
17+require "date"
18+require "fileutils"
19+
20+require "./common.rb"
21+require "./define.rb"
22+
23+# = Feed/Entryのスーパークラス
24+#
25+# 入出力用のメソッドなど、共通する機能を提供します
26+class AbstractEntry
27+ # 初期化メソッドです
28+ #
29+ # _hash_ :: 値を格納したhash配列。superfeed.new(CGI::Session.new(new CGI).params)のようにして使う。
30+ def initialize(hash)
31+ # 内部データ保持用のハッシュ配列です
32+ @attr = {}
33+
34+ # 引数を格納します
35+ @paramlist.each do |key|
36+ val = hash[key.to_sym] || hash[key.to_s]
37+ if val
38+ val.strip!
39+ val.gsub!(/\r\n|\r/, "\n")
40+ @attr[key.to_sym] = CGI.escapeHTML(val)
41+ else
42+ # 空の場合の対策
43+ @attr[key.to_sym] = ""
44+ end
45+ end
46+
47+ # 可視・不可視を示すハッシュキーを格納する配列です
48+ @display = {}
49+
50+ # ハッシュキーの日本語説明を格納する配列です
51+ @name = []
52+ end
53+
54+ # Accessor
55+ attr_reader :attr, :paramlist, :name, :display
56+
57+ # 内部の@attrハッシュにアクセスする手段を提供するメソッドです
58+ #
59+ # AbstractEntry.attr[:title]にアクセスしたい場合はAbstractEntry.titleで可能になります。
60+ # AbstractEntry.send("title")という方法でもアクセス可能です。
61+ def method_missing(methname, *args)
62+ methname = methname.to_s
63+
64+ if methname[-1] == ?=
65+ # setter
66+ raise ArgumentError, "wrong number of arguments (#{args.length} for 1)" unless args.length == 1
67+ methname.chop!
68+ methname = @paramlist.find{|par|par == methname}
69+ return @attr[methname.to_sym] = args[0] if methname
70+ else
71+ # getter
72+ raise ArgumentError, "wrong number of arguments (#{args.length} for 0)" unless args.empty?
73+ return @attr[methname.to_sym] if @attr.key?(methname.to_sym)
74+ end
75+ # attr上にキーがない値を入れようとした場合はNoMethodError
76+ raise NoMethodError
77+ end
78+
79+ def [](key)
80+ @attr[key.to_sym]
81+ end
82+
83+ def []=(key, value)
84+ @attr[key.to_sym] = value
85+ end
86+end
87+
88+# = Feedクラス
89+#
90+# Feedの基礎情報を保有するクラスです
91+class Feed < AbstractEntry
92+ # 初期化メソッドです
93+ #
94+ # _hash_ :: 値を格納したhash配列。feed.new(CGI::Session.new(new CGI).params)のようにして使います。
95+ def initialize(hash)
96+ # 内部データ保持用のハッシュ配列です
97+ @attr = {}
98+
99+ # 内部データの項目名を格納する配列です
100+ @paramlist = ["feedattr", "title", "subtitle", "self", "url", "updated", "feedid", "rights", "aname", "amail", "others"]
101+
102+ # AbstractEntryのinitializeメソッドを呼び出し、値を@attr配列に格納します
103+ super(hash)
104+
105+ # 可視・不可視を示すハッシュキーを格納する配列です
106+ @display = {"feedattr" => "none", "title" => "", "subtitle" => "",
107+ "self" => "", "url" => "",
108+ "updated" => "none", "feedid" => "",
109+ "rights" => "", "aname" => "",
110+ "amail" => "", "others" => "none"}
111+
112+ # デバッグモードの場合、全ての入力要素を表示します
113+ if DEBUG == true
114+ @display.each do |key, val|
115+ @display[key] = ""
116+ end
117+ end
118+
119+ # ハッシュキーの日本語説明を格納する配列です
120+ @name = {"feedattr" => "feedの保持している属性", "title" => "ウェブページのタイトル", "subtitle" => "ウェブページの簡単な説明",
121+ "self" => "このXMLファイルのURL", "url" => "ウェブページのURL",
122+ "updated" => "XMLファイルの最終更新日", "feedid" => "あなたのページ独自のID",
123+ "rights" => "ページの著作権表記", "aname" => "ページの製作者",
124+ "amail" => "ページ製作者のメールアドレス", "others" => "その他の要素"}
125+
126+ end
127+
128+ # Atom XMLファイルを読み込んで解析し、等価なFeedオブジェクトを返却するメソッドです
129+ #
130+ # _path_ :: Atom XMLファイルのパス
131+ def self.readxml(path)
132+
133+ # ファイルを読み込みます
134+ doc = REXML::Document.new(myopen(path, "r:utf-8"){|f|f.read})
135+ xml = {}
136+ others = []
137+
138+ # Feedの属性値を取得します
139+ xmlattr = []
140+ doc.elements["feed"].attributes.each_attribute do |attr|
141+ xmlattr.push("#{attr.to_string} ")
142+ end
143+ xml[:feedattr] = xmlattr.join("\n").gsub(/"/, "'")
144+
145+ # XML解析部分です。各element毎に判定を行います
146+ doc.elements.each("feed") do |elm|
147+ elm.elements.each { |child|
148+ begin
149+ case child.name
150+ when "id"
151+ xml[:feedid] = child.text
152+ when "title", "subtitle", "updated", "rights"
153+ xml[child.name.to_sym] = child.text
154+ when "author"
155+ child.elements.each do |gchild|
156+ case gchild.name
157+ when "name"
158+ xml[:aname] = gchild.text
159+ when "email"
160+ xml[:amail] = gchild.text
161+ end
162+ end
163+ when "link"
164+ child.attributes.each do |k, v|
165+ if k == "rel"
166+ if v == "self"
167+ xml[:self] = child.attributes["href"]
168+ elsif v == "alternate"
169+ xml[:url] = child.attributes["href"]
170+ end
171+ end
172+ end
173+ when "entry"
174+ # Entry要素は無視します
175+ else
176+ # 上記判定以外の全要素は配列に格納します
177+ others.push(child.to_s)
178+ end
179+ rescue NoMethodError
180+ end
181+
182+ }
183+ end
184+
185+ # Others要素を結合して代入します
186+ xml[:others] = others.join("\n")
187+ feed = Feed.new(xml)
188+ return feed
189+ end
190+
191+ # 内部に保持している情報を、Atom Feed1.0形式の文字列に出力するメソッドです
192+ def to_s
193+ buf = []
194+
195+ # buf.push("<feed #{@attr[:feedattr]}>")
196+ buf.push("<feed xml:lang='ja-jp' xmlns='http://www.w3.org/2005/Atom'>");
197+ buf.push("<title type=\"text\">#{@attr[:title]}</title>")
198+ buf.push("<subtitle type=\"text\">#{@attr[:subtitle]}</subtitle>")
199+ buf.push("<link rel=\"self\" type=\"application/atom+xml\" href=\"#{@attr[:self]}\" />")
200+ buf.push("<link rel=\"alternate\" type=\"text/html\" href=\"#{@attr[:url]}\" />")
201+ buf.push("<updated>#{Time.now.iso8601}</updated>")
202+ buf.push("<id>#{@attr[:feedid]}</id>")
203+ buf.push("<rights type=\"text\">#{@attr[:rights]}</rights>")
204+ buf.push("<author>")
205+ buf.push("\t<name>#{@attr[:aname]}</name>")
206+ buf.push("\t<email>#{@attr[:amail]}</email>")
207+ buf.push("</author>")
208+ buf.push("#{CGI.unescapeHTML(@attr[:others])}") if @attr[:others] != ""
209+
210+ return buf.join("\n")
211+ end
212+
213+ # Feed情報更新メソッド
214+ def self.update(path, feed)
215+ entrylist = Entry.readxml(path)
216+ Feed.to_xml(path, feed, entrylist)
217+
218+ true
219+ end
220+
221+ # XMLファイル出力用メソッドです
222+ #
223+ # _feed_ :: Feedオブジェクト
224+ # _entry_ :: Entryオブジェクトの配列
225+ def self.to_xml(path, feed, entrylist_tmp)
226+ buf = []
227+ entrylist = entrylist_tmp.dup
228+ buf.push("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
229+ buf.push("#{feed.to_s}\n")
230+ entrylist.each { |entry|
231+ if REPLACEENTRYIDANDURL
232+ entry.entryid.gsub!(/^[^\?]*\?/, "")
233+ entry.entryid = feed.url + "?" + entry.entryid
234+ entry.url = feed.url + "#" + entry.entryid
235+ end
236+ buf.push("#{entry.to_s}\n")
237+ }
238+ buf.push("</feed>")
239+
240+ myopen(path, "w") do |f|
241+ f.print buf.join("\n")
242+ end
243+ end
244+
245+ # XMLファイル出力用メソッドです
246+ #
247+ # _feed_ :: Feedオブジェクト
248+ # _entry_ :: Entryオブジェクトの配列
249+ def self.to_xml_plain(path, feed, entrylist)
250+ buf = []
251+ buf.push("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
252+ buf.push("#{feed.to_s}\n")
253+ entrylist.each { |entry|
254+ buf.push("#{entry.to_s}\n")
255+ }
256+ buf.push("</feed>")
257+
258+ myopen(path, "w") do |f|
259+ f.print buf.join("\n")
260+ end
261+ end
262+
263+end
264+
265+# = Entryクラス
266+#
267+# Entryの基礎情報を保有するクラスです
268+class Entry < AbstractEntry
269+ # 初期化メソッドです
270+ #
271+ # _hash_ :: 値を格納したhash配列。entry.new(CGI::Session.new(new CGI).params)のようにして使います。
272+ def initialize(hash)
273+ # 内部データ保持用のハッシュ配列です
274+ @attr = {}
275+
276+ # 内部データの項目名を格納する配列です
277+ @paramlist = ["entryid", "title", "summary", "published", "updated", "url", "content", "others"]
278+
279+ # AbstractEntryのinitializeメソッドを呼び出し、値を@attr配列に格納します
280+ super(hash)
281+
282+ # 可視・不可視を示すハッシュキーを格納する配列です
283+ @display = {"entryid" => "none", "title" => "",
284+ "summary" => "", "published" => "none",
285+ "updated" => "none", "url" => "",
286+ "content" => "", "others"=>"none"}
287+
288+ # デバッグモードの場合、全ての入力要素を表示します
289+ if DEBUG == true
290+ @display.each do |key, val|
291+ @display[key] = ""
292+ end
293+ end
294+
295+ # ハッシュキーの日本語説明を格納する配列です
296+ @name = {"entryid" => "記事固有のID", "title" => "記事のタイトル",
297+ "summary" => "記事の簡単な説明", "published" => "記事の出版時刻",
298+ "updated" => "記事の更新時刻", "url" => "記事へのURLアドレス",
299+ "content" => "記事の本文", "others"=>"その他の項目"}
300+ end
301+
302+ # Atom XMLファイルを読み込んで解析し、等価なEntryオブジェクト配列を返却するメソッドです
303+ #
304+ # _path_ :: Atom XMLファイルのパス
305+ def self.readxml(path)
306+
307+ # ファイルを読み込みます
308+ doc = REXML::Document.new(myopen(path, "r:utf-8"){|f|f.read})
309+ entrylist = []
310+ xml = {}
311+
312+ # XML解析部分です。各element毎に判定を行います
313+ doc.elements.each("feed/entry") do |elm|
314+ xml = {}
315+ others = []
316+ elm.elements.each do |child|
317+ begin
318+ case child.name
319+ when "id"
320+ xml[:entryid] = child.text
321+ when "link"
322+ xml[:url] = child.attributes["href"]
323+ when "title", "summary", "summary", "published", "updated", "content"
324+ xml[child.name.to_sym] = child.text
325+ else
326+ # 上記判定以外の全要素は配列に格納します
327+ others.push(child.to_s)
328+ end
329+ rescue NoMethodError
330+ end
331+ end
332+ # Others要素を結合して代入します
333+ xml[:others] = others.join("\n")
334+ entrylist.push(Entry.new(xml))
335+ end
336+
337+ return entrylist
338+ end
339+
340+ # Atom XMLファイルを読み込んで解析し、テンプレートファイルにしたがってHTMLに変換するメソッドです
341+ def self.to_html(xmlpath, destpath, entry_temppath, html_temppath)
342+ # 引数チェック - 全必須
343+ if xmlpath.empty? or destpath.empty? or entry_temppath.empty? or html_temppath.empty?
344+ raise ArgumentError
345+ end
346+
347+ # 必須ファイル存在チェック
348+ unless File.exist?(xmlpath) and File.exist?(entry_temppath) and File.exist?(html_temppath)
349+ raise IOError
350+ end
351+
352+ # XML読み込み
353+ entrylist = Entry.readxml(xmlpath)
354+
355+ body = ''
356+ entrylist.each { |e|
357+ # Entry毎のHTML表示部分を生成
358+ body << e.to_template(entry_temppath)
359+ }
360+
361+ # HTML全体のテンプレートを生成
362+ html_temp = HtmlWriter.new(html_temppath, binding)
363+
364+ # HTMLに書き込み
365+ myopen(destpath, 'w:utf-8') { |f|
366+ f.write(CGI.pretty(html_temp.to_code))
367+ }
368+ end
369+
370+ # Entryをテンプレートに沿って変形するメソッド
371+ def to_template(temppath)
372+ erb = HtmlWriter.new(temppath, binding)
373+ title = CGI.unescapeHTML(@attr[:title])
374+ date = @attr[:published]
375+ content = CGI.unescapeHTML(@attr[:content])
376+ erb.to_code
377+ end
378+
379+ # Entry挿入メソッド
380+ def self.insert(path, entry)
381+ feed = Feed.readxml(path)
382+ entrylist = Entry.readxml(path)
383+ entrylist.unshift entry
384+
385+ Feed.to_xml(path, feed, entrylist)
386+
387+ true
388+ end
389+
390+ # Entry更新メソッド
391+ def self.update(path, entry)
392+ feed = Feed.readxml(path)
393+ entrylist = Entry.readxml(path)
394+
395+ successed = false
396+ entrylist.each_with_index { |e, i|
397+ if e.entryid == entry.entryid
398+ entrylist[i] = entry
399+ successed = true
400+ end
401+ }
402+ Feed.to_xml(path, feed, entrylist) if successed
403+
404+ successed
405+ end
406+
407+ # Entryロードメソッド
408+ def self.select(path, entryid)
409+ feed = Feed.readxml(path)
410+ entrylist = Entry.readxml(path)
411+
412+ entry = nil
413+ entrylist.each_with_index { |e, i|
414+ entry = entrylist[i].dup if e.entryid == entryid
415+ }
416+
417+ entry
418+ end
419+
420+ # Entry消去メソッド
421+ def self.delete(path, entryid)
422+ feed = Feed.readxml(path)
423+ entrylist = Entry.readxml(path)
424+
425+ successed = false
426+ delete_index = -1
427+ entrylist.each_with_index { |e, i|
428+ if e.entryid == entryid
429+ delete_index = i
430+ successed = true
431+ end
432+ }
433+
434+ if successed
435+ entrylist.delete_at delete_index
436+ Feed.to_xml(path, feed, entrylist)
437+ end
438+
439+ successed
440+ end
441+
442+ # データソースから読み取ったHTMLを、エディタで編集可能な形式に変換するメソッドです
443+ def content_for_generator
444+ str = @attr[:content].dup
445+ str.strip!
446+ str.gsub!(/(&lt;\/(?:p|h\d|div)(?:&gt;|>))\n/i, '\1')
447+ str.gsub!(/\n/, '&lt;br&gt;') if REPLACEBRTAG
448+ str.gsub!(/(&lt;(?:(?!&gt;).)*?)#{Regexp.escape(RELAYPATH)}/) { "#$1#{HOMEBASE}" }
449+ str
450+ end
451+
452+ # エディタで編集されたCONTENT要素を、データソースに書き込める形式に変換するメソッドです
453+ def content_for_blog
454+ str = @attr[:content].dup
455+ str = CGI.unescapeHTML(str)
456+ str.strip!
457+ str.gsub!(/(\r\n|\n)/, "")
458+ str.gsub!(/<br>|<br[ ]*\/>/i, "\n") if REPLACEBRTAG
459+ str.gsub!(/(<br>|<br[ ]*\/>|<\/p>|<\/h\d>|<\/div>)(?=[^\n])/i) { "#$1\n" } unless REPLACEBRTAG
460+ str.gsub!(/(<[^>]*?)#{Regexp.escape(HOMEBASE)}/) { "#$1#{RELAYPATH}" }
461+ CGI.escapeHTML(str)
462+ end
463+
464+ # 確認画面で表示されるCONTENT要素を生成するメソッドです
465+ def content_for_view
466+ str = @attr[:content].dup
467+ str = CGI.unescapeHTML(str)
468+ str.strip!
469+ str.gsub!(/<br>|<br[ ]*\/>/i, "\n") if REPLACEBRTAG
470+ str.gsub!(/(<[^>]*?)#{Regexp.escape(RELAYPATH)}/) { "#$1#{HOMEBASE}" }
471+ str
472+ end
473+
474+ # 内部に保持している情報を、Atom Feed1.0形式の文字列に出力するメソッドです
475+ def to_s
476+ buf = []
477+ buf.push("<entry>")
478+ buf.push("<id>#{@attr[:entryid]}</id>")
479+ buf.push("<title>#{@attr[:title]}</title>")
480+ buf.push("<summary>#{@attr[:summary]}</summary>")
481+ buf.push("<published>#{@attr[:published]}</published>")
482+ buf.push("<updated>#{@attr[:updated]}</updated>")
483+ buf.push("<link href=\"#{@attr[:url]}\" />")
484+ buf.push("<content type=\"html\">#{@attr[:content]}</content>")
485+ buf.push("#{CGI.unescapeHTML(@attr[:others])}") if @attr[:others] != ""
486+ buf.push("</entry>")
487+
488+ return buf.join("\n")
489+ end
490+end
491+
492+# = LogListクラス
493+#
494+# loglist.xmlにかかわる入出力を行います
495+class LogList
496+ # 初期化メソッドです
497+ #
498+ # _display_ :: 画面表示用文字の配列
499+ # _path_ :: XMLファイルパスの配列
500+ # _logpath_ :: loglist.xmlのパス
501+ def initialize(display, path, logpath)
502+ @display = display
503+ @path = path
504+ @logpath = logpath
505+ end
506+
507+ attr_accessor :display, :path, :logpath
508+
509+ # loglist.xmlファイルを読み込んで解析し、LogListオブジェクトを返却するメソッドです
510+ #
511+ # _logpath_ :: loglist.xmlへのパス
512+ def LogList.readxml(logpath)
513+
514+ # ファイルを読み込みます
515+ lines = []
516+ myopen(logpath, "r:utf-8") { |f|
517+ lines = f.readlines
518+ }
519+
520+ doc = REXML::Document.new(lines.join("\n"))
521+ @display = []
522+ @path = []
523+
524+ doc.elements.each("list/file") { |elm|
525+ elm.elements.each {|child|
526+ case child.name
527+ when "display"
528+ @display.push(child.text)
529+ when "path"
530+ @path.push(child.text)
531+ else
532+ # With no action
533+ end
534+ }
535+ }
536+
537+ return LogList.new(@display, @path, logpath)
538+ end
539+
540+ # loglist.xmlにオブジェクトの内容を反映するメソッドです
541+ def to_xml
542+ buf = []
543+ buf.push("<list>")
544+ path.each_with_index do |path, i|
545+ buf.push("<file>")
546+ buf.push("<display>#{@display[i]}</display>")
547+ buf.push("<path>#{@path[i]}</path>")
548+ buf.push("</file>")
549+ end
550+ buf.push("</list>")
551+
552+ myopen(@logpath, "w") do |f|
553+ f.print buf.join("\n")
554+ end
555+ end
556+
557+end
558+
559+# = FileUploaderクラス
560+#
561+# 画像の管理を行うクラスです
562+class FileUploader
563+ # 初期化メソッドです
564+ def initialize
565+ end
566+
567+ # ファイルの一覧を取得し、ファイル名称を格納した配列を返却します
568+ def filelist
569+ arr = Dir::entries(XMLPATH).sort
570+ arr.delete(".")
571+ arr.delete("..")
572+
573+ return arr
574+ end
575+
576+ # ファイルの消去を実行します
577+ #
578+ # _name_ :: 消去するファイル名
579+ def delete(name)
580+ File.delete(XMLPATH + name.match(/[^\/]*?$/).to_a[0])
581+ end
582+
583+ # ファイルのアップロードを実行します
584+ #
585+ # _name_ :: アップロードファイルの名称
586+ # _img_ :: アップロードファイル
587+ def upload(name, img)
588+ open(XMLPATH + File.basename(name), "w") do |f|
589+ f.binmode
590+ f.write img
591+ end
592+ end
593+end
594+
595+# = Pluginクラス
596+#
597+# プラグインの処理を行うクラスです
598+class FeedGenPluginManager
599+ def self.exec(mode, filepath)
600+ feed = Feed.readxml(XMLPATH + filepath)
601+ entries = Entry.readxml(XMLPATH + filepath)
602+ feed.freeze
603+ entries.freeze
604+ Dir.foreach(PLUGINDIR) do |fn|
605+ next unless File.extname(fn) == '.rb'
606+ require File.join(PLUGINDIR, fn)
607+ plugin_name = "FeedGenPlugins::"
608+ plugin_name << File.basename(fn).gsub(/\.rb\Z/, "")
609+ plugin_ins = plugin_name.split(/::/).inject(Object) { |c,name| c.const_get(name) }
610+ plugin_ins.new.exec(mode, feed, entries)
611+ end
612+ end
613+end
614+
615+# = Controllerクラス
616+#
617+# コントローラ部分に相当する処理を受け持つクラスです
618+class Controller
619+ def Controller.NormalForm(cgi, session, params, db)
620+ db.transaction do
621+ # modeとactionの相関図は以下のようになります。
622+ # [mode] + [action]
623+ # + [action]
624+ # + [action]
625+ # + ... and more
626+ case params["mode"]
627+ # ログ選択画面
628+ when "logselect"
629+ session["filepath"] = params["logpath"]
630+ db["loglist"] = LogList.readxml(LISTXMLPATH)
631+ # 初期状態で選択されるログは「loglist.xml」の最上に位置するログになります
632+ session["filepath"] = db["loglist"].path[0] if session["filepath"] == nil
633+ db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
634+ db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
635+
636+ # 新規記事追加部分
637+ when "newentry"
638+ case params["action"]
639+ # 確認画面
640+ when "confirm"
641+ session["target_filepath"] = params["target_filepath"]
642+ db["newentry"] = Entry.new(params)
643+ db["newentry"].content = db["newentry"].content_for_blog
644+ # 記事の追記を実際にファイルに反映
645+ when "exec"
646+ session["target_filepath"] = params["target_filepath"]
647+ successed = Entry.insert(XMLPATH + File.basename(params["target_filepath"]), Entry.new(params))
648+ unless successed
649+ session["error"] = "記事の新規追加に失敗しました。"
650+ params["mode"] = "error"
651+ else
652+ # 成功時はプラグイン処理を実施する
653+ FeedGenPluginManager.exec("newentry", File.basename(session["filepath"]))
654+ session["info"] = "記事の新規作成が成功しました。"
655+ end
656+ # 画面を戻った際の処理
657+ when "back"
658+ session["target_filepath"] = params["target_filepath"]
659+ db["newentry"] = Entry.new(params)
660+ else
661+ # New Diary - Default
662+ session["target_filepath"] = session["filepath"]
663+ db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
664+ db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
665+ end
666+
667+ # 記事編集部分
668+ when "editentry"
669+ case params["action"]
670+ # 編集画面
671+ when "edit"
672+ session["target_filepath"] = params["target_filepath"]
673+ session["editid"] = cgi["editid"].to_s
674+ db["editentry"] = Entry.select(XMLPATH + File.basename(session["target_filepath"]), session["editid"])
675+ # 確認画面
676+ when "confirm"
677+ session["target_filepath"] = params["target_filepath"]
678+ session["editid"] = cgi["editid"].to_s
679+ db["editentry"] = Entry.new(params)
680+ db["editentry"].content = db["editentry"].content_for_blog
681+ # 記事の変更を実際にファイルに反映
682+ when "exec"
683+ session["target_filepath"] = params["target_filepath"]
684+ successed = Entry.update(XMLPATH + File.basename(params["target_filepath"]), Entry.new(params))
685+ unless successed
686+ session["error"] = "記事の編集処理に失敗しました。該当の日記が既に存在しない可能性があります。"
687+ params["mode"] = "error"
688+ else
689+ # 成功時はプラグイン処理を実施する
690+ FeedGenPluginManager.exec("editentry", File.basename(session["filepath"]))
691+ session["info"] = "記事の編集が完了しました。"
692+
693+ # 一覧を更新後の内容で更新する。
694+ session["target_filepath"] = session["filepath"]
695+ db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
696+ db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
697+ end
698+ when "back"
699+ session["target_filepath"] = params["target_filepath"]
700+ db["editentry"] = Entry.new(params)
701+ else
702+ # Edit Diary - Default
703+ session["target_filepath"] = session["filepath"]
704+ db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
705+ db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
706+ end
707+
708+ # 記事削除部分
709+ when "delentry"
710+ case params["action"]
711+ # 確認画面
712+ when "confirm"
713+ session["target_filepath"] = params["target_filepath"]
714+ session["delid"] = cgi["delid"].to_s
715+ db["delentry"] = Entry.select(XMLPATH + File.basename(session["target_filepath"]), session["delid"])
716+ # 記事の削除を実際にファイルに反映
717+ when "exec"
718+ session["target_filepath"] = params["target_filepath"]
719+ successed = Entry.delete(XMLPATH + File.basename(params["target_filepath"]), cgi["delid"].to_s)
720+ unless successed
721+ session["error"] = "日記の編集処理に失敗しました。該当の日記が既に存在しない可能性があります。"
722+ params["mode"] = "error"
723+ else
724+ # 成功時はプラグイン処理を実施する
725+ FeedGenPluginManager.exec("delentry", File.basename(session["filepath"]))
726+ session["info"] = "記事の削除に成功しました。"
727+
728+ # 内容を更新する
729+ session["target_filepath"] = session["filepath"]
730+ db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
731+ db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
732+ end
733+ when "back"
734+ session["target_filepath"] = params["target_filepath"]
735+ db["feed"] = Feed.readxml(XMLPATH + File.basename(session["target_filepath"]))
736+ db["entry"] = Entry.readxml(XMLPATH + File.basename(session["target_filepath"]))
737+ else
738+ # Delete Diary - Default
739+ session["target_filepath"] = session["filepath"]
740+ db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
741+ db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
742+ end
743+
744+ # Feed情報変更部分
745+ when "editfeed"
746+ case params["action"]
747+ # 確認画面
748+ when "confirm"
749+ session["target_filepath"] = params["target_filepath"]
750+ db["feed"] = Feed.new(params)
751+ # 実際にFeed情報の変更をファイルに反映
752+ when "back"
753+ session["target_filepath"] = params["target_filepath"]
754+ db["feed"] = Feed.new(params)
755+ when "exec"
756+ session["target_filepath"] = params["target_filepath"]
757+ Feed.update(XMLPATH + File.basename(params["target_filepath"]), Feed.new(params))
758+ session["info"] = "基本情報の更新が完了しました。"
759+ else
760+ session["target_filepath"] = session["filepath"]
761+ db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
762+ end
763+
764+ # ログ編集モード
765+ when "log"
766+ # 必ず内部データをリフレッシュする
767+ db["loglist"] = LogList.readxml(LISTXMLPATH)
768+ case params["action"]
769+ # ログファイルの編集を実際にファイルに反映
770+ when "addexec"
771+ # エラーチェック。この段階のエラーは強度のエラーを発する。
772+ db["loglist"].path.each do |val|
773+ if val == cgi["logpath"]
774+ # 重複していた場合エラーメッセージを表示し、処理を行わない
775+ params["action"] = ""
776+ params["mode"] = "error"
777+ session["error"] = "ログファイルの追加中に重大なエラーが発生しました。環境を見直してください。"
778+ return
779+ end
780+ end
781+
782+ # 入力された内容を保持する配列に追加
783+ db["loglist"].path[1, 0] = cgi["logpath"]
784+ db["loglist"].display[1, 0] = cgi["logdisplay"]
785+ db["loglist"].to_xml
786+ # 既存のdiary.xmlを指定された名称でコピーして保存
787+ FileUtils.copy_file(XMLPATH + File.basename(db["loglist"].path[0]), XMLPATH + File.basename(db["logpath"]), true)
788+ # 保持している情報を更新する
789+ db["loglist"] = LogList.readxml(LISTXMLPATH)
790+ db["entry"] = []
791+ # 新たなdiary.xmlを生成。この際保持する情報は同一のFeedオブジェクトnew()
792+ Feed.to_xml(XMLPATH + File.basename(db["loglist"].path[0]), db["feed"], [])
793+
794+ session["info"] = "ログファイルの追加が完了しました。"
795+
796+ # 現在編集中のデータを強制的に最上のファイルパスに変更
797+ session["filepath"] = db["loglist"].path[0]
798+
799+ # 前月の時刻を作成します
800+ prevmonth = (DateTime.now << 1)
801+
802+ # 前月の時刻を元に、ディフォルト書式を生成します
803+ db["logpath"] = FEEDXMLDIR + prevmonth.strftime("%Y%m") + ".xml"
804+ db["logdisplay"] = prevmonth.strftime("%Y年%m月").gsub("年0", "年")
805+
806+ # 確認画面
807+ when "addconfirm"
808+ # 入力されたログが既に存在するかを確認
809+ db["loglist"].path.each do |val|
810+ if val == cgi["logpath"]
811+ # 重複していた場合エラーメッセージを表示し、処理を行わない
812+ params["action"] = ""
813+ session["error"] = "同一のファイルが存在します!別の名前を指定してください。"
814+ return
815+ end
816+ end
817+
818+ db["logpath"] = cgi["logpath"]
819+ db["logdisplay"] = cgi["logdisplay"]
820+
821+ if db["logpath"].blank? || db["logdisplay"].blank?
822+ params["action"] = ""
823+ end
824+
825+ when "back"
826+
827+ # 削除確認画面
828+ when "delconfirm"
829+ db["logdelindex"] = params["logdelindex"].to_i
830+
831+ if db["logdelindex"] < 1
832+ session["error"] = "ログファイルの削除パラメタが不正です。"
833+ params["action"] = ""
834+ end
835+
836+ # 削除処理
837+ when "delexec"
838+ if cgi["logdelindex"].to_i < 1
839+ params["action"] = ""
840+ params["mode"] = "error"
841+ session["error"] = "ログファイルの削除中に重大なエラーが発生しました。環境を見直してください。"
842+ return
843+ else
844+ # 記事ファイルを削除します
845+ File.delete(XMLPATH + File.basename(db["loglist"].path[db["logdelindex"]]))
846+ # ログリストから削除します
847+ db["loglist"].path.delete_at(cgi["logdelindex"].to_i)
848+ db["loglist"].display.delete_at(cgi["logdelindex"].to_i)
849+ db["loglist"].to_xml
850+ # 保持している情報を更新する
851+ db["loglist"] = LogList.readxml(LISTXMLPATH)
852+ db["entry"] = []
853+
854+ session["info"] = "ログファイルの削除が完了しました。"
855+
856+ # 現在編集中のデータを強制的に最上のファイルパスに変更
857+ session["filepath"] = db["loglist"].path[0]
858+
859+ # 前月の時刻を作成します
860+ prevmonth = (DateTime.now << 1)
861+
862+ # 前月の時刻を元に、ディフォルト書式を生成します
863+ db["logpath"] = FEEDXMLDIR + prevmonth.strftime("%Y%m") + ".xml"
864+ db["logdisplay"] = prevmonth.strftime("%Y年%m月").gsub("年0", "年")
865+ end
866+
867+ # 編集画面
868+ when "edit"
869+ db["logeditindex"] = params["logdelindex"].to_i
870+
871+ db["logpath"] = db["loglist"].path[db["logeditindex"]]
872+ db["logdisplay"] = db["loglist"].display[db["logeditindex"]]
873+
874+ if db["logeditindex"] == 0
875+ session["error"] = "ログファイルの編集パラメタが不正です。"
876+ params["action"] = ""
877+ end
878+
879+ # 編集確認画面
880+ when "editconfirm"
881+ checkflag = true
882+ db["loglist"].path.each_with_index do |val, i|
883+ if db["logeditindex"] != i
884+ if params["logpath"].to_s == db["loglist"].path[i].to_s
885+ checkflag = false
886+ end
887+ end
888+ end
889+
890+ if checkflag == false
891+ params["action"] = "edit"
892+ session["error"] = "同一のファイルが存在します!別の名前を指定してください。"
893+ else
894+ db["loginsertindex"] = params["loginsertindex"].to_i
895+
896+ db["logpath"] = params["logpath"].to_s
897+ db["logdisplay"] = params["logdisplay"].to_s
898+ end
899+
900+ # 編集実行
901+ when "editexec"
902+ checkflag = true
903+ db["loglist"].path.each_with_index do |val, i|
904+ if db["logeditindex"] != i
905+ if params["logpath"].to_s == db["loglist"].path[i].to_s
906+ checkflag = false
907+ end
908+ end
909+ end
910+
911+ if checkflag == false
912+ params["action"] = ""
913+ params["mode"] = "error"
914+ session["error"] = "ログファイルの編集中に重大なエラーが発生しました。環境を見直してください。"
915+ return
916+ else
917+ db["loginsertindex"] = params["loginsertindex"].to_i
918+
919+ db["logpath"] = params["logpath"].to_s
920+ db["logdisplay"] = params["logdisplay"].to_s
921+
922+ # ファイルを移動します
923+ if XMLPATH + File.basename(db["loglist"].path[db["logeditindex"]]) != XMLPATH + File.basename(db["logpath"])
924+ FileUtils.move(XMLPATH + File.basename(db["loglist"].path[db["logeditindex"]]), XMLPATH + File.basename(db["logpath"]))
925+ # ログリストを更新します
926+ db["loglist"].path.delete_at(db["logeditindex"])
927+ db["loglist"].display.delete_at(db["logeditindex"])
928+ db["loglist"].path.insert(db["loginsertindex"] + 1, db["logpath"])
929+ db["loglist"].display.insert(db["loginsertindex"] + 1, db["logdisplay"])
930+ db["loglist"].to_xml
931+ end
932+
933+ session["info"] = "ログファイルの編集が完了しました。"
934+
935+ # 現在編集中のデータを強制的に最上のファイルパスに変更
936+ session["filepath"] = db["loglist"].path[0]
937+
938+ # 前月の時刻を作成します
939+ prevmonth = (DateTime.now << 1)
940+
941+ # 前月の時刻を元に、ディフォルト書式を生成します
942+ db["logpath"] = FEEDXMLDIR + prevmonth.strftime("%Y%m") + ".xml"
943+ db["logdisplay"] = prevmonth.strftime("%Y年%m月").gsub("年0", "年")
944+ end
945+
946+ # 初期表示画面
947+ else
948+ # 現在編集中のデータを強制的に最上のファイルパスに変更
949+ session["filepath"] = db["loglist"].path[0]
950+
951+ # 前月の時刻を作成します
952+ prevmonth = (DateTime.now << 1)
953+
954+ # 前月の時刻を元に、ディフォルト書式を生成します
955+ db["logpath"] = FEEDXMLDIR + prevmonth.strftime("%Y%m") + ".xml"
956+ db["logdisplay"] = prevmonth.strftime("%Y年%m月").gsub("年0", "年")
957+ end
958+
959+ # インポートモードの場合の処理
960+ when "import"
961+ db["loglist"] = LogList.readxml(LISTXMLPATH)
962+
963+ # リセットモードの場合の処理
964+ when "reset"
965+ case params["action"]
966+ # リセット実行時の処理
967+ when "exec"
968+ file = FileUploader.new
969+ file.filelist().each { |fname|
970+ file.delete(fname) if File.ftype(XMLPATH + fname) == "file"
971+ }
972+
973+ # 全ファイルの初期化を実行する
974+ # loglist.xmlの初期化
975+ loglist = LogList.new(["最新の記事"], ["#{FEEDXMLDIR}#{INITIALXML}"], LISTXMLPATH)
976+ loglist.to_xml
977+
978+ db["loglist"] = LogList.readxml(LISTXMLPATH)
979+
980+ # diary.xmlの初期化
981+ Feed.to_xml(XMLPATH + db["loglist"].path[0].match(/[^\/]*?$/).to_a[0], Feed.new({}), [])
982+
983+ # 初期の編集ファイルはloglist.xml上の最も上のファイル
984+ session["filepath"] = db["loglist"].path[0]
985+ db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
986+ db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
987+
988+ # 画面の遷移先をトップページにする
989+ params["mode"] = ""
990+ params["action"] = ""
991+ # パラメタ無しの処理
992+ else
993+ # ファイル一覧を取得する
994+ filelist = FileUploader.new.filelist()
995+
996+ # タイプがファイルのみリストとして取得する
997+ db["filelist"] = []
998+ filelist.each { |fname| db["filelist"] << fname if File.ftype(XMLPATH + fname) == "file"}
999+ end
1000+
1001+ # ログイン時の画面
1002+ else
1003+ # loglist.xmlが存在するかチェック
1004+ if File.exist?(LISTXMLPATH) == false
1005+ # なかった場合はloglist.xmlを自動生成
1006+ loglist = LogList.new(["最新の記事"], ["#{FEEDXMLDIR}#{INITIALXML}"], LISTXMLPATH)
1007+ loglist.to_xml
1008+ Feed.to_xml(XMLPATH + File.basename(loglist.path[0]), Feed.new({}), [])
1009+ end
1010+
1011+ db["loglist"] = LogList.readxml(LISTXMLPATH)
1012+
1013+ # diary.xmlが存在するかチェック
1014+ if File.exist?(XMLPATH + File.basename(db["loglist"].path[0])) == false
1015+ # なかった場合はdiary.xmlを自動生成
1016+ Feed.to_xml(XMLPATH + File.basename(db["loglist"].path[0]), Feed.new({}), [])
1017+ end
1018+
1019+ # 初期の編集ファイルはloglist.xml上の最も上のファイル
1020+ session["filepath"] = db["loglist"].path[0] if session["filepath"] == nil
1021+ db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
1022+ db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
1023+ end
1024+ end
1025+ end
1026+
1027+ # マルチパートフォームの場合の処理です
1028+ def Controller.MultiForm(cgi, session, params, db)
1029+ db.transaction do
1030+ # loglist.xmlをロードします
1031+ db["loglist"] = LogList.readxml(LISTXMLPATH)
1032+ case params["mode"]
1033+ # 特定位置に挿入する場合の処理
1034+ when "insert"
1035+ case params["action"]
1036+ when "exec"
1037+ # この段階のエラーに対しては強度のエラーを発する
1038+ checkflag = true
1039+ db["logpath"] = Controller.get_mpart_value(cgi["logpath"])
1040+ db["loglist"].path.each do |val|
1041+ if val == db["logpath"]
1042+ # 重複していた場合エラーメッセージを表示し、処理を行わない
1043+ db["logpath"] = ""
1044+ params["action"] = ""
1045+ params["mode"] = "error"
1046+ session["error"] = "ログファイルの追加中に重大なエラーが発生しました。"
1047+ return
1048+ end
1049+ end
1050+
1051+ db["loginsertindex"] = cgi["loginsertindex"].read.to_i
1052+ db["logdisplay"] = Controller.get_mpart_value(cgi["logdisplay"])
1053+
1054+ # 0位置への挿入防止
1055+ if db["loginsertindex"] == 0
1056+ params["action"] = ""
1057+ params["mode"] = "error"
1058+ session["error"] = "ログファイルの追加中に重大なエラーが発生しました。"
1059+ return
1060+ end
1061+
1062+ if File.basename(db["logpath"]).blank? || db["logdisplay"].blank?
1063+ params["action"] = ""
1064+ params["mode"] = "error"
1065+ session["error"] = "ログファイルの追加中に重大なエラーが発生しました。"
1066+ return
1067+ end
1068+
1069+ # ファイルを実際にアップロードします
1070+ file = FileUploader.new
1071+ file.upload(db["logpath"], db["importxml"])
1072+
1073+ # loglist.xmlを更新します
1074+ db["loglist"].path[db["loginsertindex"], 0] = db["logpath"]
1075+ db["loglist"].display[db["loginsertindex"], 0] = db["logdisplay"]
1076+ db["loglist"].to_xml
1077+
1078+ # 情報を更新します
1079+ db["loglist"] = LogList.readxml(LISTXMLPATH)
1080+ session["filepath"] = db["loglist"].path[0] if session["filepath"] == nil
1081+ db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
1082+ db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
1083+
1084+ session["info"] = "ログファイルのインポート処理が完了しました。"
1085+
1086+ when "confirm"
1087+ # 入力されたログファイルパスが既に存在するかを確認
1088+ checkflag = true
1089+ db["logpath"] = Controller.get_mpart_value(cgi["logpath"])
1090+ db["loglist"].path.each do |val|
1091+ if val == db["logpath"]
1092+ # 重複していた場合エラーメッセージを表示し、処理を行わない
1093+ db["logpath"] = ""
1094+ params["action"] = ""
1095+ session["error"] = "同一のファイルが存在します!別の名前を指定してください。"
1096+ checkflag = false
1097+ return
1098+ end
1099+ end
1100+
1101+ if checkflag
1102+ db["loginsertindex"] = cgi["loginsertindex"].read.to_i
1103+ db["logdisplay"] = Controller.get_mpart_value(cgi["logdisplay"])
1104+ db["importxml"] = cgi["updata"].read
1105+
1106+ # XMLの整合性をチェックします
1107+ begin
1108+ REXML::Document.new(Controller.fix_updata_enc(db["importxml"].to_s))
1109+ rescue => exception
1110+ session["error"] = "不正な整形のXMLです!ファイルを見直してください。<br>"
1111+ session["error"] << CGI.escapeHTML(exception.to_s).gsub("\n", "<br>")
1112+ params["action"] = ""
1113+ return
1114+ end
1115+ end
1116+
1117+ # 0位置への挿入防止
1118+ if db["loginsertindex"] == 0
1119+ params["action"] = ""
1120+ session["error"] = "ラジオボックスでログの挿入位置を選択してください!"
1121+ return
1122+ end
1123+
1124+ if db["logpath"] == FEEDXMLDIR || db["logdisplay"].blank?
1125+ params["action"] = ""
1126+ session["error"] = "インポートファイル、及び、ログの表示名は空欄にできません。"
1127+ return
1128+ end
1129+
1130+ else
1131+ end
1132+
1133+ # diary.xmlを入れ替える処理
1134+ when "replace"
1135+ case params["action"]
1136+ when "exec"
1137+ # この段階のエラーに対しては強度のエラーを発する
1138+ checkflag = true
1139+ db["logpath"] = Controller.get_mpart_value(cgi["logpath"])
1140+ db["loglist"].path.each do |val|
1141+ if val == db["logpath"]
1142+ # 重複していた場合エラーメッセージを表示し、処理を行わない
1143+ params["action"] = ""
1144+ params["mode"] = "error"
1145+ session["error"] = "ログファイルの追加中に重大なエラーが発生しました。"
1146+ return
1147+ end
1148+ end
1149+
1150+ db["logdisplay"] = Controller.get_mpart_value(cgi["logdisplay"])
1151+
1152+ if File.basename(db["logpath"]).blank? || db["logdisplay"].blank? || db["importxml"].blank?
1153+ params["action"] = ""
1154+ params["mode"] = "error"
1155+ session["error"] = "ログファイルの追加中に重大なエラーが発生しました。"
1156+ return
1157+ end
1158+
1159+ # diary.xmlを移動します
1160+ FileUtils.move(XMLPATH + INITIALXML, XMLPATH + File.basename(db["logpath"]))
1161+ # ファイルをアップロードします
1162+ file = FileUploader.new
1163+ file.upload(INITIALXML, db["importxml"])
1164+
1165+ # loglist.xmlを更新します
1166+ db["loglist"].path[1, 0] = db["logpath"]
1167+ db["loglist"].display[1, 0] = db["logdisplay"]
1168+ db["loglist"].to_xml
1169+
1170+ # 情報を更新します
1171+ db["loglist"] = LogList.readxml(LISTXMLPATH)
1172+ session["filepath"] = db["loglist"].path[0] if session["filepath"] == nil
1173+ db["feed"] = Feed.readxml(XMLPATH + File.basename(session["filepath"]))
1174+ db["entry"] = Entry.readxml(XMLPATH + File.basename(session["filepath"]))
1175+
1176+ session["info"] = "ログファイルのインポート処理が完了しました。"
1177+
1178+ when "confirm"
1179+ # 入力されたログファイルパスが既に存在するかを確認
1180+ checkflag = true
1181+ db["logpath"] = Controller.get_mpart_value(cgi["logpath"])
1182+ db["loglist"].path.each do |val|
1183+ if val == db["logpath"]
1184+ # 重複していた場合エラーメッセージを表示し、処理を行わない
1185+ params["action"] = ""
1186+ session["error"] = "同一のファイルが存在します!別の名前を指定してください。"
1187+ checkflag = false
1188+ return
1189+ end
1190+ end
1191+
1192+ if checkflag == true
1193+ db["logdisplay"] = Controller.get_mpart_value(cgi["logdisplay"])
1194+ db["importxml"] = cgi["updata"].read
1195+
1196+ # XMLの整合性をチェックします
1197+ begin
1198+ REXML::Document.new(Controller.fix_updata_enc(db["importxml"].to_s))
1199+ rescue => exception
1200+ session["error"] = "不正な整形のXMLです!ファイルを見直してください。<br>"
1201+ session["error"] << CGI.escapeHTML(exception.to_s).gsub("\n", "<br>")
1202+ params["action"] = ""
1203+ return
1204+ end
1205+ end
1206+
1207+ if db["logpath"].blank? || db["logdisplay"].blank? || db["importxml"].blank?
1208+ params["action"] = ""
1209+ session["error"] = "インポートファイル、及び、ログの表示名、ログのパスは空欄にできません。"
1210+ return
1211+ end
1212+
1213+ else
1214+ end
1215+
1216+ else
1217+ end
1218+ end
1219+ end
1220+
1221+ # Formのenctypeがmultypartだった場合、入力された値をrubyバージョンに左右されずに読み取るメソッドです。
1222+ def Controller.get_mpart_value(cgi_param)
1223+ if RUBY_VERSION >= "1.9.0"
1224+ cgi_param[0..cgi_param.length].to_s
1225+ else
1226+ cgi_param.read.to_s
1227+ end
1228+ end
1229+
1230+ # アップロードされたXMLをバージョンに左右されずに読み取るために、ruby-1.9.1以上ではエンコーディングを強制指定します
1231+ def Controller.fix_updata_enc(file_to_s)
1232+ if RUBY_VERSION >= "1.9.0"
1233+ file_to_s.force_encoding("UTF-8")
1234+ else
1235+ file_to_s
1236+ end
1237+ end
1238+
1239+end
1240+
1241+def main
1242+ # SESSION変数、パラメータなどを取得します
1243+ cgi = CGI.new
1244+ session = CGI::Session.new(cgi)
1245+ params = Hash[*cgi.params.to_a.map{|k, v| [k, v[0].to_s]}.flatten]
1246+
1247+ # ロガーを作成する
1248+ logger = WebLogger.get_logger(cgi.script_name, LOG_DIR, LOG_RELEASE_MODE)
1249+
1250+ # コントローラー部分
1251+ # セッション管理
1252+ session["info"] = ""
1253+ session["error"] = ""
1254+ if session["login"] != "true"
1255+
1256+ # ログイン情報を確認
1257+ LOGININFO.each {|h|
1258+ if (cgi["loginid"] == h[:id] && cgi["password"] == h[:password])
1259+ session["login"] = "true"
1260+ session["name"] = h[:name]
1261+
1262+ # ログを記録
1263+ logger.info "ログインユーザ:#{h[:id]}, IPアドレス:#{cgi.remote_addr}"
1264+
1265+ break
1266+ end
1267+ }
1268+
1269+ if (session["login"] == "true")
1270+ # ワークフォルダの中をクリーンアップします
1271+ filelist = Dir::entries("./work")
1272+ # 削除条件 : 最終変更日時から1日(60*60*24sec)かつ、ファイルタイプがファイルの場合
1273+ filelist.each do |file|
1274+ File.delete("./work/#{file}") if Time.now - File.ctime("./work/#{file}") > 86400 && File.ftype("./work/#{file}") == "file"
1275+ end
1276+ end
1277+
1278+ # ログイン失敗ユーザを記録
1279+ if (session["login"] != "true" and (cgi["loginid"] != "" or cgi["password"] != ""))
1280+ logger.info "次のアクセスがログインに失敗しました。ログインユーザ:#{cgi["loginid"]}, IPアドレス:#{cgi.remote_addr}"
1281+ end
1282+ end
1283+
1284+ # ログアウト処理
1285+ if params["mode"] == "logout"
1286+ session["login"] = nil
1287+ session.delete
1288+ end
1289+
1290+ begin
1291+ # メインコントローラー
1292+ # セッションが有効な場合のも実行します
1293+ if session["login"] == "true"
1294+ # PStore破損チェック!
1295+ begin
1296+ db = PStore.new("./work/#{session.session_id}.dat")
1297+ db.transaction do
1298+ session["error"] = ""
1299+ end
1300+ rescue
1301+ # PStoreファイルを破棄する
1302+ File.delete("./work/#{session.session_id}.dat")
1303+ # PStoreが破損していた場合はセッション情報を破棄する
1304+ session["login"] = nil
1305+ session.delete
1306+ end
1307+
1308+ # フォームによって挙動を変更します
1309+ if cgi["mode"].respond_to?(:read) && cgi["action"].respond_to?(:read)
1310+ params["mode"] = cgi["mode"].read
1311+ params["action"] = cgi["action"].read
1312+ Controller.MultiForm(cgi, session, params, db)
1313+ else
1314+ Controller.NormalForm(cgi, session, params, db)
1315+ end
1316+
1317+ # エラー画面移行時はセッション情報を破棄する
1318+ if params["mode"] == "error"
1319+ session["login"] = nil
1320+ session.delete
1321+ end
1322+ end
1323+
1324+ # ログイン失敗ユーザを記録
1325+ if (session["login"] != "true" and (cgi["loginid"] != "" or cgi["password"] != ""))
1326+ session["error"] = "ログインに失敗しました。ユーザIDまたはパスワードを確認して下さい。"
1327+ logger.info "次のアクセスがログインに失敗しました。ログインID:#{cgi["loginid"]}, IPアドレス:#{cgi.remote_addr}"
1328+ end
1329+
1330+ # メニューとして表示されるHTML文字列です
1331+ if params["target_filepath"].blank?
1332+ menu = "<div class=\"divstyle\" style=\"width: #{TABLEWIDTH}px;\"><div class=\"divstyle\" align=\"center\" style=\"margin-bottom: 5px;\">現在編集中のファイル : #{session["filepath"]} "
1333+ else
1334+ menu = "<div class=\"divstyle\" style=\"width: #{TABLEWIDTH}px;\"><div class=\"divstyle\" align=\"center\" style=\"margin-bottom: 5px;\">現在編集中のファイル : #{session["target_filepath"]} "
1335+ end
1336+ if USEFILEMANAGER == true
1337+ 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>"
1338+ else
1339+ 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>"
1340+ end
1341+
1342+ # ビュー部分
1343+ # modeとactionの相関図は以下のようになります。
1344+ # [mode] + [action]
1345+ # + [action]
1346+ # + [action]
1347+ # + ... and more
1348+ if session["login"] != "true"
1349+ # セッションが存在しない場合は強制的にトップページに遷移
1350+ htmlwriter = HtmlWriter.new("./erbtemp/index.html.erb", binding)
1351+ else
1352+ case params["mode"]
1353+ when "selectlog"
1354+ htmlwriter = HtmlWriter.new("./erbtemp/select.html.erb", binding)
1355+ when "newentry"
1356+ htmlwriter = HtmlWriter.new("./erbtemp/newentry.html.erb", binding)
1357+ when "editentry"
1358+ htmlwriter = HtmlWriter.new("./erbtemp/editentry.html.erb", binding)
1359+ when "delentry"
1360+ htmlwriter = HtmlWriter.new("./erbtemp/delentry.html.erb", binding)
1361+ when "editfeed"
1362+ htmlwriter = HtmlWriter.new("./erbtemp/editfeed.html.erb", binding)
1363+ when "log"
1364+ htmlwriter = HtmlWriter.new("./erbtemp/log.html.erb", binding)
1365+ when "insert"
1366+ htmlwriter = HtmlWriter.new("./erbtemp/insertfeed.html.erb", binding)
1367+ when "replace"
1368+ htmlwriter = HtmlWriter.new("./erbtemp/replacefeed.html.erb", binding)
1369+ when "import"
1370+ htmlwriter = HtmlWriter.new("./erbtemp/indeximport.html.erb", binding)
1371+ when "reset"
1372+ htmlwriter = HtmlWriter.new("./erbtemp/reset.html.erb", binding)
1373+ when "error"
1374+ htmlwriter = HtmlWriter.new("./erbtemp/error.html.erb", binding)
1375+ else