65
|
|
|
|
|
|
|
atr_table - attribute parameters for
66
|
|
|
|
|
|
|
css_tr - CSS class name for |
67
|
|
|
|
|
|
|
atr_tr - attribute parameters for |
68
|
|
|
|
|
|
|
atr_tr_odd - attribute parameters for ODD |
69
|
|
|
|
|
|
|
atr_tr_even - attribute parameters for EVEN |
70
|
|
|
|
|
|
|
css_tr_odd - CSS class name for ODD |
71
|
|
|
|
|
|
|
css_tr_even - CSS class name for EVEN |
72
|
|
|
|
|
|
|
css_select - CSS class name for |
73
|
|
|
|
|
|
|
css_input - CSS class name for |
74
|
|
|
|
|
|
|
atr_sel - attributes for itemized |
75
|
|
|
|
|
|
|
atr_sel = { |
76
|
|
|
|
|
|
|
var1 => 'style="display:none"', |
77
|
|
|
|
|
|
|
var2 => 'style="display:block"', |
78
|
|
|
|
|
|
|
var3 => 'class="FormSel"', |
79
|
|
|
|
|
|
|
} |
80
|
|
|
|
|
|
|
atr_inp - attributes for itemized |
81
|
|
|
|
|
|
|
css_td - CSS class name for | |
82
|
|
|
|
|
|
|
atr_td - attribute parameters for | |
83
|
|
|
|
|
|
|
atr_cell - an array ref to attribute parameters for each cell |
84
|
|
|
|
|
|
|
${$br}{atr_cell}[$i][$j] |
85
|
|
|
|
|
|
|
esc_vars - a list of escaped variables separated by comma. |
86
|
|
|
|
|
|
|
fh_out - output file handler |
87
|
|
|
|
|
|
|
cns_desc - hash ref containing column name description |
88
|
|
|
|
|
|
|
tab_caption - table caption/header |
89
|
|
|
|
|
|
|
tab_footer - table footer/notes |
90
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
Variables used or methods called: |
92
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
CGI::AppBuilder::Message |
94
|
|
|
|
|
|
|
set_param - get parameter from a hash |
95
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
How to use: |
97
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
my @a = (['ColA','ColB'],[1,2],[5,6],[7,8]); |
100
|
|
|
|
|
|
|
my $txt = $self->html_table(\@a); |
101
|
|
|
|
|
|
|
my @b = ({A=>1,B=>2},{A=>5,B=>6},{A=>7,B=>8}); |
102
|
|
|
|
|
|
|
my $txt = $self->html_table(\@b,"",'A,B'); |
103
|
|
|
|
|
|
|
my $txt = $self->html_table(\@b,"",'A,B'); |
104
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
Return: generates HTML Table codes. |
106
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
This method convert all the < and > into < and > for displaying, |
108
|
|
|
|
|
|
|
except variables are specified in I. |
109
|
|
|
|
|
|
|
|
110
|
|
|
|
|
|
|
=cut |
111
|
|
|
|
|
|
|
|
112
|
|
|
|
|
|
|
sub html_table { |
113
|
|
|
|
|
|
|
my $s = shift; |
114
|
|
|
|
|
|
|
my($ar,$cns,$br) = @_; |
115
|
|
|
|
|
|
|
return "No Input for html_table!\n" if !$ar; |
116
|
|
|
|
|
|
|
return "Not a Array for html_table\n" if $ar !~ /ARRAY/; |
117
|
|
|
|
|
|
|
my ($cn_lst, $cr) = ("",[]); |
118
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
if (${$ar}[0] =~ /HASH/) { |
120
|
|
|
|
|
|
|
if (!$cns || $cns =~ /^(auto|hash|AH)$/i) { |
121
|
|
|
|
|
|
|
map { $cn_lst .= "$_," } (keys %{$ar->[0]}); |
122
|
|
|
|
|
|
|
$cn_lst =~ s/,$//; $cn_lst = lc $cn_lst; |
123
|
|
|
|
|
|
|
} else { $cn_lst = $cns; } |
124
|
|
|
|
|
|
|
$cn_lst =~ s/\s+//g; |
125
|
|
|
|
|
|
|
$cr = $ar; |
126
|
|
|
|
|
|
|
} else { # it is an array |
127
|
|
|
|
|
|
|
if (!$cns || $cns =~ /^(auto|hash|AH)$/i) { |
128
|
|
|
|
|
|
|
map { $cn_lst .= "$ar->[0][$_]," } 0..$#{$ar->[0]}; |
129
|
|
|
|
|
|
|
$cn_lst =~ s/,$//; $cn_lst = lc $cn_lst; |
130
|
|
|
|
|
|
|
} else { $cn_lst = $cns; } |
131
|
|
|
|
|
|
|
$cn_lst =~ s/\s+//g; |
132
|
|
|
|
|
|
|
my @a = split /,/, $cn_lst; |
133
|
|
|
|
|
|
|
shift @$ar; # remove the first row |
134
|
|
|
|
|
|
|
$cr = [map{my %tmp;@tmp{@a}=@$_;\%tmp}@$ar]; |
135
|
|
|
|
|
|
|
} |
136
|
|
|
|
|
|
|
return "No column names are provided or defined.\n" |
137
|
|
|
|
|
|
|
if !$cn_lst; |
138
|
|
|
|
|
|
|
my $css_table = $s->set_param('css_table', $br); |
139
|
|
|
|
|
|
|
my $atr_table = $s->set_param('atr_table', $br); |
140
|
|
|
|
|
|
|
my $css_tr = $s->set_param('css_tr', $br); |
141
|
|
|
|
|
|
|
my $atr_tr = $s->set_param('atr_tr', $br); |
142
|
|
|
|
|
|
|
my $atr_tr_od = $s->set_param('atr_tr_odd', $br); |
143
|
|
|
|
|
|
|
my $atr_tr_ev = $s->set_param('atr_tr_even', $br); |
144
|
|
|
|
|
|
|
my $css_tr_od = $s->set_param('css_tr_odd', $br); |
145
|
|
|
|
|
|
|
my $css_tr_ev = $s->set_param('css_tr_even', $br); |
146
|
|
|
|
|
|
|
my $ar_sel = eval $s->set_param('atr_sel', $br); |
147
|
|
|
|
|
|
|
my $ar_inp = eval $s->set_param('atr_inp', $br); |
148
|
|
|
|
|
|
|
my $css_select= $s->set_param('css_select', $br); |
149
|
|
|
|
|
|
|
my $css_input = $s->set_param('css_input', $br); |
150
|
|
|
|
|
|
|
my $css_td = $s->set_param('css_td', $br); |
151
|
|
|
|
|
|
|
my $atr_td = $s->set_param('atr_td', $br); |
152
|
|
|
|
|
|
|
my $atr_cell = $s->set_param('atr_cell', $br); |
153
|
|
|
|
|
|
|
$atr_cell = eval $atr_cell if $atr_cell; |
154
|
|
|
|
|
|
|
$atr_cell = [] if ! $atr_cell; |
155
|
|
|
|
|
|
|
my $pretty = $s->set_param('tab_pretty', $br); |
156
|
|
|
|
|
|
|
my $cap = $s->set_param('tab_caption', $br); |
157
|
|
|
|
|
|
|
my $ftr = $s->set_param('tab_footer', $br); |
158
|
|
|
|
|
|
|
my $esc_vars = $s->set_param('esc_vars', $br); |
159
|
|
|
|
|
|
|
my $esc = ($esc_vars) ? { |
160
|
|
|
|
|
|
|
map { $_ => 1 } (split /,/,$esc_vars) |
161
|
|
|
|
|
|
|
} : {}; |
162
|
|
|
|
|
|
|
# my $tr = $s->html_tag('TR', |
163
|
|
|
|
|
|
|
# {class=>$css_tr,attr=>$atr_tr,pretty=>$pretty}); |
164
|
|
|
|
|
|
|
my $t = $s->html_tag('TABLE', |
165
|
|
|
|
|
|
|
{class=>$css_table,attr=>$atr_table,pretty=>$pretty}); |
166
|
|
|
|
|
|
|
$t .= $s->html_tag('CAPTION',{},$cap,1) if $cap; |
167
|
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
my ($i,$j,$k,$v); |
169
|
|
|
|
|
|
|
# add column names |
170
|
|
|
|
|
|
|
my $dsc = (exists $br->{cns_desc}) ? $br->{cns_desc} : {}; |
171
|
|
|
|
|
|
|
# map { $_ => {name=>ucfirst $_, desc=>ucfirst $_} } |
172
|
|
|
|
|
|
|
# (split /,/, $cn_lst) |
173
|
|
|
|
|
|
|
# add column header |
174
|
|
|
|
|
|
|
$t .= $s->table_column($cn_lst,$br,$dsc); |
175
|
|
|
|
|
|
|
# add data rows |
176
|
|
|
|
|
|
|
my $p = {class=>$css_td,attr=>$atr_td,pretty=>$pretty,hr=>{}}; |
177
|
|
|
|
|
|
|
my $p_tr = {pretty=>$pretty,hr=>{}}; |
178
|
|
|
|
|
|
|
for $i (0 .. $#{$cr}) { |
179
|
|
|
|
|
|
|
if ($i%2) { # odd |
180
|
|
|
|
|
|
|
$p_tr->{class} = ($css_tr_od) ? $css_tr_od : $css_tr; |
181
|
|
|
|
|
|
|
$p_tr->{attr} = ($atr_tr_od) ? $atr_tr_od : $atr_tr; |
182
|
|
|
|
|
|
|
} else { # even |
183
|
|
|
|
|
|
|
$p_tr->{class} = ($css_tr_ev) ? $css_tr_ev : $css_tr; |
184
|
|
|
|
|
|
|
$p_tr->{attr} = ($atr_tr_ev) ? $atr_tr_ev : $atr_tr; |
185
|
|
|
|
|
|
|
} |
186
|
|
|
|
|
|
|
$t .= $s->html_tag('TR',$p_tr); |
187
|
|
|
|
|
|
|
$j = -1; |
188
|
|
|
|
|
|
|
foreach my $k (split /,/,$cn_lst) { |
189
|
|
|
|
|
|
|
++$j; |
190
|
|
|
|
|
|
|
$v = $cr->[$i]{$k}; |
191
|
|
|
|
|
|
|
if ($v && $v =~ /type=["']?input["']?/si) { |
192
|
|
|
|
|
|
|
$v =~ s/\<\s*input/\
|
193
|
|
|
|
|
|
|
if $css_input; |
194
|
|
|
|
|
|
|
$v =~ s/\<\s*input/\{$k} /i |
195
|
|
|
|
|
|
|
if exists $ar_inp->{$k}; |
196
|
|
|
|
|
|
|
} |
197
|
|
|
|
|
|
|
if ($v && $v =~ /\<\s*select/si) { |
198
|
|
|
|
|
|
|
$v =~ s/\<\s*select/\ |
199
|
|
|
|
|
|
|
if $css_select; |
200
|
|
|
|
|
|
|
$v =~ s/\<\s*select/\ |
201
|
|
|
|
|
|
|
if exists $ar_sel->{$k}; |
202
|
|
|
|
|
|
|
} |
203
|
|
|
|
|
|
|
if (! exists $esc->{$k}) { |
204
|
|
|
|
|
|
|
$v =~ s/\</g if $v; |
205
|
|
|
|
|
|
|
$v =~ s/>/\>/g if $v; |
206
|
|
|
|
|
|
|
} |
207
|
|
|
|
|
|
|
$v = "" if ! defined($v) || $v =~ /^\s*$/; |
208
|
|
|
|
|
|
|
$p->{attr} = ($atr_cell->[$i][$j]) ? |
209
|
|
|
|
|
|
|
"$atr_td $atr_cell->[$i][$j]" : $atr_td; |
210
|
|
|
|
|
|
|
$t .= $s->html_tag('TD',$p,"$v",1); |
211
|
|
|
|
|
|
|
} |
212
|
|
|
|
|
|
|
$t .= " | \n";
213
|
|
|
|
|
|
|
} |
214
|
|
|
|
|
|
|
$t .= " | \n"; |
215
|
|
|
|
|
|
|
if ($ftr) { |
216
|
|
|
|
|
|
|
$t .= $s->html_tag('CENTER',{},$s->html_tag('P',{},$ftr,1),1); |
217
|
|
|
|
|
|
|
} |
218
|
|
|
|
|
|
|
my $fh = ($br && exists $br->{fh_out})?$br->{fh_out}:""; |
219
|
|
|
|
|
|
|
if ($fh) { print $fh $t; } else { return $t; } |
220
|
|
|
|
|
|
|
} |
221
|
|
|
|
|
|
|
|
222
|
|
|
|
|
|
|
=head2 html_tag ($tag, $pr, $txt, $is_end) |
223
|
|
|
|
|
|
|
|
224
|
|
|
|
|
|
|
Input variables: |
225
|
|
|
|
|
|
|
|
226
|
|
|
|
|
|
|
$tag - HTML tag such as TR, TD, TABLE, SELECT, INPUT, etc. |
227
|
|
|
|
|
|
|
$pr - tag attribute array ref. It contains three elements: |
228
|
|
|
|
|
|
|
class - CSS class name |
229
|
|
|
|
|
|
|
attr - attribute string such as 'width=5 onChange=js_func' |
230
|
|
|
|
|
|
|
hr - hash ref with key and value pairs |
231
|
|
|
|
|
|
|
pretty - whether to add line breaks |
232
|
|
|
|
|
|
|
$txt - text to be incuded between the start and end tag such as |
233
|
|
|
|
|
|
|
| $txt |
234
|
|
|
|
|
|
|
$is_end - whether to add an ending tag such as |
235
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
Variables used or methods called: |
237
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
None |
239
|
|
|
|
|
|
|
|
240
|
|
|
|
|
|
|
How to use: |
241
|
|
|
|
|
|
|
|
242
|
|
|
|
|
|
|
my $t1 = $self->html_tag('TD',{class=>'css_td'},'Text',1); |
243
|
|
|
|
|
|
|
# $t1 contains: |
244
|
|
|
|
|
|
|
# | Text |
245
|
|
|
|
|
|
|
my $t2 = $self->html_tag('TD',{class=>'td1',pretty=>1},'Text2',1); |
246
|
|
|
|
|
|
|
# $t2 contains: |
247
|
|
|
|
|
|
|
# | |
248
|
|
|
|
|
|
|
# Text2 |
249
|
|
|
|
|
|
|
# |
250
|
|
|
|
|
|
|
my $t3 = $self->html_tag('TD',{class=>'td1',pretty=>1, |
251
|
|
|
|
|
|
|
attr=>'colspan=2 align=left',hr=>{onChange=>'js_func'}}, |
252
|
|
|
|
|
|
|
'Text2',1); |
253
|
|
|
|
|
|
|
# $t3 contains: |
254
|
|
|
|
|
|
|
# | |
255
|
|
|
|
|
|
|
# Text2 |
256
|
|
|
|
|
|
|
# |
257
|
|
|
|
|
|
|
|
258
|
|
|
|
|
|
|
Return: HTML codes. |
259
|
|
|
|
|
|
|
|
260
|
|
|
|
|
|
|
This method generates HTML codes based on the information provided. |
261
|
|
|
|
|
|
|
|
262
|
|
|
|
|
|
|
=cut |
263
|
|
|
|
|
|
|
|
264
|
|
|
|
|
|
|
sub html_tag { |
265
|
|
|
|
|
|
|
my $s = shift; |
266
|
|
|
|
|
|
|
my ($tag, $pr, $txt, $is_end) = @_; |
267
|
|
|
|
|
|
|
$tag = uc $tag; |
268
|
|
|
|
|
|
|
my $tg = lc $tag; |
269
|
|
|
|
|
|
|
my $idt = {tr=>2,td=>4,li=>2,th=>4}; |
270
|
|
|
|
|
|
|
my $t = (exists $idt->{$tg}) ? ' 'x$idt->{$tg} : ""; |
271
|
|
|
|
|
|
|
$t .= "<$tag"; |
272
|
|
|
|
|
|
|
$t .= " class=$pr->{class}" |
273
|
|
|
|
|
|
|
if $pr && exists $pr->{class} && $pr->{class}; |
274
|
|
|
|
|
|
|
$t .= " $pr->{attr}" |
275
|
|
|
|
|
|
|
if $pr && exists $pr->{attr} && $pr->{attr}; |
276
|
|
|
|
|
|
|
if ($pr && exists $pr->{hr} && ref($pr->{hr}) eq 'HASH') { |
277
|
|
|
|
|
|
|
map { $t .= " $_='$pr->{hr}{$_}'" } (keys %{$pr->{hr}}); |
278
|
|
|
|
|
|
|
} |
279
|
|
|
|
|
|
|
$t .= ">"; |
280
|
|
|
|
|
|
|
if ($pr && exists $pr->{pretty} && $pr->{pretty} && |
281
|
|
|
|
|
|
|
$tg !~ /^(td|li)/ ) { |
282
|
|
|
|
|
|
|
$t .= "\n"; |
283
|
|
|
|
|
|
|
$t .= " $txt\n" if defined($txt) && $txt !~ /^\s*$/; |
284
|
|
|
|
|
|
|
$t .= (exists $idt->{$tg}) ? ' 'x$idt->{$tg} : ""; |
285
|
|
|
|
|
|
|
} else { |
286
|
|
|
|
|
|
|
$t .= (defined($txt) && $txt !~ /^\s*$/) ? $txt : |
287
|
|
|
|
|
|
|
(($tg =~ /^td/i) ? ' ' : ""); |
288
|
|
|
|
|
|
|
} |
289
|
|
|
|
|
|
|
$t .= "$tag>\n" if $is_end; |
290
|
|
|
|
|
|
|
return $t; |
291
|
|
|
|
|
|
|
} |
292
|
|
|
|
|
|
|
|
293
|
|
|
|
|
|
|
=head2 table_column ($cn,$pr,$cr) |
294
|
|
|
|
|
|
|
|
295
|
|
|
|
|
|
|
Input variables: |
296
|
|
|
|
|
|
|
|
297
|
|
|
|
|
|
|
$cn - column names separated by comma, or |
298
|
|
|
|
|
|
|
array ref containing column names , or |
299
|
|
|
|
|
|
|
hash ref containing column names as keys |
300
|
|
|
|
|
|
|
$pr - tag attribute array ref. It contains the following items: |
301
|
|
|
|
|
|
|
css_tr - TR class name |
302
|
|
|
|
|
|
|
atr_tr - TR attributes |
303
|
|
|
|
|
|
|
css_td - TD class name |
304
|
|
|
|
|
|
|
atr_td - TD attributes |
305
|
|
|
|
|
|
|
pretty - whether to add line breaks |
306
|
|
|
|
|
|
|
atr_cell - Cell attribute |
307
|
|
|
|
|
|
|
$cr - column description hash ref $cr->{$k}{$itm} |
308
|
|
|
|
|
|
|
where $k is column name and the items ($itm) are : |
309
|
|
|
|
|
|
|
desc - column description |
310
|
|
|
|
|
|
|
name - display name |
311
|
|
|
|
|
|
|
|
312
|
|
|
|
|
|
|
Variables used or methods called: |
313
|
|
|
|
|
|
|
|
314
|
|
|
|
|
|
|
html_tag - generate HTML tags |
315
|
|
|
|
|
|
|
|
316
|
|
|
|
|
|
|
How to use: |
317
|
|
|
|
|
|
|
|
318
|
|
|
|
|
|
|
my $cn = 'seq,fn,ln'; |
319
|
|
|
|
|
|
|
my $pr = {css_tr=>'tr_pretty',css_td=>'td_small',pretty=>1}; |
320
|
|
|
|
|
|
|
my $cr = {seq=>{name=>'Seq No',desc=>'Sequential number'}, |
321
|
|
|
|
|
|
|
fn =>{name=>'First Name',desc=>'First name'}, |
322
|
|
|
|
|
|
|
ln =>{name=>'Last Name',desc=>'Last name/family name'}, |
323
|
|
|
|
|
|
|
}; |
324
|
|
|
|
|
|
|
my $t = $self->table_column($cn,$pr,$cr); |
325
|
|
|
|
|
|
|
|
326
|
|
|
|
|
|
|
Return: HTML codes. |
327
|
|
|
|
|
|
|
|
328
|
|
|
|
|
|
|
This method generates HTML codes for table header row (TH) |
329
|
|
|
|
|
|
|
based on the information provided. |
330
|
|
|
|
|
|
|
|
331
|
|
|
|
|
|
|
=cut |
332
|
|
|
|
|
|
|
|
333
|
|
|
|
|
|
|
sub table_column { |
334
|
|
|
|
|
|
|
my $s = shift; |
335
|
|
|
|
|
|
|
my ($cn,$pr,$cr) = @_; |
336
|
|
|
|
|
|
|
carp "No column names are specified." if !$cn; |
337
|
|
|
|
|
|
|
return if !$cn; |
338
|
|
|
|
|
|
|
|
339
|
|
|
|
|
|
|
my $cns = $cn; |
340
|
|
|
|
|
|
|
if (ref($cn) =~ /ARRAY/) { |
341
|
|
|
|
|
|
|
$cns = ""; map { $cns .= "$_," } @$cn; $cns =~ s/,$//; |
342
|
|
|
|
|
|
|
} elsif (ref($cn) =~ /HASH/) { |
343
|
|
|
|
|
|
|
$cns = ""; map { $cns .= "$_," } keys %$cn; $cns =~ s/,$//; |
344
|
|
|
|
|
|
|
} |
345
|
|
|
|
|
|
|
carp "No column names are specified." if !$cns; |
346
|
|
|
|
|
|
|
return if !$cns; |
347
|
|
|
|
|
|
|
my $css_tr = $s->set_param('css_tr', $pr); |
348
|
|
|
|
|
|
|
my $atr_tr = $s->set_param('atr_tr', $pr); |
349
|
|
|
|
|
|
|
my $css_td = $s->set_param('css_td', $pr); |
350
|
|
|
|
|
|
|
my $atr_td = $s->set_param('atr_td', $pr); |
351
|
|
|
|
|
|
|
my $pretty = $s->set_param('pretty', $pr); |
352
|
|
|
|
|
|
|
my $atr_cell = $s->set_param('atr_cell', $pr); |
353
|
|
|
|
|
|
|
$atr_cell = eval $atr_cell if $atr_cell; |
354
|
|
|
|
|
|
|
$atr_cell = [] if ! $atr_cell; |
355
|
|
|
|
|
|
|
my $esc_vars = $s->set_param('esc_vars',$pr); |
356
|
|
|
|
|
|
|
my $esc = ($esc_vars) ? { |
357
|
|
|
|
|
|
|
map { $_ => 1 } (split /,/,$esc_vars) |
358
|
|
|
|
|
|
|
} : {}; |
359
|
|
|
|
|
|
|
my $t=$s->html_tag('TR',{class=>$css_tr,attr=>$atr_tr,pretty=>1}); |
360
|
|
|
|
|
|
|
my ($j,$x,$txt) = (-1,$atr_td,""); |
361
|
|
|
|
|
|
|
my $p = {class=>$css_td,pretty=>$pretty,hr=>{}}; |
362
|
|
|
|
|
|
|
foreach my $k (split /,/,$cns) { |
363
|
|
|
|
|
|
|
++$j; $k = lc $k; |
364
|
|
|
|
|
|
|
if ($cr && exists $cr->{$k}{name}) { |
365
|
|
|
|
|
|
|
$txt = $cr->{$k}{name}; |
366
|
|
|
|
|
|
|
} else { |
367
|
|
|
|
|
|
|
$txt = $k; $txt =~ s/_/ /g; |
368
|
|
|
|
|
|
|
$txt = join ' ', (map {ucfirst $_} (split / /, $txt)); |
369
|
|
|
|
|
|
|
} |
370
|
|
|
|
|
|
|
if (! exists $esc->{$k}) { |
371
|
|
|
|
|
|
|
$txt =~ s/\</g; $txt =~ s/>/\>/g; |
372
|
|
|
|
|
|
|
} |
373
|
|
|
|
|
|
|
$x = ($x) ? "$x $atr_cell->[0][$j]" : $atr_cell->[0][$j] |
374
|
|
|
|
|
|
|
if exists $atr_cell->[0][$j]; |
375
|
|
|
|
|
|
|
$p->{attr} = $x; |
376
|
|
|
|
|
|
|
$p->{hr}{title}="$cr->{$k}{name} ($k): $cr->{$k}{desc}" |
377
|
|
|
|
|
|
|
if $cr && exists $cr->{$k} && |
378
|
|
|
|
|
|
|
exists $cr->{$k}{name} && exists $cr->{$k}{desc}; |
379
|
|
|
|
|
|
|
$t .= $s->html_tag('TH',$p,$txt,1); |
380
|
|
|
|
|
|
|
} |
381
|
|
|
|
|
|
|
$t .= " |
\n";
382
|
|
|
|
|
|
|
return $t; |
383
|
|
|
|
|
|
|
} |
384
|
|
|
|
|
|
|
|
385
|
|
|
|
|
|
|
1; |
386
|
|
|
|
|
|
|
|
387
|
|
|
|
|
|
|
=head1 HISTORY |
388
|
|
|
|
|
|
|
|
389
|
|
|
|
|
|
|
=over 4 |
390
|
|
|
|
|
|
|
|
391
|
|
|
|
|
|
|
=item * Version 0.10 |
392
|
|
|
|
|
|
|
|
393
|
|
|
|
|
|
|
This version extracts the disp_form method from CGI::Getopt class. |
394
|
|
|
|
|
|
|
|
395
|
|
|
|
|
|
|
0.11 Inherited the new constructor from CGI::AppBuilder. |
396
|
|
|
|
|
|
|
0.12 Added html_tag and table_column functions |
397
|
|
|
|
|
|
|
Modified html_table to use html_tag and table_column |
398
|
|
|
|
|
|
|
|
399
|
|
|
|
|
|
|
=item * Version 0.20 |
400
|
|
|
|
|
|
|
|
401
|
|
|
|
|
|
|
=cut |
402
|
|
|
|
|
|
|
|
403
|
|
|
|
|
|
|
=head1 SEE ALSO (some of docs that I check often) |
404
|
|
|
|
|
|
|
|
405
|
|
|
|
|
|
|
Oracle::Loader, Oracle::Trigger, CGI::Getopt, File::Xcopy, |
406
|
|
|
|
|
|
|
CGI::AppBuilder, CGI::AppBuilder::Message, CGI::AppBuilder::Log, |
407
|
|
|
|
|
|
|
CGI::AppBuilder::Config, etc. |
408
|
|
|
|
|
|
|
|
409
|
|
|
|
|
|
|
=head1 AUTHOR |
410
|
|
|
|
|
|
|
|
411
|
|
|
|
|
|
|
Copyright (c) 2005 Hanming Tu. All rights reserved. |
412
|
|
|
|
|
|
|
|
413
|
|
|
|
|
|
|
This package is free software and is provided "as is" without express |
414
|
|
|
|
|
|
|
or implied warranty. It may be used, redistributed and/or modified |
415
|
|
|
|
|
|
|
under the terms of the Perl Artistic License (see |
416
|
|
|
|
|
|
|
http://www.perl.com/perl/misc/Artistic.html) |
417
|
|
|
|
|
|
|
|
418
|
|
|
|
|
|
|
=cut |
419
|
|
|
|
|
|
|
|