feed: Convert 'friendly-name' setting to 'name-format'
authorW. Trevor King <wking@tremily.us>
Tue, 10 Sep 2013 19:04:05 +0000 (12:04 -0700)
committerW. Trevor King <wking@tremily.us>
Tue, 10 Sep 2013 19:14:22 +0000 (12:14 -0700)
In Debian bug 722009, Joey Hess wrote about the 2.x series [1]:
> The current From line generated by r2e is From: Blog: Author
>   where
>     Blog is the name of the blog, or some page like a wiki's RecentChanges
>     Author is the author of a post
>       iff the blog sets that info in the feed
>
> In mutt the Blog part often occupies the whole displayed Subject field,
> which is fixed width. So the Author cannot be seen. This is particularly
> a problem with planets, where the author of a post matters a lot.
> But also with some blogs that have multiple authors.
>
> For these sorts of blogs, I would generally prefer to use a From line
> like From: Author (Blog)
> This does mean that when sorting by author, all posts of a blog or
> planet feed may not appear together, but that would be an acceptable
> tradeoff to me.
>
> One way to implement this (other than just changing the format string)
> would be to make OVERRIDE_FROM able to contain a format string,
> so it could be configured on a per-feed basis.

The new setup makes the name-formatting configurable on a per feed
basis (what Joey wanted), but it's not without side effects.  For
feeds where some information is missing (feed-title, author, or
publisher), we used to adjust the formatting on the fly.  For example,
you'd get output like '{author}' if the feed-title was missing,
instead of getting ': {author}'.  Now users bothered by this will have
to manually override the format template for feeds missing crucial
data.

[1]: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=722009

Signed-off-by: W. Trevor King <wking@tremily.us>
CHANGELOG
r2e.1
rss2email/config.py
rss2email/feed.py

index 3ab01fe2553d5579b01df452a204edee1c5da00b..2cd8b6869d6a5233af0954b320fdccdaee0b2c1c 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+v3.7 (unreleased)
+    * Convert the `friendly-name` boolean to the new `name-format` setting.  This allow users to customize how the friendly name is constructed.
+
 v3.6 (2013-09-09)
     * Fix missing port argument for IMAPAuthenticationError.
     * Fix `<div id="entry>` syntax error in HTML mail.
diff --git a/r2e.1 b/r2e.1
index 19da7008e1bd328543f399e7474db5ead2f72934..715748608e6841f21ad4346430aaff8e4ec1f2dd 100644 (file)
--- a/r2e.1
+++ b/r2e.1
@@ -115,7 +115,7 @@ configuration file for you, which you can edit as you see fit.  The
 setting for all feeds, change the value in the \fB[DEFAULT]\fR
 section.  To override a setting for a particular feed, add that
 setting to the feed-specific section.  Here is an example overriding
-\fBuse-publisher-email\fR and \fBfriendly-name\fR for the
+\fBuse-publisher-email\fR and \fBname-format\fR for the
 \fBfeedname\fR feed.
 .P
 .RS 4
@@ -124,14 +124,14 @@ setting to the feed-specific section.  Here is an example overriding
 from = user@rss2email.invalid
 force-from = False
 use-publisher-email = False
-friendly-name = True
+name-format = '{feed-title}: {author}'
   .\|.\|.
 verbose = warning
 
 [feed.feedname]
 url = http://feed.url/somewhere.rss
 use-publisher-email = True
-friendly-name = False
+name-format = '{author} ({feed.title})'
 .RE
 .P
 .SH FILES
index fb7cd30ea3f49a55d533507341d2d323a4ec5201..6b5155fa8056d7ed9b888e9b79fe7fa2f1d2add5 100644 (file)
@@ -72,9 +72,11 @@ CONFIG['DEFAULT'] = _collections.OrderedDict((
         # True: Use the publisher's email if you can't find the author's.
         # False: Just use the 'from' email instead.
         ('use-publisher-email', str(False)),
-        # Only use the feed email address rather than friendly name
-        # plus email address
-        ('friendly-name', str(True)),
+        # If empty, only use the feed email address rather than
+        # friendly name plus email address.  Available attributes may
+        # include 'feed', 'feed-title', 'author', and 'publisher', but
+        # only 'feed' is guaranteed.
+        ('name-format', '{feed-title}: {author}'),
         # Set this to default To email addresses.
         ('to', ''),
 
index 3999b0c7dcf3e4d5968da25a841da8b6a16112ac..3835a45a5fc79befd31fcb83678d607a16962b7a 100644 (file)
@@ -164,7 +164,6 @@ class Feed (object):
         'digest',
         'force_from',
         'use_publisher_email',
-        'friendly_name',
         'active',
         'date_header',
         'trust_guid',
@@ -538,31 +537,33 @@ class Feed (object):
         ...     '</feed>\\n'
         ...     )
         >>> entry = parsed.entries[0]
-        >>> f.friendly_name = False
+        >>> f.name_format = ''
         >>> f._get_entry_name(parsed, entry)
         ''
-        >>> f.friendly_name = True
+        >>> f.name_format = '{author}'
         >>> f._get_entry_name(parsed, entry)
         'Example author'
+        >>> f.name_format = '{feed-title}: {author}'
+        >>> f._get_entry_name(parsed, entry)
+        ': Example author'
+        >>> f.name_format = '{author} ({feed.name})'
+        >>> f._get_entry_name(parsed, entry)
+        'Example author (test-feed)'
         """
-        if not self.friendly_name:
+        if not self.name_format:
             return ''
-        parts = ['']
+        data = {'feed': self}
         feed = parsed.feed
-        parts.append(feed.get('title', ''))
+        data['feed-title'] = feed.get('title', '')
         for x in [entry, feed]:
             if 'name' in x.get('author_detail', []):
                 if x.author_detail.name:
-                    if ''.join(parts):
-                        parts.append(': ')
-                    parts.append(x.author_detail.name)
+                    data['author'] = x.author_detail.name
                     break
-        if not ''.join(parts) and self.use_publisher_email:
-            if 'name' in feed.get('publisher_detail', []):
-                if ''.join(parts):
-                    parts.append(': ')
-                parts.append(feed.publisher_detail.name)
-        return _html2text.unescape(''.join(parts))
+        if 'name' in feed.get('publisher_detail', []):
+            data['publisher'] = feed.publisher_detail.name
+        name = self.name_format.format(**data)
+        return _html2text.unescape(name)
 
     def _validate_email(self, email, default=None):
         """Do a basic quality check on email address