446c64206e9b20c9fd523c103268189fc9b0446e
[treecutter.git] / treecutter / trie.py
1 #!/usr/bin/python
2 import os
3 import fnmatch
4 import subprocess
5 import amara
6 import re
7 import tempfile
8 import errno
9 import time
10 import argparse
11 import shutil
12 import pygraphviz as pgv
13 import glob
14 import gettext
15 import shutil
16 from amara import bindery
17 from amara.xslt import transform
18 from Cheetah.Template import Template
19
20 class Node():
21     def __init__(self,token,value):
22         self._token = token
23         self._value = value
24         self._children = []
25
26     def token(self):
27         return self._token
28
29     def value(self):
30         return self._value
31
32     def children(self):
33         return self._children
34
35 class Trie():
36     def __init__(self):
37         self._root = []
38
39     def __iter__(self):
40         return self.inorder(self._root)
41
42     def inorder(self,t):
43         for l in t:
44             yield l.value()
45             for x in self.inorder(l.children()):
46                 yield x
47
48     def _add(self,trie, key, content):
49         # is the key a leaf
50         k = key.pop(0)
51         if key == []:
52             node = Node(k,content)
53             trie.append(node)
54         else:
55             for ch in trie:
56                 if ch.token() == k:
57                     self._add(ch.children(), key, content)
58
59     def add(self,key, content):
60         self._add(self._root, key, content)
61
62     def _graph(self, trie, G):
63         for l in trie:
64             G.add_node(l.token())
65             for ch in l.children():
66                 G.add_edge(l.token(),ch.token())
67                 self._graph(l.children(), G)
68
69     def graph(self):
70         G = pgv.AGraph(directed=True)
71         G.add_node("sitemap")
72         for ch in self._root:
73             G.add_edge("sitemap",ch.token())
74         self._graph(self._root, G)
75 #        G.layout('dot')
76 #        G.draw('g.png')
77 #        print G.string()
78
79     def _menu(self, trie, lang, page, css):
80         html = "<ul%s>\n" % css
81         for l in trie:
82             sel = ''
83             p = l.value().page(lang)
84             if p == page:
85                 sel = ' class="selected"'
86             if p != None:
87                 html += '<li%s><a href="%s">%s</a>\n' \
88                     % (sel,l.value().link(),p.menu())
89             else:
90                 html += '<li%s><a href="%s.en" hreflang="en">%s</a>*\n' \
91                     % (sel,l.value().link(), l.value().page('en').menu())
92             if l.children():
93                 html += self._menu(l.children(), lang, page, "")
94         html += "</ul>\n"
95         return html
96
97     def menu(self,lang,page,cssclass):
98         css = ''
99         if cssclass:
100             css = ' class="'+cssclass+'"'
101         return self._menu(self._root, lang, page, css)