現在のフォーマット:
'#{author} 【#{title}】 #{label.empty? ? publisher : label}'
20051108#p06のやり方では、『9S(3)』を使って「電撃文庫」を取得できるのは試したし、「ジャンプコミックス」と「角川スニーカー文庫」も多分取得できる。でもこれら一部大手を除くと、富士見ミステリーもファミ通文庫も、その他殆どのレーベルで取得できない。<ItemAttributes>拡張してよ、アマゾンさん。
最終更新: 2011-02-13T06:07+0900
引用文の表現力が上がってるのだけど、もうひとつ、引用の中で整形済みテキスト(pre)を使いたい。
すぐ上のセクション(↑)で、改行を維持するために引用の中のコード部分だけを<pre>で囲ってるのだけど、そのソースはちょっと汚い。(上から二行目と下から二行目で)直接HTMLを埋め込んでるから後々 tDiaryをXHTML化したりするのが難しくなる。HTML化はWikiパーサに全て任せたい。tdiary/hikidoc.rbを拡張して引用文中の<pre>が可能にならないものか。
""7×7の二次元配列aがあるとする。たとえば、以下のようなものである。
"" int a[7,7] ={
"" {1,1,1,1,1,1,1},
"" {1,0,0,0,0,0,1},
"" {1,0,1,1,1,0,1},
"" {1,0,0,0,1,1,1},
"" {1,0,0,1,0,0,1},
"" {1,0,0,0,1,0,1},
"" {1,1,1,1,1,1,1}
"" };
""いま、aを迷路と見立てる。a[x,y]が0の箇所は歩けて、1の箇所は歩けな
新しい Wikiスタイル(HikiDoc)を使いたいがために。
引用の中に
見出しとか
孫引用とか
- リストを挿入してみたりできる
でも多分 http://vvvvvv.sakura.ne.jp/ds14050/diary/ で日記にアクセスすると上の引用部分が下のように見えてるはず。(実際にはキャッシュが働くので新旧tDiaryのどっちが最後にキャッシュを作ったかによる)
引用の中に
!見出しとか
""孫引用とか
*リストを挿入してみたりできる
http://vvvvvv.sakura.ne.jp/ds14050/diary/ に加えた変更を http://vvvvvv.sakura.ne.jp/ds14050/diary-test/ に写し終えたら diary-test/ を diary/ にリネーム。
同カテゴリの日記をリスト表示するページでメインのHTMLを出力してるのは category.rbの中の category_list_sections()。こいつとか Category::Info#make_anchor()はパラメータとして複数のカテゴリを与えられることを想定している。けれどこの 2つのメソッドは「@mode == 'categoryview'」なページの中でしか使えない。
どういうことか。複数のカテゴリ名がパラメータとして与えられればそれらを全てリスト表示できるのに、そういうパラメータを持ったリンクを作る手段がなかった。(Category::Info#make_anchor()にはその可能性があったけど使える場所がカテゴリページ内に限られるので外からの入り口にはなれない)
カテゴリページへのリンクを作るのにはもう一つ方法があって、それが同じ category.rb内にある category_anchor()。これは Category::Info#make_anchor()とは対照的にカテゴリページの外でしか使えない*。category_anchor()を複数カテゴリ対応にすれば晴れて入り口のできあがり。
* 「カテゴリページ」を表す「class TDiaryCategoryView < TDiaryBase」には @dateが存在しないから、Pluginオブジェクトの @dateも nullになって、category_anchor()が @dateを参照するところでエラーになる 。
細かいことは以前の日記に書いてあるので、ここではビャッとソースを引用。
# 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
最終更新: 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
}
変更点は
# user_css2.rb: $Revision3% lastupdate:2005-05-10
#
# Append CSS fragment via Preferences Page.
#
add_header_proc do
[@conf["user_css2..css"], @conf["user_css2.#{@conf.theme}.css"]].map{|css|
next unless(css);
<<-STYLE
<style type="text/css"><!--
#{css.gsub(/\x0d\x0a|\x0a|\x0d/, "\n\t\t")}
--></style>
STYLE
}.join('');
end
unless @resource_loaded then
def user_css2_label
'テーマの微調整'
end
def user_css2_desc
<<-HTML
<h3>CSS断片</h3>
<p>下から選んだテーマに、スタイルシートを追加設定する場合、以下にCSSの断片を入力してください。</p>
HTML
end
def user_css2_buttonlabel1
'このテーマを修正する'
end
def user_css2_buttonlabel2
'CSSファイルを開く'
end
end
if(!@conf_theme_list && @mode =~ /^(conf|saveconf)$/ && @cgi.params['conf'][0] == 'user_css2')
# plugin/00default.rb からのコピー
@conf_theme_list = []
Dir::glob( "#{::TDiary::PATH}/theme/*" ).sort.each do |dir|
theme = dir.sub( %r[.*/theme/], '')
next unless FileTest::file?( "#{dir}/#{theme}.css".untaint )
name = theme.split( /_/ ).collect{|s| s.capitalize}.join( ' ' )
@conf_theme_list << [theme,name]
end
end
add_conf_proc( 'user_css2', user_css2_label ) do
if @mode == 'saveconf' then
if(@cgi.params['user_css2.css'].empty? || @cgi.params['user_css2.css'][0].empty?)
@conf.delete("user_css2.#{@cgi.params['user_css2.theme'][0]}.css");
else
@conf["user_css2.#{@cgi.params['user_css2.theme'][0]}.css"] = @cgi.params['user_css2.css'][0];
end
end
theme = (@cgi.params['user_css2.theme'][0] or @conf.theme);
theme_hash = Hash[* @conf.options.map{|thm,css| (thm =~ /^user_css2\.(.+)\.css$/) ? [$1, $1.split(/_/).collect{|s| s.capitalize}.join(' ')+' (deleted)'] : nil}.compact.flatten ].update( Hash[* @conf_theme_list.flatten] );
theme_hash[''] = '* All Theme *';
theme_url = theme_url(); theme_url += '/' if(theme_url[-1] != ?/);
<<-HTML
#{user_css2_desc}
<select name="user_css2.theme">
#{theme_hash.keys.sort.map{|t| %(<option value="#{CGI::escapeHTML(t)}"#{' selected' if t == theme}>#{CGI::escapeHTML(theme_hash[t])}</option>)}.join}
</select>
<input type="submit" value="#{user_css2_buttonlabel1}">
<input type="button" value="#{user_css2_buttonlabel2}" onclick="window.open('#{theme_url}'+this.form['user_css2.theme'].value+'/'+this.form['user_css2.theme'].value+'.css')" >
<p><textarea name="user_css2.css" cols="70" rows="15">#{CGI::escapeHTML( @conf["user_css2.#{theme}.css"].to_s )}</textarea></p>
HTML
end
Amazon Webサービスを使ってキャッシュをXMLで保存する以外は amazon.rbと大体*一緒。ひとつだけ新しいメソッド追加。
5に意味は無くて、2とか3は既にありそうだな〜ってことで。
キャッシュが効いてなかったり、nilに対して存在しない呼び出しをしてたり、AssociateIDを一か所埋め込んでなかったり、widthとheightを間違えてたり、amazon.rbのisbn()を呼び出してたりしたのを修正。多分 amazon.rbなしでも動くんじゃないかな (この日記では両方オンにして二種類キャッシュしてXMLの方だけ使って表示してる)。
ruby-amazon(RAA)なんてあるんな。知らんかった。標準添付じゃないから使わなくてもいいかな。
* では何が違うかっていうとバグが潜んでそうなところが違う。