#!perl -w # ============================================================================== # 内部文字列はcp932/Shift_JISとするので use utf8; は不要 # ============================================================================== use File::Temp qw(tempfile); use File::Basename qw(basename); use Getopt::Long qw(GetOptions); use Encode qw(decode encode); use Tk; use strict; my $G_scrname = basename(__FILE__); # スクリプト名 # ============================================================================== # 引数/オプション読み取り # ============================================================================== { # コマンドライン引数初期値 my %args = (str=>'', fname=>'', help=>0); # コマンドライン引数取得(エラー時はusage()へ) GetOptions(\%args, 'str=s', 'fname=s', 'help') or usage(1); # -help指定ならusageへ usage(0) if ($args{help}); # str/fname未指定引数あればGUIモードへ if (($args{str} eq '') or ($args{fname} eq '')) { mode_gui(\%args); # GUIモード } else { mode_cui(\%args); # CUIモード } } # ============================================================================== # usage # ============================================================================== sub usage { my ($ret) = @_; print "文字列をHTMLに変換します。\n"; print "$G_scrname -str 文字列 -fname 出力ファイル名\n"; print " CUIモード動作: -str, -fname指定時\n"; print " GUIモード動作: 未指定オプション存在時\n"; exit($ret); } # ============================================================================== # CUI動作 # ============================================================================== sub mode_cui { # 引数 my ($args) = @_; # 実行本体へ my $ret = run(str=>$args->{str}, fname=>$args->{fname}, mode=>'cui'); # 補助表示 print "INF: $G_scrname: str=$ret->{str}\"\n"; print "INF: $G_scrname: fname=$ret->{fname}\n"; } # ============================================================================== # GUI動作 # ============================================================================== sub mode_gui { # 引数 my ($args) = @_; # MainWindowオブジェクト取得 my $o_mw = MainWindow->new(); # オブジェクト取得 $o_mw->title(decode('cp932',$G_scrname)); # ツールタイトル(スクリプト名) $o_mw->optionAdd('*font'=>['Meiryo UI',10]); # デフォルトフォント $o_mw->resizable(1,0); # (width, hight) widthのみサイズ変更可能 # Labelウィジェット設定(ウィジェットへ渡すデータはデコードutf-8) my $o_label_str = $o_mw->Label(-text=>decode('cp932','-str: 表示文字列')); my $o_label_fname = $o_mw->Label(-text=>decode('cp932','-fname: 出力ファイル名(省略可)')); # Entryウィジェット設定(ウィジェットから戻るデータはデコードutf-8) my $str_u8 = ''; # 値格納変数(utf-8想定) my $fname_u8 = ''; # 値格納変数(utf-8想定) my $o_entry_str = $o_mw->Entry(-textvariable=>\$str_u8, # 格納変数への参照 -width=>40); my $o_entry_fname = $o_mw->Entry(-textvariable=>\$fname_u8, # 格納変数への参照 -width=>40); # Entry文字初期値設定(引数からの値はcp932のため変換して渡す) $o_entry_str ->insert(0, decode('cp932',$args->{str})); $o_entry_fname->insert(0, decode('cp932',$args->{fname})); # Buttonウィジェット設定(サブルーチンリファレンスの書き方はTk::UserGuideに合わせた) # (ウィジェットから戻るデータはデコードutf-8) my $o_button_run = $o_mw->Button( -text=>'run', # ボタン上のテキスト -width=>6, # ボタンの幅(6文字) -font=>['Meiryo UI',8], # デフォルトと異なるフォント設定 -command=>sub{ # 関数への参照を与える run( # モードgui指定 mode=>'gui', # 文字変換して値を渡す str=>encode('cp932', $str_u8), fname=>encode('cp932', $fname_u8) ) } ); # ウィジェット配置(上から順番に置くだけ) my %padxy = (-padx=>8, -pady=>0); # デフォルトの(x,y)パディング値 $o_label_str ->pack(%padxy, -anchor=>'w' ); # Label(表示文字列): 左寄せ $o_entry_str ->pack(%padxy, -fill=>'both'); # Entry(表示文字列): windowに合わせて伸びる $o_label_fname->pack(%padxy, -anchor=>'w' ); # Label(出力ファイル名): 左寄せ $o_entry_fname->pack(%padxy, -fill=>'both'); # Entry(出力ファイル名): windowに合わせて伸びる $o_button_run ->pack(%padxy, -anchor=>'w', # Button(run): 左寄せ -pady=>2 ); # 最後のウィジェットなのでy方向パディング=2 # MainWindow実行開始 MainLoop(); } # ============================================================================== # 実行処理の本体(指定文字を指定色でHTMLにしてブラウザ表示) # ============================================================================== sub run { # 名前付き引数定義 my %defs = (str=>'', fname=>'', mode=>'cui'); # 名前付き引数受け my %args = (%defs, @_); # HTMLをヒアドキュメントと混ぜて作成 my $buf = << " EOT"; $G_scrname
$args{str}
EOT # ファイルハンドル取得 my $fh; if ($args{fname} eq '') { ($fh, $args{fname}) = tempfile(UNLINK => 1, SUFFIX => '.html'); # テンポラリファイル } else { $args{fname} .= '.html' unless ($args{fname} =~ /\.htm[l]*\s*$/); open($fh, "> $args{fname}"); # 指定ファイル } # HTML出力 print $fh $buf; # ファイルハンドルクローズ close($fh); # GUI実行時はstartでWebブラウザを開く # 最初の""はダミータイトル。スペース入りファイル名に対応するため system('start "" "'.$args{fname}.'"') if ($args{mode} eq 'gui'); # 現在の値を戻す return(\%args); } 1;