2016-11-07 5 views
0

У меня есть две переменных, скажем $a с именем списка & $b с возрастом, как генерировать веб-страницу HTML с форматом табличного именем & возраста?Как создать таблицу HTML с TCL

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

Без помощи пакетов ...

ответ

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

+0

Спасибо за столь необходимой обратной связи, я думаю, что у меня нет v8.6, поэтому появляется сообщение об ошибке, как недопустимое имя команды «Lmap» – CLEX420

+0

@ CLEX420: если у вас есть 8.5, вы можете использовать замену код для lmap, связанный в приведенном выше списке документации. Если нет, foreach и lappend в комбинации выполняют ту же работу. –

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> 

% 
+0

Обратите внимание, что клавиши идут в левый столбец вместо верхней строки. –

+0

@PeterLewerin: Спасибо! – Sharad