Initial support for opml-top100
This commit is contained in:
parent
87f99e8a01
commit
8844223b7b
Binary file not shown.
Before Width: | Height: | Size: 469 B |
Binary file not shown.
Before Width: | Height: | Size: 5.3 KiB |
@ -1,150 +0,0 @@
|
|||||||
body {
|
|
||||||
border-right: 1px solid black;
|
|
||||||
margin-right: 200px;
|
|
||||||
|
|
||||||
padding-left: 20px;
|
|
||||||
padding-right: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
margin-top: 0px;
|
|
||||||
padding-top: 20px;
|
|
||||||
|
|
||||||
font-family: "Bitstream Vera Sans", sans-serif;
|
|
||||||
font-weight: normal;
|
|
||||||
letter-spacing: -2px;
|
|
||||||
text-transform: lowercase;
|
|
||||||
text-align: right;
|
|
||||||
|
|
||||||
color: grey;
|
|
||||||
}
|
|
||||||
|
|
||||||
.admin {
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
font-family: "Bitstream Vera Sans", sans-serif;
|
|
||||||
font-weight: normal;
|
|
||||||
color: #200080;
|
|
||||||
|
|
||||||
margin-left: -20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
font-family: "Bitstream Vera Sans", sans-serif;
|
|
||||||
font-weight: normal;
|
|
||||||
|
|
||||||
background-color: #a0c0ff;
|
|
||||||
border: 1px solid #5080b0;
|
|
||||||
|
|
||||||
padding: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 a {
|
|
||||||
text-decoration: none;
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
h4 {
|
|
||||||
font-family: "Bitstream Vera Sans", sans-serif;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
h4 a {
|
|
||||||
text-decoration: none;
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
img.face {
|
|
||||||
float: right;
|
|
||||||
margin-top: -3em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry {
|
|
||||||
margin-bottom: 2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry .date {
|
|
||||||
font-family: "Bitstream Vera Sans", sans-serif;
|
|
||||||
color: grey;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry .date a {
|
|
||||||
text-decoration: none;
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar {
|
|
||||||
position: absolute;
|
|
||||||
top: 0px;
|
|
||||||
right: 0px;
|
|
||||||
width: 200px;
|
|
||||||
|
|
||||||
margin-left: 0px;
|
|
||||||
margin-right: 0px;
|
|
||||||
padding-right: 0px;
|
|
||||||
|
|
||||||
padding-top: 20px;
|
|
||||||
padding-left: 0px;
|
|
||||||
|
|
||||||
font-family: "Bitstream Vera Sans", sans-serif;
|
|
||||||
font-size: 85%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar h2 {
|
|
||||||
font-size: 110%;
|
|
||||||
font-weight: bold;
|
|
||||||
color: black;
|
|
||||||
|
|
||||||
padding-left: 5px;
|
|
||||||
margin-left: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar ul {
|
|
||||||
padding-left: 1em;
|
|
||||||
margin-left: 0px;
|
|
||||||
|
|
||||||
list-style-type: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar ul li:hover {
|
|
||||||
color: grey;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar ul li a {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar ul li a:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar ul li a img {
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar p {
|
|
||||||
border-top: 1px solid grey;
|
|
||||||
margin-top: 30px;
|
|
||||||
padding-top: 10px;
|
|
||||||
|
|
||||||
padding-left: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar .message {
|
|
||||||
cursor: help;
|
|
||||||
border-bottom: 1px dashed red;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar a.message:hover {
|
|
||||||
cursor: help;
|
|
||||||
background-color: #ff0000;
|
|
||||||
color: #ffffff !important;
|
|
||||||
text-decoration: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:hover {
|
|
||||||
text-decoration: underline !important;
|
|
||||||
color: blue !important;
|
|
||||||
}
|
|
@ -1,67 +0,0 @@
|
|||||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
|
|
||||||
xmlns:atom="http://www.w3.org/2005/Atom"
|
|
||||||
xmlns:planet="http://planet.intertwingly.net/"
|
|
||||||
xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
|
|
||||||
<xsl:template match="atom:feed">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<head>
|
|
||||||
<link rel="stylesheet" href="planet.css" type="text/css" />
|
|
||||||
<title><xsl:value-of select="atom:title"/></title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1><xsl:value-of select="atom:title"/></h1>
|
|
||||||
|
|
||||||
<xsl:apply-templates select="atom:entry"/>
|
|
||||||
|
|
||||||
<div class="sidebar">
|
|
||||||
<img src="images/logo.png" width="136" height="136" alt=""/>
|
|
||||||
|
|
||||||
<h2>Subscriptions</h2>
|
|
||||||
<ul>
|
|
||||||
<xsl:for-each select="planet:source">
|
|
||||||
<xsl:sort select="planet:name"/>
|
|
||||||
<li>
|
|
||||||
<a href="{atom:link[@rel='self']/@href}" title="subscribe">
|
|
||||||
<img src="images/feed-icon-10x10.png" alt="(feed)"/>
|
|
||||||
</a>
|
|
||||||
<a href="{atom:link[@rel='alternate']/@href}">
|
|
||||||
<xsl:value-of select="planet:name"/>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</xsl:for-each>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<xsl:template match="atom:entry">
|
|
||||||
<xsl:variable name="date" select="substring(atom:updated,1,10)"/>
|
|
||||||
<xsl:if test="not(preceding-sibling::atom:entry
|
|
||||||
[substring(atom:updated,1,10) = $date])">
|
|
||||||
<h2 class="date"><xsl:value-of select="$date"/></h2>
|
|
||||||
</xsl:if>
|
|
||||||
|
|
||||||
<h3>
|
|
||||||
<a href="{atom:source/atom:link[@rel='alternate']/@href}">
|
|
||||||
<xsl:value-of select="atom:source/planet:name"/>
|
|
||||||
</a>
|
|
||||||
—
|
|
||||||
<a href="{atom:link[@rel='alternate']/@href}">
|
|
||||||
<xsl:value-of select="atom:title"/>
|
|
||||||
</a>
|
|
||||||
</h3>
|
|
||||||
|
|
||||||
<div class="content">
|
|
||||||
<xsl:choose>
|
|
||||||
<xsl:when test="atom:content">
|
|
||||||
<xsl:copy-of select="atom:content/*"/>
|
|
||||||
</xsl:when>
|
|
||||||
<xsl:otherwise>
|
|
||||||
<xsl:copy-of select="atom:summary/*"/>
|
|
||||||
</xsl:otherwise>
|
|
||||||
</xsl:choose>
|
|
||||||
</div>
|
|
||||||
</xsl:template>
|
|
||||||
</xsl:stylesheet>
|
|
@ -88,13 +88,14 @@ def __init__():
|
|||||||
|
|
||||||
def load(config_file):
|
def load(config_file):
|
||||||
""" initialize and load a configuration"""
|
""" initialize and load a configuration"""
|
||||||
import config, planet
|
|
||||||
log = planet.getLogger(config.log_level())
|
|
||||||
|
|
||||||
global parser
|
global parser
|
||||||
parser = ConfigParser()
|
parser = ConfigParser()
|
||||||
parser.read(config_file)
|
parser.read(config_file)
|
||||||
|
|
||||||
|
import config, planet
|
||||||
|
from planet import opml
|
||||||
|
log = planet.getLogger(config.log_level())
|
||||||
|
|
||||||
# Theme support
|
# Theme support
|
||||||
theme = config.output_theme()
|
theme = config.output_theme()
|
||||||
if theme:
|
if theme:
|
||||||
@ -144,7 +145,7 @@ def load(config_file):
|
|||||||
except:
|
except:
|
||||||
log.exception("Unable to read %s readinglist", list)
|
log.exception("Unable to read %s readinglist", list)
|
||||||
continue
|
continue
|
||||||
planet.opml.opml2config(data, parser)
|
opml.opml2config(data, parser)
|
||||||
# planet.foaf.foaf2config(data, list, config)
|
# planet.foaf.foaf2config(data, list, config)
|
||||||
|
|
||||||
def cache_sources_directory():
|
def cache_sources_directory():
|
||||||
|
@ -25,6 +25,7 @@ illegal_xml_chars = re.compile("[\x01-\x08\x0B\x0C\x0E-\x1F]")
|
|||||||
def createTextElement(parent, name, value):
|
def createTextElement(parent, name, value):
|
||||||
""" utility function to create a child element with the specified text"""
|
""" utility function to create a child element with the specified text"""
|
||||||
if not value: return
|
if not value: return
|
||||||
|
if isinstance(value,str): value=value.decode('utf-8')
|
||||||
xdoc = parent.ownerDocument
|
xdoc = parent.ownerDocument
|
||||||
xelement = xdoc.createElement(name)
|
xelement = xdoc.createElement(name)
|
||||||
xelement.appendChild(xdoc.createTextNode(value))
|
xelement.appendChild(xdoc.createTextNode(value))
|
||||||
@ -64,17 +65,18 @@ def normalize(text, bozo):
|
|||||||
def id(xentry, entry):
|
def id(xentry, entry):
|
||||||
""" copy or compute an id for the entry """
|
""" copy or compute an id for the entry """
|
||||||
|
|
||||||
if entry.has_key("id"):
|
if entry.has_key("id") and entry.id:
|
||||||
entry_id = entry.id
|
entry_id = entry.id
|
||||||
elif entry.has_key("link"):
|
elif entry.has_key("link") and entry.link:
|
||||||
entry_id = entry.link
|
entry_id = entry.link
|
||||||
elif entry.has_key("title"):
|
elif entry.has_key("title") and entry.title:
|
||||||
entry_id = (entry.title_detail.base + "/" +
|
entry_id = (entry.title_detail.base + "/" +
|
||||||
md5.new(entry.title).hexdigest())
|
md5.new(entry.title).hexdigest())
|
||||||
elif entry.has_key("summary"):
|
elif entry.has_key("summary") and entry.summary:
|
||||||
entry_id = (entry.summary_detail.base + "/" +
|
entry_id = (entry.summary_detail.base + "/" +
|
||||||
md5.new(entry.summary).hexdigest())
|
md5.new(entry.summary).hexdigest())
|
||||||
elif entry.has_key("content"):
|
elif entry.has_key("content") and entry.content:
|
||||||
|
|
||||||
entry_id = (entry.content[0].base + "/" +
|
entry_id = (entry.content[0].base + "/" +
|
||||||
md5.new(entry.content[0].value).hexdigest())
|
md5.new(entry.content[0].value).hexdigest())
|
||||||
else:
|
else:
|
||||||
|
@ -69,7 +69,7 @@ def spiderFeed(feed):
|
|||||||
# write each entry to the cache
|
# write each entry to the cache
|
||||||
cache = config.cache_directory()
|
cache = config.cache_directory()
|
||||||
for entry in data.entries:
|
for entry in data.entries:
|
||||||
if not entry.has_key('id'):
|
if not entry.has_key('id') or not entry.id:
|
||||||
entry['id'] = reconstitute.id(None, entry)
|
entry['id'] = reconstitute.id(None, entry)
|
||||||
if not entry['id']: continue
|
if not entry['id']: continue
|
||||||
|
|
||||||
|
@ -1,13 +1,14 @@
|
|||||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
|
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
|
||||||
xmlns:atom="http://www.w3.org/2005/Atom"
|
xmlns:atom="http://www.w3.org/2005/Atom"
|
||||||
|
xmlns:xhtml="http://www.w3.org/1999/xhtml"
|
||||||
xmlns:planet="http://planet.intertwingly.net/"
|
xmlns:planet="http://planet.intertwingly.net/"
|
||||||
xmlns="http://www.w3.org/1999/xhtml">
|
xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
|
||||||
<xsl:output indent="yes" method="html"/>
|
|
||||||
|
|
||||||
<xsl:template match="atom:feed">
|
<xsl:template match="atom:feed">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<xsl:text> </xsl:text>
|
|
||||||
|
<!-- head -->
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
<head>
|
<head>
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="default.css" type="text/css" />
|
||||||
<title><xsl:value-of select="atom:title"/></title>
|
<title><xsl:value-of select="atom:title"/></title>
|
||||||
@ -30,6 +31,7 @@
|
|||||||
|
|
||||||
<xsl:text> </xsl:text>
|
<xsl:text> </xsl:text>
|
||||||
<h2>Subscriptions</h2>
|
<h2>Subscriptions</h2>
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
<ul>
|
<ul>
|
||||||
<xsl:for-each select="planet:source">
|
<xsl:for-each select="planet:source">
|
||||||
<xsl:sort select="planet:name"/>
|
<xsl:sort select="planet:name"/>
|
||||||
@ -51,7 +53,7 @@
|
|||||||
|
|
||||||
<dl>
|
<dl>
|
||||||
<dt>Last updated:</dt>
|
<dt>Last updated:</dt>
|
||||||
<dd><span class="date" title="GMT"><xsl:value-of select="atom:updated"/></span></dd>
|
<dd><span class="date" title="GMT"><xsl:value-of select="atom:updated/@planet:format"/></span></dd>
|
||||||
<dt>Powered by:</dt>
|
<dt>Powered by:</dt>
|
||||||
<dd><a href="http://intertwingly.net/code/planet/"><img src="images/planet.png" width="80" height="15" alt="Planet" border="0" /></a></dd>
|
<dd><a href="http://intertwingly.net/code/planet/"><img src="images/planet.png" width="80" height="15" alt="Planet" border="0" /></a></dd>
|
||||||
<dt>Export:</dt>
|
<dt>Export:</dt>
|
||||||
@ -65,7 +67,11 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<xsl:apply-templates select="atom:entry"/>
|
<xsl:text> </xsl:text>
|
||||||
|
<div id="body">
|
||||||
|
<xsl:apply-templates select="atom:entry"/>
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
@ -76,7 +82,11 @@
|
|||||||
<xsl:if test="not(preceding-sibling::atom:entry
|
<xsl:if test="not(preceding-sibling::atom:entry
|
||||||
[substring(atom:updated,1,10) = $date])">
|
[substring(atom:updated,1,10) = $date])">
|
||||||
<xsl:text> </xsl:text>
|
<xsl:text> </xsl:text>
|
||||||
<h2 class="date"><xsl:value-of select="$date"/></h2>
|
<h2 class="date">
|
||||||
|
<xsl:value-of select="substring-before(atom:updated/@planet:format,', ')"/>
|
||||||
|
<xsl:text>, </xsl:text>
|
||||||
|
<xsl:value-of select="substring-before(substring-after(atom:updated/@planet:format,', '), ' ')"/>
|
||||||
|
</h2>
|
||||||
</xsl:if>
|
</xsl:if>
|
||||||
|
|
||||||
<xsl:text> </xsl:text>
|
<xsl:text> </xsl:text>
|
||||||
@ -109,22 +119,14 @@
|
|||||||
|
|
||||||
<!-- entry content -->
|
<!-- entry content -->
|
||||||
<xsl:text> </xsl:text>
|
<xsl:text> </xsl:text>
|
||||||
<div class="content">
|
<xsl:choose>
|
||||||
<xsl:choose>
|
<xsl:when test="atom:content">
|
||||||
<xsl:when test="atom:content">
|
<xsl:apply-templates select="atom:content"/>
|
||||||
<xsl:if test="atom:content/@xml:lang != @xml:lang">
|
</xsl:when>
|
||||||
<xsl:attribute name="xml:lang" select="{atom:content/@xml:lang}"/>
|
<xsl:otherwise>
|
||||||
</xsl:if>
|
<xsl:apply-templates select="atom:summary"/>
|
||||||
<xsl:copy-of select="atom:content/*"/>
|
</xsl:otherwise>
|
||||||
</xsl:when>
|
</xsl:choose>
|
||||||
<xsl:otherwise>
|
|
||||||
<xsl:if test="atom:summary/@xml:lang != @xml:lang">
|
|
||||||
<xsl:attribute name="xml:lang" select="{atom:summary/@xml:lang}"/>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:copy-of select="atom:summary/*"/>
|
|
||||||
</xsl:otherwise>
|
|
||||||
</xsl:choose>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- entry footer -->
|
<!-- entry footer -->
|
||||||
<xsl:text> </xsl:text>
|
<xsl:text> </xsl:text>
|
||||||
@ -143,11 +145,32 @@
|
|||||||
</xsl:when>
|
</xsl:when>
|
||||||
</xsl:choose>
|
</xsl:choose>
|
||||||
<span class="date" title="GMT">
|
<span class="date" title="GMT">
|
||||||
<xsl:value-of select="atom:updated"/>
|
<xsl:value-of select="atom:updated/@planet:format"/>
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
|
|
||||||
|
<!-- xhtml content -->
|
||||||
|
<xsl:template match="atom:content/xhtml:div | atom:summary/xhtml:div">
|
||||||
|
<xsl:copy>
|
||||||
|
<xsl:if test="@xml:lang != ancestor::atom:entry/@xml:lang">
|
||||||
|
<xsl:attribute name="xml:lang" select="{atom:content/@xml:lang}"/>
|
||||||
|
</xsl:if>
|
||||||
|
<xsl:attribute name="class">content</xsl:attribute>
|
||||||
|
<xsl:copy-of select="@*|node()"/>
|
||||||
|
</xsl:copy>
|
||||||
|
</xsl:template>
|
||||||
|
|
||||||
|
<!-- plain text content -->
|
||||||
|
<xsl:template match="atom:content/text() | atom:summary/text()">
|
||||||
|
<div class="content" xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<xsl:if test="@xml:lang != ancestor::atom:entry/@xml:lang">
|
||||||
|
<xsl:attribute name="xml:lang" select="{atom:summary/@xml:lang}"/>
|
||||||
|
</xsl:if>
|
||||||
|
<xsl:copy-of select="."/>
|
||||||
|
</div>
|
||||||
|
</xsl:template>
|
||||||
</xsl:stylesheet>
|
</xsl:stylesheet>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
xmlns="http://www.w3.org/1999/xhtml">
|
xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
|
||||||
<!-- strip planet elements and attributes -->
|
<!-- strip planet elements and attributes -->
|
||||||
<xsl:template match="planet:*"/>
|
<xsl:template match="planet:*|@planet:*"/>
|
||||||
|
|
||||||
<!-- add Google/LiveJournal-esque noindex directive -->
|
<!-- add Google/LiveJournal-esque noindex directive -->
|
||||||
<xsl:template match="atom:feed">
|
<xsl:template match="atom:feed">
|
||||||
@ -15,6 +15,32 @@
|
|||||||
</xsl:copy>
|
</xsl:copy>
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
|
|
||||||
|
<!-- indent atom elements -->
|
||||||
|
<xsl:template match="atom:*">
|
||||||
|
<!-- double space before atom:entries -->
|
||||||
|
<xsl:if test="self::atom:entry">
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
|
</xsl:if>
|
||||||
|
|
||||||
|
<!-- indent start tag -->
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
|
<xsl:for-each select="ancestor::*">
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
|
</xsl:for-each>
|
||||||
|
|
||||||
|
<xsl:copy>
|
||||||
|
<xsl:apply-templates select="@*|node()"/>
|
||||||
|
|
||||||
|
<!-- indent end tag if there are element children -->
|
||||||
|
<xsl:if test="*">
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
|
<xsl:for-each select="ancestor::*">
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
|
</xsl:for-each>
|
||||||
|
</xsl:if>
|
||||||
|
</xsl:copy>
|
||||||
|
</xsl:template>
|
||||||
|
|
||||||
<!-- pass through everything else -->
|
<!-- pass through everything else -->
|
||||||
<xsl:template match="@*|node()">
|
<xsl:template match="@*|node()">
|
||||||
<xsl:copy>
|
<xsl:copy>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user