lib/page.py
author Tero Marttila <terom@fixme.fi>
Sat, 07 Feb 2009 01:33:30 +0200
changeset 11 fa216534ae45
parent 10 d83b10c210e3
child 12 2abc5ace0b15
permissions -rw-r--r--
funky PageTree stuff
5
9ed4c7d2bdd2 older work
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
7
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
     2
"""
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
     3
    Handling page requests
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
     4
"""
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
     5
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
     6
# for filesystem ops
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
     7
import os, os.path
7
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
     8
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
     9
# for ResponseError
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    10
import http
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    11
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    12
# for TemplatePage
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    13
import template
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    14
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    15
# path to directory containing the page heirarcy
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    16
PAGE_DIR = "pages"
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    17
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    18
# path to directory containing the list of visible pages
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    19
PAGE_LIST_FILE = os.path.join(PAGE_DIR, "list")
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    20
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    21
class PageError (http.ResponseError) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    22
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    23
        Error looking up/handling a page
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    24
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    25
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    26
    pass
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    27
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    28
class PageInfo (object) :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    29
    """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    30
        Contains metainformation about a page
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    31
    """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    32
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    33
    def __init__ (self, parent, name, title, children=None) :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    34
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    35
            Initialize, children defaults to empty list
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    36
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    37
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    38
        # store
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    39
        self.parent = parent
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    40
        self.name = name
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    41
        self.title = title
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    42
        self.children = children if children else []
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    43
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    44
        # no url get
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    45
        self._url = None
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    46
    
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    47
    def set_parent (self, parent) :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    48
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    49
            Set a parent where non was set before
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    50
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    51
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    52
        assert self.parent is None
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    53
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    54
        self.parent = parent
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    55
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    56
    def add_child (self, child) :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    57
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    58
            Add a PageInfo child
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    59
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    60
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    61
        self.children.append(child)
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    62
    
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    63
    def get_child (self, name) :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    64
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    65
            Look up a child by name, returning None if not found
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    66
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    67
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    68
        return dict((c.name, c) for c in self.children).get(name)
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    69
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    70
    @property
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    71
    def url (self) :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    72
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    73
            Build this page's URL
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    74
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    75
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    76
        # cached?
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    77
        if self._url :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    78
            return self._url
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    79
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    80
        # collect URL segments in reverse order
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    81
        segments = []
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    82
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    83
        # add empty segment if dir
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    84
        if self.children :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    85
            segments.append('')
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    86
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    87
        # iterate over ancestry
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    88
        item = self
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    89
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    90
        # add all parent names, but not root's
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    91
        while item and item.parent :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    92
            segments.append(item.name)
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    93
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    94
            item = item.parent
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    95
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    96
        # reverse segments
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    97
        segments.reverse()
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    98
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    99
        # join
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   100
        url = '/'.join(segments)
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   101
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   102
        # cache
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   103
        self._url = url
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   104
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   105
        # done
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   106
        return url
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   107
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   108
class PageTree (object) :
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   109
    """
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   110
        The list of pages
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   111
    """
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   112
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   113
    def __init__ (self) :
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   114
        """
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   115
            Empty PageList, must call load_page_list to initialize, once
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   116
        """
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   117
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   118
    def _load (self, path=PAGE_LIST_FILE) :
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   119
        """
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   120
            Processes the lines in the given file
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   121
        """
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   122
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   123
        # collect the page list
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   124
        pages = []
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   125
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   126
        # stack of (indent, PageInfo) items
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   127
        stack = []
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   128
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   129
        # the previous item processed, None for first one
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   130
        prev = None
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   131
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   132
        for line in open(path, 'rb') :
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   133
            indent = 0
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   134
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   135
            # count indent
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   136
            for char in line :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   137
                # tabs break things
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   138
                assert char != '\t'
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   139
                
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   140
                # increment up to first non-space char
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   141
                if char == ' ' :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   142
                    indent += 1
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   143
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   144
                elif char == ':' :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   145
                    indent = 0
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   146
                    break
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   147
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   148
                else :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   149
                    break
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   150
            
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   151
            # strip whitespace
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   152
            line = line.strip()
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   153
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   154
            # ignore empty lines
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   155
            if not line :
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   156
                continue
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   157
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   158
            # parse line
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   159
            url, title = line.split(':')
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   160
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   161
            # remove whitespace
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   162
            url = url.strip()
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   163
            title = title.strip()
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   164
            
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   165
            # create PageInfo item without parent
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   166
            item = PageInfo(None, url, title)
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   167
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   168
            # are we the first item?
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   169
            if not prev :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   170
                assert url == '', "Page list must begin with root item"
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   171
                
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   172
                # root node does not have a parent
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   173
                parent = None
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   174
                
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   175
                # set root
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   176
                self.root = item
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   177
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   178
                # tee hee hee
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   179
                self.root.add_child(self.root)
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   180
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   181
                # initialize stack
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   182
                stack.append((0, self.root))
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   183
                
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   184
            else :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   185
                # peek stack
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   186
                stack_indent, stack_parent = stack[-1]
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   187
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   188
                # new indent level?
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   189
                if indent > stack_indent :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   190
                    # set parent to previous item, and push new indent level + parent to stack
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   191
                    parent = prev
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   192
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   193
                    # push new indent level + its parent
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   194
                    stack.append((indent, parent))
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   195
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   196
                # same indent level as previous
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   197
                elif indent == stack_indent :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   198
                    # parent is the one of the current stack level, stack doesn't change
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   199
                    parent = stack_parent
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   200
                
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   201
                # unravel stack
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   202
                elif indent < stack_indent :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   203
                    while True :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   204
                        # remove current stack level
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   205
                        stack.pop(-1)
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   206
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   207
                        # peek next level
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   208
                        stack_indent, stack_parent = stack[-1]
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   209
                        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   210
                        # found the level to return to?
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   211
                        if stack_indent == indent :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   212
                            # restore prev
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   213
                            parent = stack_parent
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   214
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   215
                            break
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   216
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   217
                        elif stack_indent < indent :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   218
                            assert False, "Bad un-indent"
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   219
            
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   220
            # add to parent?
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   221
            if parent :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   222
                item.set_parent(parent)
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   223
                parent.add_child(item)
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   224
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   225
            # update prev
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   226
            prev = item
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   227
        
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   228
        # get root
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   229
        assert hasattr(self, 'root'), "No root item found!"
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   230
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   231
    def get_page (self, url) :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   232
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   233
            Lookup the given page URL, and return the matching PageInfo object, or None, if not found
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   234
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   235
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   236
        # start from root
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   237
        node = self.root
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   238
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   239
        # traverse the object tree
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   240
        for segment in url.split('/') :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   241
            if segment :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   242
                node = node.get_child(segment)
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   243
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   244
            if not node :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   245
                return None
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   246
        
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   247
        # return
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   248
        return node
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   249
    
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   250
    def get_siblings (self, url) :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   251
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   252
            Get the list of siblings for the given url, including the given page itself
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   253
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   254
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   255
        # look up the page itself
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   256
        page = self.get_page(url)
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   257
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   258
        # specialcase root/unknown node
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   259
        if page and page.parent :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   260
            return page.parent.children
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   261
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   262
        else :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   263
            return self.root.children
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   264
    
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   265
    def dump (self) :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   266
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   267
            Returns a string representation of the tree
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   268
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   269
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   270
        def _print_node (indent, node) :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   271
            return '\n'.join('%s%s' % (' '*indent, line) for line in [
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   272
                "%-15s : %s" % (node.name, node.title)
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   273
            ] + [
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   274
                _print_node(indent + 4, child) for child in node.children
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   275
            ])
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   276
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   277
        return _print_node(0, self.root)
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   278
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   279
# global singleton PageList instance
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   280
page_tree = PageTree()
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   281
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   282
def load_page_tree () :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   283
    """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   284
        Load the global singleton PageInfo instance
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   285
    """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   286
    
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   287
    page_tree._load()
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   288
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   289
# XXX: should inherit from PageInfo
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   290
class Page (object) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   291
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   292
        This object represents the information about our attempt to render some specific page
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   293
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   294
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   295
    def __init__ (self, url, path, basename, url_tail) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   296
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   297
            Initialize the page at the given location
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   298
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   299
            @param url the URL leading to this page
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   300
            @param path the filesystem path to this page's file
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   301
            @param basename the filesystem name of this page's file, without the file extension
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   302
            @param url_trail trailing URL for this page
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   303
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   304
        
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   305
        # store
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   306
        self.url = url
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   307
        self.path = path
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   308
        self.basename = basename
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   309
        self.url_tail = url_tail
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   310
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   311
        # unbound
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   312
        self.request = None
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   313
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   314
        # sub-init
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   315
        self._init()
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   316
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   317
    def _init (self) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   318
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   319
            Do initial data loading, etc
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   320
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   321
        
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   322
        pass
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   323
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   324
    def bind_request (self, request) :
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   325
        """
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   326
            Bind this page-render to the given request
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   327
        """
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   328
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   329
        self.request = request
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   330
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   331
    @property
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   332
    def title (self) :
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   333
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   334
            Return the page's title
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   335
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   336
            Defaults to the retreiving the page title from page_list, or basename in Titlecase.
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   337
        """
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   338
        
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   339
        # lookup in page_list
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   340
        page_info = page_tree.get_page(self.url)
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   341
        
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   342
        # fallback to titlecase
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   343
        if page_info :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   344
            title = page_info.title
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   345
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   346
        else :
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   347
            title = self.basename.title()
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   348
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   349
        return title
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   350
    
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   351
    @property
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   352
    def content (self) :
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   353
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   354
            Return the page content as a string
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   355
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   356
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   357
        abstract
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   358
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   359
class HTMLPage (Page) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   360
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   361
        A simple .html page that's just passed through directly
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   362
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   363
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   364
    @property
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   365
    def content (self) :
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   366
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   367
            Opens the .html file, reads and returns contents
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   368
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   369
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   370
        return open(self.path, 'rb').read()
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   371
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   372
class TemplatePage (Page) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   373
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   374
        A template that's rendered using our template library
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   375
    """
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   376
    
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   377
    @property
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   378
    def content (self) :
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   379
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   380
            Loads the .tmpl file, and renders it
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   381
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   382
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   383
        return template.render_file(self.path,
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   384
            request     = self.request,
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   385
            page_tree   = page_tree
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   386
        )
