ishiducaの日記 このページをアンテナに追加 RSSフィード

2009-03-11

[][][]日本語の文書を適当に整形する 15:46 日本語の文書を適当に整形する - ishiducaの日記 を含むブックマーク はてなブックマーク - 日本語の文書を適当に整形する - ishiducaの日記 日本語の文書を適当に整形する - ishiducaの日記 のブックマークコメント

長い日本語の文章を適当な位置で改行したり、適当にインデントを付けたい場合に使いたいスクリプトが(あるのかもしれないけど)見当たらないので、いい加減に作ってみた。メールで文書を貼付けるとかに使う。

こんな原文なのを

安全管理体制
    次に掲げる者を選任し、輸送の安全確保について責任及び権限を定めて、輸送の安全確保のための体制を確立(「組織図」参照)し、社内への周知を徹底する
    -安全総括管理者
        取締役のうち、貨物自動車運送事業輸送安全規則第2条の6に規程する要件を満たす者の中から、安全統括管理者を選任する。安全統括管理者は次の責務を有する。
        -全社員に対し、関係法令等の遵守と輸送の安全確保が最も重要であるという意識を徹底すること
        -輸送の安全の確保に関し、その実施及び管理の態勢として、安全マネジメントシステムを確立し、実施し、維持すること

こうして、

$ perl formed 規程文書.txt

こんな感じに整形する

安全管理体制
    次に掲げる者を選任し、輸送の安全確保について責任及び権限を定めて、輸送
    の安全確保のための体制を確立(「組織図」参照)し、社内への周知を徹底す
    る
    - 安全総括管理者
        取締役のうち、貨物自動車運送事業輸送安全規則第2条の6に規程する要
        件を満たす者の中から、安全統括管理者を選任する。安全統括管理者は次
        の責務を有する。
        - 全社員に対し、関係法令等の遵守と輸送の安全確保が最も重要であると
          いう意識を徹底すること
        - 輸送の安全の確保に関し、その実施及び管理の態勢として、安全マネジ
          メントシステムを確立し、実施し、維持すること

この辺とかどうにかしたい

  • 半角の日本語(半角の片仮名とか)使うと崩れる
  • utf-8だけなの
  • 禁則処理しない

formedスクリプトのコード

#!/usr/bin/perl -s -wnl
# Usage: $ perl formed [-len=length] file [file ...]
use strict;
use Encode;
our ($len);
BEGIN {
    $len or $len = 36;
    $len = $len * 2;
}
my $indent   = '';
my $list_flg = '';
my $new_str = '';
my $width   = 0;
$_ = decode('utf-8',$_);
s/^\t/    / and s/\t/    /g;
s/^ +-/$& /g;
/^( +)(-?)/g and
  $indent = $1 and
    $2 and $list_flg = "  ";

while( length > 0 ){
    my $char = substr($_,0,1);
    $_       = substr($_,1);
    $char = encode('utf-8',$char);
    my $char_bytes =
      length $char == 3 ? 2 : 1;
    $new_str .= $char;
    $width += $char_bytes;
    if( $width > $len ){
        print $new_str;
        $new_str = '';
        $width = 0;
        $_ = $indent . $list_flg . $_;
    }
}
print $new_str;

変換の効率めちゃくちゃ悪いです...orz

CressCress2009/03/11 21:29decodeとencodeの引数に 'utf-8' が決め打ちになっているのを $len のように引数から取ってやったらどうでしょうか。Encode::Guess という自動判別モジュールもありますが、あまり精度がよくないです。
半角カナだと妙なことになるのは…… /[ア-ン]/ みたいな正規表現で分けてやるか、あるいはいっそ全角にしてしまうとか……なんかバイト数気にしているみたいですが、全角にしてやればsubstrで一発です。

ishiducaishiduca2009/03/12 14:22> 半角カナだと妙なことになるのは…… /[ア-ン]/ みたいな正規表現で分けてやるか、
> あるいはいっそ全角にしてしまうとか

業務でも使っているので、全角に変換するのはさけたいところなので正規表現でチェックするが現実的かも。

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20090311