マークダウンはドキュメントにとって重要です。https://github.com/twitter/bootstrap/blob/master/README.mdREADME.mdのようにgithubでhtml形式で自動的に表示できるのは非常に便利です。
gitwebはperlスクリプトで記述されており、perlにはすでにマークダウン用のプラグインがあります。
gitwebにマークダウン形式のhtmlファイルを自動的に表示させるプラグイン/ソリューションがあるかどうかを確認したいと思います。
マークダウンはドキュメントにとって重要です。https://github.com/twitter/bootstrap/blob/master/README.mdREADME.mdのようにgithubでhtml形式で自動的に表示できるのは非常に便利です。
gitwebはperlスクリプトで記述されており、perlにはすでにマークダウン用のプラグインがあります。
gitwebにマークダウン形式のhtmlファイルを自動的に表示させるプラグイン/ソリューションがあるかどうかを確認したいと思います。
gitwebで閲覧できるようになっているリモートリポジトリで、次の受信後フックを使用しています。
#!/bin/sh
#
# Post-receive hook script which generates README.html to git-dir from
# README.md found at the head of master branch in repository.
#
# Gitweb can read the README.html and embed it to the project summary page.
git cat-file blob HEAD:README.md | markdown > $GIT_DIR/README.html
このスクリプトは、ローカルの作業リポジトリからリモートのベアリポジトリにコミットをプッシュするときに実行されます。ワークフロー/セットアップに応じて、それまたは同様のものを使用できます。
gitフックの詳細:http://book.git-scm.com/5_git_hooks.html
sub git_summaryこれが、gitweb.perlまたはのどこかに貼り付けることができるものですgitweb.cgi。markdown外部実行可能ファイルに依存することに注意してください。
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\">readme</div>\n";
print "<div class=\"readme page_body\">"; # TODO find/create a better CSS class than page_body
my $cmd_markdownify = $GIT . " " . git_cmd() . " cat-file blob " . $readme_blob_hash . " | markdown |";
open FOO, $cmd_markdownify or die_error(500, "Open git-cat-file blob '$hash' failed");
while (<FOO>) {
print $_;
}
close(FOO);
print "</div>";
}
}
私はPerlを本当に知らないので、これは何よりも汚いハックですが、それは機能します。
gitweb.cgi受け入れられた回答に基づいた私の変更は次のとおりです。
README.mdプロジェクト内のルートが表示されます(承認された回答のように)*.mdのファイルが表示されます(my parent)[../parent.md]、正しく参照されます)。画像でも機能するはずです必要な実行可能ファイルsudo apt-get install libtext-markdown-perlを提供するためにUbuntuで使用していることに注意してください。markdown
diffパッチとしての変更は次のとおりです。
--- /usr/share/gitweb/gitweb.cgi.orig 2016-04-13 10:28:03.268872899 +0200
+++ /usr/share/gitweb/gitweb.cgi 2016-04-13 10:39:02.344875516 +0200
@@ -16,8 +16,9 @@
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 File::Spec; # hack
binmode STDOUT, ':utf8';
our $t0 = [ gettimeofday() ];
@@ -6585,6 +6586,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) : ();
@@ -7059,6 +7074,9 @@
$fd = run_highlighter($fd, $highlight, $syntax)
if $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))) {
@@ -7102,6 +7120,10 @@
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>) {
@@ -7119,6 +7141,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";
このタンパーモンキースクリプトをChromeで使用して、README.mdファイルをhtmlとして直接gitwebにレンダリングします。https: //gist.github.com/nemoo/ee47cd9ad2a5b4fdddfagitweb サーバーにアクセスできない場合でも正常に機能します。