7
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   387
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   388
# list of page handlers, by type
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   389
TYPE_HANDLERS = [
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   390
    ('html',                    HTMLPage        ),
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   391
    (template.TEMPLATE_EXT,     TemplatePage    ),
7
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   392
]
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   393
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   394
def _lookup_handler (url, path, filename, basename, extension, tail) :
5
9ed4c7d2bdd2 older work
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   395
    """
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   396
        We found the file that we looked for, now get its handler
5
9ed4c7d2bdd2 older work
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   397
    """
9ed4c7d2bdd2 older work
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   398
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   399
    # find appropriate handler
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   400
    for handler_ext, handler in TYPE_HANDLERS :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   401
        # match against file extension?
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   402
        if handler_ext == extension :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   403
            # found handler, return instance
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   404
            return handler(url, path, basename, tail)
5
9ed4c7d2bdd2 older work
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   405
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   406
    # no handler found
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   407
    raise PageError("No handler found for page %r of type %r" % (url, extension))
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   408
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   409
def lookup (name) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   410
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   411
        Look up and return a Page object for the given page, or raise an error
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   412
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   413
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   414
    # inital path
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   415
    path = PAGE_DIR
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   416
    url_segments = []
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   417
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   418
    # name segments
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   419
    segments = name.split('/')
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   420
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   421
    # iterate through the parts of the page segments
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   422
    while True :
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   423
        segment = None
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   424
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   425
        # pop segment
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   426
        if segments :
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   427
            segment = segments.pop(0)
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   428
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   429
            url_segments.append(segment)
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   430
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   431
        # translate empty -> index
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   432
        if not segment :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   433
            segment = 'index'
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   434
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   435
        # look for it in the dir
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   436
        for filename in os.listdir(path) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   437
            # build full file path
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   438
            file_path = os.path.join(path, filename)
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   439
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   440
            # stat, recurse into subdirectory?
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   441
            if os.path.isdir(file_path) and filename == segment :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   442
                # use new dir
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   443
                path = file_path
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   444
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   445
                # break for-loop to look at next segment
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   446
                break
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   447
 
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   448
            # split into basename + extension
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   449
            basename, extension = os.path.splitext(filename)
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   450
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   451
            # ...remove that dot
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   452
            extension = extension.lstrip('.')
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   453
            
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   454
            # match against requested page name?
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   455
            if basename == segment :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   456
                # found the file we wanted
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   457
                return _lookup_handler('/'.join(url_segments), file_path, filename, basename, extension, '/'.join(segments))
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   458
            
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   459
            else :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   460
                # inspect next file in dir
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   461
                continue
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   462
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   463
        else :
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   464
            # did not find any dir or file, break out of while loop
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   465
            break
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   466
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   467
    # did not find the filename we were looking for in os.listdir
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   468
    raise PageError("Page not found: %s" % name, status='404 Not Found')
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   469