連続する内容の検索と置換No.10149
tack さん 23/05/27 12:17
 
tackです、いつもお世話になっております。
先の投稿は間違えていた部分があり削除をしております、掲示板を汚してしまい申し
訳ありません。

自分でタイトルの表現に悩んでしまったため上手く説明できるか怪しいのですが以下
の内容を検索、置換するようなことは秀丸マクロでできるのかお教えください。

会話内容が記載されたスクリプトのようなテキストファイルが対象です。
条件として必ずあるのが、セリフの始まりには必ず
name,<outline>名前</outline>, の行が存在し、
連続するセリフとなる場合に限りname,<outline>太郎</outline>,が省略されます。
セリフの場合、msg,1,と表記され、セリフじゃない場合はmsg,0,となります。

またセリフの際のボイスを指定する内容はキャラクタ名ごとにボイスデータを仕分け
てもいないため、検索に利用できなさそうだな、と感じました。

実際に行いたい内容はmsg,1,の後ろに発言者の名前を挿入したいのです。(変換後の
文章が理想)
最後の行近辺のようにイメージが挿入される構文が無ければ一纏めで検索して、置換
も出来ると思いましたが、イメージの構文を消したくないので難しく。
※元の文章は2名で会話していますが、最大3名の文章があると想定してマクロは組
み進めています。なので3名の検索・挿入もしくは置換ができ、1名や2名の場合で
もエラーが起きないのが理想です。


元の文章
--------------------------------------------------------------
name,<outline>太郎</outline>,
playvoice,1,character/voice_01
msg,1,<outline>「おはよう」</outline>,

name,<outline>花子</outline>,
playvoice,1,character/voice_02
msg,1,<outline>「おはよう」</outline>,

name,<outline>太郎</outline>,
playvoice,1,character/voice_03
msg,1,<outline>「今日はいい天気だね」</outline>,

name,
msg,0,<outline>太郎は朗らかに挨拶した。</outline>,

name,<outline>太郎</outline>,
playvoice,1,character/voice_04
msg,1,<outline>「そういえばテスト勉強した?」</outline>,

playvoice,1,character/voice_05
msg,1,<outline>「僕はしっかり勉強できて自信があるんだ」</outline>,

name,<outline>花子</outline>,
playvoice,1,character/voice_06
msg,1,<outline>「自信はないかな」</outline>,

playvoice,1,character/voice_07
msg,1,<outline>「でも頑張るつもり」</outline>,

wait,,,,,,,,,,,
bg,download/character/100

playvoice,1,character/voice_08
msg,1,<outline>「お互い頑張ろうね!」</outline>,

--------------------------------------------------------------

変換後の文章
--------------------------------------------------------------
name,<outline>太郎</outline>,
playvoice,1,character/voice_01
msg,1,<outline>太郎「おはよう」</outline>,

name,<outline>花子</outline>,
playvoice,1,character/voice_02
msg,1,<outline>花子「おはよう」</outline>,

name,<outline>太郎</outline>,
playvoice,1,character/voice_03
msg,1,<outline>太郎「今日はいい天気だね」</outline>,

name,
msg,0,<outline>太郎は朗らかに挨拶した。</outline>,

name,<outline>太郎</outline>,
playvoice,1,character/voice_04
msg,1,<outline>太郎「そういえばテスト勉強した?」</outline>,

playvoice,1,character/voice_05
msg,1,<outline>太郎「僕はしっかり勉強できて自信があるんだ」</outline>,

name,<outline>花子</outline>,
playvoice,1,character/voice_06
msg,1,<outline>花子「自信はないかなー」</outline>,

playvoice,1,character/voice_07
msg,1,<outline>花子「でも頑張るつもり」</outline>,

wait,,,,,,,,,,,
bg,download/character/100

playvoice,1,character/voice_08
msg,1,<outline>花子「お互い頑張ろうね!」</outline>,

--------------------------------------------------------------


マクロの氏名を取得する部分は考えたのですが、該当部分に挿入までが思いつかず上
手く進みません。(以下は氏名検索まで)
--------------------------------------------------------------

setcompatiblemode 0x00020000;

// 一撃でもとへと戻せるようにグループ
begingroupundo;

gofiletop;
$a = ""; // Aの氏名を保存する変数
$b = ""; // Bの氏名を保存する変数
$c = ""; // Cの氏名を保存する変数

while (1) {
    searchdown2 "(?<=name,<outline width=2 color=black>).*?(?=</outline>)",
regular; // 氏名を検索
    if (!result) break;
    $name = gettext(foundtopx, foundtopy, foundendx, foundendy); // 検索結果
から氏名を取得
    right;
    // 同じ氏名が既に取得されている場合はスキップ
    if ($name == $a || $name == $b || $name == $c) continue;

    if ($a == "") {
        $a = $name; // $aにAの氏名を保存
    } else if ($b == "") {
        $b = $name; // $bにBの氏名を保存
    } else if ($c == "") {
        $c = $name; // $cにCの氏名を保存
    }

}
    message $a;
    message $b;
    message $c;
--------------------------------------------------------------

と作成途中で止まってしまっています、ご教授いただけましたら幸いです。

[ ]
RE:10149 連続する内容の検索と置換No.10151
こみやんま さん 23/05/27 14:39
 
