カーソルの位置および前後を認識させるたNo.04343
Majima さん 04/05/19 09:57
 
会議室のみなさま、こんにちは。また分からないことがありますので
質問させていただきます。

まず初めに次のタグ付き文書をご覧になって頂きたいと思います。

***************************************************************
<p id=1.1.p1><s id=1.1.p1.s1>あいうえお。</s><s id=1.1.p1.s2>かきくけこ。</s
><s id=1.1.p1.s3>さしすせそ。</s><s id=1.1.p1.s4>たちつてと。</s><s id=1.1.p
1.s5>なにぬねの。</s></p>
***************************************************************

このような文書の中にあるタグを一部削除する際ためのマクロを作って
いますが、現在の状態では非常に危険度の高いマクロになっています。
具体的には </s><s id=x.x.px.sx> までを削除するわけですが、簡単に
マクロ文を示すと、こんな感じです。

searchup "</";
escape;
searchdown "<s id=.[^<]*>", regular;
delete;
searchup "</s>";
delete;

このマクロ文では削除しようとするタグ部分 <s id=x.x.px.sx> の中に
カーソルを置いてマクロを実行したときだけに求める結果が得られま
す。勿論タグの一部を削除すれば、連番がずれてきますが、連番を揃え
るマクロはこの後に通ります。

今回の質問は、この非常に危険度の高いマクロに安全装置をつけたいと
思い、第一センテンスの部分 <s id=x.x.px.s1> の部分にカーソルを
置いてマクロを実行しようとした際に警告を出すようにしたいのです。
パラグラフがいくつもあるテキストでは、もし <s id=x.x.px.s1> の
部分にカーソルを置いてマクロを実行すると、おかしな結果になるから
です。第一センテンスの無いパラグラフとはおかしな話ですが、作業中
のうっかりミスを避けるための対策として考えています。

秀丸マクロには「code」のような、カーソル部分のコードを示すキー
ワードがありますが、カーソル位置およびその前後にどんな文字がある
のかまで認識させることはできるのでしょうか。よろしくお願いします。

[ ]
RE:04343 カーソルの位置および前後を認識No.04344
ENCODINGSHIFTJIS さん 04/05/19 20:19
 
秀丸のマクロライブラリーを見てXML関連のマクロを
読んで、参考になるアイデアを収集しましょう
いそがばまわれ

質問です:やろうとすることがよくわからない

s要素を全部テキスト化する
第1s要素のみを取り出す
連続するs要素のテキスト結合する
どれ?

XMLエディタを買ったほうが早いかも
複数要素を選択しておいて、テキスト化は、
TagEditorのメニューに入っています。

[ ]
RE:04343 カーソルの位置および前後を認識No.04345
山紫水明 さん 04/05/19 22:12
 
 Majimaさん,こんばんは。

》今回の質問は、この非常に危険度の高いマクロに安全装置をつけたいと
》思い、第一センテンスの部分 <s id=x.x.px.s1> の部分にカーソルを
》置いてマクロを実行しようとした際に警告を出すようにしたいのです。

 こういうことでしょうか?

//----------------------------//
#line = lineno;
searchup "</";
escape;
if( result == 0 || lineno < #line ) {
    message "警告!";
    endmacro;
}
searchdown "<s id=.[^<]*>", regular;
delete;
searchup "</s>";
delete;
endmacro;
//----------------------------//

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

[ ]
RE:04344 ENCODINGSHIFTJISさんと山紫水明No.04347
Majima さん 04/05/20 03:31
 
ENCODINGSHIFTJISさんと山紫水明さんへ

ご回答ありがとうございます。そうですね。質問の趣旨がよく分からな
かったようですね。もう一度説明いたしますと、こういうことです。

**************************************************************
<body id=1>
<div id=1.1>
<head id=1.1.h1>五十音</head>
<p id=1.1.p1><s id=1.1.p1.s1>「あいうえお。</s><s id=1.1.p1.s2>かきくけ
こ。」</s><s id=1.1.p1.s3>さしすせそ。</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>はひふへほ。」</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></p>
</div>
</body>
**************************************************************

上のようなファイルがあって、何らかの理由があってセンテンス情報
のタグを削除しようとする時(その何らかの理由というのは、こちらの
作業上での指針がありまして、例えば対話文のかぎ括弧「」中では、
センテンスが2つまでだと、かぎ括弧内からかぎ括弧までを1センテ
ンスとみなし、3センテンス以上からはそれぞれ1センテンスごとに
区切るといったものです)、削除しようとするタグにカーソルを置いて
下のようなマクロを実行するわけですが、

