日本語テキストに隣接しているASCIIの括弧を探すRubyスクリプト
『数学ガール・ミルカさんとテトラちゃん』という本を書いています。数式がたくさん出てくる読み物なのでLaTeXで書いているのですが、数式部分の括弧はASCIIで書き、テキスト本文中の括弧はいわゆる全角で書きました。書き上がってからテキスト部分にASCIIの括弧が混在していないかどうかを調べようと思い、Rubyでスクリプトを作りました。
# find_paren.rb - Shift_JISの日本語テキストファイル中で、 # 日本語に接しているASCIIの括弧を探すスクリプト。 # EUC-jpに変換した後、括弧の前後に、 # 最上位ビットが立っている一バイトが存在するかを調べている。 require 'iconv' if ARGV.length == 0 puts "Usage: find_paren.rb filename..." exit end ARGV.each do |filename| open(filename, "r") do |f| line_number = 0 while line = f.gets line.chomp! line_number += 1 eucline = Iconv.new('EUC-jp', 'Shift_JIS').iconv(line) if /(.)\)/.match(eucline) or /\((.)/.match(eucline) c = $1 if (0x80 & c[0]) != 0 puts "#{filename}(#{line_number}):#{line}\n" end end end end end __END__
たとえば以下のようなファイルsample.texがあったとします。
\par 「はい、すっきりしました。話の途中ですみません。 あたし、いつも、使っている文字が気になって……でも、 $(a - b)^2 \geq 0$ については納得しました」 \par テトラちゃんは、にこっと笑ってから目を輝かせ、(それで、次は?)という顔をする。 なかなか表情が豊かな女の子だ。
find_paren.rbの実行結果は以下の通り。
> ruby find_paren.rb sample.tex sample.tex(8):テトラちゃんは、にこっと笑ってから目を輝かせ、(それで、次は?)という顔をする。
以下、ポイント。
- 数式のほうの括弧はスルーして、本文中の括弧だけをタグジャンプ形式でピックアップしている。
- Rubyで文字コードを得る方法が分からなくて苦労した(ordを探していた)。
- Rubyで0が偽でないことを忘れていて悩んだ(!= 0を書かずに括弧がある行すべてが表示された)。
- テトラちゃんは可愛い。
- 『数学ガール・ミルカさんとテトラちゃん』
追記:
なかださんからコメント。感謝。[あとで試す]
if /(?![^\0-\x7e]).\)|\((?![^\0-\x7e])./s =~ lineならiconvは不要ですが、せめてIconv.convを使うかIconv.newをループの外に出したほうがいいです。