#
# htmlizer.lib.pl
# Joel Uckelman (uckelman@nomic.net)
# 28 February 2001
#
sub add_break_tags ($) {
my ($data) = @_;
$data =~ s/([^>])\n([^<])/$1
\n$2/gs;
$data =~ s/\n{2}/\n\n
/gs;
return $data;
}
sub col ($@) {
my ($col, @list) = @_;
# get a single column from a multi-dimensional array
my ($i, @data) = ();
for $i (0 .. $#list) { push @data, $list[$i][$col]; }
return @data;
}
sub history_all_query ($$$$$) {
my ($record_query, $record_format, $history_query, $history_format, $history_var) = @_;
# prepare record query
lock_tables(get_used_tables($record_query));
my $sh = $db->prepare($record_query) or die "\n$prog: failed to prepare query: $DBI::errstr";
$sh->execute or die "\n$prog: failed to execute query: $DBI::errstr";
# get column names
my @column = @{$sh->{NAME}};
# get each record
my (@tmp, $i);
my $data = '';
while (@tmp = $sh->fetchrow_array) {
# interleave column names and data
my (@var, $tmp) = ();
for $i (0 .. $#column) { push @var, $column[$i], shift @tmp; }
# make history
push @var, $history_var, single_query(eval 'interpolate($history_query, @var)', $history_format);
# interpolate data into record format, then eval to activate any backslashed chars
$data .= eval 'interpolate($record_format, @var)';
}
$sh->finish or die "\n$prog: failed to release handle: $DBI::errstr";
return $data;
}
sub history_number_query ($$$$$$$$$$) {
my ($record_query, $record_format, $history_query, $history_format, $history_var, $history_pre, $history_post, $history_make_query, $history_make_format, $history_make_var) = @_;
# prepare record query
lock_tables(get_used_tables($record_query));
my $sh = $db->prepare($record_query) or die "\n$prog: failed to prepare query: $DBI::errstr";
$sh->execute or die "\n$prog: failed to execute query: $DBI::errstr";
# get column names
my @column = @{$sh->{NAME}};
# get each record
my (@tmp, $i);
my $data = '';
while (@tmp = $sh->fetchrow_array) {
# interleave column names and data
my @var = ();
for $i (0 .. $#column) { push @var, $column[$i], shift @tmp; }
# make history if needed
for ($i = 0; $i <= $#var; $i+=2) {
if ($var[$i] eq $history_make_var) {
my $tmp = single_query(eval 'interpolate($history_make_query, @var)', $history_make_format);
push @var, $history_var, ($var[$i+1] == $tmp ? $history_pre . single_query(eval 'interpolate($history_query, @var)', $history_format) . $history_post : '');
}
}
# interpolate data into record format, then eval to activate any backslashed chars
$data .= eval 'interpolate($record_format, @var)';
}
$sh->finish or die "\n$prog: failed to release handle: $DBI::errstr";
return $data;
}
sub interpolate {
my $data = shift @_;
# set variables
my (@var, $tmp) = ();
while ($tmp = shift @_) {
$$tmp = shift @_;
die "\n$prog: interpolate requires a value for each variable name passed" unless defined($$tmp);
push @var, $tmp;
}
# interpolate and return
foreach $tmp (@var) { $data =~ s/\$$tmp/$$tmp/sg; }
$data =~ s/@\{\[(.*?)\]\}/$1/seeg;
return $data;
}
sub interpolate_file {
die "\n$prog: interpolate_file requires a file" unless @_;
my $data = read_file(shift @_);
return interpolate($data, @_);
}
sub list_query ($$$$$) {
my ($list_query, $list_format, $list_closer, $element_query, $element_format) = @_;
# prepare list query
lock_tables(get_used_tables($list_query));
my $sh = $db->prepare($list_query) or die "\n$prog: failed to prepare query: $DBI::errstr";
$sh->execute or die "\n$prog: failed to execute query: $DBI::errstr";
# get column names
my @column = @{$sh->{NAME}};
# get list headings
my (@tmp, $i);
my $data = '';
while (@tmp = $sh->fetchrow_array) {
# interleave column names and data
my @var = ();
for $i (0 .. $#column) { push @var, $column[$i], shift @tmp; }
# interpolate data into list format, then eval to activate any backslashed chars
$data .= eval 'interpolate($list_format, @var)';
# get elements
$data .= single_query(eval 'interpolate($element_query, @var)', $element_format);
# close list
$data .= $list_closer;
}
return $data;
}
sub list_unpack {
my ($parent, $list_open, $list_format, $list_close, $element_query, $element_format, @list) = @_;
my $i;
my $data = '';
$data .= single_query(eval 'interpolate($element_query, "category", $list[$parent][0])', interpolate($element_format, "parent", $parent+1)) unless $parent == -1;
for $i (0 .. $#list) {
if ($list[$i][1] == $parent) {
$data .= eval 'interpolate($list_format, "element", $list[$i][0])';
$data .= list_unpack($i, $list_open, $list_format, $list_close, $element_query, $element_format, @list);
}
}
return ($data ? "$list_open$data$list_close" : '');
}
sub links {
my ($this, $here, $link, @data) = @_;
my $i;
for $i (0 .. $#data) { $data[$i] = interpolate($data[$i] eq $this ? $here : $link, 'page', $data[$i], 'i', $i); }
return @data;
}
sub page_links_old {
my ($this_page, $here, $link, @page) = @_;
my ($data, $i) = ();
for $i (0 .. $#page) { $data .= interpolate($page[$i] eq $this_page ? $here : $link, 'page', $page[$i], 'i', $i); }
return $data;
}
sub read_file ($) {
my ($file) = @_;
open FILE, "<$file" or die "\n$prog: $file: $!\n";
my $data = join '',