diff options
author | Christian Franke <nobody@nowhere.ws> | 2011-10-08 16:21:04 +0200 |
---|---|---|
committer | Christian Franke <nobody@nowhere.ws> | 2011-10-08 17:44:40 +0200 |
commit | 1dc0670c01211a1d1e8b99facea1710949ee506d (patch) | |
tree | f373c744fcc4a27a62070d757887589db5f7739e | |
parent | f43a8028cdf482d72efe82fdf101915df049fdc3 (diff) |
Add plugin api to template.py, add news plugin
-rw-r--r-- | scripts/news.py | 25 | ||||
-rw-r--r-- | scripts/plugin.py | 24 | ||||
-rw-r--r-- | scripts/template.conf | 3 | ||||
-rwxr-xr-x | scripts/template.py | 166 | ||||
-rw-r--r-- | template/news/2011-03-16-clt.html | 7 | ||||
-rw-r--r-- | template/news/2011-03-18-website.html | 8 | ||||
-rw-r--r-- | template/news/2011-08-21-germany.rb.html | 15 | ||||
-rw-r--r-- | template/news/2011-08-26-lhc2.html | 6 | ||||
-rw-r--r-- | template/news/2011-10-03-hausbus | 13 |
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> |