From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 1461021434 for ; Mon, 21 Jan 2019 20:52:59 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 24/37] $INBOX/_/text/color/ and sample user-side CSS Date: Mon, 21 Jan 2019 20:52:40 +0000 Message-Id: <20190121205253.10455-25-e@80x24.org> In-Reply-To: <20190121205253.10455-1-e@80x24.org> References: <20190121205253.10455-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Since we now support more CSS classes for coloring, give this feature more visibility. --- Documentation/design_www.txt | 6 +-- MANIFEST | 1 + Makefile.PL | 3 ++ TODO | 2 - lib/PublicInbox/UserContent.pm | 78 ++++++++++++++++++++++++++++++++++ lib/PublicInbox/WWW.pm | 17 ++++++-- lib/PublicInbox/WwwStream.pm | 2 + lib/PublicInbox/WwwText.pm | 35 +++++++++++++++ 8 files changed, 134 insertions(+), 10 deletions(-) create mode 100644 lib/PublicInbox/UserContent.pm diff --git a/Documentation/design_www.txt b/Documentation/design_www.txt index 514f8ff..c7d7fcb 100644 --- a/Documentation/design_www.txt +++ b/Documentation/design_www.txt @@ -107,8 +107,6 @@ browsers default to. CSS classes (for user-supplied CSS) ----------------------------------- -span.q - quoted text in email messages -TODO: consider using highlight(1) via libhighlight-perl in Debian, - optionally -... +See examples in contrib/css/ and lib/PublicInbox/WwwText.pm +(or https://public-inbox.org/meta/_/text/color/ soon) diff --git a/MANIFEST b/MANIFEST index 1db7bd1..53d51b2 100644 --- a/MANIFEST +++ b/MANIFEST @@ -110,6 +110,7 @@ lib/PublicInbox/Spamcheck/Spamc.pm lib/PublicInbox/Spawn.pm lib/PublicInbox/SpawnPP.pm lib/PublicInbox/Unsubscribe.pm +lib/PublicInbox/UserContent.pm lib/PublicInbox/V2Writable.pm lib/PublicInbox/View.pm lib/PublicInbox/ViewDiff.pm diff --git a/Makefile.PL b/Makefile.PL index c134ff9..e00c015 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -56,5 +56,8 @@ check-manifest :: MANIFEST check:: pure_all check-manifest \$(EATMYDATA) prove -lv -j\$(N) +lib/PublicInbox/UserContent.pm :: contrib/css/216dark.css + @\$(PERL) -I lib \$@ \$< + EOF } diff --git a/TODO b/TODO index 374d8df..57ea8c4 100644 --- a/TODO +++ b/TODO @@ -66,8 +66,6 @@ all need to be considered for everything we introduce) * linkify thread skeletons better https://public-inbox.org/git/6E3699DEA672430CAEA6DEFEDE6918F4@PhilipOakley/ -* generate sample CSS for use with userContent.css/dillo/etc - * streaming Email::MIME replacement: currently we generate many allocations/strings for headers we never look at and slurp entire message bodies into memory. diff --git a/lib/PublicInbox/UserContent.pm b/lib/PublicInbox/UserContent.pm new file mode 100644 index 0000000..b34ebf9 --- /dev/null +++ b/lib/PublicInbox/UserContent.pm @@ -0,0 +1,78 @@ +# Copyright (C) 2019 all contributors +# License: AGPL-3.0+ + +# Self-updating module containing a sample CSS for client-side +# customization by users of public-inbox. Used by Makefile.PL +package PublicInbox::UserContent; +use strict; +use warnings; + +# this sub is updated automatically: +sub CSS () { + <<'_' + /* + * Dark color scheme using 216 web-safe colors, inspired + * somewhat by the default color scheme in mutt. + * It reduces eyestrain for me, and energy usage for all: + * https://en.wikipedia.org/wiki/Light-on-dark_color_scheme + */ + * { background:#000; color:#ccc } + + /* + * Underlined links add visual noise which make them hard-to-read. + * Use colors to make them stand out, instead. + */ + a { color:#69f; text-decoration:none } + a:visited { color:#96f } + + /* quoted text gets a different color */ + *.q { color:#09f } + + /* + * these may be used with cgit, too + * (cgit uses
, public-inbox uses ) + */ + *.add { color:#0ff } + *.del { color:#f0f } + *.head { color:#fff } + *.hunk { color:#c93 } +_ +} +# end of auto-updated sub + +# return a sample CSS +sub sample ($$) { + my ($ibx, $env) = @_; + my $url_prefix = $ibx->base_url($env); + my $preamble = <<""; +/* + * Firefox users: this goes in \$PROFILE_FOLDER/chrome/userContent.css + * where \$PROFILE_FOLDER is platform-specific + * + * cf. http://kb.mozillazine.org/UserContent.css + * http://kb.mozillazine.org/Profile_folder_-_Firefox + * + * Users of dillo can remove the entire lines with "moz-only" + * in them and place the resulting file in ~/.dillo/style.css + */ +\@-moz-document url-prefix($url_prefix) { /* moz-only */ + + $preamble . CSS() . "\n} /* moz-only */\n"; +} + +# Auto-update this file based on the contents of a CSS file: +# usage: perl -I lib __FILE__ contrib/css/216dark.css +# (See Makefile.PL) +if (scalar(@ARGV) == 1 && -r __FILE__) { + use autodie; + open my $ro, '<', $ARGV[0]; + my $css = do { local $/; <$ro> }; + $css =~ s/^([ \t]*\S)/\t$1/smg; + open my $rw, '+<', __FILE__; + my $out = do { local $/; <$rw> }; + $out =~ s/^sub CSS.*^_\n\}/sub CSS () {\n\t<<'_'\n${css}_\n}/sm; + seek $rw, 0, 0; + print $rw $out; +} + +1; diff --git a/lib/PublicInbox/WWW.pm b/lib/PublicInbox/WWW.pm index 863da85..406802a 100644 --- a/lib/PublicInbox/WWW.pm +++ b/lib/PublicInbox/WWW.pm @@ -20,6 +20,7 @@ use URI::Escape qw(uri_unescape); use PublicInbox::MID qw(mid_escape); require PublicInbox::Git; use PublicInbox::GitHTTPBackend; +use PublicInbox::UserContent; # TODO: consider a routing tree now that we have more endpoints: our $INBOX_RE = qr!\A/([\w\-][\w\.\-]*)!; @@ -120,7 +121,7 @@ sub call { } elsif ($path_info =~ m!$INBOX_RE/_/text(?:/(.*))?\z!o) { get_text($ctx, $1, $2); } elsif ($path_info =~ m!$INBOX_RE/([\w\-\.]+)\.css\z!o) { - get_css($self, $2); + get_css($ctx, $1, $2); } elsif ($path_info =~ m!$INBOX_RE/($OID_RE)/s/\z!o) { get_vcs_object($ctx, $1, $2); } elsif ($path_info =~ m!$INBOX_RE/($OID_RE)/s/([\w\.\-]+)\z!o) { @@ -577,10 +578,18 @@ sub style { # 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 -sub get_css ($$) { - my ($self, $key) = @_; +sub get_css ($$$) { + my ($ctx, $inbox, $key) = @_; + my $r404 = invalid_inbox($ctx, $inbox); + return $r404 if $r404; + my $self = $ctx->{www}; my $css_map = $self->{-css_map} || stylesheets_prepare($self, ''); - defined(my $css = $css_map->{$key}) or return r404(); + my $css = $css_map->{$key}; + if (!defined($css) && $key eq 'userContent') { + my $env = $ctx->{env}; + $css = PublicInbox::UserContent::sample($ctx->{-inbox}, $env); + } + defined $css or return r404(); my $h = [ 'Content-Length', bytes::length($css), 'Content-Type', 'text/css' ]; PublicInbox::GitHTTPBackend::cache_one_year($h); diff --git a/lib/PublicInbox/WwwStream.pm b/lib/PublicInbox/WwwStream.pm index c3aeb6b..8ae35c7 100644 --- a/lib/PublicInbox/WwwStream.pm +++ b/lib/PublicInbox/WwwStream.pm @@ -38,10 +38,12 @@ sub _html_top ($) { my $title = $ctx->{-title_html} || $desc; my $upfx = $ctx->{-upfx} || ''; my $help = $upfx.'_/text/help'; + my $color = $upfx.'_/text/color'; my $atom = $ctx->{-atom} || $upfx.'new.atom'; my $tip = $ctx->{-html_tip} || ''; my $top = "$desc"; my $links = "help / ". + "color / ". "Atom feed"; if ($obj->search) { my $q_val = $ctx->{-q_value_html}; diff --git a/lib/PublicInbox/WwwText.pm b/lib/PublicInbox/WwwText.pm index b5874cf..d3413ad 100644 --- a/lib/PublicInbox/WwwText.pm +++ b/lib/PublicInbox/WwwText.pm @@ -88,9 +88,44 @@ sub _srch_prefix ($$) { 1; } +sub _colors_help ($$) { + my ($ctx, $txt) = @_; + my $ibx = $ctx->{-inbox}; + my $base_url = $ibx->base_url($ctx->{env}); + $$txt .= "color customization for $base_url\n"; + $$txt .= <{-inbox}; -- EW