lib/page.py
author Tero Marttila <terom@fixme.fi>
Sat, 07 Feb 2009 02:12:32 +0200
changeset 12 2abc5ace0b15
parent 11 fa216534ae45
child 13 178ea40bbc44
permissions -rw-r--r--
basic multi-level menu
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
12
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    70
    def get_ancestry (self) :
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    71
        """
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    72
            Returns a list of this page's parents and the page itself, but not root
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    73
        """
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    74
        
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    75
        # collect in reverse order
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    76
        ancestry = []
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    77
        
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    78
        # starting from self
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    79
        item = self
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    80
        
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    81
        # add all items, but not root
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    82
        while item and item.parent :
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    83
            ancestry.append(item)
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    84
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    85
            item = item.parent
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    86
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    87
        # reverse
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    88
        ancestry.reverse()
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    89
        
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    90
        # done
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    91
        return ancestry
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    92
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    93
    @property
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    94
    def url (self) :
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
            Build this page's URL
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    97
        """
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
        # cached?
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   100
        if self._url :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   101
            return self._url
12
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   102
2abc5ace0b15 basic multi-level menu
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   103
        segments = [item.name for item in self.get_ancestry()]
11
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
        # add empty segment if dir
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   106
        if self.children :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   107
            segments.append('')
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   108
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   109
        # join
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   110
        url = '/'.join(segments)
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   111
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   112
        # cache
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   113
        self._url = url
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   114
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   115
        # done
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   116
        return url
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   117
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   118
class PageTree (object) :
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
        The list of pages
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   121
    """
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   122
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   123
    def __init__ (self) :
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   124
        """
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   125
            Empty PageList, must call load_page_list to initialize, once
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   126
        """
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   127
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   128
    def _load (self, path=PAGE_LIST_FILE) :
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   129
        """
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   130
            Processes the lines in the given file
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   131
        """
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   132
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   133
        # collect the page list
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   134
        pages = []
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   135
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   136
        # stack of (indent, PageInfo) items
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   137
        stack = []
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   138
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   139
        # the previous item processed, None for first one
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   140
        prev = None
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   141
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   142
        for line in open(path, 'rb') :
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   143
            indent = 0
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   144
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   145
            # count indent
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   146
            for char in line :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   147
                # tabs break things
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   148
                assert char != '\t'
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   149
                
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   150
                # increment up to first non-space char
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   151
                if char == ' ' :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   152
                    indent += 1
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   153
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   154
                elif char == ':' :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   155
                    indent = 0
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   156
                    break
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   157
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   158
                else :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   159
                    break
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   160
            
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   161
            # strip whitespace
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   162
            line = line.strip()
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   163
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   164
            # ignore empty lines
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   165
            if not line :
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   166
                continue
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   167
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   168
            # parse line
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   169
            url, title = line.split(':')
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   170
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   171
            # remove whitespace
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   172
            url = url.strip()
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   173
            title = title.strip()
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
            # create PageInfo item without parent
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   176
            item = PageInfo(None, url, title)
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
            # are we the first item?
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   179
            if not prev :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   180
                assert url == '', "Page list must begin with root item"
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   181
                
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   182
                # root node does not have a parent
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   183
                parent = None
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   184
                
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   185
                # set root
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   186
                self.root = item
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   187
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   188
                # tee hee hee
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   189
                self.root.add_child(self.root)
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   190
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   191
                # initialize stack
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   192
                stack.append((0, self.root))
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   193
                
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   194
            else :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   195
                # peek stack
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   196
                stack_indent, stack_parent = stack[-1]
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   197
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   198
                # new indent level?
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   199
                if indent > stack_indent :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   200
                    # 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
   201
                    parent = prev
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   202
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   203
                    # push new indent level + its parent
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   204
                    stack.append((indent, parent))
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   205
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   206
                # same indent level as previous
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   207
                elif indent == stack_indent :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   208
                    # 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
   209
                    parent = stack_parent
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   210
                
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   211
                # unravel stack
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   212
                elif indent < stack_indent :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   213
                    while True :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   214
                        # remove current stack level
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   215
                        stack.pop(-1)
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
                        # peek next level
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   218
                        stack_indent, stack_parent = stack[-1]
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
                        # found the level to return to?
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   221
                        if stack_indent == indent :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   222
                            # restore prev
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   223
                            parent = stack_parent
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
                            break
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   226
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   227
                        elif stack_indent < indent :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   228
                            assert False, "Bad un-indent"
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   229
            
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   230
            # add to parent?
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   231
            if parent :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   232
                item.set_parent(parent)
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   233
                parent.add_child(item)
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
            # update prev
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   236
            prev = item
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   237
        
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   238
        # get root
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   239
        assert hasattr(self, 'root'), "No root item found!"
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   240
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   241
    def get_page (self, url) :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   242
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   243
            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
   244
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   245
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   246
        # start from root
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   247
        node = self.root
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   248
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   249
        # traverse the object tree
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   250
        for segment in url.split('/') :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   251
            if segment :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   252
                node = node.get_child(segment)
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
            if not node :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   255
                return None
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   256
        
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   257
        # return
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   258
        return node
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   259
    
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   260
    def get_siblings (self, url) :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   261
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   262
            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
   263
        """
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
        # look up the page itself
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   266
        page = self.get_page(url)
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   267
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   268
        # specialcase root/unknown node
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   269
        if page and page.parent :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   270
            return page.parent.children
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   271
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   272
        else :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   273
            return self.root.children
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   274
    
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   275
    def dump (self) :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   276
        """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   277
            Returns a string representation of the tree
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
        
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   280
        def _print_node (indent, node) :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   281
            return '\n'.join('%s%s' % (' '*indent, line) for line in [
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   282
                "%-15s : %s" % (node.name, node.title)
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
                _print_node(indent + 4, child) for child in node.children
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   285
            ])
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   286
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   287
        return _print_node(0, self.root)
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
# global singleton PageList instance
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   290
page_tree = PageTree()
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   291
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   292
def load_page_tree () :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   293
    """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   294
        Load the global singleton PageInfo instance
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   295
    """
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   296
    
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   297
    page_tree._load()
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   298
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   299
# XXX: should inherit from PageInfo
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   300
class Page (object) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   301
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   302
        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
   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
    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
   306
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   307
            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
   308
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   309
            @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
   310
            @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
   311
            @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
   312
            @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
   313
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   314
        
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   315
        # store
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   316
        self.url = url
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   317
        self.path = path
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   318
        self.basename = basename
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   319
        self.url_tail = url_tail
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   320
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   321
        # unbound
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   322
        self.request = None
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   323
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   324
        # sub-init
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   325
        self._init()
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   326
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   327
    def _init (self) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   328
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   329
            Do initial data loading, etc
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   330
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   331
        
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   332
        pass
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   333
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   334
    def bind_request (self, request) :
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   335
        """
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   336
            Bind this page-render to the given request
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   337
        """
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   338
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   339
        self.request = request
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   340
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   341
    @property
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   342
    def title (self) :
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   343
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   344
            Return the page's title
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   345
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   346
            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
   347
        """
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   348
        
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   349
        # lookup in page_list
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   350
        page_info = page_tree.get_page(self.url)
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   351
        
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   352
        # fallback to titlecase
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   353
        if page_info :
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   354
            title = page_info.title
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   355
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   356
        else :
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   357
            title = self.basename.title()
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   358
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   359
        return title
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   360
    
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   361
    @property
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   362
    def content (self) :
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   363
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   364
            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
   365
        """
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
        abstract
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
class HTMLPage (Page) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   370
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   371
        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
   372
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   373
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   374
    @property
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   375
    def content (self) :
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   376
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   377
            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
   378
        """
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
        return open(self.path, 'rb').read()
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
class TemplatePage (Page) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   383
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   384
        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
   385
    """
