prepress-tips
codeLayouter の記述メモ
最終更新:
prepress-tips
-
view
最終更新日時: 2010/05/30
codeLayouter 再検討
- codeLayouter のもともとの発想は ...
- 構造は日本語プログラムで
- 処理は通常のプログラム言語で
- 書いて 組合わせる。
- 今までの検討は ...
- 事始め → 構造と処理を別の言語で書いて組合せる
- Rで → 構造と処理を別の言語で書いて組合せる 4 , 構造と処理を別の言語で書いて組合せる 5
- R風perl → 構造と処理を別の言語で書いて組合せる 6
- オブジェクト指向 → 構造と処理を別の言語で書いて組合せる 7
- 新しく取り入れたい発想は ...
- 日本語プログラム , 日本語シンボル をもっと広く アノテーション として考えて
- 構造を アノテーション で記述する。
- 意味を アノテーション で記述する。
- アノテーション を アノテーション に変換する。
- いろいろな定義を 位置・名前・内容 を分離して配置する。
- index は index の世界で閉じ detail は detail の世界で閉じる。
- 日本語プログラム , 日本語シンボル をもっと広く アノテーション として考えて
- そのほかに ...
- 余分な ; の挿入を抑える。
- コード中に / があっても変換する。
- 精密さを求めると java になるので やりすぎに注意する。
/?- 処理の構造
* ~ wgc問題を解く /
/ ~ プログラムの制御
? タイトル //
/ msg( タイトル )
? 初期状態 //
? 解の配列 //
/? ** 解の配列 に追加 ( string )
/ ~ GoalSeeker
/ 初期状態 からゴールを探し -> 解の配列
/ msg( 解の配列 )
* ~ プログラムの制御 /
? msg //
/? ** ( Message )を表示する
? オプション //
/? ** デバグ表示オプションの書式
? デバグ表示するとき //
* ~ GoalSeeker /
? 状態推移 //
/? * 状態推移 を初期化
/? ** 状態推移 に追加 ( State ) , ** 状態推移 から最後の状態を削除
? 一度あった //
/? * 一度あった を初期化
/? ** 一度あった ( State )
/? ** 一度あった に追加 ( State ), ** 一度あった から削除 ( State )
/ ~ 状態の操作
? GoalSeek //
/? ** start , ** ( State )からゴールを探し -> 解の配列
* GoalSeek // GoalSeek( 状態 , start )
/ if( start ) { 状態推移 を初期化 ; 一度あった を初期化 }
? 状態の一意表現 //
/ 状態の一意表現 = 状態の一意の文字列表現
/ if( 一度あった ( 状態の一意表現 ) ) { return }
/ if( ! 制約を満たしているか ) { return }
/ if( ゴールか ) { ゴールですること ; return }
/ 新しい状態になったとき すること
/ 一度あった に追加 ( 状態の一意表現 )
? どれか //
/ for どれか ( 連れていけるものは ) { GoalSeek( どれか を連れていったあと ) }
/ 一度あった から削除 ( 状態の一意表現 )
/ 前の状態に戻るとき すること
/?-- 状態の操作
* ~ 状態の操作 /
/? * 状態
? 状態の一意の文字列表現 //
? ゴールか //
? ゴールですること //
? 新しい状態になったとき すること //
? 前の状態に戻るとき すること //
/ ~ wgc問題の操作
? 制約を満たしているか //
? 連れていけるものは //
? ( One )を連れていったあと //
* ~ wgc問題の操作 /
/? * One
/? * fがいる , * wgの数 , * gcの数
/? * どれか1つ , * 反対側のどれか1つ
/? * fとOneを除く , * fとOneを加える
/?- 実ファイルの構造
/name wgc by perl / wgc_pl.pl
/ ~ wgc問題を解く
/name 未指定 /
/use / wgc_pl_detail.txt
* ~ wgc問題を解く /
/ ~ プログラムの制御
? タイトル //
/ msg( タイトル )
? 初期状態 //
? 解の配列 //
/? ** 解の配列 に追加 ( string )
/ ~ GoalSeeker
/ 初期状態 からゴールを探し -> 解の配列
/ msg( 解の配列 )
* ~ プログラムの制御 /
? msg //
/? ** ( Message )を表示する
? オプション //
/? ** デバグ表示オプションの書式
? デバグ表示するとき //
* ~ GoalSeeker /
? 状態推移 //
/? * 状態推移 を初期化
/? ** 状態推移 に追加 ( State ) , ** 状態推移 から最後の状態を削除
? 一度あった //
/? * 一度あった を初期化
/? ** 一度あった ( State )
/? ** 一度あった に追加 ( State ), ** 一度あった から削除 ( State )
/ ~ 状態の操作
? GoalSeek //
/? ** start , ** ( State )からゴールを探し -> 解の配列
* GoalSeek // GoalSeek( 状態 , start )
/ if( start ) { 状態推移 を初期化 ; 一度あった を初期化 }
? 状態の一意表現 //
/ 状態の一意表現 = 状態の一意の文字列表現
/ if( 一度あった ( 状態の一意表現 ) ) { return }
/ if( ! 制約を満たしているか ) { return }
/ if( ゴールか ) { ゴールですること ; return }
/ 新しい状態になったとき すること
/ 一度あった に追加 ( 状態の一意表現 )
? どれか //
/ for どれか ( 連れていけるものは ) { GoalSeek( どれか を連れていったあと ) }
/ 一度あった から削除 ( 状態の一意表現 )
/ 前の状態に戻るとき すること
/?-- 状態の操作
* ~ 状態の操作 /
/? * 状態
? 状態の一意の文字列表現 //
? ゴールか //
? ゴールですること //
? 新しい状態になったとき すること //
? 前の状態に戻るとき すること //
/ ~ wgc問題の操作
? 制約を満たしているか //
? 連れていけるものは //
? ( One )を連れていったあと //
* ~ wgc問題の操作 /
/? * One
/? * fがいる , * wgの数 , * gcの数
/? * どれか1つ , * 反対側のどれか1つ
/? * fとOneを除く , * fとOneを加える
/?- 実ファイルの構造
/name wgc by perl / wgc_pl.pl
/ ~ wgc問題を解く
/name 未指定 /
/use / wgc_pl_detail.txt
/?- wgc問題を解く
* タイトル // my $Title
$Title = '狼・山羊・キャベツの川渡し問題 を解く' ;
* 初期状態 // my $InitialState
$InitialState = 'fwgc' ;
* 解の配列 // my @AnswerArray
@AnswerArray = () ;
** 解の配列 に追加 \(( string )\) /
**~ push @AnswerArray , $1
/?- プログラムの制御
* msg // msg( MessageArray )
print map { "$_\x0a" } @_ ;
** ( Message )を表示する /
**~ msg( $1 )
* オプション // Option()
@ARGV ? $ARGV[0] : '' ;
** デバグ表示オプションの書式 /
**~ m,d,i
* デバグ表示するとき // WhenDebug()
/ オプション =~ デバグ表示オプションの書式
/?- goalseeker
* 状態推移 // @StateTrans
/ 状態推移 を初期化
* 状態推移 を初期化 /
@StateTrans = () ;
** 状態推移 に追加 \(( State )\) /
**~ push @StateTrans , $1
** 状態推移 から最後の状態を削除 /
**~ pop @StateTrans
* 一度あった // %Twice
/ 一度あった を初期化
* 一度あった を初期化 /
$Twice = () ;
** 一度あった \(( State )\) /
**~ $twice{ $1 }
** 一度あった に追加 \(( State )\) /
**~ $twice{ $1 } = 1 ;
** 一度あった から削除 \(( State )\) /
**~ delete $twice{ $1 } ;
* start / $_[1]
* 状態の一意表現 // my $StateString
* どれか // my $one
** ( State )からゴールを探し -> 解の配列 /
**~ GoalSeek( $1 , 'Start' )
/?- 状態の操作
* 状態 / $_[0]
* 状態の一意の文字列表現 // StateString( 状態 )
/ join '', sort split '', 状態
* ゴールか // IsGoal( 状態 )
/ 状態 eq ''
* ゴールですること // ThingsToDoAtGoal( 状態 )
? _状態推移の文字列 / my $StateTransString
/ _状態推移の文字列 = join ' → ', 状態推移 , 状態の一意の文字列表現
/ if( デバグ表示するとき ) { msg( _状態推移の文字列 ) }
/ 解の配列 に追加 ( _状態推移の文字列 )
* 新しい状態になったとき すること // ThingsToDoAtNewState( 状態 )
? _状態の一意表現 / my $StateString
/ _状態の一意表現 = 状態の一意の文字列表現
/ if( デバグ表示するとき ) { msg( _状態の一意表現 ) }
/ 状態推移 に追加 ( _状態の一意表現 )
* 前の状態に戻るとき すること // ThingsToDoAtBack( 状態 )
/ 状態推移 から最後の状態を削除
*制約を満たしているか // FillRestrict( 状態 )
/ if( fがいる ) { wgの数 > 0 && gcの数 > 0 }
/ else { wgの数 < 2 && gcの数 < 2 }
*連れていけるものは // PossibleToTake( 状態 )
/ if( fがいる ) { どれか1つ } else { 反対側のどれか1つ }
*( One )を連れていったあと // TakeOne( 状態 , One )
/ if( デバグ表示するとき ) { msg( "- ". One ) }
/ if( fがいる ) { fとOneを除く } else { fとOneを加える }
/?- wgc問題の操作
* One / $_[1]
* fがいる /
/ do { 状態 =~ m,f, }
* wgの数 /
/ scalar @{[ 状態 =~ m,[wg],g ]}
* gcの数 /
/ scalar @{[ 状態 =~ m,[gc],g ]}
* どれか1つ /
/ ( sort split '', 状態 )
* 反対側のどれか1つ /
/ ( sort "fwgc" =~ m,[^ 状態 ],g )
* fとOneを除く /
/ ( join '', 状態 =~ m,[^f One ],g )
* fとOneを加える /
/ ( 状態 . "f" . ( One ne "f" ? One : "" ) )
* タイトル // my $Title
$Title = '狼・山羊・キャベツの川渡し問題 を解く' ;
* 初期状態 // my $InitialState
$InitialState = 'fwgc' ;
* 解の配列 // my @AnswerArray
@AnswerArray = () ;
** 解の配列 に追加 \(( string )\) /
**~ push @AnswerArray , $1
/?- プログラムの制御
* msg // msg( MessageArray )
print map { "$_\x0a" } @_ ;
** ( Message )を表示する /
**~ msg( $1 )
* オプション // Option()
@ARGV ? $ARGV[0] : '' ;
** デバグ表示オプションの書式 /
**~ m,d,i
* デバグ表示するとき // WhenDebug()
/ オプション =~ デバグ表示オプションの書式
/?- goalseeker
* 状態推移 // @StateTrans
/ 状態推移 を初期化
* 状態推移 を初期化 /
@StateTrans = () ;
** 状態推移 に追加 \(( State )\) /
**~ push @StateTrans , $1
** 状態推移 から最後の状態を削除 /
**~ pop @StateTrans
* 一度あった // %Twice
/ 一度あった を初期化
* 一度あった を初期化 /
$Twice = () ;
** 一度あった \(( State )\) /
**~ $twice{ $1 }
** 一度あった に追加 \(( State )\) /
**~ $twice{ $1 } = 1 ;
** 一度あった から削除 \(( State )\) /
**~ delete $twice{ $1 } ;
* start / $_[1]
* 状態の一意表現 // my $StateString
* どれか // my $one
** ( State )からゴールを探し -> 解の配列 /
**~ GoalSeek( $1 , 'Start' )
/?- 状態の操作
* 状態 / $_[0]
* 状態の一意の文字列表現 // StateString( 状態 )
/ join '', sort split '', 状態
* ゴールか // IsGoal( 状態 )
/ 状態 eq ''
* ゴールですること // ThingsToDoAtGoal( 状態 )
? _状態推移の文字列 / my $StateTransString
/ _状態推移の文字列 = join ' → ', 状態推移 , 状態の一意の文字列表現
/ if( デバグ表示するとき ) { msg( _状態推移の文字列 ) }
/ 解の配列 に追加 ( _状態推移の文字列 )
* 新しい状態になったとき すること // ThingsToDoAtNewState( 状態 )
? _状態の一意表現 / my $StateString
/ _状態の一意表現 = 状態の一意の文字列表現
/ if( デバグ表示するとき ) { msg( _状態の一意表現 ) }
/ 状態推移 に追加 ( _状態の一意表現 )
* 前の状態に戻るとき すること // ThingsToDoAtBack( 状態 )
/ 状態推移 から最後の状態を削除
*制約を満たしているか // FillRestrict( 状態 )
/ if( fがいる ) { wgの数 > 0 && gcの数 > 0 }
/ else { wgの数 < 2 && gcの数 < 2 }
*連れていけるものは // PossibleToTake( 状態 )
/ if( fがいる ) { どれか1つ } else { 反対側のどれか1つ }
*( One )を連れていったあと // TakeOne( 状態 , One )
/ if( デバグ表示するとき ) { msg( "- ". One ) }
/ if( fがいる ) { fとOneを除く } else { fとOneを加える }
/?- wgc問題の操作
* One / $_[1]
* fがいる /
/ do { 状態 =~ m,f, }
* wgの数 /
/ scalar @{[ 状態 =~ m,[wg],g ]}
* gcの数 /
/ scalar @{[ 状態 =~ m,[gc],g ]}
* どれか1つ /
/ ( sort split '', 状態 )
* 反対側のどれか1つ /
/ ( sort "fwgc" =~ m,[^ 状態 ],g )
* fとOneを除く /
/ ( join '', 状態 =~ m,[^f One ],g )
* fとOneを加える /
/ ( 状態 . "f" . ( One ne "f" ? One : "" ) )
- index は “index”らしくなり detail の記述は 既存のコードに近くなった。
呼び出し方のアノテーション も入りそう。 - detail は 既存コードから自動作成でき index は detail から自動作成できそう。
index の修正を detail 側に 自動的にマージ できないか。 - アノテーション→アノテーション変換 はもっと検討が必要。
codeLayouter 利用時のひな形
作成中。
/name 処理名 html / 処理名.html
/? 冒頭の記述
・・・
/? 冒頭の記述
・・・
/name 処理名 js / 処理名.js
/? 冒頭の記述
・・・
/? 冒頭の記述
・・・
/?- 処理
* 処理の記述 /
/ 処理の詳細の記述
・・・
/ 処理の詳細の記述
・・・
/?- 実ファイルの構造
/name 処理名 html /
/ HTMLの記述
* HTMLの記述 /
/ HTML header
/ タグの記述
/ HTML footer
* HTMLの記述 /
/ HTML header
/ タグの記述
/ HTML footer
* タグの記述 /
・・・
・・・
/name 処理名 js /
/ 変数宣言の記述
/ 処理の記述
/ 処理の記述
* 変数宣言の記述 /
/ 処理の変数宣言
・・・
/ 処理の変数宣言
・・・
* 処理の記述 /
/ 処理の記述
・・・
/ 処理の記述
・・・
/use / 処理名_detail.txt
/?- 処理 詳細
* 変数の記述 / 変数のシンボル
・・・
・・・
* 処理の変数宣言 /
/ 変数の宣言と初期化
・・・
? 関数呼び出しの記述 // 関数のシンボル
・・・
/ 変数の宣言と初期化
・・・
? 関数呼び出しの記述 // 関数のシンボル
・・・
*処理の詳細の記述 /
・・・
・・・
* 関数呼び出しの記述 /
・・・
・・・
- 終了タグの記述
- <tag -> や <-tag> に置き換える。
- 余分な ; の発生を抑える
- 1行 と 複数行 のコードの記述を使い分ける。
- コードの記述の終わりに /? を入れる。
my $pl = ( 0 < @ARGV && $ARGV[0] =~ /^[p]$/i );
my $css = ( 0 < @ARGV && $ARGV[0] =~ /^[c]$/i );
my $js = ( 0 < @ARGV && $ARGV[0] =~ /^[j]$/i );
my $tag = ( 0 < @ARGV && $ARGV[0] =~ /^[t]$/i );
my $r = ( 0 < @ARGV && $ARGV[0] =~ /^[r]$/i );
my $dot = ( 0 < @ARGV && $ARGV[0] =~ /^[d]$/i );
my $uws = ( 0 < @ARGV && $ARGV[0] =~ /^[u]$/i );
while( <STDIN> ) {
$pl && do {
s,^(\s*)//,$1#,;
s,^/\*,$1=pod,;
s,^\*/,$1=cut,;
s,^(\s*\{\s*)//,$1#,;
s,^(?!\s*(?:my|our)\s)(\s*)(\S+\s*)\([^\)]*\)(\s*\{\s*)//,$1sub $2$3#,;
s,^(?!\s*sub\s)(\s*[^\{;]*[^\{;\s])\s*;?\s*(\{\s*)//,$1 ; $2#,;
s,^(?!\s*sub\s)(\s*[^\{;/]*;\s*)//,$1#,;
};
$css && do {
m,^[^{;]*;?\s*{\s*//, && ( s"^([^{;]*);?(\s*{\s*)//"$1$2/*", s"(?=$)" */" );
m,^\s*//, && ( s"^(\s*)//"$1/*", s"(?=$)" */" );
};
$js && do {
s,^(\s*)(\S+\s*\([^\)]*\)\s*\{\s*)//,$1function $2//,;
s,^(?!\s*function\s)(\s*[^\{;]*[^\{;\s])\s*;?\s*(\{\s*)//,$1 ; $2//,;
s,([\,\*])\;(?=\s*$),$1,;
};
$tag && do {
m,^\s*//, && ( s/^\s*/$&<!-- /, s/$/ -->/ ), s,(>\s*);$,$1, ;
s,<\-([\w\-]+)>,</$1>,g ;
};
$r && do {
s,^(\s*\S+\s*)(\([^\)]*\)\s*\{\s*)//,$1 <- function $2#,;
s,^(\s*\S+)(\s*)(;?\s*)//,$1 <- NULL$2; $3#,;
s,^(\s*)//,$1#,;
};
$dot && do {
m,^[^{;]*;?\s*{\s*//, && ( s"^([^{;]*);?(\s*{\s*)//"$1$2/*", s"(?=$)" */" );
m,^\s*//, && ( s"^(\s*)//"$1/*", s"(?=$)" */" );
};
$uws && do {
m,^[^{;]*;?\s*{\s*//, && s"^([^{;]*);?(\s*){\s*//"$1$2//" ;
m,^\s*}\s*$, && s"^(\s*)}(\s*)$"$1//$2" ;
m,^\s*ifb\s.*\S +endif;?(?=\s|$), && s"^(\s*)ifb(\s.*\S) +endif;?(?=\s|$)"$1if$2" ;
m,^\s*if\s.*?;(?=\s*$), && s"^(\s*if\s.*?);(?=\s*$)"$1" ;
};
print;
}
my $css = ( 0 < @ARGV && $ARGV[0] =~ /^[c]$/i );
my $js = ( 0 < @ARGV && $ARGV[0] =~ /^[j]$/i );
my $tag = ( 0 < @ARGV && $ARGV[0] =~ /^[t]$/i );
my $r = ( 0 < @ARGV && $ARGV[0] =~ /^[r]$/i );
my $dot = ( 0 < @ARGV && $ARGV[0] =~ /^[d]$/i );
my $uws = ( 0 < @ARGV && $ARGV[0] =~ /^[u]$/i );
while( <STDIN> ) {
$pl && do {
s,^(\s*)//,$1#,;
s,^/\*,$1=pod,;
s,^\*/,$1=cut,;
s,^(\s*\{\s*)//,$1#,;
s,^(?!\s*(?:my|our)\s)(\s*)(\S+\s*)\([^\)]*\)(\s*\{\s*)//,$1sub $2$3#,;
s,^(?!\s*sub\s)(\s*[^\{;]*[^\{;\s])\s*;?\s*(\{\s*)//,$1 ; $2#,;
s,^(?!\s*sub\s)(\s*[^\{;/]*;\s*)//,$1#,;
};
$css && do {
m,^[^{;]*;?\s*{\s*//, && ( s"^([^{;]*);?(\s*{\s*)//"$1$2/*", s"(?=$)" */" );
m,^\s*//, && ( s"^(\s*)//"$1/*", s"(?=$)" */" );
};
$js && do {
s,^(\s*)(\S+\s*\([^\)]*\)\s*\{\s*)//,$1function $2//,;
s,^(?!\s*function\s)(\s*[^\{;]*[^\{;\s])\s*;?\s*(\{\s*)//,$1 ; $2//,;
s,([\,\*])\;(?=\s*$),$1,;
};
$tag && do {
m,^\s*//, && ( s/^\s*/$&<!-- /, s/$/ -->/ ), s,(>\s*);$,$1, ;
s,<\-([\w\-]+)>,</$1>,g ;
};
$r && do {
s,^(\s*\S+\s*)(\([^\)]*\)\s*\{\s*)//,$1 <- function $2#,;
s,^(\s*\S+)(\s*)(;?\s*)//,$1 <- NULL$2; $3#,;
s,^(\s*)//,$1#,;
};
$dot && do {
m,^[^{;]*;?\s*{\s*//, && ( s"^([^{;]*);?(\s*{\s*)//"$1$2/*", s"(?=$)" */" );
m,^\s*//, && ( s"^(\s*)//"$1/*", s"(?=$)" */" );
};
$uws && do {
m,^[^{;]*;?\s*{\s*//, && s"^([^{;]*);?(\s*){\s*//"$1$2//" ;
m,^\s*}\s*$, && s"^(\s*)}(\s*)$"$1//$2" ;
m,^\s*ifb\s.*\S +endif;?(?=\s|$), && s"^(\s*)ifb(\s.*\S) +endif;?(?=\s|$)"$1if$2" ;
m,^\s*if\s.*?;(?=\s*$), && s"^(\s*if\s.*?);(?=\s*$)"$1" ;
};
print;
}
cmd = WScript.Arguments.Item( 0 );
cmd = '"' + cmd.replace( /,/g, '" "' ) + '"';
WScript.CreateObject( "WScript.Shell" ).exec( cmd );
//WScript.Echo( cmd );
cmd = '"' + cmd.replace( /,/g, '" "' ) + '"';
WScript.CreateObject( "WScript.Shell" ).exec( cmd );
//WScript.Echo( cmd );
@echo off
cd /d "%~dp0"
set codeLayouter=c:\mytools\codeLayouter.exe
set browser=C:\Program Files\Fenrir ^& Co\Grani\bin\Grani.exe
set fn=%~n0
set fn=%fn:codeLayout_=%
echo new %fn%
echo/ && "%codeLayouter%" %fn%_index.txt || ( pause && exit )
set ex=js
echo/ && echo adjust %fn%.%ex%
( if exist _.%ex% del _.%ex% ) && ren %fn%.%ex% _.%ex%
perl adjust_source.pl j < _.%ex% > %fn%.%ex%
if exist _.%ex% del _.%ex%
( if exist _.%ex% del _.%ex% ) && ren %fn%.%ex% _.%ex%
perl -n ^
-e "BEGIN { use Encode qw( encode decode ) ; }" ^
-e "print ;" ^
_.%ex% > %fn%.%ex%
if exist _.%ex% del _.%ex%
set ex=html
echo/ && echo adjust %fn%.%ex%
( if exist _.%ex% del _.%ex% ) && ren %fn%.%ex% _.%ex%
perl adjust_source.pl t < _.%ex% > %fn%.%ex%
if exist _.%ex% del _.%ex%
( if exist _.%ex% del _.%ex% ) && ren %fn%.%ex% _.%ex%
perl -n ^
-e "BEGIN { use Encode qw( encode decode ) ; }" ^
-e "print ;" ^
_.%ex% > %fn%.%ex%
if exist _.%ex% del _.%ex%
echo/ && echo start browsing %fn%.%ex%
rem cscript //nologo //b start.js "%browser%,%~dp0%fn%.%ex%"
echo/ && pause
cd /d "%~dp0"
set codeLayouter=c:\mytools\codeLayouter.exe
set browser=C:\Program Files\Fenrir ^& Co\Grani\bin\Grani.exe
set fn=%~n0
set fn=%fn:codeLayout_=%
echo new %fn%
echo/ && "%codeLayouter%" %fn%_index.txt || ( pause && exit )
set ex=js
echo/ && echo adjust %fn%.%ex%
( if exist _.%ex% del _.%ex% ) && ren %fn%.%ex% _.%ex%
perl adjust_source.pl j < _.%ex% > %fn%.%ex%
if exist _.%ex% del _.%ex%
( if exist _.%ex% del _.%ex% ) && ren %fn%.%ex% _.%ex%
perl -n ^
-e "BEGIN { use Encode qw( encode decode ) ; }" ^
-e "print ;" ^
_.%ex% > %fn%.%ex%
if exist _.%ex% del _.%ex%
set ex=html
echo/ && echo adjust %fn%.%ex%
( if exist _.%ex% del _.%ex% ) && ren %fn%.%ex% _.%ex%
perl adjust_source.pl t < _.%ex% > %fn%.%ex%
if exist _.%ex% del _.%ex%
( if exist _.%ex% del _.%ex% ) && ren %fn%.%ex% _.%ex%
perl -n ^
-e "BEGIN { use Encode qw( encode decode ) ; }" ^
-e "print ;" ^
_.%ex% > %fn%.%ex%
if exist _.%ex% del _.%ex%
echo/ && echo start browsing %fn%.%ex%
rem cscript //nologo //b start.js "%browser%,%~dp0%fn%.%ex%"
echo/ && pause