【弱要望】hmjre.dllのReplaceRegular関数No.40582
ダヴィンチ1958 さん 11/05/25 00:39
 

2011/05/25(水) 00:36:05

ダヴィンチ@ユーザーです。

ReplaceRegular関数を使用してXMLへのコード変換を行い
無事問題は解決致しました。
ありがとうございました。

要望がございます。
できればでいいです。
ReplaceRegular関数は文字列を正規表現で検索して
ヒットしたときは置換した文字列を含めた全体を返しますが
ヒットしなかったときはNULL("")を返します。
このため、複数の文字列の置換を行うときの
変換結果の取得が以下のようなコードになります。

現状-------------------------------
XmlReplaceStr:
{
 $$str = $$1;
 $$cnv = dllfuncstr("ReplaceRegular", "&", $$str, 0, "&",1);
 if ($$cnv != "")
 {
  $$str = $$cnv;
 }
 $$cnv = dllfuncstr("ReplaceRegular", "<", $$str, 0, "&lt;",1);
 if ($$cnv != "")
 {
  $$str = $$cnv;
 }
 return $$str;
}
-------------------------------

これでは、コードが煩雑になりますので
ヒットしなかった場合は「元の文字列(この場合は$$str)」を
そのまま返すように変更して欲しいです。
そうすると以下のようなシンプルなコードが書けます。
もちろん変更後も上記の「現状」のままのコードも
正常に処理が行えますので不具合の発生はないと
思われます。

改良後-------------------------------
XmlReplaceStr:
{
 $$str = $$1;
 $$str = dllfuncstr("ReplaceRegular", "&", $$str, 0, "&amp;",1);
 $$str = dllfuncstr("ReplaceRegular", "<", $$str, 0, "&lt;",1);
 return $$str;
}
-------------------------------

とくに強い要望ではありませんが
ご検討をお願いします。

/*
** タイトル:『hidesoft.8:40581| RE 40575 【質問】秀丸メールマクロでXMLフ
ァイル出力』
** 発信日:2011年05月24日(火) 22:25:21
** 発信者:ダヴィンチ1958さん
*/
>
>2011/05/24(火) 22:23:22
>
>こんにちは、秀まるお2さん
>
>ダヴィンチ@ユーザーです。
>
>いろいろご教示いただき助かりました。
>hmjre.dllのReplaceRegular関数か自前の関数で
>行こうかと思います。
>
>ありがとうございました。
>また宜しくお願いします。
>
>/*
>** タイトル:『hidesoft.8:40575| RE 40573 【質問】秀丸メールマクロでXMLフ
>ァイル出力』
>** 発信日:2011年05月24日(火) 10:22:15
>** 発信者:秀まるお2さん
>*/
>> XMLに変換する方だけであれば、"<"、">"、"&"の3つだけエンコードすればよ
>>かったと思います。
>>
>> 逆の変換をするとなるともっと大量にあって大変ですけども。
>>
>>> 変換スピードの点も気になります。
>>
>> "<"等の文字は普通の文章にはそんなに大量に入ってくることは無いと思うの
>>で、速度的にはマクロで処理してもそんなに遅くは無いと思います。むしろ、外
>>部のDLL呼び出しとかで処理したとしても、最終的に秀丸マクロの文字列関係の
>>処理を通るので、結局同じくらいの速度にしかならないと思います。
>>
>> しいて外部dllで処理させるとしたら、hmjre.dllのReplaceRegular関数でやる
>>方法もあるかなぁと思います。
>>
>>> 他にWindows的な標準の対応があればどなたか紹介して
>>> 頂けますか。
>>
>> 今ちょっとgoogleで"xml windows api"で検索したら、Msxml2.DOMDocumentっ
>>ていうオブジェクトがあって、それを例えば秀丸マクロのcreateobject/
>>callmethodで呼び出して使えばいいのかなぁと思いました。
>>
>> 具体的にどういうことが出来るのかまでは調べませんでしたけども。
>>
>> Msxml2.XMLHTTPってオブジェクトを使っていろいろやる例は、実はIKKIさんが
>>作成されたマクロがありまして、それが一番参考になります。(という僕も、大
>>変参考にさせていただいてます)

[ ]
RE:40582 【弱要望】hmjre.dllのReplaceReNo.40583
秀まるお2 さん 11/05/25 09:50
 
 たしかに、ReplaceRegular関数の仕様はいまいちな気がします。

 ヒットして置換されたのか、それともヒットしなくて置換されなかったのか分
かるようにするにはどうしたらいいかということでこういう仕様にしてしまった
んですけども…

 とりあえず、互換性を維持する必要もあるので、パラメータ5に数値の2を指
定したら、置換出来なかった場合には元の文字列をそのまま返す、という風にさ
せていただきます。

 次のβ版に付属のHmJre.dll(V3.39)から対応させていただきます。

[ ]
RE:40583 _RE_40582_【弱要望】hmjre.dllNo.40585
ダヴィンチ1958 さん 11/05/25 12:40
 
こんにちは、ダヴィンチ@ユーザーです。
>  とりあえず、互換性を維持する必要もあるので、パラメータ5に数値の2を指
> 定したら、置換出来なかった場合には元の文字列をそのまま返す、という風にさ
> せていただきます。

ご回答ありがとうございます。
ちなみにパラメータ5の値の意味は以下のようになりますか?

●ビット0=ヒットした置換対象を制御
 0=最初の文字だけ置換
 1=すべての文字を置換
●ビット1=ヒットしなかったときの戻り値を制御
 0=NULL
 1=元の文字
 ※)ヒットした場合は0/1にかかわらず置換後の文字列を返す