9
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   386
    
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   387
    @property
2a47b00f60b0 page list + menu
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   388
    def content (self) :
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   389
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   390
            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
   391
        """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   392
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   393
        return template.render_file(self.path,
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   394
            request     = self.request,
11
fa216534ae45 funky PageTree stuff
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   395
            page_tree   = page_tree
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   396
        )
7
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   397
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   398
# 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
   399
TYPE_HANDLERS = [
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   400
    ('html',                    HTMLPage        ),
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   401
    (template.TEMPLATE_EXT,     TemplatePage    ),
7
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   402
]
d6a8258bd90e YES YES MOAR WSGI - Hello World
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   403
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   404
def _lookup_handler (url, path, filename, basename, extension, 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
        We found the file that we looked for, now get its handler
5
9ed4c7d2bdd2 older work
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   407
    """
9ed4c7d2bdd2 older work
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   408
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   409
    # find appropriate handler
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   410
    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
   411
        # match against file extension?
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   412
        if handler_ext == extension :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   413
            # found handler, return instance
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   414
            return handler(url, path, basename, tail)
5
9ed4c7d2bdd2 older work
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   415
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   416
    # no handler found
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   417
    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
   418
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   419
def lookup (name) :
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
        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
   422
    """
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   423
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   424
    # inital path
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   425
    path = PAGE_DIR
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   426
    url_segments = []
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   427
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   428
    # name segments
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   429
    segments = name.split('/')
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
    # 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
   432
    while True :
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   433
        segment = None
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
        # pop segment
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   436
        if segments :
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   437
            segment = segments.pop(0)
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   438
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   439
            url_segments.append(segment)
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   440
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   441
        # translate empty -> index
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   442
        if not segment :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   443
            segment = 'index'
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   444
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   445
        # look for it in the dir
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   446
        for filename in os.listdir(path) :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   447
            # build full file path
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   448
            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
   449
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   450
            # stat, recurse into subdirectory?
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   451
            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
   452
                # use new dir
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   453
                path = file_path
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   454
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   455
                # 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
   456
                break
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   457
 
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   458
            # split into basename + extension
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   459
            basename, extension = os.path.splitext(filename)
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   460
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   461
            # ...remove that dot
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   462
            extension = extension.lstrip('.')
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   463
            
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   464
            # match against requested page name?
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   465
            if basename == segment :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   466
                # found the file we wanted
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   467
                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
   468
            
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   469
            else :
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   470
                # inspect next file in dir
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   471
                continue
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   472
10
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   473
        else :
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   474
            # 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
   475
            break
d83b10c210e3 some vodoo for generating correct URLs
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   476
8
0ce1f471e9d7 and it works, a lot better than before
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   477
    # 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
   478
    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
   479