The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl

use File::Spec;

use HTML::TreeBuilder;

use HTTP::Tiny;

# --------------------

my($file_name) = File::Spec -> catfile('data', 'attributes.html');

if (! -e $file_name)
{
	my($page_name) = 'http://www.graphviz.org/content/attrs';
	my($client)    = HTTP::Tiny -> new -> get($page_name);

	if ($$client{success})
	{
		open(OUT, '>', $file_name) || die "Can't open(> $file_name): $!";
		print OUT $$client{content};
		close OUT;
	}
	else
	{
		print "Failed to get $page_name: $$client{reason}. \n";
	}
}

my($root)    = HTML::TreeBuilder -> new();
my($result)  = $root -> parse_file($file_name) || die "Can't parse: $file_name";
my(@node)    = $root -> look_down(_tag => 'table');
my(@td)      = $node[5] -> look_down(_tag => 'td');
my($column)  = 0;
my(%context) =
	(
	 C => 'cluster',
	 E => 'edge',
	 G => 'graph',
	 N => 'node',
	 S => 'subgraph',
	);

my(@attribute);
my(@content, @column);
my(@row);
my($td);
my(@user);

for $td (@td)
{
	@content = $td -> content_list;

	if (ref $content[0])
	{
		$content[0] = ($content[0] -> content_list)[0];
	}

	$column++;

	$column = $column % 6;

	if ($column == 1)
	{
		push @column, $content[0];
	}
	elsif ($column == 2)
	{
		push @user, join(', ', map{$context{$_} } split(//, $content[0]) );
	}
}

$root -> delete();

$file_name = File::Spec -> catfile('data', 'attributes.dat');

open(OUT, '>', $file_name) || die "Can't open(> $file_name): $!";
print OUT map{"$column[$_] => $user[$_]\n"} 0 .. $#column;
close OUT;