sites/www.qmsk.net/page_tree.py
author Tero Marttila <terom@fixme.fi>
Sat, 07 Feb 2009 17:10:06 +0200
branchsites
changeset 34 09196d5b2a39
parent 31 lib/filesystem/page_tree.py@107062ebb6f9
permissions -rw-r--r--
move lib.filesystem code to sites/www.qmsk.net, part one
16
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
"""
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
    Implements the tree containing pages and their metadata
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
"""
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
31
107062ebb6f9 bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
     5
from lib import tree_parse
16
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
17
b538e1f7011c add some better error checking to the page_tree stuff
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
     7
class PageTreeError (Exception) :
b538e1f7011c add some better error checking to the page_tree stuff
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
     8
    """
b538e1f7011c add some better error checking to the page_tree stuff
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
     9
        Error parsing/loading the page tree
b538e1f7011c add some better error checking to the page_tree stuff
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
    10
    """
b538e1f7011c add some better error checking to the page_tree stuff
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
    11
b538e1f7011c add some better error checking to the page_tree stuff
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
    12
    pass
16
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
class PageInfo (object) :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
        Contains metainformation about a page
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
    def __init__ (self, parent, name, title, children=None) :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
            Initialize, children defaults to empty list
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
        # store
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
        self.parent = parent
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
        self.name = name
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
        self.title = title
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
        self.children = children if children else []
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
        # no url get
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
        self._url = None
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
    
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
    def set_parent (self, parent) :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
            Set a parent where non was set before
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
        assert self.parent is None
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
        self.parent = parent
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    def add_child (self, child) :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
            Add a PageInfo child
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
        self.children.append(child)
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    def get_child (self, name) :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
            Look up a child by name, returning None if not found
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
        return dict((c.name, c) for c in self.children).get(name)
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
    def get_ancestry (self) :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
            Returns a list of this page's parents and the page itself, but not root
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
        
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
        # collect in reverse order
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
        ancestry = []
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
        
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
        # starting from self
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
        item = self
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
        
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
        # add all items, but not root
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
        while item and item.parent :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
            ancestry.append(item)
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
            item = item.parent
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
        # reverse
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
        ancestry.reverse()
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
        
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
        # done
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
        return ancestry
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
    @property
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
    def url (self) :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
            Build this page's URL
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
        # cached?
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
        if self._url :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
            return self._url
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
        segments = [item.name for item in self.get_ancestry()]
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
        
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
        # add empty segment if dir
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
        if self.children :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
            segments.append('')
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
        
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
        # join
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
        url = '/'.join(segments)
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
        
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
        # cache
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
        self._url = url
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
        
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
        # done
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
        return url
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
class PageTree (object) :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
    """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
        The tree of pages, rooted at .root.
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
        Use load_page_tree to initialize the global page_tree instance, and then use that
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
    """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
31
107062ebb6f9 bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   111
    def __init__ (self, path) :
16
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
        """
31
107062ebb6f9 bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   113
            Loads the PageTree root from the given file
16
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
        """
31
107062ebb6f9 bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   115
        
107062ebb6f9 bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   116
        # store
107062ebb6f9 bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   117
        self.path = path
107062ebb6f9 bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   118
        
107062ebb6f9 bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   119
        # load
107062ebb6f9 bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   120
        self._load(path)
16
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
    def _load (self, path) :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
            Processes the lines in the given file
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
        
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
        # parse tree
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
        tree = tree_parse.parse(path, ':')
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
17
b538e1f7011c add some better error checking to the page_tree stuff
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   130
        if not tree :
b538e1f7011c add some better error checking to the page_tree stuff
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   131
            raise PageTreeError("No root node found")
b538e1f7011c add some better error checking to the page_tree stuff
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   132
16
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
        def _create_node (parent, item) :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
            """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
                Creates and returns a PageInfo from the given parent node and (line_number, line, children) tuple item
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
            """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
            # unpack
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
            line_number, line, children = item
17
b538e1f7011c add some better error checking to the page_tree stuff
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   140
            
b538e1f7011c add some better error checking to the page_tree stuff
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   141
            # parse line
b538e1f7011c add some better error checking to the page_tree stuff
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   142
            url = title = None
b538e1f7011c add some better error checking to the page_tree stuff
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   143
            
b538e1f7011c add some better error checking to the page_tree stuff
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   144
            try :
b538e1f7011c add some better error checking to the page_tree stuff
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   145
                url, title = line.split(':')
16
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
17
b538e1f7011c add some better error checking to the page_tree stuff
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   147
            except :
b538e1f7011c add some better error checking to the page_tree stuff
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   148
                raise PageTreeError("Invalid line: %s:%d: %r" % (path, line_number, line))
16
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
            # remove whitespace
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
            url = url.strip()
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
            title = title.strip()
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
            
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
            # create PageInfo
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
            node = PageInfo(parent, url, title)
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
            
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
            # set node children
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
            node.children = [
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
                _create_node(node, child_item) for child_item in children
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
            ]
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
            # return
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
            return node
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
        
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
        # translate
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
        self.root = _create_node(None, tree)
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
            
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
        # *evil cackle*
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
        self.root.children.insert(0, self.root)
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
        
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
    def get_page (self, url) :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
            Lookup the given page URL, and return the matching PageInfo object, or None, if not found
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
        
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
        # start from root
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
        node = self.root
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
        
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
        # traverse the object tree
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
        for segment in url.split('/') :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
            if segment :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
                node = node.get_child(segment)
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
            if not node :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
                return None
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
        
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
        # return
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
        return node
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
    
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
    def get_siblings (self, url) :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
            Get the list of siblings for the given url, including the given page itself
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
        
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
        # look up the page itself
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
        page = self.get_page(url)
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
        
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
        # specialcase root/unknown node
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
        if page and page.parent :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
            return page.parent.children
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
        else :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
            return self.root.children
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
    
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
    def dump (self) :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
            Returns a string representation of the tree
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
        """
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
        
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   210
        def _print_node (indent, node) :
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
            return '\n'.join('%s%s' % (' '*indent, line) for line in [
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
                "%-15s : %s" % (node.name, node.title)
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
            ] + [
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
                _print_node(indent + 4, child) for child in node.children if child != node
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
            ])
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   216
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
        return _print_node(0, self.root)
4a40718c7b4b better error handling of import errors in CGI, and split PageTree out from page.py into page_tree.py and tree_parse.py
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218