/ 最近 .rdf 追記 設定 本棚

脳log[tDiary: 2007-11-29~]



2007年11月29日 (木)

[tDiary] 検索フォームを付けてみた

  1. Rast < コンパイルで二度挫折。
  2. Namazu < インデックスの更新方法とか更新のコストとかよくわからず。
  3. msearch < Perlだし。スタンドアロンでなくライブラリのかたちの方が使いやすい。
  4. tdiarysearch < 共用サーバだから傍迷惑になりそう。
  5. tdiarygrep < ad hocだけど一番使い勝手がよさそう。

squeeze.rbによる HTMLファイルが既にあるし、ってことでただの grepの出力を HTMLに整形するだけのもの。タイトルとかサブタイトルを参照してもうちょっと見やすく整えたり、AND検索のときの出力に最後の検索語しか現れないのをなんとかしたりとか、そんなことの前に検索対象を間違えてることにいま気付いた。

td2html
2006127KB@12files981KB@130files
2007164KB@11files1.03MB@97files

td2を読まないと……(__;) Namazuのインデックスのサイズだって元のデータが小さいからたかがしれてるぞ。

 追記: 検索部分を grep呼び出しから tdiarygrepのものに変更した。

etDiary用のスプリッタ( 'etdiary' => /^<<(?!<)/ )を加えたのと、Wiki用のスプリッタを /^!/ から /^!(?!!)/ に変更したのと、本文のない日があるとその次の日を加えた二日分をまとめて読んで一日としてしまうことがあったので read_diaries(path) をごにょごにょと泥臭く修正した。


2007年10月22日 (月)

[tDiary] 最新≡月<<<>>>カテゴリ表示 | 最近のエントリは前後のエントリになればいいのに

tDiaryにはいくつかの表示モードがあって、最新と月の表示は一貫してるもののカテゴリ表示はなんか違う。検索結果については検索に何を使うかによって全く変わってくる。

表示形式表示制限フィルタソート
最新全文数件ずつ(なし)日付降順
全文すべて年月日付昇順
カテゴリサマリ*すべてカテゴリ + 期間(月、四半期、半期、年、全て)日付降順
検索結果検索エンジン依存

なにかというと、カテゴリ表示を

表示形式表示制限フィルタソート
カテゴリ全文数件ずつカテゴリ日付降順
カテゴリ全文すべてカテゴリ + 期間(年、年月)日付昇順

の選択制(選択するのは読者)にしたいな、と。最新表示と月表示にカテゴリフィルタを付けたようなかたち。違和感とかとまどいは減るんじゃないでしょか。

 最近のエントリや新着記事は前後のエントリになればいいのに

最近のエントリ(名前は違ってもそれに類するもの)は前後のエントリに置き換わればいいと思っている。

日記などで一番よく使うナビゲーションは「つぎの○件」。記事の独立性が高いブログなどでは、タイトルを見て中身を推測でき、読む読まないを事前に判断できる「最近のエントリ」も役に立つ。つぎの○件がないところではこれが唯一のナビゲーションだったりもする。アーカイブとかカレンダーとかは使わない。日記であれブログであれニュースサイト以外では記事が書かれた日時を気にすることがないから。

で、最近のエントリを利用して個別記事に飛んでから困るのが、次の移動先を同じ場所(最近のエントリ)から見つけられないこと。「次の記事」「前の記事」のリンクは全ての記事を読みたいわけではないので使いにくい。だから新着記事だけを閲覧したあと、(もうちょっと読みたいけど)サヨウナラということがたびたび起こる。ナビゲーションが途切れちゃってるのが問題。

最近のエントリでなく前後のエントリであれば、トップページでの表示は最近のエントリと同じものになるし、リンク先の個別の記事ではその前後の複数のエントリへのリンクを提供するので、興味のある記事だけを選んでとびとびに過去へ(あるいは未来へ)移動しつづけることができる。

個別記事へ直接とんできて最近のエントリが読みたくなった人はそのサイトのタイトル(大抵はトップページへのリンク)をクリックすればいいと思うよ。

(最初以外は tDiaryの話ではなかった)

* summaryの訳は要約なのでさわりと同じ意味。このサマリはさわりのよくある誤用と同じ誤用です。


