Description
Category is not recognized when there is no ---- line above
- Only the last category is recognized when categories are seperated by "," instead of " "
You might say that this is the policy, however I think seperating categories by "," is quite natural and if I remember correctly it worked with non Xapian setup (not sure though).
Steps to reproduce
Use the example markup below and click on the categories to find that the page is not listed in the category.
Example
Without leading ---- (not sure that would be considered bug or feature)
CategoryHomepage
- Multiple categories seperated by "," only recognizes the last category
---- CategoryHomepage, CategoryDiscussion
Details
MoinMoin Version |
1.7.2 |
OS and Version |
Linus SLE10 / x64 |
Python Version |
2.4 |
Server Setup |
twisted on linux |
Server Details |
Xapian on, version 1.04 |
Workaround
Categories must be preceded by ---- and seperated by " " rather than ","
If somebody is in the same situation the following script might be helpfull (use at your own risk). It loops over all pages that have "false" category entries as described above. It helped me alot, just updated 306 pages
1 #!/usr/bin/env python
2
3 import sys
4 import re
5 import time
6
7 # wiki config directory
8 if 'win' in sys.platform:
9 WIKICONF = 'd:/caewiki'
10 SUPERUSER = u'FranzZieher'
11 else:
12 WIKICONF = '/s330/moin/caewiki'
13 SUPERUSER = u'zieherf'
14
15 sys.path.append(WIKICONF)
16
17 from MoinMoin import user
18 from MoinMoin import config
19 from MoinMoin.request import request_cli
20
21 _REQUEST = None
22
23 def getRequest():
24 """Create request object
25 """
26 global _REQUEST
27 if _REQUEST:
28 return _REQUEST
29 request = request_cli.Request()
30 u = user.User(request,None,SUPERUSER)
31 request.user = user.User(request,u.id)
32 _REQUEST = request
33 return request
34
35 getRequest()
36 print _REQUEST.user.name
37
38 from MoinMoin.PageEditor import PageEditor
39 from MoinMoin.Page import Page
40 from MoinMoin.search import searchPages
41
42 class UpdatePageCategory(object):
43
44 def __init__(self,request,page):
45 self.request = request
46 self.page = page
47 self.text = None # new text (one string)
48 self.modLines = {} # modified lines
49 self.modLineNo = [] # modified line numbers
50
51 def modText(self):
52 """Must create new page text, self.text!
53 """
54 raise NotImplementedError
55
56 def saveText(self):
57 """Save text of modified page
58 """
59 page = PageEditor(self.request,self.page.page_name)
60 ppath,rev,flag = page.get_rev()
61
62 if not self.text:
63 print "Page content has not been updated yet, aborting!"
64 return
65
66 print "----------------------------------------------"
67 print "Updating PAGE %s" % self.page.page_name
68 print "----------------------------------------------"
69 if self.modLines:
70 try:
71 for lno in self.modLineNo:
72 print "%d:%s" % (lno,self.modLines[lno])
73 msg = page.saveText(self.text,rev)
74 print msg
75 print "Revision %d saved!" % (rev)
76 except page.Unchanged:
77 print "Page content did not change, not saved!"
78
79 else:
80 print "Non modifications found, page not modified"
81 print ""
82
83 class ModPage(UpdatePageCategory):
84
85 def modText(self,pat=r"^( *[.]* *)(Category[A-Za-z]+.*$)",insertRule=False):
86 """No numbers allowed by default in the search pattern
87 Remove all characters before the first Category entry.
88 """
89 rec = re.compile(pat)
90 lines = self.page.getlines()
91 for lno,l in enumerate(self.page.getlines()):
92 m = rec.match(l)
93 if m:
94 lines[lno] = ' '.join([x.strip() for x in m.groups()[1].split(',')])
95 if insertRule:
96 lines[lno] = '----\n' + lines[lno]
97 self.modLineNo.append(lno)
98 self.modLines[lno] = lines[lno]
99
100 self.text = '\n'.join(lines)
101
102 # -------------------------------------------------------------------
103
104 def main():
105
106 request = getRequest()
107
108 # single category pages first
109 res1 = searchPages(request,'r:"\n----\n+ *[. ]*Category[A-Z][A-Za-z]+ *\n" m:text',regex=True)
110 res2 = searchPages(request,'r:"\n+ *[. ]*Category[A-Z][A-Za-z]+ *\n" m:text',regex=True)
111
112 pn1 = [p.page_name for p in res1.hits]
113 pn2 = [p.page_name for p in res2.hits]
114
115 # all pagenames that need an '----'
116 pn3 = list(set(pn2) - set(pn1))
117
118 print "=========================================="
119 print " Single page categories without ----"
120 print "=========================================="
121 print "Number of pages to upgrade: %d" % len(pn3)
122 print ""
123 for pn in pn3:
124 page = Page(request,pn)
125 modPage = ModPage(request,page)
126 modPage.modText(insertRule=True)
127 modPage.saveText()
128 time.sleep(1)
129
130 # multiple categories
131 res1 = searchPages(request,'r:"\n----\n+ *[. ]*Category[A-Z][A-Za-z]+, .*\n" m:text',regex=True)
132 res2 = searchPages(request,'r:"\n+ *[. ]*Category[A-Z][A-Za-z]+, .*\n" m:text',regex=True)
133
134 pn1 = [p.page_name for p in res1.hits]
135 pn2 = [p.page_name for p in res2.hits]
136
137 # all pagenames that need an '----'
138 pn3 = list(set(pn2) - set(pn1))
139
140 print "========================================================="
141 print " Multiple page categories seperated by , and without ----"
142 print "========================================================="
143 print "Number of pages to upgrade: %d" % len(pn3)
144 print ""
145 for pn in pn3:
146 page = Page(request,pn)
147 modPage = ModPage(request,page)
148 modPage.modText(insertRule=True)
149 modPage.saveText()
150 time.sleep(1)
151
152 print "========================================================="
153 print " Multiple page categories seperated by , and with ----"
154 print "========================================================="
155 print "Number of pages to upgrade: %d" % len(pn1)
156 print ""
157 for pn in pn1:
158 page = Page(request,pn)
159 modPage = ModPage(request,page)
160 modPage.modText(insertRule=False)
161 modPage.saveText()
162 time.sleep(1)
163
164 if __name__ == '__main__':
165 main()
Discussion
The standard search engine (without Xapian) tolerated "," and also not having ---- preceding the category entries (as far as I remember). So, if that is intented -- no big deal.
Plan
- Priority:
- Assigned to:
- Status: what you found is the intended behaviour of categories, not a bug