Get Internet TV Guide Japan page - tvguide2.tcl
package require http

global region
# あなたの地域を設定してください。
set region hirosima
###################
global browser
# あなたのWWWブラウザを設定してください。
set browser "D:\\Program Files\\Internet Explorer\\IEXPLORE.EXE"
################################################################
proc ShowChoices { parent varname choices procedure args } {
    set f [frame $parent.$choices -borderwidth 5]
    set b 0
    foreach item $args {
        radiobutton $f.$b -variable $varname \
            -text $item -value $item \
            -command $procedure
        pack $f.$b -side left
        incr b
    }
    pack $f -side top
}
global url word
set url ""
set word ""
wm title . "Get! TVGuide2"
global day whatday
ShowChoices {} day choices0 SetWhatday \
昨日 今日 明日 明後日 明々後日 4日後 5日後
global time
ShowChoices {} time choices1 SetDate 4時 7時 10時 13時 16時 19時 21時 23時 1時
global mode
ShowChoices {} mode choices2 SetUrl 見る Gコード 検索
label .choices2.l -text "Words:" -padx 0
entry .choices2.e -width 20 -relief sunken \
    -textvariable word
pack .choices2.l -side left
pack .choices2.e -side left
frame .entry
label .entry.l -text "URL:" -padx 0
entry .entry.e -width 20 -relief sunken \
    -textvariable url
pack .entry.l -side left
pack .entry.e -side left -fill x -expand true
pack .entry -side top -fill both -expand true
frame .t
set log [text .t.log -width 80 -height 10 \
    -borderwidth 2 -relief raised -setgrid true \
    -yscrollcommand {.t.scroll set}]
scrollbar .t.scroll -command {.t.log yview}
pack .t.scroll -side right -fill y
pack .t.log -side left -fill both -expand true
pack .t -side top -fill both -expand true
.t.log config -cursor hand2
frame .guide
label .guide.l
pack .guide.l
pack .guide -side top -fill both -expand true
.guide.l config -text "\[日付の設定\] まず調べたい日のラジオボタンをクリックしてください。"
proc SetUrl {} {
    global region browser mode date url
    set url "http://www.tvguide.or.jp/$region/"
    if { $mode == "見る" } {
        append url "table/" $date "tb.htm"
        catch {exec $browser $url &}
    } elseif { $mode == "Gコード" } {
        append url "tableg/" $date "tb.htm"
        GetGcode
    } elseif { $mode == "検索" } {
        append url "table/" $date "tb.htm"
        GetTarget
    }
}
proc GetGcode {} {
    global url log
    set token [::http::geturl $url]
    $log delete 1.0 end
    upvar #0 $token state
    foreach line [split $state(body) \n] {
        regsub -all {<img src=/gif/n\.gif[^>]+>} $line { ニュース} line
        regsub -all {<img src=/gif/w\.gif[^>]+>} $line { 天気予報} line
        regsub -all {<\[^>\]+>} $line {} line
        if {[regexp {.+\([0-9]+\)} $line str]} {
            $log insert end $str\n
            $log see end
        }
    }
    .guide.l config -text ""
}
proc SetDate {} {
    global time date whatday
    set date [clock format [clock scan $whatday] -format "%m%d"]
    regexp {([0-9]+)時} $time match timenum
    set strlen [string length $timenum]
    if {$strlen == 1} {
        append date 0 $timenum
    } else {
        append date $timenum
    }
    .guide.l config -text "何をするか決めてください。"
}
proc SetWhatday {} {
    global day whatday
    if { $day == "昨日" } {
        set whatday yesterday
    } elseif { $day == "今日" } {
        set whatday today
    } elseif { $day == "明日" } {
        set whatday tomorrow
    } elseif { $day == "明後日" } {
        set whatday "today 2 day"
    } elseif { $day == "明々後日" } {
        set whatday "today 3 day"
    } elseif { $day == "4日後" } {
        set whatday "today 4 day"
    } elseif { $day == "5日後" } {
        set whatday "today 5 day"
    }
    .guide.l config -text "\[時間帯の設定\] 調べたい時間に近い時刻のラジオボタンをクリックしてください。"
}
proc GetTarget {} {
    global url log word
    if { $word == "" } {
        .guide.l config -text "\[検索\] Words:に検索用の言葉を入力して、検索用ラジオボタンをクリックしてください。"
    } else {
        set token [::http::geturl $url]
        $log delete 1.0 end
        upvar #0 $token state
        foreach line [split $state(body) \n] {
            regsub -all {<img src=/gif/n\.gif[^>]+>} $line " ニュース" line
            regsub -all {<img src=/gif/w\.gif[^>]+>} $line " 天気予報" line
            regsub -all {<A HREF=/bin/go\.to\?(http://[^>]+)>} $line {  \1  } line
            regsub -all {<[^>]+>} $line {} line
            regsub -all {←.+} $line {} line
            if {[regexp $word $line str]} {
                $log insert end $line\n
                $log see end
            }
        }
        hyperLink
        .guide.l config -text ""
    }
}
# テキストウィジェット上のテキスト処理とのバインディング
proc hyperLink {} {
    forAllMatches .t.log {http://[^ ]+} {
        .t.log tag add URL first last
    }
    .t.log tag configure URL -background Bisque3
    .t.log tag bind URL <Enter> {
        .t.log tag configure URL -background Seagreen2
    }
    .t.log tag bind URL <Leave> {
        .t.log tag configure URL -background Bisque3
    }
    .t.log tag bind URL <Double-Button-1> {
        set pc [%W index current]
        foreach p2 [%W tag ranges URL] {
            if [%W compare $pc < $p2] break
            set p1 $p2
        }
        exec $browser [%W get $p1 $p2] &
    }
}
# タグ付け用サブルーチン(John K. Ousterhout著、Tcl&Tkツールキット、ソフトバンク(1995)、 234ページより引用)
proc forAllMatches {w pattern script} {
    scan [$w index end] %d numLines
    for {set i 1} {$i < $numLines} {incr i} {
        $w mark set last $i.0
        while {[regexp -indices $pattern \
                [$w get last "last lineend"] indices]} {
            $w mark set first "last + [lindex $indices 0] chars"
            $w mark set last "last + 1 chars + [lindex $indices 1] chars"
            uplevel $script
        }
    }
}


TS Network ☆ミ >> (C)jscripter