(非公式)TrainConv5 駅前探険倶楽部 2009年春改変対応

駅探2010年春対応暫定版はこちら
http://blog.livedoor.jp/pga014563/archives/65725896.html

Script 駅前探険倶楽部;
# 駅探時刻表  Copyright(C) 2004-2007 by nTak
#

駅名リスト[]:-
<dl class="clearfix">\
\*<dt><span>${ST}</span></dt>\
\*<dd>[<a href="${LNK}">\*</a>]</dd>\
-::

include 'comnlib.inc';      // 共通定数とライブラリ
include 'TConv.inc';        // TrainConv用の定義取込み

(*  定数テーブル *)
const
    SiteInfo[6] = (
        '駅前探険倶楽部',   // 本体に通知する変数:サイト名
        0x01,               // 本体に通知する変数:同一の時刻表が曜日別になっていたら結合する
(*!!*)  0x010c,             // Hi:バージョン Lo:リビジョン 自動更新の指定付き
        'Copyright(C) 2004-2007 by nTak',
        'http://www.ekitan.com/',
        'メモ,データの再配布は禁止です'
    );

// スクリプトで使用する定数
    RegName[10] = ("北海道","東 北","関 東","東 海","甲信越","北 陸","関 西","中 国","四 国","九 州");
    RegList[10] = ("3-1","4-1","0-1","2-1","6-1","5-1","1-1","7-1","8-1","9-1");    // URLの地域コード AN=?
#RST  09.03.20 リンクナビゲーションの変更
    SiteURL     = "2,%s,2,http://timetable.ekitan.com/train/TimeLineList/%s.shtml";
    LinkPat[3]  = ('/TimeLineList/[0-9]\-[0-9].shtml','/TimeStationList/[0-9]/[0-9]+\-[0-9].shtml','/TimeStation/[0-9]+\-[0-9]_D[0-9].shtml');

(*------------------------------------------------------------------
  自動更新を行う
  戻値:  TRUE: 更新した
          FALSE: 更新失敗または更新ファイルが無い
------------------------------------------------------------------*)
function TzAutoUpdate:boolean;export;
begin
    Result := DownloadNewScript(DistURL,SiteInfo[2]);   // DistURLは作者のスクリプト配布URL
end;
(*------------------------------------------------------------------
  ノードの定義リストを返す
  戻値:  定義文字列
            リストは次の書式文字列で返す。
            [アイコン番号],[名前],[検索有無フラグ],[URL]
------------------------------------------------------------------*)
function    TzAttachSite(index):string;export;
begin
    case index of
    0: Result :=  FmtStr('2,%s,-1',SiteInfo[0]);
    1..10: Result := FmtStr(SiteURL,RegName[index-1],RegList[index-1]);
    else Result := '';
    end;
end;
(*------------------------------------------------------------------
    URLから読み込んでリンクを登録する
    IN:     index   ノードインデックス
            node    親ノードのID、URLの登録はこのノードに対して実行
            stURL   読込むURL
            cache   キャッシュ有効フラグ
    OUT:    FALSE   路線リンクを登録した
            TRUE    時刻表ページのURLだった
------------------------------------------------------------------*)
function    TzGetPageLinks(index,node,stURL,cache):boolean;export;
begin
    Result := False;
    Get(stURL,cache);
#RST  09.03.20 リンクナビゲーションの変更
    case StrPattern(stURL,LinkPat) of
    1:  begin   // 路線
        foreach lnk in @indexLink[LinkPat[1]] do
            putlog(node,0:@sysdate,1:$$,2:0,3:lnk,4:ICO_GTRAIN);
        end;
    2:  begin   // 駅
#RST ページをGETして解析して登録する必要有り
        foreach n in @clip[駅名リスト] do
            begin
                if ST = '' then Next;
                lnk := 'http://timetable.ekitan.com' + LNK;
                putlog(node,0:@sysdate,1:ST,2:1,3:lnk,4:ICO_STATION);
            end;
        end;
    3:  Result := True; //時刻表ページに到着
    end;
