細かいことは以前の日記に書いてあるので、ここではビャッとソースを引用。
# 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