]> Sergey Matveev's repositories - public-inbox.git/commitdiff
wwwlisting: support global CSS in HTML view
authorEric Wong <e@80x24.org>
Wed, 18 Aug 2021 11:41:02 +0000 (11:41 +0000)
committerEric Wong <e@80x24.org>
Thu, 26 Aug 2021 12:26:53 +0000 (12:26 +0000)
Since CSS can be overridden by a static webserver on a per-inbox
basis, we need a similar pattern to deal with the instance-wide
WwwListing HTML.  "/+/" probably won't conflict with any current
nor future public inbox names.

I don't think it'll cause problems with common linkifiers or URL
extractors, either (and it's unlikely anybody would want to
share URLs of just the CSS in a plain text(-like) format).

lib/PublicInbox/WWW.pm
lib/PublicInbox/WwwListing.pm

index 841a7e8590c493e6523b355394a66617054e9546..1afdece0f39f5a946a09961cbd194d456f1dcc51 100644 (file)
@@ -133,7 +133,8 @@ sub call {
        # convenience redirects order matters
        } elsif ($path_info =~ m!$INBOX_RE/([^/]{2,})\z!o) {
                r301($ctx, $1, $2);
-
+       } elsif ($path_info =~ m!\A/\+/([a-zA-Z0-9_\-\.]+)\.css\z!) {
+               get_css($ctx, undef, $1); # for WwwListing
        } else {
                legacy_redirects($ctx, $path_info);
        }
@@ -627,18 +628,20 @@ sub style {
        };
 }
 
-# /$INBOX/$KEY.css endpoint
+# /$INBOX/$KEY.css and /+/$KEY.css endpoints
 # CSS is configured globally for all inboxes, but we access them on
 # a per-inbox basis.  This allows administrators to setup per-inbox
 # static routes to intercept the request before it hits PSGI
+# inbox == undef => top-level WwwListing
 sub get_css ($$$) {
        my ($ctx, $inbox, $key) = @_;
-       my $r404 = invalid_inbox($ctx, $inbox);
+       my $r404 = defined($inbox) ? invalid_inbox($ctx, $inbox) : undef;
        return $r404 if $r404;
        my $self = $ctx->{www};
-       my $css_map = $self->{-css_map} || stylesheets_prepare($self, '');
+       my $css_map = $self->{-css_map} ||
+               stylesheets_prepare($self, defined($inbox) ? '' : '+/');
        my $css = $css_map->{$key};
-       if (!defined($css) && $key eq 'userContent') {
+       if (!defined($css) && defined($inbox) && $key eq 'userContent') {
                my $env = $ctx->{env};
                $css = PublicInbox::UserContent::sample($ctx->{ibx}, $env);
        }
index 98a69986370539f8e372aa17e04d5647d148471b..a31aa4ca1ba934cd8472c2f8b9fb038f2b126f8f 100644 (file)
@@ -190,9 +190,9 @@ sub psgi_triple {
        my $h = [ 'Content-Type', 'text/html; charset=UTF-8',
                        'Content-Length', undef ];
        my $gzf = gzf_maybe($h, $ctx->{env});
-       $gzf->zmore('<html><head><title>' .
-                               'public-inbox listing</title>' .
-                               '</head><body>');
+       $gzf->zmore('<html><head><title>public-inbox listing</title>' .
+                       $ctx->{www}->style('+/') .
+                       '</head><body>');
        my $code = 404;
        if (my $list = delete $ctx->{-list}) {
                my $mset = delete $ctx->{-mset};