--- Page.py.orig	2005-07-14 16:05:31.000000000 +0100
+++ Page.py	2005-07-15 09:55:13.000000000 +0100
@@ -1467,7 +1467,27 @@
         @rtype: list
         @return: categories this page belongs to
         """
-        return wikiutil.filterCategoryPages(request, self.getPageLinks(request))
+	categories = []
+	raw_body = self.get_raw_body()
+
+	bits = raw_body.split('\n----\n')
+	if len(bits) == 1:
+	    return categories;
+
+	lines = bits[-1].split()
+	for line in lines:
+	    line = line.strip()
+	    if line == "":
+	    	pass
+	    elif re.match("^Category\w*$", line):
+	        categories.append (line)
+	    else:
+	        # Any token in the last bit that doesn't match means it isn't
+		# a category section
+	        categories = []
+		break
+
+        return categories
 
     def getParentPage(self):
         """ Return parent page or None
--- search.py.orig	2005-07-14 16:26:50.000000000 +0100
+++ search.py	2005-07-25 12:02:19.000000000 +0100
@@ -337,7 +337,80 @@
     def indexed_query(self):
         return self
 
-    
+class CategorySearch(BaseExpression):
+    """ Term searches in pattern in page category only """
+
+    def __init__(self, pattern, use_re=False, case=False):
+        """ Init a category search
+
+        @param pattern: pattern to search for, ascii string or unicode
+        @param use_re: treat pattern as re of plain text, bool
+        @param case: do case sensitive search, bool 
+        """
+        self._pattern = "Category%s" % pattern
+	self._textpattern = '(' + self._pattern.replace('/', '|') + ')'
+        self.negated = 0
+	self.textsearch = TextSearch(self._textpattern, use_re=1, case=case)
+        self._build_re(unicode(pattern), use_re=use_re, case=case)
+        
+    def _build_re(self, pattern, use_re=False, case=False):
+        """ Make a regular expression out of a text pattern """
+        flags = (re.U | re.I, re.U)[case]
+
+        try:
+            if not use_re:
+                raise re.error
+            self.search_re = re.compile("Category%s" % pattern, flags)
+            self.static = False
+        except re.error:
+            self.pattern = "Category%s" % pattern
+            self.static = True
+        
+    def costs(self):
+        return 100
+
+    def __unicode__(self):
+        if self.negated: neg = '-'
+        else: neg = ''
+        return u'%s!"%s"' % (neg, unicode(self._pattern))
+
+    def highlight_re(self):
+        return u"(%s)" % self._pattern    
+
+    def search(self, page):
+        # Get matches in page categories
+        matches = []
+
+	Found = False
+
+	for category in page.getCategories(page.request):
+	    if ((self.static and self.pattern == category) or
+	        (not self.static and self.search_re.match(category))):
+		Found = True
+	        break
+
+	if Found:
+	    # Search in page text
+	    results = self.textsearch.search(page)
+	    if results:
+	        matches.extend(results)
+	    else:
+	    	matches.append(TextMatch(0,0))
+
+	# Decide what to do with the results.
+        if ((self.negated and matches) or
+            (not self.negated and not matches)):
+            return None
+        elif matches:
+            return matches
+        else:
+            # XXX why not return None or empty list?
+            return [Match()]
+
+    def indexed_query(self):
+        return self
+
+   
 class LinkSearch(BaseExpression):
     """ Search the term in the pagelinks """
 
@@ -663,6 +736,7 @@
         regex = self.regex
         case = self.case
         linkto = 0
+	category = 0
 
         for m in modifiers:
             if "title".startswith(m):
@@ -673,8 +747,12 @@
                 case = True
             elif "linkto".startswith(m):
                 linkto = True
+	    elif "category".startswith(m):
+	        category = True
 
-        if linkto:
+	if category:
+	    obj = CategorySearch(text, use_re=regex, case=case)
+        elif linkto:
             obj = LinkSearch(text, use_re=regex, case=case)
         elif title_search:
             obj = TitleSearch(text, use_re=regex, case=case)