searchup "</";
escape;
searchdown "<s id=.[^<]*>", regular;
delete;
searchup "</s>";
delete;

ここで <p id=1.1.p1> のパラグラフをご覧頂くと、

<p id=1.1.p1><s id=1.1.p1.s1>「あいうえお。</s><s id=1.1.p1.s2>かきくけ
こ。」</s><s id=1.1.p1.s3>さしすせそ。</s></p>

のように、かぎ括弧の中に「あいうえお。かきくけこ。」と2センテ
ンスが入っていますが、こちらの作業上の指針によると、かぎ括弧内
で2センテンス以下の文なので、そのかぎ括弧全体で一つのセンテンス
とみなすことになりますので、「あいうえお」と「かきくけこ」の間の
タグ </s><s id=1.1.p1.s2> を取り除いて、

<p id=1.1.p1><s id=1.1.p1.s1>「あいうえお。かきくけこ。」</s><s id=1.1.p1.s2
>さしすせそ。</s></p>

のように修正していくわけです。その他にも色々な条件があって、タグ
の修正作業を手作業でしていくわけですが、同じ作業をするときに、
もし間違えて <s id=1.1.p1.s2> ではなく、<s id=1.1.p1.s1> の部分
にカーソルを置いて上のマクロを実行したときに、

<p id=1.1.p1>いうえお。</s><s id=1.1.p1.s1>かきくけこ。」</s><s id=1.1.p1.s2
>さしすせそ。</s></p>

のような結果になってしまって、タグ付けの規則に誤りが出るばかりか
テキストにも影響を及ぼしてしまっているので、そういううっかりミス
を避けたいために安全策として、変な場所にカーソルを置いてマクロを
実行しようとした場合に、何か知らせてくれる装置をつけたいと考えて
いるわけです。

はっきり言ってしまえば「そんなもの注意して作業すれば済むこと」で
あり、「もし間違えてもアンドゥでやり直せばいいこと」ではあります
が、私以外の人も同じ作業をしており、その人たちが自分のミスに気づ
かずに作業を続行してしまう恐れもあることが心配だからです。勿論
私自身も膨大な量の作業をする中でミスを犯す恐れもあり得ますから。

そこで今回の質問の趣旨は、上の例で言うと、

<p id=1.1.p1><s id=1.1.p1.s1>「あいうえお。</s><s id=1.1.p1.s2>かきくけ
こ。」</s><s id=1.1.p1.s3>さしすせそ。</s></p>

の中で絶対に手を触れてはならない部分である <p id=1.1.p1> のすぐ
後に来る <s id=1.1.p1.s1> のタグ部分や、

<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>はひふへほ。」</s></p>

で言えば、<p id=1.1.p2> のすぐ後に来る <s id=1.1.p2.s1> といった
ように、<s id=x.x.px.s1> の部分にカーソルを置いた時にマクロを
実行できないようにしたいというわけです。

このようにカーソルを置いた位置が、どういったテキストの内容の中に
あるのかということを認識させることができれば、安全装置をつけるこ
とが出来るのではないかと考えているわけです。

<p id=1.1.p1><s id=1.1.p1.s1>「あいうえお。</s><s id=1.1.p1.s2>かきくけ
こ。」</s><s id=1.1.p1.s3>さしすせそ。</s></p>

でもし <s id=1.1.p1.s1> のタグ部分のいづれかの部分にカーソルが
置かれた時に、「今カーソルは <s id=1.1.p1.s1> の中にある!」と
いうことをコンピューターが認識できるかということです。具体的な
作業の内容を示しながら質問したので、逆に紛らわしくなったかも
しれません。初めからもっと簡潔に説明すればよかったですね。今の
説明でも質問の趣旨が説明できたかは分かりませんが・・・。

もう一度しつこく質問の趣旨を説明いたしますと、「ABCDEFG」という
文字列があって、もしBとCの間にカーソルが置かれていたとするとき、
コンピューターが「今カーソルはBとCの間にある」ということが分か
るのかということと、もし分かるとすれば、どのようにコンピューター
に認識させるのかということです。

>秀丸のマクロライブラリーを見てXML関連のマクロを
>読んで、参考になるアイデアを収集しましょう
>いそがばまわれ

こういったテキスト処理関係はXML関連のマクロにアイディアがある
のですね。そうですね。「いそがばまわれ」ですね。大分ピントの
外れていることを考えていたりして、大回りしすぎている部分も
ありますが・・・。

>質問です:やろうとすることがよくわからない
>
>s要素を全部テキスト化する
>第1s要素のみを取り出す
>連続するs要素のテキスト結合する
>どれ?

