cvs
[MyWeb.git] / Project.pm
1 # $Id$
2 # Common functions for HTML/XHTML output generation
3 # Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
4
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; exactly version 2 of June 1991 is required
8
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
18
19 package My::Project;
20 require 5.6.0;  # at least 'use warnings;' but we need some 5.6.0+ modules anyway
21 our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
22 our $CVS_ID=q$Id$;
23 use strict;
24 use warnings;
25
26 use My::Web;
27
28 use Exporter;
29 our @EXPORT=qw();
30 our @ISA=qw(My::Web Exporter);
31
32
33 sub print_project ($)
34 {
35 my($class,$ListItem)=@_;
36
37         print "<h1>".$ListItem->{"name"}."</h1>\n";
38         print $ListItem->{"description"};
39         print "<hr />\n";
40         my @table=(
41                 {"key"=>qr(^download\b),"text"=>sub ($) {
42                                                 $_[0]=~s/^download//;
43                                                 $_[0]=~s/^-/ /;
44                                                 return "Download".$_[0];
45                                                 },
46                                 "format"=>sub ($) {
47                                                 my $r;
48                                                 if ($_[0]=~m#^[a-z]+://#) {
49                                                         $r=a_href($_[0],CGI::escapeHTML($_[0]));
50                                                         }
51                                                 else {
52                                                         $r=a_href($_[0],CGI::escapeHTML(File::Basename::basename($_[0])));
53                                                         my $size=(stat $_[0])[7];
54                                                         die "Cannot stat \"".$_[0]."\": $!" if !defined $size;
55                                                                  if ($size>=1024*1024) { $size=int($size/(1024*1024))." MB"; }
56                                                         elsif ($size>=1024     ) { $size=int($size/(1024     ))." KB"; }
57                                                         else                     { $size=int($size            )." B"; }
58                                                         $r.=" ($size)";
59                                                         }
60                                                 return $r;
61                                                 }},
62                 {"key"=>qr(^link\b),"text"=>sub ($) {
63                                                 $_[0]=~s/^link-//;
64                                                 return $_[0];
65                                                 },
66                                 "format"=>sub ($) {
67                                                 return a_href($_[0],CGI::escapeHTML($_[0]));
68                                                 }},
69                 {"key"=>qr(^cvs\b),"text"=>sub ($) {
70                                                 $_[0]=~s/^cvs//;
71                                                 $_[0]=~s/^-/ /;
72                                                 return "CVS".$_[0];
73                                                 },
74                                 "format"=>sub ($$) {
75                                                 my($val,$key)=@_;
76                                                 $key=~s/^cvs//;
77                                                 $key=~s/^-/ /;
78                                                 my $branch="";
79                                                 $branch=$1 if $val=~s/:(.*)//;
80                                                 return join("<br />\n\t\t",
81                                                                 CGI::escapeHTML("cvs -d ".$W->{"pserver"}.":".$W->{"pserver_path"}." -z3"
82                                                                                 ." checkout".(!$branch ? "" : " -r $branch -kk")
83                                                                                 .($val!~m#/# ? "" : " -d ".File::Basename::basename($val))
84                                                                                 ." $val"),
85                                                                 map({ a_href($_->[1],$_->[0]); }
86                                                                                 ["ViewCVS CVS repository",$W->{"project_viewcvs"}.$val."/".(!$branch ? "" : '?only_with_tag='.$branch)],
87                                                                                 ["Download CVS snapshot" ,
88                                                                                                 $W->{"project_viewcvs"}.$val."/".File::Basename::basename($val).".tar.gz?tarball=1"
89                                                                                                                 .(!$branch ? "" : '&only_with_tag='.$branch)],
90                                                                                 ["CVS ChangeLog"         ,$W->{"top_dir"}."/project/ChangeLog.txt.pl?cvs=$val"]));
91                                                 }},
92                 {"key"=>"summary","text"=>"Summary"},
93                 {"key"=>"ownership","text"=>"Ownership"},
94                 {"key"=>"license","text"=>"License","format"=>sub ($) {
95                                 my %known=(
96                                                 "PD"=>"Public Domain",
97                                                 "GPL"=>a_href("http://www.gnu.org/licenses/gpl.html","GNU General Public License"),
98                                                 "LGPL"=>a_href("http://www.gnu.org/licenses/lgpl.html","GNU Lesser General Public License"),
99                                                 "com"=>"Commercial"
100                                                 );
101                                 return $known{$_[0]};
102                                 }},
103                 {"key"=>"maintenance","text"=>"State","format"=>sub ($) {
104                                 my %known=(
105                                                 "active"=>"Ready to use and the package is being actively developed.",
106                                                 "ready"=>"Ready to use although no longer being actively developed.",
107                                                 "dead"=>"Dead code, no longer supported.",
108                                                 "merge"=>"Functions belong to existing other project.",
109                                                 "obsolete"=>"Obsoleted.",
110                                                 "update"=>"Package needs updating to recent software.",
111                                                 "accepted"=>"This patch got already integrated by the original package maintainer.",
112                                                 ""=>"",
113                                                 );
114                                 my @r;
115                                 for ($known{($_[0]=~/^([^-]*)-?/)[0] || ""}) {
116                                         push @r,$_ if $_;
117                                         push @r," $'" if $';
118                                         }
119                                 return join(" ",@r);
120                                 }},
121                 {"key"=>"sponsorship","text"=>"Sponsoring Company"},
122                 {"key"=>"language","text"=>"Programming language","format"=>sub ($) {
123                                 return a_href("http://java.sun.com/",CGI::escapeHTML($_[0]))
124                                                 if $_[0]=~/^Java\b/;
125                                 return a_href("http://www.php.net/",CGI::escapeHTML($_[0]))
126                                                 if $_[0]=~/^PHP\b/;
127                                 return undef();
128                                 }},
129                 );
130
131 sub tableit_func
132 {
133 my($tableit,$val,$key,$ListItem)=@_;
134
135         delete $ListItem->{$key};
136         my $r="";
137         $r.="<tr>";
138                 if ($tableit->{"text"}) {
139                         $r.="<td>";
140                                 $r.=(!ref $_ ? $_ : &{$_}($key)) for ($tableit->{"text"});
141                         $r.="</td>";
142                         }
143                 if ($tableit->{"format"}) {
144                         do { $val=$_ if defined $_; } for (&{$tableit->{"format"}}($val,$key));
145                         }
146                 return join("",map("<tr><td>".$_->[0]."</td><td>".$_->[1]."</td></tr>\n",@$val))
147                                 if ref $val;
148                 $r.="<td>$val</td>";
149         $r.="</tr>\n";
150 }
151
152         print '<table border="0" class="print_project">'."\n";
153                 for my $tableit (@table) {
154                         if (!ref $tableit->{"key"}) {
155                                 print tableit_func($tableit,$ListItem->{$tableit->{"key"}},$tableit->{"key"},$ListItem)
156                                                 if $ListItem->{$tableit->{"key"}};
157                                 }
158                         else {
159                                 for my $key (@{$ListItem->{"keys_array"}}) {
160                                         my $keyregex=$tableit->{"key"};
161                                         next if $key!~/$keyregex/;
162                                         print tableit_func($tableit,$ListItem->{$key},$key,$ListItem);
163                                         }
164                                 }
165                         }
166         print "</table>\n";
167         print vskip;
168 }
169
170 sub project_arr_to_hash (@)
171 {
172 my(@arr)=@_;
173
174         return (
175                         @arr,
176                         "keys_array"=>[ My::Web::arr_keys(@arr) ],
177                         );
178 }
179
180 # $args{"ListItem"}=\%...;
181 sub init_project ($%)
182 {
183 my($class,%args)=@_;
184
185         my $ListItem={ project_arr_to_hash(@{$args{"ListItem"}}) };
186         my $name=$ListItem->{"name"};
187         $name=~s#<a\s[^>]*>([^<]*)</a>#$1#g;
188         my $W=$class->init(
189                         "title"=>$name,
190                         %args,
191                         "head_css"=>($args{"head_css"} || "")."
192 table.print_project td { vertical-align: top; }
193 ",
194                         );
195         $class->heading();
196         $class->print_project({ %$ListItem });
197         return $W;
198 }
199
200 1;