2007年04月13日 (金)

[tDiary] amazon.rb $Revision: 1.62 $ のオプション関連がちょっと変。

 @conf['amazon.nodefault'] がどこからも参照されてないよ

画像が見つからないときにテキストリンクを表示する(true)か noimage画像を表示する(false)かの設定。

 画像の代替テキストが真っ白

class="amazon"の時に画像の横に表示されるテキストと、画像の代替テキストなど(alt, title)は区別して、altや titleは常に設定されるようにして欲しい。

この辺のことです。

	if with_image and @conf['amazon.hidename'] || pos != 'amazon' then
		label = ''
	elsif not label
		label = %Q|#{amazon_title( item )}#{author}|
	end

両方とも自分でなんとかしてみる。

def amazon_image( item )
	image = {}
	begin
		size = case @conf['amazon.imgsize']
		when 0; 'Large'
		when 2; 'Small'
		else;   'Medium'
		end
		image[:src] = item.elements.to_a( "#{size}Image/URL" )[0].text
		image[:height] = item.elements.to_a( "#{size}Image/Height" )[0].text
		image[:width] = item.elements.to_a( "#{size}Image/Width" )[0].text
	rescue
		image[:src] = image[:height] = image[:width] = nil
	end
	image
end

def amazon_default_image
	image = {}
	base = @conf['amazon.default_image_base'] || 'http://www.tdiary.org/images/amazondefaults/'
	case @conf['amazon.imgsize']
	when 0
		image[:src] = "#{base}large.png"
		image[:height] = 500
		image[:width] = 380
	when 2
		image[:src] = "#{base}small.png"
		image[:height] = 75
		image[:width] = 57
	else
		image[:src] = "#{base}medium.png"
		image[:height] = 160
		image[:width] = 122
	end
	image
end

def amazon_to_html( item, with_image = true, label = nil, pos = 'amazon' )
	with_image = false if @mode == 'categoryview'

	author = amazon_author( item )
	author = "(#{author})" unless author.empty?

	label = %Q|#{amazon_title( item )}#{author}| unless label

	if with_image
		image = amazon_image( item )
		image = amazon_default_image if not image[:src] and not @conf['amazon.nodefault']
		if image[:src] then
			img = <<-HTML
			<img class="#{h pos}" src="#{h image[:src]}"
			height="#{h image[:height]}" width="#{h image[:width]}"
			alt="#{h label}" title="#{h label}">
			HTML
			img.gsub!( /\t/, '' )
			label = '' if @conf['amazon.hidename'] || pos != 'amazon'
		else
			img = ''
		end
	end

	url = amazon_url( item )
	%Q|<a href="#{h url}">#{img}#{h label}</a>|
end

動いているようだ。labelという変数に二つの役割が与えられているのが微かに気になるが。

 (おまけ) エラーメッセージの表示部分

def amazon_get( asin, with_image = true, label = nil, pos = 'amazon' )
	……(省略)……
		rescue Timeout::Error
			asin
		rescue NoMethodError
			if item == nil then
				message = doc.elements.to_a( 'Items/Request/Errors/Error/Message' )[0].text
				"#{label ? label : asin}<!--#{h @conf.to_native( message, 'utf-8' )}-->"
			else
				"#{label ? label : asin}<!--#{h $!}\n#{h $@.join( ' / ' )}-->"
			end
		end

labelは他の場所で HTMLエスケープ前の文字列として扱われているのでエスケープするのがよい。asinだって中身が英数字に違いなかろうがなんだろうがエスケープすればいい。

コメント(<!---->)の中身は h(ERB::Util.html_escape) する必要はなく .gsub(/--+/, '-') した方が良い、とまで言うとパラノイア・原理主義者っぽい気がするのは何故? コメントに起因する不具合に遭ったことがないから?


2006年06月10日 (土)

[tDiary] セクション毎にフットノートが付けられる。(やろうと思えば)

tDiary-2.1.4からは section_enter_procと section_leave_procが用意されてるので、現在 body_leave_procを使って一日毎に行ってることを、section_leave_procでセクション毎に行うだけ。

[tDiary] index.rb: UAにキャッシュを許可。If-Modified-Sinceをチェック。

