Compare commits

...

7 Commits

Author SHA1 Message Date
fbcb23cf88 index.Html: fix meta tag 2020-03-20 20:21:08 +01:00
a0e8e84a67 sheet.xsl: mobile-friendly view & url fix 2020-03-20 19:47:43 +01:00
a90fd682db sheet.xsl: show feed url (js-based) 2020-03-20 19:46:20 +01:00
2c245f9506 sheet.xsl: improve output formatting
Include tags, better CSS
2020-03-20 16:44:49 +01:00
3d45451fef sheet.xsl: improve element content output 2020-03-20 15:44:25 +01:00
4d785820d9 feeds: ignore provided stylesheets and add ours
Provided sheets usually create errors. Ours is (hopefully) more informative for users not familiar with RSS feeds
2020-03-20 15:32:44 +01:00
6a01fc439e feeds: better handle "empty" datetime 2020-03-20 12:30:42 +01:00
3 changed files with 133 additions and 4 deletions

View File

@@ -294,7 +294,7 @@ class ParserXML(ParserBase):
'rssfake': 'http://purl.org/rss/1.0/'} 'rssfake': 'http://purl.org/rss/1.0/'}
def parse(self, raw): def parse(self, raw):
parser = etree.XMLParser(recover=True, remove_blank_text=True) # remove_blank_text needed for pretty_print parser = etree.XMLParser(recover=True, remove_blank_text=True, remove_pis=True) # remove_blank_text needed for pretty_print
return etree.fromstring(raw, parser) return etree.fromstring(raw, parser)
def remove(self): def remove(self):
@@ -469,7 +469,10 @@ class ParserHTML(ParserXML):
def parse_time(value): def parse_time(value):
if isinstance(value, basestring): if value is None or value == 0:
return None
elif isinstance(value, basestring):
if re.match(r'^[0-9]+$', value): if re.match(r'^[0-9]+$', value):
return datetime.fromtimestamp(int(value), tz.UTC) return datetime.fromtimestamp(int(value), tz.UTC)
@@ -483,7 +486,7 @@ def parse_time(value):
return value return value
else: else:
return False return None
class ParserJSON(ParserBase): class ParserJSON(ParserBase):
@@ -695,6 +698,10 @@ class FeedXML(Feed, ParserXML):
def tostring(self, encoding='unicode', **k): def tostring(self, encoding='unicode', **k):
# override needed due to "getroottree" inclusion # override needed due to "getroottree" inclusion
if self.root.getprevious() is None:
self.root.addprevious(etree.PI('xml-stylesheet', 'type="text/xsl" href="/sheet.xsl"'))
return etree.tostring(self.root.getroottree(), encoding=encoding, **k) return etree.tostring(self.root.getroottree(), encoding=encoding, **k)

View File

@@ -2,7 +2,7 @@
<html> <html>
<head> <head>
<title>morss</title> <title>morss</title>
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;"> <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;" />
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<style type="text/css"> <style type="text/css">
body body

122
www/sheet.xsl Normal file
View File

@@ -0,0 +1,122 @@
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<head>
<title>RSS feed by morss</title>
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;" />
<style type="text/css">
body {
overflow-wrap: anywhere;
word-wrap: anywhere;
}
#url {
background-color: rgba(255, 165, 0, 0.25);
padding: 1% 5%;
display: inline-block;
max-width: 100%;
}
body > ul {
background-color: #FFFAF4;
padding: 1%;
max-width: 100%;
}
ul {
list-style-type: none;
}
.tag {
color: darkred;
}
.attr {
color: darksalmon;
}
.value {
color: darkblue;
}
.comment {
color: lightgrey;
}
pre {
margin: 0;
max-width: 100%;
white-space: normal;
}
</style>
</head>
<body>
<h1>RSS feed by morss</h1>
<p>Your RSS feed is <strong style="color: green">ready</strong>. You
can enter the following url in your newsreader:</p>
<div id="url"></div>
<ul>
<xsl:apply-templates/>
</ul>
<script>
document.getElementById("url").innerHTML = window.location.href;
</script>
</body>
</html>
</xsl:template>
<xsl:template match="*">
<li>
<span class="element">
&lt;
<span class="tag"><xsl:value-of select="name()"/></span>
<xsl:for-each select="@*">
<span class="attr"> <xsl:value-of select="name()"/></span>
=
"<span class="value"><xsl:value-of select="."/></span>"
</xsl:for-each>
&gt;
</span>
<xsl:if test="node()">
<ul>
<xsl:apply-templates/>
</ul>
</xsl:if>
<span class="element">
&lt;/
<span class="tag"><xsl:value-of select="name()"/></span>
&gt;
</span>
</li>
</xsl:template>
<xsl:template match="comment()">
<li>
<pre class="comment"><![CDATA[<!--]]><xsl:value-of select="."/><![CDATA[-->]]></pre>
</li>
</xsl:template>
<xsl:template match="text()">
<li>
<pre>
<xsl:value-of select="normalize-space(.)"/>
</pre>
</li>
</xsl:template>
<xsl:template match="text()[not(normalize-space())]"/>
</xsl:stylesheet>