私の質問の趣旨はどれも当てはまらないような気がします。

[ ]
RE:04347 ENCODINGSHIFTJISさんと山紫水明No.04348
山紫水明 さん 04/05/20 07:51
 
 Majimaさん,こんにちは。

escape;
の位置を変えて試してください。

//----------------------------//
#line = lineno;
searchup "</";
if( result == 0 || lineno < #line ) {
    message "警告!";
    endmacro;
}
escape;
searchdown "<s id=.[^<]*>", regular;
delete;
searchup "</s>";
delete;
endmacro;
//----------------------------//

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

[ ]
RE:04343 カーソルの位置および前後を認識No.04349
ENCODINGSHIFTJIS さん 04/05/20 10:24
 
▼連続s要素の内容結合
と考えると。

searchup "</s>";
escape;
searchdown2 "</s><s .+?>",regular; // 削除範囲が明確
delete;

あたりで。
--------------------------

カーソル位置の把握ですが、それはXML構造の認知ですから
XMLエディタの領分になります。

エディタには「段落整形」という処理分野がありますが、
XMLエディタには「XML整形」という字下げ(インデント)を
タグ構造にあわせるのがあります。
エディタによって、常時テキストを監視して字下げを自動調整
するタイプと、ツール起動で指定時にするタイプがあります。

しかし、この例のようにでは、XMLを持ち出すより
アウトライン編集モードとか、字下げ段落整形モードとか使って
テキストを仕上げたほうが、【読みやすい】と思うのですが。

▼ XMLに容易に変形させられる単純なテキスト・フォーマットを
拒絶する理由はありません。
XML Europe 2004 (見直し論議) Refactoring XML
http://www.xml.com/lpt/a/2004/05/05/xmleu.html
という、意見もあります。翻訳サイトに投げ込んでみましょう。

[ ]
RE:04343 カーソルの位置および前後を認識No.04350
白雲斎 さん 04/05/20 22:32
 
白雲斎と申します。

// 警告を出したいダグの右端の語句を設定。(完全一致)
$skipWord = "s1>";  // p1.s1> とか

searchup "<s[^>]+>", regular;
if( result == false )
{
    message "ダグを発見できない!";
    endmacro;
}
#topx = seltopx;
#topy = seltopy;
#endx = selendx;
#endy = selendy;

