TIMTOWTDI!
use strict;
use warnings;
use Spreadsheet::HTML qw(generate);
my @data = map { chomp; s/(?:COMMENT|[&\\_@])//g; [split /:/] } <DATA
+>;
my @class = map { map $_ ? 'norm' : 'bold', splice @$_, 0, 1 } @data;
my @frag = map { splice @$_, 2, 1 } @data;
print generate(
data => \@data,
matrix => 1,
indent => ' ',
tr => { class => \@class },
-c2 => sub { sprintf '<a href="#%s">%s</a>', shift(@frag), shift }
);
__DATA__
0:A:B:frag1:name1
1:C:D:frag2:name2
0:E:F:fr&ag3:naCOMMENTme3
1:G:H:fr\ag4:_name4
0:I:J:fr@ag5:name5
Output:
<table>
<tr class="bold">
<td>A</td>
<td>B</td>
<td><a href="#frag1">name1</a></td>
</tr>
<tr class="norm">
<td>C</td>
<td>D</td>
<td><a href="#frag2">name2</a></td>
</tr>
<tr class="bold">
<td>E</td>
<td>F</td>
<td><a href="#frag3">name3</a></td>
</tr>
<tr class="norm">
<td>G</td>
<td>H</td>
<td><a href="#frag4">name4</a></td>
</tr>
<tr class="bold">
<td>I</td>
<td>J</td>
<td><a href="#frag5">name5</a></td>
</tr>
</table>