細かいことは以前の日記に書いてあるので、ここではビャッとソースを引用。
# index_list.rb
#
# 「最新」「月」表示に対応した目次を表示。
# recent_listやtitle_listと違い日付のリンク先は日別表示でなくページ内。
# その為に、diary.rhtmlをいじって日付にアンカーを付ける必要がある。
# 骨格にrecent_list.rbを使用。
# [2005-06-15] tdiary-2.1.1 N日表示対応
# [2005-04-20] 月表示では昇順に。
def index_list(date_format = nil, show_title = true)
if(@mode == 'latest')
limit = @conf.latest_limit;
elsif(@mode == 'month')
limit = 31;
else
return '';
end
date_format ||= @date_format;
latest_start_ymd = @date.strftime('%Y%m%d');
result = %Q[<ul class="index-list">\n];
b = lambda {|ymd|
next if(@mode == 'latest' && latest_start_ymd < ymd);
break if(limit <= 0);
diary = @diaries[ymd];
next unless(diary.visible?);
result << %Q[\t<li><a href="##{ymd}">#{diary.date.strftime(date_format)}</a>];
if(show_title && diary.title)
result << %Q[ #{diary.title}];
end
result << %Q[\n\t\t<ul class="index-list-item">\n];
i = 1;
if(!@plugin_files.grep(/\/category.rb$/).empty? && diary.categorizable?)
diary.each_section{|section|
result << "\t\t<li>";
result << section.categories.collect{|c| category_anchor("#{c}")}.join;
result << ' '+section.stripped_subtitle_to_html if(section.stripped_subtitle);
result << "</li>\n";
i += 1;
}
else
diary.each_section{|section|
if(section.subtitle)
result << %Q[\t\t<li>#{section.subtitle_to_html}</li>\n];
end
i += 1;
}
end
result << "\t\t</ul>\n\t</li>\n";
limit -= 1;
}
begin
@diaries.keys.sort.send( (@mode=='latest' ? :reverse_each : :each), &b);
rescue LocalJumpError # <- break
# Procオブジェクトで breakは使えないのだろうけど
# それをブロックとして渡してるんやからエラーにせんでもええやん。> ruby-1.8.2
end
result << "<ul>";
return apply_plugin(result);
end
耳:55% / 読:75% といったところだろうか。
文字通りチャンネルをまわしてた頃のテレビのような。
土砂降りの雨でパンツの中まで濡れた日から半年以上に渡ってポケットの中の A1301Sは不調でした。
丸一秒間押し続けないとキー入力を認識しないのです。実際の仕組みは知らんけど、仮に正常なら 0.1秒毎にキーの押し下げ状態をスキャンしてたとして、それが 1秒毎になったような。
ワンプッシュ一秒。11桁の番号なら 11秒。このじれったさ。
それが何? 一昨日 1mの高さから落としてからこの半年がなかったみたいに正常に動いてるやん。
機械は叩けば直るというのは平成の今日に至っても真実なのですか。一昨日までの不便を思うとこんなオチにがっかりですよ。
最終更新: 2011-02-13T07:59+0900
末尾の " をURLの一部だとみなすせい。wiki_parser.rbの 198行目辺りの
r = %r<(((https?|ftp):[\(\)%#!/0-9a-zA-Z_$@.&+-,'"*=;?:~-]+)|([0-9a-zA-Z_.-]+@[\(\)%!0-9a-zA-Z_$.&+-,'"*-]+\.[\(\)%!0-9a-zA-Z_$.&+-,'"*-]+))>
を
r = %r<(((https?|ftp):[\(\)%#!/0-9a-zA-Z_$@.&+-,'*=;?:~-]+)|([0-9a-zA-Z_.-]+@[\(\)%!0-9a-zA-Z_$.&+-,'"*-]+\.[\(\)%!0-9a-zA-Z_$.&+-,'"*-]+))>
に変更。メールの方はいじってないけど不都合があるならそっちも " を削ればいい。
tDiary-2.1.3から採用される新Wikiスタイル(HikiDoc)では末尾の " が URLには含まれない模様。つまり修正の必要なし。
このページを読む限りダブルクォーテーションをURIの一部と見なす必要はないような。
山形括弧 "<" と ">" そして二重引用符 (") は排除されます。なぜなら、これらはしばしばURI周辺の区切り子として文書や作法の分野で使われるからです。 "#" 記号は排除されます。なぜなら、これはURIを、URI参照中のフラグメント識別子(第4項)から区切るのに使われるからです。 百分率記号は排除されます。なぜなら、これは回避された文字の符号化に使われるからです。
class TDiaryUpdate < TDiaryAdmin
def initialize( cgi, rhtml, conf )
@title = conf.to_native( cgi.params['title'][0] )
@body = conf.to_native( cgi.params['body'][0] )
@hide = cgi.params['hide'][0] == 'true' ? true : false
super
end
protected
def do_eval_rhtml( prefix )
super
@plugin.instance_eval { update_proc }
@diary.eval_rhtml({'date_format'=>''}, PATH) rescue nil; # この行を追加
anchor = @plugin.instance_eval( %Q[anchor "#{@diary.date.strftime('%Y%m%d')}"].untaint )
clear_cache( /(latest|#{@date.strftime( '%Y%m' )})/ )
raise ForceRedirect::new( "#{@conf.index}#{anchor}" )
end
end
一行追加した。更新時の負荷増加なんて無問題でしょ。optが手抜きなのは気にしない方向で。
加えて、カテゴリを使った場合は update_procで category.rbによって section.bodyが評価されるので更にゴニョゴニョしないと「更新時に一度だけ実行」というわけにはいかない。
ここでハタと気付く。update_procでできるなら tdiary.rbをいじることないやん。category.rbの真似しよう。
コレ(↓)。category.rbのより簡単なのは、category.rbでは Pluginクラスとは違うクラス(のインスタンス)の中で評価するために bindingを受け渡したりしてるから。
add_update_proc{
diary = @diaries[@date.strftime('%Y%m%d')];
diary.each_section do |s|
apply_plugin(s.subtitle_to_html);
apply_plugin(s.body_to_html);
end
}