"""
tags.py
Creates a tagging environment for pyblosxom
*********
Akk NOTE: this is derived from http://t3.dotgnu.info/code/tags.py
suppsoedly a version modified for static rendering.
Original is at http://joe.terrarum.net/projects.html
But I've had to modify it to get it to work.
Caveats and non-obvious points:
* Add tags as the second line of an entry, right under the title,
or it will be ignored.
* You must create the tag directories http://yoursite/tags/$tagname
yourself: pyblosxom won't do it for you.
* In addition to the config file entries discussed below, if you use
an extension other than .txt (or maybe even if you don't) you also
need to set py[ 'taggable_files' ] = [ "ext" ]
* In your story.html template, include $tag_links wherever you want
the tags line to go. But make "Tags: " or similar be part of
the pretext, so it won't be included on un-tagged entries.
*********
Tagging is like having an entry belong to multiple categories. For
example, an entry about Bike Riding in Pennsylvania can belong to
both Biking and Pennsylvania.
For more information on tags, please see sites such as technorati.com
and del.icio.us.
In your config file, create 4 settings:
py['tag_url']
py['pretext']
py['posttext']
py['tagsep']
The default tag_url should be set to http://yoursite/tags/, but you can also set
it to something like http://technorati.com/tags/. Please make sure to
have the trailing slash.
The pretext and posttext will appear on your webpage surrounding your
tags and tagsep will note what to seperate the tags by.
So, for example, if I have
py['pretext'] = 'Tags '
py['posttext'] = ''
py['tagsep'] = ', '
Then it would appear like:
Tags: biking, pennsylvania
Why not just put the text in a template? Because if you don't want to tag
an entry, this would look goofy:
Tags: (nothing)
Finally, add a meta-data tag to your entries:
#tags biking,pennsylvania
comma, no space.
If you choose to set your tag_url to
http://yoursite/tags/, you will be able to do a search
for all tagged items like so:
http://yoursite/tags/biking
Questions, comments, and fixes can be sent to joe@terrarum.net
** support for searching "untagged" tag hacked in by Timothy C. Fanelli - 10/22/05 **
Tim made the following changes:
It now filters out files that do not have a .txt extension -- this may
or may not be generally desirable, as some other plugins allow
different extensions for entries (e.g., portico looks for .port files,
which might want to be tagged.)
Also, I modified it to allow searching for "untagged" entries, using
$tag_url/untagged -- it'l return entries which have no #tag meta
entry. This was useful because I was completely replacing my
categories with tags, and have a large "general" category which I
didn't want to be bothered with.
10/24 -
1. Updated file filter hack to support config propery 'taggable_files'
Set py[ 'taggable_files' ] = [ "txt", "port", ... ]
To support tagging of entries with those file extensions.
Defaults to tag just entries with "txt" files.
2. cb_fileset now returns entries sorted by date with most current first.
"""
__author__ = 'Joe Topjian '
__version__ = '200510242045 TCF'
__url__ = 'http://joe.terrarum.net'
# Variables
import os, re, sys
# Change this if your Pyblosxom installation is somewhere different!
from Pyblosxom import entries, tools
TAG_URL_PATTERN = None
def cb_start(args):
global TAG_URL_PATTERN
request = args['request']
config = request.getConfiguration()
slash = '/'
if(config['tag_url'][-1] == '/'):
slash = ''
TAG_URL_PATTERN = re.compile('^%s%s([^/]*)/?(index.[^/.]*)?' % (config['tag_url'], slash))
#
# I *think* cb_filelist is only supposed to act on tag pages, e.g.
# http://blogurl/tags/blahblah
#
def cb_filelist(args):
global TAG_URL_PATTERN
request = args['request']
config = request.getConfiguration()
data = request.getData()
new_files = [ ]
tagfileswithext = [ "txt" ]
if config.has_key( 'taggable_files' ):
tagfileswithext = config[ 'taggable_files' ]
ignore_directories = config['ignore_directories']
m = TAG_URL_PATTERN.match(data['url'])
if m:
tag = m.group(1)
for root,dirs,files in os.walk(config['datadir']):
for x in files:
m = re.compile('.*\.([^.]+)$').search(x)
if m and m.group(1) in tagfileswithext:
entry_location = root + "/" + x
directory = os.path.dirname(entry_location)
if ( os.path.split(directory)[1] in ignore_directories ):
continue
contents = open(entry_location,'r').read()
m = re.compile('\n#tags\s+(.*)\n' ).search(contents)
if ( m and tag in m.group(1).split(',') ) or ( not m and tag == 'untagged' ):
tmpentry = entries.fileentry.FileEntry(request, entry_location, data['root_datadir'])
new_files.append(( tmpentry._mtime, tmpentry ))
if new_files:
new_files.sort()
new_files.reverse()
myentries = []
for myentry in new_files:
myentries.append( myentry[1] )
return myentries
def cb_story(args):
request = args['request']
config = request.getConfiguration()
entry = args['entry']
if entry.has_key('tags'):
formatted_tags = [ ]
temp_tags = [ ]
formatted_tags.append(config['pretext'])
tags = entry.getMetadata('tags').split(',')
for tag in tags:
# temp_tags.append('%s' % (config['tag_url'], tag, tag))
temp_tags.append('%s' % (config['tag_url'], tag, tag))
formatted_tags.append(config['tagsep'].join(temp_tags))
formatted_tags.append(config['posttext'])
entry.setMetadata('tag_links',' '.join(formatted_tags))
def cb_story_end(args):
request = args["request"]
config = request.getConfiguration()
data = request.getData()
tagbase = config['tag_url'].replace(config['base_url'], '')
# for example, I have /tags/public/index.rss in there :)
static_urls = config.get("static_urls", [])
while len(tagbase) > 0 and tagbase[-1] == '/':
tagbase = tagbase[:-1]
entry = args['entry']
flavour = entry['flavour']
if not(data.has_key("STATIC") and data["STATIC"]):
return
if entry["bl_type"] != 'file':
return
m = TAG_URL_PATTERN.match(entry['url'])
if (not m) and entry.has_key("tags") and entry["tags"]:
tags = entry["tags"].split(',')
for tag in tags:
tagurl = "%s/%s/index.%s" % (tagbase, tag, flavour)
# Akk: I have no such variable static_urls.
#if tagurl not in static_urls:
# print "[tags] rendering %s ..." % (tagurl);
# tools.render_url(config, tagurl)
# But there was no "else" clause to do the static rendering,
# so I added this:
tools.render_url_statically(config, tagurl, "")
# vim: set ts=4 et :