if( gettext(#endx-strlen($skipWord),#endy,#endx,#endy) == $skipWord )
{
    beginsel;
    moveto #endx, #endy;
    endsel;
    message "このダグは、削除できない!";
    endmacro;
}
beginsel;
moveto #endx, #endy;
delete;
searchup "</s>";
if( result )
{
    if( selendx != #topx || selendy != #endy )
    {
        undo;
        message "開始/終了ダグが隣接していない!";
    }
    else delete;
}
else
{
    undo;
    message "隣接する終了ダグがない!";
}
endmacro;
---------------------------------------------------------------


【蛇足】
一連の流れを把握していないので頓珍漢かもしれません。
単に思いついたことを書き連ねているだけですので、読み流してください。

ダグ付けをした書類を編集することは、連番、ダグの不整合が発生しやすく、
危険が伴う。それなら、編集方法を変更してみるのはどうだろう・・・。

       ┏━━━━━━━┓
       ┃ 打ち込み(*1) ┃←───┬─┬←─┐
       ┗━━━━━━━┛        │  ↑    │
               ▼                │  │    │
┏━━━━━━━━━━━━━━┓ │  │    │
┃ フォーマット・チェック(*2) ┃ ┼─┘エラー・ログ
┗━━━━━━━━━━━━━━┛ │        │
               ▼                │        │
  ┏━━━━━━━━━━━━┓   │        ↑
  ┃ ダグ付けコンバート(*3) ┃ ─┼→ エラー・ログ
  ┗━━━━━━━━━━━━┛   │
               ▼                │
      ┏━━━━━━━━┓       │
      ┃ 修正の発生(*4) ┃ ───┘
      ┗━━━━━━━━┛
               ▼
           ┏━━━┓
           ┃ 完了 ┃
           ┗━━━┛


(*1):
    入力規則(フォーマット)を厳密に規定する。
    (LaTeX、RubyのRDやPerlのPODなどのように識別句を埋め込む?
     識別句を埋め込むマクロを用意すれば、安全、簡単!?)
    規則違反を目視し易いように、強調表示を定義、設定する。
    (独自の拡張子を付けると、ファイルタイプ別の設定が簡単)

*** 例えば ****************************************************
={{:BEGIN-SECTION
==:五十音
あいうえお
かきくけこ    -\     ←次の行は同一センテンスとする
さしすせそ

たちつてと
なにぬねの
=:END-SECTION}}

={{:BEGIN-SECTION
==:HEADING

=:END-SECTION}}
***************************************************************
※改行がセンテンスの区切り
※空行は段落区切り
※このような形式だと、新旧の差分(DIFF)が検出しやすい!?


(*2):
    入力規則(フォーマット)に違反していないか、マクロ等でチェックする。
    修正箇所が見つかったら、修正後に再びフォーマット・チェック。

(*3):
    ダグ付けをして、エキスポートする。
    元のファイルとは、別管理(別の拡張子)をする。
    マクロよりは、テキスト処理に強い Ruby,Perl,WSH などを検討する。
    入力規則が厳密であればあるほど、コンバートが簡単。
    とは言え、目視の確認は必須か。

(*4):
    コンバート後に修正が発生した場合は、元のファイルを修正する。
    即ち、(*1)に戻る。


※(*2)と(*3)を一つの処理でまかなう方が自然か?
※実務への適用方法は、ご自分でお考えくださいね。


以上。
長文失礼しました。


__________________________________________________
Do You Yahoo!?
http://bb.yahoo.co.jp/

[ ]
RE:04348 ENCODINGSHIFTJISさんと山紫水明No.04353
Majima さん 04/05/22 14:09
 
山紫水明さん

ご回答有難うございました。

>escape;
>の位置を変えて試してください。
>
>//----------------------------//
>#line = lineno;
>searchup "</";
>if( result == 0 || lineno < #line ) {
>    message "警告!";
>    endmacro;
>}
>escape;
>searchdown "<s id=.[^<]*>", regular;
>delete;
>searchup "</s>";
>delete;
>endmacro;
>//----------------------------//

そうですね。先に示したサンプルテキストの書式では改行までを一つの
センテンスとみなしているので、前の行まで行って「</」を検索する
こと自体が、該当するセンテンスの範囲を超えてマクロを実行しようと
していることになりますね。このマクロだと <s id=x.x.px.s1> 以外
でも、<p id=x.x.px> のような場所だったり、またはテキスト本文中の
不適切な場所にカーソルが置かれた状態であっても、とにかくその行中
にある「</」を検索できなかった場合に警告を出してくれるので、
かなり安心して作業ができそうです。このアイディアで改造してマクロ
に取り入れたいと思います。有難うございました。
 

[ ]
RE:04349 カーソルの位置および前後を認識No.04354
Majima さん 04/05/22 14:33
 
ENCODINGSHIFTJISさん

ご回答ありがとうございました。

>▼連続s要素の内容結合
>と考えると。
>
>searchup "</s>";
>escape;
>searchdown2 "</s><s .+?>",regular; // 削除範囲が明確
>delete;
>
>あたりで。

このマクロでは上手く動きませんでしたが、削除範囲を明確にする
という案ですよね。

searchdown2 "</s><s .+?>",regular;
の部分は
searchdown2 "</s><s[^>]+>",regular;
こんな感じでしょうか。

なるほど。こうすると <s id=x.x.px.s1> の前には </s> が来ないので
絶対に削除される恐れはありませんね。大変参考になりました。

>カーソル位置の把握ですが、それはXML構造の認知ですから
>XMLエディタの領分になります。

>XML Europe 2004 (見直し論議) Refactoring XML
>http://www.xml.com/lpt/a/2004/05/05/xmleu.html
>という、意見もあります。翻訳サイトに投げ込んでみましょう。

色々勉強してみます。今でもアップアップ状態ではありますが・・・。

[ ]
RE:04350 カーソルの位置および前後を認識No.04355
Majima さん 04/05/22 14:54
 
白雲斎さん

ご回答ありがとうございました。
細かなダイアログ付で親切な設計になっていますね。色々なアイディア
が含まれているようですから、改造のしがいがありそうです。勉強
させて頂きます。

ご提示いただいた編集方法の案ですが、現時点では入力規則(フォーマ
ット)の厳密な規定や、Ruby、Perl、WSHなどの利用など、作業に関わる
技術的な知識を得るのが大変な感じです。特に私以外の人も作業に
関わってくるということで、それぞれの人に教育をしていくというのも
大変でして・・・。作業上での曖昧な規則がまだ多いといった状態です
から、入力規則(フォーマット)の厳密な規定をする段階で、色々な問題
が出てきそうです。今後の編集方法として参考にさせて頂きます。
ありがとうございました。

[ ]