1
# tdiarytimes_textstyle.rb $Revision: 1.3 $
3
# Copyright (c) 2004 phonondrive <tdiary@phonondrive.com>
4
# Distributed under the GPL
7
# http://phonondrive.com/trd/
8
# --------------------------------------------------------------------
13
# --------------------------------------------------------------------
14
# 日記を登録した時間帯をタイムライン上に記録します。
15
# 記録されたエントリは日時の経過と共にフェードアウトしていきます。
16
# このような MTBlogTimes や tdiarytimes と同等の機能をテキストで実現します。
17
# また、テキストベースであることを生かした柔軟なサイトデザインが可能です。
18
# ruby-gd のインストール作業も必要ないため、すぐに使用出来ます。
22
# --------------------------------------------------------------------
23
# プラグインは、プラグインフォルダに入れてください。
24
# ヘッダ、あるいはフッタ部に入力した <%= tdiarytimes_textstyle %>
25
# の位置にタイムライン文字列が展開されます。
26
# 新しいエントリの記録や保持期間の過ぎた古いエントリの削除は、
28
# ただし、エントリのフェードアウト効果はリアルタイムに計算されます。
33
# --------------------------------------------------------------------
35
# 現在、次の9つのオプションが用意されています。
37
# init_text 日記の登録されていない時間帯の文字列 (任意の文字列)
38
# entr_text 日記が登録された時間帯の文字列 (任意の文字列)
39
# init_color 日記の登録されていない時間帯の文字列の色 (RRBBGG形式で指定)
40
# entr_color 日記が登録された時間帯の文字列の色 (RRBBGG形式で指定)
41
# fade_color 日記が登録された時間帯の文字列のフェードアウト先の色 (RRBBGG形式で指定)
42
# init_css タイムライン文字列全体のCSS設定 (CSSの書式に準拠)
43
# entr_css 日記が登録された時間帯の文字列のCSS設定 (CSSの書式に準拠)
44
# title_text オブジェクト上にマウスをポイントした時のTIPS文字列 (任意の文字列)
45
# fade_time ログとして保存しておく(フェードアウトに要する)日数 (任意の数値)
46
# entr_interval 前回のエントリ登録から指定時間以内は新規登録しない (任意の数値)
48
# オプション値の設定方法には3つの方法があり、その優先順位は次の通りです。
49
# <%= tdiarytimes_textstyle %> 引数指定 > tdiary.conf設定値 > デフォルト値
51
# entr_intervalを除いた全てのオプション値は <%= %> への引数指定により設定出来るため、
52
# ページにごとに意匠を変更するなど自由度の高いサイトデザインが可能です。
53
# 一方で、全てのオプションにデフォルト値が用意されているため、
55
# デフォルト値の具体的な値については、tdiary.confへの記述方法の項を参照して下さい。
58
# <%= tdiarytimes_textstyle %>への引数指定によるオプション設定方法
59
# --------------------------------------------------------------------
61
# <%= tdiarytimes_textstyle init_text, entr_text, init_color, entr_color, fade_color, init_css, entr_css, title_text, fade_time %>
64
# <%=tdiarytimes_textstyle "●","●","004400","66ff66","004400","background-color:#002200;font-size:9px",nil,"TEXTSTYLE!!",15 %>
66
# ※ tdiary.conf指定値、またはデフォルト値を使用したい場合は、引数に nil を指定してください。
69
# tdiary.confへの記述によるオプション設定方法
70
# --------------------------------------------------------------------
71
#【記述例】 (例として指定されている値は、プラグイン本体の持つデフォルト値です)
72
# @options['tdiarytimes_textstyle.init_text'] = "|"
73
# @options['tdiarytimes_textstyle.entr_text'] = "|"
74
# @options['tdiarytimes_textstyle.init_color'] = "444444"
75
# @options['tdiarytimes_textstyle.entr_color'] = "eeeeee"
76
# @options['tdiarytimes_textstyle.fade_color'] = "444444"
77
# @options['tdiarytimes_textstyle.init_css'] = "background-color:#444444;"
78
# @options['tdiarytimes_textstyle.entr_css'] = ""
79
# @options['tdiarytimes_textstyle.title_text'] = "TDIARYTIMES-TEXTSTYLE"
80
# @options['tdiarytimes_textstyle.fade_time'] = 30
81
# @options['tdiarytimes_textstyle.entr_interval'] = 1
83
# ※ fade_time の単位は日、entr_interval の単位は時間です。
84
# ※ ログとして保存しておく期間(フェードアウト期間)を過ぎたデータエントリは、
85
# 指定期間経過後の次回日記追加時にログファイルから削除されます。
86
# この期間を決定する fade_time 値は、<%= %> 引数からは指定出来ません。
87
# デフォルト値(30日)以外の値を用いたい場合は、必ず tdiary.conf にて指定して下さい。
88
# 同様に、entr_interval もデフォルト値(1時間)以外に設定したい場合は、
89
# tdiary.conf にて指定して下さい。ちなみに0.5だと30分間隔になります。
93
# --------------------------------------------------------------------
94
# 現在のところ動作しません。(ログファイルを読み込めない為)
98
# --------------------------------------------------------------------
99
# This plugin is based on tdiarytimes.rb $Revision: 1.3 $
100
# Copyright (c) 2003 neuichi <neuichi@nmnl.jp>
101
# Distributed under the GPL
102
# http://nmnl.jp/hiki/software/?tDiary+%3A%3A+Plugin
106
2004.03.04 phonondrive <tdiary@phonondrive.com>
108
非応答USER-AGENTリストを更新しました。
110
2004.02.05 phonondrive <tdiary@phonondrive.com>
112
フェードアウト効果の計算結果が正しく出力されない点を修正しました。
114
2004.01.30 phonondrive <tdiary@phonondrive.com>
116
最低登録間隔のオプション (entr_interval) を追加。
117
前回のエントリ登録から指定時間以内は新規登録しないようにしました。
119
2004.01.29 phonondrive <tdiary@phonondrive.com>
121
replace(登録)時もエントリを記録するようにしました。
122
次のUSER-AGENTからの呼び出しには結果を出力しないようにしました。
124
テキストブラウザ (w3m, Lynx, links)
125
CSS非対応ブラウザ (Mosaic, Lite, iCab, JustView, WebExplorer)
126
検索ボット (bot, crawler, Spider, Slurp, inktomi, Sidewinder, naver)
127
その他 (libwww, antenna)
129
2004.01.28 phonondrive <tdiary@phonondrive.com>
136
# tDiarytimes_textstyle の結果を出力しない USER-AGENT リスト
137
# モバイル端末、テキストブラウザ、CSS非対応ブラウザ、検索ボット、アンテナなど
140
def tdiarytimes_textstyle_ignore_user_agent; "w3m|Lynx|links|Mosaic|Lite|iCab|JustView|WebExplorer|bot|crawler|Spider|Slurp|inktomi|Sidewinder|naver|libwww|archiver|http|check|WDB|WWWC|WWWD|samidare|tamatebako|NATSU-MICAN|hina|antenna"; end
145
# --------------------------------------------------------------------
147
# --------------------------------------------------------------------
149
if /^(append|replace)$/ =~ @mode then
151
# オプション値(エントリ保持期間)の読み込みと設定
153
fade_time = @options['tdiarytimes_textstyle.fade_time'] || 30
154
fade_time = 24 * 60 * 60 * fade_time.to_f
156
entr_interval = @options['tdiarytimes_textstyle.entr_interval'] || 1
157
entr_interval = 60 * 60 * entr_interval.to_f
162
cache = "#{@cache_path}/tdiarytimes_textstyle"
163
Dir::mkdir( cache ) unless File::directory?( cache )
166
io = open("#{cache}/tdiarytimes_textstyle.dat","r")
167
ary_data = Marshal.load(io)
170
# 1.0.1 >> 1.0.2 ログデータ移行用
171
if ary_data.size == 144
172
ary_data.push(Time.now.to_i - entr_interval - 1)
177
ary_data = Array.new(145) {|i| 0 }
181
# 不良データや寿命が来たエントリを削除する
184
delta = (Time.now.to_i - ary_data[i])/fade_time.to_f
185
if delta < 0 || delta > 1
191
# 最低登録間隔を経過していたら、日記が登録された時間帯に新しいエントリをセットする
193
if (Time.now.to_i - ary_data[144]) > entr_interval.to_f
194
ary_data[(Time.now.strftime('%H').to_i*6 + Time.now.strftime('%M').to_f/10).to_i] = Time.now.to_i
196
ary_data[144] = Time.now.to_i
202
io = open("#{cache}/tdiarytimes_textstyle.dat","w")
203
Marshal.dump(ary_data,io)
210
# --------------------------------------------------------------------
212
# --------------------------------------------------------------------
214
def tdiarytimes_textstyle(init_text = nil, entr_text = nil, init_color = nil, entr_color = nil, fade_color = nil, init_css = nil, entr_css = nil, title_text = nil, fade_time = nil)
217
# モバイル端末、テキストブラウザ、CSS非対応ブラウザ、検索ボットなどには結果を出力しない
219
unless @cgi.mobile_agent? || @cgi.user_agent =~ %r[(#{tdiarytimes_textstyle_ignore_user_agent})]i
227
init_text = @options['tdiarytimes_textstyle.init_text'] || "|" unless init_text
228
entr_text = @options['tdiarytimes_textstyle.entr_text'] || "|" unless entr_text
229
init_color = @options['tdiarytimes_textstyle.init_color'] || "444444" unless init_color
230
entr_color = @options['tdiarytimes_textstyle.entr_color'] || "eeeeee" unless entr_color
231
fade_color = @options['tdiarytimes_textstyle.fade_color'] || "444444" unless fade_color
232
init_css = @options['tdiarytimes_textstyle.init_css'] || "background-color:#444444;" unless init_css
233
entr_css = @options['tdiarytimes_textstyle.entr_css'] || "" unless entr_css
234
title_text = @options['tdiarytimes_textstyle.title_text'] || "TDIARYTIMES-TEXTSTYLE" unless title_text
235
fade_time = @options['tdiarytimes_textstyle.fade_time'] || 30 unless fade_time
238
entr_color_rgb = entr_color.unpack("a2a2a2")
239
fade_color_rgb = fade_color.unpack("a2a2a2")
241
fade_time = 24 * 60 * 60 * fade_time.to_f
246
cache = "#{@cache_path}/tdiarytimes_textstyle"
249
io = open("#{cache}/tdiarytimes_textstyle.dat","r")
250
ary_data = Marshal.load(io)
253
# ログファイルが見つからない場合はエラーとダミーデータを表示
254
r << %Q|Error! cannot open log file.|
255
ary_data = Array.new(145) {|i| 0 }
261
r << %Q|<span style="color:##{h init_color};#{h init_css}" title="#{h title_text}">|
266
delta = (Time.now.to_i - data)/fade_time.to_f
269
now_color = init_color
272
now_color = fade_color
277
now_color << format("%02x", entr_color_rgb[i].hex + ((fade_color_rgb[i].hex - entr_color_rgb[i].hex)*delta).to_i)
280
r << %Q|<span style="color:##{h now_color};#{h entr_css}" title="#{Time.at(data).strftime('%b %d,%Y')}">#{entr_text}</span>|
282
r << %Q|#{init_text}|