自動タグ付けマクロの改造についてNo.04294
Majima さん 04/05/13 14:52
 
会議室の皆さん。大変お世話になっております。また一つ質問いたします。

以前、この会議室の04196番の質問で、ある文書を一定の規則でタグ
付けするマクロの案について質問しましたところ、皆様からの沢山の
ご意見を頂きました。詳しい内容は会議室の04196番を見て頂けると
有難いのですが、現在は山紫水明さんのお作りになったマクロを基本
として色々と改造しております。ほぼ希望通りの動きをしますが、文書
によってはエラーというか、ある文書には対応しきれない部分もあって
そこの修正をお願いしようと思い、質問しているわけです。

私が今まで改造してきたマクロで、以下のような文書にタグ付けしよう
とする時、メニューの4番目の“Paragraph <p id=><s id=>”では、
次の行にまだパラグラフが残っているのにマクロが終了したり、最悪の
場合、文書の一部が削除されて次のパラグラフへ移ったりするという
ことが起こります。

*********【例】*********************************************

-----------------------【テキスト】-----------------------
AはB(タイトル)
AはBだ。それからCはDだ。
ところが実はAもCだった!そしてBもDだった。(私も知らなかったが)
ということはBもCなのか?それはだれにもわからない・・
それって、どういうこと?私には分からない。
-------------------------------------------------------------

こういったテキストをマクロでタグ付けした際の求める結果

------------------【希望する結果】--------------------------
<body id=1>
<div id=1.1>
<head id=1.1.h1>AはB(タイトル)</head>
<p id=1.1.p1><s id=1.1.p1.s1>AはBだ。</s><s id=1.1.p1.s2>それからCはDだ。
</s></p>
<p id=1.1.p2><s id=1.1.p2.s1>ところが実はAもCだった!</s><s id=1.1.p2.s2>
そしてBもDだった。</s><s id=1.1.p2.s3>(私も知らなかったが)</s></p>
<p id=1.1.p3><s id=1.1.p3.s1>ということはBもCなのか?</s><s id=1.1.p3.s2>
それはだれにもわからない・・</s></p>
<p id=1.1.p4><s id=1.1.p4.s1>それって、どういうこと?</s><s id=1.1.p4.s2>私
には分からない。</s></p>
</div>
</body>
-------------------------------------------------------------

ですが今のマクロ文では次の結果になり、文書の内容を一部削除されて
しまいます。

------------------【実際の結果】--------------------------
<body id=1>
<div id=1.1>
<head id=1.1.h1>AはB(タイトル)</head>
<p id=1.1.p1><s id=1.1.p1.s1>AはBだ。</s><s id=1.1.p1.s2>それからCはDだ。
</s></p>
<p id=1.1.p2><s id=1.1.p2.s1>ところが実はAもCだった!</s><s id=1.1.p2.s2>
そしてBもDだった。</s><s id=1.1.p2.s3>(私も知らなかったが)
<p id=1.1.p3><s id=1.1.p3.s1>それはだれにもわからない・・
<p id=1.1.p4><s id=1.1.p4.s1>私には分からない。</s></p>
</div>
</body>
-----------------------------------------------------------

説明が長々となってしまいましたが、要するにこのマクロのメニュー
4番目の“Paragraph <p id=><s id=>”をタグ付けする際に、「。」
や「!」や「?」などを基準として一つの文とみなして処理している
訳ですが上のテキストのように、一文が「。」や「?」などで
終わっていない文(例えばテキストの3行目の「知らなかったが)」の
部分であったり、4行目の「わからない・・」の部分)ではそこで文が
終わっているのにもかかわらず認識されていません。

それはマクロ文がある文字を基準として文を区切っているわけです
から、それ以外の文字だったり、「。」で終わらなくてすぐ改行に
なったりする場合は当然ですよね。

それよりももっと問題なのは次の行のテキストの内容まで一部削除
されてしまう場合があるときです。文末が「。」や「!」や「?」など
ある程度予想される文字が来る場合はいいですが、これから色々な
テキストを処理していくときに予想もしなかった文字で終わる文が
出てくるとも限りません。

パラグラフの中の文と文の間に、このような「。」などで終わらない
文が来るのものは、後でタグを追加すれば問題ないですが、「。」など
で終わらなくてすぐに改行が来る場合が問題となっています。
パラグラフの中で改行が来たらとにかくパラグラフを閉じるタグ
“</s></p>”を入れて次のパラグラフに移るようにするにはどういう
風にマクロを書き換えればいいのでしょうか。

色々と考えましたがどうも上手くいきません。よろしくお願いします。
以下にマクロ文と、マクロ実行の際に使っている強調ファイルを記し
ておきます。

************** マクロファイル ********************************
//------ InsertTag.mac ----------------------------------------//
menu "&1 Tagging",
     "&2 Tag Check";
