""" A TRAC macro for creating foldable tree-like tables. Homepage: http://trac-hacks.org/wiki/FoldMacro Based on: Folding macro by Thorsten Ott (wanagi at web-helfer.de) Authors: Sven Matner (shivoc $at$ rise-world *dot* com) Peter Molnar (pm $at$ rise-world *dot* com) """ from trac import util from trac.wiki.formatter import wiki_to_oneliner from StringIO import StringIO import os import urllib import re import random class Fold: re_start = re.compile('^ *<{3} *$') re_mid = re.compile('^ *[-=]{3} *$') re_end = re.compile('^ *>{3} *$') re_spaces = re.compile('^ *$') (NORMAL, VISIBLE, HIDDEN) = range(3) def __init__(self, hdf, args, env): self.state = self.NORMAL self.id = int(random.random() * 100000) self.out = StringIO() self.gid_counter = self.id self.gid = 0 self.marker = "" self.stack = [] self.gids = [] self.visibility = [] self.args = args self.env = env def create_marker(self, label): indent = self.depth() * 10; return "%s" % \ (indent, self.id, self.gid, label) def depth(self): return len(self.stack) - 1 def enter_visible(self): self.stack.append((self.gid, self.state)) self.gid_counter += 1 self.gid = self.gid_counter self.state = self.VISIBLE self.marker = self.create_marker('+') self.gids.append(str(self.gid)) self.visibility.append('1') def enter_hidden(self): self.state = self.HIDDEN self.marker = self.create_marker('-') self.visibility[-1] = '0' def enter_normal(self): (self.gid, self.state) = self.stack[-1] self.stack = self.stack[:-1] self.gids = self.gids[:-1] self.visibility = self.visibility[:-1] def __call__(self): lines = self.args.split('\n') print >> self.out print >> self.out, "