「標準変換」マクロの制限?

  1. 最初から使い出のあるマクロがサンプルとして公開されているのが何よりですが、
    「標準変換」マクロってもしかして置換対象が二文字までなのでしょうか?
    HTMLの実体参照のように、

    <→&lt;
    >→&gt;
    &→&amp;
    に置換するのはできるのですが、

    &lt;→<
    &gt;→>
    &amp;→&
    その逆はできませんでした。
    (バージョンは0.2.2です)

     |  あくつ  |  返信
  2. マクロはあくまでサンプルですのでたいした機能はないのですけど、
    そういう使い方は想定してませんでした(汗)
    「&gt;」などを「>」に変換したりとかに対応するためには少しばかりヨイショが
    必要ですね。

    お話によると「>」を「&gt;」に変換はできたということですので、
    マクロの内容は大体ご理解されていると思います。

    「&gt;」などを「>」に変換する例ですが、

    一番最後の「document.selection.Text = s2;」の直前で、

    s2 = s2.replace(/&gt;/mg, ">");
    s2 = s2.replace(/&lt;/mg, "<");
    s2 = s2.replace(/&amp/mg, "&");

    あんまり自信ないですが、こんな感じで記述していただけると変換できると思います。

     |  Kuro  |  返信
  3. 早速の返信ありがとうございます。

    おっしゃる通り三行追加することで
    &lt;→<
    もできるようになりました。

    ですが、やはり特定の置換パターンを追加するのではなく三文字以上の文字列でも一括置換させたくて、わからないなりにEmEditorとかVxEditorのマクロを参考にして、以下のようなスクリプトを書いてみました。

    if (document.selection.Text == "")
      document.selection.SelectAll();
    var word = new Array(
    "&lt;","<",
    "&gt;",">",
    "&amp;","&"
    );
    var tx = document.selection.Text;
    for (i = 0; i < tx.length; i += 2) {
      tx = tx.replace(/word[i]/,"mg","word[i+1]");
    }
    document.selection.Text = tx;

    やりたいことはわかっていただけると思います。しかし残念ながら、
    エラーこそ出なくなったものの、置換もされませんでした。

    無念……。

     |  あくつ  |  返信
  4. こんばんは、お返事遅れてすみません。
    ちょいと帰省しておりましてネットが自由に使えない環境におります。

    > if (document.selection.Text == "")
    >   document.selection.SelectAll();
    > var word = new Array(
    > "&lt;","<",
    > "&gt;",">",
    > "&amp;","&"
    > );
    > var tx = document.selection.Text;
    > for (i = 0; i < tx.length; i += 2) {
    >   tx = tx.replace(/word[i]/,"mg","word[i+1]");
    > }
    > document.selection.Text = tx;

    なるほど、なんとなく解りました。
    えっと、その方法ですともしかすると以下の点が問題かも。。。

    > for (i = 0; i < tx.length; i += 2) {

    ここで tx の長さぶんだけ回してますのでうっかりすると無限ループになっちゃう可能性があります。

    for (i = 0; i < word.length; i += 2) {

    こんな感じで word の配列ぶんだけまわすようにして、あとは置換の部分ですね。

    >   tx = tx.replace(/word[i]/,"mg","word[i+1]");

    ここで word[i] と word[i+1] が文字列として見なされてしまってるので以下のようにすれば変数として渡してやることができます。

    var r = new RegExp(word[i], "mg");
    tx = tx.replace(r, word[i+1]);

    んで、できあがったものが以下のとおりです。どうでしょうか、、、
    あまり自信は無いのですが。。。

    ------------------------------------------------
    if (document.selection.Text == "")
      document.selection.SelectAll();
    var word = new Array(
      "&lt;","<",
      "&gt;",">",
      "&amp;","&"
    );
    var tx = document.selection.Text;
    for (i = 0; i < word.length; i += 2) {
      var r = new RegExp(word[i], "mg");
      tx = tx.replace(r, word[i+1]);
    }
    document.selection.Text = tx;
    ------------------------------------------------

    mEditorのマクロの解説ページとかが準備できてなくてご迷惑をおかけしております、、、いましばらくお待ちを・・・あと5年ぐらいかかるかもしれないですが・・・(ぉぃ

     |  Kuro  |  返信
  5. 帰省中にもかからわず、ありがとうございました。

    ちゃんと希望通りに動きました!

     |  あくつ  |  返信
スポンサーリンク