can't read "tcl_interactive": no such variable
while executing
"if {!$tcl_interactive} {
if {[string length [package provide Tk]] > 0} {
wm withdraw .
if {$argc < 1} {
toplevel .dlg ..."
(in namespace eval "::request" script line 136)
invoked from within
"namespace eval ::request $script"
("::try" body line 12)
OUTPUT BUFFER:
#!/usr/bin/env tclsh
## -*- tcl -*-
# webviewer.tcl - Copyright (C) 2004 Pat Thoyts
#
# This is a sample application to demonstrate the use of the htmlparse package.
#
# Given the URL of a web page, this application will display just the text of
# the page - that is the contents of header, paragraph and pre tags.
#
# As an aside, this also illustrates the use of the autoproxy package to
# cope with http proxy servers (if present) and handles HTTP redirections and
# so on.
#
# Usage: webviewer.tcl http://tip.tcl.tk/2
#
# $Id: webviewer.tcl,v 1.2 2009/01/30 04:18:14 andreas_kupries Exp $
package require htmlparse; # tcllib
package require http; # tcl
package require autoproxy; # tcllib
autoproxy::init
# -------------------------------------------------------------------------
# The driver.
# - Fetch the page
# - parse it to extract the text
# - sort out the html escaped chars
# - eliminate excessive newlines
#
proc webview {url} {
set html [fetchurl $url]
if {[string length $html] > 0} {
variable parsed ""
htmlparse::parse -cmd [list parser [namespace current]::parsed] $html
set parsed [htmlparse::mapEscapes $parsed]
set parsed [regsub -all -line "\n{2,}" $parsed "\n\n"]
Display $parsed
} else {
Error "error: no data available from \"$url\""
}
}
# -------------------------------------------------------------------------
# This implements our text extracting parser. This will pretty much turn
# an HTML page into an outline-mode text file.
#
proc parser {outvar tag end attr text} {
upvar \#0 $outvar out
set tag [string tolower $tag]
set end [string length $end]
if {$end == 0} {
if {[string equal "hmstart" $tag]} {
set out ""
} elseif {[regexp {h(\d+)} $tag -> level]} {
append out "\n\n" [string repeat * $level] " " $text
} elseif {[lsearch -exact {p pre td} $tag] != -1} {
append out "\n" $text
} elseif {[lsearch -exact {a span i b} $tag] != -1} {
append out $text
}
}
}
# -------------------------------------------------------------------------
# Fetch the target page and cope with HTTP problems. This
# deals with server errors and proxy authentication failure
# and handles HTTP redirection.
#
proc fetchurl {url} {
set html ""
set err ""
set tok [http::geturl $url -timeout 30000]
if {[string equal [http::status $tok] "ok"]} {
if {[http::ncode $tok] >= 500} {
set err "server error: [http::code $tok]"
} elseif {[http::ncode $tok] >= 400} {
set err "authentication error: [http::code $tok]"
} elseif {[http::ncode $tok] >= 300} {
upvar \#0 $tok state
array set meta $state(meta)
if {[info exists meta(Location)]} {
return [fetchurl $meta(Location)]
} else {
set err [http::code $tok]
}
} else {
set html [http::data $tok]
}
} else {
set err [http::error $tok]
}
http::cleanup $tok
if {[string length $err] > 0} {
Error $err
}
return $html
}
# -------------------------------------------------------------------------
# Abstract out the display functions so we can run this using either wish or
# tclsh. This makes life easier on windows where the default is to use wish
# for tcl files.
#
proc Display {msg} {
if {[string length [package provide Tk]] > 0} {
toplevel .dlg -class Dialog
wm title .dlg "webview output."
text .dlg.txt -yscrollcommand {.dlg.sb set}
scrollbar .dlg.sb -command {.dlg.txt yview}
button .dlg.b -command {destroy .dlg} -text Exit -underline 1
.dlg.txt insert 0.0 $msg
bind .dlg {console show}
bind .dlg {.dlg.b invoke}
grid .dlg.txt .dlg.sb -sticky news
grid .dlg.b - -sticky e -pady {3 0} -ipadx 4
grid rowconfigure .dlg 0 -weight 1
grid columnconfigure .dlg 0 -weight 1
tkwait window .dlg
} else {
puts $msg
}
}
proc Error {msg} {
if {[string length [package provide Tk]] > 0} {
tk_messageBox -title "webviewer error" -icon error -message $msg
} else {
puts stderr $msg
}
exit 1
}
# -------------------------------------------------------------------------
if {!$tcl_interactive} {
if {[string length [package provide Tk]] > 0} {
wm withdraw .
if {$argc < 1} {
toplevel .dlg -class Dialog
wm title .dlg "Enter URL"
label .dlg.l -text "Enter a URL"
entry .dlg.e -textvariable argv -width 40
button .dlg.ok -text OK -default active -command {destroy .dlg}
button .dlg.ca -text Cancel -command {set ::argv ""; destroy .dlg}
bind .dlg {.dlg.ok invoke}
bind .dlg {.dlg.ca invoke}
bind .dlg {console show}
grid .dlg.l - -sticky nws
grid .dlg.e - -sticky news
grid .dlg.ok .dlg.ca -sticky news
tkwait window .dlg
if {[llength $argv] < 1} {
exit 1
}
}
} else {
if {$argc != 1} {
Error "usage: webviewer URL"
}
}
eval [linsert $argv 0 webview]
}