構わないと思うのですよ、リロードの度にプラグインを評価しなくても。

--- index.rb~	2005-06-13 14:05:11.000000000 +0900
+++ index.rb	2006-06-11 00:52:18.203125000 +0900
@@ -60,11 +60,15 @@
 		body = ''
 		head['Last-Modified'] = CGI::rfc1123_date( tdiary.last_modified )

+		require 'time'
+		ims = ENV['HTTP_IF_MODIFIED_SINCE']; ims = ims ? Time.httpdate(ims) : Time.at(0); # ENV?
+		diary_changed = (tdiary.last_modified - ims) > 30; # 30?
+
 		# ETag testing code
 		#require 'md5'
 		#head['ETag'] = MD5::md5( body )

-		if /HEAD/i !~ @cgi.request_method then
+		if /HEAD/i !~ @cgi.request_method and diary_changed then
 			if @cgi.mobile_agent? then
 				body = conf.to_mobile( tdiary.eval_rhtml( 'i.' ) )
 				head['charset'] = conf.mobile_encoding
@@ -73,15 +77,15 @@
 				body = tdiary.eval_rhtml
 				head['charset'] = conf.encoding
 				head['Content-Length'] = body.size.to_s
-				head['Pragma'] = 'no-cache'
-				head['Cache-Control'] = 'no-cache'
+#				head['Pragma'] = 'no-cache'
+#				head['Cache-Control'] = 'no-cache'
 			end
 			head['cookie'] = tdiary.cookies if tdiary.cookies.size > 0
 			print @cgi.header( head )
 			print body
 		else
-			head['Pragma'] = 'no-cache'
-			head['Cache-Control'] = 'no-cache'
+#			head['Pragma'] = 'no-cache'
+#			head['Cache-Control'] = 'no-cache'
 			print @cgi.header( head )
 		end
 	rescue TDiary::ForceRedirect

2006年06月04日 (日)

[tDiary]テーマ:横幅を制限してみた。

以前から横にだらだら延びた段落は醜いと思っていた。

このようなページを見つけた。C O U L D:固定か可変かそれが問題だ

早速 cssに下記の一行を追加した。

body { max-width: 50em }

emってな曖昧な単位に少し不安があるが Firefox1.5と IE7.0で同じように見えるので良しとする。


2006年05月30日 (火)

[tDiary] tdiary/hikidoc.rb: <pre>の中でも強調したい

<pre>の中だからってタグが書けないわけじゃなし。インライン要素なら OKのはず。

C:\Documents and Settings\ds14050\デスクトップ>diff -u hikidoc.rb~ hikidoc.rb
--- hikidoc.rb~ 2005-10-06 16:42:35.000000000 +0900
+++ hikidoc.rb  2006-05-30 06:34:32.265625000 +0900
@@ -142,8 +142,9 @@
   end

   def restore_pre( text )
