## functions printing HTML: header, footer, error page
sub get_page_title {
- my $title = to_utf8($site_name);
-
+ # Formats:
+ # SITE_NAME
+ # SITE_NAME - projects in FILTER
+ # PROJECT - SITE_NAME
+ # PROJECT ACTION - SITE_NAME
+ # FILENAME - PROJECT ACTION - SITE_NAME
+ my $title;
unless (defined $project) {
+ $title = to_utf8($site_name);
if (defined $project_filter) {
$title .= " - projects in '" . esc_path($project_filter) . "'";
}
return $title;
}
- $title .= " - " . to_utf8($project);
-
- return $title unless (defined $action);
- $title .= "/$action"; # $action is US-ASCII (7bit ASCII)
+ $title = to_utf8($project);
- return $title unless (defined $file_name);
- $title .= " - " . esc_path($file_name);
- if ($action eq "tree" && $file_name !~ m|/$|) {
- $title .= "/";
+ if (defined $action) {
+ $title .= " $action"; # $action is US-ASCII (7bit ASCII)
+ if (defined $file_name) {
+ $title = " - " . $title;
+ if ($action eq "tree" && $file_name !~ m|/$|) {
+ $title = "/" . $title;
+ }
+ $title = esc_path($file_name) . $title;
+ }
}
- return $title;
-}
+ $title .= " - " . to_utf8($site_name);
-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';
- }
+ return $title;
}
sub print_feed_meta {
# 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";
+ print '<link rel="stylesheet" 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 '<link rel="stylesheet" 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 qq(<link rel="icon" href=").esc_url($favicon).qq("/>\n);
}
}
if ($use_pathinfo) {
$action .= "/".esc_url($project);
}
- print $cgi->start_form(-method => "get", -action => $action) .
- "<div class=\"search\">\n" .
+ print $cgi->start_form(-method => "get", -action => $action, -role => "search") .
(!$use_pathinfo &&
$cgi->input({-name=>"p", -value=>$project, -type=>"hidden"}) . "\n") .
$cgi->input({-name=>"a", -value=>"search", -type=>"hidden"}) . "\n" .
$cgi->checkbox(-name => 'sr', -value => 1, -label => 're',
-checked => $search_use_regexp) .
"</span>" .
- "</div>" .
$cgi->end_form() . "\n";
}
my %opts = @_;
my $title = get_page_title();
- my $content_type = get_content_type_html();
- print $cgi->header(-type=>$content_type, -charset => 'utf-8',
+ # I wanted to switch to text/html, but it uses nested <a> in a couple of places (e.g. log refs are links inside the commit summary link), which is invalid but works in the XML syntax. Pity.
+ # (Various other invalid HTML is produced that HTML would have fixed but XHTML allows to be broken, like table > tr, lacking tbody.)
+ # TODO: reduce the doctype to <!DOCTYPE html>, but that takes replacing entities like ⋅ with ⋅.
+ print $cgi->header(-type => 'application/xhtml+xml', -charset => 'utf-8',
-status=> $status, -expires => $expires)
unless ($opts{'-no_http_header'});
- my $mod_perl_version = $ENV{'MOD_PERL'} ? " $ENV{'MOD_PERL'}" : '';
print <<EOF;
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
-<!-- git web interface version $version, (C) 2005-2006, Kay Sievers <kay.sievers\@vrfy.org>, Christian Gierke -->
-<!-- git core binaries version $git_version -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-AU" lang="en-AU">
<head>
-<meta http-equiv="content-type" content="$content_type; charset=utf-8"/>
-<meta name="generator" content="gitweb/$version git/$git_version$mod_perl_version"/>
+<meta charset="utf-8"/>
<meta name="robots" content="index, nofollow"/>
<title>$title</title>
EOF
# the stylesheet, favicon etc urls won't work correctly with path_info
# unless we set the appropriate base URL
if ($ENV{'PATH_INFO'}) {
- print "<base href=\"".esc_url($base_url)."\" />\n";
+ print "<base href=\"".esc_url($base_url)."\"/>\n";
}
print_header_links($status);
print to_utf8($site_html_head_string);
}
- print "</head>\n" .
- "<body>\n";
-
if (defined $site_header && -f $site_header) {
insert_file($site_header);
}
- print "<div class=\"page_header\">\n";
+ print "</head>\n<body>\n<header class=\"page_header\">\n";
if (defined $logo) {
print $cgi->a({-href => esc_url($logo_url),
-title => $logo_label},
-class => "logo"}));
}
print_nav_breadcrumbs(%opts);
- print "</div>\n";
+ print "</header>\n";
+
+ print "<nav class=\"page_subhead\">\n";
+}
+sub git_end_subhead_html {
my $have_search = gitweb_check_feature('search');
if (defined $project && $have_search) {
print_search_form();
}
+ print "</nav>\n";
}
sub git_footer_html {
my $feed_class = 'rss_logo';
- print "<div class=\"page_footer\">\n";
+ print "<footer class=\"page_footer\">\n";
if (defined $project) {
my $descr = git_get_project_description($project);
if (defined $descr) {
project_filter => $project_filter),
-class => $feed_class}, "TXT") . "\n";
}
- print "</div>\n"; # class="page_footer"
+ print "</footer>\n"; # class="page_footer"
if (defined $t0 && gitweb_check_feature('timed')) {
print "<div id=\"generating_info\">\n";
$number_of_git_cmds.
'</span> git commands '.
" to generate.\n";
- print "</div>\n"; # class="page_footer"
+ print "</div>\n";
}
if (defined $site_footer && -f $site_footer) {
503 => '503 Service Unavailable',
);
git_header_html($http_responses{$status}, undef, %opts);
+ git_end_subhead_html();
print <<EOF;
<div class="page_body">
<br /><br />
sub git_print_page_nav {
my ($current, $suppress, $head, $treehead, $treebase, $extra) = @_;
- $extra = '' if !defined $extra; # pager or formats
my @navs = qw(summary shortlog log commit commitdiff tree);
if ($suppress) {
map { $_ eq $current ?
$_ : $cgi->a({-href => ($arg{$_}{_href} ? $arg{$_}{_href} : href(%{$arg{$_}}))}, "$_")
} @navs);
- print "<br/>\n$extra<br/>\n" .
- "</div>\n";
+ print "<br/>\n$extra" if defined $extra; # pager or formats
+ print "</div>\n";
+ git_end_subhead_html();
}
# returns a submenu for the navigation of the refs views (tags, heads,
@people = ('author', 'committer') unless @people;
foreach my $who (@people) {
my %wd = parse_date($co->{"${who}_epoch"}, $co->{"${who}_tz"});
- print "<tr><td>$who</td><td>" .
+ print "<tr><th>$who</th><td>" .
format_search_author($co->{"${who}_name"}, $who,
esc_html($co->{"${who}_name"})) . " " .
format_search_author($co->{"${who}_email"}, $who,
}
print "<div class=\"pre\">" .
$cgi->a({-href => $file_href.'#l'.$lno,
- -class => "linenr"}, sprintf('%4i', $lno)) .
- ' ' . $ltext . "</div>\n";
+ -class => "linenr"}, sprintf('%4i ', $lno)) .
+ $ltext . "</div>\n";
}
}
if ($lastfile) {
}
git_header_html();
+ git_end_subhead_html();
if (defined $home_text && -f $home_text) {
print "<div class=\"index_include\">\n";
insert_file($home_text);
git_header_html();
git_print_page_nav('summary','', $head);
- print "<div class=\"title\"> </div>\n";
print "<table class=\"projects_list\">\n" .
- "<tr id=\"metadata_desc\"><td>description</td><td>" . esc_html($descr) . "</td></tr>\n";
+ "<tr id=\"metadata_desc\"><th>description</th><td>" . esc_html($descr) . "</td></tr>\n";
if ($owner and not $omit_owner) {
- print "<tr id=\"metadata_owner\"><td>owner</td><td>" . esc_html($owner) . "</td></tr>\n";
+ print "<tr id=\"metadata_owner\"><th>owner</th><td>" . esc_html($owner) . "</td></tr>\n";
}
if (defined $cd{'rfc2822'}) {
- print "<tr id=\"metadata_lchange\"><td>last change</td>" .
+ print "<tr id=\"metadata_lchange\"><th>last change</th>" .
"<td>".format_timestamp_html(\%cd)."</td></tr>\n";
}
# without ability to add tags, don't show if there are none
my $cloud = git_populate_project_tagcloud($ctags);
print "<tr id=\"metadata_ctags\">" .
- "<td>content tags</td>" .
+ "<th>content tags</th>" .
"<td>".git_show_project_tagcloud($cloud, 48)."</td>" .
"</tr>\n";
}
print "<div class=\"title_text\">\n" .
"<table class=\"object_header\">\n" .
"<tr>\n" .
- "<td>object</td>\n" .
+ "<th>object</th>\n" .
"<td>" . $cgi->a({-class => "list", -href => href(action=>$tag{'type'}, hash=>$tag{'object'})},
$tag{'object'}) . "</td>\n" .
"<td class=\"link\">" . $cgi->a({-href => href(action=>$tag{'type'}, hash=>$tag{'object'})},
git_print_page_nav('','', $hash_base,$co{'tree'},$hash_base, $formats_nav);
git_print_header_div('commit', esc_html($co{'title'}), $hash_base);
} else {
- print "<div class=\"page_nav\">\n" .
- "<br/><br/></div>\n" .
- "<div class=\"title\">".esc_html($hash)."</div>\n";
+ git_end_subhead_html();
+ print "<div class=\"title\">".esc_html($hash)."</div>\n";
}
git_print_page_path($file_name, "blob", $hash_base);
print "<div class=\"page_body\">\n";
chomp $line;
$nr++;
$line = untabify($line);
- printf qq!<div class="pre"><a id="l%i" href="%s#l%i" class="linenr">%4i</a> %s</div>\n!,
+ printf qq!<div class="pre"><a id="l%i" href="%s#l%i" class="linenr">%4i </a>%s</div>\n!,
$nr, esc_attr(href(-replay => 1)), $nr, $nr,
$highlight ? sanitize($line) : esc_html($line, -nbsp=>1);
}
git_print_header_div('commit', esc_html($co{'title'}) . $ref, $hash_base);
} else {
undef $hash_base;
- print "<div class=\"page_nav\">\n";
- print "<br/><br/></div>\n";
+ git_end_subhead_html();
print "<div class=\"title\">".esc_html($hash)."</div>\n";
}
if (defined $file_name) {
print "<div class=\"title_text\">\n" .
"<table class=\"object_header\">\n";
git_print_authorship_rows(\%co);
- print "<tr><td>commit</td><td class=\"sha1\">$co{'id'}</td></tr>\n";
+ print "<tr><th>commit</th><td class=\"sha1\">$co{'id'}</td></tr>\n";
print "<tr>" .
- "<td>tree</td>" .
+ "<th>tree</th>" .
"<td class=\"sha1\">" .
$cgi->a({-href => href(action=>"tree", hash=>$co{'tree'}, hash_base=>$hash),
class => "list"}, $co{'tree'}) .
foreach my $par (@$parents) {
print "<tr>" .
- "<td>parent</td>" .
+ "<th>parent</th>" .
"<td class=\"sha1\">" .
$cgi->a({-href => href(action=>"commit", hash=>$par),
class => "list"}, $par) .
git_print_page_nav('','', $hash_base,$co{'tree'},$hash_base, $formats_nav);
git_print_header_div('commit', esc_html($co{'title'}), $hash_base);
} else {
- print "<div class=\"page_nav\"><br/>$formats_nav<br/></div>\n";
+ print "<div class=\"page_nav\"><br/>$formats_nav</div>\n";
+ git_end_subhead_html();
print "<div class=\"title\">".esc_html("$hash vs $hash_parent")."</div>\n";
}
if (defined $file_name) {