diff options
Diffstat (limited to 'viewhtml')
-rwxr-xr-x | viewhtml | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/viewhtml b/viewhtml new file mode 100755 index 0000000..f853dc3 --- /dev/null +++ b/viewhtml @@ -0,0 +1,98 @@ +#!/usr/bin/env tclsh +package require tclgumbo +package require Tk + + +text .t -yscrollcommand {.s set} -relief flat -font {Times 12} -wrap word -border 4 +scrollbar .s -command {.t yview} +pack .s -side right -fill y +pack .t -side left -fill both -expand 1 + +set w .t + +$w tag config title -elide true +$w tag config href -elide true +$w tag config a -foreground blue -underline 1 +$w tag config strong -font {Times 12 bold} +$w tag config b -font {Times 12 bold} +$w tag config i -font {Times 12 italic} +$w tag config em -font {Times 12 italic} +$w tag config pre -font {Courier 12} +$w tag config code -font {Courier 12} +$w tag config h1 -font {Times 18} +$w tag config h2 -font {Times 18} +$w tag config ul -lmargin1 40 -lmargin2 40 +$w tag config dd -lmargin1 40 -lmargin2 40 +$w tag config p +$w tag bind a <Enter> "$w config -cursor hand2" +$w tag bind a <Leave> "$w config -cursor {}" +$w tag bind a <ButtonRelease-1> "click $w %x %y" + +# TODO: +set baseAddress [lindex $argv 1] +set file [open [lindex $argv 0]] +set html [read $file] +close $file +set output [gumbo::parse $html] + +proc click {w x y} { + global baseAddress + set range [$w tag prevrange href [$w index @$x,$y]] + set address [eval $w get $range] + + # TODO: + if {0 == [regexp {^https?.*} $address]} { + exec "./html.tcl" "$baseAddress/$address" $baseAddress + exit + } else { + exec "./html.tcl" $address $address + exit + } +} + +proc displayNode {node tagList} { + # TODO: Avoid using global variables. + global w + global baseAddress + + set type [gumbo::node_get_type $node] + if {$type == $gumbo::GUMBO_NODE_ELEMENT} { + set tag [gumbo::element_get_tag_name $node] + set attributes [gumbo::element_get_attributes $node] + + # TODO: + if {$tag == "a"} { + $w insert end [lindex [array get $attributes] 1] [concat $tagList href] + } elseif {$tag == "img"} { + $w insert end "\n" + set lattr [array get $attributes] + set path "$baseAddress/[lindex $lattr [expr [lsearch -exact $lattr src] + 1]]" + image create photo $path -file $path + $w image create end -image $path + $w insert end "\n" + } + + foreach child_node [gumbo::element_get_children $node] { + displayNode $child_node [concat $tag $tagList] + } + + # TODO: + if {$tag == "h1" || $tag == "h2" || $tag == "p"} { + $w insert end "\n\n" {} + } elseif {$tag == "pre" || $tag == "li" || $tag == "dt" || $tag == "ul" || $tag == "dd" || $tag == "dl"} { + $w insert end "\n" {} + } + } elseif {$type == $gumbo::GUMBO_NODE_TEXT} { + # TODO: + if {0 <= [lsearch $tagList pre]} { + $w insert end [gumbo::text_get_text $node] $tagList + } else { + $w insert end [regsub -all {\s+} [gumbo::text_get_text $node] " "] $tagList + } + } +} + +displayNode [gumbo::output_get_root $output] [list] +$w config -state disabled +gumbo::destroy_output $output + |