複数行の一致をマクロで実現するには?No.08608
kuke さん 17/12/27 01:06
 
LibreOfficeでhtml形式で出力したファイルの中にあるスタイルタグを削除したいと
考えています。
正規表現で挑戦しましたが、複数行の一致が必要なので、どうしたら良いのかよくわ
かりませんでした。

そこで、マクロで解決しようと考えているのですが、マクロでも、どのように記述し
たら良いのかわかりません。
申し訳ありませんが、教えてもらえないでしょうか。

処理するテキストの対象部分の抜粋です。
「<style」と「</style>」の間をstyleタグも含めて削除したいと考えています。

*******************************************************************************


<head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
 <title>ページタイトル</title>
 <meta name="generator" content="LibreOffice 5.4.3.2 (Windows)"/>
 <meta name="created" content="2017-12-21T16:32:21.702000000"/>
 <meta name="changed" content="2017-12-21T18:00:03.338000000"/>
 <style type="text/css">
  @page { margin-left: 24.99mm; margin-right: 14.99mm; margin-top: 14.99mm;
margin-bottom: 14.99mm }
  p { margin-bottom: 2.47mm; direction: inherit; line-height: 120% }
  p.cjk { font-size: 10pt }
  h1 { margin-bottom: 2.12mm; direction: inherit }
  h1.western { font-family: "Liberation Sans", sans-serif; font-size: 18pt }
  h1.cjk { font-family: "HGゴシックE", monospace; font-size: 21pt }
  h1.ctl { font-family: "Arial Unicode MS"; font-size: 18pt }
  h2 { direction: inherit }
  h2.western { font-family: "Liberation Sans", sans-serif; font-size: 16pt }
  h2.cjk { font-family: "HGゴシックE", monospace; font-size: 18pt }
  h2.ctl { font-family: "Arial Unicode MS"; font-size: 16pt }
  h3 { direction: inherit }
  h3.western { font-family: "Liberation Sans", sans-serif; font-size: 14pt }
  h3.cjk { font-family: "HGゴシックE", monospace; font-size: 16pt }
  h3.ctl { font-family: "Arial Unicode MS"; font-size: 14pt }
  td p { margin-bottom: 0mm; direction: inherit }
  td p.cjk { font-size: 10pt }
  a:link { so-language: zxx }
 </style>
</head>

*******************************************************************************

[ ]
RE:08608 複数行の一致をマクロで実現するNo.08610
秀丸担当 さん 17/12/27 10:09
 

手動でやる場合、いったん"<style"を検索して、そこから「選択開始」コマンド(標
準でShift+F6)に実行し、次に"</style>"を検索し、ヒット文字列の末尾まで行って
から削除するとできると思います。
これをマクロにすると以下のような感じになります。

setcompatiblemode 0x20000;
searchdown "<style";
if(result!=false){
  beginsel;
  searchdown "</style>";
  if(result!=false){
    moveto foundendx,foundendy;
    delete;
  }
}

手動の操作をマクロ化する方法もあります。
1.[マクロ]→[キー操作の記録開始/終了](標準でShift+F1)で記録開始します。
2.上記の検索、選択開始、検索、移動、削除の操作を行います。
3.[マクロ]→[キー操作の記録開始/終了](標準でShift+F1)で記録終了します。

こうしておくと、[マクロ]→[キー操作の再生](標準でShift+F2)を実行すると一連
の操作がまとめて行われます。
[マクロ]→[キー操作の保存...]で、記録した操作をマクロファイルに出力すること
ができます。

例は一応要件通りに書いてみましたが、styleタグではない他のタグで、入れ子やコ
メントがある場合は、「対応するタグに移動」コマンドのほうがいいかもしれません。
マクロの文の場合はgotagpairになります。
「対応するタグに移動」を使う場合はHTMLのカラー表示がされている必要があります。

[ ]
RE:08610 複数行の一致をマクロで実現するNo.08611
kuke さん 17/12/27 12:57
 
ありがとうございました。
意図した通りに動作しました。

テキストを加工する操作は、正規表現を使用する例についてのサンプルコードは、イ
ンターネット上で見つけることができたのです。

しかし、複数行をまたぐ一致については、「マクロで行う」や「(?#maxlines:数値)
を使う」という説明は見かけるものの、どうやって行えばいいか、具体的なコードを
見つけることができなくて、困っていました。

「キー操作の記録」で作成する方法も合わせて教えていただけて嬉しかったです。

[ ]