gitweb: Refactor git_header_html

Extract the following parts into separate subroutines:

 * finding correct MIME content type for HTML pages (text/html or
   application/xhtml+xml?) into get_content_type_html()
 * printing <link ...> elements in HTML head into print_header_links()
 * printing navigation "breadcrumbs" for given action into
   print_nav_breadcrumbs()
 * printing search form into print_search_form()

This reduces git_header_html to two pages long (53 lines), making gitweb
code easier to read.

Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jakub Narebski 2011-06-22 13:50:46 +02:00 committed by Junio C Hamano
parent 2765233c64
commit 6ee9033d67

View File

@ -3683,6 +3683,20 @@ sub get_page_title {
return $title; return $title;
} }
sub get_content_type_html {
# require explicit support from the UA if we are to send the page as
# 'application/xhtml+xml', otherwise send it as plain old 'text/html'.
# we have to do this because MSIE sometimes globs '*/*', pretending to
# support xhtml+xml but choking when it gets what it asked for.
if (defined $cgi->http('HTTP_ACCEPT') &&
$cgi->http('HTTP_ACCEPT') =~ m/(,|;|\s|^)application\/xhtml\+xml(,|;|\s|$)/ &&
$cgi->Accept('application/xhtml+xml') != 0) {
return 'application/xhtml+xml';
} else {
return 'text/html';
}
}
sub print_feed_meta { sub print_feed_meta {
if (defined $project) { if (defined $project) {
my %href_params = get_feed_info(); my %href_params = get_feed_info();
@ -3728,24 +3742,90 @@ sub print_feed_meta {
} }
} }
sub print_header_links {
my $status = shift;
# print out each stylesheet that exist, providing backwards capability
# for those people who defined $stylesheet in a config file
if (defined $stylesheet) {
print '<link rel="stylesheet" type="text/css" href="'.esc_url($stylesheet).'"/>'."\n";
} else {
foreach my $stylesheet (@stylesheets) {
next unless $stylesheet;
print '<link rel="stylesheet" type="text/css" href="'.esc_url($stylesheet).'"/>'."\n";
}
}
print_feed_meta()
if ($status eq '200 OK');
if (defined $favicon) {
print qq(<link rel="shortcut icon" href=").esc_url($favicon).qq(" type="image/png" />\n);
}
}
sub print_nav_breadcrumbs {
my %opts = @_;
print $cgi->a({-href => esc_url($home_link)}, $home_link_str) . " / ";
if (defined $project) {
print $cgi->a({-href => href(action=>"summary")}, esc_html($project));
if (defined $action) {
my $action_print = $action ;
if (defined $opts{-action_extra}) {
$action_print = $cgi->a({-href => href(action=>$action)},
$action);
}
print " / $action_print";
}
if (defined $opts{-action_extra}) {
print " / $opts{-action_extra}";
}
print "\n";
}
}
sub print_search_form {
if (!defined $searchtext) {
$searchtext = "";
}
my $search_hash;
if (defined $hash_base) {
$search_hash = $hash_base;
} elsif (defined $hash) {
$search_hash = $hash;
} else {
$search_hash = "HEAD";
}
my $action = $my_uri;
my $use_pathinfo = gitweb_check_feature('pathinfo');
if ($use_pathinfo) {
$action .= "/".esc_url($project);
}
print $cgi->startform(-method => "get", -action => $action) .
"<div class=\"search\">\n" .
(!$use_pathinfo &&
$cgi->input({-name=>"p", -value=>$project, -type=>"hidden"}) . "\n") .
$cgi->input({-name=>"a", -value=>"search", -type=>"hidden"}) . "\n" .
$cgi->input({-name=>"h", -value=>$search_hash, -type=>"hidden"}) . "\n" .
$cgi->popup_menu(-name => 'st', -default => 'commit',
-values => ['commit', 'grep', 'author', 'committer', 'pickaxe']) .
$cgi->sup($cgi->a({-href => href(action=>"search_help")}, "?")) .
" search:\n",
$cgi->textfield(-name => "s", -value => $searchtext) . "\n" .
"<span title=\"Extended regular expression\">" .
$cgi->checkbox(-name => 'sr', -value => 1, -label => 're',
-checked => $search_use_regexp) .
"</span>" .
"</div>" .
$cgi->end_form() . "\n";
}
sub git_header_html { sub git_header_html {
my $status = shift || "200 OK"; my $status = shift || "200 OK";
my $expires = shift; my $expires = shift;
my %opts = @_; my %opts = @_;
my $title = get_page_title(); my $title = get_page_title();
my $content_type; my $content_type = get_content_type_html();
# require explicit support from the UA if we are to send the page as
# 'application/xhtml+xml', otherwise send it as plain old 'text/html'.
# we have to do this because MSIE sometimes globs '*/*', pretending to
# support xhtml+xml but choking when it gets what it asked for.
if (defined $cgi->http('HTTP_ACCEPT') &&
$cgi->http('HTTP_ACCEPT') =~ m/(,|;|\s|^)application\/xhtml\+xml(,|;|\s|$)/ &&
$cgi->Accept('application/xhtml+xml') != 0) {
$content_type = 'application/xhtml+xml';
} else {
$content_type = 'text/html';
}
print $cgi->header(-type=>$content_type, -charset => 'utf-8', print $cgi->header(-type=>$content_type, -charset => 'utf-8',
-status=> $status, -expires => $expires) -status=> $status, -expires => $expires)
unless ($opts{'-no_http_header'}); unless ($opts{'-no_http_header'});
@ -3767,22 +3847,7 @@ EOF
if ($ENV{'PATH_INFO'}) { if ($ENV{'PATH_INFO'}) {
print "<base href=\"".esc_url($base_url)."\" />\n"; print "<base href=\"".esc_url($base_url)."\" />\n";
} }
# print out each stylesheet that exist, providing backwards capability print_header_links($status);
# for those people who defined $stylesheet in a config file
if (defined $stylesheet) {
print '<link rel="stylesheet" type="text/css" href="'.esc_url($stylesheet).'"/>'."\n";
} else {
foreach my $stylesheet (@stylesheets) {
next unless $stylesheet;
print '<link rel="stylesheet" type="text/css" href="'.esc_url($stylesheet).'"/>'."\n";
}
}
print_feed_meta()
if ($status eq '200 OK');
if (defined $favicon) {
print qq(<link rel="shortcut icon" href=").esc_url($favicon).qq(" type="image/png" />\n);
}
print "</head>\n" . print "</head>\n" .
"<body>\n"; "<body>\n";
@ -3799,59 +3864,12 @@ EOF
-alt => "git", -alt => "git",
-class => "logo"})); -class => "logo"}));
} }
print $cgi->a({-href => esc_url($home_link)}, $home_link_str) . " / "; print_nav_breadcrumbs(%opts);
if (defined $project) {
print $cgi->a({-href => href(action=>"summary")}, esc_html($project));
if (defined $action) {
my $action_print = $action ;
if (defined $opts{-action_extra}) {
$action_print = $cgi->a({-href => href(action=>$action)},
$action);
}
print " / $action_print";
}
if (defined $opts{-action_extra}) {
print " / $opts{-action_extra}";
}
print "\n";
}
print "</div>\n"; print "</div>\n";
my $have_search = gitweb_check_feature('search'); my $have_search = gitweb_check_feature('search');
if (defined $project && $have_search) { if (defined $project && $have_search) {
if (!defined $searchtext) { print_search_form();
$searchtext = "";
}
my $search_hash;
if (defined $hash_base) {
$search_hash = $hash_base;
} elsif (defined $hash) {
$search_hash = $hash;
} else {
$search_hash = "HEAD";
}
my $action = $my_uri;
my $use_pathinfo = gitweb_check_feature('pathinfo');
if ($use_pathinfo) {
$action .= "/".esc_url($project);
}
print $cgi->startform(-method => "get", -action => $action) .
"<div class=\"search\">\n" .
(!$use_pathinfo &&
$cgi->input({-name=>"p", -value=>$project, -type=>"hidden"}) . "\n") .
$cgi->input({-name=>"a", -value=>"search", -type=>"hidden"}) . "\n" .
$cgi->input({-name=>"h", -value=>$search_hash, -type=>"hidden"}) . "\n" .
$cgi->popup_menu(-name => 'st', -default => 'commit',
-values => ['commit', 'grep', 'author', 'committer', 'pickaxe']) .
$cgi->sup($cgi->a({-href => href(action=>"search_help")}, "?")) .
" search:\n",
$cgi->textfield(-name => "s", -value => $searchtext) . "\n" .
"<span title=\"Extended regular expression\">" .
$cgi->checkbox(-name => 'sr', -value => 1, -label => 're',
-checked => $search_use_regexp) .
"</span>" .
"</div>" .
$cgi->end_form() . "\n";
} }
} }