Created
October 6, 2020 09:28
-
-
Save johnlane/b0eb78dc97694d3a42d8dedcc6a5d095 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- 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"; |
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
this patch adds markdown rendering to gitweb, originally from stackoverflow. Updated for gitweb 2.26.2 package from Alpine Linux.