The description for URLs is no longer optional, and the indentation depth should be multiplied by two, not three, to yield the appropriate number of spaces.
		
			
				
	
	
		
			275 lines
		
	
	
	
		
			5.7 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			275 lines
		
	
	
	
		
			5.7 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable file
		
	
	
	
	
| #!/usr/bin/perl -w
 | |
| # $FreeBSD$
 | |
| 
 | |
| require "./cgi-style.pl";
 | |
| 
 | |
| use CGI qw(:all);
 | |
| use strict;
 | |
| 
 | |
| my $Submit = param("Submit");
 | |
| my $debug  = param("debug") || "";
 | |
| 
 | |
| my $NumDevelopers = 3;
 | |
| my $NumLinks      = 4;
 | |
| my $NumSponsors   = 2;
 | |
| my $NumTasks      = 5;
 | |
| 
 | |
| my @messages;
 | |
| 
 | |
| #
 | |
| # Routine to format some xml nicely
 | |
| #
 | |
| sub xml
 | |
| {
 | |
| 	my($Indent, $TagEtc, @Text) = @_;
 | |
| 
 | |
| 	my($Tag, $Etc) = split(' ', $TagEtc, 2);
 | |
| 
 | |
| 	my $Spaces = " " x ($Indent*2);
 | |
| 	if (!@Text)
 | |
| 	{
 | |
| 		# No text in the tag
 | |
| 		return ("$Spaces<$TagEtc />\n");
 | |
| 	}
 | |
| 	elsif (@Text == 1)
 | |
| 	{
 | |
| 		# Bottom level tag - output on one line
 | |
| 		return ("$Spaces<$TagEtc>@Text</$Tag>\n");
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		# This is not a bottom level tag - output a new line after
 | |
| 		# starting tag
 | |
| 		return ("$Spaces<$TagEtc>\n",
 | |
| 				@Text,
 | |
| 				"$Spaces</$Tag>\n");
 | |
| 	}
 | |
| }
 | |
| 
 | |
| #
 | |
| # As above to format indented text but no tag
 | |
| #
 | |
| sub xmltext
 | |
| {
 | |
| 	my($Indent, @Text) = @_;
 | |
| 
 | |
| 	my $Spaces = " " x ($Indent*2);
 | |
| 
 | |
| 	return map { "$Spaces$_\n" } @Text;
 | |
| }
 | |
| 
 | |
| if ($Submit)
 | |
