jsを用いた挿入と置換についてNo.10175
tack さん 23/06/19 23:33
 
いつもお世話になっております、先日はご教授いただきありがとうございました。

標記の件のように、同じ塊の文字列があり、そのうちの該当部分を検索し、該当した
順に数値を挿入していくことは難しいでしょうか?
jsをChatGPTにて説明してもらいつつ組んでみましたが上手くいかなかったので出来
るのかも確認したく伺います。
エラーは発生しませんが、何も変更されない状況になっています。

【希望動作】
先頭行から検索し、screen viewerpage: が出てきた順にscreen viewerpage0:、scr
een viewerpage1:、screen viewerpage2:と振っていく。
        textbutton "Page 96" action ShowMenu("viewerpage96") xalign 0.5 yali
gn 0.5
        null
        null
        null
        null
        textbutton "Page 1" action ShowMenu("viewerpage1") xalign 0.5 yalign
 0.5
上記部分の上の"Page x" action ShowMenu("viewerpagex") のxにscreen viewerp
age:に挿入した数値−1を置換
上記部分の下の"Page y" action ShowMenu("viewerpagey") のyにscreen viewerp
age:に挿入した数値+1を置換
(xやyは何か数値が元々あり、その数値を上書き)

【対象部分 変更前】
screen viewerpage:

        # Call make_button to show a particular button.
        null
        null
        null
        null
        textbutton "Page 96" action ShowMenu("viewerpage96") xalign 0.5 yali
gn 0.5
        null
        null
        null
        null
        textbutton "Page 1" action ShowMenu("viewerpage1") xalign 0.5 yalign
 0.5


screen viewerpage:

        # Call make_button to show a particular button.
        null
        null
        null
        null
        textbutton "Page 96" action ShowMenu("viewerpage96") xalign 0.5 yali
gn 0.5
        null
        null
        null
        null
        textbutton "Page 1" action ShowMenu("viewerpage1") xalign 0.5 yalign
 0.5


【対象部分 変更後】
screen viewerpage0:

        # Call make_button to show a particular button.
        null
        null
        null
        null
        textbutton "Page -1" action ShowMenu("viewerpage-1") xalign 0.5 yali
gn 0.5
        null
        null
        null
        null
        textbutton "Page 1" action ShowMenu("viewerpage1") xalign 0.5 yalign
 0.5


screen viewerpage1:

        # Call make_button to show a particular button.
        null
        null
        null
        null
        textbutton "Page 0" action ShowMenu("viewerpage0") xalign 0.5 yalign
 0.5
        null
        null
        null
        null
        textbutton "Page 2" action ShowMenu("viewerpage2") xalign 0.5 yalign
 0.5


【マクロ内容】
setcompatiblemode 0x00020000;

