Initial release
This commit is contained in:
commit
fc1b699723
137
blogthon.cgi
Executable file
137
blogthon.cgi
Executable file
@ -0,0 +1,137 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
# This program is free software. It comes without any warranty, to
|
||||||
|
# the extent permitted by applicable law. You can redistribute it
|
||||||
|
# and/or modify it under the terms of the Do What The Fuck You Want
|
||||||
|
# To Public License, Version 2, as published by Sam Hocevar. See
|
||||||
|
# http://sam.zoy.org/wtfpl/COPYING for more details.
|
||||||
|
|
||||||
|
import cgi
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
import glob
|
||||||
|
import re
|
||||||
|
import ConfigParser
|
||||||
|
|
||||||
|
configuration = ConfigParser.ConfigParser()
|
||||||
|
configuration.read('configuration')
|
||||||
|
|
||||||
|
blog_title = configuration.get('personal', 'blog_title')
|
||||||
|
keywords = configuration.get('personal', 'keywords')
|
||||||
|
entries_dir = configuration.get('personal', 'entries_dir')
|
||||||
|
entries_suffix = configuration.get('personal', 'entries_suffix')
|
||||||
|
staticpages_dir = configuration.get('personal', 'staticpages_dir')
|
||||||
|
style = configuration.get('look', 'style')
|
||||||
|
entries_per_page = configuration.getint('look', 'entries_per_page')
|
||||||
|
monthlist = configuration.get('look', 'monthlist')
|
||||||
|
staticpages = configuration.get('look', 'staticpages')
|
||||||
|
permalinks = configuration.get('look', 'permalinks')
|
||||||
|
newest_first = configuration.get('look', 'newest_first')
|
||||||
|
|
||||||
|
action = cgi.FieldStorage()
|
||||||
|
month_display = action.getvalue('m')
|
||||||
|
post_display = action.getvalue('p')
|
||||||
|
static_display = action.getvalue('s')
|
||||||
|
site_display = action.getvalue('i')
|
||||||
|
if not month_display: month_display = ""
|
||||||
|
if not post_display: post_display = ""
|
||||||
|
if not static_display: static_display = ""
|
||||||
|
if not site_display: site_display = ""
|
||||||
|
|
||||||
|
print 'Content-type: text/html\n'
|
||||||
|
print '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"'
|
||||||
|
print ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'
|
||||||
|
print '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">'
|
||||||
|
print ' <head>'
|
||||||
|
print ' <title>' + blog_title + '</title>'
|
||||||
|
print ' <meta http-equiv="content-type" content="text/html; charset=utf-8" />'
|
||||||
|
print ' <meta name="keywords" content="' + keywords + '" />'
|
||||||
|
print ' <meta name="description" content="' + blog_title + '" />'
|
||||||
|
print ' <link rel="stylesheet" type="text/css" href="styles/' + style + '" />'
|
||||||
|
print ' </head>'
|
||||||
|
print ' <body>'
|
||||||
|
print ' <div class="title"><a href="?" class="title">' + blog_title + '</a></div>'
|
||||||
|
|
||||||
|
entries = []
|
||||||
|
entries_list = glob.glob(entries_dir + '*.' + entries_suffix)
|
||||||
|
|
||||||
|
for entry in entries_list:
|
||||||
|
timestamp = os.stat(entry)
|
||||||
|
timestamp = time.localtime(timestamp[8])
|
||||||
|
entry = timestamp, entry
|
||||||
|
entries.append(entry)
|
||||||
|
|
||||||
|
if newest_first:
|
||||||
|
entries.sort(reverse=True)
|
||||||
|
else:
|
||||||
|
entries.sort()
|
||||||
|
|
||||||
|
print ' <div class="sidebar">'
|
||||||
|
|
||||||
|
if staticpages:
|
||||||
|
staticpages = []
|
||||||
|
staticpages_list = glob.glob(staticpages_dir + '*')
|
||||||
|
staticpages_list.sort()
|
||||||
|
print ' <div class="staticpages">'
|
||||||
|
for staticpage in staticpages_list:
|
||||||
|
title = re.sub('\w+?\/\d+?-', '', staticpage)
|
||||||
|
link = re.sub('\w+?\/', '', staticpage)
|
||||||
|
print ' <a href="?s=' + link + '">' + title + '</a> <br />'
|
||||||
|
if monthlist and staticpages_list != []: print ' <br />'
|
||||||
|
print ' </div>'
|
||||||
|
|
||||||
|
if monthlist:
|
||||||
|
olddate = ""
|
||||||
|
print ' <div class="monthlist">'
|
||||||
|
for entry in entries:
|
||||||
|
date = time.strftime("%m%Y", entry[0])
|
||||||
|
date_display = time.strftime("%h %Y", entry[0])
|
||||||
|
if not olddate == date:
|
||||||
|
print ' <a href="?m=' + date + '">' + date_display + '</a><br />'
|
||||||
|
olddate = date
|
||||||
|
print ' </div>'
|
||||||
|
|
||||||
|
print ' </div>'
|
||||||
|
print ' <div class="content">'
|
||||||
|
|
||||||
|
if static_display != "": # Show Staticpage
|
||||||
|
content = open(staticpages_dir + static_display, "r")
|
||||||
|
print ' <div class="entrytitle">' + re.sub('\d+?-', '', static_display) + '</div>'
|
||||||
|
print ' <div class="entry"><p>'
|
||||||
|
for line in content:
|
||||||
|
print ' ' + line.strip() + '<br />'
|
||||||
|
print ' </p></div>'
|
||||||
|
content.close()
|
||||||
|
else: # Show regular entry
|
||||||
|
entry_counter = 0
|
||||||
|
for entry in entries:
|
||||||
|
date = time.strftime("%c", entry[0])
|
||||||
|
date_to_compare = time.strftime("%m%Y", entry[0]) # Needed for permalinks
|
||||||
|
entry = entry[1]
|
||||||
|
title = entry.replace('entries/', '', 1)
|
||||||
|
title = title.replace('.txt', '')
|
||||||
|
entry_counter += 1
|
||||||
|
|
||||||
|
if month_display == date_to_compare or not month_display:
|
||||||
|
if post_display == title or not post_display:
|
||||||
|
if entry_counter <= entries_per_page:
|
||||||
|
content = open(entry, "r")
|
||||||
|
if permalinks:
|
||||||
|
print ' <div class="entrytitle"><a href="?p=' + title + '" class="entrytitle">' + title + ' <small>(' + date + ')</small></a></div>'
|
||||||
|
else:
|
||||||
|
print ' <div class="entrytitle">' + title + ' <small>(' + date + ')</small></div>'
|
||||||
|
print ' <div class="entry"><p>'
|
||||||
|
for line in content:
|
||||||
|
print ' ' + line.strip() + '<br />'
|
||||||
|
print ' </p></div>'
|
||||||
|
print ' <br /><br />'
|
||||||
|
content.close()
|
||||||
|
|
||||||
|
if entry_counter > entries_per_page: # Display pagelist
|
||||||
|
print ' <div class="entry"><a href=?>[previous page]</a> <a href=?>[next page]</a></div>'
|
||||||
|
|
||||||
|
print ' </div>'
|
||||||
|
print ' </body>'
|
||||||
|
print '</html>'
|
||||||
|
|
||||||
|
# vim: set tw=0 ts=4:
|
14
configuration
Normal file
14
configuration
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
[personal]
|
||||||
|
blog_title: A BlogThon Blog
|
||||||
|
keywords: please,change,me
|
||||||
|
entries_dir: entries/
|
||||||
|
entries_suffix: txt
|
||||||
|
staticpages_dir: static/
|
||||||
|
|
||||||
|
[look]
|
||||||
|
style: blogthon.css
|
||||||
|
entries_per_page: 20
|
||||||
|
monthlist: True
|
||||||
|
staticpages: True
|
||||||
|
permalinks: True
|
||||||
|
newest_first: True
|
5
entries/Demo.txt
Normal file
5
entries/Demo.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
Welcome to your new BlogThon Blog.
|
||||||
|
|
||||||
|
You can add new entries by just put it into a textfile under the "entries" folder with the suffix ".txt". They are sorted by using the Unix timestamp. Staticpages are the same as entries, but without a suffix and with a leading number and a - (like 35-foo). They are stored under the folder "static".
|
||||||
|
|
||||||
|
Have fun with your new Blog.
|
1
static/01-Support
Normal file
1
static/01-Support
Normal file
@ -0,0 +1 @@
|
|||||||
|
If you have any questions regarding BlogThon, you can join our IRC channel on irc.thehappy.de #thehappy.de . You can also write a mail to xeno@thehappy.de.
|
81
styles/blogthon.css
Normal file
81
styles/blogthon.css
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
.html, body {
|
||||||
|
background: #000;
|
||||||
|
color: #FFF;
|
||||||
|
margin: 0px;
|
||||||
|
overflow-x: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:link, a:active, a:visited, a:hover {
|
||||||
|
font-family: Verdana;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #FC3;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.title:link, a.title:hover, a.title:active, a.title:visited {
|
||||||
|
position: absolute;
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
height: 25px;
|
||||||
|
background-image: url(blogthon_img/title_background.png);
|
||||||
|
font-family: Verdana;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 18px;
|
||||||
|
color: #FC3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content { /* Container for entrytitle and entry */
|
||||||
|
position: absolute;
|
||||||
|
top: 30px;
|
||||||
|
left: 6px;
|
||||||
|
width: 600px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entrytitle {
|
||||||
|
font-family: Verdana;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 16px;
|
||||||
|
color: #335599;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
a.entrytitle:link, a.entrytitle:hover, a.entrytitle:visited, a.entrytitle:active {
|
||||||
|
font-family: Verdana;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 16px;
|
||||||
|
color: #335599;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry {
|
||||||
|
font-family: Verdana;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #FFF;
|
||||||
|
margin-left: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar {
|
||||||
|
position: absolute;
|
||||||
|
right: 6px;
|
||||||
|
top: 30px;
|
||||||
|
background: #0F0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.monthlist {
|
||||||
|
font-family: Verdana;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #5577BB;
|
||||||
|
text-align: center;
|
||||||
|
background: #111;
|
||||||
|
}
|
||||||
|
|
||||||
|
.staticpages {
|
||||||
|
font-family: Verdana;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #5577BB;
|
||||||
|
text-align: center;
|
||||||
|
background: #111;
|
||||||
|
}
|
BIN
styles/blogthon_img/title_background.png
Normal file
BIN
styles/blogthon_img/title_background.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 327 B |
Loading…
Reference in New Issue
Block a user