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
103
104
| | // TAB=4
// 実行には PPA.DLL が必須です。sakura.exe と同じフォルダに ppa.dll を入れておく事。
// マクロファイルの拡張子は .PPA でなくてはなりません。
// 次の変換をおこなう。
// '@'⇒'@'
// '!'⇒'!'
// '$'⇒'$'
// だけ(笑)。サンプルだから...ね。
// 必要な人は自分で増やして下さい。
// 変換方法は、
// 1.1行の内容を文字変数 str に取り込む。
// 2.PPA 上にて文字変数 str の変換を行う。
// 3.変換後の文字列変数 str を書き出す。(str の内容が変更された場合のみ)
// この処理をファイル先頭から末尾まで1行ずつループで処理していく。
// ※ ちゅうい ※
// S_GetSelectedString() を使っているのですが、取り込める文字列の長さに限界があるかも...
// つまり1行あたりの文字数に限界がある*かも*。
var // 変数を確保する場所
str:String; // 文字変数を用意
bef,aft:String; // 文字変数を用意
change:Integer; // 整数数値変数を用意
outf:Integer; // 整数数値変数を用意
pt:Integer; // 整数数値変数を用意
begin // ここより処理内容の記述
// ↓途中に空行があると、そこで処理が中断してしまう。その対策。
S_ReplaceAll('[\r\n]+', '!$&', 20); // ファイル全体に対し、行末に文字 ! を付加する。
S_MoveHistPrev(0); // 移動履歴: 前へ - 置換開始位置へ戻る
// ↓ EOF の前に文字がある場合のための対策 - 前処理
S_GoFileEnd(0); // ファイルの最後に移動
S_Char(13); // 文字入力 - (13 = 改行)
S_DeleteLine(0); // 行削除(折り返し単位) - オートインデント対策 - 改行した結果、タブ・スペース類が出た場合、それらを削除。
S_MoveHistPrev(0); // 移動履歴: 前へ - S_GoFileEnd を実行する前の位置へ戻る
S_GoFileTop(0); // ファイルの先頭に移動 - *1
repeat // 1行ごとに処理をするためのループ。
// 1行の内容を取り込む。
S_GoLineTop(1); // 行頭に移動(折り返し単位)
S_GoLineEnd_Sel(0); // (選択)行末に移動(折り返し単位)
str := S_GetSelectedString(0);
if( str = '' ) then break; // 文字列が空ならファイル終端とみなす。
outf := 0; // フラグ = 「この行を書き直す必要無し」にしておく
// -------------------------------------------------- //
repeat // '@' ⇒ '@' 変換
bef := '@'; aft := '@';
change := 0; // フラグ = 「変化無し」にしておく
pt := pos(bef,str); // bef の場所を探す。
if ( pt <> 0 ) then begin
change := 1; // フラグ = 「変化あり」
outf := 1; // フラグ = 「この行を書き直す必要あり」にしておく
str := Copy(str,1,pt-1) + aft + Delete(str,1,pt+Length(bef)-1 ); // 変換後の文字列を生成する。
end;
until (change = 0); // 見つからなかったらループ終了。
// -------------------------------------------------- //
repeat // '!' ⇒ '!' 変換
bef := '!'; aft := '!';
change := 0; // フラグ = 「変化無し」にしておく
pt := pos(bef,str); // bef の場所を探す。
if ( pt <> 0 ) then begin
change := 1; // フラグ = 「変化あり」
outf := 1; // フラグ = 「この行を書き直す必要あり」にしておく
str := Copy(str,1,pt-1) + aft + Delete(str,1,pt+Length(bef)-1 ); // 変換後の文字列を生成する。
end;
until (change = 0); // 見つからなかったらループ終了。
// -------------------------------------------------- //
repeat // '$' ⇒ '$' 変換
bef := '$'; aft := '$';
change := 0; // フラグ = 「変化無し」にしておく
pt := pos(bef,str); // bef の場所を探す。
if ( pt <> 0 ) then begin
change := 1; // フラグ = 「変化あり」
outf := 1; // フラグ = 「この行を書き直す必要あり」にしておく
str := Copy(str,1,pt-1) + aft + Delete(str,1,pt+Length(bef)-1 ); // 変換後の文字列を生成する。
end;
until (change = 0); // 見つからなかったらループ終了。
// -------------------------------------------------- //
if( outf <> 0 ) then S_InsText(str); // 変更後の文字列を書き出す。
S_Down(0); // カーソル下移動
until (False); // 無限ループ
S_MoveHistPrev(0); // 移動履歴: 前へ - S_GoFileTop - *1 実行前の位置へ戻る
// ↓ EOF の前に文字がある場合のための対策 - 後処理
S_GoFileEnd(0); // ファイルの最後に移動
S_DeleteLine(0); // 行削除(折り返し単位) - [EOF]前に付いた行番号を削除
S_DeleteBack(0); // カーソル前を削除 - 最初に追加した改行を削除
S_MoveHistPrev(0); // 移動履歴: 前へ - S_GoFileEnd を実行する前の位置へ戻る
S_ReplaceAll('!([\r\n]+)', '$1', 20); // ファイル全体に対し、行末の文字 ! を削除する。
S_SearchClearMark(0); // 検索マークの切替え
S_MoveHistPrev(0); // 移動履歴: 前へ - 置換開始前の位置へ戻る
S_CurLineCenter(0); // カーソル行をウィンドウ中央へ
S_ReDraw(0); // 再描画
end;
|