#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Provide GTK bookmarks as pipe menu for Openbox_.
This script generates XML representing a menu with items that open a file
manager at specific locations. Besides the current user's home directory, the
user's GTK bookmarks file is read and the contents are added to the menu.
On a side note: I also (primarily, actually) used the ElementTree_ library to
generate the needed XML. It already comes with Python 2.5 and later, so it
was a reasonable alternative to consider since it wouldn't introduce
additional dependencies.
However, tests with the ``timeit`` module showed that using
``xml.etree.ElementTree`` is roughly about 35 times slower than the raw string
approach, ``xml.etree.cElementTree`` about 25 times.
.. _Openbox: http://www.icculus.org/openbox/
.. _ElementTree: http://effbot.org/zone/element-index.htm
:Copyright: 2008 Jochen Kupperschmidt
:Date: 31-Mar-2008
:License: MIT
"""
from __future__ import with_statement
import os.path
BOOKMARKS = '~/.gtk-bookmarks'
FILEMANAGER = '/usr/bin/thunar'
def parse_bookmarks(lines):
for line in lines:
path, label = line.strip().partition(' ')[::2]
if not label:
label = os.path.basename(os.path.normpath(path))
yield path, label
def create_menu(items):
yield '<?xml version="1.0" encoding="utf-8"?>'
yield '<openbox_pipe_menu>'
for path, label in items:
if path is None:
yield '<separator/>'
else:
yield ('<item label="%s"><action name="Execute">'
'<execute>%s</execute></action></item>'
% (label, ' '.join([FILEMANAGER, path])))
yield '</openbox_pipe_menu>'
if __name__ == '__main__':
# Assemble a list of menu items. An item having ``None`` as the first
# element is turned into a separator.
items = [('~', 'home'), (None, None)]
with open(os.path.expanduser(BOOKMARKS)) as f:
items.extend(parse_bookmarks(f))
print ''.join(create_menu(items))