如何使用TCL创建HTML表

时间:2016-11-07 12:04:34

标签: tcl

我有两个变量,让我们说$a列表名称& $b随着年龄的增长,如何生成一个表格格式为&的HTML网页年龄?

     puts $outfile "Name:$a Age:$b"
     set outfile [open "result_cell_pin.html" w+]

没有包裹的帮助......

2 个答案:

答案 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

为什么要编写脚本呢?有许多原因,例如更容易正确,更容易维护。一个主要优点是,当规范发生变化时,更容易调整脚本。假设您现在在ab中有多个值,您需要在表格中的多行上显示这些值。重写第一个代码示例是一个麻烦,但重写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中使用相同的命令之间没有真正的区别。

文档: appendclosedictforeachformatincrjoinlistlmap (for Tcl 8.5)lmapopenpackageprocputssetstringtdom (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>

%