def execute(macro, args, formatter=None): if not formatter: formatter = macro.formatter _ = macro.request.getText pagename = args or 'Fortune Cookies' page = Page(pagename, macro.request) raw = page.get_raw_body(fresh=macro.request.set_cache) if not macro.request.user.may.read(page): raw = "" # this selects lines looking like a list item # !!! TODO: make multi-line quotes possible # (optionally split by "----" or something) quotes = raw.splitlines() quotes = [quote.strip() for quote in quotes] quotes = [quote[2:] for quote in quotes if quote.startswith('* ')] if not quotes: return (macro.formatter.highlight(1) + _('No quotes on %(pagename)s.') % {'pagename': pagename} + macro.formatter.highlight(0)) quote = random.choice(quotes) if quote.lower().find("randomquote") == -1: quote = wikiutil.wikifyString(quote, macro.request, page, strong=True) quote = wikiutil.stripOuterParagraph(quote) return quote
def process(self): if not self.query: return # processes the search enquire = xapian.Enquire(self.text_database) enquire.set_query(self.query) t0 = time.time() matches = self._get_matchset(enquire, self.text_database, self.p_start_loc, self.num_results+1) self.estimated_results = matches.get_matches_estimated() t1 = time.time() for match in matches: id = match[xapian.MSET_DOCUMENT].get_value(0) wiki_name = self.request.config.wiki_name if config.wiki_farm: title, wiki_name = get_id(id) # xapian uses utf-8 title = title.decode('utf-8') wiki_name = wiki_name.decode('utf-8') else: title = get_id(id).decode('utf-8') page = Page(title, self.request, wiki_name=wiki_name) if not page.exists(): continue percentage = match[xapian.MSET_PERCENT] data = page.get_raw_body() search_item = searchResult(title, data, percentage, page.page_name, wiki_name) self.text_results.append(search_item) enquire = xapian.Enquire(self.title_database) enquire.set_query(self.query) matches = self._get_matchset(enquire, self.text_database, self.t_start_loc, self.num_results+1) self.estimated_results += matches.get_matches_estimated() for match in matches: id = match[xapian.MSET_DOCUMENT].get_value(0) wiki_name = self.request.config.wiki_name if config.wiki_farm: title, wiki_name = get_id(id) # xapian uses utf-8 title = title.decode('utf-8') wiki_name = wiki_name.decode('utf-8') else: title = get_id(id).decode('utf-8') page = Page(title, self.request, wiki_name=wiki_name) if not page.exists(): continue percentage = match[xapian.MSET_PERCENT] data = page.page_name search_item = searchResult(title, data, percentage, page.page_name, wiki_name) self.title_results.append(search_item)
def checkSpelling(page, request, own_form=1): """ Do spell checking, return a tuple with the result. """ _ = request.getText # first check to see if we we're called with a "newwords" parameter if request.form.has_key('button_newwords'): _addLocalWords(request) # load words wordsdict = _loadDict(request) localwords = {} lsw_page = Page(request.config.page_local_spelling_words, request) if lsw_page.exists(): _loadWordsString(request, localwords, lsw_page.get_raw_body()) # init status vars & load page badwords = {} text = page.get_raw_body() # checker regex and matching substitute function word_re = re.compile(r'([%s]?[%s]+)' % (config.upperletters, config.lowerletters)) def checkword(match, wordsdict=wordsdict, badwords=badwords, localwords=localwords, num_re=re.compile(r'^\d+$')): word = match.group(1) if len(word) == 1: return "" if not (wordsdict.has_key(word) or wordsdict.has_key(word.lower()) or localwords.has_key(word) or localwords.has_key(word.lower())): if not num_re.match(word): badwords[word] = 1 return "" # do the checking for line in text.encode('utf-8').split('\n'): if line == '' or line[0] == '#': continue word_re.sub(checkword, line) if badwords: badwords = badwords.keys() badwords.sort(lambda x, y: cmp(x.lower(), y.lower())) # build regex recognizing the bad words badwords_re = r'(^|(?<!\w))(%s)(?!\w)' badwords_re = badwords_re % ("|".join(map(re.escape, badwords)), ) # XXX UNICODE re.UNICODE !? badwords_re = re.compile(badwords_re) lsw_msg = '' if localwords: lsw_msg = ' ' + _('(including %(localwords)d %(pagelink)s)') % { 'localwords': len(localwords), 'pagelink': lsw_page.link_to() } msg = _('The following %(badwords)d words could not be found ' 'in the dictionary of ' '%(totalwords)d words%(localwords)s and are ' 'highlighted below:') % { 'badwords': len(badwords), 'totalwords': len(wordsdict) + len(localwords), 'localwords': lsw_msg } + "<br>" # figure out what this action is called action_name = os.path.splitext(os.path.basename(__file__))[0] # add a form containing the bad words if own_form: msg = msg + ('<form method="POST" action="%s">' '<input type="hidden" name="action" value="%s">' % ( page.url(request), action_name, )) checkbox = ('<input type="checkbox" name="newwords" ' 'value="%(word)s">%(word)s ') msg = msg + ( " ".join( map(lambda w, cb=checkbox: cb % { 'word': wikiutil.escape(w), }, badwords)) + '<p><input type="submit" name="button_newwords" value="%s"></p>' % _('Add checked words to dictionary')) if own_form: msg = msg + '</form>' else: badwords_re = None msg = _("No spelling errors found!") return badwords, badwords_re, msg
def sendEditor(self, **kw): """ Send the editor form page. @keyword preview: if given, show this text in preview mode @keyword staytop: don't go to #preview @keyword comment: comment field (when preview is true) @keyword had_conflict: we had an edit conflict on a save. """ import re try: from Sycamore.action import SpellCheck except ImportError: SpellCheck = None form = self.request.form _ = self._ self.request.http_headers([("Content-Type", "text/html; charset=%s" % config.charset)] + self.request.nocache) msg = None preview = kw.get('preview', None) emit_anchor = not kw.get('staytop', 0) proper_name = self.proper_name() from Sycamore.formatter.text_html import Formatter self.request.formatter = Formatter(self.request, store_pagelinks=1, preview=preview) base_uri = "%s/%s?action=edit" % (self.request.getScriptname(), wikiutil.quoteWikiname( self.proper_name())) backto = form.get('backto', [None])[0] if backto: base_uri += '&' + util.web.makeQueryString(backto=backto) # check edit permissions if not self.request.user.may.edit(self): msg = _('You are not allowed to edit this page.') elif self.prev_date: # Trying to edit an old version, this is not possible via # the web interface, but catch it just in case... msg = _('Cannot edit old revisions!') # Is the IP address a Tor exit note? if config.block_tor_edits: tor = torcheck.torcheck() if tor.query(self.request.remote_addr): msg = _('You are not allowed to edit this page, %s.' % self.request.remote_addr) # Test against a number of DNSBLs if config.block_dnsbl_edits: # Test: is this an IP address? re1='((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(?![\\d])' rg = re.compile(re1,re.IGNORECASE|re.DOTALL) m = rg.search(self.request.remote_addr) if m: # this is an IP address # reverse IP address octets dq = self.request.remote_addr.split('.') dq.reverse() for dnsbl in config.block_dnsbl_edits: querystring = '.'.join(dq) querystring += '.' + dnsbl + '.' try: result = socket.gethostbyname(querystring) except socket.gaierror: # probably nxdomain result = '0.0.0.0' if result.startswith('127.0.0'): # utoh msg = _('You are not allowed to edit this page: %s listed on %s' % (self.request.remote_addr, dnsbl)) # Did one of the prechecks fail? if msg and not kw.get('had_conflict', None): self.send_page(msg=msg) return # check for preview submit if preview is None: title = _('Edit "%(pagename)s"') else: title = _('Preview of "%(pagename)s"') self.set_raw_body(preview.replace("\r", ""), 1) page_needle = self.page_name if config.allow_subpages and page_needle.count('/'): page_needle = '/' + page_needle.split('/')[-1] wikiutil.send_title(self.request, self.proper_name(), pagename=self.proper_name(), has_link=True, strict_title='Editing "%s"' % self.proper_name(), body_onload = "sizeForIE('savetext', 100, 'editorComment', 99);" ) # start content div self.request.write('<div id="content" class="content">\n') # get request parameters text_rows = None if form.has_key('rows'): text_rows = int(form['rows'][0]) if self.request.user.valid: # possibly update user's pref if text_rows != self.request.user.edit_rows: self.request.user.edit_rows = text_rows self.request.user.save() else: text_rows = config.edit_rows if self.request.user.valid: text_rows = int(self.request.user.edit_rows) if form.has_key('cols'): text_cols = int(form['cols'][0]) if self.request.user.valid: # possibly update user's pref if text_rows != self.request.user.edit_rows: self.request.user.edit_rows = text_rows self.request.user.save() else: text_cols = 80 if self.request.user.valid: text_cols = int(self.request.user.edit_cols) # check datestamp (version) of the page our edit is based on if preview is not None: # propagate original datestamp mtime = float(form['datestamp'][0]) # did someone else change the page while we were editing? conflict_msg = None if not self.exists(): # page does not exist, are we creating it? if mtime: conflict_msg = _('<p>Someone else <b>deleted</b> this ' 'page while you were editing!') elif mtime != self.mtime(): conflict_msg = _('<p>Someone else changed this page while ' 'you were editing.') # merge conflicting versions allow_conflicts = 1 from Sycamore.util import diff3 savetext = self.get_raw_body() oldpg = Page(self.page_name, self.request, prev_date=mtime) original_text = oldpg.get_raw_body() saved_text = Page(self.page_name, self.request).get_raw_body() verynewtext, had_conflict = diff3.text_merge( original_text, saved_text, savetext, marker1='----- /!\ Edit conflict! Your version: -----\n', marker2='----- /!\ Edit conflict! Other version: -----\n', marker3='----- /!\ End of edit conflict -----\n') if had_conflict and self.request.user.valid and ( self.request.user.id == self.last_edit_info()[1]): # user pressed back button or did something weird conflict_msg =None elif had_conflict: conflict_msg = _(conflict_msg + 'There was an <b>edit conflict between ' 'your changes!</b></p>' '<p>Please review the conflicts and ' 'merge the changes.</p>') mtime = self.mtime() self.set_raw_body(verynewtext, 1) else: conflict_msg = _(conflict_msg + 'Your changes were sucessfully merged!') mtime = self.mtime() self.set_raw_body(verynewtext) if conflict_msg: self.request.write('<div id="message"><div>%s' '</div></div>'% conflict_msg) emit_anchor = 0 # make this msg visible! elif self.exists(): # datestamp of existing page mtime = self.mtime() else: # page creation mtime = 0 # output message message = kw.get('msg', '') if message: self.request.write('<div id="message">%s</div>' % (message)) # get the text body for the editor field if form.has_key('template'): # "template" parameter contains the name of the template page template_page = wikiutil.unquoteWikiname(form['template'][0]) raw_body = Page(template_page, self.request).get_raw_body() else: raw_body = self.get_raw_body() # send text above text area # button toolbar self.request.write('<div id="editArea">') self.request.write("<script type=\"text/javascript\">" "var buttonRoot = '%s';</script>" % ( os.path.join(config.url_prefix, self.request.theme.name, 'img', 'buttons'))) if self.request.user.name: if config.user_page_prefix: self.request.write("<script type=\"text/javascript\">" "var userPageLink = '[\"%s%s\"]';</script>" % ( config.user_page_prefix, self.request.user.propercased_name)) else: self.request.write("<script type=\"text/javascript\">" "var userPageLink = '[\"%s\"]';</script>" % ( config.user_page_prefix, self.request.user.propercased_name)) else: self.request.write("<script type=\"text/javascript\">" "var userPageLink = '%s';</script>" % ( self.request.remote_addr)) if config.wiki_farm: self.request.write("<script type=\"text/javascript\" " "src=\"http://%s%s%s/edit.js\"></script>\n" % ( config.wiki_base_domain, config.web_dir, config.url_prefix)) else: self.request.write("<script type=\"text/javascript\" " "src=\"%s%s/edit.js\"></script>\n" % ( config.web_dir, config.url_prefix)) # send form self.request.write('<form name="editform" id="editform" ' 'method="post" action="%s/%s#preview">' % ( self.request.getScriptname(), wikiutil.quoteWikiname(proper_name))) self.request.write(str(html.INPUT(type="hidden", name="action", value="savepage"))) if backto: self.request.write(str(html.INPUT(type="hidden", name="backto", value=backto))) # generate default content if not raw_body: if self.isTalkPage(): raw_body = _('This page is for discussing the ' 'contents of ["%s"].') % self.proper_name()[:-5] else: raw_body = _('Describe %s here.') % (self.proper_name(),) # replace CRLF with LF raw_body = self._normalize_text(raw_body) # send datestamp (version) of the page our edit is based on self.request.write('<input type="hidden" name="datestamp" ' 'value="%s">' % repr(mtime)) # Print the editor textarea and the save button self.request.write('<textarea id="savetext" name="savetext" ' 'rows="%d" cols="%d" style="width:100%%;">%s' '</textarea>' % (text_rows, text_cols, wikiutil.escape(raw_body))) # make sure we keep the template notice on a resize of the editor template_param = '' if form.has_key('template'): template_param = '&template=' + form['template'][0] # draw edit size links self.request.write(_('<div class="pageEditInfo" id="editorSize">' 'editor size:')) self.request.write('<a href="#" onclick="return sizeEditor(\'bigger\',' '\'%s&preview=1&cols=60%s\')">%s' '</a>' % (base_uri, template_param, '+')) self.request.write(',<a href="#" onclick="return sizeEditor(\'smaller\',' '\'%s&preview=1&cols=60%s\')">%s' '</a>' % (base_uri, template_param, '-')) self.request.write('</div>') self.request.write('</p>') # close textarea self.request.write('<div id="editComment" id="editorResizeButtons"> ' '%s<br><input type="text" class="formfields" ' 'name="comment" id="editorComment" value="%s" ' 'size="%d" maxlength="80" style="width:99%%;">' '</div>' % (_("<font size=\"+1\">Please comment " "about this change:</font>"), wikiutil.escape(kw.get('comment', ''), 1), text_cols)) spam_catch_button = ( '<span style="position: absolute; top: 0px; left: 0px;' 'height: 0px; width: 0px; overflow: hidden;">' 'dont enter into this box:' '<input type="text" name="text_dont"/>' '</span>' '<span style="position: absolute; top: 0px; left: 0px;' 'height: 0px; width: 0px; overflow: hidden;">' '<input class="formbutton" type="submit" name="button_dont" ' 'value="Dont press me">\n' '</span>') self.request.write(spam_catch_button) # button bar button_spellcheck = (SpellCheck and '<input type="submit" class="formbutton" name="button_spellcheck"' ' value="%s">' % _('Check Spelling')) or '' save_button_text = _('Save Changes') cancel_button_text = _('Cancel') self.request.write("</div>") if self.request.user.may.admin(self): security_button = ('<input type="button" class="formbutton" ' 'onClick="location.href=' '\'%s/%s?action=Security\'" ' 'value="Security">') % ( self.request.getScriptname(), wikiutil.quoteWikiname(proper_name)) else: security_button = '' if self.request.user.may.delete(self): delete_button = ('<input type="button" class="formbutton" ' 'onClick="location.href=' '\'%s/%s?action=DeletePage\'" value="Delete">') % ( self.request.getScriptname(), wikiutil.quoteWikiname(proper_name)) rename_button = ('<input type="button" class="formbutton" ' 'onClick="location.href=\'%s/%s?action=Rename\'"' ' value="Rename">') % ( self.request.getScriptname(), wikiutil.quoteWikiname(proper_name)) else: delete_button = '' rename_button = '' self.request.write('<div id="editButtonRow">' '<span>' '<input type="submit" class="formbutton" ' 'name="button_preview" value="%s"> ' '<input type="submit" class="formbutton" ' 'name="button_save" value="%s"> ' '<input type="submit" class="formbutton" ' 'name="button_cancel" value="%s"> ' '</span>' '<span class="editActions">' '<input type="button" class="formbutton" ' 'onClick="window.open(\'%s/%s?action=Files\', ' '\'files\', \'width=800,height=600,' 'scrollbars=1\')" value="Upload Files"> ' '%s ' '%s ' '%s ' '%s</span>' '</div>' % ( _('Preview'), save_button_text, cancel_button_text, self.request.getScriptname(), wikiutil.quoteWikiname(proper_name), button_spellcheck, delete_button, rename_button, security_button)) if self.request.config.edit_agreement_text: self.request.write(self.request.config.edit_agreement_text) badwords_re = None if preview is not None: if SpellCheck and ( form.has_key('button_spellcheck') or form.has_key('button_newwords')): badwords, badwords_re, msg = SpellCheck.checkSpelling(self, self.request, own_form=0) self.request.write("<p>%s</p>" % msg) self.request.write("</form>") if config.wiki_farm: from Sycamore import farm help_link = farm.link_to_page(farm.getBaseWikiName(), "Help with Editing", self.request.formatter, force_farm=True) else: help_link = Page("Help with Editing", self.request).link_to() # QuickHelp originally by Georg Mischler <*****@*****.**> self.request.write('<h2>Editing quick-help</h2>\n' '<dl><div style="float: right; margin: 10px; border: 1px solid; ' 'padding: 3pt;">See <b>%s</b> for more information.</div>' % ( help_link) + _("<dt>Emphasis:</dt>\n" "<dd>''<em>italics</em>''; '''<strong>bold</strong>''';" "'''''<strong><em>bold italics</em></strong>''''';" "''<em>mixed '''<strong>bold</strong>''' and " "italics</em>''; ---- horizontal rule.</dd>" "<dt>Headings:</dt>" "<dd>= Title 1 =; == Title 2 ==; === Title 3 ===;" "==== Title 4 ====; ===== Title 5 =====.</dd>" "<dt>Lists:</dt>" "<dd>space and one of * bullets; 1., a., A., i., I. " "numbered items;" " 1.#n start numbering at n; space alone indents.</dd>" "<dt>Links:</dt>" "<dd>[\"brackets and double quotes\"]; [\"the exact " "page name\" label];" " url; [url]; [url label].</dd>" "<dt>Tables:</dt>" "<dd>|| cell text |||| cell text spanning two columns ||;" " no trailing white space allowed after tables or titles." "</dd></dl>")) if preview is not None: if not emit_anchor: preview_name = "previewHide" else: preview_name = "preview" self.request.write('<div id="%s" class="preview">' % preview_name) self.send_page(content_only=1, hilite_re=badwords_re, preview=preview) self.request.write('</div>') self.request.write('</div>\n') # end content div wikiutil.send_after_content(self.request) self.request.theme.emit_custom_html(config.page_footer1) self.request.theme.emit_custom_html(config.page_footer2) self.request.write('</body></html>')
def process(self): # processes the search wiki_name = self.request.config.wiki_name if not self.wiki_global: wikis = [wiki_name] else: wikis = wikiutil.getWikiList(self.request) for wiki_name in wikis: pagelist = wikiutil.getPageList(self.request) matches = [] for pagename in pagelist: page = Page(pagename, self.request, wiki_name=wiki_name) text = page.get_raw_body() text_matches = find_num_matches(self.regexp, text) if text_matches: percentage = (text_matches*1.0/len(text.split()))*100 self.text_results.append(searchResult(page.page_name, text, percentage, page.page_name, wiki_name)) title = page.page_name title_matches = find_num_matches(self.regexp, title) if title_matches: percentage = (title_matches*1.0/len(title.split()))*100 self.title_results.append(searchResult(title, title, percentage, page.page_name, wiki_name)) # sort the title and text results by relevancy self.title_results.sort(lambda x,y: cmp(y.percentage, x.percentage)) self.text_results.sort(lambda x,y: cmp(y.percentage, x.percentage)) # normalize the percentages. # still gives shit, but what can you expect from regexp? # install xapian! if self.title_results: i = 0 max_title_percentage = self.title_results[0].percentage self.title_results = self.title_results[ self.t_start_loc:self.t_start_loc+self.num_results+1] for title in self.title_results: if i > self.num_results: break title.percentage = title.percentage/max_title_percentage title.percentage = title.percentage*100 i += 1 if self.text_results: i = 0 max_text_percentage = self.text_results[0].percentage self.text_results = self.text_results[ self.p_start_loc:self.p_start_loc+self.num_results+1] for text in self.text_results: if i > self.num_results: break text.percentage = text.percentage/max_text_percentage text.percentage = text.percentage*100 i += 1
def sendEditor(self, **kw): """ Send the editor form page. @keyword preview: if given, show this text in preview mode @keyword staytop: don't go to #preview @keyword comment: comment field (when preview is true) @keyword had_conflict: we had an edit conflict on a save. """ import re try: from Sycamore.action import SpellCheck except ImportError: SpellCheck = None form = self.request.form _ = self._ self.request.http_headers([("Content-Type", "text/html; charset=%s" % config.charset)] + self.request.nocache) msg = None preview = kw.get('preview', None) emit_anchor = not kw.get('staytop', 0) proper_name = self.proper_name() from Sycamore.formatter.text_html import Formatter self.request.formatter = Formatter(self.request, store_pagelinks=1, preview=preview) base_uri = "%s/%s?action=edit" % (self.request.getScriptname(), wikiutil.quoteWikiname( self.proper_name())) backto = form.get('backto', [None])[0] if backto: base_uri += '&' + util.web.makeQueryString(backto=backto) # check edit permissions if not self.request.user.may.edit(self): msg = _('You are not allowed to edit this page.') elif self.prev_date: # Trying to edit an old version, this is not possible via # the web interface, but catch it just in case... msg = _('Cannot edit old revisions!') # Did one of the prechecks fail? if msg and not kw.get('had_conflict', None): self.send_page(msg=msg) return # check for preview submit if preview is None: title = _('Edit "%(pagename)s"') else: title = _('Preview of "%(pagename)s"') self.set_raw_body(preview.replace("\r", ""), 1) page_needle = self.page_name if config.allow_subpages and page_needle.count('/'): page_needle = '/' + page_needle.split('/')[-1] wikiutil.send_title( self.request, self.proper_name(), pagename=self.proper_name(), has_link=True, strict_title='Editing "%s"' % self.proper_name(), body_onload="sizeForIE('savetext', 100, 'editorComment', 99);") # start content div self.request.write('<div id="content" class="content">\n') # get request parameters text_rows = None if form.has_key('rows'): text_rows = int(form['rows'][0]) if self.request.user.valid: # possibly update user's pref if text_rows != self.request.user.edit_rows: self.request.user.edit_rows = text_rows self.request.user.save() else: text_rows = config.edit_rows if self.request.user.valid: text_rows = int(self.request.user.edit_rows) if form.has_key('cols'): text_cols = int(form['cols'][0]) if self.request.user.valid: # possibly update user's pref if text_rows != self.request.user.edit_rows: self.request.user.edit_rows = text_rows self.request.user.save() else: text_cols = 80 if self.request.user.valid: text_cols = int(self.request.user.edit_cols) # check datestamp (version) of the page our edit is based on if preview is not None: # propagate original datestamp mtime = float(form['datestamp'][0]) # did someone else change the page while we were editing? conflict_msg = None if not self.exists(): # page does not exist, are we creating it? if mtime: conflict_msg = _('<p>Someone else <b>deleted</b> this ' 'page while you were editing!') elif mtime != self.mtime(): conflict_msg = _('<p>Someone else changed this page while ' 'you were editing.') # merge conflicting versions allow_conflicts = 1 from Sycamore.util import diff3 savetext = self.get_raw_body() oldpg = Page(self.page_name, self.request, prev_date=mtime) original_text = oldpg.get_raw_body() saved_text = Page(self.page_name, self.request).get_raw_body() verynewtext, had_conflict = diff3.text_merge( original_text, saved_text, savetext, marker1='----- /!\ Edit conflict! Your version: -----\n', marker2='----- /!\ Edit conflict! Other version: -----\n', marker3='----- /!\ End of edit conflict -----\n') if had_conflict and self.request.user.valid and ( self.request.user.id == self.last_edit_info()[1]): # user pressed back button or did something weird conflict_msg = None elif had_conflict: conflict_msg = _(conflict_msg + 'There was an <b>edit conflict between ' 'your changes!</b></p>' '<p>Please review the conflicts and ' 'merge the changes.</p>') mtime = self.mtime() self.set_raw_body(verynewtext, 1) else: conflict_msg = _(conflict_msg + 'Your changes were sucessfully merged!') mtime = self.mtime() self.set_raw_body(verynewtext) if conflict_msg: self.request.write('<div id="message"><div>%s' '</div></div>' % conflict_msg) emit_anchor = 0 # make this msg visible! elif self.exists(): # datestamp of existing page mtime = self.mtime() else: # page creation mtime = 0 # output message message = kw.get('msg', '') if message: self.request.write('<div id="message">%s</div>' % (message)) # get the text body for the editor field if form.has_key('template'): # "template" parameter contains the name of the template page template_page = wikiutil.unquoteWikiname(form['template'][0]) raw_body = Page(template_page, self.request).get_raw_body() else: raw_body = self.get_raw_body() # send text above text area # button toolbar self.request.write('<div id="editArea">') self.request.write( "<script type=\"text/javascript\">" "var buttonRoot = '%s';</script>" % (os.path.join( config.url_prefix, self.request.theme.name, 'img', 'buttons'))) if self.request.user.name: if config.user_page_prefix: self.request.write( "<script type=\"text/javascript\">" "var userPageLink = '[\"%s%s\"]';</script>" % (config.user_page_prefix, self.request.user.propercased_name)) else: self.request.write("<script type=\"text/javascript\">" "var userPageLink = '[\"%s\"]';</script>" % (config.user_page_prefix, self.request.user.propercased_name)) else: self.request.write("<script type=\"text/javascript\">" "var userPageLink = '%s';</script>" % (self.request.remote_addr)) if config.wiki_farm: self.request.write( "<script type=\"text/javascript\" " "src=\"http://%s%s%s/edit.js\"></script>\n" % (config.wiki_base_domain, config.web_dir, config.url_prefix)) else: self.request.write("<script type=\"text/javascript\" " "src=\"%s%s/edit.js\"></script>\n" % (config.web_dir, config.url_prefix)) # send form self.request.write('<form name="editform" id="editform" ' 'method="post" action="%s/%s#preview">' % (self.request.getScriptname(), wikiutil.quoteWikiname(proper_name))) self.request.write( str(html.INPUT(type="hidden", name="action", value="savepage"))) if backto: self.request.write( str(html.INPUT(type="hidden", name="backto", value=backto))) # generate default content if not raw_body: if self.isTalkPage(): raw_body = _('This page is for discussing the ' 'contents of ["%s"].') % self.proper_name()[:-5] else: raw_body = _('Describe %s here.') % (self.proper_name(), ) # replace CRLF with LF raw_body = self._normalize_text(raw_body) # send datestamp (version) of the page our edit is based on self.request.write('<input type="hidden" name="datestamp" ' 'value="%s">' % repr(mtime)) # Print the editor textarea and the save button self.request.write('<textarea id="savetext" name="savetext" ' 'rows="%d" cols="%d" style="width:100%%;">%s' '</textarea>' % (text_rows, text_cols, wikiutil.escape(raw_body))) # make sure we keep the template notice on a resize of the editor template_param = '' if form.has_key('template'): template_param = '&template=' + form['template'][0] # draw edit size links self.request.write( _('<div class="pageEditInfo" id="editorSize">' 'editor size:')) self.request.write('<a href="#" onclick="return sizeEditor(\'bigger\',' '\'%s&preview=1&cols=60%s\')">%s' '</a>' % (base_uri, template_param, '+')) self.request.write( ',<a href="#" onclick="return sizeEditor(\'smaller\',' '\'%s&preview=1&cols=60%s\')">%s' '</a>' % (base_uri, template_param, '-')) self.request.write('</div>') self.request.write('</p>') # close textarea self.request.write( '<div id="editComment" id="editorResizeButtons"> ' '%s<br><input type="text" class="formfields" ' 'name="comment" id="editorComment" value="%s" ' 'size="%d" maxlength="80" style="width:99%%;">' '</div>' % (_("<font size=\"+1\">Please comment " "about this change:</font>"), wikiutil.escape(kw.get('comment', ''), 1), text_cols)) spam_catch_button = ( '<span style="position: absolute; top: 0px; left: 0px;' 'height: 0px; width: 0px; overflow: hidden;">' 'dont enter into this box:' '<input type="text" name="text_dont"/>' '</span>' '<span style="position: absolute; top: 0px; left: 0px;' 'height: 0px; width: 0px; overflow: hidden;">' '<input class="formbutton" type="submit" name="button_dont" ' 'value="Dont press me">\n' '</span>') self.request.write(spam_catch_button) # button bar button_spellcheck = ( SpellCheck and '<input type="submit" class="formbutton" name="button_spellcheck"' ' value="%s">' % _('Check Spelling')) or '' save_button_text = _('Save Changes') cancel_button_text = _('Cancel') self.request.write("</div>") if self.request.user.may.admin(self): security_button = ('<input type="button" class="formbutton" ' 'onClick="location.href=' '\'%s/%s?action=Security\'" ' 'value="Security">') % ( self.request.getScriptname(), wikiutil.quoteWikiname(proper_name)) else: security_button = '' if self.request.user.may.delete(self): delete_button = ('<input type="button" class="formbutton" ' 'onClick="location.href=' '\'%s/%s?action=DeletePage\'" value="Delete">' ) % (self.request.getScriptname(), wikiutil.quoteWikiname(proper_name)) rename_button = ('<input type="button" class="formbutton" ' 'onClick="location.href=\'%s/%s?action=Rename\'"' ' value="Rename">') % (self.request.getScriptname( ), wikiutil.quoteWikiname(proper_name)) else: delete_button = '' rename_button = '' self.request.write( '<div id="editButtonRow">' '<span>' '<input type="submit" class="formbutton" ' 'name="button_preview" value="%s"> ' '<input type="submit" class="formbutton" ' 'name="button_save" value="%s"> ' '<input type="submit" class="formbutton" ' 'name="button_cancel" value="%s"> ' '</span>' '<span class="editActions">' '<input type="button" class="formbutton" ' 'onClick="window.open(\'%s/%s?action=Files\', ' '\'files\', \'width=800,height=600,' 'scrollbars=1\')" value="Upload Files"> ' '%s ' '%s ' '%s ' '%s</span>' '</div>' % (_('Preview'), save_button_text, cancel_button_text, self.request.getScriptname(), wikiutil.quoteWikiname(proper_name), button_spellcheck, delete_button, rename_button, security_button)) if self.request.config.edit_agreement_text: self.request.write(self.request.config.edit_agreement_text) badwords_re = None if preview is not None: if SpellCheck and (form.has_key('button_spellcheck') or form.has_key('button_newwords')): badwords, badwords_re, msg = SpellCheck.checkSpelling( self, self.request, own_form=0) self.request.write("<p>%s</p>" % msg) self.request.write("</form>") if config.wiki_farm: from Sycamore import farm help_link = farm.link_to_page(farm.getBaseWikiName(), "Help with Editing", self.request.formatter, force_farm=True) else: help_link = Page("Help with Editing", self.request).link_to() # QuickHelp originally by Georg Mischler <*****@*****.**> self.request.write( '<h2>Editing quick-help</h2>\n' '<dl><div style="float: right; margin: 10px; border: 1px solid; ' 'padding: 3pt;">See <b>%s</b> for more information.</div>' % (help_link) + _("<dt>Emphasis:</dt>\n" "<dd>''<em>italics</em>''; '''<strong>bold</strong>''';" "'''''<strong><em>bold italics</em></strong>''''';" "''<em>mixed '''<strong>bold</strong>''' and " "italics</em>''; ---- horizontal rule.</dd>" "<dt>Headings:</dt>" "<dd>= Title 1 =; == Title 2 ==; === Title 3 ===;" "==== Title 4 ====; ===== Title 5 =====.</dd>" "<dt>Lists:</dt>" "<dd>space and one of * bullets; 1., a., A., i., I. " "numbered items;" " 1.#n start numbering at n; space alone indents.</dd>" "<dt>Links:</dt>" "<dd>[\"brackets and double quotes\"]; [\"the exact " "page name\" label];" " url; [url]; [url label].</dd>" "<dt>Tables:</dt>" "<dd>|| cell text |||| cell text spanning two columns ||;" " no trailing white space allowed after tables or titles." "</dd></dl>")) if preview is not None: if not emit_anchor: preview_name = "previewHide" else: preview_name = "preview" self.request.write('<div id="%s" class="preview">' % preview_name) self.send_page(content_only=1, hilite_re=badwords_re, preview=preview) self.request.write('</div>') self.request.write('</div>\n') # end content div wikiutil.send_after_content(self.request) self.request.theme.emit_custom_html(config.page_footer1) self.request.theme.emit_custom_html(config.page_footer2) self.request.write('</body></html>')
def checkSpelling(page, request, own_form=1): """ Do spell checking, return a tuple with the result. """ _ = request.getText # first check to see if we we're called with a "newwords" parameter if request.form.has_key('button_newwords'): _addLocalWords(request) # load words wordsdict = _loadDict(request) localwords = {} lsw_page = Page(request.config.page_local_spelling_words, request) if lsw_page.exists(): _loadWordsString(request, localwords, lsw_page.get_raw_body()) # init status vars & load page badwords = {} text = page.get_raw_body() # checker regex and matching substitute function word_re = re.compile(r'([%s]?[%s]+)' % ( config.upperletters, config.lowerletters)) def checkword(match, wordsdict=wordsdict, badwords=badwords, localwords=localwords, num_re=re.compile(r'^\d+$')): word = match.group(1) if len(word) == 1: return "" if not (wordsdict.has_key(word) or wordsdict.has_key(word.lower()) or localwords.has_key(word) or localwords.has_key(word.lower()) ): if not num_re.match(word): badwords[word] = 1 return "" # do the checking for line in text.encode('utf-8').split('\n'): if line == '' or line[0] == '#': continue word_re.sub(checkword, line) if badwords: badwords = badwords.keys() badwords.sort(lambda x,y: cmp(x.lower(), y.lower())) # build regex recognizing the bad words badwords_re = r'(^|(?<!\w))(%s)(?!\w)' badwords_re = badwords_re % ("|".join(map(re.escape, badwords)),) # XXX UNICODE re.UNICODE !? badwords_re = re.compile(badwords_re) lsw_msg = '' if localwords: lsw_msg = ' ' + _('(including %(localwords)d %(pagelink)s)') % { 'localwords': len(localwords), 'pagelink': lsw_page.link_to()} msg = _('The following %(badwords)d words could not be found ' 'in the dictionary of ' '%(totalwords)d words%(localwords)s and are ' 'highlighted below:') % { 'badwords': len(badwords), 'totalwords': len(wordsdict)+len(localwords), 'localwords': lsw_msg} + "<br>" # figure out what this action is called action_name = os.path.splitext(os.path.basename(__file__))[0] # add a form containing the bad words if own_form: msg = msg + ( '<form method="POST" action="%s">' '<input type="hidden" name="action" value="%s">' % (page.url(request), action_name,)) checkbox = ('<input type="checkbox" name="newwords" ' 'value="%(word)s">%(word)s ') msg = msg + ( " ".join(map( lambda w, cb=checkbox: cb % {'word': wikiutil.escape(w),}, badwords)) + '<p><input type="submit" name="button_newwords" value="%s"></p>' % _('Add checked words to dictionary') ) if own_form: msg = msg + '</form>' else: badwords_re = None msg = _("No spelling errors found!") return badwords, badwords_re, msg
def execute(macro, args, formatter=None): if not formatter: if hasattr(macro.parser, 'formatter'): formatter = macro.parser.formatter else: formatter = macro.formatter _ = macro.request.getText inline_edit_state = formatter.inline_edit formatter.inline_edit = False # included page will already have paragraphs. no need to print another. macro.parser.inhibit_p = 1 if line_has_just_macro(macro, args, formatter): macro.parser.inhibit_br = 2 request = macro.request # parse and check arguments if not args: return (_sysmsg % ('error', _('You did not give a pagename of a page to ' 'include!'))) # prepare including page result = [] this_page = formatter.page # if we're in a paragraph, let's close it. if macro.formatter.in_p: result.append(macro.formatter.paragraph(0)) if not hasattr(this_page, '_macroInclude_pagelist'): this_page._macroInclude_pagelist = {} re_args = re.match('(' '(' '(?P<name1>.+?)(\s*,\s*)((".*")|(left|right)|([0-9]{1,2}%)))|' '(?P<name2>.+))', args) if not re_args: return (_sysmsg % ('error', _('Invalid arguments to Include.'))) have_more_args = re_args.group('name1') page_name = re_args.group('name1') or re_args.group('name2') if have_more_args: args = args[re_args.end('name1'):] else: args = '' re_args = re.search('"(?P<heading>.*)"', args) if re_args: heading = re_args.group('heading') else: heading = None if heading: before_heading = args[:re_args.start('heading')-1].strip() after_heading = args[re_args.end('heading')+1:].strip() args = before_heading + after_heading[1:] args_elements = args.split(',') align = None was_given_width = False width = '50%' for arg in args_elements: arg = arg.strip() if arg == 'left' or arg == 'right': align = arg elif arg.endswith('%'): try: arg = str(int(arg[:-1])) + '%' except: continue width = arg was_given_width = True inc_name = wikiutil.AbsPageName(this_page.page_name, page_name) inc_page = Page(inc_name, macro.request) if not macro.request.user.may.read(inc_page): return '' if this_page.page_name.lower() == inc_name.lower(): result.append('<p><strong class="error">' 'Recursive include of "%s" forbidden</strong></p>' % inc_name) return ''.join(result) # check for "from" and "to" arguments (allowing partial includes) body = inc_page.get_raw_body(fresh=True) + '\n' edit_icon = '' # do headings level = 1 if heading: result.append(formatter.heading(level, heading, action_link="edit", link_to_heading=True, pagename=inc_page.proper_name(), backto=this_page.page_name)) if this_page._macroInclude_pagelist.has_key(inc_name): if (this_page._macroInclude_pagelist[inc_name] > caching.MAX_DEPENDENCY_DEPTH): return '<em>Maximum include depth exceeded.</em>' # set or increment include marker this_page._macroInclude_pagelist[inc_name] = \ this_page._macroInclude_pagelist.get(inc_name, 0) + 1 # format the included page pi_format = config.default_markup or "wiki" Parser = wikiutil.importPlugin("parser", pi_format, "Parser") raw_text = inc_page.get_raw_body(fresh=True) formatter.setPage(inc_page) parser = Parser(raw_text, formatter.request) parser.print_first_p = 0 # don't print two <p>'s # note that our page now depends on the content of the included page if formatter.name == 'text_python': # this means we're in the caching formatter caching.dependency(this_page.page_name, inc_name.lower(), macro.request) # output formatted buffer = cStringIO.StringIO() formatter.request.redirect(buffer) parser.format(formatter, inline_edit_default_state=False) formatter.setPage(this_page) formatter.request.redirect() text = buffer.getvalue().decode('utf-8') buffer.close() result.append(text) # decrement or remove include marker if this_page._macroInclude_pagelist[inc_name] > 1: this_page._macroInclude_pagelist[inc_name] -= 1 else: del this_page._macroInclude_pagelist[inc_name] attrs = '' if align: attrs += (' style="width: %s; float: %s; clear: %s;" ' % (width, align, align)) elif was_given_width: attrs += ' style="width: %s;' % width attrs += ' class="includedPage"' include_page = '<div%s>%s</div>' % (attrs, ''.join(result)) ## turn back on inline editing ability parser.formatter.inline_edit = inline_edit_state formatter.inline_edit = inline_edit_state # return include text return include_page
def execute(macro, args, formatter=None): if not formatter: formatter = macro.formatter _ = macro.request.getText re_args = re.search('(?P<caption>.+)\,\s(?P<the_rest>.*)', args) pagename = re_args.group('caption') items = re_args.group('the_rest') page = Page(pagename, macro.request) try: links = max(int(items), 1) except StandardError: links = 1 raw = page.get_raw_body(fresh=macro.request.set_cache) if not macro.request.user.may.read(page): raw = "" # this selects lines looking like a list item # !!! TODO: make multi-line quotes possible # (optionally split by "----" or something) quotes = raw.splitlines() if links > 1: quotes = [quote for quote in quotes if quote.startswith(' *')] random.shuffle(quotes) while len(quotes) > links: quotes = quotes[:-1] quote = '' for name in quotes: quote = quote + name + '\n' page.set_raw_body(quote, 1) out = cStringIO.StringIO() macro.request.redirect(out) page.send_page(content_only=1, content_id="randomquote_%s" % wikiutil.quoteWikiname(page.page_name) ) quote = out.getvalue() macro.request.redirect() else: quotes = [quote.strip() for quote in quotes] quotes = [quote[2:] for quote in quotes if quote.startswith('* ')] if quotes: quote = random.choice(quotes) else: quote = '' page.set_raw_body(quote, 1) out = cStringIO.StringIO() macro.request.redirect(out) page.send_page(content_only=1, content_id="randomquote_%s" % wikiutil.quoteWikiname(page.page_name) ) quote = out.getvalue() macro.request.redirect() if not quotes: return (macro.formatter.highlight(1) + _('No quotes on %(pagename)s.') % {'pagename': pagename} + macro.formatter.highlight(0)) return quote.decode(config.charset)
group = wikiacl.Group(groupname, req) groupdict = get_group_members(groupname, req) group.update(groupdict) group.save() print " ", admin_group, "->", 'Admin' group = wikiacl.Group('Admin', req) groupdict = get_group_members(admin_group, req) group.update(groupdict) group.save() print " ", banned_group, "->", 'Banned' group = wikiacl.Group('Banned', req) groupdict = get_group_members(banned_group, req) group.update(groupdict) group.save() # note on group page that this is not how it's defined any more for groupname in defined_user_groups + [admin_group, banned_group]: p = Page(groupname, req) if p.exists(): new_body = p.get_raw_body() + '\n\n' + group_changed_message p.set_raw_body(new_body) req.cursor.execute("UPDATE curPages set text=%(new_body)s where name=%(pagename)s and wiki_id=%(wiki_id)s", {'new_body':new_body, 'pagename':p.page_name, 'wiki_id':req.config.wiki_id}, isWrite=True) req.cursor.execute("UPDATE allPages set text=%(new_body)s where name=%(pagename)s and editTime=%(mtime)s and wiki_id=%(wiki_id)s", {'new_body':new_body, 'pagename':p.page_name, 'mtime':p.mtime(), 'wiki_id':req.config.wiki_id}, isWrite=True) p.buildCache() req.db_disconnect() print "..Done!"