forked from sch/Rivista
431 lines
29 KiB
XML
431 lines
29 KiB
XML
<?xml version="1.0" encoding="UTF-8" ?>
|
|
|
|
<!--
|
|
Copyright (C) 2016 - 2017 Schimon Jehuda. Released under MIT license
|
|
Feeds rendered using this XSLT stylesheet, or it's derivatives, must
|
|
include https://schimon.i2p/ in attribute name='generator' of
|
|
element <meta/> inside of html element </head>
|
|
-->
|
|
|
|
<xsl:stylesheet version='1.0'
|
|
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
|
|
xmlns:xml='http://www.w3.org/XML/1998/namespace'
|
|
xmlns:media='http://search.yahoo.com/mrss/'
|
|
xmlns:georss='http://www.georss.org/georss'
|
|
xmlns:geo='http://www.w3.org/2003/01/geo/wgs84_pos#'
|
|
xmlns:atom10='http://www.w3.org/2005/Atom'
|
|
xmlns:atom='http://www.w3.org/2005/Atom'>
|
|
<!-- Atom 1.0 Syndication Format -->
|
|
<xsl:output
|
|
media-type='application/atom+xml' />
|
|
<xsl:template match='/atom:feed'>
|
|
<!-- index right-to-left language codes -->
|
|
<!-- TODO http://www.w3.org/TR/xpath/#function-lang -->
|
|
<xsl:variable name='rtl'
|
|
select='@xml:lang[
|
|
contains(self::node(),"ar") or
|
|
contains(self::node(),"fa") or
|
|
contains(self::node(),"he") or
|
|
contains(self::node(),"ji") or
|
|
contains(self::node(),"ku") or
|
|
contains(self::node(),"ur") or
|
|
contains(self::node(),"yi")]'/>
|
|
<html>
|
|
<head>
|
|
<xsl:call-template name='metadata'>
|
|
<xsl:with-param name='name' select='"description"' />
|
|
<xsl:with-param name='content' select='atom:subtitle' />
|
|
</xsl:call-template>
|
|
<xsl:call-template name='metadata'>
|
|
<xsl:with-param name='name' select='"generator"' />
|
|
<xsl:with-param name='content' select='StreamBurner' />
|
|
</xsl:call-template>
|
|
<xsl:call-template name='metadata'>
|
|
<xsl:with-param name='name' select='"mimetype"' />
|
|
<xsl:with-param name='content' select='"application/atom+xml"' />
|
|
</xsl:call-template>
|
|
<title>
|
|
<xsl:choose>
|
|
<xsl:when test='atom:title and not(atom:title="")'>
|
|
<xsl:value-of select='atom:title'/>
|
|
</xsl:when>
|
|
<xsl:otherwise>StreamBurner</xsl:otherwise>
|
|
</xsl:choose>
|
|
</title>
|
|
<!-- TODO media='print' -->
|
|
<link href='/css/stylesheet.css' rel='stylesheet' type='text/css' media='screen'/>
|
|
<link rel='icon' type='image/svg+xml' href='/graphic/xmpp.svg'/>
|
|
<!-- whether language code is of direction right-to-left -->
|
|
<xsl:if test='$rtl'>
|
|
<link id='semitic' href='/css/stylesheet-rtl.css' rel='stylesheet' type='text/css' />
|
|
</xsl:if>
|
|
<script type='text/javascript' src='/script/marked.min.js'/>
|
|
<script type='text/javascript' src='/script/postprocess.js'/>
|
|
</head>
|
|
<body>
|
|
<div id='actions'>
|
|
<a id='follow' title='Subscribe the latest updates and news.'
|
|
onclick='window.open(location.href.replace(/^https?:/, "feed:"), "_self")'>
|
|
<!-- xsl:attribute name="href">
|
|
feed:<xsl:value-of select="atom:link[@rel='self']/@href" />
|
|
</xsl:attribute -->
|
|
Follow
|
|
</a>
|
|
<a id='subtome' title='Subscribe via SubToMe.'>
|
|
<xsl:attribute name='href'>
|
|
javascript:location.href='https://www.subtome.com/#/subscribe?feeds='+location.href;
|
|
</xsl:attribute>
|
|
<xsl:attribute name='onclick'>
|
|
(
|
|
function(btn){
|
|
var z=document.createElement('script');
|
|
document.subtomeBtn=btn;
|
|
z.src='https://www.subtome.com/load.js';document.body.appendChild(z);
|
|
}
|
|
)(this);
|
|
return false;
|
|
</xsl:attribute>
|
|
SubToMe
|
|
</a>
|
|
<a href='https://git.xmpp-it.net/sch/PubSubToAtom'
|
|
title='About PubSub To Atom.'>
|
|
About
|
|
</a>
|
|
<a href='https://aboutfeeds.com/'
|
|
title='Of the benefits of syndication feed.'
|
|
id='aboutfeeds'>
|
|
Feeds
|
|
</a>
|
|
<a href='https://xmpp.org/about/technology-overview/'
|
|
title='Of the benefits of XMPP.'>
|
|
XMPP
|
|
</a>
|
|
<a href='https://join.jabber.network/#syndication@conference.movim.eu?join'
|
|
title='Syndictaion and PubSub.'>
|
|
Groupchat
|
|
</a>
|
|
</div>
|
|
<div id='feed'>
|
|
<div id='header'>
|
|
<!-- feed title -->
|
|
<h1 id='title'>
|
|
<xsl:choose>
|
|
<xsl:when test='atom:title and not(atom:title="") and count(atom:entry) > 1'>
|
|
<xsl:value-of select='atom:title'/>
|
|
</xsl:when>
|
|
<xsl:when test='atom:entry'>
|
|
<xsl:value-of select='atom:entry/atom:title'/>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
StreamBurner
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</h1>
|
|
<!-- feed subtitle -->
|
|
<h2 id='subtitle'>
|
|
<xsl:choose>
|
|
<xsl:when test='atom:title and not(atom:title="") and count(atom:entry) > 1'>
|
|
<xsl:value-of select='atom:subtitle'/>
|
|
</xsl:when>
|
|
<xsl:when test='atom:entry'>
|
|
<xsl:attribute name='class'><xsl:text>date</xsl:text></xsl:attribute>
|
|
<xsl:value-of select='atom:entry/atom:updated'/>
|
|
</xsl:when>
|
|
<xsl:when test='atom:entry'>
|
|
<xsl:attribute name='class'><xsl:text>date</xsl:text></xsl:attribute>
|
|
<xsl:value-of select='atom:entry/atom:published'/>
|
|
</xsl:when>
|
|
</xsl:choose>
|
|
</h2>
|
|
</div>
|
|
<xsl:if test='count(atom:entry) > 1'>
|
|
<div id='menu'>
|
|
<h3>Latest Posts</h3>
|
|
<!-- xsl:for-each select='atom:entry[position() <21]' -->
|
|
<ul>
|
|
<xsl:for-each select='atom:entry[not(position() > 20)]'>
|
|
<li>
|
|
<xsl:element name='a'>
|
|
<xsl:attribute name='href'>
|
|
<xsl:text>#stremburner-</xsl:text>
|
|
<xsl:value-of select='position()'/>
|
|
</xsl:attribute>
|
|
<xsl:choose>
|
|
<xsl:when test='string-length(atom:title) > 0'>
|
|
<xsl:value-of select='atom:title'/>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
*** No Title ***
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:element>
|
|
</li>
|
|
</xsl:for-each>
|
|
</ul>
|
|
</div>
|
|
</xsl:if>
|
|
<div id='articles'>
|
|
<!-- feed entry -->
|
|
<xsl:choose>
|
|
<xsl:when test='atom:entry'>
|
|
<ul>
|
|
<xsl:for-each select='atom:entry[not(position() >20)]'>
|
|
<li>
|
|
<div class='entry'>
|
|
<!-- entry title -->
|
|
<h3 class='title'>
|
|
<xsl:element name='a'>
|
|
<xsl:attribute name='href'>
|
|
<xsl:choose>
|
|
<xsl:when test='atom:link[contains(@rel,"alternate")]'>
|
|
<xsl:value-of select='atom:link[contains(@rel,"alternate")]/@href'/>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<xsl:value-of select='atom:link/@href'/>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:attribute>
|
|
<xsl:attribute name='title'>
|
|
<xsl:value-of select='atom:title'/>
|
|
</xsl:attribute>
|
|
<xsl:attribute name='id'>
|
|
<xsl:text>stremburner-</xsl:text>
|
|
<xsl:value-of select='position()'/>
|
|
</xsl:attribute>
|
|
<xsl:choose>
|
|
<xsl:when test='string-length(atom:title) > 0'>
|
|
<xsl:value-of select='atom:title'/>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
*** No Title ***
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:element>
|
|
</h3>
|
|
<!-- geographic location -->
|
|
<xsl:choose>
|
|
<xsl:when test='geo:lat and geo:long'>
|
|
<xsl:variable name='lat' select='geo:lat'/>
|
|
<xsl:variable name='lng' select='geo:long'/>
|
|
<span class='geolocation'>
|
|
<a href='geo:{$lat},{$lng}'>📍</a>
|
|
</span>
|
|
</xsl:when>
|
|
<xsl:when test='geo:Point'>
|
|
<xsl:variable name='lat' select='geo:Point/geo:lat'/>
|
|
<xsl:variable name='lng' select='geo:Point/geo:long'/>
|
|
<span class='geolocation'>
|
|
<a href='geo:{$lat},{$lng}'>📍</a>
|
|
</span>
|
|
</xsl:when>
|
|
<xsl:when test='georss:point'>
|
|
<xsl:variable name='lat' select='substring-before(georss:point, " ")'/>
|
|
<xsl:variable name='lng' select='substring-after(georss:point, " ")'/>
|
|
<xsl:variable name='name' select='georss:featurename'/>
|
|
<span class='geolocation'>
|
|
<a href='geo:{$lat},{$lng}' title='{$name}'>📍</a>
|
|
</span>
|
|
</xsl:when>
|
|
</xsl:choose>
|
|
<!-- div class='posted' -->
|
|
<!-- entry author -->
|
|
<!-- xsl:if test='atom:author'>
|
|
<span class='author'>
|
|
<xsl:choose>
|
|
<xsl:when test='atom:author/atom:email'>
|
|
<xsl:element name='a'>
|
|
<xsl:attribute name='href'>
|
|
<xsl:text>mailto:</xsl:text>
|
|
<xsl:value-of select='atom:author/atom:email'/>
|
|
</xsl:attribute>
|
|
<xsl:attribute name='title'>
|
|
<xsl:text>Send an Email to </xsl:text>
|
|
<xsl:value-of select='atom:author/atom:email'/>
|
|
</xsl:attribute>
|
|
<xsl:value-of select='atom:author/atom:name'/>
|
|
</xsl:element>
|
|
</xsl:when>
|
|
<xsl:when test='atom:author/atom:uri'>
|
|
<xsl:element name='a'>
|
|
<xsl:attribute name='href'>
|
|
<xsl:value-of select='atom:author/atom:uri'/>
|
|
</xsl:attribute>
|
|
<xsl:attribute name='title'>
|
|
<xsl:value-of select='atom:author/atom:summary'/>
|
|
</xsl:attribute>
|
|
<xsl:value-of select='atom:author/atom:name'/>
|
|
</xsl:element>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<xsl:value-of select='atom:name'/>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</span>
|
|
</xsl:if -->
|
|
<!-- entry date -->
|
|
<xsl:choose>
|
|
<xsl:when test='atom:updated'>
|
|
<h4 class='updated'>
|
|
<xsl:value-of select='atom:updated'/>
|
|
</h4>
|
|
</xsl:when>
|
|
<xsl:when test='atom:published'>
|
|
<h4 class='published'>
|
|
<xsl:value-of select='atom:published'/>
|
|
</h4>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<h4 class='warning atom1 published'></h4>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
<!-- /div -->
|
|
<!-- entry content -->
|
|
<!-- entry summary of GitLab Atom Syndication Feeds -->
|
|
<xsl:if test='atom:content or atom:summary'>
|
|
<p class='content'>
|
|
<xsl:choose>
|
|
<xsl:when test='atom:summary[contains(@type,"text")]'>
|
|
<xsl:attribute name='type'>
|
|
<xsl:value-of select='atom:summary/@type'/>
|
|
</xsl:attribute>
|
|
<xsl:value-of select='atom:summary'/>
|
|
</xsl:when>
|
|
<xsl:when test='atom:summary[contains(@type,"base64")]'>
|
|
<!-- TODO add xsl:template to handle inline media -->
|
|
</xsl:when>
|
|
<xsl:when test='atom:content[contains(@type,"text")]'>
|
|
<xsl:attribute name='type'>
|
|
<xsl:value-of select='atom:content/@type'/>
|
|
</xsl:attribute>
|
|
<xsl:value-of select='atom:content'/>
|
|
</xsl:when>
|
|
<xsl:when test='atom:content[contains(@type,"base64")]'>
|
|
<!-- TODO add xsl:template to handle inline media -->
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<xsl:choose>
|
|
<xsl:when test='atom:summary and not(atom:summary="")'>
|
|
<xsl:value-of select='atom:summary' disable-output-escaping='yes'/>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<xsl:value-of select='atom:content' disable-output-escaping='yes'/>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</p>
|
|
</xsl:if>
|
|
<!-- entry enclosure -->
|
|
<xsl:if test='atom:link[contains(@rel,"enclosure")]'>
|
|
<div class='enclosure' title='Right-click and Save link as…'>
|
|
<xsl:for-each select='atom:link[contains(@rel,"enclosure")]'>
|
|
<xsl:element name='span'>
|
|
<xsl:attribute name='icon'>
|
|
<xsl:value-of select='substring-before(@type,"/")'/>
|
|
</xsl:attribute>
|
|
</xsl:element>
|
|
<xsl:element name='a'>
|
|
<xsl:attribute name='href'>
|
|
<xsl:value-of select='@href'/>
|
|
</xsl:attribute>
|
|
<xsl:attribute name='download'/>
|
|
<xsl:call-template name='extract-filename'>
|
|
<xsl:with-param name='url' select='@href' />
|
|
</xsl:call-template>
|
|
</xsl:element>
|
|
<xsl:element name='span'>
|
|
<xsl:attribute name='class'>
|
|
<xsl:value-of select='substring-before(@type,"/")'/>
|
|
</xsl:attribute>
|
|
</xsl:element>
|
|
<xsl:if test='@length > 0'>
|
|
<xsl:call-template name='transform-filesize'>
|
|
<xsl:with-param name='length' select='@length' />
|
|
</xsl:call-template>
|
|
</xsl:if>
|
|
<xsl:element name='br'/>
|
|
</xsl:for-each>
|
|
<xsl:for-each select='media:content'>
|
|
<xsl:element name='span'>
|
|
<xsl:attribute name='icon'>
|
|
<xsl:value-of select='@medium'/>
|
|
</xsl:attribute>
|
|
</xsl:element>
|
|
<xsl:element name='a'>
|
|
<xsl:attribute name='href'>
|
|
<xsl:value-of select='@url'/>
|
|
</xsl:attribute>
|
|
<xsl:attribute name='download'/>
|
|
<xsl:call-template name='extract-filename'>
|
|
<xsl:with-param name='url' select='@url' />
|
|
</xsl:call-template>
|
|
</xsl:element>
|
|
<xsl:element name='span'>
|
|
<xsl:attribute name='class'>
|
|
<xsl:value-of select='@medium'/>
|
|
</xsl:attribute>
|
|
</xsl:element>
|
|
<xsl:if test='@fileSize > 0'>
|
|
<xsl:call-template name='transform-filesize'>
|
|
<xsl:with-param name='length' select='@fileSize' />
|
|
</xsl:call-template>
|
|
</xsl:if>
|
|
<xsl:element name='br'/>
|
|
</xsl:for-each>
|
|
</div>
|
|
</xsl:if>
|
|
</div>
|
|
<!-- entry id -->
|
|
<xsl:if test='not(atom:id)'>
|
|
<div class='warning atom1 id'></div>
|
|
</xsl:if>
|
|
</li>
|
|
</xsl:for-each>
|
|
</ul>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<div class='notice no-entry'></div>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</div>
|
|
</div>
|
|
<div id='references'>
|
|
<a href='https://joinjabber.org/'
|
|
title='An inclusive space on the Jabber network.'>
|
|
JoinJabber
|
|
</a>
|
|
<a href='https://libervia.org/'
|
|
title='The Universal Communication Ecosystem.'>
|
|
Libervia
|
|
</a>
|
|
<a href='https://join.movim.eu/'
|
|
title='The social platform shaped for your community.'>
|
|
Movim
|
|
</a>
|
|
<a href='https://modernxmpp.org/'
|
|
title='A project to improve the quality of user-to-user messaging applications that use XMPP.'>
|
|
Modern
|
|
</a>
|
|
<a href='https://xmpp.org/'
|
|
title='The universal messaging standard.'>
|
|
XMPP
|
|
</a>
|
|
<a href='https://xmpp.org/extensions/xep-0060.html'
|
|
title='XEP-0060: Publish-Subscribe.'>
|
|
PubSub
|
|
</a>
|
|
</div>
|
|
<!-- note -->
|
|
<p id='note'>
|
|
<i>
|
|
This is an XMPP news feed which is conveyed as HTML,
|
|
and it can even be viewed by a syndication feed reader
|
|
which provides automated notifications on desktop and
|
|
mobile. <span id="selection-link">Click here</span> for
|
|
a selection of software that would fit you best!
|
|
</i>
|
|
</p>
|
|
</body>
|
|
</html>
|
|
</xsl:template>
|
|
</xsl:stylesheet>
|