unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
From: Sharon Kimble <boudiccas@skimble.plus.com>
To: haj@posteo.de (Harald Jörg)
Cc: help-gnu-emacs@gnu.org
Subject: Re: Reading Atom feeds with Gnus
Date: Wed, 21 Oct 2020 13:19:33 +0100	[thread overview]
Message-ID: <874kmnwz3e.fsf@skimble.plus.com> (raw)
In-Reply-To: <87sga84gbm.fsf@hajtower> ("Harald Jörg"'s message of "Wed, 21 Oct 2020 01:40:13 +0200")

[-- Attachment #1: Type: text/plain, Size: 1720 bytes --]

haj@posteo.de (Harald Jörg) writes:

> Hello all,
>
> I'm moving (back) to Gnus as my mail+news+feed client, after having
> tried another program for some time without being really happy with it.
> During that time, some of the feeds I like to read moved from RSS to
> Atom-only - and I haven't figured out how to read those with Gnus.
>
> Right now, I'm using news.gwene.org to convert the Atom feeds to NNTP
> which works quite fine.  But this seems to be an unneccessary detour, so
> I'd prefer some "direct" approach.
>
> So... is there a recommended way to read Atom feeds with Gnus?

Hi Haj.

I do it everyday and it seems to be working out okay. I'll share with
you what I use.
    
And this comes from the gnu section of my config.

--8<---------------cut here---------------start------------->8---
  (require 'mm-url)
  (defadvice mm-url-insert (after DE-convert-atom-to-rss () )
    "Converts atom to RSS by calling xsltproc."
    (when (re-search-forward "xmlns=\"http://www.w3.org/.*/Atom\""
                             nil t)
      (goto-char (point-min))
      (message "Converting Atom to RSS... ")
      (call-process-region (point-min) (point-max)
                           "xsltproc"
                           t t nil
                           (expand-file-name "/home/boudiccas/.emacs.d/atom2rss.xsl") "-")
      (goto-char (point-min))
      (message "Converting Atom to RSS... done")))
--8<---------------cut here---------------end--------------->8---
      
I hope these help you. I've had the atom2rss file for some time (its
dated to 2018-06-25) and I can't remember where I got it from, so if
anyone knows I'd love to know.

Thanks
  Sharon.  


[-- Attachment #2: atom2rss --]
[-- Type: application/xslt+xml, Size: 9449 bytes --]

<?xml version="1.0" encoding="UTF-8" ?>
<!-- Released under CC lincense http://creativecommons.org/licenses/by/2.5/ -->
<!-- Feeds generated using this stylesheet (or it's derivatives) must put http://atom.geekhood.net in <generator> element -->
<x:stylesheet version="1.0" 
	exclude-result-prefixes="atom xhtml php"
	xmlns:php="http://php.net/xsl"
	xmlns:x="http://www.w3.org/1999/XSL/Transform" 
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:xhtml="http://www.w3.org/1999/xhtml">
<x:output encoding="utf-8" indent="yes" method="xml" media-type="application/rss+xml" />

<x:template match="/atom:feed">
	<rss version="2.0">
		<channel>
			<x:if test="//@xml:lang">
				<language><x:value-of select="//@xml:lang[1]" /></language>
			</x:if>
			
			<description>
				<x:choose>
					<x:when test="atom:subtitle"><x:apply-templates select="atom:subtitle" mode="asHTML"/></x:when>
					<x:otherwise>
						<!-- this sucks -->
						<x:apply-templates select="atom:title" mode="asHTML"/> (converted from Atom 1.0)
					</x:otherwise>
				</x:choose>
			</description>
		
			<x:choose>
				<x:when test="atom:logo"><image><x:apply-templates select="atom:logo" mode="image"/></image></x:when>
				<x:when test="atom:icon"><image><x:apply-templates select="atom:icon" mode="image"/></image></x:when>
			</x:choose>
			
			<x:apply-templates />
			<generator><x:if test="atom:generator"><x:apply-templates select="atom:generator" mode="gen"/> + </x:if>Atom 1.0 XSLT+PHP Transform v1.1 (http://atom.geekhood.net)</generator>
		</channel>
	</rss>
</x:template>


<!-- simple losless conversions -->
<x:template match="atom:contributor">
	<dc:contributor><x:call-template name="person" /></dc:contributor>
</x:template>

<x:template match="atom:title">
	<title><x:call-template name="asHTML" /></title>
</x:template>

<x:template match="atom:generator"/>
<x:template match="atom:generator" mode="gen">
	<x:apply-templates mode="asText"/> <x:if test="@version"> v<x:value-of select="@version"/></x:if> <x:if test="@uri"> (<x:value-of select="@uri"/>)</x:if>
</x:template>

<x:template match="atom:published|atom:updated">
	<x:if test="local-name() = 'published' or not(../atom:published)">
		<pubDate>
			<x:choose>
				<x:when test="function-available('php:function')">
					<x:variable name="time" select="php:function('strtotime', string(.))"/>
					<x:value-of select="php:function('gmstrftime', '%a, %d %b %Y %T %Z', $time)"/>
				</x:when>
 				<x:otherwise>
					<x:apply-templates/>
				</x:otherwise>
			</x:choose>
		</pubDate>
	</x:if>
</x:template>

<x:template match="atom:rights"><copyright><x:apply-templates /></copyright></x:template>

<x:template match="atom:link[not(@rel) or @rel='alternate']">
	<x:if test="generate-id(.) = generate-id(../atom:link[not(@rel) or @rel='alternate'][1])">
		<link><x:value-of select="@href"/></link>
	</x:if>
</x:template>

<x:template match="atom:link[@rel='enclosure']">
	<x:if test="generate-id(.) = generate-id(../atom:link[@rel='enclosure'][1])">
		<enclosure url="{@href}" type="{@type}" length="{@length}"/>
	</x:if>
</x:template>

<x:template match="atom:entry/atom:id">
	<guid>
		<x:if test="not(. = ../atom:link[@rel='alternate']/@href) and not(. = ../atom:link[@rel='permalink']/@href) and not(. = ../atom:link[not(@rel)]/@href)">
			<x:attribute name="isPermaLink">false</x:attribute>
		</x:if>
		<x:apply-templates />
	</guid>
</x:template>

<!-- dodgy conversions -->
<x:template match="atom:icon|atom:logo"/><!-- merged into rss:image -->
<x:template match="atom:icon|atom:logo" mode="image">
	<url><x:value-of select="."/></url>
	<x:if test="../atom:title"><title><x:apply-templates select="../atom:title" mode="asText" /></title></x:if>
	<x:if test="../atom:link[not(@rel) or @rel='alternate']"><link><x:value-of select="../atom:link[not(@rel) or @rel='alternate'][1]/@href"/></link></x:if>
</x:template>

<x:template name="person">
	<x:choose>
		<x:when test="atom:email"><x:value-of select="atom:email"/></x:when>
		<x:when test="/atom:feed/atom:author[./atom:email][1]/atom:email"><x:value-of select="/atom:feed/atom:author[./atom:email][1]/atom:email"/></x:when>
	</x:choose>
	 (<x:value-of select="atom:name"/><x:if test="@uri"> <x:value-of select="uri"/></x:if>)
</x:template>
	
<x:template match="atom:author[not(starts-with(./atom:email,'webmaster@'))][1]">
	<x:if test="atom:email">
		<managingEditor>
			<x:call-template name="person" />
		</managingEditor>
	</x:if>
</x:template>

<x:template match="atom:author[starts-with(./atom:email,'webmaster@')][1]">
	<webMaster>
		<x:call-template name="person" />
	</webMaster>
</x:template>

<x:template match="atom:subtitle"/>

<x:template match="atom:source">
	<source url="{atom:link[@rel='self']}"><x:apply-templates select="atom:title" mode="asText"/></source>
</x:template>

<!-- lossy conversion -->
<x:template match="atom:feed/atom:id"/>

<x:template match="atom:feed/atom:link[@rel='self']">
<x:comment> source: <x:value-of select="@href"/><x:text> </x:text></x:comment></x:template>

<x:template match="atom:category"><!-- label gets lost -->
	<category>
		<x:if test="@scheme">
			<x:attribute name="domain"><x:value-of select="@scheme"/></x:attribute>
		</x:if>
		<x:value-of select="@term"/>
		<x:if test="@label and not(@label = @term)"><x:comment><x:value-of select="@label"/></x:comment></x:if>
	</category>
</x:template>


<!-- entry -->
<x:template match="atom:summary|atom:content"/>

<x:template match="atom:entry">
<item>
	<x:choose>
		<x:when test="atom:summary"><description><x:apply-templates select="atom:summary" mode="asHTML"/> <x:if test="atom:content"> (...)</x:if></description></x:when> 
		<x:when test="atom:content"><description><x:apply-templates select="atom:content" mode="asHTML"/></description></x:when> 
	</x:choose>
	<x:apply-templates/>
	<x:if test="not(atom:source) and /atom:feed/atom:link[@rel='self']">
		<source url="{/atom:feed/atom:link[@rel='self']/@href}">
			<x:choose>
				<x:when test="/atom:feed/atom:link[@rel='self' and @title]"><x:value-of select="/atom:feed/atom:link[@rel='self']/@title"/></x:when>
				<x:otherwise><x:apply-templates select="/atom:feed/atom:title" mode="asText"/></x:otherwise>
			</x:choose>
		</source>
	</x:if>
	<x:apply-templates select="atom:source/atom:category"/>
	<x:if test="not(atom:copyright)"><x:apply-templates select="atom:source/atom:copyright"/></x:if>
	<x:if test="not(atom:author)"><x:apply-templates select="atom:source/atom:author"/></x:if>
	<x:if test="not(atom:contributor)"><x:apply-templates select="atom:source/atom:contributor"/></x:if>
	<x:if test="not(atom:updated)"><x:apply-templates select="atom:source/atom:updated"/></x:if>
</item>
</x:template>


<!-- santas little helpers -->
<x:template match="*" mode="asHTML"><x:call-template name="asHTML"/></x:template>
<x:template name="asHTML">
	<x:choose>
		<x:when test="@type='xhtml'">
			<x:apply-templates select="xhtml:div" mode="xhtml2html" />
		</x:when>
		<x:when test="@type='html'"><x:value-of select="." /></x:when>
		<x:otherwise>
			<x:value-of select="."/>
		</x:otherwise>
	</x:choose>		
</x:template>

<x:template match="*[@type='html' or @type='text/html']" mode="asText">
	<x:call-template name="removeHtml"><x:with-param name="text" select="."/></x:call-template>
</x:template>

<x:template match="*" mode="asText">
	<x:value-of select="."/>
</x:template>


<!-- html 2 text (primitive method) -->
<x:template name="removeHtml">
  <x:param name="text"/>
  <x:choose>
    <x:when test="contains($text, '&lt;') and contains(substring-after($text, '&lt;'),'&gt;')">
		<x:value-of select="substring-before($text, '&lt;')"/>
		<x:call-template name="removeHtml">
  		<x:with-param name="text" select="substring-after(substring-after($text,'&lt;'),'&gt;')"/>
		</x:call-template>
    </x:when> 
    <x:otherwise>
      <x:value-of select="$text"/>  
    </x:otherwise>
 </x:choose>            
</x:template>


<!-- xhtml 2 html -->
<x:template match="xhtml:img|xhtml:br|xhtml:hr|xhtml:input|xhtml:col|xhtml:area|xhtml:input|xhtml:link|xhtml:meta|xhtml:param" mode="xhtml2html">
	&lt;<x:value-of select="local-name(.)"/><x:apply-templates select="@*" mode="xhtml2html"/>&gt;<x:apply-templates mode="xhtml2html"/>
</x:template>

<x:template match='xhtml:*' mode="xhtml2html">
	&lt;<x:value-of select="local-name(.)"/><x:apply-templates select="@*" mode="xhtml2html"/>&gt;<x:apply-templates mode="xhtml2html"/>&lt;/<x:value-of select="local-name(.)"/>&gt;
</x:template>

<x:template match='@*' mode="xhtml2html">
	<x:text> </x:text><x:value-of select="local-name(.)"/>="<x:value-of select="."/>"</x:template>

<x:template match="comment()" mode="xhtml2html">
	<x:text disable-output-escaping="yes">&lt;![CDATA[</x:text>
	<x:comment><x:value-of select="."/></x:comment>
	<x:text disable-output-escaping="yes">]]&gt;</x:text>			
</x:template>

<x:template match="text()" mode="xhtml2html">
	<x:choose>
		<x:when test="contains(.,'&amp;') or contains(.,'&lt;')">
			<x:text disable-output-escaping="yes">&lt;![CDATA[</x:text>
			<x:value-of select="." />
			<x:text disable-output-escaping="yes">]]&gt;</x:text>			
		</x:when>
		<x:otherwise>
			<x:value-of select="."/>
		</x:otherwise>
	</x:choose>
</x:template>


<!-- copy extensions -->
<x:template match='*'>
	<x:comment>Unknown element <x:value-of select="local-name(.)"/></x:comment>
	<x:copy>
  	<x:copy-of select='node()|@*'/>
	</x:copy>
</x:template>

</x:stylesheet>

[-- Attachment #3: Type: text/plain, Size: 175 bytes --]

-- 
A taste of linux = http://www.sharons.org.uk
TGmeds = http://www.tgmeds.org.uk
DrugFacts = https://www.drugfacts.org.uk
Debian 10.6, fluxbox 1.3.7, emacs 27.1.50, org 9.4

  parent reply	other threads:[~2020-10-21 12:19 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-20 23:40 Reading Atom feeds with Gnus Harald Jörg
2020-10-20 23:43 ` Emanuel Berg via Users list for the GNU Emacs text editor
2020-10-21 14:04   ` Harald Jörg
2020-10-21  2:03 ` Tim Landscheidt
2020-10-21  2:37   ` Emanuel Berg via Users list for the GNU Emacs text editor
2020-10-21 12:19 ` Sharon Kimble [this message]
2020-10-21 14:31   ` Harald Jörg
2020-10-21 16:17     ` Stefan Monnier
2020-10-21 16:20       ` Emanuel Berg via Users list for the GNU Emacs text editor
2020-10-21 19:08         ` Stefan Monnier
2020-10-21 19:37           ` Jude DaShiell
2020-10-27  0:12           ` Emanuel Berg via Users list for the GNU Emacs text editor

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=874kmnwz3e.fsf@skimble.plus.com \
    --to=boudiccas@skimble.plus.com \
    --cc=haj@posteo.de \
    --cc=help-gnu-emacs@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).