From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS12876 51.15.0.0/16 X-Spam-Status: No, score=-2.9 required=3.0 tests=AWL,BAYES_00, RCVD_IN_MSPIKE_BL,RCVD_IN_MSPIKE_ZBI,RCVD_IN_XBL,RDNS_NONE,SPF_FAIL, SPF_HELO_FAIL shortcircuit=no autolearn=no autolearn_force=no version=3.4.0 Received: from 80x24.org (unknown [51.15.48.114]) by dcvr.yhbt.net (Postfix) with ESMTP id EDEA1203C1 for ; Tue, 13 Dec 2016 02:33:34 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [RFC] atom: implement message threading per RFC 4685 Date: Tue, 13 Dec 2016 02:33:30 +0000 Message-Id: <20161213023330.6104-1-e@80x24.org> List-Id: This will allows certain feed readers to render a message thread as described in . Feed readers with knowledge of of RFC 4685 are unknown to us at this time, but perhaps this will encourage future implementations. Existing feed readers I've tested (newsbeuter, feed2imap) seem to ignore these tags gracefully without degradation. --- TODO | 2 -- lib/PublicInbox/WwwAtomStream.pm | 40 ++++++++++++++++++++++++++-------------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/TODO b/TODO index d2efcbb..ee3db1a 100644 --- a/TODO +++ b/TODO @@ -34,8 +34,6 @@ all need to be considered for everything we introduce) the links should point to an anchor tag within the same page, instead; giving the user options. -* implement RFC 4685 (Atom message threading) - * configurable constants (index limits, search results) * handle messages with multiple Message-IDs diff --git a/lib/PublicInbox/WwwAtomStream.pm b/lib/PublicInbox/WwwAtomStream.pm index 5720384..a6817b3 100644 --- a/lib/PublicInbox/WwwAtomStream.pm +++ b/lib/PublicInbox/WwwAtomStream.pm @@ -9,10 +9,10 @@ use warnings; # FIXME: locale-independence: use POSIX qw(strftime); use Date::Parse qw(strptime); - +use Digest::SHA qw(sha1_hex); use PublicInbox::Address; use PublicInbox::Hval qw(ascii_html); -use PublicInbox::MID qw/mid_clean mid2path mid_escape/; +use PublicInbox::MID qw/mid_clean mid_escape/; # called by PSGI server after getline: sub close {} @@ -72,7 +72,8 @@ sub atom_header { my $mtime = (stat($ibx->{mainrepo}))[9] || time; qq(\n) . - qq{} . + qq() . qq{$title} . qq() . @@ -81,22 +82,33 @@ sub atom_header { feed_updated(gmtime($mtime)); } +sub mid2uuid ($) { + my ($mid) = @_; + utf8::encode($mid); # really screwed up In-Reply-To fields exist + $mid = sha1_hex($mid); + my $h = '[a-f0-9]'; + my (@uuid5) = ($mid =~ m!\A($h{8})($h{4})($h{4})($h{4})($h{12})!o); + 'urn:uuid:' . join('-', @uuid5); +} + # returns undef or string sub feed_entry { my ($self, $mime) = @_; my $ctx = $self->{ctx}; my $hdr = $mime->header_obj; my $mid = mid_clean($hdr->header_raw('Message-ID')); - - my $uuid = mid2path($mid); - $uuid =~ tr!/!!d; - my $h = '[a-f0-9]'; - my (@uuid5) = ($uuid =~ m!\A($h{8})($h{4})($h{4})($h{4})($h{12})!o); - $uuid = 'urn:uuid:' . join('-', @uuid5); - - $mid = PublicInbox::Hval->new_msgid($mid); - my $href = $ctx->{feed_base_url} . $mid->{href}. '/'; - + my $irt = PublicInbox::View::in_reply_to($hdr); + my $uuid = mid2uuid($mid); + my $base = $ctx->{feed_base_url}; + if (defined $irt) { + my $irt_uuid = mid2uuid($irt); + $irt = mid_escape($irt); + $irt = qq(); + } else { + $irt = ''; + } + my $href = $base . mid_escape($mid) . '/'; my $date = $hdr->header('Date'); my @t = eval { strptime($date) } if defined $date; @t = gmtime(time) unless scalar @t; @@ -124,7 +136,7 @@ sub feed_entry { PublicInbox::View::multipart_text_as_html($mime, $href) . '' . qq!!. - "$uuid"; + "$uuid$irt"; } sub feed_updated { -- EW