URL末尾の余分な文字列を削除したいNo.09953
楽になりたい さん 22/09/12 23:53
 
 URL末尾の余分な文字列(index.***や?以降に続く文字列)を削除するマクロを自
作中なのですが、なぜかループを途中で抜けてしまって全てのURLを処理できません。

 原因などのご教授をいただきたく、よろしくお願いします。



==================== サンプルテキスト =============================

https://news.yahoo.co.jp/categories/domestic/index.php 2020
https://news.yahoo.co.jp/categories/domestic/? 2020
https://news.yahoo.co.jp/categories/domestic/index.htm 2020
https://news.yahoo.co.jp/categories/domestic/? 2020

==================== 試作マクロ1 =============================
// URL修正マクロ

// gofiletop ;
 call URL ;

 message "Macro end." ;

 gofiletop ;
 enabledraw ;

endmacro ;



URL:

 gofiletop ;

 while( 1 ) {

  searchdown2 "https?://", regular, nocasesense, nohilight ;
  if( false == result ) break ;

  ##hy = y ; ##hx = x ;
//  beginsel ;
//  selectline ;
//  message "un=" + str( ##un ) + ", hy=" + str( ##hy ) + ", hx=" + str( ##h
x ) + ", " + $$url[ ##un ] ;
  call DeleteURLparameta ;
//  escape ;
  message "Returned. y=" + str( y ) + ", x=" + str( x ) + " hy=" + str( ##hy
 ) + ", hx=" + str( ##hx ) ;
  moveto ##hx + 1, ##hy ;


 }

endmacro ;



DeleteURLparameta:

 message "DeleteURLparameta" ;
 $$target[ 0 ] = "/index\\..+" ;
 $$target[ 1 ] = "\\?" ;

 ##tc = 0 ; ##ty = y ; ##tx = x ; ##sx = 0 ;

 while( 1 ) {

  if ( 2 == ##tc ) break ;

  moveto ##tx, ##ty ;
  beginsel ;
  searchdown2 "\\s| ", regular, nocasesense, nohilight ;
  ##sx = x ;
  message "URL end. y=" + str( y ) + ". sx=" + str( ##sx ) ;
//  searchdown2 $$target[ ##tc ], regular, nocasesense, nohilight ;
  searchdown2 $$target[ ##tc ], regular, nocasesense, inselect, nohilight ;
  if ( false == result ) message "Target not found. tc=" + str( ##tc ) + ".
y=" + str( y )  ;
  if ( false == result ) goto NextTarget ;

  if ( 0 == ##tc ) moveto x + 1, y ;
  beginsel ;
  searchdown2 "\\s| ", regular, nocasesense, nohilight ;
  message "HTTP selected. tc=" + str( ##tc ) + ". y=" + str( y ) + ". x=" +
str( x ) ;
  escape ;

  NextTarget:

//  escape ;
  ##tc = ##tc + 1 ;

 }

// escape ;
 message "Complete DeleteURLparameta. y=" + str( y ) + ", x=" + str( x ) ;

endmacro ;

==================== 試作マクロ2 =============================
// URL修正マクロ

// gofiletop ;
 call URL ;

 message "Macro end." ;

 gofiletop ;
 enabledraw ;

endmacro ;



URL:

 gofiletop ;

 while( 1 ) {

  searchdown2 "https?://", regular, nocasesense, nohilight ;
  if( false == result ) break ;

  ##hy = y ; ##hx = x ;
  beginsel ;
  selectline ;
  message "un=" + str( ##un ) + ", hy=" + str( ##hy ) + ", hx=" + str( ##hx
 ) + ", " + $$url[ ##un ] ;
//  call DeleteURLparameta ;
  escape ;
  message "Returned. y=" + str( y ) + ", x=" + str( x ) + " hy=" + str( ##hy
 ) + ", hx=" + str( ##hx ) ;
  moveto ##hx + 1, ##hy ;


 }

endmacro ;



DeleteURLparameta:

 message "DeleteURLparameta" ;
 $$target[ 0 ] = "/index\\..+" ;
 $$target[ 1 ] = "\\?" ;

 ##tc = 0 ; ##ty = y ; ##tx = x ; ##sx = 0 ;

 while( 1 ) {

  if ( 2 == ##tc ) break ;

  moveto ##tx, ##ty ;
  beginsel ;
  searchdown2 "\\s| ", regular, nocasesense, nohilight ;
  ##sx = x ;
  message "URL end. y=" + str( y ) + ". sx=" + str( ##sx ) ;
//  searchdown2 $$target[ ##tc ], regular, nocasesense, nohilight ;
  searchdown2 $$target[ ##tc ], regular, nocasesense, inselect, nohilight ;
  if ( false == result ) message "Target not found. tc=" + str( ##tc ) + ".
y=" + str( y )  ;
  if ( false == result ) goto NextTarget ;

  if ( 0 == ##tc ) moveto x + 1, y ;
  beginsel ;
  searchdown2 "\\s| ", regular, nocasesense, nohilight ;
  message "HTTP selected. tc=" + str( ##tc ) + ". y=" + str( y ) + ". x=" +
str( x ) ;
  escape ;

  NextTarget:

//  escape ;
  ##tc = ##tc + 1 ;

 }

// escape ;
 message "Complete DeleteURLparameta. y=" + str( y ) + ", x=" + str( x ) ;

endmacro ;

=========================================================================



『サンプルテキスト』が動作確認用サンプルテキストです。

現在は全ての行がURL文字列で始まっていますが、本番ではURL文字列の前にHP名など
が存在する場合があります。
URL文字列の後ろには記事公開日やライター名などが追加されることが有ります。



『試作マクロ1』が試作中のマクロです。

サブルーチンURLがURL文字列を検索する無限ループになっています。
URL文字列が見つからない場合にループを抜け、サブルーチンからも抜け、試作マク
ロからも抜けます。

URL文字列を見つけると、サブルーチンDeleteURLparametaを呼び出します。

サブルーチンDeleteURLparametaから帰ってくるとカーソルを一つ進めて次のURL文字
列を探します。

URL末尾の余分な文字列を削除するのがサブルーチンDeleteURLparametaです。

writeデバッグ用message文が各所にあるのはご愛嬌と言う事で。

実行すると、何故か2番目の
https://news.yahoo.co.jp/categories/domestic/? 2020
の?が選択された後にサブルーチンURLから抜けてしまいます。
抜けた後にもマクロから抜けたことを知らせるmessage文があるのですが、なぜかこ
れが実行されないのも謎です。
そしてマクロが終了してしまいます。



サブルーチンURLとDeleteURLparametaのどちらにバグがあるのかを切り分けるため、
サブルーチンURLのコメント位置を移動させたのが『試作マクロ2』です。
サブルーチンDeleteURLparametaを呼び出さないようにコメントアウトしてあります。
これを実行すると、4行すべてのURL文字列を見つけていることを確認できます。
なのでDeleteURLparametaにバグがあるように見えるのですが、『試作マクロ1』の実
行結果ではURLにバグがあるように見えます。



宜しくお願いします。

[ ]
RE:09953 URL末尾の余分な文字列を削除しNo.09954
楽になりたい さん 22/09/12 23:55
 
あれ?

行頭のタブは半角スペースに化けちゃうんですね。

[ ]
RE:09954 URL末尾の余分な文字列を削除しNo.09955
igus さん 22/09/13 03:19
 
楽になりたい さん、こんにちは。
サブルーチンで endmacro してるからそこで終わってしまってるようですね。endmac
ro の代わりに return にしてみたらちゃんと進んでいくようでした。

[ ]
RE:09955 URL末尾の余分な文字列を削除しNo.09956
楽になりたい さん 22/09/13 22:59
 
igus さん、こんにちは。

おおっ! 修正したらちゃんと最後まで動きました。

サブルーチンからの返りと、マクロからの返りをごっちゃにしてたんですね。
ご指摘ありがとうございました。

[ ]