0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
| | // 演算子の前後を入れ替える。
// TAB=4
// 実行には PPA.DLL が必須です。PPA.DLL を入手して sakura.exe と同じフォルダに入れておいてください。
// マクロファイルの拡張子は .PPA でなくてはなりません。
// 文字列を範囲選択してから実行すると、選択範囲(先頭の1行のみ)内の文字列を
// 演算子の前後を入れ替えます。例えば
// ・if( ch <= 'A' )
// で「 ch <= 'A' 」を範囲選択してから実行すると
// ・if( 'A' <= ch )
// となります。
// 演算子として判定されるのは、最も文字列の前方にある <=>! 何れかの文字列です。
var
str:String;
idt,p1,cnd,p2,bk:String;
ch:String;
pt,sh,nm:Integer;
// for debug
CRLF,mess:String;
begin
str := S_GetSelectedString(0); // 選択部分の文字列を取得
// 以降で、選択範囲文字列 str から
// ・idt:先頭部分のタブ・スペース類
// ・p1 :演算子の前の文字列(先頭・末尾のタブ・スペース類を含まない)
// ・cnd:演算子、及び、その前後のタブ・スペース類
// ・p2 :演算子の後ろの文字列(先頭・末尾のタブ・スペース類を含まない)
// ・bk :末尾部分のタブ・スペース類
// に分けていく。
// 比較演算子の先頭位置を sh に取得する。
sh := Length(str);
pt := Pos('<',str); if( (pt <> 0)and(pt < sh) ) then sh := pt;
pt := Pos('>',str); if( (pt <> 0)and(pt < sh) ) then sh := pt;
pt := Pos('=',str); if( (pt <> 0)and(pt < sh) ) then sh := pt;
pt := Pos('!',str); if( (pt <> 0)and(pt < sh) ) then sh := pt;
// sh = 演算子の先頭位置
// 演算子文字の文字数を nm に取得する。
nm := 0;
for pt := sh to Length(str) do
begin
ch := Copy(str,pt,1);
if( (ch <> '<')and(ch <> '>')and(ch <> '=')and(ch <> '!') ) then break; // 演算子文字でなければループ脱出
nm := nm + 1;
end;
p1 := Copy ( str , 1 , sh - 1 ); // p1 := 演算子の前まで(演算子含まない)の文字列
cnd := Copy ( str , sh , nm ); // cnd := 演算子部分の文字列
p2 := Delete( str , 1 , sh - 1 + nm ); // p2 := 演算子より後ろ(演算子含まない)の文字列
// *** p1 末尾のタブ・スペース類を cnd 先頭に移動する。 *** //
str := p1; // str := p1 そのまま
p1 := TrimRight(p1); // p1 := 末尾のタブ・スペース類を取り除いた文字列
// str と p1 の文字数の差が「元の p1 の末尾部分にあったタブ・スペース類の文字数」である。
// この値を利用して、末尾部分のタブ・スペース類を cnd 先頭に追加する。
cnd := Copy( str , Length(p1)+1 , Length(str)-Length(p1) ) + cnd;
// *** p2 先頭のタブ・スペース類を cnd の末尾に移動する。 *** //
str := p2; // str := p2 そのまま
p2 := TrimLeft(p2); // p2 := 先頭のタブ・スペース類を取り除いた文字列
// str と p2 の文字数の差が「元の p2 の先頭部分にあったタブ・スペース類の文字数」である。
// この値を利用して、先頭部分のタブ・スペース類を cnd 末尾に追加する。
cnd := cnd + Copy( str , 1 , Length(str)-Length(p2) );
// *** p1 先頭のタブ・スペース類を idt に移動する。 *** //
str := p1; // str := p1 そのまま
p1 := TrimLeft(p1); // p1 := 先頭のタブ・スペース類を取り除いた文字列
// str と p1 の文字数の差が「元の p1 の先頭部分にあったタブ・スペース類の文字数」である。
// この値を利用して、先頭部分のタブ・スペース類を idt に格納する。
idt := Copy( str , 1 , Length(str)-Length(p1) );
// *** p2 末尾のタブ・スペース類を cnd 先頭に移動する。 *** //
str := p2; // str := p2 そのまま
p2 := TrimRight(p2); // p2 := 末尾のタブ・スペース類を取り除いた文字列
// str と p2 の文字数の差が「元の p2 の末尾部分にあったタブ・スペース類の文字数」である。
// この値を利用して、末尾部分のタブ・スペース類を cnd 先頭に追加する。
bk := Copy( str , Length(p2)+1 , Length(str)-Length(p2) );
// for Debug 取得した情報をダイアログに表示する。
CRLF := '
';
// mess := '';
// mess := mess + '[' + idt + ']' + CRLF;
// mess := mess + '[' + p1 + ']' + CRLF;
// mess := mess + '[' + cnd + ']' + CRLF;
// mess := mess + '[' + p2 + ']' + CRLF;
// mess := mess + '[' + bk + ']' + CRLF;
// mess := mess + '--------------------' + CRLF;
// mess := mess + '[' + str + ']' + CRLF;
// MessageBox( mess,'Debug',0 );
// Exit();
if ( p1 = '' ) then Exit(); // p1 (演算子の前の物)が空なら何もせず終了
if ( cnd = '' ) then Exit(); // cnd (演算子部分)が空なら何もせず終了
if ( p2 = '' ) then Exit(); // p2 (演算子の後ろの物)が空なら何もせず終了
S_InsText( idt + p2 + cnd + p1 + bk ); // p1 と p2 を入れ替えてエディタへ書き出す。
end;
|