-    ret = unescape_meta_char( text, true )
-    ret = restore_plugin_block( ret, true )
+    text = inline_parser( text )
+#    ret = unescape_meta_char( text, true )
+#    ret = restore_plugin_block( ret, true )
   end

   ######################################################################
  • inline_parser()が ''強調'', '''もっと強調''', ==打消==, [[WikiName]]や URLっぽい本文を解釈する。
  • unescape_meta_char( text, true )をコメントアウトすることでメタ文字({, }, :, ', ", |)のエスケープを有効にしてるのは inline_parser()によってシングルクォートなどが解釈されるようになった結果、<pre>の中にシングルクォートそのものを書く方法がなくなったから。
  • restore_plugin_block(ret, true)をコメントアウトしてるのは <pre>の中でもプラグインを使いたいから。
  • メタ文字をリストアップしていて気付いたけどイコールとブラケットがメタ文字に含まれてなくてエスケープができないから、こんなふうに ==打ち消し== とか [[WikiName]] の書き方の例示ができなくね? 左のは {{'=='}} みたいにプラグイン記法でなんとかしたけど。

 <pre>の中と外でマークアップが変わらないことのテスト

 [Wikiソース]
''test''
 ''test''
''test&'test\'''
 ''test&'test\'''
 [変換後のHTML]
<p><em>test</em></p>
<pre>
<em>test</em>
</pre>
<p><em>test&amp;'test'</em></p>
<pre>
<em>test&amp;'test'</em>
</pre>

2006年01月17日 (火)

[tDiary] 新Wikiスタイル(HikiDoc):引用の中で<pre>。できるやん

20050929p02で引用の中で <pre>を使いたい言うてましたが、どうやら最初から可能だったご様子。

hikidoc.rbからの引用。

 ######################################################################
 # blockquote

 BLOCKQUOTE_RE = /^""[ \t]?/
 BLOCKQUOTES_RE = /(#{BLOCKQUOTE_RE}.*\n?)+/

 def parse_blockquote( text )
   text.gsub( BLOCKQUOTES_RE ) do |str|
     str.chomp!
     str.gsub!( BLOCKQUOTE_RE, '' )
     "\n<blockquote>\n%s\n</blockquote>\n\n" % block_parser(str)
   end
 end
  1. BLOCKQUOTES_RE(行頭が""と 1つか0個の空白・タブ文字で始まる行の連続)にマッチする文字列が見つかったら
  2. BLOCKQUOTE_RE(各行頭の ""とそれに続く 1つか0個の空白・タブ文字) を取り除いた後
  3. block_parser()を呼び
  4. その結果を <blockquote>タブで囲む。
 ######################################################################
 # block parser
 ######################################################################

 def block_parser( text )
   ret = text
   ret = parse_plugin( ret )
   ret = parse_pre( ret )
   ret = parse_comment( ret )
   ret = parse_header( ret )
   ret = parse_hrules( ret )
   ret = parse_list( ret )
   ret = parse_definition( ret )
   ret = parse_blockquote( ret )
   ret = parse_table( ret )
   ret = parse_paragraph( ret )
   ret.lstrip
 end

block_parser()は見ての通り、整形済みテキスト(pre)、見出し、リスト、引用、テーブル、段落などを解釈する。

つまり、引用の中には (<pre>も含めて) block_parserが解釈するブロック要素が全て書ける。

何故今日まで気付かなかったのかというとコレ↓

 BLOCKQUOTE_RE = /^""[ \t]?/

ドキュメントでは一般的に、「行頭に "" を付ければ引用になります」と書かれるけど、hikidoc.rbの実装では それに続く空白・タブ文字も引用を表す記号の一部として扱われている。行頭の空白は整形済みテキストを表すりっぱな Wiki記法の一部なのに。

そういうわけで

 引用の中で整形済みテキストを書くときは 行頭を「""  」(注:スペースは 2つ)で始めます。

2005年11月11日 (金)

[tDiary]レーベルが取得できないときは出版社を表示してお茶を濁してみました。

現在のフォーマット:

'#{author} 【#{title}】 #{label.empty? ? publisher : label}'

20051108#p06のやり方では、『9S(3)』を使って「電撃文庫」を取得できるのは試したし、「ジャンプコミックス」と「角川スニーカー文庫」も多分取得できる。でもこれら一部大手を除くと、富士見ミステリーもファミ通文庫も、その他殆どのレーベルで取得できない。<ItemAttributes>拡張してよ、アマゾンさん。


2005年09月29日 (木)

最終更新: 2011-02-13T06:07+0900

[tDiary]新Wikiスタイル(HikiDoc)の拡張案:引用の中で<pre>

引用文の表現力が上がってるのだけど、もうひとつ、引用の中で整形済みテキスト(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の箇所は歩けな

 [2006-01-17] (最初から)できるみたいよ _|‾|○

20060117p04


2005年09月24日 (土)

[tDiary] tDiary-2.1.2.20050917をテスト稼働

新しい 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/ にリネーム。


2005年09月22日 (木)

[tDiary]プラグイン (category.rb):category_anchor()を複数カテゴリに対応

同カテゴリの日記をリスト表示するページでメインの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を参照するところでエラーになる 。


2005年07月28日 (木)

[tDiary]kw.rb: キーワードを utf-8にエンコードするオプション追加

そうしないと Wikipediaにリンクできないので。Ruby-1.8.2以降ならNKFでUTF-8が扱えるはず。古いNKFが入ってなければ。


2005年07月20日 (水)

[tDiary]tDiary-2.1.2にアップデート

書き込みできるかテスト。