begingroupundo;
gofiletop;
jsmode "WebView2";
js {
  let data = hidemaru.getSelectedText() || hidemaru.getTotalText();
  let viewerpage_number = 0;
  let line_number = 0;

  while (line_number < linecount) {
    getline(line_number);
    let line = "\0";

    if (line.match(/^screen viewerpage:/)) {
      let replace = "screen viewerpage" + viewerpage_number + ":";
      replace(/^screen viewerpage:/, replace);
      viewerpage_number += 1;

      while (line_number < linecount) {
        getline(line_number);
        line = "\0";

        if (line.match(/textbutton "Page (\d+)" action ShowMenu\("viewerpage
(\d+)"\) xalign 0.5 yalign 0.5/)) {
          let page_number = parseInt(RegExp.$1);
          let menu_number = parseInt(RegExp.$2);

          if (page_number === viewerpage_number - 1) {
            let page_replace = "Page " + (viewerpage_number - 1);
            let menu_replace = "ShowMenu(\"viewerpage" + (viewerpage_number
- 1) + "\")";
            replace(/Page (\d+)/, page_replace);
            replace(/ShowMenu\("viewerpage(\d+)"\)/, menu_replace);
          } else if (page_number === viewerpage_number + 1) {
            let page_replace = "Page " + (viewerpage_number + 1);
            let menu_replace = "ShowMenu(\"viewerpage" + (viewerpage_number
+ 1) + "\")";
            replace(/Page (\d+)/, page_replace);
            replace(/ShowMenu\("viewerpage(\d+)"\)/, menu_replace);
          }
          viewerpage_number += 1;
        } else if (line.match(/^screen viewerpage:/)) {
          line_number -= 1;
          break;
        }
      }
    }

    line_number += 1;
  }
}

endgroupundo;
enabledraw;
endmacro;

[ ]
RE:10175 jsを用いた挿入と置換についてNo.10176
こみやんま さん 23/06/20 03:29
 
多分下みたいな処理なんでしょう...


jsmode "WebView2";


js {

    // 対象データの取得
    let data = hidemaru.getSelectedText() || hidemaru.getTotalText();

    // 1行ずつに割って配列に
    let lines = data.split("\n");

    // カスタム処理する
    lines = do_custom_replace(lines);

    // 配列なのを1つのテキストに戻す
    let modify_data = lines.join("\n");


    // 以下エディタ上のテキストを置き換え
    begingroupundo();

    // 選択してないなら全部選択
    if (!selecting()) {
        selectall();
    }
    insert(modify_data);

    endgroupundo();



    function do_custom_replace(lines) {

        let sv_count = -1; // 「screen viewerpage:」を見つけたら0からカウン
ト付けるので手抜き。-1に初期値しておく。

        let tb_offset = 0; // textbutton "Page..."の処理。見つける度に「-1」
という値にしたり、「1」という値にしたりするらしい

        let modify_lines = [];

        // 1行ずつ処理  (screen_view:の単位で塊にした方が良さそうだが、まぁ
いいんでないの...)
        for(let line of lines) {

            // screen viewerpage: の処理
            let screen_viewerpage_regex = /(screen viewerpage)(:)/;

            // 発見したら...
            if (screen_viewerpage_regex.test(line)) {
                // 番号1つ足す
                sv_count++;
                let n = sv_count; // 名前短くしているだけ
                // その番号を挟んだ形で修正
                line = line.replace(screen_viewerpage_regex, "$1" + n + "$2");

                // 次 textbutton は -1のoffset
                tb_offset = -1;
            }

            // textbuttonの処理
            let textbutton_regex = /(textbutton "Page )\d+(" action ShowMenu.
"viewerpage)\d+(". xalign 0.5 yalign 0.5)/;
            // 発見したら
            if (textbutton_regex.test(line)) {

                let n = sv_count + tb_offset; // 現在のsv_countに、前回のtb_
offsetを足した値を...
                line = line.replace(textbutton_regex, "$1" + n + "$2" + n +
"$3");

                // 多分 エスパー読み取りをするに、textbuttonのoffsetは出てく
る度に -1と+1を 反転させたいという趣旨なのだろう...
                tb_offset = -tb_offset;
            }

            modify_lines.push(line);
        }

        return modify_lines;
    }

}

[ ]
RE:10175 jsを用いた挿入と置換についてNo.10177
igus さん 23/06/21 05:46
 
begingroupundo;gofiletop;#i=0;
while(1){
  replacedown "screen viewerpage:","screen viewerpage"+str(#i)+":";
  if(!result)break;
  #i=#i+1;
}
gofiletop;
$b1=@"""Page [0-9]+"" action ShowMenu\(""viewerpage[0-9]+""\)";
while(1){
  searchdown "(?<=screen viewerpage)(\\d+)(?=:)",regular;
  if(!result)break;
  #n=val(gettext(foundtopx,foundtopy,foundendx,foundendy));
  $a1=@"""Page "+str(#n-1)+@""" action ShowMenu\(""viewerpage"+str(#n-1)+@""
"\)";
  $a2=@"""Page "+str(#n+1)+@""" action ShowMenu\(""viewerpage"+str(#n+1)+@""
"\)";
   replacedown $b1,$a1,regular;
   replacedown $b1,$a2,regular;
}
endgroupundo;

[ ]
RE:10176 jsを用いた挿入と置換についてNo.10178
tack さん 23/06/25 14:27
 
>>こみやんま様
説明が不足していた部分等を察していただいた上でのご説明ありがとうございます。
お手数をお掛け致しました。

>>igus様
いつもお世話になっております、jsを用いずとも出来るとは思いもしませんでした。
こちらを参考に精進してまいります、ありがとうございます!

[ ]