| {
 | |
| 	my $errors = 0;
 | |
| 
 | |
| 	my @hidden;
 | |
| 
 | |
| 	my $Project = param("Project") || "";
 | |
| 	my $Category = param("Category") || "misc";
 | |
| 	push(@hidden, hidden("Project"));
 | |
| 
 | |
| 	my @contacts;
 | |
| 	foreach my $Num (1..$NumDevelopers)
 | |
| 	{
 | |
| 		my $fname = param("FirstName$Num") || "";
 | |
| 		my $lname = param("LastName$Num")  || "";
 | |
| 		my $email = param("Email$Num")     || "";
 | |
| 
 | |
| 		push(@hidden, hidden("FirstName$Num"));
 | |
| 		push(@hidden, hidden("LastName$Num"));
 | |
| 		push(@hidden, hidden("Email$Num"));
 | |
| 
 | |
| 		next unless $fname || $lname || $email;
 | |
| 
 | |
| 		my @name;
 | |
| 		push(@name, xml(4, 'given',  $fname)) if $fname;
 | |
| 		push(@name, xml(4, 'common', $lname)) if $lname;
 | |
| 
 | |
| 		my @person;
 | |
| 		push(@person, xml(3, 'name',  "", @name))  if @name;
 | |
| 		push(@person, xml(3, 'email', $email)) if $email;
 | |
| 
 | |
| 		push(@contacts, xml(2, 'person', "", @person));
 | |
| 	}
 | |
| 
 | |
| 	if (!@contacts)
 | |
| 	{
 | |
| 		++$errors;
 | |
| 		push(@messages, b("Please specify at least one contact"));
 | |
| 	}
 | |
| 
 | |
| 	my @links;
 | |
| 	foreach my $Num (1..$NumLinks)
 | |
| 	{
 | |
| 		my $url  = param("Url$Num")  || "";
 | |
| 		my $desc = param("Desc$Num") || "";
 | |
| 
 | |
| 		push(@hidden, hidden("Url$Num"));
 | |
| 		push(@hidden, hidden("Desc$Num"));
 | |
| 
 | |
| 		next unless $url;
 | |
| 		my @link;
 | |
| 		if ($desc)
 | |
| 		{
 | |
| 			push(@links, xml(2, "url href=\"$url\"", $desc));
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			push(@links, xml(2, "url href=\"$url\""));
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	my @sponsors;
 | |
| 	foreach my $Num (1..$NumSponsors)
 | |
| 	{
 | |
| 		my $sponsor = param("Sponsor$Num")  || "";
 | |
| 		push(@hidden, hidden("Sponsor$Num"));
 | |
| 
 | |
| 		next unless $sponsor;
 | |
| 		push(@sponsors, xml(1, "sponsor", "", xmltext(2, $sponsor)));
 | |
| 	}
 | |
| 
 | |
| 	if (@sponsors)
 | |
| 	{
 | |
| 		push(@sponsors, "\n");
 | |
| 	}
 | |
| 
 | |
| 	my @tasks;
 | |
| 	foreach my $Num (1..$NumTasks)
 | |
| 	{
 | |
| 		my $desc = param("Task$Num") || "";
 | |
| 		$desc =~ s/\r//g;
 | |
| 		my @desc = split("\n", $desc);
 | |
| 
 | |
| 		push(@hidden, hidden("Task$Num"));
 | |
| 
 | |
| 		next unless $desc;
 | |
|                 push(@tasks, xml(2, "task", "",xmltext(3, @desc)));
 | |
| 	}
 | |
| 
 | |
| 	my $info = param("SubmittedInfo") || "";
 | |
| 	push(@hidden, hidden("SubmittedInfo"));
 | |
| 
 | |
| 	$info =~ s/\r//g;
 | |
| 	my @info = split("\n", $info);
 | |
| 
 | |
| 	my $title = "FreeBSD project submission output";
 | |
| 
 | |
| 	my @contents = xml(0, "project cat=\'$Category\'",
 | |
| 	    xml(1, "title", $Project),
 | |
| 	    "\n",
 | |
| 	    xml(1, "contact", "", @contacts),
 | |
| 	    "\n",
 | |
|             xml(1, "links", "", @links),
 | |
|             "\n",
 | |
|             xml(1, "body",
 | |
|                 xml(2, "p", "", xmltext(3, @info))),
 | |
|             "\n",
 | |
|             @sponsors,
 | |
|             xml(1, "help", "", @tasks),
 | |
|         );
 | |
| 	my $contents = join('', @contents);
 | |
| 
 | |
| 	$contents = "<!-- Mail as an attachment to: monthly\@freebsd.org -->\n$contents";
 | |
| 
 | |
| 	if (!$errors)
 | |
| 	{
 | |
|                 print "Content-Type: text/plain\n\n";
 | |
|                 print $contents;
 | |
|                 exit;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| my @DeveloperTable;
 | |
| foreach my $Num (1..$NumDevelopers)
 | |
| {
 | |
| 	push(@DeveloperTable,
 | |
| 		 TR(td(textfield(-name => "FirstName$Num", -size => 20)),
 | |
| 			td(textfield(-name => "LastName$Num",  -size => 20)),
 | |
| 			td(textfield(-name => "Email$Num",     -size => 32))));
 | |
| }
 | |
| 
 | |
| my @LinksTable;
 | |
| foreach my $Num (1..$NumLinks)
 | |
| {
 | |
| 	push(@LinksTable,
 | |
| 		 TR(td(textfield(-name => "Url$Num",      -size => 55)),
 | |
| 			td(textfield(-name => "Desc$Num",     -size => 20))));
 | |
| }
 | |
| 
 | |
| my @SponsorTable;
 | |
| foreach my $Num (1..$NumSponsors)
 | |
| {
 | |
| 	push(@SponsorTable,
 | |
| 		 TR(td(textarea(-name => "Sponsor$Num", -rows => 1, -cols => 60))));
 | |
| }
 | |
| 
 | |
| my @TaskTable;
 | |
| foreach my $Num (1..$NumTasks)
 | |
| {
 | |
| 	push(@TaskTable,
 | |
| 		 TR(td(textarea(-name => "Task$Num", -rows => 3, -cols => 60))));
 | |
| }
 | |
| 
 | |
| print
 | |
|   (html_header("Submitting a FreeBSD Project Status Report"),
 | |
|    hr,
 | |
|    join("<BR>\n", @messages, ""),
 | |
|    p("To submit status information about a FreeBSD project, fill out the",
 | |
|        " following:"),
 | |
|    start_form(),
 | |
| 
 | |
|    h3("Project:"),
 | |
|    textfield(-name => "Project", -size => "32"),
 | |
| 
 | |
|    h3("Category:"),
 | |
|    popup_menu(-name => "Category",
 | |
|        -values => ['proj', 'docs', 'kern', 'bin', 'arch', 'ports', 'vendor',
 | |
|         'misc', 'soc', 'team'], -default => 'proj'),
 | |
| 
 | |
|    h3("Developers:"),
 | |
|    blockquote(table({"BORDER" => 0,
 | |
| 					 "COLS"   => 3,
 | |
| 					 "NOSAVE" => 1},
 | |
| 					TR(td("First Name"),
 | |
| 					   td("Family Name"),
 | |
| 					   td("Email address")),
 | |
| 					@DeveloperTable)),
 | |
| 
 | |
|    h3("Links:"),
 | |
|    blockquote(table({"BORDER" => 0,
 | |
| 					 "COLS"   => 2,
 | |
| 					 "NOSAVE" => 1},
 | |
| 					TR(td("Url"),
 | |
| 					   td("Description")),
 | |
| 					@LinksTable)),
 | |
| 
 | |
|    h3("Present status:"),
 | |
|    p("You can use "simple" HTML tags (e.g. <p>, ",
 | |
|        "<em>, <strong> and <a href=... >) to format."),
 | |
|    blockquote(textarea(-name => "SubmittedInfo",
 | |
| 					   -rows => 7,
 | |
| 					   -cols => 60)),
 | |
| 
 | |
|    h3("Sponsors (optional):"),
 | |
|    blockquote(table({"BORDER" => 0,
 | |
| 					 "COLS"   => 1,
 | |
| 					 "NOSAVE" => 1},
 | |
| 					TR(td("Name")),
 | |
| 					@SponsorTable)),
 | |
| 
 | |
|    h3("Open tasks (optional):"),
 | |
|    blockquote(table({"BORDER" => 0,
 | |
| 					 "COLS"   => 5,
 | |
| 					 "NOSAVE" => 1},
 | |
| 					TR(td("Description")),
 | |
| 					@TaskTable)),
 | |
| 
 | |
| 
 | |
|    submit(-name => "Submit", -label => "Download XML"),
 | |
|    reset(-value => "Reset"),
 | |
|    br,
 | |
|    end_form(),
 | |
|    html_footer());
 | |
| 
 | |
| __END__
 |