ビット1 ビット0 値
  0         0    0=ヒットした最初の文字を置換、ヒットしなかったときはNULL
を返す
  0         1      1=ヒットしたすべての文字を置換、ヒットしなかったときはNUL
Lを返す
  1         0      2=ヒットした最初の文字を置換、ヒットしなかったときは元の
文字をそのまま返す
  1         1      3=ヒットしたすべての文字を置換、ヒットしなかったときは元
の文字をそのまま返す

---- "秀まるお2" <xxxxxxxxxxxxxxxxxxx@maruo.co.jp> さんは書きました:
>  たしかに、ReplaceRegular関数の仕様はいまいちな気がします。
>
>  ヒットして置換されたのか、それともヒットしなくて置換されなかったのか分
> かるようにするにはどうしたらいいかということでこういう仕様にしてしまった
> んですけども…
>
>  とりあえず、互換性を維持する必要もあるので、パラメータ5に数値の2を指
> 定したら、置換出来なかった場合には元の文字列をそのまま返す、という風にさ
> せていただきます。
>
>  次のβ版に付属のHmJre.dll(V3.39)から対応させていただきます。


---以下の内容はコミュニテックス会議室システムにより付加されました。
本文中のメールアドレスは伏せ字に変換されました。伏せ字にしたくない場合
はメールアドレスを""で囲んで書き込んでください。

[ ]
RE:40585 _RE_40582_【弱要望】hmjre.dllNo.40586
秀まるお2 さん 11/05/25 16:14
 
 第5パラメータに0と1の値が指定出来る他に、2も指定出来るようにして、
2を指定したら、「すべての文字列を置換」+「ヒットしなかった場合はそのま
ま返る」としました。

 「1つだけ置換」+「ヒットしなかった場合はそのまま返る」というのは無い
ですけど、あんまりヘルプがややこしくなるのもどうかと思うので、上記の仕様
でいいんじゃないかと思います。

 それに、やはり互換性のことを考えると、こういう仕様変更をしたとしても、
それをユーザーさんが使うのはちょっと危険だろうという気がします。HmJre.
dllのバージョンが古くても、第5パラメータに数値の2を指定して、特にエ
ラーになることなく、見た目上は正常に動作してしまいます。

 なので、やはり面倒でも

 $$cnv = dllfuncstr("ReplaceRegular", "&", $$str, 0, "&amp;",1);
 if ($$cnv != "")
 {
  $$str = $$cnv;
 }

 と書いていただいた方が無難だと思います。特に他の人にマクロを渡す可能性
があるなら、その人が秀丸エディタV8.04でマクロを動かす可能性もある訳なの
で、やはり上記のようにしといた方がいいと思います。それか、マクロの先頭付
近に、

    #major = dllfunc("JreGetVersion") / 256;
    #minor = (dllfunc("JreGetVersion") & 0xF0) / 16 * 10
             + (dllfunc("JreGetVersion") & 0xF);
    #ver = #major * 100 + #minor;
    if( #ver< 339 ) {
        message "HmJre.dllのバージョンが古いです。";
        endmacro;
    }

 みたいな処理を入れる必要が出てきてしまいます。

[ ]
RE:40586 _RE_40585__RE_40582_【弱要望】No.40594
ダヴィンチ1958 さん 11/05/27 12:38
 
こんにちは、ダヴィンチ@ユーザーです。
回答ありがとうございました。
バージョン違いによる誤用が原因で不具合が発生すると
原因がわかりにくいし、いろいろ問題が起こりそうですね。
ご回答の件了解です。

---- "秀まるお2" <xxxxxxxxxxxxxxxxxxx@maruo.co.jp> さんは書きました:
>  第5パラメータに0と1の値が指定出来る他に、2も指定出来るようにして、
> 2を指定したら、「すべての文字列を置換」+「ヒットしなかった場合はそのま
> ま返る」としました。
>
>  「1つだけ置換」+「ヒットしなかった場合はそのまま返る」というのは無い
> ですけど、あんまりヘルプがややこしくなるのもどうかと思うので、上記の仕様
> でいいんじゃないかと思います。
>
>  それに、やはり互換性のことを考えると、こういう仕様変更をしたとしても、
> それをユーザーさんが使うのはちょっと危険だろうという気がします。HmJre.
> dllのバージョンが古くても、第5パラメータに数値の2を指定して、特にエ
> ラーになることなく、見た目上は正常に動作してしまいます。
>
>  なので、やはり面倒でも
>
>  $$cnv = dllfuncstr("ReplaceRegular", "&", $$str, 0, "&amp;",1);
>  if ($$cnv != "")
>  {
>   $$str = $$cnv;
>  }
>
>  と書いていただいた方が無難だと思います。特に他の人にマクロを渡す可能性
> があるなら、その人が秀丸エディタV8.04でマクロを動かす可能性もある訳なの
> で、やはり上記のようにしといた方がいいと思います。それか、マクロの先頭付
> 近に、
>
>     #major = dllfunc("JreGetVersion") / 256;
>     #minor = (dllfunc("JreGetVersion") & 0xF0) / 16 * 10
>              + (dllfunc("JreGetVersion") & 0xF);
>     #ver = #major * 100 + #minor;
>     if( #ver< 339 ) {
>         message "HmJre.dllのバージョンが古いです。";
>         endmacro;
>     }
>
>  みたいな処理を入れる必要が出てきてしまいます。


---以下の内容はコミュニテックス会議室システムにより付加されました。
本文中のメールアドレスは伏せ字に変換されました。伏せ字にしたくない場合
はメールアドレスを""で囲んで書き込んでください。

[ ]