読者です 読者をやめる 読者になる 読者になる

さわだのノート

書籍のお仕事に役立つかもしれない思いつきを記録しています。

RSS: 記事の更新情報 Rss Feed

原稿の縦書き整形スクリプトを修正

以前、半角英数字で書いた原稿を一発で縦書き用の体裁に整形するスクリプトを書きました。
縦書きフォーマット変更スクリプト修正版 - takepierrot Editor Note

Perlでの処理部分で、無意味にindexを使うとか、なかなかがんばっていたのですが、今考えると「tr演算子で変換すればいいじゃない?」と思ったわけです。
というわけで、もうちょいきれいになるようちょろっと修正してみました。

" 原稿を縦書き用にフォーマット
func! Tategaki() range
  let str = getline(a:firstline, a:lastline)
perl << EOF
use utf8;
use Encode;
my $text = decode_utf8(VIM::Eval('str'));
my $firstline = VIM::Eval('a:firstline');
my @list = ();
foreach my $str (split /\n/, $text) {
  1 while $str =~ s/([ 0-9a-zA-Z]+)/get_str($1)/e;
  1 while $str =~ s/([ 0-9a-zA-Z]{6,})/get_str($1)/e;
  1 while $str =~ s/^ \K([ 0-9a-zA-Z]{1,5})/get_str($1)/e;
  1 while $str =~ s/(?<![0-9])([0-9]{2})(?![0-9])/get_str($1)/e;
  $str =~ s/^ /<e3><80><80>/; # 置換文字列は全角スペースが入ってます(文字化け?
  push @list, $str;
}
sub get_str {
  my $key = shift;
  if ($key =~ m|[ 0-9a-zA-Z]+|) {
    $key =~ tr/ 0-9a-zA-Z/ 0-9a-zA-Z/;
  } else {
    $key =~ tr/ 0-9a-zA-Z/ 0-9a-zA-Z/;
  }
  return $key;
}
$main::curbuf->Set($firstline, @list);
EOF
execute "normal " . a:lastline . "gg"
endf

変な変数とかもやめました。だいぶすっきりした感じです。
使い方は前と同じです。

縦書き書籍の仕事がこないので、このスクリプトの出番があまりないのが残念です。
文庫本とかならちょっと書いたことはあるのですが……。