ファイル名と指定したタグ間の文字の取得No.17325
Trinitron さん 04/06/09 05:14
 
ファイル名と指定したタグ間の文字の取得を行うマクロ
に関しての質問です。

htmlファイルの管理に使いたいと思って
指定ディレクトリ以下のhtmlファイルから
そのファイルの相対リンクとそのhtmlの
<title></title>間の文字を抽出してテキストに
書き出すマクロ探したのですが、見つかりませんでした。

ファイル名 [スペース] 相対リンク
といった感じで1つのファイルに付き1行で
書き出してくれるものを希望しています。


このマクロに心覚えのある方、
又はマクロを作成して下さる方がいたら
返信お願いします。

[ ]
RE:17325 ファイル名と指定したタグ間の文No.17326
秀まるお2 さん 04/06/09 09:51
 
 「特定フォルダ配下のすべてのファイルを対象に」については、秀丸マクロを
使うよりも、UNIX系OSに付属している、いわゆる「find」ってコマンドを使うの
が便利です。

 WindowsNT/2000/XPならば、例えばオータム川俣さん作の「NT版UNIX-like
tools」の中のfindf.exeを使うのがいいんじゃないかと思います。

     http://www.piedey.co.jp/softs/ntuxtl.html

 <title>と</title>の間の文字を取り出すマクロとしては、例えば以下のよう
