Thanks to hrs@ for fixing it in the first place. (Despite that I had run a make on this file and the .xml file, it seems that it didn't break with the file until it was commited. I am confused too.)
		
			
				
	
	
		
			788 lines
		
	
	
	
		
			18 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			788 lines
		
	
	
	
		
			18 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
#!/usr/bin/perl -w
 | 
						|
 | 
						|
#
 | 
						|
# $Id: multimedia.pl,v 1.6 2008-12-07 06:12:06 edwin Exp $
 | 
						|
# $FreeBSD: www/en/multimedia/multimedia.pl,v 1.5 2008/12/06 06:25:37 hrs Exp $
 | 
						|
#
 | 
						|
 | 
						|
use strict;
 | 
						|
use XML::Parser;
 | 
						|
use Data::Dumper;
 | 
						|
use POSIX;
 | 
						|
use IO::File;
 | 
						|
 | 
						|
my @months = (
 | 
						|
    "", "January", "February", "March",
 | 
						|
    "April", "May", "June", "July",
 | 
						|
    "August", "September", "October",
 | 
						|
    "November", "December"
 | 
						|
);
 | 
						|
 | 
						|
my @createdhtml = ();
 | 
						|
my @createdsgml = ();
 | 
						|
my @createdxml = ();
 | 
						|
 | 
						|
my @tree = ();
 | 
						|
my @values = ();
 | 
						|
my $treeindex = -1;
 | 
						|
 | 
						|
my @items;
 | 
						|
my $ci = -1;
 | 
						|
my %sources;
 | 
						|
my $sid = "";
 | 
						|
my %tags;
 | 
						|
my $tag = "";
 | 
						|
 | 
						|
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}++;
 | 
						|
    }
 | 
						|
 | 
						|
    if ($treeindex == 3 &&
 | 
						|
	$element eq "tags") {
 | 
						|
	$tag = "";
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
sub xml_end {
 | 
						|
    my $expat = shift;
 | 
						|
    my $element = shift;
 | 
						|
 | 
						|
    if ($treeindex == 3 &&
 | 
						|
	$element eq "tags") {
 | 
						|
	@{$items[$ci]{tags}} = split(/,/, $tag);
 | 
						|
	addtags($tag);
 | 
						|
    }
 | 
						|
 | 
						|
    $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") {
 | 
						|
		    $tag .= $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 $fhandle = shift;
 | 
						|
    my $item = shift;
 | 
						|
    my %item = %{$item};
 | 
						|
    my $source = shift;
 | 
						|
    my %source = %{$source};
 | 
						|
 | 
						|
    print $fhandle "<li><p>";
 | 
						|
    if (defined $item{overview}) {
 | 
						|
	print $fhandle "<a href=\"", htmlentities($item{overview}), "\">$item{title}</a>\n";
 | 
						|
    } else {
 | 
						|
	my %media = %{$item{files}{0}};
 | 
						|
	print $fhandle "<a href=\"", htmlentities($media{url}), "\">$item{title}</a>\n";
 | 
						|
	if (defined $media{size} || defined $media{length}) {
 | 
						|
	    my $s = "";
 | 
						|
	    print $fhandle "(";
 | 
						|
	    if (defined $media{size}) {
 | 
						|
		print $fhandle "$media{size}";
 | 
						|
		$s = ", ";
 | 
						|
	    }
 | 
						|
	    if (defined $media{length}) {
 | 
						|
		print $fhandle "$s$media{length}";
 | 
						|
		$s = ", ";
 | 
						|
	    }
 | 
						|
	    print $fhandle ")";
 | 
						|
	}
 | 
						|
    }
 | 
						|
    print $fhandle "<br>Source: <a href=\"", htmlentities($source{url}), "\">",
 | 
						|
	$source{name}, "</a><br>\n";
 | 
						|
    print $fhandle "Added: ",
 | 
						|
	    substr($item{added}, 6, 2), " ",
 | 
						|
	    $months[substr($item{added}, 4, 2)], " ",
 | 
						|
	    substr($item{added}, 0, 4), "<br>\n";
 | 
						|
 | 
						|
    print $fhandle "Tags: ";
 | 
						|
    {
 | 
						|
	my $first = 1;
 | 
						|
	foreach my $t (@{$item{tags}}) {
 | 
						|
	    print $fhandle ", " if (!$first);
 | 
						|
#	    join(", ", @{$item{$t}}), "<br>\n";
 | 
						|
	    my $th = $t;
 | 
						|
	    $th =~ s/ /_/g;
 | 
						|
	    print $fhandle "<a href=\"tag-$th.html\">$t</a>";
 | 
						|
	    $first = 0;
 | 
						|
	}
 | 
						|
    }
 | 
						|
    print $fhandle "<br>\n";
 | 
						|
 | 
						|
    if (defined $item{overview} && defined $item{files}) {
 | 
						|
	my $c = 0;
 | 
						|
	foreach my $m (keys(%{$item{files}})) {
 | 
						|
	    my %file = %{$item{files}{$m}};
 | 
						|
	    print $fhandle ", " if ($c++);
 | 
						|
	    if (defined $item{prefix}) {
 | 
						|
		print $fhandle "<a href=\"" . htmlentities($item{prefix} . "/" . $file{url}) . "\">$file{desc}</a>";
 | 
						|
	    } else {
 | 
						|
		print $fhandle "<a href=\"" . htmlentities($file{url}) . "\">$file{desc}</a>";
 | 
						|
	    }
 | 
						|
	    if (defined $file{size} || defined $file{length}) {
 | 
						|
		my $s = "";
 | 
						|
		print $fhandle " (";
 | 
						|
		if (defined $file{size}) {
 | 
						|
		    print $fhandle "$file{size}";
 | 
						|
		    $s = ", ";
 | 
						|
		}
 | 
						|
		if (defined $file{length}) {
 | 
						|
		    print $fhandle "$s$file{length}";
 | 
						|
		    $s = ", ";
 | 
						|
		}
 | 
						|
		print $fhandle ")";
 | 
						|
	    }
 | 
						|
	}
 | 
						|
	print $fhandle "<br>\n";
 | 
						|
    }
 | 
						|
    print $fhandle "</p>\n";
 | 
						|
    print $fhandle "$item{desc}\n";
 | 
						|
    print $fhandle "</li>\n";
 | 
						|
}
 | 
						|
{
 | 
						|
    $createdhtml[$#createdhtml+1] = "multimedia.html";
 | 
						|
    $createdsgml[$#createdsgml+1] = "multimedia.sgml";
 | 
						|
    my $fhtml = new IO::File;
 | 
						|
    my $fsgml = new IO::File;
 | 
						|
 | 
						|
    open($fhtml, ">multimedia.html");
 | 
						|
    open(FIN, "multimedia.html.pre");
 | 
						|
    my @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fhtml @lines;
 | 
						|
    open(FIN, "multimedia.html.intro");
 | 
						|
    @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fhtml @lines;
 | 
						|
    print $fhtml "<h2 id=\"latest\">Newest resources</h2>\n";
 | 
						|
 | 
						|
    open($fsgml, ">multimedia.sgml");
 | 
						|
    open(FIN, "multimedia.sgml.pre");
 | 
						|
    @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fsgml @lines;
 | 
						|
    open(FIN, "multimedia.sgml.intro");
 | 
						|
    @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fsgml @lines;
 | 
						|
    print $fsgml "<h2 id=\"latest\">Newest resources</h2>\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) {
 | 
						|
	    if ($month ne "") {
 | 
						|
		print $fhtml "</ul>\n";
 | 
						|
		print $fsgml "</ul>\n";
 | 
						|
	    }
 | 
						|
	    print $fhtml "<h2>", $months[substr($item{added}, 4, 2)+0], " ", substr($item{added}, 0, 4), "</h2><ul>";
 | 
						|
	    print $fsgml "<h2>", $months[substr($item{added}, 4, 2)+0], " ", substr($item{added}, 0, 4), "</h2><ul>";
 | 
						|
	    $month = substr($item{added}, 0, 6);
 | 
						|
	}
 | 
						|
 | 
						|
	print_htmlitem($fhtml, \%item, \%source);
 | 
						|
	print_htmlitem($fsgml, \%item, \%source);
 | 
						|
    }
 | 
						|
 | 
						|
    print $fhtml "</ul>\n";
 | 
						|
    open(FIN, "multimedia.html.post");
 | 
						|
    @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fhtml @lines;
 | 
						|
    close($fhtml);
 | 
						|
 | 
						|
    print $fsgml "</ul>\n";
 | 
						|
    open(FIN, "multimedia.sgml.post");
 | 
						|
    @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fsgml @lines;
 | 
						|
    close($fsgml);
 | 
						|
}
 | 
						|
 | 
						|
#
 | 
						|
# HTML cloud output
 | 
						|
#
 | 
						|
{
 | 
						|
    $createdhtml[$#createdhtml+1] = "tags.html";
 | 
						|
    $createdsgml[$#createdsgml+1] = "tags.sgml";
 | 
						|
    my $fhtml = new IO::File;
 | 
						|
    my $fsgml = new IO::File;
 | 
						|
    open($fhtml, ">tags.html");
 | 
						|
    open($fsgml, ">tags.sgml");
 | 
						|
 | 
						|
    open(FIN, "multimedia.html.pre");
 | 
						|
    my @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fhtml @lines;
 | 
						|
    open(FIN, "multimedia.html.intro");
 | 
						|
    @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fhtml @lines;
 | 
						|
    print $fhtml "<h2 id=\"latest\">Tags</h2>\n";
 | 
						|
 | 
						|
    open(FIN, "multimedia.sgml.pre");
 | 
						|
    @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fsgml @lines;
 | 
						|
    open(FIN, "multimedia.sgml.intro");
 | 
						|
    @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fsgml @lines;
 | 
						|
    print $fsgml "<h2 id=\"latest\">Tags</h2>\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 $fhtml "<font style=\"font-size:${size}pt\"><a href=\"tag-$ftag.html\">$tag</a></font>\n";
 | 
						|
	print $fsgml "<font style=\"font-size:${size}pt\"><a href=\"tag-$ftag.html\">$tag</a></font>\n";
 | 
						|
	$size-- if ($c++%10 == 0 && $size > 2);
 | 
						|
    }
 | 
						|
 | 
						|
    open(FIN, "multimedia.html.post");
 | 
						|
    @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fhtml @lines;
 | 
						|
 | 
						|
    open(FIN, "multimedia.sgml.post");
 | 
						|
    @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fsgml @lines;
 | 
						|
 | 
						|
    close($fhtml);
 | 
						|
    close($fsgml);
 | 
						|
}
 | 
						|
 | 
						|
#
 | 
						|
# HTML per-tags output
 | 
						|
#
 | 
						|
{
 | 
						|
    foreach my $tag (keys(%tags)) {
 | 
						|
	my $fhtml = new IO::File;
 | 
						|
	my $fsgml = new IO::File;
 | 
						|
 | 
						|
	my $ftag = $tag;
 | 
						|
	$ftag =~ s/ /_/g;
 | 
						|
	$createdhtml[$#createdhtml+1] = "tag-$ftag.html";
 | 
						|
	$createdsgml[$#createdsgml+1] = "tag-$ftag.sgml";
 | 
						|
	open($fhtml, ">tag-$ftag.html");
 | 
						|
	open($fsgml, ">tag-$ftag.sgml");
 | 
						|
 | 
						|
	open(FIN, "multimedia.html.pre");
 | 
						|
	my @lines = <FIN>;
 | 
						|
	close(FIN);
 | 
						|
	print $fhtml @lines;
 | 
						|
	open(FIN, "multimedia.html.intro");
 | 
						|
	@lines = <FIN>;
 | 
						|
	close(FIN);
 | 
						|
	print $fhtml @lines;
 | 
						|
	print $fhtml "<h2 id=\"latest\">Tag: $tag</h2>\n";
 | 
						|
	print $fhtml "<ul>\n";
 | 
						|
 | 
						|
	open(FIN, "multimedia.sgml.pre");
 | 
						|
	@lines = <FIN>;
 | 
						|
	close(FIN);
 | 
						|
	print $fsgml @lines;
 | 
						|
	open(FIN, "multimedia.sgml.intro");
 | 
						|
	@lines = <FIN>;
 | 
						|
	close(FIN);
 | 
						|
	print $fsgml @lines;
 | 
						|
	print $fsgml "<h2 id=\"latest\">Tag: $tag</h2>\n";
 | 
						|
	print $fsgml "<ul>\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($fhtml, \%item, \%source) if ($found);
 | 
						|
	    print_htmlitem($fsgml, \%item, \%source) if ($found);
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	print $fhtml "</ul>\n";
 | 
						|
	open(FIN, "multimedia.html.post");
 | 
						|
	@lines = <FIN>;
 | 
						|
	close(FIN);
 | 
						|
	print $fhtml @lines;
 | 
						|
	close($fhtml);
 | 
						|
 | 
						|
	print $fsgml "</ul>\n";
 | 
						|
	open(FIN, "multimedia.sgml.post");
 | 
						|
	@lines = <FIN>;
 | 
						|
	close(FIN);
 | 
						|
	print $fsgml @lines;
 | 
						|
	close($fsgml);
 | 
						|
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
#
 | 
						|
# HTML all-sources output
 | 
						|
#
 | 
						|
{
 | 
						|
    my $fhtml = new IO::File;
 | 
						|
    my $fsgml = new IO::File;
 | 
						|
 | 
						|
    $createdhtml[$#createdhtml+1] = "sources.html";
 | 
						|
    $createdsgml[$#createdsgml+1] = "sources.sgml";
 | 
						|
    open($fhtml, ">sources.html");
 | 
						|
    open($fsgml, ">sources.sgml");
 | 
						|
 | 
						|
    open(FIN, "multimedia.html.pre");
 | 
						|
    my @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fhtml @lines;
 | 
						|
    open(FIN, "multimedia.html.intro");
 | 
						|
    @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fhtml @lines;
 | 
						|
    print $fhtml "<h2 id=\"latest\">Sources</h2>\n";
 | 
						|
    print $fhtml "<ul>\n";
 | 
						|
 | 
						|
    open(FIN, "multimedia.sgml.pre");
 | 
						|
    @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fsgml @lines;
 | 
						|
    open(FIN, "multimedia.sgml.intro");
 | 
						|
    @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fsgml @lines;
 | 
						|
    print $fsgml "<h2 id=\"latest\">Sources</h2>\n";
 | 
						|
    print $fsgml "<ul>\n";
 | 
						|
 | 
						|
    my $lastsource = "";
 | 
						|
    foreach my $item (@site_order) {
 | 
						|
	my %item = %{$item};
 | 
						|
	next if ($lastsource eq $item{source});
 | 
						|
	$lastsource = $item{source};
 | 
						|
 | 
						|
	print $fhtml "<li><a href=\"source-$lastsource.html\">", $sources{$item{source}}{name}, "</a>\n";
 | 
						|
	print $fsgml "<li><a href=\"source-$lastsource.html\">", $sources{$item{source}}{name}, "</a>\n";
 | 
						|
    }
 | 
						|
 | 
						|
    print $fhtml "</ul>\n";
 | 
						|
    open(FIN, "multimedia.html.post");
 | 
						|
    @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fhtml @lines;
 | 
						|
    close($fhtml);
 | 
						|
 | 
						|
    print $fsgml "</ul>\n";
 | 
						|
    open(FIN, "multimedia.sgml.post");
 | 
						|
    @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fsgml @lines;
 | 
						|
    close($fsgml);
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
#
 | 
						|
# HTML per-source output
 | 
						|
#
 | 
						|
{
 | 
						|
    my $fhtml = new IO::File;
 | 
						|
    my $fsgml = new IO::File;
 | 
						|
 | 
						|
    my $lastsource = "";
 | 
						|
    foreach my $item (@site_order) {
 | 
						|
	my %item = %{$item};
 | 
						|
	my %source = %{$sources{$item{source}}};
 | 
						|
	if ($lastsource ne $item{source}) {
 | 
						|
 | 
						|
	    if ($lastsource) {
 | 
						|
		print $fhtml "</ul>\n";
 | 
						|
		print $fsgml "</ul>\n";
 | 
						|
 | 
						|
		open(FIN, "multimedia.html.post");
 | 
						|
		my @lines = <FIN>;
 | 
						|
		close(FIN);
 | 
						|
		print $fhtml @lines;
 | 
						|
		close($fhtml);
 | 
						|
 | 
						|
		open(FIN, "multimedia.sgml.post");
 | 
						|
		@lines = <FIN>;
 | 
						|
		close(FIN);
 | 
						|
		print $fsgml @lines;
 | 
						|
		close($fsgml);
 | 
						|
 | 
						|
	    }
 | 
						|
	    $createdhtml[$#createdhtml+1] = "source-$item{source}.html";
 | 
						|
	    $createdsgml[$#createdsgml+1] = "source-$item{source}.sgml";
 | 
						|
	    open($fhtml, ">source-$item{source}.html");
 | 
						|
	    open($fsgml, ">source-$item{source}.sgml");
 | 
						|
 | 
						|
	    open(FIN, "multimedia.html.pre");
 | 
						|
	    my @lines = <FIN>;
 | 
						|
	    close(FIN);
 | 
						|
	    print $fhtml @lines;
 | 
						|
	    open(FIN, "multimedia.html.intro");
 | 
						|
	    @lines = <FIN>;
 | 
						|
	    close(FIN);
 | 
						|
	    print $fhtml @lines;
 | 
						|
 | 
						|
	    open(FIN, "multimedia.sgml.pre");
 | 
						|
	    @lines = <FIN>;
 | 
						|
	    close(FIN);
 | 
						|
	    print $fsgml @lines;
 | 
						|
	    open(FIN, "multimedia.sgml.intro");
 | 
						|
	    @lines = <FIN>;
 | 
						|
	    close(FIN);
 | 
						|
	    print $fsgml @lines;
 | 
						|
 | 
						|
	    $lastsource = $item{source};
 | 
						|
	    print $fhtml "<h2 id=\"latest\">$source{name}</h2>\n<ul>\n";
 | 
						|
	    print $fsgml "<h2 id=\"latest\">$source{name}</h2>\n<ul>\n";
 | 
						|
	}
 | 
						|
	print_htmlitem($fhtml, \%item, \%source);
 | 
						|
	print_htmlitem($fsgml, \%item, \%source);
 | 
						|
 | 
						|
    }
 | 
						|
    print $fhtml "</ul>\n";
 | 
						|
    print $fsgml "</ul>\n";
 | 
						|
 | 
						|
    open(FIN, "multimedia.html.post");
 | 
						|
    my @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fhtml @lines;
 | 
						|
    close($fhtml);
 | 
						|
 | 
						|
    open(FIN, "multimedia.sgml.post");
 | 
						|
    @lines = <FIN>;
 | 
						|
    close(FIN);
 | 
						|
    print $fsgml @lines;
 | 
						|
    close($fsgml);
 | 
						|
}
 | 
						|
 | 
						|
#
 | 
						|
# XML output
 | 
						|
#
 | 
						|
{
 | 
						|
 | 
						|
    sub htmlentities {
 | 
						|
	my $s = shift;
 | 
						|
	$s =~ s/&/&/g;
 | 
						|
	$s =~ s/</</g;
 | 
						|
	$s =~ s/>/>/g;
 | 
						|
	return $s;;
 | 
						|
    }
 | 
						|
    sub printxml_multiple {
 | 
						|
	my $item = shift;
 | 
						|
	my %item = %{$item};
 | 
						|
	my $source = shift;
 | 
						|
	my %source = %{$source};
 | 
						|
	
 | 
						|
	return if ($item{fc}<0);
 | 
						|
 | 
						|
	for (my $i = 0; $i <= $item{fc}; $i++) {
 | 
						|
	    my %f = %{$item{files}{$i}};
 | 
						|
 | 
						|
	    my %tempitem = %item;
 | 
						|
	    $tempitem{title} .= " - $f{desc}";
 | 
						|
	    $f{url} = "$item{prefix}/$f{url}"
 | 
						|
		if (defined $item{prefix});
 | 
						|
	    printxml_single(\%tempitem, \%source, \%f);
 | 
						|
	}
 | 
						|
    }
 | 
						|
 | 
						|
    sub printxml_single {
 | 
						|
	my $item = shift;
 | 
						|
	my %item = %{$item};
 | 
						|
	my $source = shift;
 | 
						|
	my %source = %{$source};
 | 
						|
	my $file = shift;
 | 
						|
	my %file = %{$file};
 | 
						|
 | 
						|
	my $date = POSIX::strftime("%a, %d %b %Y %H:%M:%S %Z",
 | 
						|
	    0, 0, 0, substr($item{added}, 6, 2),
 | 
						|
	    substr($item{added}, 4, 2)-1, substr($item{added}, 0, 4)-1900);
 | 
						|
 | 
						|
	my $tags = join(", ", @{$item{tags}});
 | 
						|
	foreach my $tag (@{$file{tags}}) {
 | 
						|
	    $tags .= ", $tag";
 | 
						|
	}
 | 
						|
 | 
						|
	print FOUT "<item>\n";
 | 
						|
	print FOUT "<title>", htmlentities("$source{name} - $item{title}"), "</title>\n";
 | 
						|
	print FOUT "<guid>", htmlentities($file{url}), "</guid>\n";
 | 
						|
	print FOUT "<pubDate>$date</pubDate>\n";
 | 
						|
	print FOUT "<enclosure url=\"", htmlentities($file{url}), "\" length=\"1\" type=\"application/octet-stream\" />\n";
 | 
						|
	print FOUT "<description>";
 | 
						|
	print FOUT htmlentities("$item{title}<br/>From: $source{name}<br/>");
 | 
						|
	print FOUT htmlentities("Tags: $tags<br/>\n");
 | 
						|
	print FOUT htmlentities("$item{desc}");
 | 
						|
	print FOUT "</description>\n";
 | 
						|
	print FOUT "</item>\n";
 | 
						|
    }
 | 
						|
 | 
						|
    $createdxml[$#createdxml+1] = "multimedia.xml";
 | 
						|
    open(FOUT, ">multimedia.xml");
 | 
						|
 | 
						|
    my @s = stat("multimedia-input.xml");
 | 
						|
    my $date = POSIX::strftime("%a, %d %b %Y %H:%M:%S %Z", localtime($s[9]));
 | 
						|
 | 
						|
    print FOUT <<EOF;
 | 
						|
<rss version="2.0">
 | 
						|
<channel>
 | 
						|
<title>FreeBSD Multimedia Resources List</title>
 | 
						|
<description>FreeBSD Multimedia Resources</description>
 | 
						|
<link>http://www.FreeBSD.org/docs/multimedia.html</link>
 | 
						|
<lastBuildDate>$date</lastBuildDate>
 | 
						|
EOF
 | 
						|
 | 
						|
    foreach my $order (@date_order) {
 | 
						|
	my %item = %{$items[$order]};
 | 
						|
	my %source = %{$sources{$item{source}}};
 | 
						|
 | 
						|
	if (defined $item{overview}) {
 | 
						|
	    printxml_multiple(\%item, \%source);
 | 
						|
	} else {
 | 
						|
	    printxml_single(\%item, \%source, $item{files}{0});
 | 
						|
	}
 | 
						|
    }
 | 
						|
 | 
						|
    print FOUT <<EOF;
 | 
						|
</channel>
 | 
						|
</rss>
 | 
						|
EOF
 | 
						|
    close(FOUT);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
#
 | 
						|
# Created files
 | 
						|
#
 | 
						|
{
 | 
						|
    open(FOUT, ">multimedia.html.created");
 | 
						|
    foreach my $f (@createdhtml) {
 | 
						|
	print FOUT "$f\n";
 | 
						|
    }
 | 
						|
    close(FOUT);
 | 
						|
 | 
						|
    open(FOUT, ">multimedia.sgml.created");
 | 
						|
    foreach my $f (@createdsgml) {
 | 
						|
	print FOUT "$f\n";
 | 
						|
    }
 | 
						|
    close(FOUT);
 | 
						|
}
 |