書籍索引スクリプト(2)
*長文注意*
ココログのバックナンバーではカテゴリ別のページと日付別のページ(設定によって「月毎」「週毎」「日毎」)がありますが、カテゴリで見ようとすると記事の多いカテゴリではどんどん数が増えてページが長くなり、表示にも時間を取られるようになるでしょうし見通しも悪くなります。それぞれの記事のタイトルだけをもった索引を持てると便利だろうと思いまずは書籍の記事のための索引を作ってみました。
タイトルだけの索引と違い著者名やジャンル分けによるクロスリンクを実現したかったので、記事自体に工夫をしています。そのためできるだけ記事が少ないうちに対処を始めなければ作業が大変になるのでまずこの書籍の分から作成を始めました。
タイトルや著者名の読みによるソートをしたかったので、記事の先頭に必要なデータをコメントタグで埋め込んであります。このためブラウザで見る分には邪魔なデータが見えることなくページのデザインにも大きな影響を及ぼしません。
データのそれぞれは半角のカンマ「 , 」で区切り、著者に関しては複数の著者や翻訳者がいる場合には、それぞれの名前を半角のスラッシュ「 / 」で区切っています。また、データ全体を括弧「【 】」で囲っています。
<!-- 【
題名,
だいめいのよみ,
著者名,
ちょしゃめいのよみ,
出版社名,
しゅっぱんしゃめいのよみ
】 -->
著者名についてはさらに、
著者名/著者名/訳:訳者名
ちょしゃめい/ちょしゃめい/ヤクシャメイ
のように記述してあります。訳者名の前に「訳:」とつけてあるのは名前のリストの時に区別を付けやすくするためです。また読みでは名前だけを書き、さらに著者よりも名前が先に表示されないようにカタカナで記述しています(ただ、このままだと著者名のリストを作成するときに二重に見出しを作ってしまうので、直前にひらがなに変換しています)。
ジャンルについてはすべての書籍にまず標準カテゴリの「書籍・雑誌」をあて、さらに内容のジャンルとして独自のカテゴリをひとつだけ作成し、合計ふたつのカテゴリを設定しています。すべてに共通する「書籍・雑誌」カテゴリのインデックスページを取得すればすべての書籍情報を処理することができます。
索引記事の作成に先立って、それぞれの索引記事用の記事ファイルを作っておき、そのファイルへの固定リンクを決めておく必要があります。ブログ使用開始前の日付でファイルを作っておきます。ここで先の「ココログのファイル名」を参照してわかり易いファイル名をつけておきます。
スクリプトの先頭部分にこれらのファイルへの URL を指定する部分があるので、そこに記入します。直接ココログに書き込む機能はないので、一旦スクリプトのあるフォルダにファイルを書き出すので、そのファイル名も適宜指定します。
中ほどに「ネット接続用」としてココログの URL を指定する部分には、「書籍・雑誌」カテゴリのディレクトリを指定します。この部分についてはもっと簡略化や汎用化が出来ると思うのですが、今回は限定した用途なので参考にした藤岡さんのスクリプトをそのまま利用しています。
ここまでの設定ができれば、後は ActiveScriptRuby の「 Ruby コンソール」を開き、必要に応じてスクリプトを置いたフォルダに移動してから、
c>ruby bkidx.rb
とするだけでそれぞれの索引ファイルが作成されます(もちろんネット接続可能な状態で)。
ココログにログインし、記事の編集画面で索引記事を開き、エディタなどで先ほど作成された新しい索引記事を開き「すべてを選択」して、コピー&ペーストしてから保存します。
なお、UTF-8 文字コードに対応させるために Ruby 1.8.2 を使うのがもっとも手軽なので、ActiveScriptRuby も 1.8.2 を使用します。
#小見出し用文字の変換用ハッシュでカタカナが必要なかったことに気づいたので削除しました。(2005/4/4)
#pre タグを使ったときのコツが分かったので本来のインデント付きで表示できるようになりました。やや見栄えは悪いですが。(2005/4/4)
#カテゴリの切り出しはたまたまうまくいっていただけなのを確認(^^; 現在修正中(2005/4/5)
#カテゴリの切り出しを修正。(限定した使い方なので必要ないともいえるのだけれど、一応)
#4/7のココログのバージョンアップに伴い、記事の固定リンクを示す文字がデフォルトで変更されてしまう場合に対応。(2005/4/8)
#カテゴリ文字の処理部分を修正(2005/4/28)
bkidx.rb
#!ruby -Ks
#書籍索引を生成する
#2005/03/17 - 2005/04/07
#
#データ形式
#<!--【書名,しょめいよみ,
# 著者名/(著者名|訳:訳者名),
# ちょしゃめいよみ/ヤクシャメイヨミ,
# 出版社名,しゅっぱんしゃめいよみ】 -->
#
# よみは基本的にひらがなで。外国人でも。
# 訳者のよみはカタカナで。(訳:)の部分は無視。
# 複数著者や翻訳者は / で区切る。,/ は半角で。
#
$KCODE = "sjis"
require 'jcode'
require 'kconv'
require 'net/http'
#
#ローカルに作成する策引用ファイル名
bk_file = 'book_idx.htm'
wri_file = 'writer_idx.htm'
genre_file = 'genre_idx.htm'
#
#ココログ側の著者名別・ジャンル別インデックスファイルのURL
#wri_idx_url = 'http://mumrik.air-nifty.com/blog/2004/01/wri_name_idx.html'
#genre_idx_url = 'http://mumrik.air-nifty.com/blog/2004/01/genre_idx.html'
#ローカルテスト用
wri_idx_url = 'writer_idx.htm'
genre_idx_url = 'genre_idx.htm'
#
#
b_name = []
w_name = []
p_name = []
g_anchor = []
w_name_list = []
w_yomi_t = []
w_name_t = []
w_anchor = []
cat = []
#
#小見出し用の濁音発音を変換
def del_daku(yomi)
daku_tbl = { "が" => "かka",
"ぎ" => "きki",
"ぐ" => "くku",
"げ" => "けke",
"ご" => "こko",
"ざ" => "さsa",
"じ" => "しsi",
"ず" => "すsu",
"ぜ" => "せse",
"ぞ" => "そso",
"だ" => "たta",
"ぢ" => "ちti",
"づ" => "つtu",
"で" => "てte",
"ど" => "とto",
"ば" => "はha",
"び" => "ひhi",
"ぶ" => "ふhu",
"べ" => "へhe",
"ぼ" => "ほho",
"ぱ" => "はha",
"ぴ" => "ひhi",
"ぷ" => "ふhu",
"ぺ" => "へhe",
"ぽ" => "ほho",
"あ" => "あaa",
"い" => "いii",
"う" => "うuu",
"え" => "えee",
"お" => "おoo",
"か" => "かka",
"き" => "きki",
"く" => "くku",
"け" => "けke",
"こ" => "こko",
"さ" => "さsa",
"し" => "しsi",
"す" => "すsu",
"せ" => "せse",
"そ" => "そso",
"た" => "たta",
"ち" => "ちti",
"つ" => "つtu",
"て" => "てte",
"と" => "とto",
"な" => "なna",
"に" => "にni",
"ぬ" => "ぬnu",
"ね" => "ねne",
"の" => "のno",
"は" => "はha",
"ひ" => "ひhi",
"ふ" => "ふhu",
"へ" => "へhe",
"ほ" => "ほho",
"ま" => "まma",
"み" => "みmi",
"む" => "むmu",
"め" => "めme",
"も" => "もmo",
"や" => "やya",
"ゆ" => "ゆyu",
"よ" => "よyo",
"ら" => "らra",
"り" => "りri",
"る" => "るru",
"れ" => "れre",
"ろ" => "ろro",
"わ" => "わwa",
"を" => "をwo",
"ん" => "んnn" }
if daku_tbl[yomi]
daku_tbl[yomi]
else
yomi
end
end
#
#
i = 0
category = ""
#ネット接続用
#host = 'mumrik.air-nifty.com'
#directory = '/blog/cat771270'
#htmlfile = 'index.html'
#h = Net::HTTP.start(host, 80)
# response = h.get(directory + "/" + htmlfile)
#response.body.each do |line|
#
#ローカルテスト用
file_name = ARGV.shift
File.foreach(file_name) do |line|
line = Kconv.tosjis(line)
#
if /【([^,]+,[^,]+,[^,]+,[^,]+,[^,]+,[^,]+)】/ =~ line
bk_name,bk_yomi,wri_name,wri_yomi,pub_name,pub_yomi = $1.split(/,/)
b_name[i] = [bk_yomi,wri_yomi,bk_name,wri_name]
w_name[i] = [wri_yomi,bk_yomi,wri_name,bk_name]
p_name[i] = [pub_yomi,pub_name]
w_name_list[i] = [wri_yomi,wri_name]
i += 1
end
#
#個別のリンクを取得
if /^<span[\s\S]+"permalink" href="([\s\S]+)">(?:固定リンク|Permalink)/ =~ line
b_name[i-1].push($1)
w_name[i-1].push($1)
end
#
#ジャンルの取得
if /^<span class="post-footers">/ =~ line
line.scan(/\/index.html">([^<]+)<\/a>/) do |c|
cat.push(c)
end
category = cat.join.gsub(/書籍・雑誌/,"")
b_name[i-1].push(category)
w_name[i-1].push(category)
g_anchor[i-1] = category
cat.clear
category = ""
end
#
end
#
#アンカーリスト著者
w_name_list.each do |yomi,name|
if /\// =~ yomi
w_yomi_t = yomi.split(/\//)
w_name_t = name.split(/\//)
w_yomi_t.each_index do |i|
w_name_list.push([w_yomi_t[i],w_name_t[i]])
end
end
end
w_name_list.delete_if { |yomi,name|
yomi =~ /\// or name =~ /\//
}
#
i = 0
w_name_list.uniq.sort.each do |a,b|
w_anchor[i] = b
i += 1
end
#
#
#ジャンル別
g_size = 0
f = File.new(genre_file, "w")
f.print "ジャンル別索引<a class=\"idx\" name=\"top\"></a>\n"
g_idx = ""
g_anchor.uniq.sort.each_with_index do |genre,i|
g_size = g_size + genre.size
if g_size > 40
f.print "<br>"
g_size = genre.size
end
f.print "<big><b><a href=\"#",i,"\">",genre,"</a></b></big>|"
end
#
g_idx = ""
f.print "<hr><dl>"
g_anchor.uniq.sort.each_with_index do |genre,i|
f.print "<div align=\"right\"><a href=\"#top\">索引の初めに戻る</a></div><dt><big><b><a class=\"idx\" name=\"",i,"\">[ ",genre," ]</a></b></big>\n"
b_name.sort.each do |bk_yomi,wri_yomi,bk_name,wri_name,bk_url,genre2|
if genre2 == genre
f.print "<dd><a href=\"",bk_url,"\"><b>",bk_name,"</b></a> ( "
w_anchor.each_with_index do |name,j|
if /#{name}/ =~ wri_name
f.print "<a href=\"",wri_idx_url,"#",j,"\"><i>",name,"</i></a> "
end
end
f.print " )\n"
end
end
end
f.print "</dl><div align=\"right\"><a href=\"#top\">索引の初めに戻る</a></div>\n"
f.close
#
#
#書名別索引作成
f = File.new(bk_file, "w")
f.print "書名五十音別索引<a class=\"idx\" name=\"top\"></a>\n"
#
komidasi = ""
b_name.sort.each do |bk_yomi,wir_yomi,bk_name,wri_name,bk_url,genre|
komidasi_ = del_daku(bk_yomi[0,2])
if komidasi != komidasi_[0,2]
komidasi = komidasi_[0,2]
f.print "<big><b><a href=\"#",komidasi_[2,2],"\">",komidasi,"</a></b></big>|"
end
end
#
komidasi = ""
f.print "<hr><dl>"
b_name.sort.each do |bk_yomi,wri_yomi,bk_name,wri_name,bk_url,genre|
komidasi_ = del_daku(bk_yomi[0,2])
if komidasi != komidasi_[0,2]
komidasi = komidasi_[0,2]
f.print "<div align=\"right\"><a href=\"#top\">索引の初めに戻る</a></div><dt><big><b><a class=\"idx\" name=\"",komidasi_[2,2],"\">",komidasi,"</a></b></big>\n"
end
#
f.print "<dd><a href=\"",bk_url,"\"><b>",bk_name,"</b></a> ( "
w_anchor.each_with_index do |name,c|
if /#{name}/ =~ wri_name
f.print "<a href=\"",wri_idx_url,"#",c,"\"><i>",name,"</i></a> "
end
end
f.print ") "
g_anchor.uniq.sort.each_with_index do |genre2,j|
if genre2 == genre
f.print "<small>[ <a href=\"",genre_idx_url,"#",j,"\">",genre,"</a> ]</small>\n"
end
end
#
end
f.print "</dl><div align=\"right\"><a href=\"#top\">索引の初めに戻る</a></div>\n"
f.close
#
#
#著者五十音別
w_name_list.each do |yomi,name|
yomi.tr!("ァ-ン", "ぁ-ん")
end
w_name_list.uniq!.sort!
#
f = File.new(wri_file, "w")
f.print "著者名五十音別索引<a class=\"idx\" name=\"top\"></a>\n"
komidasi = ""
w_name_list.each do |wri_yomi,wri_name|
komidasi_ = del_daku(wri_yomi[0,2])
if komidasi != komidasi_[0,2]
komidasi = komidasi_[0,2]
f.print "<big><b><a href=\"#",komidasi_[2,2],"\">",komidasi,"</a></b></big>|"
end
end
#
komidasi = ""
f.print "<hr><dl>"
w_name_list.each do |wri_yomi2,wri_name2|
komidasi_ = del_daku(wri_yomi2[0,2])
if komidasi != komidasi_[0,2]
komidasi = komidasi_[0,2]
f.print "<div align=\"right\"><a href=\"#top\">索引の初めに戻る</a></div><dt><big><b><a class=\"idx\" name=\"",komidasi_[2,2],"\">(",komidasi,")</a></b></big>\n"
end
#
w_anchor.each_with_index do |a_name,c|
if /#{a_name}/ =~ wri_name2
f.print "<dl><dt><b><a class=\"idx\" name=\"",c,"\">",a_name,"</a></b> <small>( ",wri_yomi2," )</small>"
end
end
#
w_name.sort.each do |wri_yomi,bk_yomi,wri_name,bk_name,bk_url,genre|
if /#{wri_name2}/ =~ wri_name
g_anchor.uniq.sort.each_with_index do |genre2,j|
if genre2 == genre
f.print "<dd><a href=\"",bk_url,"\"><b>",bk_name,"</b></a><small> [ <a href=\"",genre_idx_url,"#",j,"\">",genre,"</a> ]</small>\n"
end
end
end
end
f.print "</dl>\n"
end
#
f.print "</dl><div align=\"right\"><a href=\"#top\">索引の初めに戻る</a></div>\n"
f.close
#
| 固定リンク
コメント