[ 新規に投稿する ]

複数行の一致をマクロで実現するには?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:数値)を使う」という説明は見かけるものの、どうやって行えばいいか、具体的なコードを見つけることができなくて、困っていました。

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

[ 新規に投稿する ]