Fix UTF-8 mangling on patch and commitdiff_plain
[gitweb] / gitweb.cgi
index 1aba48a08b115007d5bcafb3c66c248253580e5e..5af873c02352cf67a25ef11e6a9301df0f19ee9e 100755 (executable)
@@ -1862,7 +1862,7 @@ sub esc_html_hl_regions {
 
                $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;
        }
@@ -1892,7 +1892,7 @@ sub esc_html_match_hl {
        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);
 }
 
 
@@ -1924,7 +1924,7 @@ sub esc_html_match_hl_chopped {
                push @filtered, $m;
        }
 
-       return esc_html_hl_regions($chopped . $tail, 'match', @filtered);
+       return esc_html_hl_regions($chopped . $tail, undef, @filtered);
 }
 
 ## ----------------------------------------------------------------------
@@ -3032,7 +3032,7 @@ sub git_populate_project_tagcloud {
                        $title =~ s/^/&nbsp;/g;
                        $title =~ s/$/&nbsp;/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});
@@ -3042,7 +3042,7 @@ sub git_populate_project_tagcloud {
                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} =
@@ -4086,11 +4086,11 @@ sub print_feed_meta {
        } 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")));
        }
 }
@@ -4123,19 +4123,24 @@ sub print_nav_breadcrumbs_path {
                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) {
@@ -4144,13 +4149,14 @@ sub print_nav_breadcrumbs {
                                $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);
        }
 }
@@ -4249,7 +4255,7 @@ sub git_end_subhead_html {
 }
 
 sub git_footer_html {
-       my $feed_class = 'rss_logo';
+       my $feed_class = 'feed_logo';
 
        print "<footer class=\"page_footer\">\n";
        if (defined $project) {
@@ -6323,7 +6329,7 @@ sub git_search_changes {
                        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";
                }
        }
@@ -6398,9 +6404,9 @@ sub git_search_files {
                        $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);
@@ -6465,7 +6471,7 @@ sub git_search_grep_body {
                                $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" .
@@ -8053,12 +8059,12 @@ sub git_commitdiff {
 
        } elsif ($format eq 'plain') {
                local $/ = undef;
-               print <$fd>;
+               print to_utf8(<$fd>);
                close $fd
                        or print "Reading git-diff-tree failed\n";
        } elsif ($format eq 'patch') {
                local $/ = undef;
-               print <$fd>;
+               print to_utf8(<$fd>);
                close $fd
                        or print "Reading git-format-patch failed\n";
        }
@@ -8218,7 +8224,7 @@ sub git_feed {
        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'";
@@ -8381,7 +8387,7 @@ sub git_opml {
                -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);