if( result == 0 ) endmacro;
else if( result == 2 ) goto Revision;
call GetID;
call ChangeSearchMode;
#free = freecursor;
if( !#free ) freecursorswitch;
while( 1 ) {
    #x = x; #y = y;
    setmark;
    moveto 30, #y;
    menu "&1 Body <body id=>",
         "&2 Division <div id=>",
         "&3 Header <head id=>",
         "&4 Paragraph <p id=><s id=>",
         "***************************",
         "&N Next",
         "&B Back",
         "&E Enter",
         "&D Delete",
         "***************************",
         "&U Undo",
         "&R Redo",
         "&Q Quit";
    #r = result;
    moveto #x, #y;
    setmark;
    if( #r == 0 || #r == 13 ) break;
    else if( #r == 1 ) call BodyID;
    else if( #r == 2 ) call DivID;
    else if( #r == 3 ) call HeadID;
    else if( #r == 4 ) call PID;

    else if( #r == 6 ) movetolineno 1, lineno + 1;
    else if( #r == 7 ) movetolineno 1, lineno - 1;
    else if( #r == 8 ) insertfix "\n";
    else if( #r == 9 ) deleteline;

    else if( #r == 11 ) undo;
    else if( #r == 12 ) redo;
    if( lineno >= linecount2 - 2 ) endmacro;
}
if( !#free ) freecursorswitch;
RestoreSearchMode:
endmacro;

BodyID:
#body = #body + 1;
#body = val(input( "Body Id", str(#body)));
if( #body == 0 ) return;
insert "<body id=" + str(#body) + ">";
gofileend;
insert "</div>\n</body>\n";
prevpos;
movetolineno 1, lineno + 1;
return;

DivID:
#div = #div + 1;
#div = val(input( "Division Id", str(#div)));
if( #div == 0 ) return;
if( #div > 1 ) insert "</div>\n";
insert "<div id=" + str(#body) + "." + str(#div) + ">";
movetolineno 1, lineno + 1;
#pid = 0;
#head = 0;
return;

HeadID:
#head = #head + 1;
#head = val(input( "Header Id", str(#head)));
if( #head == 0 ) return;
insert "<head id=" + str(#body) + "." + str(#div) + ".h"
        + str(#head) + ">";
golineend2;
insert "</head>";
movetolineno 1, lineno + 1;
#pid = 0;
return;

PID:
#pid = #pid + 1;
#pid = val(input( "Paragraph Id", str(#pid)));
if( #pid == 0 ) return;
insert "<p id=" + str(#body) + "." + str(#div) + ".p"
        + str(#pid) + ">";
golinetop2;
searchdown ">";
right;
#sid = 1;
call SID;
return;

SID:
#line = lineno;
while( 1 ) {
    insert "<s id=" + str(#body) + "." + str(#div) + ".p"
            + str(#pid) + ".s"  + str(#sid) + ">";
    searchdown "[。!?]」?", regular;
    if ( !result ) endmacro;
    if( lineno > #line ) {
        golinetop2;
        break;
    }
    moveto selendx, selendy;
    if( code == 0x0d ) {
        insert "</s></p>";
        movetolineno 1, lineno + 1;
        break;
    } else insert "</s>";
    #sid = #sid + 1;
}
return;

//------- Tag check -------//
Revision:
call ChangeSearchMode;
disabledraw;
if( selecting ) {
    escape;
    moveto selendx, selendy;
    #endline = lineno;
    moveto seltopx, seltopy;
} else {
    gofiletop;
    #endline = linecount2;
}
while( 1 ) {
    golinetop2;
    #i = 1;
    while( 1 ) {
        #line = lineno;
        searchdown "s[0-9]+", regular;
        if( result == 0 ) goto End;
        if( lineno > #line ) break;
        if( lineno >= #endline ) {
            golinetop2;
            goto End;
        }
        insert "s" + str( #i );
        #i = #i + 1;
    }
}
End:
call RestoreSearchMode;
endmacro;

ChangeSearchMode:
#searchmode = searchmode;
if( !#searchmode ) {  //検索状態を変更
    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    writeregnum "SelectFound", 1;
    envchanged;
}
return;

RestoreSearchMode:
if( !#searchmode ) {  //検索状態をもとにもどす
    writeregnum "SelectFound", 0;
    envchanged;
    closereg;
}
return;

GetID:
##x = x; ##y = y;
searchup "p id=[0-9.]+p", regular;
if( !result ) goto GetEnd
moveto selendx, y;
beginsel;
searchdown ">";
#pid = val( gettext( seltopx, seltopy, selendx, selendy ) );
moveto ##x, ##y;
searchup "head id=[0-9.]+h", regular;
moveto selendx, y;
beginsel;
searchdown ">";
#head = val( gettext( seltopx, seltopy, selendx, selendy ) );
moveto ##x, ##y;
searchup "div id=[0-9]+", regular;
moveto selendx, y;
right;
beginsel;
searchdown ">";
#div = val( gettext( seltopx, seltopy, selendx, selendy ) );
moveto ##x, ##y;
searchup "body id=";
moveto selendx, y;
beginsel;
searchdown ">";
#body = val( gettext( seltopx, seltopy, selendx, selendy ) );
GetEnd:
moveto ##x, ##y;
return;
//-------------------------------------------------//

********** マクロ作業用強調ファイル ***************************
80,<body id=.[^<]*>
80,</body>
95,<head id=.[^<]*>
95,</head>
80,<div id=.[^<]*>
80,</div>
50,<p id=.[^<]*>
50,</p>
91,<s id=.[^<]*>
91,</s>

****************************************************************



[ ]
RE:04294 自動タグ付けマクロの改造についNo.04295
ENCODINGSHIFTJIS さん 04/05/13 16:11
 
[。!?]」?

[。!?]」?|.$

替えるのでは、どうでしょう

[ ]
RE:04295 自動タグ付けマクロの改造についNo.04296
Majima さん 04/05/13 17:14
 
ENCODINGSHIFTJISさん

早速のお答え有難うございます。ご指摘の通り

[。!?]」?

[。!?]」?|.$

に変えてみてマクロを動かしてみたところ、文が「。」などで
終わらなくても改行のあるところでちゃんと文を閉じてくれています。
もう少し調べてみて目的の動きになっているか確認したいと思います。

それから
[。!?]
の次に現れる可能性があるものとして、
「’」や「”」や「』」
などもありますが、こういった複数のものを追加する場合はどう表記
すればいいのでしょうか。

それからもう一つ。今までは日本語のテキストですが、英語などの
半角文字を対象とした場合は、この部分をどのように書き換えれば
いいのでしょうか。英語などの場合は
「.!?」
が文末の基本になって、
「'")>」
などがその後ろに来る場合があります。また、
「.!?」や「'"」
といった記号が来なくてすぐ改行になったり、または
「This is a----」
というような表現を濁すような表記で書かれたものまでと、様々です。

この部分の正規表現の表記方法もご教授いただけると有難いです。

[ ]
RE:04296 自動タグ付けマクロの改造についNo.04297
アルビレオ さん 04/05/13 19:42
 
秀丸ユーザーのアルビレオです。

>[。!?]」?
>を
>[。!?]」?|.$

>それから
>[。!?]
>の次に現れる可能性があるものとして、
>「’」や「”」や「』」
>などもありますが、こういった複数のものを追加する場合はどう表記
>すればいいのでしょうか。

[。!?]は「。または、または?」という意味ですから、同じように[」’”』]
と書けばいいことになります。
[。!?][」’”』]?|.$
ではどうでしょう。

>それからもう一つ。今までは日本語のテキストですが、英語などの
>半角文字を対象とした場合は、この部分をどのように書き換えれば
>いいのでしょうか。英語などの場合は
>「.!?」
>が文末の基本になって、
>「'")>」
>などがその後ろに来る場合があります。

上の例を見ればどうすればいいか想像がつくと思いますが、
[.!?]['")>]?
のようになります。

>また、
>「.!?」や「'"」
>といった記号が来なくてすぐ改行になったり、

英文の場合は改行が文脈の区切りとしての意味を持つことはまずありません。
(だから英文用の方では.$を書いていません)
そしてパラグラフは空行(改行の連続)で表されます。
このため、英文と和文を共通のマクロで処理するのは難しいと思います。
和文で使う文字が全角のみだと都合がいいのですが、例文にも和文の中に半角の
かっこが出てきていますからね…

>または
>「This is a----」
>というような表現を濁すような表記で書かれたものまでと、様々です。

ハイフンが1つだけだと区切りとみなすのはまずいので多少複雑になりますね。
また、...といったピリオドの連続の場合もおかしなことになります。
というわけで
([!?]|--+|\.+)['")>]?
ならいけるかな?

[ ]
RE:04297 自動タグ付けマクロの改造についNo.04298
Majima さん 04/05/13 23:09
 
アルビレオさん

有難うございました。かなりいい感じで作業ができそうです。しかし
まだ問題がありまして、例えば日本語の文で

AはBだ。AはBだ。AはBだ。
CはDだ。CはDだ。CはDだ。
AもCだ。AもCだ。AもCだ。

といった文があるとするとき、2行目の最後の文の「。」が無い状態で
すぐ改行がきてもきちんと処理してくれますが、

AはBだ。AはBだ。AはBだ。
CはDだ。CはDだ。CはDだ(←「。」が無い)
AもCだ。AもCだ。AもCだ。

これが例えば同じ場所で「。」の後に全角半角スペースが入って
しまうと、その文を閉じないというエラーが出て、次の行の一部を
削除してしまいます。

AはBだ。AはBだ。AはBだ。
CはDだ。CはDだ。CはDだ。 (←全角や半角のスペースの後改行)
AもCだ。AもCだ。AもCだ。

一方、英語のような半角記号を使う場合では、以下のような文が
ある場合に、

A is B. A is B. A is B.
C is D. C is D. C is D.
A is C too. A is C too. A is C too.

2行目の最後の文の「.」が抜けている場合だったり、

A is B. A is B. A is B.
C is D. C is D. C is D(←「.」が抜けている)
A is C too. A is C too. A is C too.

2行目の最後の文の「.」の後にスペースが入って改行になる場合、

A is B. A is B. A is B.
C is D. C is D. C is D. (←スペースの後に改行)
A is C too. A is C too. A is C too.

3行目の一部が削除されてしまいます。

マクロ文の検索語を

[.!?]['")>]?
に.$を加えて
[.!?]['")>]?|.$

とすると、改行前の文の最後の「.」が抜けている部分でもとりあえず
一文として</s></p>で閉じてくれますが、「.」の後にスペースが
入っている場合は相変わらず上手くいきません。

テキストの入力ミスなどでこのような文が出る場合もあるということと
考えた上で、マクロの前にテキストを一定の書式に整形することも
必要ですが、とにかくこのマクロによって文の一部が損なわれる恐れが
あるというのが一番憂慮している点です。

マクロ文でとにかく何でもいいから、改行が入ったら、そのセンテンス
はおしまいということで</s></p>で閉じてくれると安心します。後で
タグの追加・削除の手作業の量が増えることにもなりますが、気づか
ないうちに失われたテキストの一部を修正する作業がもっと大変な気が
するからです。その点を汲み取ってまたご教授いただきたいです。

また、テキストを整形する際に、その行の改行前の最後の文で「.」が
無い部分だけを探す検索語はあるのでしょうか。要するに「.」や「!」
以外のある文字の後に改行が来るという場合です。よろしくお願いします。


[ ]
RE:04298 自動タグ付けマクロの改造についNo.04299
Majima さん 04/05/13 23:38
 
自己レスです

>また、テキストを整形する際に、その行の改行前の最後の文で「.」が
>無い部分だけを探す検索語はあるのでしょうか。要するに「.」や
>「!」以外のある文字の後に改行が来るという場合です。

いろいろ考えたところこんな感じで確認できそうな気がします。

.*[^.!?>]\n

これであたっていますでしょうか。



[ ]
RE:04298 自動タグ付けマクロの改造についNo.04300
アルビレオ さん 04/05/14 07:48
 
アルビレオです。

>これが例えば同じ場所で「。」の後に全角半角スペースが入って
>しまうと、その文を閉じないというエラーが出て、次の行の一部を
>削除してしまいます。
>
>AはBだ。AはBだ。AはBだ。
>CはDだ。CはDだ。CはDだ。 (←全角や半角のスペースの後改行)
>AもCだ。AもCだ。AもCだ。

いちばん簡単なのは、空白文字も」などと同じく文末区切り文字の一部とみなす
ことです。
空白の連続などもありそうなので、
[。!?][」’”』  ]*|.$
なら大丈夫でしょう。他にも文末の一部として扱って欲しい文字があれば、2つ
目の[]の中に追加していくだけで済みます。

また、元のマクロでは改行の直前には必ず文末文字があるという前提だったのに、
そのルールを変更してしまっているので、

SID:
#line = lineno;
while( 1 ) {
    insert "<s id=" + str(#body) + "." + str(#div) + ".p"
            + str(#pid) + ".s"  + str(#sid) + ">";
    searchdown2 "[。!?][」’”』  ]*", regular;
    if ( !result ) {
        movetolineno linelen2, #line;
        insert "</s></p>";
        break;
    }
    escape;
    if( lineno > #line ) {
        #nextline = lineno;
        movetolineno linelen2, #line;
        insert "</s></p>";
        movetolineno 1, #nextline + 1;
        break;
    }
    moveto selendx, selendy;
    if( code == 0x0d ) {
        insert "</s></p>";
        movetolineno 1, lineno + 1;
        break;
    } else insert "</s>";
    #sid = #sid + 1;
}
return;

とでもした方がいいでしょう。

>テキストの入力ミスなどでこのような文が出る場合もあるということと
>考えた上で、マクロの前にテキストを一定の書式に整形することも
>必要ですが、とにかくこのマクロによって文の一部が損なわれる恐れが
>あるというのが一番憂慮している点です。

最初にあげられたマクロをテストしましたが、いくつか「動作環境」などの設定
を変えて試してみても、元のテキストが削除されることはありませんでした。
おそらく範囲選択状態のまま insert が行なわれたせいだと思いますが、マクロ
のコードを見る限りそれらしいところが見つかりません。
こちらは秀丸 Ver.4.10 β29です。

>マクロ文でとにかく何でもいいから、改行が入ったら、そのセンテンス
>はおしまいということで</s></p>で閉じてくれると安心します。後で
>タグの追加・削除の手作業の量が増えることにもなりますが、気づか
>ないうちに失われたテキストの一部を修正する作業がもっと大変な気が
>するからです。その点を汲み取ってまたご教授いただきたいです。

つまり文の途中での改行はないと考えていいということでしょうか?

>.*[^.!?>]\n
>
>これであたっていますでしょうか。

文末だけを見つければいいので .* は不要です。
[^.!?>]$
で十分でしょう。

[ ]
RE:04300 自動タグ付けマクロの改造についNo.04301
Majima さん 04/05/14 15:38
 
アルビレオさん

ありがとうございました。日本語のほうは下記のマクロ文も書き換えて

>SID:
>#line = lineno;
>while( 1 ) {
>    insert "<s id=" + str(#body) + "." + str(#div) + ".p"
>            + str(#pid) + ".s"  + str(#sid) + ">";
>    searchdown2 "[。!?][」’”』  ]*", regular;
>    if ( !result ) {
>        movetolineno linelen2, #line;
>        insert "</s></p>";
>        break;
>    }
>    escape;
>    if( lineno > #line ) {
>        #nextline = lineno;
>        movetolineno linelen2, #line;
>        insert "</s></p>";
>        movetolineno 1, #nextline + 1;
>        break;
>    }
>    moveto selendx, selendy;
>    if( code == 0x0d ) {
>        insert "</s></p>";
>        movetolineno 1, lineno + 1;
>        break;
>    } else insert "</s>";
>    #sid = #sid + 1;
>}
>return;

動かしてみたところ、ほぼエラーがなくなりました。色々なテキスト
を考えて試していますが、

******** こんな感じです ************

AはBだ。AはBだ。
AはBだ。AはBだ。
AはBだ。AはBだ。  
AはBだ。AはBだ。 
AはBだ。AはBだ。  
AはBだ。AはBだ
AはBだ。AはBだ 。
AはBだ。AはBだ 。
AはBだ。AはBだ.
AはBだ。AはBだ.
AはBだ。AはBだ.  
AはBだ。AはBだ. 
AはBだ。AはBだ.  

*********************************

マクロ文の

[。!?][」’”』  ]*
に.$を追加して
[。!?][」’”』  ]*|.$

としたほうがエラーの数が少なくなるように思えます。大体マクロの
構造が分かってきた感じがしますので、なんとかいじりながら使って
いけそうです。まぁそもそもマクロをかける前にテキストを整形する
ことが大事でしょうね。全ての条件に合わせるのはきりがないですから。

英語版のほうは上のマクロの部分を書き換えて検索語の部分を半角に
なおしました。終わりに「.$」も付けました。

[.!?]['\")> ]*|.$

これで今のところエラー無く動いていますが。私は前回の投稿で、
「英語などの半角文字を対象」といった表現をつかっていましたが、
この文字の含まれるテキストは実は韓国語でして、韓国語のテキストに
ついては上のマクロでも一部エラーが出てしまいます。それははやり
改行のすぐ前に「.」が無かったり、「.」の後に不必要なスペースが
きた後、改行が来るようなテキストにおいてです。

韓国語は本文以外は基本的に英語のような1バイト文字を使うので、
英語と同じようなマクロでいけると思っていましたが、やはり問題が
あるようです。また私のコンピューターの環境も韓国版XPに英語版
秀丸Ver3.19をインストールして、ユニコードで作成したテキストを
扱っているというのも一つの原因があるかもしれません。

>最初にあげられたマクロをテストしましたが、いくつか「動作環境」
>などの設定を変えて試してみても、元のテキストが削除されることは
>ありませんでした。おそらく範囲選択状態のまま insert が行なわれ
>たせいだと思いますが、マクロのコードを見る限りそれらしいところ
>が見つかりません。こちらは秀丸 Ver.4.10 β29です。

こういった動作の違いもOSとか秀丸なのか英語版秀丸なのか、またまた
テキストのコードが何なのかによっても変わるのかなと思っています。
ちなみに今でも韓国語のテキストにおいて、ある条件で元のテキストが
削除されることが起きます。それは大体改行前の文末に「.」が無い
とか文末に余分なスペースが入っている場合に限っておきているよう
なので、マクロの前に一度テキストを整形すれば解決できると思います。

>つまり文の途中での改行はないと考えていいということでしょうか?

文の途中での改行はありません。あるパラグラフの中に幾つかの
センテンスが入るわけですが、そのパラグラフはエディター的に考えて
一行の中に収まっています。よって文の途中、つまりパラグラフの
途中のセンテンスの中で改行が入るということは、次のパラグラフに
移るということになります。

>文末だけを見つければいいので .* は不要です。
>[^.!?>]$
>で十分でしょう。

これも韓国語のテキストでの検索結果ですが、

[^.!?>]$

これだと全ての行末にヒットするのですが・・・。

[^.!?>]\n

これだと改行の前の「.」の後に不必要なスペースが入ったり改行の
前に「.」が無く、全角の記号類「…」「〜」が来る場合にヒット
して、韓国語の文の後にすぐ改行で終わっているものにはヒット
しません。

.*[^.!?>]\n

にすると韓国語のテキスト整形の際に修正が必要な部分を探すことが
できそうです。


[ ]
RE:04301 自動タグ付けマクロの改造についNo.04302
アルビレオ さん 04/05/14 19:09
 
アルビレオです。

>マクロ文の
>
>[。!?][」’”』  ]*
>に.$を追加して
>[。!?][」’”』  ]*|.$
>
>としたほうがエラーの数が少なくなるように思えます。大体マクロの
>構造が分かってきた感じがしますので、なんとかいじりながら使って
>いけそうです。まぁそもそもマクロをかける前にテキストを整形する
>ことが大事でしょうね。全ての条件に合わせるのはきりがないですから。

私の書いたマクロはテストが不十分でバグがありました。
でもまあ .$ を追加した方が短くなりますね。
.$ を追加したら、
    if ( !result ) {
        movetolineno linelen2, #line;
        insert "</s></p>";
        break;
    }
    escape;
    if( lineno > #line ) {
        #nextline = lineno;
        movetolineno linelen2, #line;
        insert "</s></p>";
        movetolineno 1, #nextline + 1;
        break;
    }
の部分は
    if ( !result ) {
        movetolineno linelen2+1, #line;
        insert "</s></p>";
        break;
    }
に変更してください。

>こういった動作の違いもOSとか秀丸なのか英語版秀丸なのか、またまた
>テキストのコードが何なのかによっても変わるのかなと思っています。

まあたぶん秀丸の設定だけの問題だと思います。
削除された結果を見ると<p id=...>を挿入するときに範囲選択状態のままになっ
ているのが原因だと思われるので、削除されるパターンを見つけたらその直前の
行が整形される前まで巻き戻して
PID:
の直後の行に
message "pause";
を追加してください。
その状態でマクロを実行すると途中で「pause」というダイアログが出ます。
そのときに削除される個所が範囲選択になっているか、すでに削除されているか
で原因を絞り込めると思います。

>[^.!?>]$
>
>これだと全ての行末にヒットするのですが・・・。

うわ、本当だ…
なんかバグっぽいですね。こういう仕様なのかなぁ?

>[^.!?>]\n
>
>これだと改行の前の「.」の後に不必要なスペースが入ったり改行の
>前に「.」が無く、全角の記号類「…」「〜」が来る場合にヒット
>して、韓国語の文の後にすぐ改行で終わっているものにはヒット
>しません。
>
>.*[^.!?>]\n
>
>にすると韓国語のテキスト整形の際に修正が必要な部分を探すことが
>できそうです。

スペースや「…」「〜」を [^.!?>] の中にどんどん追加した方がいいのではな
いでしょうか。
韓国語で終わっているものにヒットしないのは、.*を追加しても同じような気が
するのですが、実際にはそれでうまくいってるんですよね…なんでだろ?

[ ]
RE:04302 自動タグ付けマクロの改造についNo.04303
Iranoan さん 04/05/14 19:29
 
 秀丸担当さん、皆さん今日は、Iranoan です。
> >[^.!?>]$
> >
> >これだと全ての行末にヒットするのですが・・・。
>
> うわ、本当だ…
> なんかバグっぽいですね。こういう仕様なのかなぁ?
 本題については解りませんが、現状では取り敢えず、
[^.!?>\n]$
にすれば、回避できる気がします。

 $ を使っているので、\n は必要無い気がするのですが....。どうなんで
しょう?-> 秀丸担当さん

[ ]
RE:04302 自動タグ付けマクロの改造についNo.04304
Majima さん 04/05/14 23:31
 
アルビレオさん

ありがとうございます。ご指摘の通りマクロ文を一部変更したところ
大分よくなりました。これも韓国版XP+英語版秀丸Ver3.19+韓国語の
ユニコードテキストファイルによく動作報告になりすが、前回のように
一部のテキスト自体が削除されてしまったり、最悪の場合.dllなどの
ファイルをエディターで開いたときに見られるへんてこな字に文字化け
までしてしまう(何で??といった感じ)状態は現れなくなりました。

前回もそうでしたが、今回もそういったエラーがでる場合は、韓国語
の後にすぐ改行が来ているものが原因となっています。今回の改良版
での結果では、次の行の一部が削除されない代わりに、次の行にまた
がって「.」などを検索して、そこまでを一つのパラグラフとして
認識しています。要するにマクロの中では改行というか文末の「$」を
認識していないのでしょうか。同じ環境下で英語のテキストをかけると
バク無しでうまく動いてくれるんですがね。韓国語だからという感じ
がしますが。

>PID:
>の直後の行に
>message "pause";
>を追加してください。

この方法でもしもの対策を取ることもいいですが、タグ付けをする
テキストの内容が長いと、パラグラフが変わるたびにダイアログが
出てしまうのでいちいちダイアログを閉じるのも大変な感じがします。
(すみません。面倒くさがりなもので・・・)

そのアイディアのひとつとして

#pid = val(input( "Paragraph Id", str(#pid)));

のダイアログ出る際に、その位置を常に画面の中央右寄りあたりに
すれば、

message "pause";

で一度止めなくても範囲選択になっているかどうか確認できると思い
ます。削除される時はその部分が範囲選択になっているからです。
マクロ最初のメニューのようにダイアログの位置を変えることもできる
のでしょうか。

>韓国語で終わっているものにヒットしないのは、.*を追加しても同じ
>ような気がするのですが、実際にはそれでうまくいってるんですよ
>ね…なんでだろ?

世の中には不思議なことがいっぱいあるようです。今はとりあえずどう
にかして目的の検索ができるので軽い気持ちで考えていますが、本当に
どうしてでしょうね。

[ ]
RE:04303 自動タグ付けマクロの改造についNo.04305
Majima さん 04/05/14 23:46
 
Iranoanさん

>本題については解りませんが、現状では取り敢えず、
>[^.!?>\n]$
>にすれば、回避できる気がします。
> $ を使っているので、\n は必要無い気がするのですが....。

私の環境

韓国版XP+英語版秀丸Ver3.19においての動作結果では

[^.!?>\n]$

では何も検索されませんが、「$」を「\n」に変えると検索します。
しかしそれは英文のテキストでは目的の結果が得られるようですが、
韓国語のテキストでは何故か、韓国語の後にすぐ改行が来る場所には
ヒットしません。これもやはり前に「.*」を追加して

.*[^.!?>\n]\n

とすると目的の検索結果が得られるようです。どうも「$」があやしい
ですが、どうなんでしょうかね。

[ ]
RE:04304 自動タグ付けマクロの改造についNo.04306
アルビレオ さん 04/05/15 02:06
 
アルビレオです。

>>PID:
>>の直後の行に
>>message "pause";
>>を追加してください。
>
>この方法でもしもの対策を取ることもいいですが、タグ付けをする
>テキストの内容が長いと、パラグラフが変わるたびにダイアログが
>出てしまうのでいちいちダイアログを閉じるのも大変な感じがします。
>(すみません。面倒くさがりなもので・・・)

いや、message文を追加するのは削除される個所を見つけたあとです。
そこでマクロを中断して、削除された前の行が元の状態に戻るまでアンドゥして
からマクロにmessage文を追加してマクロを再実行します。
異常がある個所だけでテストすれば十分ですから。

>そのアイディアのひとつとして
>
>#pid = val(input( "Paragraph Id", str(#pid)));
>
>のダイアログ出る際に、その位置を常に画面の中央右寄りあたりに
>すれば、
>
>message "pause";
>
>で一度止めなくても範囲選択になっているかどうか確認できると思い
>ます。削除される時はその部分が範囲選択になっているからです。
>マクロ最初のメニューのようにダイアログの位置を変えることもできる
>のでしょうか。

そうですね。この場合でも異常を見つけてから巻き戻して確認すれば十分です。
その程度ならダイアログをマウスで移動させるくらいはたいした手間ではないで
しょう。

[ ]
RE:04306 自動タグ付けマクロの改造についNo.04308
Majima さん 04/05/15 15:58
 
アルビレオさん

ありがとうございます。色々テストしてみます。それからこのマクロ文
についてもう少し質問があります。

openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";

と書かれている部分がありますが、レジストリという概念がよく分かり
ません。コンピューター用語辞書などでみると、
http://e-words.jp/w/E383ACE382B8E382B9E38388E383AA-1.html

プログラムが自動的にデータの記録や更新、削除などを行うとされて
いますが、このマクロの場合もそうなんでしょうか。
「openreg」ということはすでにレジストリのファイルが存在している
というこのなのでしょうか。

私は特別な環境(韓国語XP+英語版秀丸Ver3.19)でこのマクロを動かして
いるので、問題がないのかと確認の為にご質問させていただきます。

[ ]
RE:04308 自動タグ付けマクロの改造についNo.04309
でるもんた さん 04/05/15 16:37
 
でるもんたです。

> openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
>
> と書かれている部分がありますが、レジストリという概念がよく分かり
> ません。コンピューター用語辞書などでみると、
> http://e-words.jp/w/E383ACE382B8E382B9E38388E383AA-1.html
>
> プログラムが自動的にデータの記録や更新、削除などを行うとされて
> いますが、このマクロの場合もそうなんでしょうか。
> 「openreg」ということはすでにレジストリのファイルが存在している
> というこのなのでしょうか。

レジストリというのは OS が管理しているデータベースで、一般的にはアプリが
設定情報などを記録するために使います。秀丸もその例に漏れません。

ところがレジストリは、レジストリエディタを使ってユーザーが書き換える
こともできます。regedit というコマンドを起動してみてください。
#マシンの管理者が regedit の起動を禁止している場合もあります。

で、一般に、各ユーザーごとのアプリの設定は
  HKEY_CUREENT_USER\Software\作者名\アプリ名
というキーの下に置くのが作法とされています。
秀丸の場合は上記の場所になります。

[ ]
RE:04309 自動タグ付けマクロの改造についNo.04310
Majima さん 04/05/15 17:00
 
でるもんたさん

お答えありがとうございます。詳しいことはまだ理解できていませんが
とにかくマクロを正確に動かしたいと考えたとき、

openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";

の部分を日本語版秀丸を使った場合と、英語版秀丸を使った場合とで
書き換える部分はあるかということが、あるかということです。

>で、一般に、各ユーザーごとのアプリの設定は
>HKEY_CUREENT_USER\Software\作者名\アプリ名
>というキーの下に置くのが作法とされています。
>秀丸の場合は上記の場所になります。

「アプリ名」というのはプログラムの名前ですよね。日本語版秀丸の
場合は「Hidemaru」で、英語版秀丸の場合は「Maruo」になっていると
思うのですが、それの違いによってマクロ文を書き換える必要があり
ますか?もし書き換える必要があるなら、どこまで書き換えればよい
のでしょうか。




[ ]
RE:04309 自動タグ付けマクロの改造についNo.04311
Iranoan さん 04/05/15 17:09
 
 Majimaさん今日は、Iranoan です。
> で、一般に、各ユーザーごとのアプリの設定は
>   HKEY_CUREENT_USER\Software\作者名\アプリ名
> というキーの下に置くのが作法とされています。
> 秀丸の場合は上記の場所になります。
 ここまでは、でるもんたさんの仰るとおりです。しかし
> 私は特別な環境(韓国語XP+英語版秀丸Ver3.19)でこのマクロを動かして
> いる
ということなので、
> openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";

openreg "CURRENTUSER", "Software\\Hidemaruo\\Maruo\\Env";
としないと、正常に動作しないかも知れません。少なくとも Ver.4.07 では、
ここを見ているようです。

> プログラムが自動的にデータの記録や更新、削除などを行うとされて
> いますが、このマクロの場合もそうなんでしょうか。
 マクロを見てみると、検索にヒットしたときに、いつも範囲選択する設定に
するためのようです。
 Majimaさんの環境では、このカテゴリーは無いと思いますので、
>     openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
>     writeregnum "SelectFound", 1;
>     envchanged;

    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    if( !result ){
      message "Can not open registry!";
      endmacro;
    }
    writeregnum "SelectFound", 1;
    envchanged;
とすれば、エラーになると思います。今まで、設定の変更ができなくても正常
に動いていたのは、Majimaさんが、既に設定で検索にヒットしたときに
範囲選択するようにしていたためだと思います。

 P.S できれば、Ver.4.07 へのヴァージョン・アップをお勧めします。

[ ]
RE:04311 自動タグ付けマクロの改造についNo.04312
Majima さん 04/05/15 17:54
 
Iranoanさん

ありがとうございます。ご指摘の通り書き換えて色々試したところ、

openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";

でも

openreg "CURRENTUSER", "Software\\Hidemaruo\\Maruo\\Env";

でも動きますし、

>openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
>writeregnum "SelectFound", 1;
>envchanged;
>
>を
>    >openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
>   if( !result ){
>      message "Can not open registry!";
>      endmacro;
>    }
>    writeregnum "SelectFound", 1;
>    envchanged;
>とすれば、エラーになると思います。

こうやってもちゃんと動いています。また、

openreg "CURRENTUSER", "Software\\Hidemaruo\\Majima\\Env";

でも

openreg "CURRENTUSER", "Software\\Hidemaruo\\まじま\\Env";

でも(笑)動きます。

ということはマクロがここを読んでいないということでしょうか。
でもちゃんと連番でタグ付けもできてますし、修正したあとにマクロ
文のメニューから「Tag check」を選んでもちゃんと直してくれます。

マクロ文も色々いじってきたので、念のため今現在のマクロも載せて
おきます。

**************************************************************
//------ InsertTag.mac ----------------------------------------//
config "l+ o+";
menu "&1 Tagging (Japanese)",
     "&2 Tag Check";
if( result == 0 ) endmacro;
else if( result == 2 ) goto Revision;
call GetID;
call ChangeSearchMode;
#free = freecursor;
if( !#free ) freecursorswitch;
while( 1 ) {
    #x = x; #y = y;
    setmark;
    moveto 30, #y;
    menu "&1 Body <body id=>",
         "&2 Division <div id=>",
         "&3 Header <head id=>",
         "&4 Paragraph <p id=><s id=>",
         "***************************",
         "&N Next",
         "&B Back",
         "&E Enter",
         "&D Delete",
         "***************************",
         "&U Undo",
         "&R Redo",
         "&Q Quit";
    #r = result;
    moveto #x, #y;
    setmark;
    if( #r == 0 || #r == 13 ) break;
    else if( #r == 1 ) call BodyID;
    else if( #r == 2 ) call DivID;
    else if( #r == 3 ) call HeadID;
    else if( #r == 4 ) call PID;

    else if( #r == 6 ) movetolineno 1, lineno + 1;
    else if( #r == 7 ) movetolineno 1, lineno - 1;
    else if( #r == 8 ) insertfix "\n";
    else if( #r == 9 ) deleteline;

    else if( #r == 11 ) undo;
    else if( #r == 12 ) redo;
    if( lineno >= linecount2 - 2 ) endmacro;
}
if( !#free ) freecursorswitch;
RestoreSearchMode:
endmacro;

BodyID:
#body = #body + 1;
#body = val(input( "Body Id", str(#body)));
if( #body == 0 ) return;
insert "<body id=" + str(#body) + ">";
gofileend;
insert "</div>\n</body>\n";
prevpos;
movetolineno 1, lineno + 1;
return;

DivID:
#div = #div + 1;
#div = val(input( "Division Id", str(#div)));
if( #div == 0 ) return;
if( #div > 1 ) insert "</div>\n";
insert "<div id=" + str(#body) + "." + str(#div) + ">";
movetolineno 1, lineno + 1;
#pid = 0;
#head = 0;
return;

HeadID:
#head = #head + 1;
#head = val(input( "Header Id", str(#head)));
if( #head == 0 ) return;
insert "<head id=" + str(#body) + "." + str(#div) + ".h"
        + str(#head) + ">";
golineend2;
insert "</head>";
movetolineno 1, lineno + 1;
#pid = 0;
return;

PID:
#pid = #pid + 1;
#pid = val(input( "Paragraph Id", str(#pid)));
if( #pid == 0 ) return;
insert "<p id=" + str(#body) + "." + str(#div) + ".p"
        + str(#pid) + ">";
golinetop2;
searchdown ">";
right;
#sid = 1;
call SID;
return;

SID:
#line = lineno;
while( 1 ) {
    insert "<s id=" + str(#body) + "." + str(#div) + ".p"
            + str(#pid) + ".s"  + str(#sid) + ">";
    searchdown "[。!?][)>'」 ’”)】〉 ]?", regular;
    if ( !result ) endmacro;
    if( lineno > #line ) {
        golinetop2;
        break;
    }
    moveto selendx, selendy;
    if( code == 0x0d ) {
        insert "</s></p>";
        movetolineno 1, lineno + 1;
        break;
    } else insert "</s>";
    #sid = #sid + 1;
}
return;

//------- Tag check -------//
Revision:
call ChangeSearchMode;
disabledraw;
if( selecting ) {
    escape;
    moveto selendx, selendy;
    #endline = lineno;
    moveto seltopx, seltopy;
} else {
    gofiletop;
    #endline = linecount2;
}
while( 1 ) {
    golinetop2;
    #i = 1;
    while( 1 ) {
        #line = lineno;
        searchdown "s[0-9]+", regular;
        if( result == 0 ) goto End;
        if( lineno > #line ) break;
        if( lineno >= #endline ) {
            golinetop2;
            goto End;
        }
        insert "s" + str( #i );
        #i = #i + 1;
    }
}
End:
call RestoreSearchMode;
endmacro;

ChangeSearchMode:
#searchmode = searchmode;
if( !#searchmode ) {  //検索状態を変更
    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    writeregnum "SelectFound", 1;
    envchanged;
}
return;

RestoreSearchMode:
if( !#searchmode ) {  //検索状態をもとにもどす
    writeregnum "SelectFound", 0;
    envchanged;
    closereg;
}
return;

GetID:
##x = x; ##y = y;
searchup "p id=[0-9.]+p", regular;
if( !result ) goto GetEnd
moveto selendx, y;
beginsel;
searchdown ">";
#pid = val( gettext( seltopx, seltopy, selendx, selendy ) );
moveto ##x, ##y;
searchup "head id=[0-9.]+h", regular;
moveto selendx, y;
beginsel;
searchdown ">";
#head = val( gettext( seltopx, seltopy, selendx, selendy ) );
moveto ##x, ##y;
searchup "div id=[0-9]+", regular;
moveto selendx, y;
right;
beginsel;
searchdown ">";
#div = val( gettext( seltopx, seltopy, selendx, selendy ) );
moveto ##x, ##y;
searchup "body id=";
moveto selendx, y;
beginsel;
searchdown ">";
#body = val( gettext( seltopx, seltopy, selendx, selendy ) );
GetEnd:
moveto ##x, ##y;
return;
//-------------------------------------------------//





> Majimaさん今日は、Iranoan です。
>> で、一般に、各ユーザーごとのアプリの設定は
>>   HKEY_CUREENT_USER\Software\作者名\アプリ名
>> というキーの下に置くのが作法とされています。
>> 秀丸の場合は上記の場所になります。
> ここまでは、でるもんたさんの仰るとおりです。しかし
>> 私は特別な環境(韓国語XP+英語版秀丸Ver3.19)でこのマクロを動かして
>> いる
>ということなので、
>> openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
>を
>openreg "CURRENTUSER", "Software\\Hidemaruo\\Maruo\\Env";
>としないと、正常に動作しないかも知れません。少なくとも Ver.4.07 では、
>ここを見ているようです。
>
>> プログラムが自動的にデータの記録や更新、削除などを行うとされて
>> いますが、このマクロの場合もそうなんでしょうか。
> マクロを見てみると、検索にヒットしたときに、いつも範囲選択する設定に
>するためのようです。
> Majimaさんの環境では、このカテゴリーは無いと思いますので、
>>     openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
>>     writeregnum "SelectFound", 1;
>>     envchanged;
>を
>    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
>    if( !result ){
>      message "Can not open registry!";
>      endmacro;
>    }
>    writeregnum "SelectFound", 1;
>    envchanged;
>とすれば、エラーになると思います。今まで、設定の変更ができなくても正常
>に動いていたのは、Majimaさんが、既に設定で検索にヒットしたときに
>範囲選択するようにしていたためだと思います。
>
> P.S できれば、Ver.4.07 へのヴァージョン・アップをお勧めします。

[ ]
RE:04312 openregNo.04314
Iranoan さん 04/05/15 19:09
 
 Majimaさん今日は、Iranoan です。
> >    >openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
> >   if( !result ){
> >      message "Can not open registry!";
> >      endmacro;
> >    }
> >    writeregnum "SelectFound", 1;
> >    envchanged;
この変更をすれば、エラーが表示されてマクロが終了すると思うのですが、
hidemaru.exe もインストールされているのかなあ〜????????

[ ]
RE:04314 openregNo.04315
Majima さん 04/05/15 19:39
 
Iranoanさん

>openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
>> >   if( !result ){
>> >      message "Can not open registry!";
>> >      endmacro;
>> >    }
>> >    writeregnum "SelectFound", 1;
>> >    envchanged;
>この変更をすれば、エラーが表示されてマクロが終了すると思うのですが、
>hidemaru.exe もインストールされているのかなあ〜????????

「hidemaru.exe」はインストールしていません。また

openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";

の「Hidemaru」の部分を全く関係のなさそうな名前にしても(半角
・全角)ざくざく動いています。「openreg」以外のどこの名前を
変えても関係ありません。文の前に「//」を入れても動くので
結局はこの文はこのマクロの動作には関係ないんじゃないかと思って
いるんですが・・・。

[ ]
RE:04312 自動タグ付けマクロの改造についNo.04317
山紫水明 さん 04/05/15 20:48
 
 Majimaさん,こんばんは。

》openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";

》でも

》openreg "CURRENTUSER", "Software\\Hidemaruo\\Maruo\\Env";

》でも動きますし、

 Majimaさんは,動作環境で「検索での表示」を「範囲選択」に設定され
ているのではないでしょうか。マクロの

#searchmode = searchmode;
if( !#searchmode ) {  //検索状態を変更
    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    writeregnum "SelectFound", 1;
    envchanged;
}

の部分は,Iranoan さんのご指摘にもありましたが,ここを「点滅表示」にして
る場合にはマクロの進行上,一時的に「範囲選択」に変更しています。
 この if 文は,「点滅表示」であれば「範囲選択」に変えるという部分です。
したがって,「範囲選択」に設定してあれば,この部分は読まれない,したがっ
て結果に影響しないということになります。

     では, (^^)/~
                                        山紫水明(ユーザー)

[ ]
RE:04317 自動タグ付けマクロの改造についNo.04319
Majima さん 04/05/15 23:24
 
山紫水明さん

どうもこんばんわ。色々とお世話になっております。

>Majimaさんは,動作環境で「検索での表示」を「範囲選択」
>に設定されているのではないでしょうか。

なるほど。確かにそうでした。試しに「検索での表示」を「点滅表示」
にして

openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";

の状態で秀丸英語版(Maruo)で動かしてみると、エラーがでますね。
このエラーの状態って、友人の秀丸英語版(Maruo)にだけ表れた現象
でして、どうしてそうなるのかその原因が分かりませんでした。これで
そのことについても解決しました。どうもありがとうございました。
レジストリというのはそういう設定を変えるんですね(初心者発言)。
もっと勉強します。

あともう一つ質問してもよろしいでしょうか。上のマクロで一通り
タグ付けを終えた後に、タグの追加&削除のためのマクロも作りま
したが、山紫水明さんの書かれた「Tag check」部分の文を通ると、
ファイルの頭からセンテンスの連番を揃えていくようにできているん
ですよね。これをその行だけセンテンス番号を揃えるようには
できないのでしょうか。大き目のファイルになると、一つの行を直す
のに、毎回上から下まで連番を書き替えていくのも何だと思いますし。
ちょっといじってみましたが、ギブアップしました。

それからそのことに関連して、もし全ての作業が終わった後に、ある
部分に突然パラグラフが追加されることになった場合(勿論そのよ
うな非効率的な作業にはならないようにしますが、何かのミスの発生
ということも考えられないこともないので)、そのディビジョン内の
パラグラフ番号もそれぞれずれてきますが、そういう場合の対応策っ
てありますか。要するに、センテンス番号だけを揃えるのではなく、
パラグラフやディビジョンの番号も揃えるようにするものです。これは
マクロを組むのがさらに複雑になるものと思われますが、どの程度の
大変なことなのでしょうか。どのくらい大変なのかお答えになるだけで
結構です。

//******* Insert Tag ************************

#x = x; #y = y;
golinetop2;
searchdown "<s id=.[^<]*>", regular;
copy;
moveto #x, #y;
insert "</s>";
paste;
call Revision;

//------- Tag check -------//
Revision:
call ChangeSearchMode;
disabledraw;
if( selecting ) {
    escape;
    moveto selendx, selendy;
    #endline = lineno;
    moveto seltopx, seltopy;
} else {
    gofiletop;
    #endline = linecount2;
}
while( 1 ) {
    golinetop2;
    #i = 1;
    while( 1 ) {
        #line = lineno;
        searchdown "s[0-9]+", regular;
        if( result == 0 ) goto End;
        if( lineno > #line ) break;
        if( lineno >= #endline ) {
            golinetop2;
            goto End;
        }
        insert "s" + str( #i );
        #i = #i + 1;
    }
}
End:
call RestoreSearchMode;
enabledraw;
moveto #x, #y;
searchdown "<s id=.[^<]*>", regular;
copy;
moveto #x, #y;
beginclipboardread;
$sid = getclipboard;


message "Insert " + $sid;
endmacro;

ChangeSearchMode:
#searchmode = searchmode;
if( !#searchmode ) {  //検索状態を変更
    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    writeregnum "SelectFound", 1;
    envchanged;
}
return;

RestoreSearchMode:
if( !#searchmode ) {  //検索状態をもとにもどす
    writeregnum "SelectFound", 0;
    envchanged;
    closereg;
}
return;

GetID:
##x = x; ##y = y;
searchup "p id=[0-9.]+p", regular;
if( !result ) goto GetEnd
moveto selendx, y;
beginsel;
searchdown ">";
#pid = val( gettext( seltopx, seltopy, selendx, selendy ) );
moveto ##x, ##y;
searchup "head id=[0-9.]+h", regular;
moveto selendx, y;
beginsel;
searchdown ">";
#head = val( gettext( seltopx, seltopy, selendx, selendy ) );
moveto ##x, ##y;
searchup "div id=[0-9]+", regular;
moveto selendx, y;
right;
beginsel;
searchdown ">";
#div = val( gettext( seltopx, seltopy, selendx, selendy ) );
moveto ##x, ##y;
searchup "body id=";
moveto selendx, y;
beginsel;
searchdown ">";
#body = val( gettext( seltopx, seltopy, selendx, selendy ) );
GetEnd:
moveto ##x, ##y;
return;
//-------------------------------------------------//

//******* Delete Tag ************************

#x = x; #y = y;
searchup "</";
escape;
searchdown "<s id=.[^<]*>", regular;
copy2;
beginclipboardread;
$delsid = getclipboard;
delete;
searchup "</s>";
delete;
call Revision;


//------- Tag check -------//
Revision:
call ChangeSearchMode;
disabledraw;
if( selecting ) {
    escape;
    moveto selendx, selendy;
    #endline = lineno;
    moveto seltopx, seltopy;
} else {
    gofiletop;
    #endline = linecount2;
}
while( 1 ) {
    golinetop2;
    #i = 1;
    while( 1 ) {
        #line = lineno;
        searchdown "s[0-9]+", regular;
        if( result == 0 ) goto End;
        if( lineno > #line ) break;
        if( lineno >= #endline ) {
            golinetop2;
            goto End;
        }
        insert "s" + str( #i );
        #i = #i + 1;
    }
}
End:
call RestoreSearchMode;
enabledraw;
moveto #x, #y;
message "delete " + $delsid;
endmacro;

ChangeSearchMode:
#searchmode = searchmode;
if( !#searchmode ) {  //検索状態を変更
    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    writeregnum "SelectFound", 1;
    envchanged;
}
return;

RestoreSearchMode:
if( !#searchmode ) {  //検索状態をもとにもどす
    writeregnum "SelectFound", 0;
    envchanged;
    closereg;
}
return;

GetID:
##x = x; ##y = y;
searchup "p id=[0-9.]+p", regular;
if( !result ) goto GetEnd
moveto selendx, y;
beginsel;
searchdown ">";
#pid = val( gettext( seltopx, seltopy, selendx, selendy ) );
moveto ##x, ##y;
searchup "head id=[0-9.]+h", regular;
moveto selendx, y;
beginsel;
searchdown ">";
#head = val( gettext( seltopx, seltopy, selendx, selendy ) );
moveto ##x, ##y;
searchup "div id=[0-9]+", regular;
moveto selendx, y;
right;
beginsel;
searchdown ">";
#div = val( gettext( seltopx, seltopy, selendx, selendy ) );
moveto ##x, ##y;
searchup "body id=";
moveto selendx, y;
beginsel;
searchdown ">";
#body = val( gettext( seltopx, seltopy, selendx, selendy ) );
GetEnd:
moveto ##x, ##y;
return;
//-------------------------------------------------//

[ ]
RE:04319 自動タグ付けマクロ改造についてNo.04324
山紫水明 さん 04/05/16 17:03
 
 Majimaさん,こんにちは。

》「Tag check」部分の文を通ると、ファイルの頭からセンテンスの連番を揃え
》ていくようにできているんですよね。これをその行だけセンテンス番号を揃え
》るようにはできないのでしょうか。

 もう大分前のことではっきりとは覚えていませんが,範囲選択して実行できま
せんでしたか?

》そのディビジョン内のパラグラフ番号もそれぞれずれてきますが、そういう場
》合の対応策ってありますか。要するに、センテンス番号だけを揃えるのではな
》く、パラグラフやディビジョンの番号も揃えるようにするものです。これはマ
》クロを組むのがさらに複雑になるものと思われますが、どの程度の大変なこと
》なのでしょうか。どのくらい大変なのかお答えになるだけで結構です。

 ディビジョンとパラグラフ番号をまとめてやるとなるとちょっと大変かもしれ
ません。とくにディビジョンの方が。
 とりあえず,パラグラフの方はセンテンス番号の応用で次のようにしたらどう
でしょう。「検索結果の表示」の処理は省略しています。

//-----------------------------------------//
gofiletop;
searchdown "div id=[0-9.]+", regular;
while( 1 ) {
    #i = 1;
    #startline=lineno;
    searchdown "</div>";
    if( result == 0 ) break;
    #endline=lineno;
    movetolineno 1,#startline;
    #i = 1;
    while( 1 ) {
        #line = lineno;
        searchdown "p[0-9]+", regular;
        if( result == 0 || lineno > #endline ) break;
        insert "p" + str( #i );
        searchdown "p[0-9]+", regular;
        if( result == 0 || lineno > #endline ) break;
        insert "p" + str( #i );
        #i = #i + 1;
    }
    movetolineno 1, #endline;
}
endmacro;
//-----------------------------------------//

     では, (^^)/~
                                        山紫水明(ユーザー)

[ ]
RE:04324 自動タグ付けマクロ改造についてNo.04327
Majima さん 04/05/16 18:20
 
山紫水明さん

ありがとうござます。以前頂いたマクロで範囲設定して連番の修正を
するのも、現在のマクロではいろいろいじってしまっていてよく分か
らないので、会議室を遡って初めに頂いたやつを動かしてみましたが、
範囲設定での実行後は、行頭のタグだけ範囲設定された結果となり、
なにも変化がありませんでした。範囲設定しないとちゃんと動きます
がね。

私の前回の質問の意図は前回のマクロソースにあるように、カーソルの
ある位置へタグの追加・削除の際に、マクロ内で範囲設定をしてその
行だけセンテンスの連番を揃えるというものでした。まぁ範囲設定して
もしなくても連番揃えの結果は同じになりますので、たいした問題では
ありませんが・・・。

>ディビジョンとパラグラフ番号をまとめてやるとなるとちょっと大変
>かもしれません。とくにディビジョンの方が。とりあえず,パラグラ
>フの方はセンテンス番号の応用で次のようにしたらどうでしょう。
>「検索結果の表示」の処理は省略しています。
>//-----------------------------------------//
>gofiletop;
>searchdown "div id=[0-9.]+", regular;
>while( 1 ) {
>    #i = 1;
>    #startline=lineno;
>    searchdown "</div>";
>    if( result == 0 ) break;
>    #endline=lineno;
>    movetolineno 1,#startline;
>    #i = 1;
>    while( 1 ) {
>        #line = lineno;
>        searchdown "p[0-9]+", regular;
>        if( result == 0 || lineno > #endline ) break;
>        insert "p" + str( #i );
>        searchdown "p[0-9]+", regular;
>        if( result == 0 || lineno > #endline ) break;
>        insert "p" + str( #i );
>        #i = #i + 1;
>    }
>    movetolineno 1, #endline;
>}
>endmacro;
>//-----------------------------------------//

動かしてみましたが、一行内(つまり一つのパラグラフ内)でパラグラフ
番号が増えていきます。マクロの動かし方がおかしいのかもしれません。

>「検索結果の表示」の処理は省略しています。

とは何でしょうか。できれば完全な形でのマクロのサンプルをお願い
できないでしょうか。

[ ]
RE:04327 自動タグ付けマクロ改造についてNo.04329
山紫水明 さん 04/05/16 22:49
 
 Majimaさん,こんばんは。

》会議室を遡って初めに頂いたやつを動かしてみましたが、範囲設定での実行後
》は、行頭のタグだけ範囲設定された結果となり、なにも変化がありませんでし
》た。範囲設定しないとちゃんと動きますがね。

 先日アップされた最近のものでも範囲選択して Tag Check でちゃんとできま
した。おかしいですね。サンプルの文章が違っているのかもしれません。うまく
いかない例を教えてください。途中改行のないパラグラフですよね。

》動かしてみましたが、一行内(つまり一つのパラグラフ内)でパラグラフ番号が
》増えていきます。マクロの動かし方がおかしいのかもしれません。

 どうもサンプルがよくなかったようです。1パラグラフ1センテンスの例でや
っていました。

》>「検索結果の表示」の処理は省略しています。
》とは何でしょうか。

 昨日のレジストリの話題に出てきたことです。

//----------------------------------------------------//
call ChangeSearchMode;
disabledraw;
if( selecting ) {
    escape;
    moveto selendx, selendy;
    #endline = lineno;
    moveto seltopx, seltopy;
} else {
    gofiletop;
    #endline = linecount2;
}
while( 1 ) {
    golinetop2;
    #i = 1;
    while( 1 ) {
        #line = lineno;
        while( 1 ) {
            searchdown "p[0-9]+", regular;
            if( result == 0 ) goto End;
            if( lineno > #line ) break;
            insert "p" + str( #i );
        }
        if( lineno >= #endline ) {
            golinetop2;
            goto End;
        }
        #i = #i + 1;
    }
}
End:
call RestoreSearchMode;
endmacro;
//----------------------------------------------------//

 最後に ChangeSearchMode と RestoreSearchMode のサブルーチンを加えてく
ださい。

     では, (^^)/~
                                        山紫水明(ユーザー)

[ ]
RE:04329 自動タグ付けマクロ改造についてNo.04331
Majima さん 04/05/17 00:59
 
山紫水明さん

どうもありがとうございます。

>先日アップされた最近のものでも範囲選択して Tag Check でちゃんと
>できました。おかしいですね。

私も念のため

04312 コメント / Majima [ 04/05/15 17:54 ]

にUPされているマクロで動作確認しましたが、範囲設定ではその行の
頭にある、例えば下のように

<p id=1.1.p3><s id=1.1.p3.s1

の部分までが範囲設定をされた状態でマクロが終了しています。勿論
私がその部分を範囲設定したわけではありません。その行にあるどこ
かを範囲設定した後マクロを実行すると、必ずその行頭のタグ部分へ
移動+範囲設定の状態になっています。

私の使ったテキストを少し示すと、

<p id=1.1.p1><s id=1.1.p1.s1>ドイツの科学者ウェルナー・フォン・ブラウンがロ
ケットに関心を持ったきっかけは、12歳の時に読んだ空想科学小説の月旅行だ。</
s><s id=1.1.p1.s2>彼の夢を育んでくれたのはヒットラーのナチ政府だった。</s><s
 id=1.1.p1.s3>ドイツ軍砲兵将校ドルンベルガーが彼を抜てきしたのは、液体燃料を
利用した長距離ミサイルを開発するためだ。</s><s id=1.1.p1.s4>第2次世界大戦中、
フォン・ブラウンはV−2というミサイルを開発した。</s><s id=1.1.p1.s5>第2次
世界大戦末期に海を渡ってきて夜空で灼熱するミサイルは、英国人にとって恐るべき
新武器だった。</s></p>
<p id=1.1.p2><s id=1.1.p2.s1>戦後、米国とソ連がドイツのロケット専門家誘致競
争を繰り広げたのも、武器開発のためである。</s><s id=1.1.p2.s2>戦争を通じてミ
サイルと核兵器の恐るべき威力を知った両国は、地球の反対側にある相手に致命傷を
与えることができる「ミサイル+核兵器」に注目した。</s><s id=1.1.p2.s3>米国に
亡命したフォン・ブラウンは、大陸間弾道ミサイル(ICBM)など冷戦時代軍備競
争の流れを先導し、ロケット技術を発展させた。</s></p>
<p id=1.1.p3><s id=1.1.p3.s1>フォン・ブラウンの月への夢が現実化したのも、や
はり軍事的目的から始まった。</s><s id=1.1.p3.s2>核弾頭ミサイルが開発された状
況で切迫した課題は、こうした致命的武器の先制攻撃を事前に知る監視装置の開発だ
った。</s><s id=1.1.p3.s3>確実な方法は宇宙空間での監視だった。</s><s id=1.1.
p3.s4>弾頭の代わりに、早期警報衛星を装着したロケットが宇宙に打ち上げられた。
</s></p>

こんな感じですから、途中改行が入るパラグラフではありません。

>どうもサンプルがよくなかったようです。1パラグラフ1センテンス
>の例でやっていました。

パラグラフ修正のやつは今は元気に動いています。どうもありがとう
ございました。

[ ]
RE:04331 自動タグ付けマクロ改造についてNo.04336
山紫水明 さん 04/05/17 20:04
 
 Majimaさん,こんばんは。

 お示しいただいたテキストで実行した結果,問題なくできました。

》その行にあるどこかを範囲設定した後マクロを実行すると、必ずその行頭のタ
》グ部分へ移動+範囲設定の状態になっています。

 範囲は必ず行頭から改行も含めて行全体を選択する必要があるます。この時
カーソルは次行の頭に行っているはずです。
 途中だけを選択してもうまくいきません。途中だけ選択してもうまくいくよう
にするにはそれなりの処理を加える必要がありますが,全体を選択していただく
ようにすればいいでしょう。左端でマウスを縦に動かせば簡単ですから。

     では, (^^)/~
                                        山紫水明(ユーザー)

[ ]
RE:04336 自動タグ付けマクロ改造についてNo.04337
Majima さん 04/05/18 00:23
 
山紫水明さん

ありがとうございます。

>範囲は必ず行頭から改行も含めて行全体を選択する必要があるます。
>この時カーソルは次行の頭に行っているはずです。

あ、改行も含めた行全体ですね。出来ました、出来ました。今までは
改行が含まれていませんでした。マウスで行末から行頭にかけて範囲
設定していたので・・・。マウスの使い方変でしたね。ちょっと動か
し方を考えれば解決できることでしたがね。大変お騒がせしました。

[ ]