#!/usr/bin/perl -w # # $Id$ # $FreeBSD$ # use strict; use XML::Parser; use Data::Dumper; use POSIX; my @months = ( "", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ); my @createdfiles = (); my @tree = (); my @values = (); my $treeindex = -1; my @items; my $ci = -1; my %sources; my $sid = ""; my %tags; sub addtags { my $tags = shift; if ($tags) { my @w = split(/,/, $tags); foreach my $w (@w) { $tags{$w} = 0 if (!defined $tags{$w}); $tags{$w}++; } return; } my $array = shift; my @array = @{$array}; foreach my $w (@array) { $tags{$w} = 0 if (!defined $tags{$w}); $tags{$w}++; } } sub xml_start { my $expat = shift; my $element = shift; $tree[++$treeindex] = $element; while (defined (my $attribute = shift)) { $values[$treeindex]{$attribute} = shift; } if ($element eq "item" && $treeindex == 2) { $ci++; $items[$ci] = (); $items[$ci]{source} = $values[$treeindex]{source}; $items[$ci]{added} = $values[$treeindex]{added}; $items[$ci]{ci} = $ci; $items[$ci]{fc} = -1; } if ($element eq "source" && $treeindex == 2) { $sid = $values[$treeindex]{id}; $sources{$values[$treeindex]{id}} = (); } if ($element eq "url" && $treeindex == 5) { $items[$ci]{fc}++; } } sub xml_end { my $expat = shift; my $element = shift; $values[$treeindex] = (); $treeindex--; } sub xml_char { my $expat = shift; my $value = shift; if ($tree[0] eq "multimedia") { return if ($treeindex == 0); if ($tree[1] eq "items") { return if ($treeindex == 1); if ($tree[2] eq "item") { return if ($treeindex == 2); if ($tree[3] eq "title") { $items[$ci]{title} = "" if (!defined $items[$ci]{title}); $items[$ci]{title} .= $value; return; } if ($tree[3] eq "desc") { $items[$ci]{desc} = "" if (!defined $items[$ci]{desc}); $items[$ci]{desc} .= $value; return; } if ($tree[3] eq "overview") { $items[$ci]{overview} = "" if (!defined $items[$ci]{desc}); $items[$ci]{overview} .= $value; return; } if ($tree[3] eq "link") { $items[$ci]{link} = "" if (!defined $items[$ci]{link}); $items[$ci]{link} .= $value; return; } if ($tree[3] eq "tags") { @{$items[$ci]{tags}} = split(/,/, $value); addtags($value); return; } if ($tree[3] eq "files") { return if ($treeindex == 3); if ($tree[4] eq "prefix") { $items[$ci]{prefix} = "" if (!defined $items[$ci]{prefix}); $items[$ci]{prefix} .= $value; return; } if ($tree[4] eq "file") { return if ($treeindex == 4); if ($tree[5] eq "url") { # Note that $items[$ci]{fc} gets incremented in xml_start $items[$ci]{files}{$items[$ci]{fc}}{url} = "" if (!defined $items[$ci]{files}{$items[$ci]{fc}}{url}); $items[$ci]{files}{$items[$ci]{fc}}{url} .= $value; return; } if ($tree[5] eq "size") { $items[$ci]{files}{$items[$ci]{fc}}{size} = "" if (!defined $items[$ci]{files}{$items[$ci]{fc}}{size}); $items[$ci]{files}{$items[$ci]{fc}}{size} .= $value; return; } if ($tree[5] eq "length") { $items[$ci]{files}{$items[$ci]{fc}}{length} = "" if (!defined $items[$ci]{files}{$items[$ci]{fc}}{length}); $items[$ci]{files}{$items[$ci]{fc}}{length} .= $value; return; } if ($tree[5] eq "desc") { $items[$ci]{files}{$items[$ci]{fc}}{desc} = "" if (!defined $items[$ci]{files}{$items[$ci]{fc}}{desc}); $items[$ci]{files}{$items[$ci]{fc}}{desc} .= $value; return; } if ($tree[5] eq "tags") { @{$items[$ci]{files}{$items[$ci]{fc}}{tags}} = split(/,/, $value); addtags($value); addtags("", $items[$ci]{tags}); return; } goto error; } goto error; } goto error; } goto error; } if ($tree[1] eq "sources") { return if ($treeindex == 1); if ($tree[2] eq "source") { return if ($treeindex == 2); if ($tree[3] eq "name") { $sources{$sid}{name} = $value; return; } if ($tree[3] eq "url") { $sources{$sid}{url} = $value; return; } goto error; } goto error; } goto error; } error: print "Unknown item at depth $treeindex: $tree[$treeindex]\n"; } my $p = new XML::Parser( Handlers => { Start => \&xml_start, End => \&xml_end, Char => \&xml_char, } ); $p->parsefile("multimedia-input.xml"); my @site_order = (); { sub site_sort { my %a = %{$a}; my %b = %{$b}; return $a{source} cmp $b{source} if ($a{source} ne $b{source}); return $a{title} cmp $b{title}; } @site_order = sort site_sort @items; } my @date_order = (); { my %dates = (); foreach my $item (@items) { my %item = %{$item}; $dates{$item{ci}} = $item{added}; } my @dates = keys(%dates); @date_order = sort { $dates{$b} cmp $dates{$a} } @dates; } # # HTML overview output # sub print_htmlitem { my $item = shift; my %item = %{$item}; my $source = shift; my %source = %{$source}; print FOUT "
";
if (defined $item{overview}) {
print FOUT "$item{title}\n";
} else {
my %media = %{$item{files}{0}};
print FOUT "$item{title}\n";
if (defined $media{size} || defined $media{length}) {
my $s = "";
print FOUT "(";
if (defined $media{size}) {
print FOUT "$media{size}";
$s = ", ";
}
if (defined $media{length}) {
print FOUT "$s$media{length}";
$s = ", ";
}
print FOUT ")";
}
}
print FOUT "
Source: ",
$source{name}, "
\n";
print FOUT "Added: ",
substr($item{added}, 6, 2), " ",
$months[substr($item{added}, 4, 2)], " ",
substr($item{added}, 0, 4), "
\n";
print FOUT "Tags: ";
{
my $first = 1;
foreach my $t (@{$item{tags}}) {
print FOUT ", " if (!$first);
# join(", ", @{$item{$t}}), "
\n";
my $th = $t;
$th =~ s/ /_/g;
print FOUT "$t";
$first = 0;
}
}
print FOUT "
\n";
if (defined $item{overview} && defined $item{files}) {
my $c = 0;
foreach my $m (keys(%{$item{files}})) {
my %file = %{$item{files}{$m}};
print FOUT ", " if ($c++);
if (defined $item{prefix}) {
print FOUT "$file{desc}";
} else {
print FOUT "$file{desc}";
}
if (defined $file{size} || defined $file{length}) {
my $s = "";
print FOUT " (";
if (defined $file{size}) {
print FOUT "$file{size}";
$s = ", ";
}
if (defined $file{length}) {
print FOUT "$s$file{length}";
$s = ", ";
}
print FOUT ")";
}
}
print FOUT "
\n";
}
print FOUT "$item{desc}\n";
}
{
$createdfiles[$#createdfiles+1] = "multimedia.html";
open(FOUT, ">multimedia.html");
open(FIN, "multimedia.html.pre");
my @lines = Newest resources
\n";
my $month = "";
foreach my $order (@date_order) {
my %item = %{$items[$order]};
my %source = %{$sources{$item{source}}};
if (substr($item{added}, 0, 6) ne $month) {
print FOUT "", $months[substr($item{added}, 4, 2)+0], " ", substr($item{added}, 0, 4), "
";
$month = substr($item{added}, 0, 6);
}
print_htmlitem(\%item, \%source);
}
print FOUT "
\n";
open(FIN, "multimedia.html.post");
@lines = Tags
\n";
my $month = "";
sub size {
return $b cmp $a if ($tags{$b} == $tags{$a});
return $tags{$b} <=> $tags{$a};
}
my $size = 20;
my $c = 0;
foreach my $tag (sort size(keys(%tags))) {
my $ftag = $tag;
$ftag =~ s/ /_/g;
print FOUT "$tag\n";
$size-- if ($c++%10 == 0 && $size > 2);
}
open(FIN, "multimedia.html.post");
@lines = Tag: $tag
\n";
print FOUT "\n";
foreach my $item (@items) {
my %item = %{$item};
my %source = %{$sources{$item{source}}};
my $found = 0;
foreach my $itag (@{$item{tags}}) {
if ($itag eq $tag) {
$found = 1;
last;
}
}
if (!$found) {
foreach my $file (keys(%{$item{files}})) {
my %file = %{$item{files}{$file}};
foreach my $itag (@{$file{tags}}) {
if ($itag eq $tag) {
$found = 1;
last;
}
}
}
}
print_htmlitem(\%item, \%source) if ($found);
}
print FOUT "
\n";
open(FIN, "multimedia.html.post");
@lines = Sources
\n";
print FOUT "\n";
my $lastsource = "";
foreach my $item (@site_order) {
my %item = %{$item};
next if ($lastsource eq $item{source});
$lastsource = $item{source};
print FOUT "
\n";
open(FIN, "multimedia.html.post");
@lines = $source{name}
\n";
print FOUT "\n";
}
print_htmlitem(\%item, \%source);
}
print FOUT "
\n";
open(FIN, "multimedia.html.post");
my @lines =
From: $source{name}
");
print FOUT htmlentities("Tags: $tags
\n");
print FOUT htmlentities("$item{desc}");
print FOUT "