'override' => 0,
'default' => [0]},
- # Enable and configure ability to change common timezone for dates
- # in gitweb output via JavaScript. Enabled by default.
- # Project specific override is not supported.
- 'javascript-timezone' => {
- 'override' => 0,
- 'default' => [
- 'local', # default timezone: 'utc', 'local', or '(-|+)HHMM' format,
- # or undef to turn off this feature
- 'gitweb_tz', # name of cookie where to store selected timezone
- 'datetime', # CSS class used to mark up dates for manipulation
- ]},
-
# Syntax highlighting support. This is based on Daniel Svensson's
# and Sham Chukoury's work in gitweb-xmms2.git.
# It requires the 'highlight' program present in $PATH,
$out .= esc_html(substr($str, $pos, $begin - $pos), %opts)
if ($begin - $pos > 0);
- $out .= $cgi->span({-class => $css_class}, $escaped);
+ $out .= "<mark class=\"$css_class\">$escaped</mark>";
$pos = $end;
}
my @matches = matchpos_list($str, $regexp);
return esc_html($str) unless @matches;
- return esc_html_hl_regions($str, 'match', @matches);
+ return esc_html_hl_regions($str, undef, @matches);
}
push @filtered, $m;
}
- return esc_html_hl_regions($chopped . $tail, 'match', @filtered);
+ return esc_html_hl_regions($chopped . $tail, undef, @filtered);
}
## ----------------------------------------------------------------------
$title =~ s/^/ /g;
$title =~ s/$/ /g;
if (defined $matched && $matched eq $ctag) {
- $title = qq(<span class="match">$title</span>);
+ $title = qq(<mark>$title</mark>);
}
$cloud->add($title, href(project=>undef, ctag=>$ctag),
$ctags_lc{$ctag}->{count});
foreach my $ctag (keys %ctags_lc) {
my $title = esc_html($ctags_lc{$ctag}->{topname}, -nbsp=>1);
if (defined $matched && $matched eq $ctag) {
- $title = qq(<span class="match">$title</span>);
+ $title = qq(<mark>$title</mark>);
}
$cloud->{$ctag}{count} = $ctags_lc{$ctag}->{count};
$cloud->{$ctag}{ctag} =
$co{'age'} = $age;
$co{'age_string'} = age_string($age);
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = gmtime($co{'committer_epoch'});
+ $co{'age_string_iso8601'} = sprintf "%4i-%02u-%02i %02u:%02u:%02uZ", 1900 + $year, $mon+1, $mday, $hour, $min, $sec;
if ($age > 60*60*24*7*2) {
$co{'age_string_date'} = sprintf "%4i-%02u-%02i", 1900 + $year, $mon+1, $mday;
- $co{'age_string_age'} = $co{'age_string'};
+ $co{'age_string_age'} = "$co{'age_string_iso8601'} ($co{'age_string'})";
} else {
$co{'age_string_date'} = $co{'age_string'};
- $co{'age_string_age'} = sprintf "%4i-%02u-%02i", 1900 + $year, $mon+1, $mday;
+ $co{'age_string_age'} = $co{'age_string_iso8601'};
}
return %co;
}
} else {
printf('<link rel="alternate" title="%s projects list" '.
'href="%s" type="text/plain; charset=utf-8" />'."\n",
- esc_attr($site_name),
+ esc_attr(to_utf8($site_name)),
esc_attr(href(project=>undef, action=>"project_index")));
printf('<link rel="alternate" title="%s projects feeds" '.
'href="%s" type="text/x-opml" />'."\n",
- esc_attr($site_name),
+ esc_attr(to_utf8($site_name)),
esc_attr(href(project=>undef, action=>"opml")));
}
}
print $cgi->a({-href => href(project => undef,
project_filter => $dirprefix,
action => "project_list")},
- esc_html($part)) . " / ";
+ esc_html($part)) . "/";
}
}
sub print_nav_breadcrumbs {
my %opts = @_;
+ my $sep = to_utf8(" › ");
+ my $first = 1;
for my $crumb (@extra_breadcrumbs, [ $home_link_str => $home_link ]) {
- print $cgi->a({-href => esc_url($crumb->[1])}, $crumb->[0]) . " / ";
+ print $sep unless $first;
+ $first = 0;
+ print $cgi->a({-href => esc_url($crumb->[1])}, $crumb->[0]);
}
if (defined $project) {
my @dirname = split '/', $project;
my $projectbasename = pop @dirname;
+ print $sep;
print_nav_breadcrumbs_path(@dirname);
print $cgi->a({-href => href(action=>"summary")}, esc_html($projectbasename));
if (defined $action) {
$action_print = $cgi->a({-href => href(action=>$action)},
$action);
}
- print " / $action_print";
+ print "$sep$action_print";
}
if (defined $opts{-action_extra}) {
- print " / $opts{-action_extra}";
+ print "$sep$opts{-action_extra}";
}
print "\n";
} elsif (defined $project_filter) {
+ print $sep;
print_nav_breadcrumbs_path(split '/', $project_filter);
}
}
insert_file($site_footer);
}
- print qq!<script type="text/javascript" src="!.esc_url($javascript).qq!"></script>\n!;
if (defined $action &&
$action eq 'blame_incremental') {
- print qq!<script type="text/javascript">\n!.
+ print qq!<script src="!.esc_url($javascript).qq!"></script>\n!;
+ print qq!<script>\n!.
qq!startBlame("!. esc_attr(href(action=>"blame_data", -replay=>1)) .qq!",\n!.
qq! "!. esc_attr(href()) .qq!");\n!.
qq!</script>\n!;
} else {
- my ($jstimezone, $tz_cookie, $datetime_class) =
- gitweb_get_feature('javascript-timezone');
-
- print qq!<script type="text/javascript">\n!.
- qq!window.onload = function () {\n!;
if (gitweb_check_feature('javascript-actions')) {
- print qq! fixLinks();\n!;
- }
- if ($jstimezone && $tz_cookie && $datetime_class) {
- print qq! var tz_cookie = { name: '$tz_cookie', expires: 14, path: '/' };\n!. # in days
- qq! onloadTZSetup('$jstimezone', tz_cookie, '$datetime_class');\n!;
+ print qq!<script src="!.esc_url($javascript).qq!"></script>\n!;
+ print qq!<script>\n!.
+ qq!window.onload = function () {\n!;
+ if (gitweb_check_feature('javascript-actions')) {
+ print qq! fixLinks();\n!;
+ }
+ print qq!};\n!.
+ qq!</script>\n!;
}
- print qq!};\n!.
- qq!</script>\n!;
}
print "</body>\n" .
print "<div class=\"page_nav\">\n" .
(join " | ",
map { $_ eq $current ?
- $_ : $cgi->a({-href => ($arg{$_}{_href} ? $arg{$_}{_href} : href(%{$arg{$_}}))}, "$_")
+ $cgi->span({-class => "current"}, $_) : $cgi->a({-href => ($arg{$_}{_href} ? $arg{$_}{_href} : href(%{$arg{$_}}))}, "$_")
} @navs);
print "<br/>\n$extra" if defined $extra; # pager or formats
print "</div>\n";
sub format_repo_url {
my ($name, $url) = @_;
- return "<tr class=\"metadata_url\"><td>$name</td><td>$url</td></tr>\n";
+ return "<tr class=\"metadata_url\"><th>$name</th><td>$url</td></tr>\n";
}
# Group output by placing it in a DIV element and adding a header.
sub format_timestamp_html {
my $date = shift;
- my $strtime = $date->{'rfc2822'};
- my (undef, undef, $datetime_class) =
- gitweb_get_feature('javascript-timezone');
- if ($datetime_class) {
- $strtime = qq!<span class="$datetime_class">$strtime</span>!;
- }
-
- my $localtime_format = '(%02d:%02d %s)';
- $strtime .= ' ' .
- sprintf($localtime_format,
- $date->{'hour_local'}, $date->{'minute_local'}, $date->{'tz_local'});
-
- return $strtime;
+ return qq!<time datetime="$date->{'iso-8601'}" title="$date->{'iso-tz'}">$date->{'rfc2822'}</time>!;
}
# Outputs the author name and date in long form
print format_log_line_html($line) . "<br/>\n";
}
-
- if ($opts{'-final_empty_line'}) {
- # end with single empty line
- print "<br/>\n" unless $skip_blank_line;
- }
}
# return link target (what link points to)
my ($difftree, $hash, @parents) = @_;
my ($parent) = $parents[0];
my $have_blame = gitweb_check_feature('blame');
- print "<div class=\"list_head\">\n";
if ($#{$difftree} > 10) {
+ print "<div class=\"list_head\">\n";
print(($#{$difftree} + 1) . " files changed:\n");
+ print "</div>\n";
}
- print "</div>\n";
print "<table class=\"" .
(@parents > 1 ? "combined " : "") .
$from = 0 unless defined $from;
$to = $#{$commitlist} if (!defined $to || $#{$commitlist} < $to);
+ print "<section class=\"cards\">\n";
for (my $i = 0; $i <= $to; $i++) {
my %co = %{$commitlist->[$i]};
next if !%co;
my $commit = $co{'id'};
my $ref = format_ref_marker($refs, $commit);
+ print "<article>\n";
git_print_header_div('commit',
- "<span class=\"age\">$co{'age_string'}</span>" .
+ "<time datetime=\"$co{'age_string_iso8601'}\" title=\"$co{'age_string_iso8601'}\" class=\"age\">$co{'age_string'}</time>" .
esc_html($co{'title'}) . $ref,
$commit);
print "<div class=\"title_text\">\n" .
$cgi->a({-href => href(action=>"commitdiff", hash=>$commit)}, "commitdiff") .
" | " .
$cgi->a({-href => href(action=>"tree", hash=>$commit, hash_base=>$commit)}, "tree") .
- "<br/>\n" .
"</div>\n";
git_print_authorship(\%co, -tag => 'span');
- print "<br/>\n</div>\n";
+ print "</div>\n";
print "<div class=\"log_body\">\n";
- git_print_log($co{'comment'}, -final_empty_line=> 1);
+ git_print_log($co{'comment'});
print "</div>\n";
+ print "</article>\n";
}
+ print "</section>\n";
if ($extra) {
print "<div class=\"page_nav\">\n";
print "$extra\n";
}
$alternate ^= 1;
# git_summary() used print "<td><i>$co{'age_string'}</i></td>\n" .
- print "<td title=\"$co{'age_string_age'}\"><i>$co{'age_string_date'}</i></td>\n" .
+ print "<td title=\"$co{'age_string_age'}\"><time datetime=\"$co{'age_string_iso8601'}\">$co{'age_string_date'}</time></td>\n" .
format_author_html('td', \%co, 10) . "<td>";
print format_subject_html($co{'title'}, $co{'title_short'},
href(action=>"commit", hash=>$commit), $ref);
print "<tr class=\"light\">\n";
}
$alternate ^= 1;
- print "<td title=\"$co{'age_string_age'}\"><i>$co{'age_string_date'}</i></td>\n" .
+ print "<td title=\"$co{'age_string_age'}\"><time datetime=\"$co{'age_string_iso8601'}\">$co{'age_string_date'}</time></td>\n" .
# shortlog: format_author_html('td', \%co, 10)
format_author_html('td', \%co, 15, 3) . "<td>";
# originally git_history used chop_str($co{'title'}, 50)
$alternate ^= 1;
%co = parse_commit($set{'commit'});
my $author = chop_and_escape_str($co{'author_name'}, 15, 5);
- print "<td title=\"$co{'age_string_age'}\"><i>$co{'age_string_date'}</i></td>\n" .
+ print "<td title=\"$co{'age_string_age'}\"><time datetime=\"$co{'age_string_iso8601'}\">$co{'age_string_date'}</time></td>\n" .
"<td><i>$author</i></td>\n" .
"<td>" .
$cgi->a({-href => href(action=>"commit", hash=>$co{'id'}),
print $cgi->a({-href => href(action=>"blob", hash_base=>$co{'id'},
hash=>$set{'to_id'}, file_name=>$set{'to_file'}),
-class => "list"},
- "<span class=\"match\">" . esc_path($set{'file'}) . "</span>") .
+ "<mark>" . esc_path($set{'file'}) . "</mark>") .
"<br/>\n";
}
}
$ltext = untabify($ltext);
if ($ltext =~ m/^(.*)($search_regexp)(.*)$/i) {
$ltext = esc_html($1, -nbsp=>1);
- $ltext .= '<span class="match">';
+ $ltext .= '<mark>';
$ltext .= esc_html($2, -nbsp=>1);
- $ltext .= '</span>';
+ $ltext .= '</mark>';
$ltext .= esc_html($3, -nbsp=>1);
} else {
$ltext = esc_html($ltext, -nbsp=>1);
print "<tr class=\"light\">\n";
}
$alternate ^= 1;
- print "<td title=\"$co{'age_string_age'}\"><i>$co{'age_string_date'}</i></td>\n" .
+ print "<td title=\"$co{'age_string_age'}\"><time datetime=\"$co{'age_string_iso8601'}\">$co{'age_string_date'}</time></td>\n" .
format_author_html('td', \%co, 15, 5) .
"<td>" .
$cgi->a({-href => href(action=>"commit", hash=>$co{'id'}),
$match = esc_html($match);
$trail = esc_html($trail);
- print "$lead<span class=\"match\">$match</span>$trail<br />";
+ print "$lead<mark>$match</mark>$trail<br />";
}
}
print "</td>\n" .
print "</table>\n";
+ print("<section class=\"cards\">\n");
+
# If XSS prevention is on, we don't include README.html.
# TODO: Allow a readme in some safe format.
if (!$prevent_xss && -s "$projectroot/$project/README.html") {
+ print("<article>\n");
print "<div class=\"title\">readme</div>\n" .
"<div class=\"readme\">\n";
insert_file("$projectroot/$project/README.html");
print "\n</div>\n"; # class="readme"
+ print("</article>\n");
}
# we need to request one more than 16 (0..15) to check if
# those 16 are all
my @commitlist = $head ? parse_commits($head, 17) : ();
if (@commitlist) {
+ print("<article>\n");
git_print_header_div('shortlog');
git_shortlog_body(\@commitlist, 0, 15, $refs,
$#commitlist <= 15 ? undef :
$cgi->a({-href => href(action=>"shortlog")}, "..."));
+ print("</article>\n");
}
if (@taglist) {
+ print("<article>\n");
git_print_header_div('tags');
git_tags_body(\@taglist, 0, 15,
$#taglist <= 15 ? undef :
$cgi->a({-href => href(action=>"tags")}, "..."));
+ print("</article>\n");
}
if (@headlist) {
+ print("<article>\n");
git_print_header_div('heads');
git_heads_body(\@headlist, $head, 0, 15,
$#headlist <= 15 ? undef :
$cgi->a({-href => href(action=>"heads")}, "..."));
+ print("</article>\n");
}
if (%remotedata) {
+ print("<article>\n");
git_print_header_div('remotes');
git_remotes_body(\%remotedata, 15, $head);
+ print("</article>\n");
}
if (@forklist) {
+ print("<article>\n");
git_print_header_div('forks');
git_project_list_body(\@forklist, 'age', 0, 15,
$#forklist <= 15 ? undef :
$cgi->a({-href => href(action=>"forks")}, "..."),
'no_header');
+ print("</article>\n");
}
+ print("</section>\n");
git_footer_html();
}
print "<div class=\"page_body\">\n";
if (@{$co{'comment'}} > 1) {
print "<div class=\"log\">\n";
- git_print_log($co{'comment'}, -final_empty_line=> 1, -remove_title => 1);
+ git_print_log($co{'comment'}, -remove_title => 1);
print "</div>\n"; # class="log"
}
return if ($cgi->request_method() eq 'HEAD');
# header variables
- my $title = "$site_name - $project/$action";
+ my $title = to_utf8($site_name) . " - $project/$action";
my $feed_type = 'log';
if (defined $hash) {
$title .= " - '$hash'";
-charset => 'utf-8',
-content_disposition => 'inline; filename="opml.xml"');
- my $title = esc_html($site_name);
+ my $title = esc_html(to_utf8($site_name));
my $filter = " within subdirectory ";
if (defined $project_filter) {
$filter .= esc_html($project_filter);