end;
//------------------------------------------------------------------
//  時刻表データの抽出と変換
//  '09.03.20 デザイン変更に伴う変更、本体はv5.3.4以降が必須
//------------------------------------------------------------------
function 時刻表解析(html):string;
begin
    DateStr := WrapStr(html,'<p class="attention">[','現在]</p>',1);  // 更新日付を取りだす
    Strip(DateStr);
    ln := TagWrap('title',html,FALSE);      // タイトル情報から路線名等を抽出
    Split('|',ln,tmp1,tmp2,ln);
    Split(' ',tmp1,StationName,tmp1);
    Split(' ',tmp2,RouteName,DestName,WeekName,tmp2);
    BaseCaption := "%RouteName% %StationName% %DestName%";   // タイトル生成
    MapLink := LINKS('駅周辺の地図',html);      // 地図のURL
    Caption := "件名,%BaseCaption% %DateStr%";
    DestInfo:= "時刻,%RouteName%,%StationName%,%DestName%,%WeekName%\n地図,%MapLink%";

    //RST 時刻表部分だけを抽出する
    PageClip('<!-- \[timetable\] -->','<!-- /\[legend\] -->',html);
    strip(html);                                    // 用が済んだらHTMLタグを除去
    html := Replace(html,' ',' ',TRUE);            // 全角空白を半角へ置換
    Init('',TimeValue,MarkList);                    // 作業変数の初期化
    foreach ln in @Lines[html] do
    begin
        ln := Trim(ln);                             // 前後の空白を取り除く
        if ln = '' then Next;                       // 空行なら次へ
        if IsDigit(CSV(ln,0)) then                  // 数字で始まる行は時刻表と見なす
        begin
            ln := ExtractCSV(ln,ss);                // まずは時刻を取出し
            TimeValue := TimeValue+ss;              // 時刻表に追加しておく
            while CSVCount(ln) > 0 do               // 時刻データがある間
            begin
                n := 0;
                while not IsDigit(CSV(ln,n)) do Inc(n); // 時刻が出てくるまで
                case n of       //RST 2しか存在しないと思われる
                0:  // 時刻データだけ
                    begin Init('',ds,ns);  ln := ExtractCSV(ln,ss); end;
                1:  // 種別と時刻
                    begin Init('',ds);  ln := ExtractCSV(ln,ns,ss); end;
                2:  //RST 種別と行先と時刻
                    ln := ExtractCSV(ln,ns,ds,ss);
                else Init('不明',ds,ns); ss := '00';
                end;

                ns := Replace(ns,':',':',TRUE);    // : は予約文字なので全角の:へ置換
                // 専用関数で処理を簡略&ちょっとだけ高速化
                ss := T5TimeItem(ns,ds,ss);             // <種別><行先><発時刻>へ変換
                MarkList := T5MarkList(ns,ds,MarkList); // 凡例の作成
                TimeValue := TimeValue+' '+ss;          // 時刻表に追加する
            end;
            TimeValue := TimeValue+"\n";
        end;
    end;
    Result := CatStr("\n",Caption,SiteInfo[5],DestInfo,TimeValue+'凡例,'+MarkList)+"\n\n";
end;
(*------------------------------------------------------------------
    時刻表ページのURLから時刻表のテキストを返す
    必要ならリンク先のデータも読み込んで変換する
    IN:     index   ノードインデックス
            pURL    親ノードのURL
            URL     読込むURL
            cache   キャッシュ有効フラグ
    OUT:    TEXT    変換した時刻表テキスト
------------------------------------------------------------------*)
function    TzConvMain(index,pURL,URL,cache):string; export;
    //----------------------------------------------------------------
    // 親ブロックのローカル変数にはアクセスできないのでcache引数が必要
begin
    TagStripSet(':BR:HR:DIV:',0,0);         // HTMLタグ除去で無視するタグ
    TagStripSet(':SPAN:',TX_SPC,TX_NONE);   // 空白に変換
    TagStripSet(':LI:',TX_COMM,TX_NONE);    //RST <LI>はカンマ変換

    Init('',Result,PastURL);                // 初期化
    Get(URL,cache);                         // 時刻表のページを取得、多分平日
    BasePage := $_;                         // リンク抽出用に覚えておく

#RST
#何故かカレントページ同じ方面リンクを返さないので最初だけ平日|土曜|休日を個別に処理
    foreach wlnk in @ReadLink['(平日|土曜|休日)',BasePage,URL] do
    begin
        Get(wlnk,cache);                        // 時刻表のページを取得
        html := $_;
        Result := Result + 時刻表解析(html);    // 所定のフォーマットに変換
    end;

    foreach dlnk in @ReadLink['*方面',BasePage,URL] do  // 方面リンクを読込む
    begin
        Get(dlnk,cache);
        foreach wlnk in @ReadLink['(平日|土曜|休日)'] do
        begin
            Get(wlnk,cache);                        // 時刻表のページを取得
            html := $_;
            Result := Result + 時刻表解析(html);    // 所定のフォーマットに変換
        end;
    end;
end;
//------------------------------------------------------------------
// スクリプトデバッグ用のメイン
// 山手線・渋谷駅
//------------------------------------------------------------------


begin
//        TzAutoUpdate;

    Get('http://timetable.ekitan.com/train/TimeStation/164-4_D1.shtml',cache);                         // 時刻表のページを取得、多分平日

    foreach dlnk in @ReadLink['*方面'] do  // 方面リンクを読込む
    begin
Message(dlnk);
    end;

end.



Posted by RST at 2009年03月26日 16:01│Comments(0)
  コメントは、管理者による確認後ブログに反映されます。(半角400文字まで)