な物となります。

    #origin = hidemaruhandle(0);
    #output = findhidemaru("title.txt");
    if( #output == -1 ) {
        newfile;
        changename "title.txt";
        #output = hidemaruhandle(0);
        setactivehidemaru #origin;
    }
    gofiletop;
    while(1) {
        searchdown2 "<title>";
        if( !result ) break;
        escape;
        right 7;
        while( code == ' ' || code == '\n' ) right;
        #x = x; #y = y;
        searchdown "</title>";
        if( !result ) {
            gofileend;
        }
        message "A";
        $s = gettext( #x, #y, x, y );
        message $s;
        setactivehidemaru #output;
        gofileend;
        insertfix $s;
        while(1) {
            replacedown "[\n ]", "", regular;
            if( !result ) break;
        }
        gofileend;
        insert "\n";
        setactivehidemaru #origin;
    }
    exit;


 例えば上記のマクロを「titleout.mac」という名前にしたとしたら、コマンド
プロンプト上から

    findf *.html -exec hidemaru.exe /x titleout.mac {} ;

 のようにすればいいです。

[ ]
RE:17325 ファイル名と指定したタグ間の文No.17327
ENCODINGSHIFTJIS さん 04/06/09 09:54
 
Grep を試すと収集はできます(たぶん)
最終形に整えるのは、いろいろな方法で。

[ ]
RE:17327 ファイル名と指定したタグ間の文No.17328
秀まるお2 さん 04/06/09 10:07
 
 <title>から</title>までの間に改行が入ってなければgrepでもなんとかなり
そうです。

 改行が入っている場合は、改行以降の内容がgrep結果に出てこないので、やは
りマクロで抽出しないとダメみたいです。

[ ]
RE:17326 ファイル名と指定したタグ間の文No.17329
秀まるお2 さん 04/06/09 10:56
 
 1つ配慮が抜けてました。&、デバッグ用のmessage文が残ってました。さら
に、「\\n」と書くべき所が「\n」になってる所がありました。

> ファイル名 [スペース] 相対リンク
> といった感じで1つのファイルに付き1行で
> 書き出してくれるものを希望しています。

 相対リンクというのは、何に対しての相対なのか分からないとマクロとして実
現できないです。

 単にファイル名のフルパスを入れたいってことなら、以下のようになります。

    #origin = hidemaruhandle(0);
    $filename = filename;
    #output = findhidemaru("title.txt");
    if( #output == -1 ) {
        newfile;
        changename "title.txt";
        #output = hidemaruhandle(0);
        setactivehidemaru #origin;
    }
    gofiletop;
    while(1) {
        searchdown2 "<title>";
        if( !result ) break;
        escape;
        right 7;
        while( code == ' ' || code == '\n' ) right;
        #x = x; #y = y;
        searchdown "</title>";
        if( !result ) {
            gofileend;
        }
        $s = gettext( #x, #y, x, y );
        setactivehidemaru #output;
        gofileend;
        insert $filename + " ";
        insertfix $s;
        while(1) {
            replacedown "[\\n ]", "", regular;
            if( !result ) break;
        }
        gofileend;
        insert "\n";
        setactivehidemaru #origin;
    }
    exit;

------------
 ファイル名の「\」を「/」にしたいならば、

   insert $filename + " ";

 の所を、

   insertfix $filename + " ";
   while(1) {
       replace "\\", "/";
       if( !result ) break;
   }

 のようにすればいいです。

 絶対パスを相対パスに変換するには、例えばパス名の先頭の何文字か除去した
いだけなら、

   insert midstr( $filename, 10, 256 ) + " ";

 のように、例えば先頭の10文字を除去してやればいいです。

[ ]
RE:17329 ファイル名と指定したタグ間の文No.17330
秀まるお2 さん 04/06/09 11:18
 
>        replace "\\", "/";

 replaceじゃなくて、replacedownでした。

[ ]
RE:17329 ファイル名と指定したタグ間の文No.17332
Trinitron さん 04/06/09 12:47
 
これで望んでいることはほとんど満たされているのですが、
指定ディレクトリー以下のファイルに対して一括処理が
出来ないのは残念です。

dos画面が開くソフトは使いたくないし
(というか、使えない。)はぁー。

後で何か思いついたら返信お願いいたします。

[ ]
RE:17332 ファイル名と指定したタグ間の文No.17333
秀まるお2 さん 04/06/09 13:17
 
 findf.exeを使う方法は、その方がTrinitronさんにとって都合がいいと思った
からそう書いただけで、秀丸でそれ相当のことが出来ないという訳ではありませ
ん。

 以下はサンプルマクロです。

    $dir = input( "検索したいフォルダは?", directory );
    if( $dir == "" ) endmacro;
    grep ".", "*.html", $dir, regular, filelist, fullpath;
    #grep = hidemaruhandle(0);
    gofiletop;
    while(1) {
        tagjump;
        if( result ) {
            call ExtractTitle;
            #file = hidemaruhandle(0);
            setactivehidemaru #grep;
            closehidemaru #file;
        }
        golineend2;
        down;
        if( !result ) break;
        golinetop2;
    }
    endmacro;

ExtractTitle:
    ##origin = hidemaruhandle(0);
    $$filename = filename;
    ##output = findhidemaru("title.txt");
    if( ##output == -1 ) {
        newfile;
        changename "title.txt";
        ##output = hidemaruhandle(0);
        setactivehidemaru ##origin;
    }
    gofiletop;
    while(1) {
        searchdown2 "<title>";
        if( !result ) break;
        escape;
        right 7;
        while( code == ' ' || code == '\n' ) right;
        ##x = x; ##y = y;
        searchdown "</title>";
        if( !result ) {
            gofileend;
        }
        $$s = gettext( ##x, ##y, x, y );
        setactivehidemaru ##output;
        gofileend;
        insert $$filename + " ";
        insertfix $$s;
        while(1) {
            replacedown "[\\n ]", "", regular;
            if( !result ) break;
        }
        gofileend;
        insert "\n";
        setactivehidemaru ##origin;
    }
    return;

[ ]
RE:17328 ファイル名と指定したタグ間の文No.17334
ENCODINGSHIFTJIS さん 04/06/09 14:05
 
> 改行が入っている場合は、
はい

だいたい、感覚でいってみました
<TITLE>|HREF=
で行けるでしょう。マクロを作る場合も文脈パターンを
調査するのにGrepは役にたちます

[ ]
RE:17333 ファイル名と指定したタグ間の文No.17335
秀まるお2 さん 04/06/09 14:15
 
>     grep ".", "*.html", $dir, regular, filelist, fullpath;

   , subdir も必要でした。

    grep ".", "*.html", $dir, regular, filelist, fullpath, subdir;

[ ]
RE:17333 ファイル名と指定したタグ間の文No.17346
Trinitron さん 04/06/10 05:42
 
> 以下はサンプルマクロです。

サンプルのマクロでほぼ望んでいた動作をしてくれました。
ありがとうございました。 最後のお願いなのですが、

現在は下記のようになってますが、
d:\folder\subfolder\00000001.html タイトル1
d:\folder\subfolder\00000002.html タイトル2
d:\folder\subfolder\00000003.html タイトル3

これをただのテキストではなくてそこに示されている
それぞれの絶対リンクを張った形でtitle.txtを
書き出すようには出来ないでしょうか?

イメージは下記のような感じです


<a href="d:\folder\subfolder\00000001.html">
d:\folder\subfolder\00000001.html タイトル1</a><BR>

<a href="d:\folder\subfolder\00000002.html">
d:\folder\subfolder\00000002.html タイトル2</a><BR>

<a href="d:\folder\subfolder\00000003.html">
d:\folder\subfolder\00000003.html タイトル3</a><BR>

追加でお願いしてしまって本当にすみません。
マクロへの機能追加お願いできませんでしょうか?

お忙しいと思いますが、よろしくお願いいたします。
では。



[ ]
RE:17346 ファイル名と指定したタグ間の文No.17347
ENCODINGSHIFTJIS さん 04/06/10 09:21
 
秀丸エディタのマクロライブラリ の中で
目次
で検索してみましょう。
H要素を処理するサンプルがあります、
Grep TITLE を組み合わせれば・・・

[ ]
RE:17347 ファイル名と指定したタグ間の文No.17348
秀まるお2 さん 04/06/10 09:48
 
        insert $$filename + " ";

 ここを適当に、例えば、

        insert "<a href=\"" + $$filename + "\">\n";

 にすればいいと思います。

[ ]
RE:17348 ファイル名と指定したタグ間の文No.17351
Trinitron さん 04/06/10 10:49
 
>        insert $$filename + " ";
>
> ここを適当に、例えば、
>
>        insert "<a href=\"" + $$filename + "\">\n";
>
> にすればいいと思います。


返信どうもありがとうございます。が、
上のマクロでは

<a href="d:\folder\subfolder\00000001.html">
の部分までは出来るのですが、それ以降について欲しい

d:\folder\subfolder\00000001.html タイトル3</a><BR>
の部分が省略されてしまってます。
ここのところも表示されるようになったら完璧なのですが。


サイトのサイトマップにも使える用途が結構あるマクロ
だと思います。マクロの追加改良お願いします。

すみませんが、よろしくお願いします

[ ]
RE:17351 ファイル名と指定したタグ間の文No.17355
秀まるお2 さん 04/06/10 13:49
 
 すみません。よく見てませんでした。

        insert "<a href=\"" + $$filename + "\">\n" + $$filename + " ";

 に直しつつ、

        gofileend;
        insert "\n";

 の所を、

        gofileend;
        insert "</a><br>\n";

 にすればいいかと思います。

 その辺、マクロの中身を理解いただければ、ご自身で好きなようにカスタマイ
ズ可能かと思いますので、ある程度はご自身でうまくいじって欲しいです。

[ ]