Skip to content

Instantly share code, notes, and snippets.

@johnlane
Created October 6, 2020 09:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save johnlane/b0eb78dc97694d3a42d8dedcc6a5d095 to your computer and use it in GitHub Desktop.
Save johnlane/b0eb78dc97694d3a42d8dedcc6a5d095 to your computer and use it in GitHub Desktop.
--- gitweb.cgi.orig 2020-10-06 10:13:45.621810025 +0100
+++ gitweb.cgi 2020-10-06 10:08:21.651823286 +0100
@@ -18,9 +18,10 @@
use Encode;
use Fcntl ':mode';
use File::Find qw();
-use File::Basename qw(basename);
+use File::Basename qw(basename dirname);
use Time::HiRes qw(gettimeofday tv_interval);
use Digest::MD5 qw(md5_hex);
+use File::Spec; # hack
binmode STDOUT, ':utf8';
@@ -6644,6 +6645,20 @@
print "\n</div>\n"; # class="readme"
}
+ # hack
+ if (!$prevent_xss) {
+ $file_name = "README.md";
+ my $proj_head_hash = git_get_head_hash($project);
+ my $readme_blob_hash = git_get_hash_by_path($proj_head_hash, "README.md", "blob");
+
+ if ($readme_blob_hash) { # if README.md exists
+ print "<div class=\"header\">$file_name</div>\n";
+ print "<div class=\"readme page_body\">"; # TODO find/create a better CSS class than page_body
+ print get_markdown($file_name, $readme_blob_hash);
+ print "</div>";
+ }
+ }
+
# we need to request one more than 16 (0..15) to check if
# those 16 are all
my @commitlist = $head ? parse_commits($head, 17) : ();
@@ -7117,6 +7132,9 @@
my $syntax = guess_file_syntax($highlight, $file_name);
$fd = run_highlighter($fd, $highlight, $syntax);
+ # hack
+ my $ismarkdown = ($file_name =~ /md$/);
+
git_header_html(undef, $expires);
my $formats_nav = '';
if (defined $hash_base && (my %co = parse_commit($hash_base))) {
@@ -7160,6 +7178,10 @@
esc_attr(href(action=>"blob_plain", hash=>$hash,
hash_base=>$hash_base, file_name=>$file_name)) .
qq!" />\n!;
+ } elsif ($ismarkdown) {
+ print qq!<div class="readme page_body">\n!;
+ print get_markdown($file_name, $hash);
+ print qq!</div>\n!; # $cmd_markdownify
} else {
my $nr;
while (my $line = <$fd>) {
@@ -7177,6 +7199,79 @@
git_footer_html();
}
+# hack
+sub get_norm_rel_path { # http://www.perlmonks.org/bare/?node_id=11907
+ my $unnormpath = shift;
+ while ($unnormpath =~ m!/\.!) {
+ $unnormpath =~ s!/[^\/]+/\.\.!!;
+ # print "Path is now -+$unnormpath+-\n";
+ }
+ return $unnormpath;
+}
+sub get_markdown {
+ my $tfilename = shift;
+ my $thash = shift;
+ my $rethtmlstr = "";
+ use open ":encoding(utf8)"; # needed to have utf8 survive through the shell pipe
+ my $cmd_markdownify = $GIT . " " . git_cmd() . " cat-file blob " . $thash . " | perl -e 'my \$str = do { local \$/; <STDIN> }; \$str =~ s/<!--.*?--\s*>//gs; print \$str;' | markdown |";
+ open (FOO, $cmd_markdownify) or die_error(500, "Open git-cat-file blob '$thash' failed");
+ while (<FOO>) {
+ if ($_ =~ /(<img[^>]src=")(.*?)"/) {
+ my $origcut = "".$2;
+ my $testcut = "".$2;
+ my $is_anchor = ($testcut =~ /^#/);
+ my $is_absolute = ($testcut =~ /^http/);
+ my $is_relative_up = ($testcut =~ /^\.\./);
+ my $is_local_link = ((!$is_anchor) and (!$is_absolute));
+ my $tdir = dirname($tfilename);
+ my $is_tdir_proper = (($tdir ne "") and ($tdir ne "."));
+ #print "XX: $origcut ($is_anchor, $is_absolute - $is_local_link) ($is_relative_up, $is_tdir_proper, $tdir, $tfilename)\n"; # dbg
+ if ($is_local_link) {
+ if ($is_relative_up) { # normalize
+ if ($is_tdir_proper) {
+ # cheat with absolute path here:
+ my $resolved = get_norm_rel_path( File::Spec->rel2abs ("$origcut", "/$tdir" ) );
+ $resolved = substr $resolved, 1;
+ #print "YY: $resolved\n";
+ $_ =~ s!(<img[^>]src=")(.*?)"!$1?p=$project;a=blob_plain;f=$resolved"!gi;
+ }
+ } else {
+ $_ =~ s!(<img[^>]src=")(.*?)"!$1?p=$project;a=blob_plain;f=$2"!gi;
+ #print "ZZ: $_\n";
+ }
+ }
+ }
+ if ($_ =~ /(<a[^>]href=")(.*?)"/) {
+ my $origcut = "".$2;
+ my $testcut = "".$2;
+ my $is_anchor = ($testcut =~ /^#/);
+ my $is_absolute = ($testcut =~ /^http/);
+ my $is_relative_up = ($testcut =~ /^\.\./);
+ my $is_local_link = ((!$is_anchor) and (!$is_absolute));
+ my $tdir = dirname($tfilename);
+ my $is_tdir_proper = (($tdir ne "") and ($tdir ne "."));
+ #print "XX: $origcut ($is_anchor, $is_absolute - $is_local_link) ($is_relative_up, $is_tdir_proper, $tdir, $tfilename)\n"; # dbg
+ if ($is_local_link) {
+ if ($is_relative_up) { # normalize
+ if ($is_tdir_proper) {
+ # cheat with absolute path here:
+ my $resolved = get_norm_rel_path( File::Spec->rel2abs ("$origcut", "/$tdir" ) );
+ $resolved = substr $resolved, 1;
+ #print "YY: $resolved\n";
+ $_ =~ s!(<a[^>]href=")(.*?)"!$1?p=$project;a=blob;f=$resolved"!gi;
+ }
+ } else {
+ $_ =~ s!(<a[^>]href=")(.*?)"!$1?p=$project;a=blob;f=$2"!gi;
+ #print "ZZ: $_\n";
+ }
+ }
+ }
+ $rethtmlstr .= $_;
+ }
+ close(FOO);
+ return $rethtmlstr;
+}
+
sub git_tree {
if (!defined $hash_base) {
$hash_base = "HEAD";
@johnlane
Copy link
Author

johnlane commented Oct 7, 2020

this patch adds markdown rendering to gitweb, originally from stackoverflow. Updated for gitweb 2.26.2 package from Alpine Linux.

@Catwoolfii
Copy link

Catwoolfii commented May 3, 2021

Unfortunately, the pipe is not displayed correctly in tables

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment