def username(self, d): """ Assemble the username / userprefs link @param d: parameter dictionary @rtype: string @return: username html """ from MoinMoin.Page import Page request = self.request _ = request.getText userlinks = [] # Add username/homepage link for registered users. We don't care # if it exists, the user can create it. if request.user.valid: homepage = Page(request, request.user.name) title = homepage.split_title(request) homelink = homepage.link_to(request, text=title) userlinks.append(homelink) # Set pref page to localized Preferences page prefpage = wikiutil.getSysPage(request, 'UserPreferences') title = prefpage.split_title(request) userlinks.append(prefpage.link_to(request, text=title)) else: # Add prefpage links with title: Login prefpage = wikiutil.getSysPage(request, 'UserPreferences') userlinks.append(prefpage.link_to(request, text=_("Login"))) html = '<ul id="username"><li>%s</li></ul>' % '</li>\n<li>'.join(userlinks) return html
def splitNavilink(self, text, localize=1): """ Split navibar links into pagename, link to page Admin or user might want to use shorter navibar items by using the [page title] or [url title] syntax. In this case, we don't use localization, and the links goes to page or to the url, not the localized version of page. @param text: the text used in config or user preferences @rtype: tuple @return: pagename or url, link to page or url """ request = self.request # Handle [pagename title] or [url title] formats if text.startswith('[') and text.endswith(']'): try: pagename, title = text[1:-1].strip().split(' ', 1) title = title.strip() except (ValueError, TypeError): # Just use the text as is. pagename = title = text # Handle [url title] format from MoinMoin import config for scheme in self.linkSchemas: if pagename.startswith(scheme): title = wikiutil.escape(title) link = '<a href="%s">%s</a>' % (pagename, title) break # Handle [pagename title] format else: # Normalize page names, replace '_' with ' '. Usually # all names use spaces internally, but for # [name_with_spaces label] we must save the underscores # until this point. pagename = request.normalizePagename(pagename) link = Page(request, pagename).link_to(request, title) # Handle regular pagename like "FrontPage" else: # Use localized pages for the current user if localize: page = wikiutil.getSysPage(request, text) else: page = Page(request, text) pagename = page.page_name title = page.split_title(request) title = self.shortenPagename(title) link = page.link_to(request, title) return pagename, link
def get_macro_help(request): """ Read help texts from SystemPage('HelpOnMacros')""" helppage = wikiutil.getSysPage(request, "HelpOnMacros") content = helppage.get_raw_body() macro_re = re.compile( r"\|\|(<.*?>)?\{\{\{\[\[" + r"(?P<prototype>(?P<macro>\w*).*)" + r"\]\]\}\}\}\s*\|\|" + r"\s*(?P<help>.*?)\s*\|\|\s*(?P<example>.*?)\s*\|\|$", re.U + re.M) help = {} for match in macro_re.finditer(content): help[match.group('macro')] = match return help
def mailAccountData(self, cleartext_passwd=None): from MoinMoin.util import mail from MoinMoin.wikiutil import getSysPage _ = self._request.getText if not self.enc_password: # generate pw if there is none yet from random import randint import base64 charset = 'utf-8' pwd = "%s%d" % (str(time.time()), randint(0, 65535)) pwd = pwd.encode(charset) pwd = sha.new(pwd).digest() pwd = '{SHA}%s' % base64.encodestring(pwd).rstrip() self.enc_password = pwd self.save() text = '\n' + _("""\ Login Name: %s Login Password: %s Login URL: %s/%s?action=login """, formatted=False) % ( self.name, self.enc_password, self._request.getBaseURL(), getSysPage(self._request, 'UserPreferences').page_name) text = _("""\ Somebody has requested to submit your account data to this email address. If you lost your password, please use the data below and just enter the password AS SHOWN into the wiki's password form field (use copy and paste for that). After successfully logging in, it is of course a good idea to set a new and known password. """, formatted=False) + text subject = _('[%(sitename)s] Your wiki account data', formatted=False) % {'sitename': self._cfg.sitename or "Wiki"} mailok, msg = mail.sendmail(self._request, [self.email], subject, text, mail_from=self._cfg.mail_from) return msg
def username(self, d): """ Assemble the username / userprefs link @param d: parameter dictionary @rtype: unicode @return: username html """ request = self.request _ = request.getText userlinks = [] # Add username/homepage link for registered users. We don't care # if it exists, the user can create it. if request.user.valid and request.user.name: interwiki = wikiutil.getInterwikiHomePage(request) name = request.user.name aliasname = request.user.aliasname if not aliasname: aliasname = name title = "%s @ %s" % (aliasname, interwiki[0]) # link to (interwiki) user homepage homelink = (request.formatter.interwikilink(1, title=title, id="userhome", generated=True, *interwiki) + request.formatter.text(name) + request.formatter.interwikilink(0, title=title, id="userhome", *interwiki)) userlinks.append(homelink) # link to userprefs action prefpage = wikiutil.getSysPage(request, 'UserPreferences') userlinks.append(prefpage.link_to(request, text=_('Preferences', formatted=False), querystr={'action': 'userprefs'}, id="userprefs")) if request.cfg.show_login: if request.user.valid: userlinks.append(d['page'].link_to(request, text=_('Logout', formatted=False), querystr={'action': 'logout', 'logout': 'logout'}, id="logout")) else: userlinks.append(d['page'].link_to(request, text=_("Login", formatted=False), querystr={'action': 'login'}, id="login")) userlinks = [u'<li>%s</li>' % link for link in userlinks] html = u'<ul id="username">%s</ul>' % ''.join(userlinks) return html
def splitNavilink(self, text, localize=1): """ Split navibar links into pagename, link to page Changed: name attrib added for accesskeys """ request = self.request # Handle [pagename title] or [url title] formats if text.startswith('[') and text.endswith(']'): try: pagename, title = text[1:-1].strip().split(' ', 1) title = title.strip() localize = 0 except (ValueError, TypeError): # Just use the text as is. pagename = title = text # Handle regular pagename like "FrontPage" else: # Use localized pages for the current user if localize: # Try..except for backwards compatibility of Moin versions only try: page = wikiutil.getSysPage(request, text) except: page = wikiutil.getLocalizedPage(request, text) else: page = Page(request, text) pagename = page.page_name # Try..except for backwards compatibility of Moin versions only try: title = page.split_title() except: title = page.split_title(request) title = self.shortenPagename(title) link = page.link_to(request, title, name=title) from MoinMoin import config for scheme in config.url_schemas: if pagename.startswith(scheme): title = wikiutil.escape(title) link = self.request.formatter.url(1, pagename, name=title) + \ self.request.formatter.text(title) +\ self.request.formatter.url(0) return pagename, link # remove wiki: url prefix if pagename.startswith("wiki:"): pagename = pagename[5:] # try handling interwiki links try: interwiki, page = pagename.split(':', 1) thiswiki = request.cfg.interwikiname if interwiki == thiswiki: pagename = page title = page else: return (pagename, self.request.formatter.interwikilink(True, interwiki, page, name=page) + page + self.request.formatter.interwikilink(False, interwiki, page) ) except ValueError: pass pagename = request.normalizePagename(pagename) link = Page(request, pagename).link_to(request, title, name=title) return pagename, link
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) """ from MoinMoin import i18n try: from MoinMoin.action import SpellCheck except ImportError: SpellCheck = None request = self.request form = self.request.form _ = self._ self.request.disableHttpCaching(level=2) self.request.http_headers() raw_body = '' msg = None conflict_msg = None edit_lock_message = None preview = kw.get('preview', None) staytop = kw.get('staytop', 0) # check edit permissions if not self.request.user.may.write(self.page_name): msg = _('You are not allowed to edit this page.') elif not self.isWritable(): msg = _('Page is immutable!') elif self.rev: # 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!') else: # try to acquire edit lock ok, edit_lock_message = self.lock.acquire() if not ok: # failed to get the lock if preview is not None: edit_lock_message = _('The lock you held timed out. Be prepared for editing conflicts!' ) + "<br>" + edit_lock_message else: msg = edit_lock_message # Did one of the prechecks fail? if msg: self.send_page(self.request, 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, modified=1) # send header stuff lock_timeout = self.lock.timeout / 60 lock_page = wikiutil.escape(self.page_name, quote=1) lock_expire = _("Your edit lock on %(lock_page)s has expired!") % {'lock_page': lock_page} lock_mins = _("Your edit lock on %(lock_page)s will expire in # minutes.") % {'lock_page': lock_page} lock_secs = _("Your edit lock on %(lock_page)s will expire in # seconds.") % {'lock_page': lock_page} # get request parameters try: text_rows = int(form['rows'][0]) except StandardError: text_rows = self.cfg.edit_rows if self.request.user.valid: text_rows = int(self.request.user.edit_rows) if preview is not None: # Propagate original revision rev = int(form['rev'][0]) # Check for editing conflicts if not self.exists(): # page does not exist, are we creating it? if rev: conflict_msg = _('Someone else deleted this page while you were editing!') elif rev != self.current_rev(): conflict_msg = _('Someone else changed this page while you were editing!') if self.mergeEditConflict(rev): conflict_msg = _("""Someone else saved this page while you were editing! Please review the page and save then. Do not save this page as it is! Have a look at the diff of %(difflink)s to see what has been changed.""") % { 'difflink': self.link_to(self.request, querystr='action=diff&rev=%d' % rev) } rev = self.current_rev() if conflict_msg: # We don't show preview when in conflict preview = None elif self.exists(): # revision of existing page rev = self.current_rev() else: # page creation rev = 0 # Page editing is done using user language self.request.setContentLanguage(self.request.lang) # Setup status message status = [kw.get('msg', ''), conflict_msg, edit_lock_message] status = [msg for msg in status if msg] status = ' '.join(status) status = Status(self.request, content=status) wikiutil.send_title(self.request, title % {'pagename': self.split_title(self.request),}, page=self, pagename=self.page_name, msg=status, html_head=self.lock.locktype and ( PageEditor._countdown_js % { 'countdown_script': self.request.theme.externalScript('countdown'), 'lock_timeout': lock_timeout, 'lock_expire': lock_expire, 'lock_mins': lock_mins, 'lock_secs': lock_secs, }) or '', editor_mode=1, ) self.request.write(self.request.formatter.startContent("content")) # Get the text body for the editor field. # TODO: what about deleted pages? show the text of the last revision or use the template? if preview is not None: raw_body = self.get_raw_body() elif self.exists(): # If the page exists, we get the text from the page. # TODO: maybe warn if template argument was ignored because the page exists? raw_body = self.get_raw_body() elif form.has_key('template'): # If the page does not exists, we try to get the content from the template parameter. template_page = wikiutil.unquoteWikiname(form['template'][0]) if self.request.user.may.read(template_page): raw_body = Page(self.request, template_page).get_raw_body() if raw_body: self.request.write(_("[Content of new page loaded from %s]") % (template_page,), '<br>') else: self.request.write(_("[Template %s not found]") % (template_page,), '<br>') else: self.request.write(_("[You may not read %s]") % (template_page,), '<br>') # Make backup on previews - but not for new empty pages if preview and raw_body: self._make_backup(raw_body) # Generate default content for new pages if not raw_body: raw_body = _('Describe %s here.') % (self.page_name,) # send form self.request.write('<form id="editor" method="post" action="%s/%s#preview">' % ( self.request.getScriptname(), wikiutil.quoteWikinameURL(self.page_name), )) # yet another weird workaround for broken IE6 (it expands the text # editor area to the right after you begin to type...). IE sucks... # http://fplanque.net/2003/Articles/iecsstextarea/ self.request.write('<fieldset style="border:none;padding:0;">') self.request.write(unicode(html.INPUT(type="hidden", name="action", value="edit"))) # Send revision of the page our edit is based on self.request.write('<input type="hidden" name="rev" value="%d">' % (rev,)) # Create and send a ticket, so we can check the POST self.request.write('<input type="hidden" name="ticket" value="%s">' % wikiutil.createTicket(self.request)) # Save backto in a hidden input backto = form.get('backto', [None])[0] if backto: self.request.write(unicode(html.INPUT(type="hidden", name="backto", value=backto))) # button bar button_spellcheck = (SpellCheck and '<input class="button" type="submit" name="button_spellcheck" value="%s">' % _('Check Spelling')) or '' save_button_text = _('Save Changes') cancel_button_text = _('Cancel') if self.cfg.page_license_enabled: self.request.write('<p><em>', _( """By hitting '''%(save_button_text)s''' you put your changes under the %(license_link)s. If you don't want that, hit '''%(cancel_button_text)s''' to cancel your changes.""") % { 'save_button_text': save_button_text, 'cancel_button_text': cancel_button_text, 'license_link': wikiutil.getSysPage(self.request, self.cfg.page_license_page).link_to(self.request), }, '</em></p>') self.request.write(''' <input class="button" type="submit" name="button_save" value="%s"> <input class="button" type="submit" name="button_preview" value="%s"> <input class="button" type="submit" name="button_switch" value="%s"> %s <input class="button" type="submit" name="button_cancel" value="%s"> <input type="hidden" name="editor" value="gui"> ''' % (save_button_text, _('Preview'), _('Text mode'), button_spellcheck, cancel_button_text,)) self.sendconfirmleaving() # TODO update state of flgChange to make this work, see PageEditor # Add textarea with page text # TODO: currently self.language is None at this point. We have # to do processing instructions parsing earlier, or move page # language into meta file. lang = self.language or self.request.cfg.language_default contentlangdirection = i18n.getDirection(lang) # 'ltr' or 'rtl' uilanguage = self.request.lang url_prefix = self.request.cfg.url_prefix wikipage = wikiutil.quoteWikinameURL(self.page_name) fckbasepath = url_prefix + '/applets/FCKeditor' wikiurl = request.getScriptname() if not wikiurl or wikiurl[-1] != '/': wikiurl += '/' themepath = '%s/%s' % (url_prefix, self.request.theme.name) smileypath = themepath + '/img' # auto-generating a list for SmileyImages does NOT work from here! editor_size = int(request.user.edit_rows) * 22 # 22 height_pixels/line word_rule = self.word_rule() self.request.write(""" <script type="text/javascript" src="%(fckbasepath)s/fckeditor.js"></script> <script type="text/javascript"> <!-- var oFCKeditor = new FCKeditor( 'savetext', '100%%', %(editor_size)s, 'MoinDefault' ) ; oFCKeditor.BasePath= '%(fckbasepath)s/' ; oFCKeditor.Config['WikiBasePath'] = '%(wikiurl)s' ; oFCKeditor.Config['WikiPage'] = '%(wikipage)s' ; oFCKeditor.Config['PluginsPath'] = '%(url_prefix)s/applets/moinFCKplugins/' ; oFCKeditor.Config['CustomConfigurationsPath'] = '%(url_prefix)s/applets/moinfckconfig.js' ; oFCKeditor.Config['WordRule'] = %(word_rule)s ; oFCKeditor.Config['SmileyPath'] = '%(smileypath)s/' ; oFCKeditor.Config['EditorAreaCSS'] = '%(themepath)s/css/common.css' ; oFCKeditor.Config['SkinPath'] = '%(fckbasepath)s/editor/skins/silver/' ; oFCKeditor.Config['AutoDetectLanguage'] = false ; oFCKeditor.Config['DefaultLanguage'] = '%(uilanguage)s' ; oFCKeditor.Config['ContentLangDirection'] = '%(contentlangdirection)s' ; oFCKeditor.Value= """ % locals()) from MoinMoin.formatter.text_gedit import Formatter self.formatter = Formatter(request) self.formatter.page = self output = request.redirectedOutput(self.send_page_content, request, Parser, raw_body, do_cache=False) output = repr(output) if output[0] == 'u': output = output[1:] request.write(output) self.request.write(""" ; oFCKeditor.Create() ; //--> </script> """) self.request.write("<p>") self.request.write(_("Comment:"), ' <input id="editor-comment" type="text" name="comment" value="%s" maxlength="200">' % ( wikiutil.escape(kw.get('comment', ''), 1), )) self.request.write("</p>") # Category selection filter = re.compile(self.cfg.page_category_regex, re.UNICODE).search cat_pages = self.request.rootpage.getPageList(filter=filter) cat_pages.sort() cat_pages = [wikiutil.pagelinkmarkup(p) for p in cat_pages] cat_pages.insert(0, ('', _('<No addition>', formatted=False))) self.request.write("<p>") self.request.write(_('Add to: %(category)s') % { 'category': unicode(util.web.makeSelection('category', cat_pages)), }) if self.cfg.mail_enabled: self.request.write(''' <input type="checkbox" name="trivial" id="chktrivial" value="1" %(checked)s> <label for="chktrivial">%(label)s</label> ''' % { 'checked': ('', 'checked')[form.get('trivial',['0'])[0] == '1'], 'label': _("Trivial change"), }) self.request.write(''' <input type="checkbox" name="rstrip" id="chkrstrip" value="1" %(checked)s> <label for="chkrstrip">%(label)s</label> </p> ''' % { 'checked': ('', 'checked')[form.get('rstrip',['0'])[0] == '1'], 'label': _('Remove trailing whitespace from each line') }) self.request.write("</p>") 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('</fieldset>') self.request.write("</form>") if preview is not None: if staytop: content_id = 'previewbelow' else: content_id = 'preview' self.send_page(self.request, content_id=content_id, content_only=1, hilite_re=badwords_re) self.request.write(self.request.formatter.endContent()) # end content div wikiutil.send_footer(self.request, self.page_name)
def mainloop(self): """ moin-dump's main code. """ if len(sys.argv) == 1: self.parser.print_help() sys.exit(1) # Prepare output directory outputdir = self.args[0] outputdir = os.path.abspath(outputdir) if not os.path.isdir(outputdir): try: os.mkdir(outputdir) _util.log("Created output directory '%s'!" % outputdir) except OSError: _util.fatal("Cannot create output directory '%s'!" % outputdir) # Load the configuration configdir = self.options.configdir if configdir: if os.path.isfile(configdir): configdir = os.path.dirname(configdir) if not os.path.isdir(configdir): _util.fatal("Bad path given to --config parameter") configdir = os.path.abspath(configdir) sys.path[0:0] = [configdir] os.chdir(configdir) # Dump the wiki request = RequestCLI(self.options.wiki_url) request.form = request.args = request.setup_args() # fix url_prefix so we get relative paths in output html request.cfg.url_prefix = url_prefix if self.options.page: pages = [self.options.page] else: # Get all existing pages in the wiki pages = list(request.rootpage.getPageList(user="")) pages.sort() wikiutil.quoteWikinameURL = lambda pagename, qfn=wikiutil.quoteWikinameFS: (qfn(pagename) + HTML_SUFFIX) errfile = os.path.join(outputdir, "error.log") errlog = open(errfile, "w") errcnt = 0 page_front_page = wikiutil.getSysPage(request, "FrontPage").page_name page_title_index = wikiutil.getSysPage(request, "TitleIndex").page_name page_word_index = wikiutil.getSysPage(request, "WordIndex").page_name navibar_html = "" for p in [page_front_page, page_title_index, page_word_index]: navibar_html += ' [<a href="%s">%s</a>]' % (wikiutil.quoteWikinameFS(p), wikiutil.escape(p)) for pagename in pages: file = wikiutil.quoteWikinameURL(pagename) # we have the same name in URL and FS _util.log('Writing "%s"...' % file) try: pagehtml = "" page = Page.Page(request, pagename) try: request.reset() out = StringIO.StringIO() request.redirect(out) page.send_page(request, count_hit=0, content_only=1) pagehtml = out.getvalue() request.redirect() except: errcnt = errcnt + 1 print >>sys.stderr, "*** Caught exception while writing page!" print >> errlog, "~" * 78 print >> errlog, file # page filename import traceback traceback.print_exc(None, errlog) finally: timestamp = time.strftime("%Y-%m-%d %H:%M") filepath = os.path.join(outputdir, file) fileout = codecs.open(filepath, "w", config.charset) fileout.write( page_template % { "charset": config.charset, "pagename": pagename, "pagehtml": pagehtml, "logo_html": logo_html, "navibar_html": navibar_html, "timestamp": timestamp, "theme": request.cfg.theme_default, } ) fileout.close() # copy FrontPage to "index.html" indexpage = page_front_page if self.options.page: indexpage = self.options.page shutil.copyfile( os.path.join(outputdir, wikiutil.quoteWikinameFS(indexpage) + HTML_SUFFIX), os.path.join(outputdir, "index" + HTML_SUFFIX), ) errlog.close() if errcnt: print >>sys.stderr, "*** %d error(s) occurred, see '%s'!" % (errcnt, errfile)
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) """ from MoinMoin import i18n try: from MoinMoin.action import SpellCheck except ImportError: SpellCheck = None form = self.request.form _ = self._ self.request.http_headers(self.request.nocache) msg = None conflict_msg = None edit_lock_message = None preview = kw.get('preview', None) emit_anchor = not kw.get('staytop', 0) from MoinMoin.formatter.text_html import Formatter self.request.formatter = Formatter(self.request, store_pagelinks=1) # check edit permissions if not self.request.user.may.write(self.page_name): msg = _('You are not allowed to edit this page.') elif not self.isWritable(): msg = _('Page is immutable!') elif self.rev: # 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!') else: # try to acquire edit lock ok, edit_lock_message = self.lock.aquire() if not ok: # failed to get the lock if preview is not None: edit_lock_message = _('The lock you held timed out, be prepared for editing conflicts!' ) + "<br>" + edit_lock_message else: msg = edit_lock_message # Did one of the prechecks fail? if msg: self.send_page(self.request, 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, modified=1) # send header stuff lock_timeout = self.lock.timeout / 60 lock_page = wikiutil.escape(self.page_name, quote=1) lock_expire = _("Your edit lock on %(lock_page)s has expired!") % {'lock_page': lock_page} lock_mins = _("Your edit lock on %(lock_page)s will expire in # minutes.") % {'lock_page': lock_page} lock_secs = _("Your edit lock on %(lock_page)s will expire in # seconds.") % {'lock_page': lock_page} # get request parameters try: text_rows = int(form['rows'][0]) except StandardError: text_rows = self.cfg.edit_rows if self.request.user.valid: text_rows = int(self.request.user.edit_rows) if preview is not None: # Propagate original revision rev = int(form['rev'][0]) # Check for editing conflicts if not self.exists(): # page does not exist, are we creating it? if rev: conflict_msg = _('Someone else deleted this page while you were editing!') elif rev != self.current_rev(): conflict_msg = _('Someone else changed this page while you were editing!') if self.mergeEditConflict(rev): conflict_msg = _("""Someone else saved this page while you were editing! Please review the page and save then. Do not save this page as it is! Have a look at the diff of %(difflink)s to see what has been changed.""") % { 'difflink': self.link_to(self.request, querystr='action=diff&rev=%d' % rev) } rev = self.current_rev() if conflict_msg: # We don't show preview when in conflict preview = None elif self.exists(): # revision of existing page rev = self.current_rev() else: # page creation rev = 0 # Page editing is done using user language self.request.setContentLanguage(self.request.lang) # Setup status message status = [kw.get('msg', ''), conflict_msg, edit_lock_message] status = [msg for msg in status if msg] status = ' '.join(status) status = Status(self.request, content=status) wikiutil.send_title(self.request, title % {'pagename': self.split_title(self.request),}, page=self, pagename=self.page_name, msg=status, body_onload=self.lock.locktype and 'countdown()' or '', # broken / bug in Mozilla 1.5, when using #preview html_head=self.lock.locktype and ( _countdown_js % { 'lock_timeout': lock_timeout, 'lock_expire': lock_expire, 'lock_mins': lock_mins, 'lock_secs': lock_secs, }) or '' ) self.request.write(self.request.formatter.startContent("content")) # 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]) if self.request.user.may.read(template_page): raw_body = Page(self.request, template_page).get_raw_body() if raw_body: self.request.write(_("[Content of new page loaded from %s]") % (template_page,), '<br>') else: self.request.write(_("[Template %s not found]") % (template_page,), '<br>') else: raw_body = '' self.request.write(_("[You may not read %s]") % (template_page,), '<br>') else: raw_body = self.get_raw_body() # send text above text area template_param = '' if form.has_key('template'): template_param = '&template=' + form['template'][0] self.request.write('<p>') self.request.write(wikiutil.getSysPage(self.request, 'HelpOnFormatting').link_to(self.request)) self.request.write(" | ", wikiutil.getSysPage(self.request, 'InterWiki').link_to(self.request)) if preview is not None and emit_anchor: self.request.write(' | <a href="#preview">%s</a>' % _('Skip to preview')) self.request.write(' ') self.request.write(_('[current page size \'\'\'%(size)d\'\'\' bytes]') % {'size': self.size()}) self.request.write('</p>') # send form self.request.write('<form id="editor" method="post" action="%s/%s#preview">' % ( self.request.getScriptname(), wikiutil.quoteWikinameURL(self.page_name), )) # yet another weird workaround for broken IE6 (it expands the text # editor area to the right after you begin to type...). IE sucks... # http://fplanque.net/2003/Articles/iecsstextarea/ self.request.write('<fieldset style="border:none;padding:0;">') self.request.write('<p>') self.request.write(unicode(html.INPUT(type="hidden", name="action", value="savepage"))) # Save backto in a hidden input backto = form.get('backto', [None])[0] if backto: self.request.write(unicode(html.INPUT(type="hidden", name="backto", value=backto))) # Make backup on previews - but not for new empty pages if preview and raw_body: self._make_backup(raw_body) # Generate default content for new pages if not raw_body: raw_body = _('Describe %s here.') % (self.page_name,) # Send revision of the page our edit is based on self.request.write('<input type="hidden" name="rev" value="%d">' % (rev,)) # Add textarea with page text # TODO: currently self.language is None at this point. We have # to do processing instructions parsing earlier, or move page # language into meta file. lang = self.language or self.request.cfg.default_lang self.request.write( u'<textarea id="editor-textarea" name="savetext" lang="%(lang)s" dir="%(dir)s"' u' rows="%(rows)d">' % { 'lang': lang, 'dir': i18n.getDirection(lang), 'rows': text_rows, } ) self.request.write(wikiutil.escape(raw_body)) self.request.write(u'</textarea>') self.request.write('</p>') self.request.write("<p>", _("Optional comment about this change"), '<br><input id="editor-comment" type="text" name="comment" value="%s" maxlength="80"></p>' % ( wikiutil.escape(kw.get('comment', ''), 1), )) # Category selection filter = re.compile(self.cfg.page_category_regex, re.UNICODE).search cat_pages = self.request.rootpage.getPageList(filter=filter) cat_pages.sort() cat_pages = [wikiutil.pagelinkmarkup(p) for p in cat_pages] cat_pages.insert(0, ('', _('<No addition>', formatted=False))) self.request.write("<p>", _('Make this page belong to category %(category)s') % { 'category': unicode(util.web.makeSelection('category', cat_pages)), }) # button bar button_spellcheck = (SpellCheck and '<input type="submit" name="button_spellcheck" value="%s">' % _('Check Spelling')) or '' save_button_text = _('Save Changes') cancel_button_text = _('Cancel') self.request.write("</p>") if self.cfg.page_license_enabled: self.request.write('<p><em>', _( """By hitting '''%(save_button_text)s''' you put your changes under the %(license_link)s. If you don't want that, hit '''%(cancel_button_text)s''' to cancel your changes.""") % { 'save_button_text': save_button_text, 'cancel_button_text': cancel_button_text, 'license_link': wikiutil.getSysPage(self.request, self.cfg.page_license_page).link_to(self.request), }, '</em></p>') self.request.write(''' <p> <input type="submit" name="button_save" value="%s"> <input type="submit" name="button_preview" value="%s"> %s <input type="submit" name="button_cancel" value="%s"> </p> <p> ''' % (save_button_text, _('Preview'), button_spellcheck, cancel_button_text,)) if self.cfg.mail_smarthost: self.request.write(''' <input type="checkbox" name="trivial" value="1" %(checked)s> <label>%(label)s</label> ''' % { 'checked': ('', 'checked')[form.get('trivial',['0'])[0] == '1'], 'label': _("Trivial change"), }) self.request.write(''' <input type="checkbox" name="rstrip" value="1" %(checked)s> <label>%(label)s</label> </p> ''' % { 'checked': ('', 'checked')[form.get('rstrip',['0'])[0] == '1'], 'label': _('Remove trailing whitespace from each line') }) 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('</fieldset>') self.request.write("</form>") # QuickHelp originally by Georg Mischler <*****@*****.**> self.request.write('<hr>\n<dl>' + _(""" Emphasis:: [[Verbatim('')]]''italics''[[Verbatim('')]]; [[Verbatim(''')]]'''bold'''[[Verbatim(''')]]; [[Verbatim(''''')]]'''''bold italics'''''[[Verbatim(''''')]]; [[Verbatim('')]]''mixed ''[[Verbatim(''')]]'''''bold'''[[Verbatim(''')]] and italics''[[Verbatim('')]]; [[Verbatim(----)]] horizontal rule. Headings:: [[Verbatim(=)]] Title 1 [[Verbatim(=)]]; [[Verbatim(==)]] Title 2 [[Verbatim(==)]]; [[Verbatim(===)]] Title 3 [[Verbatim(===)]]; [[Verbatim(====)]] Title 4 [[Verbatim(====)]]; [[Verbatim(=====)]] Title 5 [[Verbatim(=====)]]. Lists:: space and one of: * bullets; 1., a., A., i., I. numbered items; 1.#n start numbering at n; space alone indents. Links:: [[Verbatim(JoinCapitalizedWords)]]; [[Verbatim(["brackets and double quotes"])]]; url; [url]; [url label]. Tables:: || cell text |||| cell text spanning 2 columns ||; no trailing white space allowed after tables or titles.""") + '</dl>') if preview is not None: self.send_page(self.request, content_id='preview', content_only=1, hilite_re=badwords_re) self.request.write(self.request.formatter.endContent()) # end content div self.request.theme.emit_custom_html(self.cfg.page_footer1) self.request.theme.emit_custom_html(self.cfg.page_footer2)