Compare commits
7 Commits
d24734110a
...
v1.1
Author | SHA1 | Date | |
---|---|---|---|
fbcb23cf88 | |||
a0e8e84a67 | |||
a90fd682db | |||
2c245f9506 | |||
3d45451fef | |||
4d785820d9 | |||
6a01fc439e |
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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
122
www/sheet.xsl
Normal 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">
|
||||||
|
<
|
||||||
|
<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>
|
||||||
|
>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<xsl:if test="node()">
|
||||||
|
<ul>
|
||||||
|
<xsl:apply-templates/>
|
||||||
|
</ul>
|
||||||
|
</xsl:if>
|
||||||
|
|
||||||
|
<span class="element">
|
||||||
|
</
|
||||||
|
<span class="tag"><xsl:value-of select="name()"/></span>
|
||||||
|
>
|
||||||
|
</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>
|
Reference in New Issue
Block a user