X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;ds=sidebyside;f=lib%2FPublicInbox%2FWwwStream.pm;h=472316c29c4ca12531b4b059ac8c9751772322cc;hb=d7c052507561d121a46f952ec8f700beb3c3a33a;hp=62a4fe2607ee4fd3e17ad93dbd73cc87cf96b1be;hpb=4af9fd9c5e46eed341a535f37d54cf228303326c;p=public-inbox.git
diff --git a/lib/PublicInbox/WwwStream.pm b/lib/PublicInbox/WwwStream.pm
index 62a4fe26..472316c2 100644
--- a/lib/PublicInbox/WwwStream.pm
+++ b/lib/PublicInbox/WwwStream.pm
@@ -1,88 +1,173 @@
-# Copyright (C) 2016 all contributors
+# Copyright (C) 2016-2021 all contributors
# License: AGPL-3.0+
#
-# HTML body stream for which yields getline+close methods
+# HTML body stream for which yields getline+close methods for
+# generic PSGI servers and callbacks for public-inbox-httpd.
+#
+# See PublicInbox::GzipFilter parent class for more info.
package PublicInbox::WwwStream;
use strict;
-use warnings;
-use PublicInbox::Hval qw(ascii_html);
-use URI;
-use constant PI_URL => 'https://public-inbox.org/README.html';
+use v5.10.1;
+use parent qw(Exporter PublicInbox::GzipFilter);
+our @EXPORT_OK = qw(html_oneshot);
+use PublicInbox::Hval qw(ascii_html prurl ts2str);
+
+our $CODE_URL = [ qw(
+http://7fh6tueqddpjyxjmgtdiueylzoqt6pt7hec3pukyptlmohoowvhde4yd.onion/public-inbox.git
+https://public-inbox.org/public-inbox.git) ];
+
+sub base_url ($) {
+ my $ctx = shift;
+ my $base_url = $ctx->{ibx}->base_url($ctx->{env});
+ chop $base_url; # no trailing slash for clone
+ $base_url;
+}
+
+sub init {
+ my ($ctx, $cb) = @_;
+ $ctx->{cb} = $cb;
+ $ctx->{base_url} = base_url($ctx);
+ bless $ctx, __PACKAGE__;
+}
-sub new {
- my ($class, $ctx, $cb) = @_;
- bless { nr => 0, cb => $cb, ctx => $ctx }, $class;
+sub async_eml { # for async_blob_cb
+ my ($ctx, $eml) = @_;
+ $ctx->{http_out}->write($ctx->translate($ctx->{cb}->($ctx, $eml)));
}
-sub _html_top ($) {
- my ($self) = @_;
- my $ctx = $self->{ctx};
- my $obj = $ctx->{-inbox};
- my $desc = ascii_html($obj->description);
- my $title = $ctx->{-title_html} || $desc;
+sub html_top ($) {
+ my ($ctx) = @_;
+ my $ibx = $ctx->{ibx};
+ my $desc = ascii_html($ibx->description);
+ my $title = delete($ctx->{-title_html}) // $desc;
my $upfx = $ctx->{-upfx} || '';
my $atom = $ctx->{-atom} || $upfx.'new.atom';
- my $top = "$desc (Atom feed)";
- if ($obj->search) {
- $top = qq{}
} else {
- $top = '
' . $top . '
';
+ $top = '
' . $top . "\n" . $links . '
';
}
"$title" .
- "" .
- PublicInbox::Hval::STYLE .
- "$top";
+ qq() .
+ $ctx->{www}->style($upfx) .
+ ''. $top . (delete($ctx->{-html_tip}) // '');
}
-sub _html_end {
- my ($self) = @_;
- my $urls = 'Archives are clone-able:';
- my $ctx = $self->{ctx};
- my $obj = $ctx->{-inbox};
- my $desc = ascii_html($obj->description);
- my @urls = @{$obj->cloneurl};
- my %seen = map { $_ => 1 } @urls;
-
- # FIXME: cleanup
- my $env = $ctx->{env};
- my $scheme = $env->{'psgi.url_scheme'};
- my $host_port = $env->{HTTP_HOST} ||
- "$env->{SERVER_NAME}:$env->{SERVER_PORT}";
- my $http = "$scheme://$host_port".($env->{SCRIPT_NAME} || '/');
- $http = URI->new($http . $obj->{name})->canonical->as_string;
- $seen{$http} or unshift @urls, $http;
- if (scalar(@urls) == 1) {
- $urls .= " git clone --mirror $urls[0]";
- } else {
- $urls .= "\n" .
- join("\n", map { "\tgit clone --mirror $_" } @urls);
+sub coderepos ($) {
+ my ($ctx) = @_;
+ my $cr = $ctx->{ibx}->{coderepo} // return ();
+ my $cfg = $ctx->{www}->{pi_cfg};
+ my $upfx = ($ctx->{-upfx} // ''). '../';
+ my @ret;
+ for my $cr_name (@$cr) {
+ $ret[0] //= <code repositories for project(s) associated with this inbox:
+EOF
+ my $urls = $cfg->get_all("coderepo.$cr_name.cgiturl");
+ if ($urls) {
+ for (@$urls) {
+ # relative or absolute URL?, prefix relative
+ # "foo.git" with appropriate number of "../"
+ my $u = m!\A(?:[a-z\+]+:)?//! ? $_ : $upfx.$_;
+ $u = ascii_html(prurl($ctx->{env}, $u));
+ $ret[0] .= qq(\n\t$u);
+ }
+ } else {
+ $ret[0] .= qq[\n\t$cr_name.git (no URL configured)];
+ }
}
- my $url = PublicInbox::Hval::prurl($ctx->{env}, PI_URL);
- '
'.join("\n",
- '- ' . $desc,
- $urls,
- 'served with software from public-inbox: '
- ."$url",
- ).'
';
+ @ret; # may be empty, this sub is called as an arg for join()
}
-sub getline {
- my ($self) = @_;
- my $nr = $self->{nr}++;
-
- return _html_top($self) if $nr == 0;
+sub _html_end {
+ my ($ctx) = @_;
+ my @cr = coderepos($ctx);
+ scalar(@cr) ?
+ '