我有两个变量,让我们说$a
列表名称& $b
随着年龄的增长,如何生成一个表格格式为&的HTML网页年龄?
puts $outfile "Name:$a Age:$b"
set outfile [open "result_cell_pin.html" w+]
没有包裹的帮助......
答案 0 :(得分:0)
这是一个快速而肮脏的变体:
set data [list Name $a Age $b]
puts $outfile "<html>\n<body>\n<table>\n<tr>\n
[join [lmap {h _} $data {format <th>%s</th>\n $h}] {}]
</tr><tr>
[join [lmap {_ d} $data {format <td>%s</td>\n $d}] {}]
</tr>\n</table>\n</body>\n</html>"
然而,这种解决方案无法扩展。编写html代码的脚本编写得更好一点,以便更容易使其成为常规代码:
set a Reynard
set b 12
set data [list Name $a Age $b]
set level 0
set html {}
proc indent n {
string repeat { } $n
}
proc structuralElement {name body} {
append ::html [indent $::level]<$name>\n
incr ::level
uplevel 1 $body
incr ::level -1
append ::html [indent $::level]</$name>\n
}
proc valueElement {name value} {
append ::html [indent $::level]<$name>$value</$name>\n
}
structuralElement html {
structuralElement body {
structuralElement table {
structuralElement tr {
foreach {h _} $data {valueElement th $h}
}
structuralElement tr {
foreach {_ d} $data {valueElement td $d}
}
}
}
}
set outfile [open "result_cell_pin.html" w+]
puts $outfile $html
close $outfile
但没有必要重新发明轮子。最简单的方法是使用tDOM。它看起来很乱,但是当人们习惯它时非常流畅:
package require tdom
set doc [dom createDocument html]
set root [$doc documentElement]
dom createNodeCmd elementNode body
dom createNodeCmd elementNode table
dom createNodeCmd elementNode tr
dom createNodeCmd elementNode th
dom createNodeCmd elementNode td
dom createNodeCmd textNode t
set a Reynard
set b 12
set data [list Name $a Age $b]
$root appendFromScript {
body {
table {
tr {
dict for {h _} $data {th {t $h}}
}
tr {
dict for {_ d} $data {td {t $d}}
}
}
}
}
set outfile [open "result_cell_pin.html" w+]
puts $outfile [$doc asXML]
close $outfile
$doc delete
为什么要编写脚本呢?有许多原因,例如更容易正确,更容易维护。一个主要优点是,当规范发生变化时,更容易调整脚本。假设您现在在a
和b
中有多个值,您需要在表格中的多行上显示这些值。重写第一个代码示例是一个麻烦,但重写tdom脚本是轻而易举的:
set a {Reynard Antimony Jones}
set b {12 16 3.7e09}
set data [list Name $a Age $b]
$root appendFromScript {
body {
table {
tr {
dict for {h _} $data {th {t $h}}
}
foreach d1 $a d2 $b {
tr {
td {t $d1}
td {t $d2}
}
}
}
}
}
不要害怕包裹。 Tcl是一种小内核语言,其中许多其他语言内置的功能都存储在包中。在语言X中使用高级文件处理函数和加载fileutil
包以在Tcl中使用相同的命令之间没有真正的区别。
文档: append, close, dict, foreach, format, incr, join, list, lmap (for Tcl 8.5), lmap, open, package, proc, puts, set, string, tdom (package), uplevel
答案 1 :(得分:0)
我建议尝试一下'html'包。 http://wiki.tcl.tk/38727
% package require html
1.3
% foreach supportedMethod [info procs ::html::*] {
> puts $supportedMethod
>}
::html::tableFromList
::html::keywords
::html::passwordInput
::html::radioValue
::html::quoteFormValue
::html::eval
::html::selectPlain
::html::textarea
::html::meta
::html::getTitle
::html::closeTag
::html::tagParam
::html::openTag
::html::if
::html::cell
::html::html_entities
::html::h1
::html::title
::html::checkSet
::html::h2
::html::passwordInputRow
::html::radioSet
::html::h3
::html::h4
::html::h5
::html::h6
::html::for
::html::select
::html::varEmpty
::html::formValue
::html::minorMenu
::html::bodyTag
::html::set
::html::description
::html::textInput
::html::mailto
::html::font
::html::h
::html::while
::html::head
::html::extractParam
::html::textInputRow
::html::refresh
::html::nl2br
::html::foreach
::html::getFormInfo
::html::row
::html::tableFromArray
::html::author
::html::checkValue
::html::init
::html::submit
::html::default
::html::checkbox
::html::end
::html::minorList
::html::paramRow
::html::urlParent
::html::headTag
::html::hdrRow
% ::html::tableFromList [list a1 a2 a3 a4 a5]
<TABLE ><tr>
<td>a1</td>
<td>a2</td>
</tr>
<tr>
<td>a3</td>
<td>a4</td>
</tr>
<tr>
<td>a5</td>
<td></td>
</tr>
</TABLE>
% array set x [list a1 b1 a2 b2 a3 b3]
% ::html::tableFromArray x
<TABLE >
<TR><TH colspan=2>x</TH></TR>
<tr>
<td>a1</td>
<td>b1</td>
</tr>
<tr>
<td>a2</td>
<td>b2</td>
</tr>
<tr>
<td>a3</td>
<td>b3</td>
</tr>
</TABLE>
%