以下みたいな感じでいいかと思いますよ。

ChatGPTやBardに聞けば、人気上位の汎用言語(TOP10以内)であれば、
コードの断片なら返答してくれるので、
「こういうデータがある」「こういう結果にしたい」として全体の流れを聞いて、
「こういう行がある」「こういうデータを取り出したい」「こういう風に置き換えた
い」としてコード断片を聞き出せば、
あっという間に完成すると思いますよ。

// -----------------test.mac-----------------------

jsmode "WebView2";

js {
let data = hidemaru.getSelectedText() || hidemaru.getTotalText();

let lines = data.split('\n'); // dataは元データの文字列
let result = "";

let name = "";

// 1行ずつ
for(let line of lines) {

  // 新しい名前が来たら、名前更新
  let new_name = line.match(/^name,<outline[^>]*>([^<]+)<\/outline>/);
  if (new_name) {
     name = new_name[1];
  }
 
  // msg,1,<out...> の行はセリフなので、直近の名前を入れる
  let serihu_regexp = line.replace(/(^msg,1,<outline[^>]*>)([^<]+<\/outline
>)/, `$1${name}$2`);
 
  result += serihu_regexp;
}

begingroupundo();
let [lineno, column] = hidemaru.getCursorPos();
selectall();
insert(result);
moveto2(column, lineno);
endgroupundo();
}

[ ]
RE:10151 連続する内容の検索と置換No.10152
tack さん 23/05/27 14:57
 
望む通りの結果が返されました、ありがとうございます!

chatGPTに聞いてみたのですが、イマイチ聞き方が下手だったのか上手く勧められな
かったのでお知恵を拝借した次第です。
本当にありがとうございます!

[ ]
RE:10149 連続する内容の検索と置換No.10153
igus さん 23/05/28 07:50
 
別解でこんなのを作ってみました

setcompatiblemode 0x00020000;
begingroupundo;gofiletop;
while(1){
  searchdown2 "(?<=name,<outline>).*?(?=</outline>)", regular;
  #y1=y;
  if(!result)break;
  $name=gettext(foundtopx,foundtopy,foundendx,foundendy);
  searchdown2 "(?<=name,<outline>).*?(?=</outline>)", regular;
  if(!result){gofileend;#x=x;#y2=y;}else{#x=x;#y2=y;}
  moveto 0,#y1;beginsel;moveto #x,#y2;
  replaceallfast "<outline>「","<outline>"+$name+"「",inselect2;
  moveto 0,#y1+1;}
endgroupundo;endmacro;

[ ]
RE:10153 連続する内容の検索と置換No.10154
igus さん 23/05/28 12:43
 
短いマクロですが落ち着いて見返すと変数の無駄遣いとかいろいろ残念ですね
意図を汲んでもらえればいいんですが、自分的には気に入らないので
スクリプトを以下のに差し替えていただけると幸いです

setcompatiblemode 0x00020000;
begingroupundo;gofiletop;
while(1){
  searchdown2 "(?<=name,<outline>).*?(?=</outline>)", regular;
  #y1=y;
  if(!result)break;
  $name=gettext(foundtopx,foundtopy,foundendx,foundendy);
  searchdown2 "(?<=name,<outline>).*?(?=</outline>)", regular;
  if(!result){gofileend;#x=x;#y2=y;}else{#x=x;#y2=y;}
  moveto 0,#y1;beginsel;moveto #x,#y2;
  replaceallfast "<outline>「","<outline>"+$name+"「",inselect2;
  moveto 0,#y1+1;}
endgroupundo;endmacro;

[ ]
RE:10154 連続する内容の検索と置換No.10155
igus さん 23/05/28 12:53
 
あれ?変わってない、正解はこちら

setcompatiblemode 0x00020000;
begingroupundo;gofiletop;
while(1){
  searchdown2 "(?<=name,<outline>).*?(?=</outline>)", regular;
  #y1=y;
  if(!result)break;
  $name=gettext(foundtopx,foundtopy,foundendx,foundendy);
  searchdown2 "(?<=name,<outline>).*?(?=</outline>)",regular;
  if(!result)gofileend;
  beginsel;moveto 0,#y1;
  replaceallfast "<outline>「","<outline>"+$name+"「",inselect2;
  moveto 0,#y1+1;}
endgroupundo;endmacro;

私も読み上げのためにテキストにルビを振ったりする
秀丸マクロを作ってるんですが、戯曲のようなものだと
読み上げる声を変えたいと思う場面があります
後学のためにtackさんの利用されてる読み上げソフトを
教えていただけませんか?

[ ]
RE:10155 連続する内容の検索と置換No.10156
tack さん 23/05/31 02:40
 
igus様、こんばんわ、いつもお世話になっております。

まだ教えていただいたマクロを試すことが出来ていないのですが、戻りましたら試し
てみます。
自分は教えてもらってばかりで大層なことが出来ていないのが実情ですが、読み上げ
ソフトはソフトークや音読さん、ボイスロイドなどを利用してRenpyやlight.vnに読
み込ませるようにしたいと考えています。
ただ一気に修正等もできないものですから、詰まってしまった際にご教授いただけれ
ば幸いです。


[ ]