summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Franke <nobody@nowhere.ws>2011-10-08 16:21:04 +0200
committerChristian Franke <nobody@nowhere.ws>2011-10-08 17:44:40 +0200
commit1dc0670c01211a1d1e8b99facea1710949ee506d (patch)
treef373c744fcc4a27a62070d757887589db5f7739e
parentf43a8028cdf482d72efe82fdf101915df049fdc3 (diff)
Add plugin api to template.py, add news plugin
-rw-r--r--scripts/news.py25
-rw-r--r--scripts/plugin.py24
-rw-r--r--scripts/template.conf3
-rwxr-xr-xscripts/template.py166
-rw-r--r--template/news/2011-03-16-clt.html7
-rw-r--r--template/news/2011-03-18-website.html8
-rw-r--r--template/news/2011-08-21-germany.rb.html15
-rw-r--r--template/news/2011-08-26-lhc2.html6
-rw-r--r--template/news/2011-10-03-hausbus13
9 files changed, 182 insertions, 85 deletions
diff --git a/scripts/news.py b/scripts/news.py
new file mode 100644
index 0000000..ca9dfb4
--- /dev/null
+++ b/scripts/news.py
@@ -0,0 +1,25 @@
+import template
+import plugin
+import string
+import os
+
+class NewsPlugin:
+ def __init__(self):
+ newspath = os.path.join(template.path, 'news')
+ newsfiles = [ os.path.join(newspath, entry) for entry in sorted(os.listdir(newspath)) ]
+
+ self._news = []
+ for newsfile in reversed(newsfiles):
+ self._news.append(open(newsfile, 'r').read())
+
+ def process_content(self, page_content):
+ return_value = {}
+ for filename, content in page_content.iteritems():
+ template = string.Template(content)
+ return_value[filename] = template.safe_substitute(
+ news = ''.join(self._news),
+ latest_news = ''.join(self._news[:3]),
+ )
+ return return_value
+
+plugin.plugin_manager.register(NewsPlugin())
diff --git a/scripts/plugin.py b/scripts/plugin.py
new file mode 100644
index 0000000..785a219
--- /dev/null
+++ b/scripts/plugin.py
@@ -0,0 +1,24 @@
+class PluginManager(object):
+ def __init__(self):
+ self.plugins = []
+ def register(self, plugin):
+ self.plugins.append(plugin)
+ def __getattr__(self, name):
+ def caller(data, *args, **kwargs):
+ return_value = data
+ processed = False
+ for plugin in self.plugins:
+ try:
+ method = getattr(plugin, name)
+ return_value = method(data, *args, **kwargs)
+ processed = True
+ except KeyError:
+ pass
+ except Exception:
+ sys.excepthook(*sys.exc_info())
+ if not processed:
+ print "Warning: no plugin implemented '%s'" % name
+ return return_value
+ return caller
+
+plugin_manager = PluginManager()
diff --git a/scripts/template.conf b/scripts/template.conf
index 339871a..2f9ee42 100644
--- a/scripts/template.conf
+++ b/scripts/template.conf
@@ -5,3 +5,6 @@
[Default]
path = ../template
target = ../public/
+
+[Plugins]
+news=load
diff --git a/scripts/template.py b/scripts/template.py
index a4d4e9e..c5d348a 100755
--- a/scripts/template.py
+++ b/scripts/template.py
@@ -1,8 +1,15 @@
#!/usr/bin/env python
#Filename: newtemp.py
#Author: stayawake@lavabit.com
-
-
+# ---
+# Copyright (C) 2011 Christian Franke <nobody@nowhere.ws>
+#
+# Permission is hereby granted to use and distribute this
+# file for any purpose, provided the above copyright notice
+# is kept in place.
+#
+
+import imp
import os
import os.path
import sys
@@ -12,104 +19,93 @@ import datetime
from string import Template
import ConfigParser
-def readdir(directory):
- return_value = {"content.html":"", "keywords":"", "desc_de":"", "desc_en":""}
-
- for c in return_value:
- f = open(os.path.join(directory, c), "r")
- return_value[c] = f.read()
- f.close
- return return_value
-
-def substitute(target, prefix, htmltemplate, datenow, topic, content):
-
- #create template-string
- htmltext = Template(htmltemplate)
- htmltext = htmltext.substitute(
- template_date = datenow,
- template_chattopic = topic,
- template_keywords = content["keywords"],
- template_content = content["content.html"],
- template_desc_de = content["desc_de"],
- template_desc_en = content["desc_en"]
- )
-
- #write it to the outputfile
- outputfile = open(os.path.join(target, page + ".html"), "w")
- outputfile.write(htmltext)
- outputfile.close()
-
-
-def readarguments(argv):
-
- global configfile
- global verbose
-
- try:
- opts, args = getopt.getopt(argv, "c:vh", ["config=", "verbose", "help"])
- except getopt.GetoptError:
- print "There is a problem with your argument(s)"
- sys.exit(2)
- for opt, arg in opts:
- if opt in ("-c", "--config"):
- configfile = arg
- elif opt in ("-v", "--verbose"):
- verbose = True
- elif opt in ("-h", "--help"):
- print "Please read the non-existing man page for further assistance"
- sys.exit(0)
-
+import plugin
+
+class Page:
+ def __init__(self, name):
+ self.name = name
+ data = {"content.html":"", "keywords":"", "desc_de":"", "desc_en":""}
+
+ for c in data:
+ f = open(os.path.join(pagepath, name, c), "r")
+ data[c] = f.read()
+ f.close
+
+ self._data = plugin.plugin_manager.process_content(data)
+
+ @property
+ def html(self):
+ #create template-string
+ htmltext = Template(htmltemplate)
+ htmltext = htmltext.substitute(
+ template_date = datenow,
+ template_chattopic = topic,
+ template_keywords = self._data["keywords"],
+ template_content = self._data["content.html"],
+ template_desc_de = self._data["desc_de"],
+ template_desc_en = self._data["desc_en"]
+ )
+ return htmltext
+
+ def render_and_save(self):
+ #write it to the outputfile
+ outputfile = open(os.path.join(targetdir, self.name + '.html'), "w")
+ outputfile.write(self.html)
+ outputfile.close()
configfile = "template.conf"
verbose = False
+opts, args = getopt.getopt(sys.argv[1:], "c:vh", ["config=", "verbose", "help"])
+for opt, arg in opts:
+ if opt in ("-c", "--config"):
+ configfile = arg
+ elif opt in ("-v", "--verbose"):
+ verbose = True
+ elif opt in ("-h", "--help"):
+ print "Please read the non-existing man page for further assistance"
+ sys.exit(0)
+
basedir = os.path.dirname(os.path.abspath(__file__))
-readarguments(sys.argv[1:])
+def makeabs(path):
+ if not os.path.isabs(path):
+ return os.path.join(basedir, path)
+ return path
+configfile = makeabs(configfile)
config = ConfigParser.ConfigParser()
-if not os.path.isabs(configfile):
- configfile = os.path.join(basedir, configfile)
config.read(configfile)
-path = config.get("Default", "path")
-if not os.path.isabs(path):
- path = os.path.join(basedir, path)
-
-target = config.get("Default", "target")
-if not os.path.isabs(target):
- target = os.path.join(basedir, target)
+path = makeabs(config.get("Default", "path"))
+targetdir = makeabs(config.get("Default", "target"))
pagepath = os.path.join(path, "pages")
templatepath = os.path.join(path, "template")
topicpath = os.path.join(path, "topic")
-if verbose:
- print "Pagepath: %s" % pagepath
- print "Templatepath: %s" % templatepath
- print "topicpath: %s" % topicpath
-
#set template
-f = open(os.path.join(templatepath, "template.html"), "r")
-htmltemplate = f.read()
-f.close
-if verbose:
- print "template read"
-
-#set topic
-f = open(os.path.join(topicpath, "topic"), "r")
-topic = f.read()
-f.close
-if verbose:
- print "topic read"
-
-#set date
+htmltemplate = open(os.path.join(templatepath, "template.html"), "r").read()
+topic = open(os.path.join(topicpath, "topic"), "r").read()
datenow = time.strftime("%Y-%m-%dT%H:%M:%S +0100")
-if verbose:
- print "Set date: " + datenow
-for page in os.listdir(pagepath):
- prefix = os.path.join(pagepath, page)
- page_data = readdir(prefix)
- substitute(target, prefix, htmltemplate, datenow, topic, page_data)
+if __name__ == '__main__':
if verbose:
- print "%s.html written" % prefix
+ print "Pagepath: %s" % pagepath
+ print "Templatepath: %s" % templatepath
+ print "topicpath: %s" % topicpath
+ print "datenow: %s" % datenow
+
+ pluginlist = config.items('Plugins')
+ for pluginname, pluginarg in pluginlist:
+ modinfo = imp.find_module(pluginname)
+ try:
+ imp.load_module(pluginname, *modinfo)
+ finally:
+ modinfo[0].close()
+
+if __name__ == '__main__':
+ for page in os.listdir(pagepath):
+ Page(page).render_and_save()
+ if verbose:
+ print "%s.html written" % prefix
+
# vi: noexpandtab:tabstop=8:shiftwidth=8
diff --git a/template/news/2011-03-16-clt.html b/template/news/2011-03-16-clt.html
new file mode 100644
index 0000000..f198da4
--- /dev/null
+++ b/template/news/2011-03-16-clt.html
@@ -0,0 +1,7 @@
+<h3>
+ 16. März 2011 - Chaostreff Leipzig und AK Vorrat auf den CLT
+</h3>
+<p>
+ Auch dieses Jahr fährt eine Delegation von mehr als 10 Leuten aus dem sublab und sublab-Umfeld zu den Chemnitzer Linux Tagen vom 19. bis 20. März in Chemnitz.<br />
+ Ihr findet uns am Stand des Chaostreffs und beim Arbeitskreis Vorratsdatenspeicherung.
+</p>
diff --git a/template/news/2011-03-18-website.html b/template/news/2011-03-18-website.html
new file mode 100644
index 0000000..744d38d
--- /dev/null
+++ b/template/news/2011-03-18-website.html
@@ -0,0 +1,8 @@
+<h3>
+ 18. März 2011 - neue Website
+</h3>
+<p>
+ Das sublab hat eine neue Website.<br />
+ Diese wird seit 2:55 Uhr als Landeseite für sublab.org verwendet. Da das Wiki suboptimal gepflegt wird.<br />
+ Weiterhin ist die neue Website einfacher zu verwalten, verursacht weniger Load (weil statisch) und wird bald mit einigen Killerfeatures aufwarten können, von denen Dokuwiki nur träumen kann.
+</p>
diff --git a/template/news/2011-08-21-germany.rb.html b/template/news/2011-08-21-germany.rb.html
new file mode 100644
index 0000000..41c15c4
--- /dev/null
+++ b/template/news/2011-08-21-germany.rb.html
@@ -0,0 +1,15 @@
+<h3>
+ 21. August 2011 - germany.rb
+</h3>
+<p>
+ Vom 20. bis 21. fand im sublab zum zweiten Mal die Germany.rb statt.
+ "Es handelt sich um eine Veranstaltung, welche 2010 zum ersten Mal von
+ langjährigen Ruby Interessierten organisiert wurde. Bei der Agenda
+ orientiert sich das Treffen an den ersten EuRuKo’s und bindet sich
+ dadurch explizit nicht an eine statische Agenda. Statt dessen wird im
+ Laufe des Treffens ein dynamischer Themenpool erstellt. Präsentationen,
+ Lightning Talks oder Workshops werden sich daraus ergeben. Die
+ Veranstaltung soll hauptsächlich den Teilnehmern die freie Möglichkeit
+ bieten, Wissen zu teilen und neues Wissen zu erhalten." (<a
+ href="http://www.ruby-lang.org/de/news/2011/06/23/germany-rb-2011-in-leipzig/">ruby-lang.org</a>)
+</p>
diff --git a/template/news/2011-08-26-lhc2.html b/template/news/2011-08-26-lhc2.html
new file mode 100644
index 0000000..e4868fd
--- /dev/null
+++ b/template/news/2011-08-26-lhc2.html
@@ -0,0 +1,6 @@
+<h3>
+ 26. August 2011 - sublab bei der LHC II
+</h3>
+<p>
+ Auch dieses Jahr hat das sublab wieder eine Delegation zur Large Hackerspace Convention (LHC) in den Stuttgarter <a href="http://shackspace.de">Shackspace</a> entsandt und die Ehre des sublabs in epischen Nerfschlachten verteidigt.
+</p>
diff --git a/template/news/2011-10-03-hausbus b/template/news/2011-10-03-hausbus
new file mode 100644
index 0000000..9b8d6c2
--- /dev/null
+++ b/template/news/2011-10-03-hausbus
@@ -0,0 +1,13 @@
+<h3>03. Oktober 2011 - Die Hausbusentwicklung schreitet voran</h3>
+<p>
+Nach mehreren Verzoegerungen ist die Basisplatine fuer den sublab-Hausbus jetzt
+fertig und getestet. Der Hausbus ist ein Bussystem (<a href="http://de.wikipedia.org/wiki/Controller_Area_Network">CAN</a>) mit
+welchem in Zukunft eine Vielzahl von Geraetschaften im sublab steuerbar gemacht
+werden sollen.
+<img style="width:100%; margin-left: auto; margin-right: auto" src="img/can1.jpg" alt="CAN-Basisplatine"/>
+In der ersten Ausbaustufe wird die Lichtinstallation elektronisch schaltbar
+gestaltet. Wer Interesse an dem Hausbus oder sogar schon ein konkretes Projekt
+im Auge hat, moege bei der Elektronikrunde (2. und 4. Mittwoch im Monat)
+vorbeischauen.
+<img style="width:100%; margin-left: auto; margin-right: auto" src="img/can2.jpg" alt="CAN-Basisplatine"/>
+</p>