use strict;
use warnings;
use HTML::Template;
use strict;
use warnings;
use Data::Dump::Streamer;
my %hash;
while (<DATA>) {
chomp;
my @elements = split /\s*\/\s*/;
next if ! @elements;
$hash{$elements[0]} = {} if ! exists $hash{$elements[0]};
my $subHash = $hash{shift @elements};
for (@elements) {
$subHash->{$_} = {} unless exists $subHash->{$_};
$subHash = $subHash->{$_};
};
}
my @tree;
push @tree, buildFamily (\%hash, $_) for keys %hash;
my $template = <<'HTML';
<html>
<head><title>Test Template</title>
<body><TMPL_LOOP NAME="Parents">
Parent: <TMPL_VAR NAME="name"><br>
<TMPL_LOOP NAME="children"> Child: <TMPL_VAR NAME="name"><br
+>
<TMPL_LOOP NAME="children"> Grandchild: <TMPL_VAR NAME="
+name"><br>
</TMPL_LOOP></TMPL_LOOP></TMPL_LOOP></body>
</html>
HTML
my $t = HTML::Template->new (scalarref => \$template);
$t->param (Parents => \@tree);
print $t->output ();
sub buildFamily {
my ($hash, $parent) = @_;
my %root = (name => $parent);
if (keys %{$hash->{$parent}}) {
my @children;
push @children, buildFamily ($hash->{$parent}, $_)
for keys %{$hash->{$parent}};
$root{children} = \@children;
}
return \%root;
}
__DATA__
one
foo / bar
foo / baz
foo / qux / two
foo / qux / three
foo / qux / four
five
Prints:
<html>
<head><title>Test Template</title>
<body>
Parent: five<br>
Parent: one<br>
Parent: foo<br>
Child: bar<br>
Child: baz<br>
Child: qux<br>
Grandchild: three<br>
Grandchild: two<br>
Grandchild: four<br>
</body>
</html>
DWIM is Perl's answer to Gödel
|