r610 - / zope-zwiki zope-zwiki/branches zope-zwiki/branches/upstream zope-zwiki/branches/upstream/current zope-zwiki/branches/upstream/current/Extensions zope-zwiki/branches/upstream/current/i18n zope-zwiki/branches/upstream/current/pagetypes zope-zwiki/branches/upstream/current/plugins zope-zwiki/branches/upstream/current/plugins/latexwiki zope-zwiki/branches/upstream/current/plugins/latexwiki/Extensions zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki zope-zwiki/branches/upstream/current/plugins/mathaction zope-zwiki/branches/upstream/current/plugins/mathaction/Extensions zope-zwiki/branches/upstream/current/plugins/mathaction/wikis zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction zope-zwiki/branches/upstream/current/plugins/rating zope-zwiki/branches/upstream/current/plugins/tracker zope-zwiki/branches/upstream/current/scripts zope-zwiki/branches/upstream/current/skins zope-zwiki/branches/upstream/current/skins/zwiki zope-zwiki/branches/upstream/current/tools zope-zwiki/branches/upstream/current/wikis zope-zwiki/branches/upstream/current/wikis/basic

Fabio Tranchitella kobold at alioth.debian.org
Fri Feb 9 13:59:51 CET 2007


Author: kobold
Date: 2007-02-09 13:59:48 +0100 (Fri, 09 Feb 2007)
New Revision: 610

Added:
   zope-zwiki/
   zope-zwiki/branches/
   zope-zwiki/branches/upstream/
   zope-zwiki/branches/upstream/current/
   zope-zwiki/branches/upstream/current/.cvsignore
   zope-zwiki/branches/upstream/current/Admin.py
   zope-zwiki/branches/upstream/current/Admin_tests.py
   zope-zwiki/branches/upstream/current/CHANGES
   zope-zwiki/branches/upstream/current/CMF.py
   zope-zwiki/branches/upstream/current/CMFInit.py
   zope-zwiki/branches/upstream/current/CMF_tests.py
   zope-zwiki/branches/upstream/current/CONTRIBUTORS
   zope-zwiki/branches/upstream/current/Catalog.py
   zope-zwiki/branches/upstream/current/Catalog_tests.py
   zope-zwiki/branches/upstream/current/Comments.py
   zope-zwiki/branches/upstream/current/Comments_tests.py
   zope-zwiki/branches/upstream/current/Defaults.py
   zope-zwiki/branches/upstream/current/Diff.py
   zope-zwiki/branches/upstream/current/Diff_tests.py
   zope-zwiki/branches/upstream/current/Editing.py
   zope-zwiki/branches/upstream/current/Editing_tests.py
   zope-zwiki/branches/upstream/current/Extensions/
   zope-zwiki/branches/upstream/current/Extensions/Install.py
   zope-zwiki/branches/upstream/current/Extensions/README
   zope-zwiki/branches/upstream/current/Extensions/__init__.py
   zope-zwiki/branches/upstream/current/Extensions/fixprops.py
   zope-zwiki/branches/upstream/current/Extensions/mailin.py
   zope-zwiki/branches/upstream/current/Extensions/mailin_tests.py
   zope-zwiki/branches/upstream/current/FILESYSTEM_VS_WIKI_DOCS
   zope-zwiki/branches/upstream/current/GPL
   zope-zwiki/branches/upstream/current/I18n.py
   zope-zwiki/branches/upstream/current/I18n_tests.py
   zope-zwiki/branches/upstream/current/LICENSE
   zope-zwiki/branches/upstream/current/Mail.py
   zope-zwiki/branches/upstream/current/Mail_tests.py
   zope-zwiki/branches/upstream/current/Outline.py
   zope-zwiki/branches/upstream/current/OutlineSupport.py
   zope-zwiki/branches/upstream/current/OutlineSupport_tests.py
   zope-zwiki/branches/upstream/current/Outline_tests.py
   zope-zwiki/branches/upstream/current/PageTypes.py
   zope-zwiki/branches/upstream/current/Permissions.py
   zope-zwiki/branches/upstream/current/README
   zope-zwiki/branches/upstream/current/REPO_POLICY
   zope-zwiki/branches/upstream/current/RSS.py
   zope-zwiki/branches/upstream/current/Regexps.py
   zope-zwiki/branches/upstream/current/TESTS
   zope-zwiki/branches/upstream/current/TODO
   zope-zwiki/branches/upstream/current/TextFormatter.py
   zope-zwiki/branches/upstream/current/Utils.py
   zope-zwiki/branches/upstream/current/Utils_tests.py
   zope-zwiki/branches/upstream/current/Views.py
   zope-zwiki/branches/upstream/current/Views_tests.py
   zope-zwiki/branches/upstream/current/ZWikiPage.py
   zope-zwiki/branches/upstream/current/ZWikiPage_tests.py
   zope-zwiki/branches/upstream/current/__init__.py
   zope-zwiki/branches/upstream/current/i18n/
   zope-zwiki/branches/upstream/current/i18n/af.po
   zope-zwiki/branches/upstream/current/i18n/ar.po
   zope-zwiki/branches/upstream/current/i18n/de.po
   zope-zwiki/branches/upstream/current/i18n/en_GB.po
   zope-zwiki/branches/upstream/current/i18n/es.po
   zope-zwiki/branches/upstream/current/i18n/et.po
   zope-zwiki/branches/upstream/current/i18n/fi.po
   zope-zwiki/branches/upstream/current/i18n/fr.po
   zope-zwiki/branches/upstream/current/i18n/he.po
   zope-zwiki/branches/upstream/current/i18n/hu.po
   zope-zwiki/branches/upstream/current/i18n/it.po
   zope-zwiki/branches/upstream/current/i18n/ja.po
   zope-zwiki/branches/upstream/current/i18n/nl.po
   zope-zwiki/branches/upstream/current/i18n/pl.po
   zope-zwiki/branches/upstream/current/i18n/plone-br.po
   zope-zwiki/branches/upstream/current/i18n/plone-de.po
   zope-zwiki/branches/upstream/current/i18n/plone-es.po
   zope-zwiki/branches/upstream/current/i18n/plone-fi.po
   zope-zwiki/branches/upstream/current/i18n/plone-fr.po
   zope-zwiki/branches/upstream/current/i18n/plone-he.po
   zope-zwiki/branches/upstream/current/i18n/plone-hu.po
   zope-zwiki/branches/upstream/current/i18n/plone-it.po
   zope-zwiki/branches/upstream/current/i18n/plone-ja.po
   zope-zwiki/branches/upstream/current/i18n/plone-nl.po
   zope-zwiki/branches/upstream/current/i18n/plone-pl.po
   zope-zwiki/branches/upstream/current/i18n/plone-pt.po
   zope-zwiki/branches/upstream/current/i18n/plone-pt_BR.po
   zope-zwiki/branches/upstream/current/i18n/plone-ru.po
   zope-zwiki/branches/upstream/current/i18n/plone-sv.po
   zope-zwiki/branches/upstream/current/i18n/plone-tr.po
   zope-zwiki/branches/upstream/current/i18n/plone-zh_CN.po
   zope-zwiki/branches/upstream/current/i18n/plone-zh_TW.po
   zope-zwiki/branches/upstream/current/i18n/pt.po
   zope-zwiki/branches/upstream/current/i18n/pt_BR.po
   zope-zwiki/branches/upstream/current/i18n/ro.po
   zope-zwiki/branches/upstream/current/i18n/ru.po
   zope-zwiki/branches/upstream/current/i18n/sv.po
   zope-zwiki/branches/upstream/current/i18n/th.po
   zope-zwiki/branches/upstream/current/i18n/tr.po
   zope-zwiki/branches/upstream/current/i18n/zh_CN.po
   zope-zwiki/branches/upstream/current/i18n/zh_TW.po
   zope-zwiki/branches/upstream/current/i18n/zwiki-manual.pot
   zope-zwiki/branches/upstream/current/i18n/zwiki-plone.pot
   zope-zwiki/branches/upstream/current/i18n/zwiki.pot
   zope-zwiki/branches/upstream/current/list_authors.hs
   zope-zwiki/branches/upstream/current/pagetypes/
   zope-zwiki/branches/upstream/current/pagetypes/__init__.py
   zope-zwiki/branches/upstream/current/pagetypes/common.py
   zope-zwiki/branches/upstream/current/pagetypes/common_tests.py
   zope-zwiki/branches/upstream/current/pagetypes/html.py
   zope-zwiki/branches/upstream/current/pagetypes/html_tests.py
   zope-zwiki/branches/upstream/current/pagetypes/moin.py
   zope-zwiki/branches/upstream/current/pagetypes/moin_tests.py
   zope-zwiki/branches/upstream/current/pagetypes/plaintext.py
   zope-zwiki/branches/upstream/current/pagetypes/plaintext_tests.py
   zope-zwiki/branches/upstream/current/pagetypes/rst.py
   zope-zwiki/branches/upstream/current/pagetypes/rst_tests.py
   zope-zwiki/branches/upstream/current/pagetypes/stx.py
   zope-zwiki/branches/upstream/current/pagetypes/stx_tests.py
   zope-zwiki/branches/upstream/current/pagetypes/wwml.py
   zope-zwiki/branches/upstream/current/pagetypes/wwml_tests.py
   zope-zwiki/branches/upstream/current/plugins/
   zope-zwiki/branches/upstream/current/plugins/README
   zope-zwiki/branches/upstream/current/plugins/__init__.py
   zope-zwiki/branches/upstream/current/plugins/fit.py
   zope-zwiki/branches/upstream/current/plugins/latexwiki/
   zope-zwiki/branches/upstream/current/plugins/latexwiki/ChangeLog
   zope-zwiki/branches/upstream/current/plugins/latexwiki/Extensions/
   zope-zwiki/branches/upstream/current/plugins/latexwiki/Extensions/Install.py
   zope-zwiki/branches/upstream/current/plugins/latexwiki/Extensions/__init__.py
   zope-zwiki/branches/upstream/current/plugins/latexwiki/Extensions/setup_latexwiki.py
   zope-zwiki/branches/upstream/current/plugins/latexwiki/LICENSE.txt
   zope-zwiki/branches/upstream/current/plugins/latexwiki/NOTES.txt
   zope-zwiki/branches/upstream/current/plugins/latexwiki/README.txt
   zope-zwiki/branches/upstream/current/plugins/latexwiki/ReplaceInlineLatex.py
   zope-zwiki/branches/upstream/current/plugins/latexwiki/ReplaceInlineLatex_tests.py
   zope-zwiki/branches/upstream/current/plugins/latexwiki/__init__.py
   zope-zwiki/branches/upstream/current/plugins/latexwiki/latexWrapper.py
   zope-zwiki/branches/upstream/current/plugins/latexwiki/stxlatex.py
   zope-zwiki/branches/upstream/current/plugins/latexwiki/util.py
   zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/
   zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/
   zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/FrontPage.stxlatex
   zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/HelpPage.stxlatex
   zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/LaTeX.stxlatex
   zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/LatexTemplate.txt
   zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/UserOptions.stxlatex
   zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/WikiWikiWeb.stxlatex
   zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/ZWiki.stxlatex
   zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/blank.gif.gif
   zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/diffform.pt
   zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/index_html.dtml
   zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/latexwiki.css.dtml
   zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/pngbehavior.htc.zexp
   zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/setup_latexwiki.zexp
   zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/site_logo.png
   zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/standard_error_message.dtml
   zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/wikipage.pt
   zope-zwiki/branches/upstream/current/plugins/mathaction/
   zope-zwiki/branches/upstream/current/plugins/mathaction/ChangeLog
   zope-zwiki/branches/upstream/current/plugins/mathaction/Extensions/
   zope-zwiki/branches/upstream/current/plugins/mathaction/Extensions/Install.py
   zope-zwiki/branches/upstream/current/plugins/mathaction/Extensions/__init__.py
   zope-zwiki/branches/upstream/current/plugins/mathaction/Extensions/setup_latexwiki.py
   zope-zwiki/branches/upstream/current/plugins/mathaction/Extensions/tangle.py
   zope-zwiki/branches/upstream/current/plugins/mathaction/INSTALL.txt
   zope-zwiki/branches/upstream/current/plugins/mathaction/LICENSE.txt
   zope-zwiki/branches/upstream/current/plugins/mathaction/Notes
   zope-zwiki/branches/upstream/current/plugins/mathaction/README.txt
   zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineAxiom.py
   zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineHTML.py
   zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineLatex.py
   zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineMaxima.py
   zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineReduce.py
   zope-zwiki/branches/upstream/current/plugins/mathaction/ReplacePamphlet.py
   zope-zwiki/branches/upstream/current/plugins/mathaction/UPGRADE
   zope-zwiki/branches/upstream/current/plugins/mathaction/__init__.py
   zope-zwiki/branches/upstream/current/plugins/mathaction/axiom.sty
   zope-zwiki/branches/upstream/current/plugins/mathaction/axiomWrapper.py
   zope-zwiki/branches/upstream/current/plugins/mathaction/latexWrapper.py
   zope-zwiki/branches/upstream/current/plugins/mathaction/mathaction-maxima-5.9.3.lisp
   zope-zwiki/branches/upstream/current/plugins/mathaction/maximaWrapper.py
   zope-zwiki/branches/upstream/current/plugins/mathaction/pagetypes.py
   zope-zwiki/branches/upstream/current/plugins/mathaction/pamphletWrapper.py
   zope-zwiki/branches/upstream/current/plugins/mathaction/reduceWrapper.py
   zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker.c
   zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker.i
   zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker.mak
   zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker.py
   zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker_wrap.c
   zope-zwiki/branches/upstream/current/plugins/mathaction/useproto.h
   zope-zwiki/branches/upstream/current/plugins/mathaction/util.py
   zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/
   zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/
   zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/FrontPage.stxlatex
   zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/HelpPage.stxlatex
   zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/LaTeX.stxlatex
   zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/LatexTemplate.txt
   zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/UserOptions.stxlatex
   zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/WikiWikiWeb.stxlatex
   zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/ZWiki.stxlatex
   zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/blank.gif.gif
   zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/index_html.dtml
   zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/latexwiki.css.dtml
   zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/pngbehavior.htc.zexp
   zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/setup_latexwiki.zexp
   zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/site_logo.png
   zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/standard_error_message.dtml
   zope-zwiki/branches/upstream/current/plugins/rating/
   zope-zwiki/branches/upstream/current/plugins/rating/__init__.py
   zope-zwiki/branches/upstream/current/plugins/rating/rating.py
   zope-zwiki/branches/upstream/current/plugins/rating/rating_tests.py
   zope-zwiki/branches/upstream/current/plugins/rating/ratingform.pt
   zope-zwiki/branches/upstream/current/plugins/tracker/
   zope-zwiki/branches/upstream/current/plugins/tracker/FilterIssues.dtml
   zope-zwiki/branches/upstream/current/plugins/tracker/IssueBrowser.dtml
   zope-zwiki/branches/upstream/current/plugins/tracker/IssueTracker.dtml
   zope-zwiki/branches/upstream/current/plugins/tracker/__init__.py
   zope-zwiki/branches/upstream/current/plugins/tracker/filterissues.pt
   zope-zwiki/branches/upstream/current/plugins/tracker/issuebrowser.pt
   zope-zwiki/branches/upstream/current/plugins/tracker/issuepropertiesform.dtml
   zope-zwiki/branches/upstream/current/plugins/tracker/issuetracker.pt
   zope-zwiki/branches/upstream/current/plugins/tracker/tracker.py
   zope-zwiki/branches/upstream/current/plugins/tracker/tracker_tests.py
   zope-zwiki/branches/upstream/current/refresh.txt
   zope-zwiki/branches/upstream/current/scripts/
   zope-zwiki/branches/upstream/current/scripts/README
   zope-zwiki/branches/upstream/current/scripts/pagesByType.dtml
   zope-zwiki/branches/upstream/current/scripts/print.dtml
   zope-zwiki/branches/upstream/current/scripts/toc.py
   zope-zwiki/branches/upstream/current/scripts/view_source.dtml
   zope-zwiki/branches/upstream/current/skins/
   zope-zwiki/branches/upstream/current/skins/zwiki/
   zope-zwiki/branches/upstream/current/skins/zwiki/HelpPage.stx
   zope-zwiki/branches/upstream/current/skins/zwiki/README
   zope-zwiki/branches/upstream/current/skins/zwiki/RecentChanges.dtml
   zope-zwiki/branches/upstream/current/skins/zwiki/SearchPage.dtml
   zope-zwiki/branches/upstream/current/skins/zwiki/UserOptions.dtml
   zope-zwiki/branches/upstream/current/skins/zwiki/accesskeys.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/addwikiform.dtml
   zope-zwiki/branches/upstream/current/skins/zwiki/addwikipageform.dtml
   zope-zwiki/branches/upstream/current/skins/zwiki/backlinks.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/badtemplate.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/blank_star.png
   zope-zwiki/branches/upstream/current/skins/zwiki/commentform.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/content.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/contentspage.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/denied.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/diffform.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/editform.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/head.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/helppage.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/hierarchylinks.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/links.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/maintemplate.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/pageheader.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/pagemanagementform.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/recentchanges.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/searchwiki.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/siteheader.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/star.png
   zope-zwiki/branches/upstream/current/skins/zwiki/stylesheet.css
   zope-zwiki/branches/upstream/current/skins/zwiki/subscribeform.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/subtopics_board.dtml
   zope-zwiki/branches/upstream/current/skins/zwiki/subtopics_outline.dtml
   zope-zwiki/branches/upstream/current/skins/zwiki/testtemplate.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/useroptions.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/wikipage.pt
   zope-zwiki/branches/upstream/current/skins/zwiki/wikipage_icon.gif
   zope-zwiki/branches/upstream/current/skins/zwiki/wikipage_plone_icon.gif
   zope-zwiki/branches/upstream/current/testsupport.py
   zope-zwiki/branches/upstream/current/tools/
   zope-zwiki/branches/upstream/current/tools/README
   zope-zwiki/branches/upstream/current/tools/zwikiexport.py
   zope-zwiki/branches/upstream/current/tools/zwikiimport.py
   zope-zwiki/branches/upstream/current/version.txt
   zope-zwiki/branches/upstream/current/wikis/
   zope-zwiki/branches/upstream/current/wikis/basic/
   zope-zwiki/branches/upstream/current/wikis/basic/FrontPage.stx
   zope-zwiki/branches/upstream/current/wikis/basic/WikiWikiWeb.stx
   zope-zwiki/branches/upstream/current/wikis/basic/ZWiki.stx
   zope-zwiki/branches/upstream/current/wikis/basic/index_html.dtml
   zope-zwiki/branches/upstream/current/wikis/basic/standard_error_message.dtml
   zope-zwiki/tags/
Log:
[svn-inject] Installing original source of zope-zwiki

Added: zope-zwiki/branches/upstream/current/.cvsignore
===================================================================
--- zope-zwiki/branches/upstream/current/.cvsignore	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/.cvsignore	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,14 @@
+.*
+_darcs
+*.pyc
+*~
+*.mo
+old
+Part*
+darcs*
+patch*
+dtmlmessages.pt
+.doxygen
+*.darcs
+*.diff
+NOTES

Added: zope-zwiki/branches/upstream/current/Admin.py
===================================================================
--- zope-zwiki/branches/upstream/current/Admin.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Admin.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,479 @@
+# Admin.py - methods supporting wiki administration
+
+from types import *
+import os, re, os.path
+from string import join, split, strip
+from time import clock
+
+from AccessControl import getSecurityManager, ClassSecurityInfo
+from Globals import package_home, InitializeClass
+from OFS.CopySupport import CopyError
+from OFS.DTMLMethod import DTMLMethod
+from DateTime import DateTime
+
+from I18n import _
+import Permissions
+from Utils import get_transaction, BLATHER, formattedTraceback, DateTimeSyntaxError, callHooks
+from pagetypes import PAGE_TYPE_UPGRADES
+from Defaults import PAGE_METADATA, \
+     TEXTINDEXES, FIELDINDEXES, KEYWORDINDEXES, DATEINDEXES, PATHINDEXES
+
+
+class PageAdminSupport:
+    """
+    This mix-in class provides some utilities to ease wiki administration.
+    """
+    security = ClassSecurityInfo()
+
+    security.declarePublic('upgradeAll') # we check folder permission at runtime
+    def upgradeAll(self,render=1,batch=0,REQUEST=None):
+                   
+        """
+        Update, upgrade, pre-render and re-index all pages and data structures.
+
+        Normally individual pages are upgraded and pre-rendered on
+        demand, when viewed. An administrator may want to do this for
+        all pages ahead of time, particularly after a zwiki upgrade,
+        to ensure all pages have the latest properties and have been
+        rendered by the latest code, minimizing delay and possible
+        problems later on.
+
+        Also installs a wiki catalog if not present, re-indexes each
+        page, validates page parents, and rebuilds the wiki outline
+        cache. Also installs the index_html and standard_error_message
+        dtml methods. XXX split ? 
+
+        You can set render=0 to skip the page pre-rendering part,
+        completing much faster on large wikis.
+
+        The optional batch argument forces a commit every N pages.
+        This may be useful to get a complete run in large/busy wikis,
+        which can be difficult due to conflict errors or memory usage.
+
+        Requires 'Manage properties' permission on the folder.
+        """
+        if not self.checkPermission(Permissions.manage_properties,
+                                     self.folder()):
+            raise 'Unauthorized', (
+             _('You are not authorized to upgrade all pages.') + \
+             _('(folder -> Manage properties)'))
+        
+        batch = int(batch)
+        if render: BLATHER('upgrading/reindexing/pre-rendering all pages:')
+        else: BLATHER('upgrading/reindexing all pages:')
+        starttime = clock()
+        n, total = 0, self.pageCount()
+        self.setupCatalog(reindex=0)
+        for p in self.pageObjects(): # poor caching (not a problem here)
+            n += 1
+            try:
+                p.upgrade(REQUEST)
+                p.upgradeId(REQUEST)
+                p.fixPageEncoding()
+                if render:
+                    p.preRender(clear_cache=1)
+                    msg = 'upgraded and pre-rendered page'
+                else:
+                    msg = 'upgraded page'
+                # make sure every page is cataloged - slow but thorough
+                p.index_object(log=0)
+                BLATHER('%s %d/%d %s'%(msg,n,total,p.id()))
+            except:
+                BLATHER('failed to upgrade page %d/%d %s: %s' \
+                     % (n,total,p.id(),formattedTraceback()))
+            if batch and n % batch == 0:
+                BLATHER('committing')
+                get_transaction().commit()
+
+        self.updateWikiOutline()
+        self.setupDtmlMethods()
+        endtime = clock()
+        BLATHER('upgrade complete, %d pages processed in %fs, %f pages/s' \
+                %(n, endtime-starttime, n/(endtime-starttime)))
+
+    # allow extra actions to be added to this method
+    # upgradeId hooks return a page name that should be used
+    # as the basis for setting the id (tracker uses this)
+    global upgradeId_hooks
+    upgradeId_hooks = []
+
+    security.declareProtected(Permissions.View, 'upgradeId')
+    def upgradeId(self,REQUEST=None):
+        """
+        Make sure a page's id conforms with its title (may also change title!)
+
+        See also canonicalIdFrom, http://zwiki.org/HowZwikiTitleAndIdWorks .
+        Does not leave a placeholder, so may break incoming links.  Does
+        update backlinks, because it's less work than fixing up links by
+        hand afterward. This makes it too slow to use in auto-upgrade,
+        though, so people must call this manually or more usually via
+        upgradeAll.
+
+        With legacy pages (or manually renamed pages), it may happen that
+        there's a clash between two similarly-named pages mapping to the
+        same canonical id. In this case we just log the error and move on.
+
+        The tracker plugin modifies this to also rename old IssueNoNNNN
+        pages to the new #NNNN style.
+        """
+        # let plugins influence the new title & id..
+        name = callHooks(upgradeId_hooks, self) or self.pageName()
+        # now we can just call rename, it will do what's necessary
+        try:
+            self.rename(name,updatebacklinks=1,sendmail=0,REQUEST=REQUEST)
+        except CopyError:
+            BLATHER(
+                'upgradeId for "%s" (%s) failed - does %s already exist ?' \
+                % (self.pageName(),self.getId(),self.canonicalIdFrom(name)))
+
+    def newPageTypeIdFor(self,oldpagetypeid):
+        """
+        Find the best modern equivalent for some arbitrary old page type.
+        """
+        return PAGE_TYPE_UPGRADES.get(oldpagetypeid, self.defaultPageType())
+
+    # allow extra actions to be added to this method
+    # upgrade hooks return non-null if the page object was changed
+    # they should be fast as upgrade is called on each page view
+    global upgrade_hooks
+    upgrade_hooks = []
+
+    # performance-sensitive ?
+    security.declareProtected(Permissions.View, 'upgrade')
+    def upgrade(self,REQUEST=None):
+        """
+        Upgrade an old page instance (and possibly the folder as well).
+
+        Called on every page view (set AUTO_UPGRADE=0 in Default.py to
+        prevent this).  You could also call this on every page in your
+        wiki to do a batch upgrade. Affects bobobase_modification_time. If
+        you later downgrade zwiki, the upgraded pages may not work so
+        well.
+        """
+        # Note that the objects don't get very far unpickling, some
+        # by-hand adjustment via command-line interaction is necessary
+        # to get them over the transition, sigh. --ken
+        # not sure what this means --SM
+
+        # What happens in the zodb when class definitions change ? I think
+        # all instances in the zodb conform to the new class shape
+        # immediately on refresh/restart, but what happens to
+        # (a) old _properties lists ? not sure, assume they remain in
+        # unaffected and we need to add the new properties
+        # and (b) old properties & attributes no longer in the class
+        # definition ?  I think these lurk around, and we need to delete
+        # them.
+
+        changed = 0
+
+        # As of 0.17, page ids are always canonicalIdFrom(title); we'll
+        # rename to conform with this where necessary
+        # too slow!
+        # changed = self.upgradeId()
+
+        # fix up attributes first, then properties
+        # NB be a bit careful about  acquisition while doing this
+
+        # migrate a WikiForNow _st_data attribute
+        if hasattr(self.aq_base, '_st_data'):
+            self.raw = self._st_data
+            del self._st_data
+            changed = 1
+
+        # upgrade old page types
+        pagetype = self.pageTypeId()
+        if pagetype in PAGE_TYPE_UPGRADES.keys():
+            self.setPageType(self.newPageTypeIdFor(pagetype))
+            # clear render cache; don't bother prerendering just now
+            self.clearCache()
+            changed = 1
+
+        # Pre-0.9.10, creation_time has been a string in custom format and
+        # last_edit_time has been a DateTime. Now both are kept as
+        # ISO-format strings. Might not be strictly necessary to upgrade
+        # in all cases.. will cause a lot of bobobase_mod_time
+        # updates.. do it anyway.
+        if not self.last_edit_time:
+            self.last_edit_time = self.bobobase_modification_time().ISO()
+            changed = 1
+        elif type(self.last_edit_time) is not StringType:
+            self.last_edit_time = self.last_edit_time.ISO()
+            changed = 1
+        elif len(self.last_edit_time) != 19:
+            try: 
+                self.last_edit_time = DateTime(self.last_edit_time).ISO()
+                changed = 1
+            except DateTimeSyntaxError:
+                # can't convert to ISO, just leave it be
+                pass
+
+        # If no creation_time, just leave it blank for now.
+        # we shouldn't find DateTimes here, but check anyway
+        if not self.creation_time:
+            pass
+        elif type(self.creation_time) is not StringType:
+            self.creation_time = self.creation_time.ISO()
+            changed = 1
+        elif len(self.creation_time) != 19:
+            try: 
+                self.creation_time = DateTime(self.creation_time).ISO()
+                changed = 1
+            except DateTimeSyntaxError:
+                # can't convert to ISO, just leave it be
+                pass
+
+        # _wikilinks, _links and _prelinked are no longer used
+        for a in (
+            '_wikilinks',
+            '_links',
+            '_prelinked',
+            ):
+            if hasattr(self.aq_base,a): 
+                delattr(self,a)
+                self.clearCache()
+                changed = 1 
+
+        # update _properties
+        # keep in sync with _properties above. Better if we used that as
+        # the template (efficiently)
+        oldprops = { # not implemented
+            'page_type'     :{'id':'page_type','type':'string'},
+            }
+        newprops = {
+            #'page_type'     :{'id':'page_type','type':'selection','mode': 'w',
+            #                  'select_variable': 'ZWIKI_PAGE_TYPES'},
+            'creator'       :{'id':'creator','type':'string','mode':'r'},
+            'creator_ip'    :{'id':'creator_ip','type':'string','mode':'r'},
+            'creation_time' :{'id':'creation_time','type':'string','mode':'r'},
+            'last_editor'   :{'id':'last_editor','type':'string','mode':'r'},
+            'last_editor_ip':{'id':'last_editor_ip','type':'string','mode':'r'},
+            'last_edit_time':{'id':'creation_time','type':'string','mode':'r'},
+            'last_log'      :{'id':'last_log', 'type': 'string', 'mode': 'r'},
+            'NOT_CATALOGED' :{'id':'NOT_CATALOGED', 'type': 'boolean', 'mode': 'w'},
+            }
+        props = map(lambda x:x['id'], self._properties)
+        for p in oldprops.keys():
+            if p in props: # and oldprops[p]['type'] != blah blah blah :
+                pass
+                #ack!
+                #self._properties = filter(lambda x:x['id'] != p,
+                #                          self._properties)
+                #changed = 1
+                # XXX this does work in python 1.5 surely.. what's the
+                # problem ?
+        for p in newprops.keys():
+            if not p in props:
+                self._properties = self._properties + (newprops[p],)
+                changed = 1
+
+        # ensure parents property is a list
+        if self.ensureParentsPropertyIsList(): changed = 1
+
+        # call any extra upgrade actions eg from plugins
+        if callHooks(upgrade_hooks, self): changed = 1
+
+        if changed:
+            # do a commit now so the current render will have the correct
+            # bobobase_modification_time for display (many headers/footers
+            # still show it)
+            # XXX I don't think we need to dick around with commits any more
+            #get_transaction().commit()
+            BLATHER('upgraded '+self.id())
+
+        self.upgradeComments(REQUEST)
+                
+        # PageMailSupport does a bit more (merge here ?)
+        self._upgradeSubscribers()
+
+        # also make sure there is an up-to-date outline cache
+        self.wikiOutline()
+
+    security.declareProtected('Manage properties', 'setupPages')
+    def setupPages(self,REQUEST=None):
+        """
+        Install some default wiki pages to help get a wiki started.
+        """
+        # copied from ...
+        dir = package_home(globals()) + os.sep + 'wikis' + os.sep + 'basic'
+        filenames = os.listdir(dir)
+        for filename in filenames:
+            if filename[-5:] == '.dtml': pass
+            else:
+                m = re.search(r'(.+)\.(.+)',filename)
+                if m:
+                    name, type = m.group(1), m.group(2)
+                    if not self.pageWithName(name):
+                        text=open(dir+os.sep+filename,'r').read()
+                        # parse optional parents list
+                        m = re.match(r'(?si)(^#parents:(.*?)\n)?(.*)',text)
+                        if m.group(2): parents = split(strip(m.group(2)),',')
+                        else: parents = []
+                        text = m.group(3)
+                        self.create(name,text=text)
+        if REQUEST:
+            REQUEST.RESPONSE.redirect(self.pageUrl())
+
+    #XXX does this not attempt to create everything ?
+    security.declareProtected('Manage properties', 'setupPages')
+    def setupDtmlPages(self,REQUEST=None):
+        """
+        Install the DTML page implementations of some standard views.
+
+        This facilitates easy tweaking and development.
+        It doesn't check if dtml is enabled in the wiki, just
+        creates the pages with the default page type.
+        """
+        dir = os.path.join(package_home(globals()),'skins','zwiki')
+        filenames = os.listdir(dir)
+        for filename in filenames:
+            m = re.search(r'(.+)\.(.+)',filename)
+            if m:
+                name, type = m.group(1), m.group(2)
+                if not self.pageWithName(name):
+                    text=open(os.path.join(dir,filename),'r').read()
+                    # parse optional parents list
+                    m = re.match(r'(?si)(^#parents:(.*?)\n)?(.*)',text)
+                    if m.group(2): parents = split(strip(m.group(2)),',')
+                    else: parents = []
+                    text = m.group(3)
+                    self.create(name,text=text)
+        if REQUEST:
+            REQUEST.RESPONSE.redirect(self.pageUrl())
+
+    security.declareProtected('Manage properties', 'setupDtmlMethods')
+    def setupDtmlMethods(self,REQUEST=None):
+        """
+        Install some default DTML methods to make wikis work better.
+
+        These include:
+        index_html - redirects to the wiki's front page
+        standard_error_message - handles 404s to enable fuzzy urls etc.
+
+        Existing objects with the same name won't be overwritten.
+        """
+        d = os.path.join(package_home(globals()),'wikis','basic')
+        dtmlmethods = [f[:-5] for f in os.listdir(d) if f.endswith('.dtml')]
+        ids = self.folder().objectIds()
+        for m in dtmlmethods:
+            # avoid acquisition.. self.folder().aq_base won't work
+            if m not in ids:
+                addDTMLMethod(
+                    self.folder(),
+                    m,
+                    title='',
+                    file=open(os.path.join(d,m+'.dtml'),'r').read())
+        if REQUEST:
+            REQUEST.RESPONSE.redirect(self.pageUrl())
+
+    security.declareProtected('Manage properties', 'setupProperties')
+    def setupProperties(self,REQUEST=None):
+        """
+        Install some of the optional Zwiki properties on this wiki folder.
+
+        Calling this should not change the wiki's behaviour, but puts
+        some of the properties in place so that people don't have to
+        look up QuickReference.
+
+        XXX But actually, we may want to avoid pre-installing properties
+        before they're needed since they increase complexity for the wiki
+        admin. Need this ?
+        """
+        pass
+        if REQUEST:
+            REQUEST.RESPONSE.redirect(self.pageUrl())
+
+    security.declareProtected('Manage properties', 'setupCatalog')
+    def setupCatalog(self,REQUEST=None,reindex=1):
+        """
+        Create and/or configure a catalog for this wiki.
+
+        Safe to call more than once; will ignore any already existing
+        items. For simplicity we install all metadata for plugins (like
+        Tracker) here as well.
+        """                
+        #XXX during unit testing, somehow a non-None catalog is false
+        #if not self.catalog():
+        if self.catalogId() == 'NONE':
+            self.folder().manage_addProduct['ZCatalog'].manage_addZCatalog('Catalog','')
+        catalog = self.catalog()
+        catalogindexes, catalogmetadata = catalog.indexes(), catalog.schema()
+        PluginIndexes = catalog.manage_addProduct['PluginIndexes']
+        for i in TEXTINDEXES:
+            # XXX should choose a TING2 or ZCTI here and set up appropriately
+            # a TextIndex is case sensitive, exact word matches only
+            # a ZCTextIndex can be case insensitive and do right-side wildcards
+            # a TextIndexNG2 can be case insensitive and do both wildcards
+            if not i in catalogindexes: PluginIndexes.manage_addTextIndex(i)
+        for i in FIELDINDEXES:
+            if not i in catalogindexes: PluginIndexes.manage_addFieldIndex(i)
+        for i in KEYWORDINDEXES:
+            if not i in catalogindexes: PluginIndexes.manage_addKeywordIndex(i)
+        for i in DATEINDEXES:
+            if not i in catalogindexes: PluginIndexes.manage_addDateIndex(i)
+        for i in PATHINDEXES:
+            if not i in catalogindexes: PluginIndexes.manage_addPathIndex(i)
+        for m in PAGE_METADATA:
+            if not m in catalogmetadata: catalog.manage_addColumn(m)
+        if reindex:
+            # now index each page, to make all indexes and metadata current
+            n = 0
+            cid = self.catalog().getId()
+            for p in self.pageObjects():
+                n = n + 1
+                try:
+                    BLATHER('indexing page %d %s in %s'%(n,p.id(),cid))
+                    p.index_object(log=0)
+                except:
+                    BLATHER('failed to index page %d %s: %s' \
+                            % (n,p.id(),formattedTraceback()))
+            BLATHER('indexing complete, %d pages processed' % n)
+        if REQUEST:
+            REQUEST.RESPONSE.redirect(self.pageUrl())
+            
+    def fixPageEncoding(self, FROM='iso8859-1', TO='utf-8'):
+        """
+        Try to fix any character encoding problems in this page's name or text.
+
+        FROM is the encoding that we will try to convert from if there is trouble
+        TO is the encoding we prefer to use in this wiki
+        """
+        try: 
+            # are there characters in the name or text not using our preferred encoding ?
+            t = unicode(self.pageName(),TO)
+            t = unicode(self.text(),TO)
+            return False
+        except UnicodeDecodeError:
+            # yes - convert 
+            log = "converting %s from %s to %s encoding" % (self.pageName(), FROM, TO)
+            BLATHER(log)
+            # this will send mail and set last editor
+            #self.edit(text=unicode(self.text(), FROM).encode(TO),
+            #       title=unicode(self.pageName(), FROM).encode(TO),
+            #       log=log)
+            # this won't
+            self.setText(unicode(self.text(), FROM).encode(TO), REQUEST=REQUEST)
+            # this will (if the name really needs fixing)
+            self.rename(unicode(self.pageName(), FROM).encode(TO), sendmail=0, REQUEST=REQUEST)
+            return True
+
+    def fixAllPagesEncoding(self):
+        for p in self.pageObjects():
+            fixPageEncoding(p)
+        self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1'])
+
+InitializeClass(PageAdminSupport)
+
+
+# misc admin functions.. see also __init__.py
+# things are here and there to avoid circular imports
+
+def addDTMLMethod(self, id, title='', file=''):
+    id=str(id)
+    title=str(title)
+    ob = DTMLMethod(source_string=file, __name__=id)
+    ob.title = title
+    username = getSecurityManager().getUser().getUserName()
+    ob.manage_addLocalRoles(username, ['Owner'])
+    #ob.setSubOwner('both') #?
+    self._setObject(id, ob)
+

Added: zope-zwiki/branches/upstream/current/Admin_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/Admin_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Admin_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,143 @@
+from testsupport import *
+ZopeTestCase.installProduct('ZCatalog')
+ZopeTestCase.installProduct('ZWiki')
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    suite.addTest(unittest.makeSuite(AddWikiTests))
+    return suite
+
+class Tests(ZwikiTestCase):
+
+    #def test_upgrade(self):
+    #    p = mockPage(__name__='SomeId').aq_parent.SomeId
+    #    p.title = 'something elSe!'
+    #    p.upgrade()
+    #    self.assertEqual(p.id(),'SomethingElse')
+
+    # slow!
+    def Xtest_setupPages(self):
+        self.assertEqual(len(self.page.pages()),1)
+        self.page.setupPages()
+        self.assertEqual(len(self.page.pages()),9)
+        self.assert_(hasattr(self.page.folder(),'HelpPage'))
+        self.page.setupPages()
+        self.assertEqual(len(self.page.pages()),9)
+
+    def test_setupDtmlMethods(self):
+        self.assertEqual(len(self.page.folder().objectIds(spec='DTML Method')),0)
+        self.assert_(not hasattr(self.page.folder().aq_base,'index_html'))
+        self.assert_(not hasattr(self.page.folder().aq_base,'standard_error_message'))
+        self.page.setupDtmlMethods()
+        self.assertEqual(len(self.page.folder().objectIds(spec='DTML Method')),2)
+        self.assert_(hasattr(self.page.folder().aq_base,'index_html'))
+        self.assert_(hasattr(self.page.folder().aq_base,'standard_error_message'))
+        self.page.setupDtmlMethods()
+        self.assertEqual(len(self.page.folder().objectIds(spec='DTML Method')),2)
+
+    def test_setupCatalog(self):
+        self.assert_(not self.page.catalog())
+        self.page.setupCatalog()
+        #self.assert_(self.page.catalog()) #XXX fails! why ?
+        #XXX somehow the non-None catalog is false, during unit tests
+        self.assert_(self.page.catalog() is not None)
+        self.page.setupCatalog()
+
+    def xtest_setupTracker(self): #slow
+        self.assert_(not self.page.catalog())
+        self.assertEqual(len(self.page.pages()),1)
+        self.page.setupTracker()
+        self.assert_(self.page.catalog() is not None)
+        self.page.index_object() # get TestPage into the catalog for pages()!
+        self.assertEqual(len(self.page.pages()),3)
+        self.assert_(hasattr(self.page.folder(),'IssueTracker'))
+        self.assert_(hasattr(self.page.folder(),'FilterIssues'))
+        self.page.setupTracker()
+        self.assert_(self.page.catalog() is not None)
+        self.assertEqual(len(self.page.pages()),3)
+
+    def test_newPageTypeIdFor(self):
+        # test a few of the page type upgrades
+        self.assertEqual(self.page.newPageTypeIdFor('msgstxprelinkdtmlfitissuehtml'), 'stx')
+        self.assertEqual(self.page.newPageTypeIdFor('dtmlstxlinkhtml'), 'stx')
+        self.assertEqual(self.page.newPageTypeIdFor('nosuchtype'), self.page.defaultPageType())
+
+class AddWikiTests(unittest.TestCase):
+
+    TEMPLATES = (
+        ('zwikidotorg',
+         (('AnnoyingQuote',       'structuredtext'),
+          ('BookMarks',           'structuredtext'),
+          ('FrontPage',           'structuredtext'),
+          ('HelpPage',            'structuredtext'),
+          ('HierarchalStructure', 'structuredtext'),
+          ('JumpSearch',          'htmldtml'),
+          ('RecentChanges',       'htmldtml'),
+          ('RemoteWikiLinks',     'structuredtext'),
+          ('RemoteWikiURL',       'structuredtext'),
+          ('SearchPage',          'htmldtml'),
+          ('StructuredTextRules', 'structuredtext'),
+          ('TextFormattingRules', 'structuredtext'),
+          ('TimeZone',            'structuredtext'),
+          ('UserName',            'structuredtext'),
+          ('UserOptions',         'structuredtextdtml'),
+          ('WikiName',            'structuredtext'),
+          ('WikiWikiWeb',         'structuredtext'),
+          ('ZWiki',               'structuredtext'),
+          ('ZopeDotOrg',          'structuredtext'),
+          )),
+        )                               # add parents
+
+#I think I've had enough
+#
+#    def testAddWikiForm(self):
+#        from Products.ZWiki.Admin import *
+#        manage_addWikiForm()#client=zc,
+#                               #REQUEST=REQUEST,
+#                               #PARENTS=PARENTS)
+
+#    def testAddWiki(self):
+#        p = mockPage()
+#        f = p.aq_parent
+#        req = p.REQUEST
+#        wikitype = 'zwikidotorg'
+#        req['REMOTE_ADDR'] = '1.2.3.4'
+#        req['new_id'] = wikitype
+#        req['new_title'] = wikitype + ' wiki'
+#        req['wiki_type'] = wikitype
+#        # req['SERVER_URL'] required
+#        self.root.manage_addProduct['ZWiki'].addWikiForm(
+#            client=self.root,\
+#            REQUEST=req)
+
+#    def testDefaultWikiContent(self):
+#        """
+#        test the sample wiki content.
+#        """
+#        zc = self.ZopeContext
+#
+#        # for each sample wikiweb,
+#        for wikitype, pages in self.TEMPLATES:
+#
+#            # create one
+#            # fake form input
+#            zc.REQUEST['new_id'] = wikitype
+#            zc.REQUEST['new_title'] = wikitype + ' wiki'
+#            zc.REQUEST['wiki_type'] = wikitype
+#            manage_addWiki(zc,
+#                               wikitype,
+#                               new_title=wikitype+' wiki',
+#                               wiki_type=wikitype,
+#                               REQUEST=zc.REQUEST)
+#            
+#            # verify that it exists and that all pages listed above
+#            # are present and correct
+#            assert hasattr(zc, wikitype), \
+#                   wikitype+" wiki was not created"
+#            for page, type in pages:
+#                assert hasattr(zc[wikitype],page), \
+#                       wikitype+"/"+page+" does not exist"
+#                assert zc[wikitype][page].pageTypeId() == type, \
+#                       wikitype+"/"+page+"'s type is not "+type
+

Added: zope-zwiki/branches/upstream/current/CHANGES
===================================================================
--- zope-zwiki/branches/upstream/current/CHANGES	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/CHANGES	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,5025 @@
+Zwiki 0.58.0 2006/11/01
+
+Simpler skin customization, bugfixes, cleanups.
+
+Upgrade notes
+  If you have a very old zwiki relying on standard_wiki_header &
+  standard_wiki_footer dtml methods, these will now be ignored;
+  you must use a wikipage page template to customise the skin.
+  I don't think this will affect anyone (let me know if it did!) 
+	
+Installing
+  * remove bad import from CMFInit breaking CMF/Plone installation (#1291,
+    #1295)
+  * /upgradeAll now sets up a catalog and tries to fix some common
+    character encoding problems
+
+Configuring
+  * accept zodb skin templates with .pt or .dtml suffixes too, for easy upload
+  * when adding a wiki, keep image and file suffixes
+  * when adding a wiki, set the stylesheet's content type to text/css
+  * code cleanup, drop standard_wiki_header/standard_wiki_footer support
+  * add use_issue_links boolean property
+
+Browsing
+  * help page cleanups, link UsersGuide
+  * clarify username option help
+  * fix subtopics layout interference from unterminated stx lists &
+    literal blocks (#625)
+  * improve contents page styling, make it like subtopics (but bigger)
+  * fix star image in message-board-style subtopics template (#1305)
+
+Editing
+  * fix editform helppage link
+  * clarify page type names, change "type" to "markup"
+
+Issue tracking
+  * set a "medium" severity when mailing in a new issue (kludgy, just
+    picks the middle list element)
+
+General
+  * use a more stable contents url to reduce bot traffic (#762, #699) 
+    (Simon Michael, Daniel Yount, Michael Haubenwallner, Sascha Welter)
+  * handle unrecognised page types properly
+  * numericVotes method to get votes without voter identities
+  * merge Wikis.py into __init__ and Admin
+
+
+Zwiki 0.57.0 2006/10/01
+=======================
+
+Style and help cleanups, bugfixes.
+
+Upgrade notes
+  If you use the http://zwiki.org/HowToMakeContentsExpandable ,
+  you'll need to update it to work with the new "expandable" 
+  css class.
+  
+Configuring
+  * reorganize stylesheet
+
+  * add missing mathaction styles 
+
+  * rename "aqtree3clickable" css class to "expandable"
+
+Browsing
+  * subtopics, page context, wiki contents styling fixes
+
+  * make help page a built-in view like recentchanges etc.
+
+  * help updates
+
+  * make rss feeds and creationTime()/lastEditTime() more robust, eg
+    when creation_time property is blank
+
+General
+  * fix backwards compatibility for old page objects
+
+  * speed up and quieten down tests a little
+
+  * developer docs cleanup
+
+  * "authorstats" make rule. Welcome, Haskell!
+
+
+Zwiki 0.56.0 2006/09/02
+=======================
+
+Plone 2.5 support, LatexWiki and MathAction incorporated, plone
+tabs cleanup, translation updates, bug fixes.
+
+Upgrade notes
+  If you are upgrading, re-install Zwiki in your plone site's
+  Add/Remove Products to make the metadata tab go away. (See below.)
+
+Installing
+  * Wiki pages in Plone (or CMF) will no longer show the metadata
+    tab by default. http://zwiki.org/1273 has more about
+    this. (#1273)
+
+  * add isDefaultPageInFolder method, fixing plone 2.5.x support
+    (#1283)
+
+Configuring
+  * don't use # in setupTracker's event log messages, it was confusing
+
+Browsing
+  * don't limit the content area to 80% width in standard skin's stylesheet
+
+  * clean up plone/cmf tabs/actions
+
+  * change backlinks form's title to Related pages
+
+  * in the PAGE/myvotes view, link to pages 
+
+Editing
+  * tweak the warning a user sees when too many external links are added
+
+  * make restructured text be more silent about errors (report
+    severe errors only)
+
+  * LaTeX support: add the zwiki.org version of LatexWiki to Zwiki's
+    standard plugins (Simon Michael, Bob McElrath, Open Software Services)
+
+  * Axiom, Reduce, Maxima, Noweb support: add the zwiki.org version
+    of MathAction to Zwiki's standard plugins (Simon Michael, Bill Page)
+
+  * increase max page name length in editform from 100 to 300 for eg
+    latexwiki formula page names
+  
+Issue tracking
+  * make the add issue form respect the edits_need_username property,
+    closing a spam hole (#1279)
+
+Translations
+  * new Breton translation for plone skin (Fulup)
+
+  * translation updates: 
+    - German (Stefan Kose)
+    - Japanese (Masaya Kato)
+    - Russian (Valery Sharapov)
+  
+General
+  * in embedded DTML, ensure the context object (_.this) can acquire
+    from the folder, as we'd expect. Zope bug ? see collector
+
+
+
+Zwiki 0.55.0 2006/08/02
+=======================
+
+A couple of bugfixes.
+
+Installing
+  * fix installation breakage in vanilla CMF (#1271, koegler, Simon
+    Michael)
+
+  * fix typo which broke ZMI add zwiki form (#1269)
+
+Editing
+  * make standard_error_message create button use createform, not
+    editform (#1275, Peter Merel)
+  
+
+Zwiki 0.54.0 2006/06/01
+=======================
+
+Miscellaneous view-related and general enhancements.
+
+Upgrade notes
+  CMF/Plone users: the zwiki_standard and zwiki_plone skin layers
+  have been replaced by a single zwiki layer. Re-install Zwiki in
+  your CMF/Plone sites, using Plone's add/remove products or CMF's
+  quickinstaller, to register the new skin layer. Also remove the
+  zwiki_standard and zwiki_plone skin layers from your skins in
+  portal_skins -> Properties.
+    
+Installing
+  * cleaned up ZMI Add ZWiki and Add ZWiki Page forms
+
+  * remove _getViewFor import that broke with CMF 2.0
+
+  * fix upgradeAll's batch option
+
+Browsing
+  * /myvotes view shows your votes in this wiki
+
+  * highlight your current vote for this page, if any
+
+Editing
+  * support a max_identified_links property also, for
+    cookie-identified users (for now)
+    
+  * edit history enhancements, a more useful diff browser and more
+    powerful revert methods. Renames can now be reverted, reverting
+    is more reliable, and appropriate mail notifications are sent.
+
+General
+  * replace zwiki_standard and zwiki_plone with just skins/zwiki
+
+  * Views code cleanup
+
+  * simplify definition of view macros and make them refresh
+    immediately in debug mode
+
+  * more code docs
+
+  * don't bother identifying the catalog in event log
+
+
+Zwiki 0.53.0 2006/05/01
+=======================
+
+RST+DTML support, alternate heading layout for plone, some
+useful bugfixes.
+
+Configuring
+  * add an old-style compact parents list as an alternative in
+    pageheader.pt, off by default (#1250)
+
+  * CSS cleanups
+
+Browsing
+  * fix action icons layout in plone 2.0 (#1253)
+
+  * make top-right links small again in standard skin
+
+Editing
+  * enable dtml interpretation in rst pagetype (Stefan Rank,
+    Simon Michael)
+
+Mail
+  * fix unsubscribe, which was losing all subscribers' "all
+    edits" setting (#1254)
+
+  * fix an obscure case where cmf/plone subscriptions could be
+    ignored
+
+  * don't add NO_ADDRESS_FOR recipients, they break some MTAs
+    (#1255)
+
+Issue tracking
+  * make changeIssueProperties respect relevant permissions and
+    edits_need_username, to protect from spambots (#1260)
+
+  * be more robust about including full page name in issue
+    creation mails (#1257)
+
+General
+  * easier make test-* rules
+
+  * fix WWML test, which wasn't testing WWML at all
+
+  * testsupport docs, use rst not stx in default fixture
+
+
+Zwiki 0.52.1 2006/04/09
+=======================
+
+Bugfix release.
+
+Upgrade notes
+  If you installed 0.52 in a CMF or Plone site for the first time,
+  the zwiki_standard skin layer may not have been installed and some
+  images may appear broken. If so, uninstall and reinstall Zwiki in
+  add/remove products.
+    
+Installing
+  * fix backwards compatibility for old custom templates like
+    editform (#1241)
+
+  * the zwiki_standard layer was not being registered during
+    cmf/plone installation; don't add the unnecessary "Zwiki" skin
+    any more
+
+  * Add Zwiki was not setting page type based on the file suffix
+    (#1247)
+
+Configuring
+  * don't html-quote the site header, if configured (#1240)
+
+Browsing
+  * fix blank lines in RST page comments (#1248)
+  
+  * don't show wiki logo in plone skin
+
+  * show document actions instead of zwiki search form in plone skin
+
+  * don't show page hierarchy list bullets in plone skin
+
+  * don't make context links smaller in plone skin
+
+  * use h1 instead of big for page name
+
+  * add more whitespace between header and content in plone skin
+
+Editing
+  * when creating pages, use epoz based on the new page's type, not
+    the parent page's (#1243)
+
+Mail
+  * subscribe form fixes for cmf/plone sites: fall back to zwiki
+    options cookie when not logged in, don't subscribe Anonymous
+    User, more help for logged in users (Jens Nachtigall, Simon
+    Michael, #878, #1203)
+
+  * fix subscribeform _members attribute error with CMFMember
+    (#1239, Jens Nachtigall, Simon Michael)
+
+General
+  * don't let find objects in the catalog break due to outline
+    (#1246)
+
+  * make include() convenience method more robust with
+    authentication
+
+  
+Zwiki 0.52.0 2006/04/01
+=======================
+
+Restructured Text fixed & now the default markup, standard skin templates
+refactored and used for plone, zwiki/plone skin switching always
+available, wiki navigation links and issuebrowser (re-)enabled, better
+styles, zope 2.7 support fixed, slow freeform link rendering fixed,
+translation updates including a new Thai translation, much code cleanup.
+
+Upgrade notes
+  A lot of skins code has changed. Your old wikis should keep
+  working as before except:
+
+  - if you have a customized ``recentchanges`` or ``searchwiki``
+    template you'll need to delete it or replace with the latest and
+    re-customize
+
+  - full/simple/minimal links in old custom skin templates will no
+    longer work.
+    
+  - http://zwiki.org/HowToUseTheStandardSkinInPlone is now built in,
+    if you made a "Zwiki" CMF skin you can delete it.
+
+Installing
+  * fix startup failure with Zope 2.7 (#1222, Frank Laurijssens)
+
+  * fix a mysterious new bug with cmf/plone registration (#1237)
+
+Configuring
+  * leave site links enabled by default again (home, changes,
+    issues...)
+
+  * fix container context, make page management form create button
+    respect folder permission (#1220)
+
+Browsing
+  * switching between plone and standard zwiki skins in CMF/plone
+    sites is now always available, and no longer changes the url.
+    Just use the - and + access keys (in firefox: alt minus, alt
+    plus).
+
+  * fix the two-year-old freeform links speed regression (#818,
+    Warren Holt, Simon Michael)
+
+  * fix double-linking of bare urls in rst pages
+
+  * add standard RST styles and latest zwiki.org tweaks to
+    stylesheet - black headings & subtopic links, limited text
+    width, etc.
+
+  * tweak rst comment headings - remove blank line after heading,
+    don't italicise username
+
+  * fix too-small headings on RST pages, and don't show so many RST
+    warnings (#1224)
+
+  * work better with plone livesearch
+
+  * UserOptions.dtml was missing a > (Andrew Milton)
+
+  * remove unneeded styling of external editor icon
+
+  * remove unnecessary inconsistent-looking access key on logo
+
+  * show a heading on all views except editform
+
+Editing
+  * make restructured text the default page type, change page type
+    order in editform. (AdoptRestructuredText)
+    "As of today, RST is the default page type. Hurrah! And three
+    cheers for trusty old STX, which served us well. It is still the
+    page type of choice when you want to do stuff with embedded DTML
+    or HTML."
+
+  * fix error displayed on first comment to an RST page (#1233)
+
+  * show "HTML (WYSIWYG)" in the editform when Epoz is available
+
+  * remove editform's hard-coded gray background
+
+Page hierarchy
+  * make backlinks form smarter
+
+  * make singletons have same style as other links in contents
+
+Issue tracking
+  * don't bother showing "(property change)" in issue mailouts
+
+  * provide a link to issuebrowser by default
+
+  * make IssueBrowser show categories more usefully out of the box
+
+Translations
+  * Thai translation started (Bunyawat Singchai)
+
+  * update po files from rosetta and code, simplify file names
+
+General
+  * namegeddon. File and class renames and re-ordering for clarity
+    and better organization eg in wing ide
+
+  * major refactoring of skin templates using macros, the same
+    templates are now used for standard & plone skins (ViewGeddon)
+
+  * document skin code in Views.py
+
+  * use PageTemplateFile so view templates will reload in debug mode
+    (macros still don't)
+
+  * move all images to skins dir, use the standard zwiki page icon in plone
+
+  * standard_error_message cleanups
+
+
+Zwiki 0.51.0 2006/03/02
+=======================
+
+New partial UI translations from Rosetta: arabic, afrikaans, british
+english, estonian, romanian, swedish, turkish (welcome!); a number of
+bugfixes, eg fixing plone 2.0 support; a new option useful to discourage
+random/spam edits on public sites; briefer issue page mailout subjects;
+much cleanup of unit tests.
+
+Upgrade notes
+    If you have a customised wikipage template, your page management
+  form will not reflect the new edits_need_username property until
+  you update or remove your template.
+
+    If you do not have a catalog configured for your wiki, recent
+    changes will no longer sort properly. You will probably want to
+    add a catalog, by visiting SOMEPAGE/setupCatalog as manager.
+
+    Purple numbers are no longer supported out of the box.
+    
+Installing
+  * fix a bad import which broke CMF 1.4/Plone 2.0 support (#1211)
+
+Configuring
+  * new 'edits_need_username' option can be used to block anonymous
+    editors with no username cookie. Off by default.
+
+Browsing
+  * fix partial display of pagemanagement form due to inconsistent
+    permission checking (#1172, Frank Laurijssen, Simon Michael)
+
+  * work around a zope 2.8/2.9 bug breaking recentchanges by
+    requiring a catalog. RC no longer sorts properly without a catalog
+    (#1145, Simon Michael, Michael Haubenwallner)
+
+Editing
+  * fix ExternalEditor webdav locking with Zope >=2.8 (#1194, Phil
+    Schumm, Simon Michael)
+
+  * friendlier access denied messages in certain situations (eg when
+    edits_need_username is enabled)
+
+  * remove purple numbers plugin
+
+Page hierarchy
+  * make links in contents, eg to pages with brackets in the name,
+    more robust
+
+Mail
+  * mailouts from issue pages - except for the creation mailout -
+    now just include the issue number, not the full page name, in
+    the subject. This can be turned off by setting a
+    'mail_issue_names' boolean property. (Simon Michael, Frank
+    Laurijssens)
+
+Issue tracking
+  * issuebrowser layout tweaks - reduce columns from 8 to 6
+
+Translations
+  * translation updates from Rosetta at launchpad.net. New
+    translations include: arabic, afrikaans, british english,
+    estonian, romanian, swedish, turkish. Thanks to all translators!
+
+  * rename xx-XX po files to xx_XX
+
+General
+  * testgeddon
+    - move tests/* up to  *_tests.py
+    - update all tests for zope 2.9 testrunner
+    - make all tests pass
+    - make tests run faster
+    - run cmf/i18n tests only when the necessary products are present
+
+  * fix deprecation and bad security declaration warnings reported
+    by zope 2.9
+
+  * remove /src access key & link to clean up google results for
+    zwikis (#1174)
+
+
+Zwiki 0.50.0 2006/02/01
+=======================
+
+Minor changes.
+    
+Mail
+  * show subscriber counts in subscribeform
+
+General
+  * add names from ZwikiContributors to CONTRIBUTORS.txt
+    
+
+Zwiki 0.49.0 2006/01/19
+=======================
+
+A new copyright/license policy and contributor list; Plone 2.1 and
+mail fixes.
+
+Upgrade notes
+    You should upgrade to this release if you're using Plone 2.1.
+    
+Browsing
+  * make the green border & tabs appear in Plone 2.1, and indeed
+    force it always on, for now (#1187)
+
+Mail
+  * make authenticated/unauthenticated subscriptions in CMF/Plone
+    more interchangeable so things just work (#1199, Simon Michael,
+    John Riley)
+
+  * subscriberList was returning a stray :edits, causing trouble eg
+    in lotus notes (#1197, John Riley, Simon Michael)
+
+  * also accept Secure Mailhosts, fixing mailout in Plone 2.1
+    (#1197, Tracy Reed, Simon Michael)
+
+General - i18n
+  * minor fix, one line hadn't been translated (Frank Laurijssens)
+
+General
+  * add new contributors agreement & repo policy
+
+
+Zwiki 0.48.0 2005/12/01
+=======================
+
+French and dutch translation updates & several small bugfixes.
+
+Issue tracking
+  * tweak html to avoid stray hyperlinking in issue browser in plone wikis
+
+  * fix a missing space in filter issues
+
+General - i18n
+  * fix conflicting patch for i18n semicolons
+
+  * avoid deprecation warning zope2.8 (i18n:attributes, ';' instead of
+    space) (Stefan Rank)
+
+  * french translation updates (Encolpe Degoute)
+
+  * i18n code cleanups (Encolpe Degoute)
+
+  * Additional translations for Dutch (Frank Laurijssens)
+
+
+Zwiki 0.47.0 2005/11/06
+=======================
+
+Allow limited-depth hierarchy display, translation updates, bugfixes.
+
+Upgrade notes
+    If you have some #NNN issue links which are not working, the #1179
+    bugfix will take effect when you edit that page (or visit
+    PAGE/clearCache).
+    
+Installing
+  * fix Add ZWiki failure on older zopes due to attempted use of
+    btree folders - just always use ordinary folders (#1185)
+
+  * don't warn about Regexps.py when there is no locale configured;
+    log any locale/regexp-related problems at DEBUG level
+
+Editing
+  * prevent wiki-linking in reST literal blocks, like STX
+
+  * don't add "links updated" log note everywhere during renames
+
+Page hierarchy
+  * subtopics() and offspring() can now take a depth argument to
+    display hierarchy only to a certain depth
+    
+  * be a little smarter about not showing subtopics twice when
+    displayed with dtml
+
+Mail
+  * don't translate "(edit)" in mailout subjects
+    
+Issue tracking
+  * make #NNN issue links work again (#1179)
+
+General - i18n
+  * update pot and po files
+
+  * remove stray zope 3 messages from pot and po files (#1188)
+
+  * replace defaults in po files (#1190)
+
+  * update make rules for i18n
+
+  * zh-CN/zh-TW translations updated (T.C. Chou)
+
+  * update french translation up to 0.46.0 (Encolpe Degoute)
+
+  * dutch translation update (Frank Laurijssens)
+
+  * german translation update (Jens Nachtigall)
+
+General - skins
+  * Hide access keys when printing (Encolpe Degoute)
+
+  * page template cleanups and syntax fixes (Encolpe Degoute)
+
+General
+  * add a DEBUG logging function
+
+
+
+Zwiki 0.46.0 2005/10/01
+=======================
+
+Per-user mailout policy, skins reorganization, plugin architecture
+enhancements, support for boring pages, wicked link syntax, favicons and
+separate create form, better logging, many code cleanups & bugfixes.
+
+Upgrade notes
+    To make your rss feeds and zwiki.org-style blog listings less
+    junky, do SomePage/setupCatalog to add the new isBoring index.
+
+    An mailout_policy folder property with value "edits" overrides the
+    per-user policy (see below), but this may be dropped in a future
+    release.
+    
+Installing
+  * fix __implements__ attribute error when CMF is not installed (#1149, Warren)
+
+  * make Zwiki startup more robust with strange locales/strange pythons (#1158)
+
+  * make zmi add wiki form use a btreefolder
+
+  * don't break when adding a wiki with id home (#591)
+
+  * drop unnecessary loading plugins message at startup
+
+  * don't log a warning at startup when the system locale is None
+
+  * clarify missing PTS warning at startup
+
+  * make fit import failure warning at startup less troubling
+
+  * fix a case where a page upgrade wouldn't get logged
+
+  * don't break when displaying a page whose page type has been uninstalled
+
+Configuring
+  * wiki subscriber mail-out, rss feeds and blog listings will
+    ignore boring pages TestPage, SandBox and their offspring, by
+    default. You can configure different pages in a boring_pages lines
+    folder property, one per line. An isBoring index has been added to
+    the standard catalog fields, run /setupCatalog to add it.
+
+  * set a true use_double_parenthesis_links property to enable
+    Wicked-style double parenthesis syntax for freeform wiki links.
+    This is for world users who can't easily type [].
+
+  * rename and delete no longer check for a username in addition to
+    the permissions (though the skin may still hide them without a
+    username.)
+
+Browsing
+  * the /changes_rss feed now shows the edit diff
+
+  * misc_/* image paths are now relative to be more robust with vhosting (#689)
+
+Editing
+  * be sure to create our own recycle_bin even if the parent folder has one
+
+  * purple numbers now disabled by default
+
+  * allow create to be called directly by page management form
+    
+Mail
+  * add "all edits" checkboxes to subscribeform. Zwiki can now send
+    comments to some, edits to others.
+
+  * reparent now also sends a mailout
+
+  * remove (new), add (edit) in mailout subjects for clarity
+
+  * just say "links updated" in rename mailout subject
+    
+Issue tracking
+  * use more consistent (property change) in issue mailouts, and don't say it if no property changed
+
+  * /issuebrowser was showing filter issues form
+
+General - skins
+  * big skins reorganization to reduce duplication
+
+  * use a separate createform skin template for creating pages if present
+
+  * hide most of the wiki action links by default in standard skin
+
+  * tweak page management form layout in standard skin
+
+  * drop unnecessary extra text from page management form in cmf/plone
+
+  * remove old _ and = access keys from /showAccessKeys
+
+  * register just the zwiki_standard skin with FilesystemSiteDirectory when installed
+
+  * italicise log notes in recent changes
+
+  * if a 'favicon' object is present, set it as the page icon in the standard skin
+
+  * don't let recentchanges break when a page type has been uninstalled
+
+  * use the word "page" instead of "subtopic" in the page management form
+
+  * don't let non-template objects with the same id hide our skin templates; improve bad template error
+
+  * remove the h2 bottom border style
+
+  * remove stray commas in page templates causing log warnings
+
+  * drop uploaded and wikinav_portlet templates from plone skin
+
+General
+  * split content/ into wikis/ and scripts/
+
+  * strip html tags in the page summary, and add renderedSummary which does formatting and linking
+
+  * rename all pagetypes' renderXIn methods to format
+
+  * plugins can now be packages or files
+
+  * plugins can now override any method in the product core
+
+  * add support for emacs-style "hooks" for customization by plugins
+
+
+Zwiki 0.45.0 2005/09/01
+=======================
+
+Robustness fixes, Plone 2.1 compatibility fixes, simplifications, CMF
+metadata support.
+
+Upgrade notes
+    You might want to delete the "outline" object using the ZMI,
+    allowing Zwiki to create a more ZMI-compliant one. Note this will
+    lose any manual re-ordering of subtopics you may have done.
+
+    The default colour for "serious" issues is lighter. This will take
+    effect for each issue page as it is edited. To make all pages show
+    the correct colour right away, visit SomePage/upgradeAll in your
+    browser.
+    
+Installing
+  * make the outline cache replaceable to avoid errors during
+    migration of plone 2.1rc<3 sites (#1143, SM, alecm)
+
+  * make catalog lookup more robust when there is another object
+    named Catalog (#1132, SM, Tim Olsen)
+
+  * catch errors when importing page types and plugins at startup
+    (#809, #1148)
+
+  * make fit import error at startup less verbose (#1054)
+
+Configuring
+  * make the outline cache object fully ZMI-manageable (#1144)
+
+  * drop support for alternate catalog names via SITE_CATALOG property
+    
+  * drop support for overriding the contents view with a SiteMap page
+
+  * don't update page creation times when moving/renaming/importing
+    in the ZMI
+
+Editing
+  * fix page creation/editing breakage in plone 2.1 due to explicit
+    acquisition (#1137, SM, alecm)
+
+  * enable CMF/Plone document metadata support (jbb)
+
+Issue tracking
+  * make the serious issue default colour lighter
+    
+  * allow issues without numbers (with at least a "status" property)
+
+General - i18n
+  * remove unnecessary -en po files
+
+  * add missing headers for german po
+
+  * drop unnecessary -PT for pt po files
+
+  * fix space-separated i18n attributes to avoid deprecation warnings on startup
+
+General - skins
+  * make hasSkinTemplate check filesystem templates, such as the
+    alternate subtopics template (#1113, Mark Ferrell, SM)
+
+  * drop the special style for ratings, for now
+
+General
+  * allow create to work without a request, for debugging
+
+  * merge moin_support.py with moin.py for easier handling
+
+  * don't bother noting pre-renders in the transaction log (#948)
+
+  * drop unused getSkinTemplateWithDefault method
+
+
+Zwiki 0.44.0 2005/08/02
+=======================
+
+Drop full/simple/minimal and simplify the standard skin, more robust wiki
+contents.
+
+Upgrade notes
+    Customized skins which use the old wikipage_macros template will
+    stop working with this release, as discussed in the 0.42 upgrade 
+    notes. If this affects you, you'll need to make the changes 
+    described there now.
+    
+Page hierarchy
+  * clarify updateWikiOutline and call it on every page view to
+    avoid out of date contents and hopefully avoid the need to call it
+    manually
+    
+General - skins
+  * drop full/simple/minimal modes from the standard skin. 
+    (cf http://zwiki.org/UserDiscussion#msg20050726150738-0700@zwiki.org)
+
+  * drop backwards compatibility support for pre-0.42 wikipage_macros
+
+  * drop the background colour in top and bottom bars
+
+  * wikipage template cleanups
+
+  * rewrote and redocumented setskin, fixed permission declaration
+    not sure I accomplished much.
+
+  * (commented out) if a "background.jpg" object is present, use it as 
+    the body background image (for the main page view only)
+
+
+Zwiki 0.43.0 2005/07/01
+=======================
+
+Spanish and chinese translation updates, and a small fix for setupDtmlMethods.
+
+Upgrade notes
+    To get fuzzy urls working in (public) plone zwikis, visit
+    SomePage/setupDtmlMethods after this upgrade.
+    
+Configuring
+  * make setupDtmlMethods create a standard_error_message in plone (#1117).
+
+General - i18n
+  * Updated zh-TW & zh-CN po files (T.C. Chou)
+
+  * spanish translation updates (Gaspar Quiles)
+
+
+Zwiki 0.42.0 2005/06/04
+=======================
+
+Skin templates cleanup, message-board-style subtopics display,
+miscellaneous fixes, new portuguese translation and russian/german
+updates.
+
+Upgrade notes
+    Skin macros have been moved from wikipage_macros to wikipage, and
+    some have been renamed. Also some CSS classes have been renamed.
+
+    Customised skin templates should continue to work normally for
+    now. If you have any, please replace any macro-related occurrences
+    of the following strings in your templates:
+    
+  * wikipage_macros -> wikipage_template
+  * quickaccesskeys -> accesskeys
+  * quicklinks    -> wikilinks
+  * editlinks     -> pagelinks
+  * pagename    -> pagenameonly
+
+    The following CSS class has been renamed, you'll need to update
+    any customised zwiki stylesheets accordingly:
+
+  * quicklinks    -> wikilinks
+
+    Also a few macros and classes that no-one was using have been
+    removed.  I expect to remove the backwards compatibility support
+    for old macros in the next release or three.
+
+    The standard skin directory has been renamed to zwiki_standard.
+    In CMF/Plone sites, you should uninstall and re-install Zwiki in
+    plone setup (the upgrade link may not work) so that zwiki_standard
+    appears in the portal_skins tool. You can then delete
+    portal_skins/standard and portal_skins/zmi in the ZMI.
+    
+Editing
+  * be more robust when saving a page with undated comments (#1103)
+
+  * after voting, redirect to the referer instead of the rated page
+
+Page hierarchy
+  * make subtopics template-driven, selectable via subtopics_style
+    property, and dtml-aware. Two styles are now included: "outline"
+    and "board". The latter shows view counts if mxmCounter is
+    installed. See admin guide.
+
+Mail
+  * also recognise a MaildropHost as mailhost
+
+  * allow mail properties to be configured on a per-page basis
+
+Issue tracking
+  * add a full comment form to the issue properties form
+
+General - i18n
+  * russian translation updates for the standard skin (Michael Krishtopa)
+
+  * german translation updates (Jens Nachtigall)
+
+  * new portuguese translation (João Villa-Lobos)
+
+  * update pot and po files
+
+  * misc i18n fixes
+
+General - skins
+  * merge wikipage_macros into wikipage template
+
+  * macro & stylesheet cleanups; use macro for form headings
+
+  * inline macros in zwiki_plone's wikipage template, remove
+    wikipage_header and wikipage_footer
+
+  * rename issuepropertiesformdtml.dtml to issuepropertiesform.dtml 
+
+  * rename noindex slot to searchtags
+
+  * rename quickaccesskeys macro to accesskeys
+
+  * rename quicklinks macro and CSS class to wikilinks
+
+  * rename editlinks macro to pagelinks
+
+  * rename pagename macro to pagenameonly
+
+  * rename pagemanagement macro to pagemanagementform
+
+  * rename standard/ to zwiki_standard/ to be more plone-friendly
+
+  * move skins/zmi/* to skins/zwiki_standard/ to be more plone-friendly
+
+  * change to upper case for View _h_istory (Jens Nachtigall, #1081)
+
+  * add "Revert to this" button in plone diff form as in standard
+    skin (Jens Nachtigall)
+
+  * clarify revert button wording in both skins
+
+  * don't call pageUrl so many times in wikipage
+    Bob was able to measure some speedup from doing this. I've
+    redone his patch for the cleaned up template. However I believe
+    it's necessary to define pageurl again in each macro where it's
+    used, so it's in scope for other templates using the macro, so
+    it's still called a few times per page view. (Bob McElrath,
+    Simon Michael)
+
+  * hide some urls and things when pages are printed, (anonymous, #1110)
+
+  * add a pagesByType pythonscript to content/misc
+
+General
+  * fix and update broken/failing tests, make all tests pass again
+    (#1104, #1049)
+
+  * fix a TypeError and AttributeError when CMFMember is used
+    (Jens Nachtigall)
+
+  * another robustness fix for isEmailAddress and emailAddressFrom
+
+  * make pageType and pageTypeId public, for troubleshooting
+
+  * remove no longer used (and broken) wikiOutlineFromParents
+
+  * remove _createFileOrImage's unused parent argument
+
+  * tweak requestHasSomeId, add userIsIdentified alias
+
+
+
+Zwiki 0.41.0 2005/05/01
+=======================
+
+Some anti-spam features, skin fixes and translation updates.
+
+Upgrade notes
+    Translations may be somewhat in flux this release.
+    
+Configuring
+  * restrict external links: if a max_anonymous_links int property
+    is defined, edits from unidentified users (with no username)
+    containing more than that number of http:// links will be refused
+    and logged
+
+  * delayed indexing: pages now include the NOINDEX meta tag for 24
+    hours after an edit, to reduce the chance of spam links being
+    indexed by search engines.
+
+Browsing
+  * show page source links when using thorough search, to help with
+    spam cleanup
+
+Mail
+  * make subscribe form help reflect the comments/edits mailout policy
+     (Jens Nachtigall)
+
+  * AnonymousUserSubscriptionInPlone (Jens Nachtigall)
+    fixes #878 anonymous subscription in cmf/plone subscribes "Anonymous User"
+
+  * br_for_subscribed_pages_list_on_subscribeform (Jens Nachtigall)
+    If one is subscribed to several pages, theses pages are
+    on the same line, which looks confusing. Now it is done as
+    with the page_subscribers list on the very same subscribeform,
+    ie an "<br />" is inserted between each page name.
+
+General - i18n
+  * regenerate pot and po files, and this time with up-to-date
+    Default comments (#1093, SM, Jens Nachtigall)
+
+  * mark_PREVIEW_as_translatable (Jens Nachtigall)
+
+  * chinese translation updates (T.C. Chou)
+
+  * spanish translation updates (Gaspar Quiles)
+
+General - skins
+  * subscribeform_remove-unneccessary-span-tags (Jens Nachtigall)
+
+  * new api method: lastEditIntervalInHours
+    
+
+Zwiki 0.40.0 2005/04/01
+=======================
+
+Bugfixes, new japanese translation, chinese translation updates, new
+search option.
+
+Upgrade notes
+    This fixes a high-profile known issue in 0.39, #1062. If you
+    didn't already find the issue page and workaround, upgrade to this
+    version to fix it.
+    
+Browsing
+  * add a "thorough" non-catalog search to search form, commented
+    out (for spam hunting)
+
+Editing
+  * fix the keys attribute error when creating pages in plone (#1062)
+
+  * deleting a top-level page redirects to the front page again; new
+    upUrl method (#917, Martijn Pieters, SM)
+
+Issue tracking
+  * no bogus property change. Some very aggressive search engines
+    (spiders) seem to be following form action="xxxx" references in
+    pages as well as the usual href links. As a result probes by
+    such greedy theives can cause unexpected changes to wiki web
+    pages. One such example recently has been the triggering of the
+    Change button on the Issue pages.  The script
+    changeIssueProperties should be more careful not to record any
+    change if the Change action is triggered with no actually
+    changes. (Bill Page)
+
+General - i18n
+  * new japanese translation (Masaya Kato, Manabu Terada, Yoshiki
+    Shibukawa, Takayuki Shimizukawa, Junya Ogino, Takanori Suzuki)
+
+  * chinese translation updates (T.C. Chou)
+
+  * updated all po files from latest pot
+
+General - skins
+  * the site_logo folder property didn't work in plone
+
+
+
+Zwiki 0.39.0 2005/03/01
+=======================
+
+Search improvements, subtopics ordering, style tweaks, bugfixes.
+
+Upgrade notes
+    To remove excess search keywords from existing zwiki-containing
+    plone sites, reindex and replace the Subject index and metadata in
+    portal_catalog in the ZMI.
+
+    For best search functionality, you may need to /setupCatalog
+    and/or upgrade or reconfigure your text indexes. See
+    http://zwiki.org/1036 for more info.
+
+    If you have customized the standard skin templates or stylesheet,
+    note a number of CSS ids are now classes.
+    
+Browsing
+  * SearchPage/searchpage form cleanups, robustness fixes, better
+    results, google search (#1036)
+
+  * don't create so many search keywords in plone (#1059)
+
+Editing
+  * set RST error reporting level to 2 by default (#992, Stefan Rank)
+
+Page hierarchy
+  * support subtopics reordering with a backlinks UI and new reorder
+    method (#1044)
+
+  * preserve page hierarchy through folder renames; the 'outline'
+    information object is now visible in the ZMI and permanent (#728)
+
+  * don't redirect after /updateWikiOutline, because it confuses
+    first page creation in plone (#1028, huron)
+    
+General - skins
+  * don't add left & right whitespace margins in default skin any
+    more
+
+  * avoid ids for css-usage where possible (Stefan Rank)
+
+  * little typo in css eliminated formfield(s) background color
+    setting (Stefan Rank)
+
+  * underline h2s, gnome-style, shrink them a bit, and add slight
+    whitespace above
+
+  * don't reduce default font size in stylesheet
+
+  * tweak access key help
+
+
+Zwiki 0.38.0 2005/02/01
+=======================
+
+New issuebrowser/IssueBrowser form, preliminary built-in RSS
+support, bugfixes.
+
+Upgrade notes
+    There have been changes to the zwiki catalog fields.  After
+    upgrading, if your wikis use a catalog or are in a CMF/plone site,
+    visit FRONTPAGE/setupCatalog, or if issue tracking is enabled,
+    visit FRONTPAGE/setupTracker, to ensure your catalog is configured
+    for best large-wiki performance.
+    
+    index_object's arguments have changed and the reindex_object and
+    updateCatalog methods are deprecated.
+
+    As noted below, free form links no longer try so hard to find
+    old-style IssueNo issue pages, so if you have broken links of this
+    kind, upgrade your issue page names (/upgradeAll).
+    
+Configuring
+  * fix dependency on /setupTracker for good large-wiki performance;
+    /setupCatalog is now sufficient (#993)
+
+  * be compatible with plone's default_page lines property (#914)
+
+Browsing
+  * preliminary built-in RSS support - FRONTPAGE/pages_rss, /changes_rss
+
+  * freeform links no longer look for both old and new-style issues;
+    a slight (20%) speedup for rendering freeform links
+
+Issue tracking
+  * fix sorting issues by number (#934)
+
+  * issuebrowser/IssueBrowser form for reviewing open issues
+
+  * make closed issues greener.. may be different on your screen,
+    feedback welcome
+
+  * hide zeros to make filter issues matrix clearer
+
+  * try to improve spacing glitch with dtml-translate on filter issues
+
+Fit tests
+  * just log a fit import warning instead of displaying on the page
+
+General - i18n
+  * i18n (global and french) for issue tracker in plone -
+    i18n in plone skin require some i18n elements (for instance the
+    so called 'contentaction' items) to be in zwiki-plone-* as well
+    (huron)
+
+General
+  * catalog awareness cleanups
+
+  * make setskin links harmless for anonymous users and bots,
+    instead of logging errors (#1010)
+
+
+Zwiki 0.37.0 2005/01/02
+=======================
+
+Improved rating form, a file -> wiki page import tool, chinese & hungarian
+translation updates, bug fixes.
+
+    Last release was 0.37rc1 on 11/30; there was no december release.
+    
+Editing
+  * avoid creating both pages when you rename during page creation
+    drop the leaveplaceholder and updatebacklinks arguments from
+    create().  Changing the page name in the create form now always
+    updatesbacklinks, never leaves a placeholder.
+
+Rating
+  * rating could fail when there was only one vote
+
+  * make rating's average a little more accurate
+
+Mail
+  * workaround for clumsy mailhost lookup (#983)
+
+Issue tracking
+  * don't match xml/html character entities as hash number issue links (Stefan Rank)
+
+General - i18n
+  * hungarian translation updates (Jaroli József)
+
+  * po file typo (T.C. Chou)
+
+General - skins
+  * use canonicaIdFrom to help link user names in recent changes
+
+  * change RecentChanges ZCatalog query-style to avoid deprecation warning (Stefan Rank)
+
+General
+  * add tools folder and a basic import-files-to-wiki utility
+
+
+Zwiki 0.37.0rc1 2004/11/30
+==========================
+
+Page hierarchy
+  * make updateWikiOutline redirect to the updated contents view,
+    and provide an easier alias: updatecontents
+
+  * don't log a traceback when deleting a page with out-of-date outline cache
+
+Rating
+  * new compact rating form at top right. Unrated pages now have
+    rating 1 by default.
+
+Mail
+  * mailin: don't log incoming message text or traceback for missing text part
+
+  * make mailout logging less verbose
+
+  * fix a bug preventing subscribe link from appearing when
+    mailhost's id is not 'MailHost'
+
+General - i18n
+  * zh-TW and zh-CN translation updates (T.C. Chou)
+
+  * add missing metadata to finnish po files
+
+General - skins
+  * close a cross-site scripting vulnerability in standard error message (SSA-20041122-12, #925, ChrisW)
+
+  * Hide web only elements when printing from plone (Michael Twomey)
+    When printing from plone certain elements are visible on the
+    printed page, especially the access links. With the default
+    plone print style
+    (plonePrint.css) all links get expanded to full URLs which
+    results in a lot of useless junk at the top of the screen. This
+    patch adds a few plone related CSS classes to certain sections
+    of the page which in turn ensures they aren't visible when
+    printed.  This has no effect on browsers which aren't aware of
+    the print style sheet. The access keys still work fine in
+    FireFox 1.0.
+
+  * fix html title in plone sites
+
+  * rearrange/reword wiki actions in cmf/plone, drop filter issues action
+
+  * tweak page management help in cmf/plone
+
+  * display site_header in standard skin header, if present
+
+
+
+Zwiki 0.36.2 2004/11/17
+=======================
+
+Installing/upgrading
+  * another fix for moin regexp encoding at startup (#963,#971,#972)
+
+
+Zwiki 0.36.1 2004/11/14
+=======================
+
+Installing/upgrading
+  * fix zwiki startup on systems with locale and non-utf-8 encoding (#963)
+
+
+Zwiki 0.36.0 2004/10/31
+=======================
+
+Skin switching in CMF/Plone, better MoinMoin markup support, edit preview,
+easier issue page names and links, russian & hebrew translations,
+bugfixes.
+    
+Upgrade notes
+    Skin switching hotkeys have changed slightly
+
+    Issue pages have a new #N naming scheme. Your old IssueNo pages
+    will still work; upgradeAll will rename them all.
+
+    We now add an optional Zwiki skin in CMF/Plone sites at install
+    time; if you want to enable skin switching within CMF/Plone,
+    re-install Zwiki in plone setup -> add/remove products 
+    
+Installing/upgrading
+  * fix startup problem due to path separator on windows (Stefan Rank)
+
+  * upgradeAll: log elapsed time (Bob McElrath)
+
+  * upgradeAll: upgrade issue pages to new short names by default
+
+  * upgradeAll: replace partial_commit flag with a numeric batch argument
+
+  * upgradeAll: reindex every page, as well; slower but more thorough
+
+  * upgradeAll: log total number of pages
+
+  * simplify upgradeAll & upgrade, do less committing
+
+Creating/configuring
+  * show subtopics is on by default; use a false show_subtopics boolean property to disable
+
+  * make add zwiki web use a BTreeFolder2 when possible (untested)
+
+  * don't send mail when setupTracker creates dtml pages
+
+Browsing
+  * adjust skin switching keys, allow switching between
+    (uncustomized) plone and standard skin in CMF/Plone sites
+    (re-install zwiki and try alt -)
+
+  * fix the diff link in "last edited by"
+
+  * user options: remove unnecessary options; don't show
+    logo/heading, consistent with other forms
+
+Editing
+  * don't require a username to show page management form
+
+  * page management form permission-sensitivity and text improvements
+
+  * plone editform: call page format "page type" like everywhere
+    else, list WWML page type along with the rest, add a cancel
+    button as in standard skin
+
+  * don't display the page name twice when you cancel an edit
+
+  * improved moin markup support: replace the old moin markup code
+    with actual MoinMoin code (bounty from Canonical)
+
+  * add preview button in editform (#933) (bounty from Canonical)
+
+  * fix a case where renaming could fail due to out of date wiki outline
+
+Page hierarchy
+  * more skin cleanups; allow reparenting via backlinks in plone and in minimal mode
+
+  * reparenting fixes: prevent the first page appearing as an extra
+    parent, handle old tuple parents properties better (#952)
+
+Mail
+  * mailin: once again post messages without a page name to a
+    default page, unless default_mailin_page property is blank
+
+  * be smarter about finding a MailHost; a page of that
+    id will no longer break mail-out
+
+Issue tracking
+  * use short #N names for new issue pages; old IssueNo pages still
+    supported but deprecated; upgradeAll will rename them
+
+  * issuetracker: layout tweaks, also list severity counts
+
+  * filterissues: show category-severity matrix, instead of
+    category-status; I think this may be a more useful default
+
+  * filterissues: alter issue counts in totals matrix based on severity selection
+
+  * filterissues: fix this old chestnut again.. a FilterIssues
+    page's action should point to itself, not to the template
+
+Fit tests
+  * fit: display a nice warning at the top of the page when there are fit tables and we can't import fit
+
+General - i18n
+  * update italian translation (Lele Gaifax)
+
+  * new russian translation (Denis Mishunoff)
+
+  * new hebrew translation (Ofer Weisglass)
+
+  * hack i18n for unit tests, possible slowdown ?
+
+General
+  * new method: wikiPath()
+
+  * rename protectEmailAddresses
+
+
+Zwiki 0.35.0 2004/10/01
+=======================
+
+Spaced wikiname display, a basic MoinMoin page type, better search engine
+indexability, i18n updates, bugfixes.
+    
+Upgrade notes
+    Nothing special to do.
+    
+General
+  * partial MoinMoin markup support (Chad Miller/Simon Michael)
+
+  * display wikinames with spaces when there is a true
+    'space_wikinames' folder property
+
+  * Don't change zope's current working directory (IssueNo0919, Kai
+    Hoppert/Bob McElrath)
+
+  * allow page types or a 'zwiki_content_type' property to set the
+    HTTP content-type header (Bob McElrath/Simon Michael)
+
+  * give a warning message rather than a python error for edits
+    containing banned links (Bob McElrath/Simon Michael)
+
+  * omit error-generating Structured Text tables instead of showing
+    a traceback (IssueNo0692)
+
+  * increase default summary size to 200 letters
+
+  * new methods: spacedPageName, Subject, Description
+
+Skins and content
+  * provide keywords and description meta headers for better search
+    engine listings
+
+  * recent changes: make period buttons lower case
+
+  * plone: fix double doctype header (Bob McElrath)
+
+  * plone: add External Editor action for Wiki Page type (Bob McElrath)
+
+  * don't show "no subscribers" by the add comment button
+
+  * make sure page- & skin-based tracker forms are all up to date again
+
+Mail and comments
+  * decode quoted printable mailins (get rid of =20's) (Bob McElrath)
+
+I18n
+  * removed the workaround to fix utf-8 encoding with PTS, as I
+    seem to no longer need it; if your utf-8 encoding breaks, please
+    see I18nSupport.py and report
+
+  * i18n updates (Nicolas Laurent)
+
+  * french translation updates (Nicolas Laurent)
+
+  * german translation updates (Andreas Mayer)
+
+  * new partial finnish translation (Jyrki Kuoppala)
+
+  * internationalise "new" in mailout subjects
+
+  * fix incorrect value;title syntax in page management form i18n
+    (Bob McElrath)
+
+
+
+Zwiki 0.34.0 2004/09/02
+=======================
+
+Beginnings of a plugin architecture; mailin simplifications and
+enhancements; new hungarian translation; miscellaneous skin enhancements
+and bugfixes.
+
+Upgrade notes
+    Legacy support for the posting_policy property has been dropped,
+    use mailin_policy instead.
+
+    The mailin method no longer supports arguments other than the
+    message itself; control it with folder properties and choice of
+    mail alias instead.
+    
+General
+  * add firstPageUrl & lastPageUrl methods
+
+  * include() dtml utility now supports show_subtopics keyword argument
+
+  * fix bug preventing use of show_subtopics keyword in urls
+
+  * add URL to the list of ids to avoid.. it breaks standard_error_message at least
+
+  * code refactoring to support a more modular architecture;
+    PurpleNumbers, Fit, Rating, Regulations and Tracker support are
+    now (somewhat) in plugins subdirectory
+
+  * link uploaded files properly on RST pages (Marius Gedminas, IssueNo0814)
+
+  * do away with the unnecessary ALLOWED_PAGE_TYPES list as Bob suggested
+
+  * Allow empty RemoteWikiURL name (Bill Page)
+    It is sometimes useful to allow the remoteURLname to be
+    empty. That is we give a WikiName that looks like it is
+    remote but really it is not (at least not yet ... :).
+    The old code caused a : to be inserted.
+
+  * comment out unused code breaking mailout (IssueNo0890)
+
+  * also check comment subjects and log notes for urls from the
+    banned_links list
+
+  * likely fix for false contents in new wikis (IssueNo0903)
+
+Skins and content
+  * make hidden access-key links conditional like the visible ones
+    avoids errors in the logs due to spiders viewing non-existent tracker, eg
+
+  * let next/prev access keys wrap around when on last/first page
+
+  * show "last edited by" in minimal mode
+
+  * make the discussion link look for UserDiscussion before GeneralDiscussion
+
+  * plone diffform: use n & p access keys for next/previous
+
+  * diff form revert button (Bob McElrath)
+    Updated revert patch:
+    2) Add "Changes in revision N" to header
+    3) Add "Log note:"
+    4) Add "Return to page" button.
+    5) Grey out next/prev buttons on first/last diff.
+
+  * html tweaks to support expandable bullet list patch
+
+  * fix double skin with wikipage() method in cmf/plone (IssueNo0888)
+
+Mail and comments
+  * mailin: more code cleanup, add experimental spam url reporting.
+    Sending mail to a mailin address of the form spam at ... will add all
+    urls found in the message to the banned_links folder property, if
+    there is one.
+
+  * mailin: drop support for configuration via arguments
+
+  * mailin: support default_mailin_page folder property
+
+  * mailin: update doc, drop support for old posting_policy property
+
+  * mailin: don't require an initial word boundary when matching mailin aliases
+
+  * mailin: allow partial bracketed page names in subjects
+
+  * don't send out mail-outs which have an empty body
+
+Tracker
+  * make createNextIssue choose correct issue number in authenticated wikis
+
+  * fix a python 2.3ism causing issue tracker to fail with zope 2.6
+    (IssueNo0897, koegler)
+
+I18n
+  * add utf-8 content-type header to mail-outs
+
+  * new hungarian translation (József Jároli)
+
+  * german translation updates (Andreas Mayer)
+
+  * dutch translation updates (Jaap Noordzij)
+
+  * brazilian translation updates (Jean Rodrigo Ferri)
+
+    
+Zwiki 0.33.0 2004/08/02
+=======================
+
+Minor fixes, mail code cleanups, translation updates.
+
+Upgrade notes
+    No special upgrade issues.
+    
+General
+  * allow page types to change the HTTP content-type header (Bob McElrath)
+
+  * make _ work during unit tests again
+
+Skins and content
+  * fix unnecessary python 2.3-ism in editform
+
+  * zope 2.6 compatibility fix for full/simple/minimal getattr error
+    (IssueNo0875)
+
+Mail and comments
+  * refactor mailin, sendMailTo and other mail code
+
+  * mailin policy change: messages with no page name in subject are
+    now discarded by default
+
+  * fixes for mailin of new page/new issue (IssueNo0879)
+
+  * use "anonymous" as real name for anonymous mailouts
+
+Tracker
+  * createNextIssue updates: return the page name, support
+    sendmail=0 argument
+
+  * support pages(isIssue=1) when there is no catalog
+
+I18n
+  * updated the italian message catalog for 0.32.0 (Lele Gaifax)
+
+  * polish translation updates (Jakub Wisniowski)
+
+  * chinese transation updates (T.C.Chou)
+
+
+Zwiki 0.32.0 2004/07/05
+=======================
+
+Zwiki's skin is about fully internationalised; translation updates, new
+polish, dutch & german translations; skin cleanups; pluggable page types;
+refactoring, bugfixes.
+
+Upgrade notes
+    zwiki_plone/wikipage_view template has been renamed to wikipage
+
+    If you use a character encoding other than utf-8: zwiki has been
+    hard-coding utf-8 since 0.31 - see IssueNo0855.
+    
+General
+  * page types refactoring - moved to separate modules in pagetypes/,
+    new short ids, pluggable API docs
+
+  * simplify CMF/Plone rendering and page view url
+
+  * fix "some permissions had errors" message (IssueNo0842)
+
+  * don't let any failure to update links stop a rename
+
+  * don't let an empty allowed_page_types property break page creation
+
+Skins and content
+  * allow python scripts in wiki templates (Bob McElrath)
+
+  * tighten up page management form layout and add a subtopic creation button
+
+  * new include() convenience method for dtml ("dtml-var include(SomePage)")
+
+  * diffform: full history button was not checking correct permission (Bob McElrath)
+
+  * rename shade2 class to formfield, use consistent background shading in form elements
+
+  * standard: make form inputs & selects inherit font size
+
+  * standard: remove subtopics option from editform, use ZMI instead
+
+  * zwiki_plone: rename wikipage_view to wikipage to be at least self-consistent
+
+  * zwiki_plone: remove unused wiki_icon.gif
+
+  * xhtml fixes (Bob McElrath, Simon Michael)
+
+Mail and comments
+  * make citation formatting in comments more robust (IssueNo0863)
+
+  * allow a per-page mailout_policy (Bob McElrath)
+
+  * fix mailout of edit with empty log note via PUT (Bob McElrath)
+
+  * subscribeform: remove duplicate you are not subscribed
+
+  * Do not add extra space on mailin Subject lines. (Bob McElrath)
+
+Tracker
+  * don't treat all pages beginning with a digit as issues by default
+
+  * make issue tracker layout cleaner and more consistent in standard/plone
+
+  * issue properties form: allow a longer optional note, up to 100 chars
+
+  * disable subtopics display on the IssueTracker page by default when doing /setupTracker?pages=1
+
+I18n
+  * new german translation (Andreas Mayer)
+    
+  * chinese translation updates (T.C.Chou)
+
+  * italian translation updates (Lele Gaifax)
+
+  * french translation updates (Nicolas Laurent)
+
+  * polish translation updates (Jakub Wisniowski)
+
+  * new polish translation (Marek Ciesielski)
+
+  * new dutch translation (Jaap Noordzij)
+
+  * more i18n and fixes in python, page templates and dtml (Jakub Wisniowski, Nicolas Laurent, Simon Michael)
+    
+  * set utf-8 content-type header in dtml also to fix character encoding
+
+  * fix occasional i18n errors by making _() return a string (IssueNo0856)
+
+  * split po files into zwiki and plone domains to fix CMF action
+    translations; translate at run time, not install time;
+    (IssueNo0833)
+
+    
+Zwiki 0.31.0 2004/06/01
+=======================
+
+Much i18n progress including a number of new translations; tracker
+cleanups and usability improvements; permissions fixes; tests, code
+cleanups, bugfixes.
+
+Upgrade notes
+    Similar to 0.30. changeIssueProperties() "title" argument is now
+    "name".
+
+General
+  * always update links by default when renaming (page
+    management form was not)
+
+  * don't show a .svn subdirectory in add wiki form (Lele Gaifax)
+
+  * make image and file links sensitive to page type (IssueNo0737, peterq)
+
+  * fix some missing security declarations in 0.30 (IssueNo0796)
+
+  * make page rating not require python 2.3 (IssueNo0794)
+
+  * better comment formatting on reST pages (Lele Gaifax)
+
+  * support reST in Zope 2.7.1 (Lele Gaifax)
+
+  * cmf/plone: forcing a sole page's name field to FrontPage was unhelpful, remove
+
+  * link banning: edits containing urls in the banned_links property
+    will fail (for spam prevention)
+
+  * make summary() smarter, include only the first paragraph by default
+
+  * create() can now also set parents
+
+I18n
+  * plone editform: don't show duplicate pages types due to i18n
+    problem (IssueNo0823)
+
+  * standard and plone skin i18n (foenyx, simon)
+
+  * french translation updates (foenyx)
+
+  * italian translation (Lele Gaifax)
+
+  * portuguese-brazilian translation (Jean Rodrigo Ferri)
+
+  * traditional and simplified chinese translations (T.C. Chou)
+
+  * always send the HTTP header to help character encoding negotiation
+
+  * renamed LocalizerSupport to I18nSupport; we now try to use
+    PlacelessTranslationService first
+
+  * PTS-based i18n support for python code and DTML
+
+  * fully automate pot extraction
+
+Skins and content
+  * show current page in contents by default again
+    This is much more convenient for a human user. The drawback is
+    more hits to contents (one for each page) from robots which treat
+    #ref as a separate url.
+
+  * defaultPage() and the wiki navigation links were ignoring a
+    default_page folder property
+
+  * standard wikipage.pt: add a left/right layout table around ratingform
+
+  * make plone action urls point to customized pages if present (IssueNo0786)
+
+  * use grey background for pre and code sections by default
+
+  * include zwiki.org percentage styles
+
+  * make in-reply-to indicator more discreet
+
+  * explicitly set foreground and background color, for people with dark backgrounds
+
+  * simplify ratingform template
+
+  * rename zmi forms and move to skins/zmi/
+
+Mail and comments
+  * make comment subjects appear in recent changes again (IssueNo0821)
+
+  * don't discard mail to TestPage page subscribers (IssueNo0672)
+
+  * make emailAddressFrom() smarter; handle non-cmf-members who have
+    an email address pref; highlight problem users in the recipient
+    list instead of quietly dropping them
+
+Tracker
+  * usability & page layout improvements; highlight current sort &
+    filter options
+
+  * always parent new issues either under IssueTracker or at the top
+    level (not all over the wiki)
+
+  * protect issue properties with zwiki edit permission (IssueNo0278)
+
+  * don't require rename permission to change other issue properties
+
+  * change issue "description" to "name"
+
+  * new issuepropertiesform skin method & template
+
+  * simplify and clean up issue tracker & filter issues DTML
+
+  * tracker code refactoring; move tracker setup code to Tracker.py;
+    new methods issueNumber(), issueName()
+
+  * support for issue page names beginning with a number or #number
+    (commented out)
+
+  * removed support for custom 'isIssue' python script
+
+  * add missing tracker unit tests file
+
+    
+Zwiki 0.30 2004/05/03
+=====================
+
+Page rating, fix epoz support, bugfixes, code cleanups, i18n work, a
+french translation.
+
+Upgrade notes
+    You should probably remove the 'links' field from your catalog's
+    indexes and metadata now as it isn't needed and leads to slowdowns
+    in Plone+Epoz sites (IssueNo0784).
+    
+    If you want to do zopewiki-style queries on page ratings, you'll
+    need to add the new rating and voteCount fields to your catalog.
+    Running PAGE/setupCatalog?reindex= will take care of this.
+
+    If you have Localizer installed, you may need to apply the
+    workaround at http://zwiki.org/IssueNo0793 .
+    
+General
+  * page rating support: new methods rating, voteCount, and
+    ratingform are supported and enabled in the standard skin by the
+    'Zwiki: Rate pages' permission. rating and voteCount are cataloged
+    by default.
+
+  * our 'links' catalog field caused slowdowns with plone+epoz, try
+    life without it (IssueNo0784)
+
+  * obey LEAVE_PLACEHOLDER default when renaming via edit form
+    (IssueNo0579)
+
+  * renaming to a page name beginning or ending with spaces was not
+    reparenting the children
+
+  * make parent and firstParent more robust (IssueNo0788)
+
+  * "completed" log messages for long admin operations (eg cataloging)
+
+  * make Url methods fall back to '' instead of None
+
+  * drop show_navlinks property
+
+  * allow partial page names when reparenting
+
+  * do citation formatting only for >'s at column 0 - this leaves
+    ::-quoted python examples alone, and seems to still catch normal
+    comment citations. It doesn't prevent all unintended citation
+    rendering though. (IssueNo0770)
+
+  * pages named REQUEST, RESPONSE, or Epoz caused problems for zope,
+    possibly breaking the whole wiki (ZMI too). These are now
+    handled safely by adding X to their id.
+
+  * fix page creation with zope 2.6/python 2.1 (IssueNo0777)
+
+  * code refactoring, new tests
+
+Skins and content
+  * fix plone skin breakage due to \ in multiline TAL (IssueNo0792)
+
+  * epoz fixes: make editform work with epoz 0.8, simplify
+    installation, don't show parent page content when creating, remove
+    duplicate source-mode checkbox (IssueNo0773)
+
+  * standard: remove last interfering leave placeholder option
+    (IssueNo0764)
+
+  * french translations (Nicolas Laurent)
+
+  * update po files
+
+  * don't show subscriber count when mailout is disabled, and don't
+    italicise it
+
+  * use small font in the dimtext style
+
+  * contents page heading tweak
+
+  * remove unused navpanel2 macro
+
+  * rename 'default' skin to 'standard'
+
+  * xhtml fixes (Alvaro Cantero, Bob McElrath)
+    
+  * standard: some i18n attributes, html formatting
+
+  * standard: add badtemplate error template
+
+Mail and comments
+  * fix mailin destination with multiline subjects (IssueNo0547)
+
+  * drop fewer_headers feature
+
+  * comment mailouts now appear the same with either 'comments' or
+    'edits' mailout policy.
+
+  * rename MessagesSupport & Messages.py to Comments*; refactor
+    mailin & comment code, use new email lib, new tests
+
+
+Zwiki 0.29 2004/04/01
+=====================
+
+Bugfixes for Zope 2.7 & Plone 2, skin tweaks.
+
+NOTE: immediately following this release I am switching to darcs as
+primary revision control system and considering CVS to be frozen. Please
+see http://zwiki.org/ZwikiCVS for new procedures and discussion.
+
+Upgrade notes
+    Nothing special; check past upgrade notes if appropriate
+
+General
+  * wiki templates (added via ZMI Add ZWiki form) can now import
+    zexp, xml, jpg, png, gif and pt files, and run a setup_WIKITYPE
+    external method if present. This allows, eg, a latex-enabled
+    wiki template to be distributed with the LatexWiki patch.
+    (Bob McElrath)
+
+  * control page creation with add, not edit permission
+
+  * don't let python locale problems prevent product initialization
+    (IssueNo0392, IssueNo0769)
+
+  * fix missing Reparent permission (IssueNo0748, IssueNo0757)
+
+  * wikiOutlineFromParents could break with zope 2.7, fixed (IssueNo0738)
+
+  * be more robust with junk in the catalog when adding/viewing a page (IssueNo0722)
+
+  * fix "must be lazy sequences" error in btree-based folders (IssueNo0713)
+    
+  * include .cvsignore files in CVS
+
+Skins and content
+  * xhtml fixes (bob mcelrath, cyrille lebeaupin)
+
+  * default: show next/up/prev links in full mode by default
+
+  * default: skin template code cleanups
+
+  * default: make sure small fonts are smaller than body
+
+  * default: use "options" instead of preferences, access key "o"
+
+  * default: hide explicit backlinks & diff links again - not needed
+
+  * default: tidier & customizable prev/up/next links
+
+  * default: show parent context in simple mode too
+
+  * default: try the linear parent display in full mode
+
+  * default: default to a smaller font
+
+  * default: tweak margins
+
+  * access keys "," "." "/" for full/simple/minimal
+
+  * access key "m" for subscribeform
+
+  * show wiki contents, not front page, when going up from a top-level page
+
+  * now using PTS-compatible message catalogs in i18n/
+    
+  * tell Epoz to look in epoz/ instead of ./ for it's files for easier setup
+
+Mail and messages
+  * a citations whitespace fix (bob mcelrath)
+
+  * obfuscate email addresses in messages slightly (bob mcelrath)
+
+  * disable mailout formatting (IssueNo0696, bob mcelrath)
+
+  * fix subscribing to the whole wiki (IssueNo0754)
+
+  * tweaks to support ezmlm integration
+
+Tracker
+  * make setupTracker do robust re-indexing like setupCatalog
+
+  * don't let metadataFor and issueColour mistake zodb objects for
+    page properties (IssueNo0732)
+
+
+    
+Zwiki 0.28 2004/03/01
+=====================
+
+Bugfixes, tests, refactoring.
+
+Upgrade notes
+    Nothing special. If your tracker doesn't sort, see below.
+
+General
+  * make wiki outline handling more robust, preventing IssueNo0727
+    and similar (when it exists but is None for some reason, regenerate)
+
+  * new pages were appearing twice (title and id) in the wiki contents 
+
+  * diff no longer triggers python crashes on freebsd
+
+  * make indexing more robust and more verbose during setupCatalog
+
+  * make history transaction notes a little less verbose ("findlinks")
+
+  * don't log "reparenting children" during delete when there aren't
+    any
+
+  * remove old regulations permission
+
+Skins and content
+  * fix traceback when creating/editing pages with recent plone/zope
+    versions (cmf/plone 'allowed_types' global overriding our
+    'allowed_types' define) (IssueNo0726, Christian Heimes)
+    
+  * don't catch and display skin template errors any longer; zope's
+    own traceback is much better
+
+  * default, plone subscribeform: clean up the subscribeform a bit
+    and make consistent in both skins. Display a message when there
+    is no email address. We now try to hide the email field and
+    button when we can use the CMF member email property
+    instead. The logic here is a bit rough and may not work in all
+    situations.
+
+  * do not produce an empty stylesheet, which confuses Firefox
+    EditCSS (Bob McElrath)
+
+  * use a single contents URL (based on the default page) to reduce
+    robot activity
+
+  * make subtopics & comments headings bold, remove overline
+
+  * moved subscribe back to the page tabs area to create better
+    visual separation of "page" and "wiki" operations
+
+  * don't show the subscribe tab in plone if mailout is not enabled
+
+  * basic: default page cleanups
+
+  * include print.dtml, toc.py, view_source.dtml scripts in misc
+
+Mail and messages
+  * performance fix: usernamesFrom was too expensive, occasionally
+    causing plone.org to max out cpu for 10 minutes at a time with
+    it's 7000 users. So now, we don't try so hard to match up email
+    addresses with CMF member ids - subscribers should use one or
+    the other. This should fix it.
+    (Alan & plone team, Simon)
+
+  * correctly render pages containing only messages (Bob McElrath)
+
+Tracker
+  * a tracker created with zope 2.7 would not sort issues (IssueNo0720).
+    Note if you have already created a tracker with 2.7, to fix sorting
+    you'll need to visit PAGEURL/index_object on each issue page.
+
+
+Zwiki 0.27.1 2004-02-06
+=======================
+
+Fixes a couple of problems with 0.27.
+
+General
+  * fix last minute bug causing updateWikiOutline to fail with
+    pageName attribute error (IssueNo0694)
+
+  * don't break if plone 2's document_actions is not present
+    (IssueNo0701)
+
+  * improve robot robustness for large public wikis by 1. removing
+    potentially expensive clearCache and print links from the skins,
+    and 2. making scroll-to-current-page in contents (with it's
+    consequent many unique expensive urls) optional and off by
+    default (IssueNo0699)
+
+
+Zwiki 0.27.0 2004-02-02
+=======================
+
+New, faster page hierarchy implementation; access keys everywhere; page
+management form and action icons in plone; utf-8; bugfixes.
+
+Upgrade notes
+    Two upgrade issues this month:
+
+    If you have non-ascii characters in your page names or content:
+    the default skin used to specify iso-8859-1 character encoding; it
+    now specifies utf-8.  So your wiki's character encoding may
+    change, and non-ascii characters may no longer display
+    correctly. You'll have to convert these manually (see
+    http://zwiki.org/IssueNo0682 for tips).
+
+    If you were running the 0.27cvs code: 
+    you might be unable to view or add pages after upgrading to 0.27
+    final. To fix, visit SOMEPAGE/updateWikiOutline, or /upgradeAll.
+    (If this happens to you and you weren't running 0.27cvs, I'd like
+    to hear from you).
+
+General
+  * page hierarchy is now cached in a wiki Outline object, stored as
+    a (hidden) folder attribute, instead of being generated from the
+    page parents attribute every time. All hierarchy operations
+    should now be fast (so it's safe to enable show_subtopics and
+    show_navlinks in large wikis) and hopefully scalability (eg
+    conflict errors) is no worse.
+    
+  * fixed a reStructuredText import bug with zope 2.7 (IssueNo0687)
+
+  * under rare conditions viewing a page could give 'pagenameandX'
+    attribute error
+
+  * new next/previousPageUrl methods
+
+  * upgradeAll now checks each page's parents information and
+    repairs it if necessary; it also regenerates the saved wiki
+    outline. This restores any pages missing from the contents view.
+    You can also visit /checkParents to fix a single page.
+
+  * revert a mistaken "fix" to
+    manage_afterAdd/afterClone/beforeDelete (IssueNo0684)
+
+Skins and content
+  * the default skin now specifies the utf-8 charset, like
+    zwiki_plone, and the wikiname regular expressions can now handle
+    multi-byte utf-8 encoding. This may cause some page names or
+    wiki content to be displayed incorrectly after upgrading, but we
+    don't attempt any automatic migration right now. (Simon,
+    traldar, Samotnik)
+
+  * added a number of access keys, following w3c guidelines, and
+    made them work in all views, both default and plone skin. Alt-0
+    displays a list.
+
+  * don't hide subtopics in minimal display mode any more;
+    revert to simple "subtopics" heading
+
+  * plone: make document actions (external edit, send to,
+    print) appear on wiki pages (Alexander Limi)
+
+  * plone: clean up the comment form a bit, and show the page
+    management form when the user has permission
+
+  * default, plone: make diffs slightly more bookmarkable
+
+  * default, plone: the useroptions template was not redirecting
+    quite right, so options didn't stick (anonymous)
+    
+Mail and messages
+  * when using "edits" policy, comments weren't sending mailouts
+    (Joachim Bauch)
+
+Tracker
+    
+
+Zwiki 0.26.0 2004-01-02
+=======================
+
+Epoz support, skin layout tweaks, bugfixes.
+
+Upgrade notes
+    No special upgrade issues.
+
+General
+  * wiki links in HTML pages work again (IssueNo0664)
+
+  * simplify and fix locale awareness of bare WikiNames - these
+    should now recognize upper- and lower-case characters defined by
+    the system locale, if configured.
+
+  * possible fix for startup problem with recent zope 2.7 beta
+    (DateTime Syntax Error) (IssueNo0649)
+
+  * add python 2.3 encoding declaration in LocalizerSupport.py
+    to prevent startup warning
+
+Skins and content
+  * default, zwiki_plone: the editform now uses Epoz 0.x, if
+    installed, to edit HTML-only pages in WYSIWYG fashion. To see
+    this, install the Epoz 0.x product; edit one of your pages and
+    change it's type to HTML; edit again to see the new form.  See
+    http://zwiki.org/ZwikiAndEpoz for more.
+    
+  * default: streamline editform and other forms' layout (remove
+    editform tabindex attributes, they only add confusion; make page
+    type more prominent at top right; add cancel button; remove
+    unnecessary large headings)
+
+  * default: include backlinks & diff links in the links panel.
+    It now includes pretty much all site and page views.
+
+  * default: rearrange access keys: use r for recent changes, c for
+    contents, u for (un)subscribe, b for backlinks
+
+  * default: fix minor typos and errors
+
+  * zwiki_plone: add back the by-line in wikipage_view (limi)
+
+  * zwiki_plone editform: update to the new Plone 2 forms format;
+    fix tabindex so it works again; rewrote the help texts (limi)
+
+Mail and messages
+  * some mailing list headers in mailouts were empty when there was
+    no mail_from property. Now they use mail_replyto in that
+    case. (IssueNo0673)
+
+Tracker
+  * disable old broken issue navigation links
+
+
+Zwiki 0.25 2003-12-01
+=====================
+
+Fully-functional non-DTML wikis are now supported and default; refactored
+default skin with macros, CSS and SkinnedFolder support; more zwiki
+features available in CMF/Plone; quicker comments, improved search, easy
+tracker setup, much code refactoring, etc.
+
+Upgrade notes
+    Many changes, you may want to hold off and watch KnownIssues for a
+    week or two.
+
+    The page_type property is no longer a simple string. Customized
+    skin templates should continue to work. Downgrading from this
+    release may cause temporary problems.
+    
+    If you have DTML-using wikis, you will need to take steps to
+    re-enable DTML pages after this upgrade. You can either:
+    1. re-enable DTML: set the allow_dtml property as described below;
+    or 2. become a non-DTML wiki: remove or rename your RecentChanges,
+    SearchPage, UserOptions, IssueTracker or FilterIssues pages. If
+    you're using the default skin, the site navigation links will
+    adjust automatically; if you're using the zwiki_plone skin you'll
+    need to make such links yourself.
+
+    This release includes additional CMF/Plone action links;
+    re-install Zwiki in your CMF/Plone site to see these
+    (or add them manually in portal_types -> Wiki Page -> actions).
+    
+General
+  * no DTML by default
+
+    DTML is off again by default, for real this time.  (These days
+    it's too great a surprise for people who just want a wiki.)  To
+    enable DTML in pages you must now set a true 'allow_dtml'
+    property on your wiki folder or above. (A 'no_dtml' property,
+    any value, will override this and disable all DTML as before.)
+    See also "new skin-based views" below.
+
+  * new page type objects
+
+    Pages now store their type as a PageType object, rather than a
+    string.  These encapsulate behaviours that are specific to each
+    page type. The page_type attribute is no longer accessible via
+    the ZMI, and it is no longer a simple string, though in simple
+    DTML usage it will return the same value as before (DTML and
+    skin authors take note). Legacy skin templates should continue
+    to work.
+
+  * search has been enhanced; it now lists matching page names and
+    prints text excerpts, with or without a catalog 
+    (Dean Goodmanson, Simon Michael)
+
+  * comments no longer re-render the whole page, so are much quicker
+    on large pages
+
+  * when enabled (via show_subtopics property), subtopics are now
+    always displayed, except in minimal display mode.  This makes
+    hierarchy more useful, but also will make large wikis slower and
+    use more cpu time when bots crawl the wiki.
+
+  * By default, don't leave placeholder pages when renaming any
+    more; configurable in Default.py
+
+  * permissions fix: since splitting out the UI class, methods such
+    as editform were not respecting permissions
+
+  * we no longer need to set up an allowed_page_types property to
+    disable WWML in plone
+
+  * Unconfirmed fix for the DateTime error with zope 2.7/python 2.x
+    (IssueNo0649)
+
+  * more robust reporting of structured text formatting errors
+
+  * fix typo in updateCatalog's exception logging
+
+  * a SITE_CATALOG property no longer causes problems for setupCatalog
+    (it will use the specified catalog name)
+
+  * fix a missing import which allowed problem pages to stop upgradeAll
+
+  * code refactoring: extract Editing and Utils mixins, many
+    cleanups.  
+
+  * new defaultPage, defaultPageId, defaultPageUrl methods look for
+    a default_page property, or a page named "FrontPage", or the
+    first page in the folder. Other new methods include: pageCount,
+    pageIdsMatching, pageNamesMatching,  *Url helper methods for the
+    site navigation links
+    
+  * reparenting cleanup, bugfixes
+
+  * allow creation of new pages from a webdav-locked page
+
+  * cleanups, bugfixes, speedups for rename & delete plus some new
+    utility methods. rename was doing an unnecessary updatebacklinks
+    pass and reparenting all offspring not just it's children and
+    just generally trying too hard. 
+
+  * set correct last editor when updating backlinks during rename
+
+  * found the bugger that was leaving all those placeholder pages
+    when renaming
+
+  * log more verbosely during renames to show what's going on.
+
+  * add update backlinks functionality to delete, similar to rename,
+    so you can enter a name in the page management form to have all
+    links redirected there after deletion (a "replacement page").
+
+  * disable subtopics display entirely unless there's a true
+    show_subtopics folder property
+
+  * fix "global name 'p' is not defined" when adding pages via plone
+    UI
+
+Skins and content
+  * default, zwiki_plone: new skin-based views - instead of the
+    DTML-based RecentChanges, SearchPage, UserOptions, IssueTracker
+    and FilterIssues pages, new wikis now use skin-based views
+    (similar to editform etc) by default: recentchanges, searchwiki,
+    useroptions, issuetracker and filterissues.  As usual, these can
+    be changed by customizing the page template of the same name, in
+    the wiki folder or in the CMF or SkinnedFolder skins tool.  If
+    you later want to switch back to page-based versions, eg for
+    easier tweaking, you can call /setupDtmlPages and /setupTracker.
+    
+  * default: the main wikipage template has been completely redone
+    using METAL macros and CSS (Dan McMullen)
+
+  * default: the default skin uses a new UI method, stylesheet, to
+    find it's stylesheet. This can be customized with a File named
+    either "stylesheet" or "stylesheet.css". A page template or dtml
+    method may also be used, in which case the stylesheet will be
+    dynamic and will be reloaded for each page view.
+
+  * default: adopt the latest zwiki.org look as default - use a
+    sans-serif font by default, use full browser window, indent page
+    content, cleaner/more styled context and subtopics. Has been
+    tested only with mozilla 1.6; assume other browsers can cope.
+
+  * default: smarter site navigation links; work with page-based or
+    skin-based views as appropriate; show issues link only if there
+    are issues
+
+  * make our skin directories available to FileSystemSite if
+    installed, to support a SkinnedFolder setup
+
+  * contextX and renderNestingX are skinnable versions of context
+    and renderNesting, which may be used to present page hierarchy 
+    in more flexible ways. (Dan McMullen)
+
+  * fix an obsolete try except that was hiding errors in the default
+    wikipage template, show such errors in the browser as elsewhere
+
+  * default, zwiki_plone editform: reduce default text area height
+    to 20; fix tab indexes so save button is last
+
+  * FrontPage: note webdav lock permissions in EE setup docs
+
+  * RecentChanges, recentchanges: make the log note bold when summaries are
+    displayed, too; hide buttons when there is no catalog; simplify
+    the code, clean up and indent
+
+  * HelpPage: content, formatting updates
+
+  * instead of a horizontal rule, use a styled heading for comments
+    section, consistent with subtopics
+
+  * zwiki_plone: fix the contents link, rename recent changes link
+
+  * default backlinks: the upper checkboxes were being ignored
+
+  * default, zwiki_plone recentchanges: international characters in
+    page names were being quoted
+
+  * default, zwiki_plone: move the comments heading style to
+    stylesheet and use the anchor "comments" instead of "messages"
+
+  * zwiki_plone: move some tabs into the "actions" category, for
+    now, after discussing with limi
+
+  * default contents: fix string: typo
+
+  * default, zwiki_plone: make filter issues accessible via link
+    from issue tracker and vice-versa
+
+  * default: use standard stylesheet and site links panel in all views
+
+  * zwiki_plone: install actions (tabs) for the new skin views
+    (leave useroptions disabled)
+
+  * default, zwiki_plone: fix the issuetracker & filterissues forms
+
+  * default, zwiki_plone: latest zwiki.org search form with hit counts
+
+  * remove the contents link from page context in full mode, it's
+    superfluous now
+
+  * remove confusing #parents tag from default content files.. we
+    don't need it
+
+Tracker
+  * setupTracker now does not install dtml pages by default, sets up
+    an issue_colours property, creates one dummy issue if there are
+    none, and redirects to the issue tracker afterward
+
+  * make status counts work for statuses other than
+    open/pending/closed
+
+  * new methods: issueCount, hasIssues
+
+
+Zwiki 0.24 2003-11-01
+=====================
+
+Bugfixes.
+
+Upgrade notes
+    Reminder: the plone skin disables DTML-based pages (like
+    RecentChanges) by default now. If you wish to enable those you'll
+    need to remove the ZWiki/skins/zwiki_plone/no_dtml.dtml file after
+    an upgrade.
+
+    In the ZMI add menu, "ZWiki Web" is now just "ZWiki".
+
+General
+  * change ZMI add menu's 'Wiki' to 'ZWiki', to locate it back
+    beside 'ZWiki Page'
+
+  * hide the WWML page type option by default in cmf/plone, by
+    installing an allowed_page_types property on the portal folder
+    during install (for limi) 
+
+  * make new hierarchy methods more robust when a page has bogus
+    parents; also, check new parents more carefully. reparent() now
+    also accepts fuzzy page names & ids, removes duplicates, and
+    leaves parents sorted. The backlinks form's parent text field
+    now interprets the string as a single page name, like the page
+    management form.  (IssueNo0633, IssueNo0634)
+
+  * context(with_siblings=1) no longer includes the current page's
+    children, which I think was a regression. (IssueNo0629)
+
+  * fix missing import that confused error messages during upgrades
+
+  * log individual page upgrade errors in upgradeAll rather than
+    aborting the whole process
+
+  * log STX rendering errors (eg from tables) rather than breaking
+    the page
+
+  * added/cleaned up tests, all tests pass again, the
+    CMF/Plone-specific tests now work with (and require) plone 2 and
+    all it's dependencies.
+
+  * dublin core fixes, so wiki pages should show correct
+    modification time, ownership etc. in CMF/Plone
+
+Skins and content
+  * allow access to diff screens (but not full history button)
+    without 'View history' permission
+
+  * the access key for backlinks is now L everywhere
+
+  * zwiki_plone: tidy up wikinav_portlet a little
+
+Mail and messages
+  * fixed never-encountered bug in subscriber list upgrading
+    (IssueNo0540)
+
+
+Zwiki 0.23 2003-10-12
+=====================
+
+Permission renames, useful page/catalog/tracker setup methods, more
+functional default skin with slow but nifty hierarchy navigation options,
+default content updates, bugfixes.
+
+Upgrade notes
+    Three permissions have been renamed, and wherever you have
+    configured these ('Add ZWiki Webs', 'Add ZWiki Pages' & 'Zwiki:
+    Add comments to pages') you'll have to set them again with the new
+    names. You may want to review your settings before upgrading.
+    Sorry; it should be easy to write a script to automate this, I
+    don't have one.
+
+    As usual, but especially if upgrading from a very old version, it
+    doesn't hurt to visit SOMEPAGE/upgradeAll once as manager
+    (except, it may be slow in large wikis). This will ensure all your
+    pages have the latest attributes and have been rendered with the
+    latest code. Do this if you want to use the subtopics display
+    option below.
+
+    Regulations support was not working and has been dropped - I don't
+    expect this to affect you, but if I'm wrong join the discussion on
+    http://zwiki.org/RegulatingYourPages .
+    
+General
+  * permissions & ZMI menu renames for usability/consistency:
+
+    - 'Add ZWiki Web' in the ZMI add menu is now 'Add Wiki'. 
+    ('Add ZWiki Page' remains as is to avoid changing the meta type).
+
+    - 'Add ZWiki Webs' permission is now 'Zwiki: Add wikis'
+
+    - 'Add ZWiki Pages' permission is now 'Zwiki: Add pages'
+
+    - 'Zwiki: Add comments to pages' permission is now 
+    'Zwiki: Add comments'
+
+  * new wiki setup methods
+
+     From any page, visit these urls as manager to quickly set up
+     standard wiki features:
+
+     - setupPages - install default wiki pages (like Add Wiki in the ZMI)
+
+     - setupDtmlMethods - install index_html and standard_error_message
+
+     - setupCatalog - install or configure a wiki catalog, with
+     appropriate configuration for optimizing large wikis.  CMF/Plone
+     notes: this one is called automatically by the CMF install
+     script, to simplify installation. It adds all the indexes and
+     metadata that Zwiki expects from a catalog (see setupCatalog or
+     http://zwiki.org/ZwikiAndZCatalog for a list). NB these will
+     apply for all catalogable plone objects, not just zwiki pages,
+     but will
+     (hopefully) be empty/harmless for the non-pages.
+
+     - setupTracker - configure the wiki & catalog for issue tracking
+     and install the IssueTracker and FilterIssues pages
+
+     These also work inside CMF/Plone, except for setupDtmlMethods
+     which may not work there.
+    
+  * pages() now always returns brains with complete metadata, even
+    when a partial catalog is present. This allows a number of
+    things, eg creating/renaming in a cmf/plone site where
+    setupCatalog has not been called, to keep working, at the cost
+    of more zodb access (IssueNo0623 and others)
+
+  * Hierarchy navigation links and subtopics links
+
+     If your wiki folder has a true 'show_navlinks' boolean property,
+     the default skin in full mode will show a navigation links panel.
+     These are GNU Info-style next/previous/up links, with N/P/U quick
+     access keys respectively. See zwiki.org for an example.
+
+     If your wiki folder has a true 'show_subtopics' boolean property,
+     and the user is currently in full mode (their zwiki_displaymode
+     cookie is "full"): pages with children will have a "subtopics"
+     panel displayed, after the document part and before any
+     messages. (This will appear after the next edit, or after running
+     upgradeAll.)
+
+     Subtopics display can also be turned permanently on or off for a
+     specific page, and all pages below it in the hierarchy, by
+     setting an option in the default skin's editform (requires
+     'Zwiki: Reparent pages' permission). We may find a way to
+     simplify this later, ideas welcome.
+
+     Both of these options (navlinks and subtopics) are expensive in a
+     large wiki, even if you set up a catalog to optimize it (and you
+     should). When active they will slow page rendering down a lot
+    (ballpark figure: zwiki.org FrontPage goes from 0.1 to ~1 second).
+    
+  * regulations support dropped - this has been broken for some
+    time, and noone used it anyway because it makes life too
+    complicated.  I'll be removing and mothballing the code next
+    month, assuming no-one steps forward to make it worth
+    keeping. We might revive it in a simpler form later.
+
+  * there is a new PREFER_USERNAME_COOKIE global option in
+    Defaults.py; set this true to allow username cookie to override
+    authenticated name. Useful for a simple community wiki protected
+    by a single shared login.
+
+  * STX footnote links were broken by 0.22's refactoring (IssueNo0605)
+
+  * disable iframe tags by default, like javascript (IssueNo0588)
+
+  * wiki link regexp tweak: remove unnecessary restriction on the
+    end character of bare urls, and allow single-character remote
+    parts in interwiki links
+
+  * fix a bug in rename where children's parents field was not
+    updated, leading to an error when you tried to view that child
+
+  * make renaming's update backlinks pass more robust and more
+    verbose (IssueNo0594, James Collier)
+
+  * make post-delete redirect work when the parent is freeform-named
+
+  * saving a page via ftp or webdav after removing the blank line
+    between headers and text was giving an error. (Dan McMullen)
+    This should fix the error (but may not do what's wanted..)
+
+  * misc. code cleanups: move admin-related methods to Admin.py;
+    begin long-awaited Parents.py cleanup; move the WikiNesting code
+    into ParentsSupport and simplify; various new methods.
+
+  * convert more unit tests to ZopeTestCase; make MockZWikiPage a
+    bit more useful; first unit tests for cmf/plone and page
+    hierarchy functionality
+
+Skins and content
+  * default: the default skin has been rearranged somewhat, as at
+    zwiki.org; cf recent GeneralDiscussion. Less gray, widgets
+    grouped into panels, site links moved to top, annoying quote and
+    user bookmarks dropped, navigation links support. Note the
+    various site links appear only if you have a corresponding page,
+    following the names used at zwiki.org.
+
+  * default wikipage: freeform names now work when reparenting via
+    the page management form. Only a single parent can be set there
+    now.
+
+  * zwiki_plone wikipage_view: fix freeform links in the ancestor
+    list (IssueNo0603)
+
+  * default, zwiki_plone editform: when creating a new page, default
+    to the wiki's default page type, not the parent page's type
+
+  * default editform: fix an editform breakage with zope 2.5,
+    apparently due to a TAL difference
+
+  * default, zwiki_plone backlinks: make the reparent form action
+    url more robust, to fix reparenting in CMF/Plone (IssueNo0610)
+
+  * default backlinks: always explicitly list a page's parents, as
+    well as it's backlinks; don't show reparent controls if user
+    does not have permission
+    
+  * a wikipage() UI method has been added, which you can use (in
+    portal_types -> Wiki Page -> actions -> view) to allow a non-CMF
+    skin like CommonPlace to be used inside a CMF/Plone
+    site. Possibly just a temporary hack.
+
+  * quick access keys in the default skin have been rearranged - see
+    QuickReference
+    
+  * RecentChanges: latest zwiki.org code,
+    catalog-optimization-compatible, comment out old brute-force
+    code which should no longer be needed, fix last edit times when
+    there is no timezone cookie
+
+  * UserOptions: make it function inside a CMF/Plone site too
+    (useful with alternate skins); remove no longer used quote &
+    bookmarks options; include valid Pacific timezones (except for a
+    couple which DateTime doesn't support)
+    (IssueNo0595, James Collier)
+
+  * SearchPage: catalog search improvements: make help text always
+    visible, search only within current wiki, also show page title
+    hits (but the default code assumes Title index is a TextIndexNG2
+    with left globbing and case folding enabled, otherwise may not
+    work so well)
+
+  * zwiki_plone: the experimental skin-based versions of DTML pages
+    are now generated automatically and the tracker has been added
+    (untested). These are: recentchanges, searchwiki, useroptions,
+    issuetracker, filterissues. 
+
+Mail and messages
+  * mailout signatures now include the precise message url
+
+  * a whitespace + horizontal rule separator is inserted before the
+    messages section. You'll see this after next page edit or
+    upgradeAll.
+
+  * update catalog after subscribing/unsubscribing (fixes non-updating
+    "other page subscriptions" when a catalog is present)
+
+  * new 'fewer_threads' option, disabled by default, tries to gather
+    comments under a single thread per page per month
+
+Tracker
+  * creating issue pages without first setting issue_* folder
+    properties didn't work.. it should work now.  The necessary
+    folder properties will be installed as needed.
+
+  * IssueTracker: remove "how to report a bug" link;
+    latest-catalog-compatible code (so we don't always return all
+    pages)
+
+  * FilterIssues: move search form to the top; use pages() method to
+    ensure we search only this wiki; latest-catalog-compatible code
+
+
+Zwiki 0.22 2003-09-10
+=====================
+
+Memory efficiency/performance/scalability improvements; simpler page types
+and DTML control; zwiki_plone and default skin updates; wikimail tweaks;
+STX images; bugs, fixes, features.
+    
+Upgrade notes
+    Control of page types and DTML has been simplified. NB in this
+    release wikis tend to allow embedded DTML by default.  To disallow
+    it, add a 'no_dtml' property as described below.
+
+    The backlinksFor() and pages() methods have changed; Title() is
+    now preferred instead of title_or_id(); and RESPONSE is no longer
+    provided in the default namespace for skin templates (see below).
+    If you have DTML pages or customized skin templates using these
+    things, they may need to be updated.
+
+    If using a catalog, you should add the Title field to your
+    metadata if not already present. Use of title_or_id is being
+    phased out but you may want to leave it in your catalog until
+    Zwiki 0.23 to be safe.
+
+General
+  * page type cleanups and DTML changes: deprecated page types have
+    been removed, as have the non-DTML-supporting STX and HTML types.
+    DTML is now controlled as follows: a 'no_dtml' property (value
+    doesn't matter) on page or folder will disable Zwiki's DTML
+    functionality below that point. You can set this on the root
+    folder to disable it server-wide.
+
+     NB: non-CMF wikis, and CMF/Plone wikis which don't use the
+    zwiki_plone skin, are DTML-enabled by default for the moment.  
+    The zwiki_plone skin includes an empty 'no_dtml' method which
+    disables DTML. To enable it in all your CMF/Plone wikis, you need
+    to remove ZWiki/skins/zwiki_plone/no_dtml.dtml and restart zope,
+    (or switch to a similar skin without that file).
+
+  * the 'allowed_page_types' lines property is supported again.  It
+    does not prevent setting any type, but is used to restrict the
+    types offered in the default edit form. All supported types are
+    offered by default. The type of new pages, if unspecified, now
+    defaults to the first of the wiki's allowed page types.  The
+    'standard_page_type' property is no longer supported.
+    
+  * zodb caching improvements for large wikis: many operations which
+    used to load all or many pages into cache will no longer do so if
+    a suitably configured catalog is available. This can greatly
+    reduce cache activity and peak per-transaction memory usage for
+    large wikis, improving performance and server uptime. Renaming and
+    deleting are still relatively memory-expensive; more optimizations
+    to come. To fully benefit, you should have a wiki catalog with
+    meta_type, id, Title, path, canonicalLinks, isIssue indexes and
+    id, Title, issueColour, parents, links metadata (IIRC). NB most
+    wikis don't need to worry about this. See
+    http://zwiki.org/MemoryUsage for some more details.
+    
+  * the pages() method now returns catalog brains if possible,
+    otherwise brain-like objects (if there is no catalog), rather than
+    (expensive) page objects. It will also pass keyword arguments to
+    the catalog, if there is one, so is convenient for searching among
+    the pages of the current wiki (only). pageObjects() provides the
+    old behaviour.
+
+  * likewise, backlinksFor() now returns either catalog results or
+    similar brain-like objects. Old custom backlinks templates should
+    still work without upgrading, except in this (unlikely) case: when
+    there is a catalog with meta_type, path, and canonicalLinks
+    indexes but without page_url and linkTitle metadata.
+    (with help from Magog)
+
+  * the rendering code uses a simpler, more memory-efficient
+    pre-rendering and pre-linking scheme.  The relative_urls property
+    is no longer supported.
+
+  * DTML-enabled pages now invoke DTML only when there is code in
+    the page, to avoid unnecessary parsing and reduce our memory
+    footprint.
+
+  * wiki link titles (last edited info in tooltips) have been
+    disabled for the moment.
+
+  * three new boolean properties are supported, on page or folder:
+    use_wikiname_links, use_bracket_links, use_doublebracket_links,
+    for configuring your linking syntax of choice (lightly tested).
+    You'll need to run /clearCache or /upgradeAll after changing these.
+
+  * be smarter about choosing where to store uploaded files - when
+    checking for the "uploads" subfolder, make sure it is a subobject
+    of the wiki folder, and make sure it is folderish.
+
+  * we support the STX :img: syntax, finally (IssueNo0601, etc.)
+
+  * bare urls containing ; (semicolon) are now recognized
+    (DeanGoodmanson)
+
+  * renaming fixes: add or remove brackets when appropriate; when
+    updating links, tolerate edit failures (eg due to regexp
+    recursion); also replace changed ids
+    
+  * pages are now reindexed after being reparented, when a catalog
+    is present
+
+  * catalog lookup behaviour has changed:
+    "By default, Zwiki looks for an object named 'Catalog' in this wiki
+    folder (will not acquire) or a 'portal_catalog' (can acquire).
+    If a SITE_CATALOG property exists (can acquire), Zwiki will look
+    for an object by that name (can acquire); if no such object
+    exists, or SITE_CATALOG is blank, no catalog will be used."
+
+  * new catalogId() method returns id of the catalog in use, or
+    NONE. Requires 'Manage properties' permission.
+
+  * hasCatalog() is now public
+
+  * getPath() is now supported
+
+  * Title() is now always provided and is equivalent to pageName().
+    Use of title_or_id is now deprecated; DTML pages and skin
+    templates should use Title instead, to take best advantage of
+    future catalog optimizations etc.
+
+  * other misc. new methods: pageName(), summary(), size(),
+    cachedSize(), cachedDtmlSize()
+
+  * ChangeLog is no longer provided in releases for the moment, to
+    simplify maintenance
+
+Skins and content
+  * RESPONSE is no longer provided in the namespace for DTML Method
+    skin templates; they must use REQUEST.RESPONSE (code simplification)
+
+  * new methods recentchanges(), searchwiki(), useroptions() provide
+    experimental skin-based implementations of these wiki pages, which
+    can be used when DTML pages are not allowed.  The included
+    implementations are preliminary and unskinned (but customizable);
+    they are DTML methods so as to reuse code from the evolving
+    page-based implementations, but you can also use page templates.
+
+  * if a SiteMap page exists, the "site contents" link in full mode
+    will point there instead. Also contents() now accepts a 'here'
+    page name argument to allow this page to control the "you are
+    here".  See http://zwiki.org/SiteMap for an example.
+
+  * default skin: reduce subject field width again to "fix" too-wide
+    comment form
+
+  * default editform: show the page rename field as in the plone skin
+    (but display only if the user has rename permission)
+
+  * default search field & SearchPage: use GET when searching, for
+    more useful URLs
+
+  * default, zwiki_plone editform: show the STX and HTML page types
+    with "(+ DTML)" when DTML is allowed
+
+  * default, zwiki_plone editform: clear the "sticky" last log note when
+    creating a page
+
+  * default, zwiki_plone subscribeform: fix other subscribed page links
+
+  * zwiki_plone: initial cut of a wiki navigation portlet for Plone. 
+    (AlexanderLimi)
+
+  * zwiki_plone: Added File Uploads Overview template (AlexanderLimi)
+
+  * zwiki_plone: made the wiki editform explanation more clear. 
+    (AlexanderLimi)
+
+  * zwiki_plone editform: make the convenient alt-s (save) key work
+    again
+
+  * zwiki_plone: fix links in ancestor list
+
+  * content/basic/RecentChanges.stxdtml, SearchPage.stxdtml,
+    UserOptions.stxdtml, and content/tracker/IssueTracker.stxdtml,
+    FilterIssues.stxdtml: latest catalog-optimized versions from
+    zwiki.org
+
+  * content/basic/SearchPage.stxdtml: remove other search tools for
+    now
+
+Mail and messages
+  * fix message id inconsistencies preventing proper threading in
+    mail clients (IssueNo0587)
+
+  * mailout policy change: don't mail out page rename and deletions
+    with default 'comments' policy. Also don't mail out when
+    placeholder pages are created during rename.
+
+  * don't put brackets around mail sender's name in message
+    headings.. too clever
+
+  * the 'auto_subscribe' option now automatically subscribes a
+    page's creator, as well as commenters. Also it's possible to use
+    this property on a page now.
+
+  * the subscribe/unsubscribe methods now support a redirectURL
+    REQUEST parameter, which makes them more flexible
+
+  * fix unicode/UnixMailbox problem.  Comments made on the
+    place-holder page left after a rename would not appear, since the
+    text was unicode. Removed the i18n for the moment so this works.
+
+  * try a fix for non-formatted comment headers in certain timezones
+    (IssueNo0552)
+
+
+Zwiki 0.21.1 2003-08-03
+=======================
+
+Bugfix release.
+
+  * support old Wiki Folders (IssueNo0571)
+
+  * drop confusing allowed_page_types option
+
+  * fix scroll to bottom after comment
+
+
+Zwiki 0.21 2003-08-01
+=====================
+
+A number of important bugfixes & usability tweaks for wiki mail and the
+Plone/CMF skin, and preliminary optional Purple Numbers support
+(fine-grained linking).
+    
+Upgrade notes
+    Should be routine. Upgrading to this release is recommended.
+
+General
+  * CMF/Plone: Wiki Folder is no more! use ordinary folders instead.
+    NB this means you can't create a pre-populated wiki for the
+    moment; copy RecentChanges, UserOptions, SearchPage, HelpPage,
+    ZWiki etc. from zwiki.org if you need them.
+
+  * experimental Purple Numbers support for zwiki. A true
+    'use_purple_numbers' boolean property on the folder or page will
+    cause persistent id numbers (node ids) to be embedded within
+    source text and rendered as purple links (after your next page
+    edit).  These are usable (with quirks) on (non-DTML) STX pages,
+    not yet on RST or WWML or the non-wiki page types.  Performance
+    impact when rendering large pages is unknown. Cf
+    http://zwiki.org/PurpleNumbers .
+    (Mike Mell, Simon Michael, thanks to Eugene Kim & PurpleWiki)
+
+  * fixed a pageWithFuzzyName error in BTreeFolders (IssueNo0535)
+
+  * stxprelinkfitissue and wwmlprelinkfitissue page types weren't
+    being auto-upgraded (IssueNo0546)
+
+  * use absolute urls in STX footnotes and comment headings so these
+    links work in CMF/Plone (IssueNo0550)
+
+  * use latest page types in new wikis, avoiding excessive
+    "non-allowed page type" warnings in edit form (IssueNo0564)
+
+Skins and content
+  * the zwiki product icon was not checked in to CVS as a binary
+    file, which may have been causing problems for (even crashing!)
+    certain web browsers in the ZMI (Alexander Limi)
+
+  * zwiki_plone: close anchor tags in comment headings to prevent
+    bogus hyperlinks in Plone
+
+  * zwiki_plone: initial cut at breadcrumbs-style display of page
+    parents (Alexander Limi)
+
+  * zwiki_plone wikipage_footer: don't show the add comment box if
+    user doesn't have add comment permission
+
+  * default, zwiki_plone: make the editform's non-allowed page type
+    warning show the developer name again, not the end-user name
+
+  * default, zwiki_plone: if a user edits a page again within 24
+    hours, re-use their last log note by default (idea: Dean
+    Goodmanson)
+
+  * default, zwiki_plone skins: editform code cleanups. The options
+    used by the editform template are now 'page', 'text' and 'action'
+    as described in the comments.  'id' and 'oldid' options are no
+    longer used (but are still provided by Zwiki, for backwards
+    compatibility with old templates).
+
+  * zwiki_plone editform rename support: you can now rename a page
+    via the edit form. A placeholder page will be left behind and
+    links on other pages will be updated if possible (this may need to
+    be made more robust).  This ensures Zwiki-compliant page ids,
+    makes wiki page renaming possible in plone and makes wiki page
+    creation via the CMF/Plone content management interface work
+    better.  Also, as a special case, if you are editing the sole page
+    in the wiki the page name field will default to "FrontPage", which
+    latest Plone will display by default.  To support this, edit() and
+    create() now also do a rename if a new name is passed in the
+    "title" argument (so named for backwards compatibility).
+    (idea: Alexander Limi)
+
+  * zwiki_plone editform: clean up attributes/fix i18n for page type
+    radio buttons (fix for IssueNo0549 ?)
+
+  * zwiki_plone editform: in the heading, show whether you're
+    editing or creating (Alexander Limi)
+    
+  * zwiki_plone editform: fix a 0.19 bug which showed the
+    originating page's text instead of an empty field when creating a
+    page (IssueNo0557)
+
+  * zwiki_plone editform: make editform work with CMF again
+    (IssueNo0560)
+
+  * zwiki plone editform: move least-used widgets to the bottom
+
+Mail and messages
+  * comment heading display tweaks - message number no longer
+    displayed, date now links to more permanent url based on message
+    id, email sender's name is now enclosed in [] to link to personal
+    pages
+
+  * citations no longer cause HTML markup to be added to the page
+    text
+    
+  * citations no longer have an extra blank line displayed before
+    them
+
+  * smarter paragraph filling in mail-outs: preserve citation
+    prefixes and leave indented paragraphs alone
+
+  * like TestPage, a page named 'SandBox' no longer sends mail to
+    whole-wiki subscribers
+
+  * display no messages, rather than an error, if unicode gets into
+    the page (and document some of the ways this can happen)
+
+
+Zwiki 0.20.0 2003-07-02
+=======================
+
+Simpler page types, smarter message handling, auto subscription option;
+mail, skin and miscellaneous bugfixes; python 2.1 or greater now required.
+
+Upgrade notes
+    Page types have been simplified and renamed (both the end-user and
+    developer names) as mentioned below.  If you have
+    standard_page_type or allowed_page_types properties on your wiki
+    folders, you should update them to the latest types (in the left
+    column below):
+
+    I have dropped python 1.5.2 compatibility as of this release; this
+    allows us to use more up-to-date python 2.1 features and means
+    zwiki 0.20 and later won't run on very old zope installations.
+
+    The comment method's arguments have changed.
+    
+General
+  * more page type simplifications: 
+    As shipped, Zwiki now supports four main wiki page types and
+    three non-wiki page types::
+
+     # wiki page types
+     'msgstxprelinkfitissuehtml'  :'Structured Text',
+     'msgstxprelinkdtmlfitissuehtml':'Structured Text + DTML',
+     'msgrstprelinkfitissue'    :'reStructured Text',
+     'msgwwmlprelinkfitissue'     :'WikiWikiWeb markup',
+     # non-wiki page types
+     'html'             :'HTML',
+     'dtmlhtml'           :'HTML + DTML',
+     'plaintext'          :'Plain text',
+    
+    The wiki page types have similar features (message formatting,
+    text formatting, wiki linking, pre-rendering, fit tests & issue
+    properties) except for the choice of text formatting rules (and
+    only the STX types allow HTML).
+
+    A wiki will offer a restricted subset of these in the editform:
+    Structured Text, reStructured Text, WikiWikiWeb markup, and HTML
+    by default.  To offer other types, set a custom
+    allowed_page_types lines property on your wiki folder (or change
+    ALLOWED_PAGE_TYPES in Defaults.py).
+    
+  * new message storage format:
+    Comments are now stored as rfc2822-style messages in mbox format
+    (think of a wiki page with an mbox stuck on the end).  This looks
+    more verbose in the page source, but allows rich message data to
+    be stored in a standard way.  Messages must begin with "strict"
+    mbox-style 'From ' separators. (If you ever need to add these,
+    upgradeMessages may help.)  Messages stored in this way are
+    formatted for display with numbers and named anchors
+    (#msgN, #msgidXXX, #messages). Message bodies are formatted with
+    the usual text formatting rules.  Message-id and in-reply-to
+    headers are stored and threads are preserved when posting via
+    web. This behaviour has been added to all the main page types, but
+    some features require STX mode at present.
+
+  * fix memory leak when printing tracebacks
+    (IssueNo0536, Shane Hathaway)
+
+  * clean up '\r\n' line terminators if added by browser, in
+    comment().
+
+Mail
+  * fill paragraphs in mailouts, finally. Also wrap at column 70,
+    not 78. (IssueNo0340)
+
+  * try to preserve indentation in mailouts somewhat. Each paragraph
+    will be re-indented as per it's first line. This means indentation
+    within a paragraph will be lost, and a paragraph with only it's
+    first line indented will become wholly indented. Hopefully this
+    will be better than the old policy of throwing away all
+    indentation. (IssueNo0538)
+
+  * prevent duplicates when integrated with a mailing list, by
+    excluding the address in the X-BeenThere header from mailout.
+    (comment's do_mailout argument replaced with exclude_address)
+    (IssueNo0519)
+
+  * a true auto_subscribe folder property will cause any commenters
+    to a page to be subscribed there (authenticated/usernamed
+    commenters, at least)
+
+  * exclude a page named "TestPage" from whole-wiki subscription.
+    Page subscribers will still receive mail from it.
+
+Tracker
+  * supply default categories, severities, statuses lists for the
+    issue properties form if they have not been defined. This should
+    allow "IssueNoXXXX ..." pages to work in any wiki without
+    additional setup.
+
+  * tolerate whitespace in the issue_colours list
+    
+Skins and content
+  * zwiki_plone: added the last basic elements of the Plone styling,
+    cosmetic change to footer, external edit link moved to header.
+    (Alexander Limi)
+
+  * skins/zwiki_plone/subscribeform.pt: was a conflict ... I
+    manually resolved it... please test (Alan Runyan)
+
+  * zwiki_plone: minor fixes: fix change email address button label,
+    remove whitespace from comment form, remove stray code breaking
+    editform
+
+  * default: name error when changing email address in
+    subscribeform, fixed (IssueNo0537, Laura Trippi)
+
+  * default, zwiki_plone: make editform tolerate an out-of-date
+    allowed_page_types property (if allowed_page_types contains type
+    that no longer exists, we just list it with the others and rely on
+    auto-upgrade to fix the page); also tolerate whitespace there
+
+  * minor xhtml-compliance fixes
+
+  * make skin template error messages more to the point
+
+
+Zwiki 0.19.0 2003-06-01
+=======================
+
+Preliminary reStructured Text support, page types cleanup, skin bugfixes,
+customizable issue colours.
+
+Upgrade notes
+    Nothing special this month.
+
+General
+  * preliminary reStructured Text support, based on Andreas' and 
+    Richard's work.
+
+  * page types cleanup. Retired a bunch of old types, added new ones.
+    Fit tests and issue properties form support is now standard.
+
+  * New allowedPageTypes method returns the allowed page types for 
+    the wiki, defined in Defaults.py or an allowed_page_types 
+    folder lines property. Only these types can be selected when changing
+    the page type (except in ZMI). Note: at present a new wiki will not
+    allow DTML-enabled types, so if a user edits one of the DTML pages
+    like RecentChanges it's type will change, disabling it. The edit form
+    gives a warning in this situation.
+
+  * when creating pages, don't inherit page type from the parent - 
+    use either the wiki's standard_page_type, the specified type, or 
+    the zwiki default. Should make administration simpler.
+
+  * creationTime and lastEditTime now always return a valid DateTime
+
+  * new page methods: ageInDays, lastEditIntervalInDays
+
+  * standard_error_message was getting instantiated as a wiki page in CMF
+    (IssueNo0510)
+
+  * fix NameErrors due to missing imports
+
+Skins and content
+  * start with no bookmarks by default
+
+  * UI code cleanups, more useful error messages
+
+  * use xhtml-compliant tag for uploaded images
+
+  * default: replace DTML methods with page templates (IssueNo0508). 
+    Zwiki now requires Page Templates.
+
+  * default: XHTML 1.0 compliance fixes for the default skin
+    (IssueNo0399, Jordan Carswell)
+
+  * default: subscribeform layout tweaks, remove extra title tag
+
+  * default: fix editform action url
+
+  * default: fix contentspage tal:contents typo
+
+  * default: replace stray DTML in editform with TAL 
+    (IssueNo0506, Jordan Carswell)
+
+  * zwiki_plone: remove the bookmarks & help links from the page footer
+
+Tracker
+  * IssueTracker & FilterIssues dtml cleanups, robustness enhancements
+
+  * Instead of highlighting open and pending issues, we now highlight 
+    open and pending non-wishlist issues more than 60 days old
+
+  * issue colours code cleanup; issue colours are now defined in 
+    Default.py or issue_colours folder lines property
+
+
+Zwiki 0.18.0 2003-05-01
+=======================
+
+Full Plone and CMF skin, miscellaneous fixes.
+
+Upgrade notes
+    If you have a cmf_install_zwiki external method, refresh it after
+    installing this release (by saving it, or restarting zope).
+
+    The new zwiki_plone skin replaces the zwiki_cmf skin; although the
+    latter is still shipped it will hopefully go away soon.  An
+    existing CMF zwiki should keep working as before. To change it
+    over to the zwiki_plone skin, do this:
+
+     1. in your CMF site's portal_skins Contents tab, delete the
+     default and zwiki_cmf folders (and zwiki_orig, if you don't use
+     that)
+
+     2. in the properties tab, remove zwiki_cmf (and zwiki_orig) from
+     all skins
+
+     3. run the install method again (CMFSITEURL/cmf_install_zwiki)
+
+    Structured text headings will get bigger next time you save the
+    page (or visit SOMEPAGEURL/upgradeAll to re-render all pages).
+    
+General
+  * structured text headings now start at H2 not H3
+
+  * when using regulations, don't require change regulations
+    permission just to comment (IssueNo0485)
+
+  * be more robust displaying pages with old-style page ids that
+    have not yet been upgraded (IssueNo0495)
+
+  * use precise links in contents, rather than depending on
+    standard_error_message (IssueNo0454, Leslie Barnes)
+
+  * when saving a page via external editor/ftp/webdav, don't require
+    a space after the : in the safety belt/type/log headers. Was
+    causing a name error with external editor + emacs whitespace mode
+    (IssueNo0438, Andrew Burrow)
+
+  * if there is an id renaming collision during upgradeAll, just log
+    the error and continue (IssueNo0483)
+    
+  * edit conflict & lock dialogs were giving NameErrors
+
+  * new method: ancestorsAsList
+
+Skins and content
+  * a fully functional Plone (and CMF) skin, at last! The
+    zwiki_plone skin provides most current features of Zwiki's default
+    skin, within the standard plone UI. It should also be functional
+    for CMF sites, allowing zwiki_cmf to be retired.  (Alexander Limi
+    funded by Walt Ludwick, with Simon Michael, Sidnei da Silva, Alan
+    Runyan)
+
+  * skin code fixes; Zwiki accepts Page Templates, Filesystem Page
+    Templates, and DTML Methods as skin objects, and will warn if any
+    other type is found.
+
+  * UserOptions was not honouring the redirectURL argument if just
+    clearing cookies
+
+  * tweaked blank subject comment heading format.. not happy with it
+    yet
+
+Mail
+  * mailouts were failing when creating a page with no initial text
+
+  * make comment mailout work when there is no subject_heading field
+    (IssueNo0481, az` on irc)
+
+Tracker
+  * when changing issue properties, add a user-supplied or default
+    comment to the page recording what was done (DeanGoodmanson)
+
+
+Zwiki 0.17.0 2003-04-01
+=======================
+
+Simpler page ids, faster performance and better memory efficiency, new
+general-purpose page type including tracker and fit support, more robust
+parenting, skin improvements, preliminary stylesheet support, code
+cleanups, doctest no longer used.
+
+Upgrade notes
+    If you have pages with punctuation in the names, or zwiki tracker
+    issues, you'll need to change their id/name. See below.
+
+    If you have a tracker in your wiki, you'll also need to install
+    the latest IssueTracker/FilterIssues pages and add a new 'isIssue'
+    FieldIndex to your catalog. Also, in a large wiki you may find
+    changing issue descriptions is much slower than before. See below.
+
+    issuedtml and stxprelinkdtmlhtml pages will be auto-upgraded to
+    the new stxprelinkdtmlfitissuehtml type.
+    
+    The CMF install method in Extensions has been renamed to Install.py.
+    
+General
+  * Simpler page ids
+ 
+    Page ids are now always derived from the name (title). This
+    improves performance, removes a source of confusion, but means
+    pages can no longer have a totally different title and id (like
+    tracker issues used to).  Also, page ids no longer include
+    punctuation, and fuzzy links now ignore punctuation.
+
+    Pages with old-style ids should be renamed so that wiki links to
+    them will work.  You can upgrade these pages and update links
+    throughout the wiki by visiting SOMEPAGEURL/upgradeAll.  This
+    may take a long time; you can watch progress in the debug
+    log. It's safe to run this more than once. Alternately, you can
+    visit SOMEPAGE/upgradeId to rename and relink a single page.
+
+    Some incoming links may break due to url changes; having the
+    zwiki standard_error_message installed will help.
+
+  * Improved performance and memory efficiency
+
+    Link rendering is faster due to the new ids and code
+    refactoring.
+    (Unscientific ab test: roughly a 4x speedup rendering a
+    normal page and 20x for a long one.)  Also, zwiki is no longer
+    so eager to load all pages into the zodb cache. Certain
+    operations will still trigger this (search, rename) but in
+    general use, a zope serving large wikis should now use less
+    memory. This may also help your performance and reduce "first
+    page render" delay.
+
+  * new/improved page lookup methods: pages, pageIds, pageNames,
+    pageIdsStartingWith, pageNamesStartingWith,
+    firstPageIdStartingWith, firstPageNameStartingWith, pageWithId,
+    pageWithName, pageWithNameOrId, pageWithFuzzyName. Use these in
+    your DTML code when possible as they will be optimized. pageWith*
+    now return a correct acquisition wrapper (fixes IssueNo0472).
+    pageWithFuzzyName's ignore_case has no extra cost now and is
+    always on. The argument is left in place for backwards
+    compatibility for the moment. Also this may have been acquiring
+    pages, fixed.
+
+  * new general-purpose page type incorporating issue and fit
+    support: stxprelinkdtmlfitissuehtml. stxprelinkdtmlhtml and
+    issuedtml pages are auto-upgraded to this.  This page type
+    displays an issue properties form if the page name begins with
+    IssueNo. Also, any tables whose first cell begins with "fit." or
+    "fittests." are run as fit tests at page view time.
+
+  * rename improvements: support for upgrading to new-style ids;
+    allow renames without sending mail; reduce unnecessary indexing;
+    preserve creation info when renaming (IssueNo0398); be more
+    tolerant of confused parentage;
+
+  * Don't leave orphans when deleting a page
+
+  * cleaner catalog logging
+
+  * all doctests have been converted to pyunit tests
+
+  * Details of WWML changes in last month's release (PeterMerel):
+
+     - C2-compatible apostrophe embedding using minimal-munch
+
+     - C2-compatible generation of indents from leading spaces
+
+     - Intuitive fixed-width tables using | as a column delimiter. I
+     purely hate the STX tables, which do everything except the most
+     obvious formatting everybody wants.
+
+     - Ability to use images as page names with [image-url]
+
+     - Ability to generate blockquotes by using = instead of  *
+
+     - Ability to force a BR in definitions using \\
+
+     - Probably some other things I've forgotten.
+    
+Skins and content
+  * the latest zwiki.org RecentChanges: fix a mispaced try which
+    allowed errors, be less chatty about brute force/catalog, move
+    note field next to page name, drop the "use table" option and the
+    T issue indicator.
+
+  * edit form layout improvements
+
+  * lose the gray title background and use site logo on all "form" pages
+
+  * Made the diff form skinnable: support a 'diffform' page template
+    or dtml method accepting two arguments: 'revA' and 'difftext'.
+
+  * Made the contents view skinnable: support a 'contentspage' page
+    template or dtml method accepting two arguments: 'hierarchy'
+    (a html string) and 'singletons' (a list of html strings).
+
+  * allow multiple space-separated wiki names in backlinks' other
+    parents field and the page management form (PeterMerel)
+
+  * contents improvements: make "you are here" bold; list singletons
+    at the bottom, if any. (PeterMerel)
+
+  * "contents" is used more consistently and is the preferred new name
+    for the map method.
+
+  * page creation links now have class "new" (IssueNo0456)
+
+  * preliminary CSS support: the default skin embeds a "stylesheet"
+    object if present. 
+
+Mail
+  * longish headings were not being stripped from mailouts
+
+  * mail out comments with their original formatting (not the page
+    diff)
+
+  * don't try to find a subject in comment body any more
+
+  * don't send mailouts from a page named TestPage, whether or not it has
+    [test] subject; log discarded [test] mailouts
+
+CMF
+  * cmf_install_zwiki.py has been renamed to Install.py (IssueNo0460)
+
+Tracker
+  * Issue pages have a new naming scheme to conform with the new
+    page ids: "IssueNoNNNN issue description". upgradeAll will take
+    care of this for you. Old IssueNoXXXX urls will still work if
+    you have standard_error_message installed. You need updated
+    IssueTracker/FilterIssues pages which can be found in
+    ZWiki/content/tracker. A new 'isIssue' FieldIndex is required in
+    the catalog.
+
+  * changeProperties has been replaced by changeIssueProperties.
+    This does a full page rename, with link updating, when changing
+    an issue description (slow).
+
+  * The 'issuedtml' page type is deprecated; the new combined
+    'stxprelinkdtmlfitissuehtml' type is used instead. Old issue
+    pages will be auto-upgraded. See also HowToInstallAZwikiTracker.
+
+  * If you use the new page type throughout, you can change an
+    ordinary page into an issue by renaming it "IssueNo..." and vice
+    versa.
+
+Zwiki 0.16.0 2003-03-02
+=======================
+
+CMF skin updates, various mail tweaks to support mailing list integration,
+enhancements to comment behaviour, WWML, misc. bugfixes.
+
+Skins and content
+  * enhancements and fixes to the CMF support and zwiki_cmf skin
+    from the nzo project - title fix, wiki folder edit view, don't
+    create standard_error_message in CMF, CMF-style edit form, other
+    skin updates. (Sidnei da Silva, LaloMartins)
+
+  * dropped zwiki_orig skin
+    
+  * default skin: subject field, always post with heading,
+    tweaked page management form
+
+  * more compact comment headings
+
+  * add discussion icon to comment headings in a CMF site
+
+Mail
+  * mailout all comments, regardless of use_heading flag
+
+  * with multiple bracketed strings in a subject, use the right-most
+
+  * mailin.py: support for preventing duplicates when using a
+    mailing list, commented out; 
+
+  * generate list id header from mail_from, not mail_replyto
+
+  * new mail_signature property to override mailout footer
+
+  * new mail_page_name boolean property to disable page name in
+    subject
+
+  * mailin.py: parse boolean options correctly
+
+  * don't add extra spaces in mailout subjects
+
+  * log reason for mailout failures
+
+General
+  * WWML: fixed a couple of little bugs and added a couple of little
+    extra markups. (PeterMerel)
+
+  * comment(): a non-blank comment subject now enables the heading
+    if use_heading is not already true
+
+  * preserve parentage when pages are renamed (IssueNo0168)
+
+  * fixed a strange problem with catalog()
+
+  * fix Localizer ustr NameError caused by non-unicode zope or unit
+    testing
+
+  * testing support - don't append or mail out comments with [test]
+    subject
+    
+  * test modules re-organized
+
+
+Zwiki 0.15.0 2003-02-01
+=======================
+
+Minor bugfixes and some changes to wikimail behaviour.
+
+Upgrade notes
+    If you're doing mailin, don't forget to re-save your external
+    method after installing this release.
+
+Mail
+  * don't store page names in recipient real name. This seems to
+    create more confusion than it solves. mailin.py's checkrecipient
+    option is now off by default, and the line in Mail.py:sendMailTo()
+    which puts the page name in mailouts' reply-to is commented out.
+
+  * don't recognize bare wiki names in mailin subjects - only page
+    names enclosed in brackets. Explicit is better than implicit.
+    More details on http://zwiki.org/WikiMailDiscussion, please
+    comment there if you don't agree with these changes.
+    
+  * non-headed comments were sending error reports to mail_admin
+    if configured
+
+Skins and content
+  * default: some fixes for valid HTML (Pieter Biemond, IssueNo0399)
+
+  * default, zwiki_orig: increase max quote size in header to 300
+
+  * zwiki_orig: get rid of the javascript double-click
+
+General
+  * leave unknown link titles blank instead of showing "xxx zwiki bug"
+
+  * a comment's subject (explicit from a field or inlined) is now
+    used for the transaction log regardless of the use_heading checkbox.
+    
+
+Zwiki 0.14.0 2003-01-09
+=======================
+
+A mailin.py rewrite.
+
+Upgrade notes
+    If you don't use mailin, no need to upgrade.  After installing
+    this you'll want to click your external method's save button to
+    update it. Note this version of mailin.py drops the special
+    virtual host support.
+
+Mail
+  * a rewritten mailin.py with tweaked delivery rules and unit
+    tests. Fixes IssueNo0376.
+
+  * be more fussy about recognizing a recipient real name as a page
+    name
+    
+  * bracketed free form names in the subject are now also recognized
+    (it will use the first bracketed thing found)
+
+
+Zwiki 0.13.1 2002-12-07
+=======================
+
+A "bugfix-plus" release, for IssueNo0385 (missing permissions).
+
+  * finish the switch to modern security declarations,
+    fixing IssueNo0385 and hopefully not breaking much else.
+
+  * also send mailouts on page deletion and renaming
+
+
+Zwiki 0.13.0 2002-12-01
+=======================
+
+Bugfixes, more solid CMF & Plone support, wikimail enhancements, skins
+re-organization.
+
+Upgrade notes
+    If you have mailin set up and find replies going to the default
+    page instead of the originating page, see IssueNo0376.
+
+CMF
+  * rename CMFInstall.py to cmf_install_zwiki.py
+
+  * CMF skin support. zwiki_cmf is a lightweight CMF skin for zwiki;
+    zwiki_orig is a CMF skin that looks like zwiki's standard UI
+
+  * fix edit permission in CMF (IssueNo0366)
+
+  * fix a timezones error when in CMF
+
+  * make wiki folder & page management work in cmf/plone
+
+  * catalog lookup changed: look for a CMF portal_catalog;
+    look for SITE_CATALOG on page and containing folder only
+
+  * when creating a Wiki Page in CMF, allow the standard_page_type
+    folder property to control it's page_type.
+
+  * hide user options when in CMF
+
+Mail
+  * look up destination page in the recipient's real name (first); 
+    mailouts will encode the source page in the reply-to's real name.
+    This should make addressing and replying more natural.
+
+  * allow subject headings in mail and web comments. (To set the subject
+    from a web comment, use an initial one-line paragraph that is bold
+    (using '** or < b>') and no longer than 100 characters.)
+    Subjects are saved as edit log note and vice versa.
+
+  * generate a mailout when pages are created
+
+  * mailin page creation fixes
+
+  * mailin: handle freeform page names
+
+  * mailin: work even when default page is not found, as long as
+    there's at least one wiki page in the folder.
+
+  * mailin: add some failure logging
+
+  * look for 'mailin_policy' property instead of 'posting_policy';
+    the latter is still supported but deprecated
+
+  * don't use < hr> in comment headings
+
+Skins and wiki content
+  * clean out & reorganize templates and default content under
+    skins, content
+
+  * new unified RecentChanges implementation; use SITE_CATALOG,
+    remove hard-coded zwiki.org
+
+General
+  * wiki links to pages with accented names (and freeform names in
+    general if standard_error_message is not present ?) were not working
+
+  * parent wiki links were generating an error
+
+  * workaround for zope 2.6 stx+dtml breakage (IssueNo0270)
+
+  * fix for "some permissions had errors" (IssueNo0358)
+
+  * fix title changing in ZMI Edit tab (IssueNo0280)
+
+  * increase the added and removed lines truncation limits for diffs
+    and mailouts (to 200 and 20 lines respectively)
+
+  * ZWikiPage class initialization fix; fixes an event log file
+    warning (and.. ?)
+
+  * auto-upgrade WikiForNow pages
+
+  * log messages at BLATHER priority instead of DEBUG, and don't
+    require the Z_DEBUG_MODE or ZWIKI_DEBUG variable any more
+
+    
+Zwiki 0.12.0 2002-11-01
+=======================
+
+  * subscription now accepts CMF member usernames as well as email
+    addresses
+
+  * add zwiki web, add zwiki page forms internationalized;
+    .po files & spanish translation updated (JuanDavidIbanez)
+
+  * preliminary fit (framework for interactive testing) support
+    ('dtmlfithtml' & 'stxdtmlfithtml' page types)
+
+  * allow a 'mail_subject_prefix' folder property to override the
+    folder title for mailout subjects. Useful when mailout subject and
+    cmf's "you are here" must differ.
+
+  * self.ZopeTime didn't work on a page in a CMF site, now does
+
+  * apply the stx initial-word-becomes-bullet workaround for all
+    zope versions
+
+  * support for auto-upgrading wikifornow pages
+
+  * minor default ui & content tweaks
+
+
+Zwiki 0.11.0 2002-10-01
+=======================
+
+Bugfixes, international page names, edit log notes, WikiForNow
+assimilation completed, CMFWiki integration (alpha).
+
+Upgrade notes
+    See Regexps.py for notes on configuring international page names.
+    When running large & extensively cataloged wikis, you might notice
+    this version being more memory intensive than 0.10 (which itself
+    may be more memory hungry than 0.9.9). This release should coexist
+    with CMFWiki without problems.  Otherwise the usual, see
+    http://zwiki.org/TenMinuteZwikiUpgradeGuide &
+    http://zwiki.org/HowToUpgradeZwiki for more.
+    
+Misc
+  * better support for (single-byte) international characters in
+    page names & ids; enable out of the box, with or without a locale
+    set up (IssueNo0257)
+
+  * merge CMF support into standard ZWiki pages. See
+    Extensions/CMFInstall.py. (alpha)
+    (CMFWiki) (ChrisMcDonough)
+
+  * locking fixes for external editor support (CaseyDuncan)
+
+  * save an optional log note with edit (or type change, file
+    upload, ftp PUT, page creation, deletion (via DeleteMe))
+    (WikiForNow) (KenManheimer)
+    
+  * allow page type to be set via FTP (WikiForNow)
+    
+  * Don't allow completely anonymous invocations of rename/delete
+    (IssueNo0235)
+
+  * reindex after renaming
+
+  * set "FTP access" permission, send manage_edit through wiki
+    editing code the way WikiForNow does (IssueNo0243)
+
+  * a couple of compatibility tweaks for running inside a CMF/plone
+    instance - provide view & SearchableText methods, use
+    portal_catalog if present, don't use rule in comment headings.
+
+Default UI & wiki content
+  * custom wikipage template was being called with the wrong context
+    (IssueNo0225)
+
+  * custom standard_wiki_header/footer methods were being ignored
+    (IssueNo0228)
+
+  * provide a traceback in html source when header or footer
+    rendering fails
+
+  * standard_error_message: fix missing "; make it work when not in
+    site's root folder (IssueNo0250)
+
+  * editform: move options down a row to handle long page names
+    better; fix tab ordering
+
+  * display last log note in history link title in header and at top
+    left when diff browsing; use a form button to return from diff
+    browsing
+
+  * use ZMI widgets for page_type and NOT_CATALOGED (WikiForNow)
+
+Rendering
+  * new "text + links" page type
+
+  * wwml: some rendering fixes and convert spaces to tabs, described
+    on ConvertSpacesToTabs (PeterMerel)
+
+  * use new rendering code for issue pages (IssueNo0252,IssueNo0253)
+
+  * enable stx bullet workaround for all zope versions (IssueNo0273)
+    
+Mail
+  * filter blank items from mailout recipients (IssueNo0221)
+
+Compatibility
+  * be more robust when upgrading timestamps (IssueNo0222)
+
+  * be more robust with older zopes which may not have page
+    templates (IssueNo0224)
+
+  * don't use prefix tag in add zwiki web form for compatiblity with
+    old zopes (IssueNo0229)
+
+  * be more robust reading version.txt.. zope-cvs doesn't have one
+    (IssueNo0254)
+
+  * fixprops.py utility method for fixing up zwiki page properties
+
+  API changes (summary)
+
+    Nothing major.
+    
+
+Zwiki 0.10.0 2002-09-01
+=======================
+
+  * minor text cleanups in default editform & zwikidotorg content
+
+
+Zwiki 0.10.0rc1 2002-08-25
+==========================
+
+Pre-rendering for better performance, new freeform page names and fuzzy
+linking, WikiForNow regulations support (beta), page renaming & deleting,
+UI enhancement & simplification, better upgradability, page templates
+support, i18n started, many bugfixes & minor enhancements.
+
+Upgrade notes
+    This release has renamed page types and a new render-caching
+    mechanism, to which pages are upgraded automatically; full-featured
+    UI defaults which will be used if you delete your custom DTML
+    methods; and one new and one renamed permission.
+    See http://zwiki.org/TenMinuteZwikiUpgradeGuide &
+    http://zwiki.org/HowToUpgradeZwiki for more.
+    
+Default UI
+  * made built-in defaults full-featured (equivalent to current
+    zwiki.org UI). 
+
+  * when adding a zwiki web, don't instantiate dtml methods, rely on
+    the built-in defaults instead
+
+  * support page templates as well as dtml methods for editform,
+    subscribeform, backlinks and for main page layout (a page template
+    named wikipage will take precedence over standard_wiki_header &
+    standard_wiki_footer dtml methods). The page body is passed to in
+    wikipage as options/body.  The following additional options are
+    passed to editform: page, text, action, id, oldid.
+
+  * built-in defaults are now read from the filesystem.  Defaults
+    for standard_wiki_header/standard_wiki_footer are still provided
+    but no longer quite as up-to-date and probably will be deprecated.
+
+  * consistent api for accessing UI methods/templates/defaults
+
+  * many UI updates and simplifications in default page layout,
+    editform, backlinks etc.; made UI options more flexible & robust
+
+  * full/simple/minimal display modes; simple (no page hierarchy) is
+    displayed by default
+
+  * retired jumpsearch (make the search box always do a simple
+    search)
+
+  * added tooltips & access keys to most links & form elements
+
+  * display a convenient page rename/reparent/delete form in the
+    footer in full mode if the user has a username (and permissions)
+
+  * external editor support
+
+  * make backlinks dtml more robust (IssueNo0210); fixed a case
+    where the parent checkbox didn't show up; now uses a catalog if
+    available to provide accurate fuzzy backlinks
+
+  * upload permission was incorrect in editform (IssueNo0178)
+
+  * removed "Show advanced edit form" option
+
+  * ensure comment form depends solely on Add comments permission
+
+  * fix white space in center of footer in NS 4.7
+
+  * don't show "sp" for spacer image in text-mode browsers
+
+  * a missing slash caused edits to fail in netscape 4.7
+
+  * added secret AnnoyingQuote edit link
+
+  * better support for web robots - removed robot-excluding meta tag
+    from standard_wiki_header/wikipage, added robot exclusion tag to
+    editform/subscribeform/backlinks; use form buttons instead of
+    links to keep robots out of page history etc.
+
+Default zwikidotorg content
+  * fewer pages
+
+  * new FrontPage
+
+  * new HelpPage
+
+  * updated RecentChanges, uses catalog if available
+
+  * updated SearchPage with selected extra search tools
+
+  * cleaned up UserOptions
+
+  * provide a list of timezones, MoinMoin style
+    (IssueNo00146)
+
+  * a standard_error_message method handles nonexistent urls,
+    with fuzzy and partial matching on page names
+
+Rendering
+  * Pre-rendering support: new page types (used by default) process
+    text formatting rules and wiki linking rules once at edit time.
+    This makes rendering of large pages much faster (possibly at the
+    expense of quicker zodb growth). Also allows us to accurately
+    catalog links.
+
+  * Better freeform page names - square brackets now allow almost
+    any page name, not just those with url- and zope-id-safe
+    characters. Freeform names are converted to wikiname-like page ids
+    and either may be used for linking, supporting co-existence of
+    freeform and wikiname pages.
+
+  * Fuzzy linking - square brackets also do fuzzy linking, ignoring
+    whitespace and capitalization.
+
+  * square brackets now link only to zwiki pages, not other zope
+    objects or url paths
+
+  * Wiki links now have title attributes/tooltips displaying the
+    target's age and last editor when you mouse over (except for
+    freeform page names in contents hierarchy and parent context)
+
+  * support for simple sub wikis/WikiAcquisition - wikilink targets
+    can be acquired from the parent folder (or above) and are
+    displayed with ../ prepended
+
+  * don't link WikiNames inside structured text links (IssueNo0190)
+    or the content of html anchor tags (IssueNo0194)
+
+  * allow stx tables to have + at the corners
+
+  * the RemoteWikiURL tag is now case-insensitive
+
+  * make accidental structured text footnote processing less likely;
+    use more standards-compliant "ref" prefix for footnotes, like newer stx
+
+  * don't treat a bare url followed by : as a remote wiki link
+
+  * make stx links work in non-html stx modes (IssueNo0193)
+
+  * fix for IssueNo0186 (page rendering fails if it contains a
+    freeform link containing unbalanced parentheses)
+
+  * added (?L) to the regexps which use \w or \b to make them
+    locale-sensitive. (EdwardKreis, AlexyKhrabrov,
+    InternationalCharsInRegexps)
+    
+  * display "you are here" in page hierarchy
+
+Editing
+  * strip HTML header & footer found in edit text
+
+  * make post-stx HTML & BODY tag stripping more robust (EdwardKreis)
+
+  * check for a webdav lock before saving an edit or entering editform
+
+  * don't highlight the last edit access key if it's not hyperlinked
+
+  * allow existing files to be re-uploaded (IssueNo0006)
+
+  * don't add a link for uploaded files if the page already has one
+
+  * set last_editor properly during mailin (IssueNo0207)
+
+  * recatalog pages after ftp/http/webdav put
+
+  * abandon the old antidecap kludge
+
+Mail
+  * fixed the multiple subscription bug (IssueNo0161)
+
+  * fixed page creation
+
+  * make mailin tracker issue creation more robust
+
+  * mailin in the context of a zwiki page was not working as
+    advertised
+
+  * include standard mailing list headers in mailouts
+
+  * discard all mail that appears to come from a bot, and the common
+    "out of office" auto responder replies
+
+  * post comments/create pages using the sender's real name or just the
+    username component from their email address, not the full address
+    (IssueNo0066, PieterB/SM)
+
+  * fixed a bug in upgradeSubscribers which caused folder properties
+    to proliferate
+
+Tracker
+  * added a createIssue method which can replace the AddIssue &
+    IssuePrototype pages
+    
+  * increased title's max length from 100 to 200 when editing issues
+
+  * when rendering the issue form, generate option menus dynamically
+    from the issue_* properties (MikeFair)
+
+Compatibility
+  * better auto-upgrading & backwards compatibility; allow
+    auto-upgrading to be disabled via flag in Defaults.py; 
+    new upgradeAll method for batch upgrading & re-rendering
+
+  * removed STletters dependency for older zopes
+
+  * don't pass stx header argument with zope 2.4.0 (IssueNo0152,
+    TrevorToenjes)
+
+  * added zope 2.5.1 to list of zope versions for unit testing
+
+  * improved python1.5 support
+
+  * improved zope version checking
+
+Misc
+  * support WikiForNow-style regulations if use_regulations boolean
+    folder property is true
+
+  * add support for page renaming/deleting
+
+  * tweak allowed suffixes for fs-based wiki templates
+
+  * add more informative transaction notes
+
+  * ZWikiPage.manage_changeProperties was non-functional
+
+  * fix ZMI add zwiki page (IssueNo0187), make it equivalent to wiki
+    page creation
+
+  * spanish translation of initial i18n strings (J. David IbÃ�¡ÂÃ�±ez)
+
+  * canadian french translation of initial i18n strings (JoannePlouffe)
+
+  * the beginnings of i18n support, using Localizer if installed.  A
+    few strings (edit conflict, authentication errors) internationalized.
+
+  * use last_edit_time everywhere in preference to
+    bobobase_modification_time
+
+  * debug logging of zwiki catalog operations (if Z_DEBUG_MODE or
+    ZWIKI_DEBUG variables are true and STUPID_LOG_SEVERITY is <= -200)
+    
+  API changes (summary)
+
+  * wikimail/editform/subscribeform/backlinks page templates will be
+    used in preference to standard_wiki_header/standard_wiki_footer/
+    editform/subscribeform/backlinks DTML methods. The page body is
+    passed to wikipage as options/body. These options are passed to
+    editform: page, text, action, id, oldid.
+
+  * page types renamed. Here is the current list of page types (see
+    AllAboutPageTypes for details)::
+
+    stxprelinkdtmlhtml
+    stxdtmllinkhtml
+    dtmlstxlinkhtml
+    stxprelinkhtml
+    stxlinkhtml
+    stxprelink
+    stxlink
+    wwmlprelink
+    wwmllink
+    prelinkdtmlhtml
+    dtmllinkhtml
+    prelinkhtml
+    linkhtml
+    dtmlhtml
+    html
+    plaintext
+
+  * the RemoteWikiURL tag is case-insensitive
+
+  * the OFS.ObjectManager.bad_id definition is used as the basis for
+    generating page ids
+
+  * some properties are now looked up by containment rather than
+    acquisition context, eg subscriber lists
+
+ADDED::
+    'Zwiki: Rename pages' permission
+    use_regulations folder property
+    zwiki_displaymode cookie
+    ZWIKI_DEBUG environment variable
+    addStandardLayoutTo
+    age
+    applyLineEscapesIn
+    asAgeString
+    backlinks
+    canonicalId
+    canonicalLinks
+    canonicalLinks
+    changeIssueProperties
+    createIssue
+    creationTime
+    editform
+    folder
+    htmlunquote
+    isMailoutEnabled
+    isZwikiPage
+    lastEditInterval
+    lastEditTime
+    linkTitle
+    linkTitleFrom
+    offspringAsList
+    offspringIdsAsList
+    pageWithFuzzyName
+    pageWithName
+    pageWithNameOrId
+    relative_urls
+    renderLinksIn   
+    standard_wiki_footer
+    standard_wiki_header
+    stxToHtml
+    subscribeform
+    upgradeAll
+    urlunquote
+    wikipage
+    
+CHANGED::
+    'Zwiki: Recycle pages' permission -> 'Zwiki: Delete pages'
+    creation_time and last_edit_time are now ISO-format strings
+    doLegacyFixups -> upgrade
+    
+REMOVED::
+    zwiki_advancededit cookie
+
+
+Zwiki 0.9.9 2002-04-16
+======================
+
+    Focus: unit tests, wikimail enhancements, general fixes and a
+    permissions rename. See main release notes below (rc1).
+
+Bug fixes
+  * zwikidotorg template: remove references to old permissions 
+
+
+Zwiki 0.9.9rc6 2002-04-15
+=========================
+
+Bug fixes
+  * recognize , in urls (IssueNo0130)
+
+  * zwikidotorg template: remove comment form border
+
+
+Zwiki 0.9.9rc5 2002-04-14
+=========================
+
+Bug fixes
+  * fix bracketed path linking (IssueNo0139)
+
+  * missed some old-style imports in the subscription code
+
+
+Zwiki 0.9.9rc4 2002-04-13
+=========================
+
+Bug fixes
+  * zwikidotorg template: UserOptions tweaks - make default editform
+    dimensions match built-in default (60x15); don't use PST as
+    default timezone
+    
+  * zwikidotorg template: make timezone conversion in the header
+    more robust
+
+  * remove a local PYTHONPATH dependency from all imports, and 
+    make unit tests more robust across zope versions & invocation
+    methods
+
+  * wikimail: multipart message handling got broken in the cleanup, 
+    fixed
+
+  * wikimail: make inclusion of poster's username in mailout From
+    header more robust
+
+
+Zwiki 0.9.9rc3 2002-04-10
+=========================
+
+Bug fixes
+  * zwikidotorg template: removed SiteLogo capability & obsolete
+    zwiki_homepage reference, added secret feature for minimalists.
+
+
+Zwiki 0.9.9rc2 2002-04-09
+=========================
+
+Bug fixes
+  * render page header  *after* body, so that body can turn it off
+    with dtml
+
+  * make create more robust for dtml use in a top-level folder
+
+  * built-in ui tweaks - use colours like zwikidotorg's, make
+    editform textarea smaller, remove non-useful help links
+
+  * zwikidotorg template: include user option presets in the footer,
+    make help link depend on a HelpPage, update default bookmarks
+
+API changes (summary)
+  * new page method zwiki_version()
+    
+
+Zwiki 0.9.9rc1 2002-04-08
+=========================
+
+Features
+  * zwiki permissions renamed. Details::
+
+    'Add ZWiki Pages' (no change)
+    'Add ZWiki Webs' (no change)
+    'Zwiki: Add comments to pages' (was Append to ZWiki Pages)
+    'Zwiki: Change page types' (was Change ZWiki Page Types)
+    'Zwiki: Edit pages' (was Change ZWiki Pages)
+    'Zwiki: Reparent pages' (was Reparent ZWiki Pages)
+    'Zwiki: Recycle pages' (was Send ZWiki Pages to Recycle Bin)
+    
+    Zwiki also uses zope's 'Add Documents, Images, and Files' (no change)
+
+     Upgrade notes: you'll need to make a note of your zwiki
+     permissions settings before upgrading and recreate them after this
+     upgrade. You'll find all the new permissions at the bottom of the
+     security page, aside from the Add permissions which are
+     unchanged. Also you may have dtml which checks for the old
+     permissions and needs to be updated. For example, the wiki
+     templates refer to the permissions by name in
+     standard_wiki_header, standard_wiki_footer and editform.
+
+  * zwiki page 'subscribers' property replaced by 'subscriber_list'
+    property; the folder also now exposes this in the ZMI.  Upgrade
+    notes: old pages will be upgraded as needed, this will affect
+    the last-modified times.
+
+  * new zwiki page properties: 'creator', 'creator_ip', and
+    'creation_time'
+
+  * a 'redirectURL' REQUEST attribute can be used to control the
+    destination after edit, append or comment.
+
+  * the enclosing [] are displayed prior to page creation
+
+  * relative paths within [] now display in their entirety 
+    (instead of just the last component)
+
+  * UI and usability tweaks for the default subscription form;
+    other page subscriptions are listed
+
+  * the folder title is now used in html page titles, in mailout
+    subjects and before the word "contents" in the page header. The
+    old titleprefix method is no longer used.
+    
+  * wikimail: only comments (made via the "comment" method) are now
+    mailed out by default; to mail out all edits as before, set a
+    'mailout_policy' folder property to "edits".
+
+  * wikimail: hide mailout recipients (if Lennart Regebro's
+    MailHostFix product is installed)
+
+  * wikimail: mailout now requires either a 'mail_from' or
+    'mail_replyto' folder property. If 'mail_from' is present, always
+    use that for the From: field. Otherwise, show the poster's email
+    address or user name. (closes IssueNo0122)
+    
+  * wikimail: increase wrap margin from 70 to 78 in mailouts
+
+  * wikimail: add X-Zwiki-Version, X-BeenThere & Precedence headers
+
+  * wikimail: basic loop protection - silently discard any incoming
+    messages containing X-Zwiki-Version
+
+  * wikimail: mailin can now create pages (JosYule)
+
+  * wikimail: mailin can create tracker issues (see mailin.py)
+
+  * wikimail: mailin.py now accepts mail only from subscribers
+    (somewhere in the wiki) by default.  Call with 'subscribersonly=0'
+    or set folder property 'posting_policy' to "open" to disable.
+
+  * wikimail: the default destination page for mailin can be
+    configured with a 'default_page' folder property
+
+  * wikimail: use only the first plaintext part from multipart MIME
+    messages
+
+  * wikimail: use virtual host monster to help direct messages if
+    present (may have some imeme-isms ?)
+
+  * wikimail: some other tweaks to mailin delivery rules intended
+    to simplify mailin alias setup (see mailin.py)
+
+  * zwikidotorg template: header/footer/editform UI updates; display
+    subscriber count in the header; set comment headings on by default
+    for pages named "IssueNo*"
+
+  * zwikidotorg template: for site logo, use the folder's
+    'site_logo' property/object or the default zwiki icon.
+
+  * add zwiki web form: made this a little more robust; added
+    support for template configuration wizards (if a form or script
+    named TEMPLATE_config is found, redirect there to create the wiki)
+
+
+Bug fixes
+  * DeleteMe should redirect to the first existing parent
+    afterwards, now working again (IssueNo0008)
+
+  * zwiki now coexists with structured text footnote references
+    (yay!). [] will link to a matching footnote if there is one,
+    otherwise it is treated as a wiki link (IssueNo0110)
+    
+  * don't treat [] as wiki links if they contain characters which
+    zope does not allow in object ids (IssueNo0090)
+
+  * don't html-quote international characters any more. If losing
+    international characters due to edits by dumb browsers is now a
+    problem for you, please follow up on IssueNo0004.
+    (Taewook Kang & others)
+
+  * make wikiname regular expressions a bit more international by
+    using string.upper/lowercase. You may need to modify bad_id in
+    zope's OFS/ObjectManager.py also.
+    (LaloMartins, Alexy Khrabrov)
+
+  * fix for IssueNo0112, structured text pages have extra html &
+    body tags (natesain)
+
+  * parenting tweaked to work better with acquisition/subfolders
+    (IssueNo0108) (robert at redcor.ch) 
+    
+  * wikimail: stray html tags were being left in mailouts containing
+    long quoted lines (IssueNo0087)
+
+  * wikimail: don't add extra blank lines in mailouts
+    
+  * wikimail: don't send duplicates when subscribed to both page and
+    wiki (IssueNo0055)
+
+  * wikimail: calling mailin in the context of a page should always
+    use that page for posting, now it does
+
+  * wikimail: format quoted replies in mailed-in tracker issues,
+    as is done with mailed-in comments (IssueNo0070)
+
+  * zwikidotorg template & general: edit access control ui
+    improvements.  Help/subscribe links now always visible;
+    edit/append links conditionally visible; viewing editform requires
+    edit permission; misc. color & layout tweaks.
+    
+  * zwikidotorg template: fix scrolling to bottom of page after
+    comment
+
+  * zwikidotorg template: don't include "set" links on backlinks,
+    because they are vulnerable to robots
+
+  * zwikidotorg template: show search and quote in header by default
+    again
+
+  * zwikidotorg template: removed the "preferred front page" option
+    (IssueNo0120)
+
+  * zwikidotorg template: adding an empty comment was giving an error
+    (IssueNo0123)
+
+  * tracker support: issuedtml page type: layout & colour scheme tweaks
+
+  * tracker support: allow sorting by category/severity/status to
+    give the expected order (see IssueNo0115)
+    
+  * tracker support: don't list other page types when editing an issue page
+
+  * tracker support: don't inherit issuedtml page type when creating
+    a new page from an issue page
+
+  * Possibly fixed a bug with Add Zwiki Page permission. 
+
+  * unit tests overhauled, cleaned out and updated. Zwiki now
+    follows the latest zope testing practices. 
+
+API changes (summary)
+  * permissions renamed (see above)
+    
+  * viewing editform() now requires edit permission
+
+  * 'subscriber_list' page property replaces 'subscribers'
+
+  * new page properties: 'creator', 'creator_ip', 'creation_time'
+
+  * new optional folder (or page) property: 'mailout_policy'
+    
+  * new optional folder properties: 'mail_replyto',
+    'posting_policy', 'default_page'
+    
+  * 'titleprefix' property/method no longer used, folder title used
+    instead
+
+  * new optional REQUEST attribute: 'redirectURL'
+
+  * sendMailTo() now takes a list of recipients, not a string
+
+  * subscriberList(), wikiSubscriberList(), allSubscribers() now
+    return a list
+    
+  * new page methods: allSubscriptionsFor(email),
+    otherPageSubscriptionsFor(email)
+
+  * zwiki_mailin.py external method renamed to mailin.py
+
+  * new mailin() arguments: 'subscribersonly', 'trackerissue'
+
+  * wikis subdirectory renamed to templates, and filesystem
+    templates now use suffix to specify zope meta_type/zwiki page_type
+
+  * zwikidotorg template: new optional folder property 'site_logo'
+
+  * tracker support: new page methods: category_index(),
+    severity_index(), status_index()
+    
+
+Zwiki 0.9.8 2001-11-29
+======================
+
+  * auto-cataloging no longer requires DTMLDocumentExt and adding a
+    zwiki page no longer gives "AttributeError: index_object" if it's
+    not present. (IssueNo0054). Zwiki uses the catalog specified by
+    the SITE_CATALOG property, or "Catalog", or none.
+
+  * the add zwiki web form complained "list.remove(x): x not in list"
+    due to missing ZWiki/wikis/DEFAULTS, fixed  (IssueNo0043)
+
+  * includes the experimental 'issuedtml' render method used by
+    ZwikiTracker
+
+  * zwikidotorg template: UserOptions was not displaying the
+    username field properly
+
+  * a somewhat important change that also went in last release:
+    responsibility for generating the page header and footer
+    has been moved into the render_* methods
+
+
+Zwiki 0.9.7.2 2001-11-26
+========================
+
+  * blank extra revision on each edit fixed; browsing diffs now
+    works like it's supposed to (credits-to: Geoff Gardiner)
+    
+  * included TextFormatter.py in tarball
+
+  * updated README, removed mention of zwikiwebs.zexp
+
+  * added download link to announcements
+
+    (credits-to: Ray Lance, Dietmar Gaffling)
+
+
+Zwiki 0.9.7.1 2001-11-23
+========================
+
+  * zwikidotorg template: remove "BookMarks" page reference from
+    footer
+
+  * ack it's going to be one of  *those* releases :)
+    zwikidotorg template: UserOptions page_type should be 
+    structuredtextdtml
+
+
+Zwiki 0.9.7 2001-11-23
+======================
+
+  * another zwikiwebs change. The 'Add ZWiki Web' form now looks
+    for wiki templates in both the filesystem (.../ZWiki/wikis/) and
+    the ZODB (/Control_Panel/Products/ZWiki/), with filesystem taking
+    precedence. The zwikidotorg template is shipped (via filesystem)
+    as the default; additional templates can be installed in either
+    place, or not, at user discretion.  Auto-import of zexp's has been
+    disabled. (credits-to: CMFWiki)
+
+  * new comment method added, just like append but convenient for
+    adding standard comment headings
+    
+  * misc wikimail & comment heading tweaks; mail-outs now discard
+    the comment heading if present; don't display fractional seconds
+    in comment headings (credits-to: 1Jerry)
+
+  * stopped antidecapitationkludge appearing in html source; no
+    longer used in 2.4
+
+  * misc 2.4 compatibility updates; added workaround to disable
+    stxNG's footnote links on 2.4
+    
+  * zwikidotorg template: UserOptions cleanup; added workaround for
+    zope 2.4.x-2.4.2's stx underline problem; added site logo option &
+    presets
+    
+  * automatic cataloging is supported again. Currently, the
+    DTMLDocumentExt product is assumed to be present. It's
+    SITE_CATALOG property is required to activate this.
+    (credits-to: DTMLDocumentExt)
+    
+  * textDiff now reports more localised changes, instead of spraying
+    out the whole page; misc diff tweaks & fixes
+    (credits-to: ndiff/difflib)
+
+  * long lines are wrapped before diffing, and long diff chunks are
+    abbreviated, for better readability in email. Currently it
+    displays up to 10 deleted lines and up to 50 added lines.
+    (credits-to: Hamish Lawson's TextFormatter)
+
+  * lasttext and the diff methods accept one or more revision arguments
+    (counted backwards from the latest revision).
+
+  * the old html-format diff has been demoted to oldDiff. The new one
+    colourizes textDiff's output and adds whizzy navigation links for
+    stepping through the edits. (Click on the page timestamp).
+
+  * zwikidotorg template: automatic comment headings now available
+    on all pages and enabled by default on  *Discussion pages; 
+    horizontal rules now used
+    
+  * zwikidotorg template: header & footer tweaks; don't display 
+    ip address for last editor
+
+  * zwikidotorg template: subscribe form email address integrated
+    with UserOptions
+
+  * improved default subscribe form's layout; remember email address
+    via cookie if possible
+
+
+Zwiki 0.9.6 2001-10-22
+======================
+
+  * zwikidotorg template updated to latest zwiki.org layout,
+    example append_with_heading method added
+
+  * mail subscribers now receive edits as well as appends
+
+  * simple create method added to api
+
+  * new page- & wiki-wide mail subscription mechanism
+    (.../subscribeform)   
+
+  * wiki_page_url/wiki_base_url renamed to page_url/wiki_url;
+    checkEditTimeStamp/editTimestamp renamed to
+    checkEditConflict/timeStamp; old api kept for backwards
+    compatibility
+
+  * code cleanups, refactoring
+
+
+Zwiki 0.9.5 2001-10-13
+======================
+
+  * the link to an uploaded file or image used to be !-escaped; this
+    is no longer necessary
+    
+  * file upload now requires "Add Documents, Images and Files"
+    permission (was "Add Documents, Files and Images")
+    
+  * fixed zwiki_username_or_ip() so last editor username is saved again
+    
+  * moved zwiki web creation into core python product, so the manual
+    ZWikiWebs import is no longer needed.  The sample wikis are now
+    shipped as individual zexp's in ZWiki/import, and are
+    automatically imported to /Control_Panel/Products/ZWiki at product
+    startup. (Install your own sample wikis there as
+    well). /Control_Panel/Products/ZWikiWebs can be deleted.
+
+  * "add zwiki web" form updates
+
+
+Zwiki 0.9.4 2001-08-04
+======================
+
+  * escaping remote wiki links with ! should now work
+
+  * tests have been completely reorganized and updated
+
+  * added custom __repr__ from CMFWiki
+    
+  * refactored code into multiple modules, following CMFWiki.
+    Encapsulated some functionality in mix-in classes.
+
+  * another stx fixup: a single letter followed by a period is no
+    longer mistaken for a numeric bullet
+    
+  * fix for one of 0.9.3's stx fixups: spurious html comments no
+    longer appear in stx examples
+
+  * exposed the "zwiki_username_or_ip" utility method, which given
+    REQUEST returns a best guess for username (authenticated user,
+    zwiki_username cookie, or ip address)
+
+  * experimental "lasttext" and "diff" methods show the text of a page's
+    last revision and a concise diff with the latest
+
+  * bare/noheader/nofooter flags can now also be passed as keyword args
+
+  * from WikiForNow: wiki-linking is now inhibited within 
+  * <pre></pre>
+  * <code></code>
+  * structured text :: examples
+  * structured text '' quoted code
+  * html tags.
+    
+  * append permission now works
+
+  * tweaked the anti-javascript hack
+
+  * tweaked the anti-decapitation kludge
+
+  * added plainhtmldtml mode (DTML + HTML, nothing else)
+
+
+Zwiki 0.9.3 2001-05-02
+======================
+
+  * creating/editing/deleting pages with eg spaces in the name has
+    been broken for a while, it seems - made some fixes in this area
+    
+  * made the edit conflict message more helpful
+
+  * relaxed edit conflict checking: if your username & ip address
+    match the last editor's, the timestamp will be ignored.  In other
+    words, you can no longer have an edit conflict with yourself.
+    This means eg you can backtrack in your browser, edit and click
+    Change again. This change may disable conflict checking amongst
+    anonymous users coming through a proxy.
+
+  * renamed the "username" property to "last_editor", added
+    "last_editor_ip", made these read-only in the mgmt. interface.
+    Existing zwiki pages are upgraded when viewed. dtml-var username is
+    still supported for backwards compatibility, but deprecated; use
+    dtml-var last_editor_or_ip by preference.
+
+  * stx workaround: trailing blank lines no longer cause unwanted
+    headings
+
+  * stx workaround: initial word plus period no longer becomes a
+    numeric bullet
+
+  * stx workaround: whitespace after :: no longer prevents example
+    formatting
+    
+  * stx headings on first lines were broken - fixed
+    
+  * fix for a 0.9.1 bug: with hierarchy display enabled, creating a
+    new page from a top-level page gave "typeerror"
+
+  * gopher: urls are now recognized
+
+  * renamed {wiki,page}_path to {wiki,page}_url in 0.9.2
+
+
+Zwiki 0.9.2 2001-04-26
+======================
+
+  * added a bunch of wiki_{page,base}_url variants for testing purposes
+
+  * about: urls are now recognized
+
+  * fixed a potential DeleteMe error message caused by incorrect parents
+
+  * allow standard_wiki_page to be defined as a folder property
+    
+  * added plainhtml render mode - HTML only, no wiki-linking
+
+  * test suite updates, documentation
+
+
+Zwiki 0.9.1 2001-04-24
+======================
+
+  *  allow non-wiki paths in []
+
+  * image file names in [] are auto-inlined
+
+  * use uploaded image size to help "add file/image" decide whether to inline
+    
+  * reset parents when they have become outdated/confused
+
+  * folder attribute "standard_page_type" overrides type of all new pages
+
+  * display new page name when creating a page
+
+  * record username when creating a page
+
+  * renamed wiki_page_url(), wiki_base_url() to page_path(),
+    wiki_path(). The old names, used throughout existing dtml code,
+    are supported but deprecated
+
+  * made remotewikilinks more careful to avoid trailing punctuation
+
+  * allow []-named pages in remote wiki links
+
+  * disable structured text's [] footnote linking to avoid conflicts
+
+
+Zwiki 0.9.0 2001-04-23
+======================
+
+  * added append method
+
+  * simple email notification (PageSubscribers)
+
+  * made wikilinks absolute for greater robustness
+
+  * header/footer layout tweaks
+
+  * made last editor's authenticated username override username cookie
+
+  * proxy role tweak
+
+  * added file/image upload
+
+  * added more detailed permissions
+
+  * refactored edit()
+
+  * changed/reverted wiki_{page,base}_url as per Christian Scholz
+    for virtual hosting
+    
+  * allowed https: urls
+
+  * allowed + and $ in remote wiki links
+
+
+Zwiki 0.8.1 2001-01-04
+======================
+
+  * added (experimental) page deletion
+
+  * record IP address when username cookie is blank
+
+  * make disabled javascript tags visible
+
+  * added more unit tests
+
+
+Zwiki 0.8.0rc1 2000-12-14
+=========================
+
+  * log last editor's IP address if there is no username cookie
+
+  * wrapped a bunch of long lines
+
+  * unit tests - added support for ZUnit and DocTest, and a few
+    initial tests. http://zwiki.org/zwikidir/Makefile.sample contains
+    some useful recipes for automated testing.
+
+    ZWikiWebs.zexp: incorporated latest zwiki.org tweaks, namely:
+
+  * removed a spurious menu from the add zwiki web form   
+
+  * added UserOptions to the default BookMarks and removed it from
+    the page footer
+
+  * bookmarks, quote, search box and hierarchy may all be turned on
+    or off in UserOptions
+
+  * the default home page is now a user option
+
+  * user options & search box tab ordering fixed
+
+  * always show the editform even for write-protected pages, with
+    appropriate header/footer color
+
+  * page history is now accessible
+
+  * simplified RecentChanges 
+
+    
+Zwiki 0.7.1 2000-11-03
+======================
+
+  * fixed broken line-ending handling and non-rendering of initial
+    lines containing ":" in dtml modes
+
+  * return to the wiki page after clicking the reparent button
+
+  * added warning of incompatibility with old dtml methods to readme
+
+    
+Zwiki 0.7.0 2000-10-31 "Halloween!"
+===================================
+
+  * cookie-based user options, including edit form size, timezone,
+    bookmarks and wikiwikiweb-style username (help from Phil Armstrong)
+
+  * ZWiki is now zope 2.2-compatible (Garth Kidd) and -requiring,
+    and benefits from the 2.2 security model. Executable dtml pages
+    now run with those permissions that are common to both the
+    page-viewing user and the wiki web's owner. Set the folder's
+    owner to limit the permissions of executable pages.
+
+  * incorporated & updated Chris Withers' product for creating wiki webs
+
+  * added streamlined "hierarchal2" wiki style & other layout tweaks
+
+  * wikiwikiweb-style late page creation
+
+  * added simple javascript-disabling code
+
+  * made paths work with virtual hosting again (Evan Simpson)
+
+  * fixed unreliable ! line protection in structuredtext modes
+
+  * fixed unreliable remote wiki links in classicwiki mode
+
+  * more permissive remote wiki link regexps (Geoff Gardiner)
+
+  * "with this" dtml kludge no longer needed
+
+  * added built-in defaults for all dtml methods
+
+  * simpler, more consistent urls & api
+
+  * code refactoring/cleanups, other misc. bugfixes
+
+
+Zwiki 0.6.1 2000-05-03
+======================
+
+  * documented permission configuration in zwiki_examples/index_html
+
+    
+Zwiki 0.6 2000-05-02 "skins-structure-permissions"
+==================================================
+
+  * wikinames must now start on a word boundary
+
+  * added # and = to url regexp
+
+  * try allowing numbers in wikinames
+
+  * added utility methods wiki_base_url & wiki_page_url
+
+  * added KenManheimer's hierarchy & navigation code
+
+  * added JimFulton's edit conflict safety belts for http & ftp
+
+  * added jim's permission & validation patch
+
+  * add & change zwiki page permissions are now functional
+
+  * reorganized & expanded example content
+
+  * deemphasised DTML-enabled content where not needed - 
+    changed pages to structuredtext where possible, 
+    restricted permissions on the rest, changed the default
+    page type to structuredtext
+
+
+Zwiki 0.5 2000-03-27 "simple"
+=============================
+
+  * simplified the default wiki content & page layout
+
+  * disabled catalog support for the moment
+
+
+Zwiki 0.4 2000-02-14
+====================
+
+  * new sample wiki, defaults to structuredtextdtml mode only
+
+  * bare urls are automatically hyperlinked, others should be left alone
+
+  * extensible markup modes - you can add your own render methods
+
+  * code cleanups
+
+  * tweaked markup modes for usability (see new TextFormattingRules)
+
+  * made validation of newly-edited DTML more accurate
+
+  * ZWikiPages are catalog-aware (mostly.. still some issues ?)
+
+  * added RemoteWikiLinks
+
+  * bracketed numbers are no longer wikilinks, so StructuredText's 
+    footnotes can work
+
+
+Zwiki 0.3 1999-11-14
+====================
+
+  * sample wiki: included latest DTML features from ZWikiWeb - 
+    SearchPage, JumpTo, AnnoyingQuote, separate edit page, etc etc.
+
+  * multiple markup formats - 
+      structured text
+      classic wiki (TresSeaver)
+      HTML/DTML
+      plain text
+
+  * better international character handling (AlexandreRatti)
+
+  * LFCR line-terminations are converted to LF
+
+  * tweaked editform layout
+
+  * source cleanup
+
+  * renamed default_wiki_page to standard_wiki_page for consistency
+
+  * ! at the beginning of a line protects it from wiki translation
+
+
+Zwiki 0.2 1999-11-08
+====================
+
+  * now checks for valid DTML & reports errors
+
+  * no longer requires "view management screens" permission
+
+  * tweaked wikilink regexp
+
+  * new icon
+
+  * misc fixes
+
+  * standard_wiki_header, standard_wiki_footer & default_wiki_page
+    have built-in defaults; define as dtml methods to override
+
+  * sample wiki: AllPages is a zwikipage; pagenames with spaces 
+    are listed properly
+
+  * sample wiki: added a RecentChanges page
+
+  * sample wiki: simplified
+
+
+Zwiki 0.1 1999-11-05 
+=====================
+
+  * initial development release

Added: zope-zwiki/branches/upstream/current/CMF.py
===================================================================
--- zope-zwiki/branches/upstream/current/CMF.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/CMF.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,189 @@
+# CMF compatibility
+# this is split between CMF.py, CMFInit.py and Extensions/cmf_install_zwiki.py
+# (unfortunately) and it's still not right (need to import makeWikiPage
+# for PUT_factory ?). 
+# move CMFInstall into the skin ?
+
+from types import *
+import string, re, os
+from Globals import InitializeClass
+
+try:
+    from Products import CMFCore
+    HAS_CMF = 1
+except ImportError:
+    HAS_CMF = 0
+
+# XXX also need to skip when running unit tests ?
+if not HAS_CMF:    
+    class PageCMFSupport:
+        __implements__ = ()
+        def supportsCMF(self): return 0
+        def inCMF(self): return 0
+
+else:
+    from AccessControl import ClassSecurityInfo
+    from Acquisition import aq_base, aq_inner, aq_parent
+    from OFS.DTMLDocument import DTMLDocument
+    from Products.CMFCore.PortalContent import PortalContent
+    from Products.CMFDefault.SkinnedFolder import SkinnedFolder
+    from Products import CMFDefault
+    from Products.CMFDefault.DublinCore import DefaultDublinCoreImpl
+    from AccessControl import getSecurityManager, ClassSecurityInfo
+    from DateTime import DateTime
+    import Permissions
+    from Defaults import PAGE_PORTALTYPE
+
+    # backwards compatibility
+    class WikiFolder(SkinnedFolder):
+        meta_type='Wiki Folder'
+        security = ClassSecurityInfo()
+        security.declarePublic('allowedContentTypes')
+        def allowedContentTypes( self ):
+            return []
+    InitializeClass(WikiFolder)
+        
+    class ZwikiDublinCoreImpl(DefaultDublinCoreImpl):
+        """
+        Zwiki's implementation of Dublin Core.
+
+        We use our own similar attributes..
+        XXX maybe we can always use dublin core and simplify.
+        """
+        __implements__ = DefaultDublinCoreImpl.__implements__ 
+
+        security = ClassSecurityInfo()
+        security.declarePrivate('setModificationDate')
+        def setModificationDate(self, modification_date=None):
+            if modification_date is None:
+                self.last_edit_time = DateTime().ISO()
+            else:
+                self.last_edit_time = self._datify(modification_date).ISO()
+
+        security.declarePublic('modified')
+        def modified(self):
+            return self.lastEditTime()
+
+        security.declarePublic('Creator')
+        def Creator(self):
+            return self.creator
+
+        security.declarePublic('Description')
+        def Description(self):
+            return self.summary()
+
+        security.declarePublic( 'CreationDate' )
+        def CreationDate(self):
+            return self.creationTime().ISO()
+
+        security.declarePublic( 'getPageTitle' )
+        def getPageTitle(self, here=None, template=None, portal_title=None):
+            """
+            Return the proper name of this page for use by Plone.
+
+            A quick fix for plone's script, which doesn't like using
+            our page's title when it's the same as the id.
+            XXX file a bug
+            """
+            return self.pageName()
+        
+
+    InitializeClass(ZwikiDublinCoreImpl)
+
+    class PageCMFSupport(PortalContent, ZwikiDublinCoreImpl):
+        """
+        Mix-in class for CMF support
+        """
+        __implements__ = ZwikiDublinCoreImpl.__implements__ + \
+                         PortalContent.__implements__
+   
+        portal_type = PAGE_PORTALTYPE
+        # provide this so DublinCore.Format works with old instances
+        format = 'text/html'
+
+        # permission defaults
+        security = ClassSecurityInfo()
+        set = security.setPermissionDefault
+        set(Permissions.Edit, ('Owner', 'Manager', 'Authenticated'))
+        set(Permissions.FTPRead, ('Owner', 'Manager'))
+        set(Permissions.Add, ('Owner', 'Manager', 'Authenticated'))
+        #set(Permissions.Move, ('Owner', 'Manager'))
+        set(Permissions.Comment, ('Owner', 'Manager', 'Authenticated'))
+        set = None
+
+        security.declarePublic('supportsCMF')
+        def supportsCMF(self):
+            return 1
+
+        security.declarePublic('inCMF')
+        def inCMF(self):
+            """return true if this page is in a CMF portal"""
+            return hasattr(self.aq_inner.aq_parent,'portal_membership')
+
+        def __init__(self, source_string='', mapping=None, __name__=''):
+            DTMLDocument.__init__(self,
+                                  source_string=source_string,
+                                  mapping=mapping,
+                                  __name__=__name__,
+                                  )
+            ZwikiDublinCoreImpl.__init__(self)
+
+        security.declarePublic('getId')
+        def getId(self):
+            try: return self.id()
+            except TypeError: return self.id
+
+        security.declareProtected(Permissions.View, 'SearchableText')
+        def SearchableText(self):
+         """Return the main searchable fields concatenated for easy indexing.
+
+         Used by eg Plone's livesearch.
+         """
+         # XXX how naive to think this could work.. wait for the unicode errors
+         return '%s\n%s' % (self.pageName(), self.text())
+         #example from AT:
+         #if type_datum is UnicodeType:
+         #    datum = datum.encode(charset)
+         #datum = "%s %s" % (datum, vocab.getValue(datum, ''), )
+
+        # Disabled so we can set the subject from Plone's Metadata view
+        #security.declareProtected(Permissions.View, 'Subject')
+        #def Subject(self):
+        #    return self.spacedPageName()
+
+        security.declareProtected(Permissions.View, 'Description')
+        def Description(self):
+            return self.summary()
+
+        def wiki_context(self, REQUEST=None, with_siblings=0):
+            return self.context(REQUEST, with_siblings)
+
+        # Zwiki pages are different from other portal content; for one
+        # thing, we follow the Zwiki: * permissions (ignoring eg Modify
+        # portal content) so we need to reflect those. Also because we
+        # have some key UI functions up there in the edit border (history,
+        # backlinks, subscription), we will almost always need to show it.
+        # Which is a pity, as (a) pages look nicer without it, and (b) in
+        # the plone UI it signifies edit access, and we might not be
+        # permitting that.  Better ideas welcome. For now we will just
+        # force it always on.
+        # Also note Plone 2.1.0 unconditionally hides the green border for
+        # anonymous users, which is a bug. In future they will probably
+        # check for the modify portal content and review permissions first.
+        def showEditableBorder(self,**args):
+            """Always show the green border; Zwiki's current UI needs it."""
+            return 1
+
+        def isDefaultPageInFolder(self):
+            """ Returns a boolean indicating whether the current context is the
+                default page of its parent folder.
+
+                Plone 2.5 wants this. It's used (so far) to disable
+                plone's cut/copy/paste/rename actions for the default
+                page. I guess this suits Zwiki's default (front) wiki
+                page.
+            """
+            return self == self.defaultPage()
+
+InitializeClass(PageCMFSupport)
+

Added: zope-zwiki/branches/upstream/current/CMFInit.py
===================================================================
--- zope-zwiki/branches/upstream/current/CMFInit.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/CMFInit.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,174 @@
+# stuff that didn't fit in CMF.py or __init__.py
+# __init__ tries to import this, will ignore any errors
+
+from types import *
+import string, re, os
+from AccessControl import getSecurityManager
+from DateTime import DateTime
+import Products.CMFCore.utils
+from Products.CMFCore.DirectoryView import registerDirectory
+
+from ZWikiPage import ZWikiPage
+import Permissions
+from Defaults import PAGE_METATYPE, PAGE_PORTALTYPE
+from I18n import _
+
+# no longer used, but maybe later.
+try:
+    import Products.CMFPlone.utils
+    PLONE_VERSION = Products.CMFPlone.utils.getFSVersionTuple()
+except ImportError:
+    PLONE_VERSION = (0,0,0) # not installed
+
+default_perms = {
+    'create': 'nonanon',
+    'edit': 'nonanon',
+    'comment': 'nonanon',
+    'move': 'owners', # rename/delete/reparent
+    'regulate': 'owners'
+    }
+
+wiki_globals=globals()
+
+registerDirectory('skins', wiki_globals)
+
+def initPageMetadata(page):
+    page.creation_date = DateTime()
+    page._editMetadata(title='',
+                       subject=(),
+                       description='',
+                       contributors=(),
+                       effective_date=None,
+                       expiration_date=None,
+                       format='text_html',
+                       language='',
+                       rights = '')
+
+def makeWikiPage(id, title, file):
+    ob = ZWikiPage(source_string=file, __name__=id)
+    ob.title = title
+    ob.parents = []
+    username = getSecurityManager().getUser().getUserName()
+    ob.manage_addLocalRoles(username, ['Owner'])
+    #ob._getRegs().setSubOwner('both')
+    initPageMetadata(ob)
+    #XXX sets up default permissions/regulations
+    #for name, perm in ob._perms.items():
+    #    pseudoperm = default_perms[name]
+    #    local_roles_map = ob._local_roles_map
+    #    roles_map = ob._roles_map
+    #    roles = (local_roles_map[name],) + roles_map[pseudoperm]
+    #    ob.manage_permission(perm, roles=roles)
+    return ob
+
+def addWikiPage(self, id, title='', page_type=None, file=''):
+    id=str(id)
+    title=str(title)
+    ob = makeWikiPage(id, title, file)
+    ob.setPageType(
+        page_type or getattr(self,'allowed_page_types',[None])[0])
+    self._setObject(id, ob)
+
+factory_type_information = (
+    {
+     'id':             PAGE_PORTALTYPE,
+     'meta_type':      PAGE_METATYPE,
+     'content_icon':   'wikipage_icon.gif',
+     'product':        'ZWiki',
+     'factory':        'addWikiPage',
+     'immediate_view': '',
+     'actions':        (
+                        {
+                         'name'        : 'View',
+                         'id'          : 'view',
+                         'action'      : '',
+                         'permissions' : (Permissions.View,),
+                         'category'    : 'object',
+                         },
+                        {
+                         'name'        : 'Edit',
+                         'id'          : 'edit',
+                         'action'      : 'editform',
+                         'permissions' : (Permissions.Edit,),
+                         'category'    : 'object',
+                         },
+                        {
+                         'name'        : 'Subscribe',
+                         'id'          : 'subscribe',
+                         'action'      : 'subscribeform',
+                         'permissions' : (Permissions.View,),
+                         'condition'   : 'object/isMailoutEnabled',
+                         'category'    : 'object',
+                         },
+
+                        # NB object_actions actions display in reverse order!
+                        # (last will be left-most)
+                        {
+                         'visible'     : 0,
+                         'name'        : 'Wiki options',
+                         'id'          : 'useroptions',
+                         'action'      : 'python:object.preferencesUrl()',
+                         'permissions' : (Permissions.View,),
+                         'category'    : 'object_actions',
+                         },
+                        {
+                         'visible'     : 0,
+                         'name'        : 'Wiki search',
+                         'id'          : 'searchwiki',
+                         'action'      : 'python:object.searchUrl()',
+                         'permissions' : (Permissions.View,),
+                         'category'    : 'object_actions',
+                         },
+                        {
+                         'name'        : 'Issue pages',
+                         'id'          : 'issuetracker',
+                         'action'      : 'python:object.trackerUrl()',
+                         'permissions' : (Permissions.View,),
+                         'condition'   : 'object/hasIssues',
+                         'category'    : 'object_actions',
+                         },
+                        {
+                         'name'        : 'Wiki changes',
+                         'id'          : 'recentchanges',
+                         'action'      : 'python:object.changesUrl()',
+                         'permissions' : (Permissions.View,),
+                         'category'    : 'object_actions',
+                         },
+                        {
+                         'name'        : 'Wiki contents',
+                         'id'          : 'contents',
+                         'action'      : 'python:object.contentsUrl()',
+                         'permissions' : (Permissions.View,),
+                         'category'    : 'object_actions',
+                         },
+                        {
+                         'name'        : 'Related pages',
+                         'id'          : 'backlinks',
+                         'action'      : 'backlinks',
+                         'permissions' : (Permissions.View,),
+                         'category'    : 'object_actions',
+                         },
+                        {
+                         'name'        : 'History',
+                         'id'          : 'history',
+                         'action'      : 'diff',
+                         'permissions' : (Permissions.View,),
+                         'category'    : 'object_actions',
+                         },
+                        ),
+     },
+    )
+
+
+def initialize(context): 
+    """Initialize the ZWiki product for use in CMF.
+    """
+    registerDirectory('skins', globals())
+    # XXX I don't want this in the zmi add menu, how can I hide it ?
+    Products.CMFCore.utils.ContentInit(
+        'Wiki Content',
+        content_types = (ZWikiPage, ),
+        permission = Permissions.Add,
+        extra_constructors = (addWikiPage, ),
+        fti = factory_type_information,
+        ).initialize(context)

Added: zope-zwiki/branches/upstream/current/CMF_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/CMF_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/CMF_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,115 @@
+# This should be testInstall.py to correspond with Install.py, but we need
+# a place for general CMF/Plone tests and may as well gather them here.
+# Only tests specific to CMF and/or Plone should go in here; it's better
+# to write a generic test elsewhere if possible.
+#
+# We can no longer set up a test plone ourselves with plone 2 - rely on
+# PloneTestCase instead.
+#
+# Skip these tests if plone 2 & all required products are not present
+# XXX CMF still covered adequately ?
+
+try:
+    from Products import CMFPlone
+    HAS_PLONE = 1
+except ImportError:
+    HAS_PLONE = 0
+
+if not HAS_PLONE:
+    # dummy test suite
+    import unittest
+    def test_suite():
+        return unittest.TestSuite()
+
+else:
+    from testsupport import *
+    ZopeTestCase.installProduct('ZWiki')
+    ZopeTestCase.installProduct('TextIndexNG2')
+
+    from Products.CMFPlone.tests import PloneTestCase
+
+    from Editing_tests import test_rename
+
+    def test_suite():
+        suite = unittest.TestSuite()
+        suite.addTest(unittest.makeSuite(TestsOfCMFPloneInstall))
+        suite.addTest(unittest.makeSuite(Tests))
+        return suite
+
+    def cmf_install_zwiki(site):
+        site.manage_addProduct['ExternalMethod'].manage_addExternalMethod(
+            'cmf_install_zwiki','','ZWiki.Install','install')
+        site.cmf_install_zwiki()
+
+    # this fixture provides a plone site without zwiki installed
+    class TestsOfCMFPloneInstall(PloneTestCase.PloneTestCase):
+        afterSetUp = afterSetUp
+
+        def testInstallViaExternalMethod(self):
+            cmf_install_zwiki(self.portal)
+            self.assert_(hasattr(self.portal.portal_types,'Wiki Page'))
+
+        #def testInstallViaQuickInstaller(self):
+
+    # and this one comes with zwiki installed
+    class Tests(PloneTestCase.PloneTestCase):
+        def afterSetUp(self):
+            afterSetUp(self)
+            # install zwiki and set the site up as our one-page test wiki
+            # probably don't need to do this every time now
+            cmf_install_zwiki(self.portal)
+            self.wiki = self.portal
+            self.portal.manage_addProduct['ZWiki'].manage_addZWikiPage('TestPage')
+            self.page = self.portal.TestPage
+
+        def XtestLinkToAllCataloged(self):
+            # you're not allowed to shadow the id of an object in the portal
+            # root folder (!) so we need to remove the outline object that
+            # got created there during setup
+            self.portal._delObject('outline')
+            self.portal.manage_addFolder(id='folder1') #XXX Unauthorized ?
+            self.portal.folder1.manage_addProduct['ZWiki'].manage_addZWikiPage('Page1')
+            self.portal.manage_addFolder(id='folder2')
+            self.portal.folder2.manage_addProduct['ZWiki'].manage_addZWikiPage('Page2')
+            # off by default
+            self.assert_(not self.page.linkToAllCataloged())
+            self.assertEquals(len(self.page.pages()),1)
+            # a property enables
+            self.portal.link_to_all_cataloged = 1
+            self.assert_(self.page.linkToAllCataloged())
+            self.assertEquals(len(self.page.pages()),4)
+            # (namely:
+            # /portal/Members/test_user_1_/wiki/TestPage
+            # /portal/TestPage
+            # /portal/folder1/Page1
+            # /portal/folder2/Page2)
+
+        def XXXtestLinkToAllObjects(self):
+            # off by default
+            self.assert_(not self.page.linkToAllObjects())
+            self.assertEquals(len(self.page.pages()),1)
+            # a property enables
+            self.portal.link_to_all_objects = 1
+            self.assert_(self.page.linkToAllObjects())
+            #self.assertEquals(len(self.page.pages()),1)
+
+        def XXXtestPageViewing(self):
+            #t = self.portal.index_html() # works
+            #t = self.portal.TestPage() # fails, wants a CMF skin
+            #app = ZopeTestCase.app()
+            #ZopeTestCase.utils.setupSiteErrorLog(app)
+            #ZopeTestCase.close(app)
+            #import pdb; pdb.set_trace()
+            import ZPublisher
+            t = ZPublisher.test('Zope',self.portal.TestPage.getPath())
+            # can't make this work either.. TestPage seems to be disappearing
+            # unexpectedly
+
+        def testPageSaving(self):
+            self.portal.TestPage.append(text='test')
+
+        def test_setModificationDate(self):
+            self.portal.TestPage.setModificationDate()
+
+        testPageRenaming = test_rename
+

Added: zope-zwiki/branches/upstream/current/CONTRIBUTORS
===================================================================
--- zope-zwiki/branches/upstream/current/CONTRIBUTORS	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/CONTRIBUTORS	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,80 @@
+ZWIKI REPO CONTRIBUTOR'S AGREEMENT V1.0
+=======================================
+
+This is the official contributor list and contributor's agreement for
+the main ZWiki code repository.  If you contribute code here, please
+sign this document by adding your name to the contributor list below,
+in order to ensure that:
+
+- you get proper credit for your work
+
+- there is a clear audit trail and legal status for the project
+
+- the project can easily remain license-compatible with other free &
+  open-source software in future.
+
+Your signature below asserts that your commits to this repository:
+
+- are released under the GNU GPL v2; or are under another
+  GPL-compatible license, such as ZPL, if clearly noted as such; 
+  or are public domain
+
+- may be relicensed under official future versions of their license,
+  at the Zwiki project manager's discretion
+
+- are free of known patent violations or copyright violations
+
+
+ZWIKI CONTRIBUTORS
+==================
+
+Contributors who have signed the contributor agreement
+------------------------------------------------------
+Simon Michael <simon at joyful.com> - lead developer
+Encolpe Degoute <encolpe at colpi.info> - french translation, plone adjustment, extend tracker capacity
+Frank Laurijssens <frank at laurijssens.nl> - 
+John Riley <riley at uic.com> - 
+
+
+Contributors who have not yet signed
+------------------------------------
+Alan Runyan - Plone skin fixes
+Alexander Limi - Plone skinning
+Alexandre Ratti - internationalization fixes
+Casey Duncan - ExternalEditor ?
+Chad Miller - MoinMoinMarkup patch
+Chris McDonough - CMFWiki
+Chris Withers - ZWikiWebProduct
+Garth Kidd - NooZWiki, NeverSaved
+Jim Fulton - edit conflict checking, ftp support, security patches, zope infrastructure changes
+Ken Manheimer - WikiStructuringIdeas, page hierarchy, regulations, WikiForNow
+Lalo Martins - CMF improvements
+Mike Pelletier - security & safety issues
+Peter Merel - WWML & parenting enhancements
+Sidnei da Silva - CMF improvements
+Tres Seaver - StructuredText support, WWML support, ZCWiki
+others not yet listed here...
+
+
+Contributors outside the main code base:
+----------------------------------------
+These folks have not committed code here and don't need to sign, they are
+included for completeness:
+
+Adam Feuer - OnlineBookstoreLinks
+Andrew Cates - gardening and clarifying mainly
+Dean Goodmanson - WikiMailDiscussion, ZwikiTracker, BloggingDiscussion, [SubWiki]s...
+Edward Kreis - JumpSearchModification, NeverCreated
+Evan Simpson - wiki_page_url/virtual hosting suggestions
+Florian Konnertz - DTML experiments, wiki refactoring and AboutZwikiDocs
+Geoff Gardiner - ManagedMode
+Jeff Risberg - ZwikiWithFrames
+Johan Carlsson - ZWikiZC
+Jos Yule
+Justin Clift - docs
+Paolo Pumilia - italian translation of ZwikiWithFrames
+Phil Armstrong - LinkColourHack
+Pieter B - often submits bugs in the [ZwikiTracker]s and works on ZwikiMail and the ZwikiFrontend 
+Rik Hoekstra - wiki_page_url/virtual hosting suggestions
+Ron Dagostino - RecentChangesBySubjectFeature, DeletePageFeature etc
+tav - PlexNews (early zwiki/ptk combo)

Added: zope-zwiki/branches/upstream/current/Catalog.py
===================================================================
--- zope-zwiki/branches/upstream/current/Catalog.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Catalog.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,132 @@
+# catalog awareness for zwiki pages
+# originally based on Casey Duncan's DTMLDocumentExt 0.1
+
+import string
+
+from AccessControl import getSecurityManager, ClassSecurityInfo
+from Globals import InitializeClass
+
+import Permissions
+from Utils import BLATHER,formattedTraceback
+
+
+class PageCatalogSupport:
+    """
+    Holds most of ZWikiPage's catalog awareness code.  Similar to Zope's
+    or CMF's catalog awareness with a little extra behaviour.
+
+    Confusing code duplication between zwiki/plone/cmf/zope here. 
+    """
+    security = ClassSecurityInfo()
+
+    NOT_CATALOGED=0
+    _properties=(
+        {'id':'NOT_CATALOGED', 'type': 'boolean', 'mode': 'w'},
+        )
+
+    security.declareProtected(Permissions.View, 'isCatalogable')
+    def isCatalogable(self):
+        return not getattr(self, 'NOT_CATALOGED', 0)
+
+    def catalog(self):
+        """
+        Return the catalog object used by this page, if any.
+
+        By default, Zwiki looks for a catalog named 'Catalog' in this
+        folder (will not acquire) or a 'portal_catalog' in this folder
+        or above (will acquire).
+        """
+        folder = self.folder()
+        #if not folder: return None ?
+        folderaqbase = getattr(folder,'aq_base',
+                               folder) # make tests work
+        if hasattr(folderaqbase,'Catalog') and hasattr(folderaqbase.Catalog,'indexes'):
+            return folder.Catalog
+        else:
+            try:
+                # acquisition wrapper is explicit in plone 2.1/ATCT or
+                # zope 2.8.1 (#1137)
+                return folder.aq_acquire('portal_catalog')
+            except:
+                return getattr(folder,'portal_catalog',None)
+
+    security.declareProtected(Permissions.View, 'hasCatalog')
+    def hasCatalog(self):
+        """Is this page keeping itself indexed in a catalog ?"""
+        return self.catalog() != None
+
+    security.declareProtected(Permissions.View, 'catalogId')
+    def catalogId(self):
+        """
+        Give the id of the catalog used by this page, or "NONE".
+
+        Should be useful for troubleshooting. 
+        """
+        if self.hasCatalog(): return self.catalog().getId()
+        else: return 'NONE'
+
+    def hasCatalogIndexesMetadata(self,indexesAndMetadata):
+        """
+        Do we have a catalog with these indexes and metadata ?
+
+        It's good to check that an index exists before searching,
+        otherwise we'll get the entire catalog contents.
+        indexesAndMetadata is two lists of strings, eg:
+        (['index1','index2'],['metadata1'])
+        """
+        catalog = self.catalog()
+        if not catalog: return 0
+        catalogindexes, catalogmetadata = catalog.indexes(), catalog.schema()
+        indexes, metadata = indexesAndMetadata
+        for i in indexes:
+            if not i in catalogindexes: return 0
+        for i in metadata:
+            if not i in catalogmetadata: return 0
+        return 1
+
+    def searchCatalog(self,**kw):
+        """
+        Searches this wiki page's catalog if any, passing through arguments.
+        """
+        if self.hasCatalog(): return self.catalog()(**kw)
+        else: return None
+
+    def url(self):
+        """Return the absolute object path"""
+        return string.join(self.getPhysicalPath(),'/')
+
+    getPath = url
+
+    security.declareProtected(Permissions.View, 'index_object')
+    def index_object(self,idxs=[],log=1):
+        """Index this page in the wiki's catalog, if any, and log problems.
+
+        Updates only certain indexes, if specified. 
+        """
+        if self.hasCatalog() and self.isCatalogable():
+            if log:
+                BLATHER('indexing',self.url())
+            try:
+                self.catalog().catalog_object(self,self.url(),idxs)
+            except:
+                BLATHER('failed to index',self.id(),'\n',formattedTraceback())
+
+    def unindex_object(self):
+        """Remove this page from the wiki's catalog, if any."""
+        if self.hasCatalog():
+            self.catalog().uncatalog_object(self.url())
+
+    def reindex_object(self):
+        """Reindex this page in wiki's catalog, if any."""
+        self.unindex_object()
+        self.index_object()
+
+    #XXX backwards compatibility
+    updateCatalog = reindex_object = index_object 
+
+
+InitializeClass(PageCatalogSupport)
+
+
+# enable catalog awareness for common ZMI operations - had to be done in
+# __init__ because of an import loop

Added: zope-zwiki/branches/upstream/current/Catalog_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/Catalog_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Catalog_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,58 @@
+from testsupport import *
+#from ZCatalog import ZCatalog,Vocabulary
+#from ZCatalog.Catalog import Catalog,CatalogError
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    return suite
+
+class Tests(unittest.TestCase):
+    # cf /usr/lib/zope/lib/python/Products/ZCatalog/tests/testCatalog.py
+    #
+    # we have various ZMI and zwiki methods
+    # for adding, deleting, editing etc.
+    # Easier to write doctests method by method ?
+    #
+    # these assume a default catalog is present and being used
+    # beware of existing catalog data screwing things up, maybe
+    # we can create our own in zc
+
+    def setUp(self):
+        pass
+    
+    def tearDown(self):
+        pass
+
+#    def testOkWithoutCatalog(self):
+#        pass
+
+#    def testOkWithoutSiteCatalogProperty(self):
+#        pass
+
+#    def testCatalogingAwarenessWithZMIEdits(self):
+#        pass
+     
+#    def testCatalogingAwarenessWithZWikiEdits(self):
+#        zc = self.ZopeContext
+#        assert not zc.Catalog(id='CatalogTestPage'), \
+#               'uncreated page found in the catalog'
+#        
+#        zc.manage_addProduct['ZWiki'].manage_addZWikiPage('CatalogTestPage1')
+#        zc.CatalogTestPage1.edit(page='CatalogTestPage',text='bleh')
+#        assert zc.Catalog(id='CatalogTestPage'), \
+#               'page not found in catalog after creation by edit'
+#        assert zc.Catalog(PrincipiaSearchSource="bleh"), \
+#               'page text not found in catalog after creation by edit'
+#        assert not zc.Catalog(PrincipiaSearchSource="blib"), \
+#               'dummy text found in catalog after creation by edit'
+#
+#        zc.CatalogTestPage.append(text='blib')
+#        assert zc.Catalog(PrincipiaSearchSource="blib"), \
+#               'new text not found in catalog after append'
+#
+#        zc.CatalogTestPage.edit(text='DeleteMe')
+#        assert not hasattr(zc,'CatalogTestPage'), 'ack! page not deleted'
+#        assert not zc.Catalog(id='CatalogTestPage'), \
+#               'page still found in catalog after DeleteMe edit'
+        

Added: zope-zwiki/branches/upstream/current/Comments.py
===================================================================
--- zope-zwiki/branches/upstream/current/Comments.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Comments.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,165 @@
+# PageCommentsSupport mixin
+
+import sys, os, string, re, email, email.Errors
+from mailbox import UnixMailbox, PortableUnixMailbox
+from urllib import quote
+from cStringIO import StringIO
+
+from AccessControl import getSecurityManager, ClassSecurityInfo
+from App.Common import absattr
+from DateTime import DateTime
+from Globals import InitializeClass
+
+import Permissions
+from Regexps import fromlineexpr
+from Utils import BLATHER, html_quote, DateTimeSyntaxError, \
+  stringBefore, stringBeforeAndIncluding, stringAfter, stringAfterAndIncluding
+
+
+class PageCommentsSupport:
+    """
+    I manage comments stored as rfc2822 messages in a wiki page.
+
+    This mixin class looks for comments in mbox/RFC2822 format in the page
+    text, and provides services for parsing and displaying them.
+    Everything above the first comment is considered the document part,
+    the rest of the page is considered the discussion part.
+
+    Prior to 0.30 we called this MessageSupport. When working with
+    comments, we represent them as email.Message.Message objects.
+
+    So that we can recognize comments/messages without extra markup or too
+    many false positives, we require each message to begin with BAW's "strict"
+    From line regexp from the python mailbox module.
+
+    See also Editing.py.
+    """
+    security = ClassSecurityInfo()
+
+    # accessors
+
+    security.declareProtected(Permissions.View, 'supportsComments')
+    def supportsComments(self):
+        """does this page parse embedded rfc2822 messages ?"""
+        return re.search(r'(?i)(msg)',self.pageTypeId()) is not None
+
+    security.declareProtected(Permissions.View, 'hasComments')
+    def hasComments(self):
+        """does this page have one or more rfc2822-style comments ?"""
+        return self.messageCount() > 0
+
+    security.declareProtected(Permissions.View, 'commentCount')
+    def commentCount(self):
+        """
+        The number of comments in this page.
+        """
+        return len(re.findall(fromlineexpr,self.discussionPart()))
+
+    security.declareProtected(Permissions.View, 'documentPart')
+    def documentPart(self):
+        """
+        This page's text from beginning up to the first message, if any.
+        """
+        return re.split(fromlineexpr,self.text(),1)[0]
+
+    document = documentPart
+
+    security.declareProtected(Permissions.View, 'discussionPart')
+    def discussionPart(self):
+        """
+        This page's text from the first comment to the end (or '').
+        """
+        return stringAfterAndIncluding(fromlineexpr,self.text())
+
+    security.declareProtected(Permissions.View, 'mailbox')
+    def mailbox(self):
+        """
+        Return the messages on this page as a Mailbox (iterator of Message)
+        """
+        # from mailbox docs: this is defensive against ill-formed MIME
+        # messages in the mailbox, but you have to be prepared to receive
+        # the empty string from the mailbox's `next()' method
+        def msgfactory(fp):
+            try:
+                return email.message_from_file(fp)
+            except email.Errors.MessageParseError:
+                BLATHER('message parsing error in',self.id())
+                return ''
+        return UnixMailbox(StringIO(self.text()), msgfactory)
+
+    def comments(self):
+        """
+        Return this page's comments as a list of Messages.
+        """
+        msgs = []
+        mbox = self.mailbox()
+        m = mbox.next()
+        while m is not None:
+            msgs.append(m)
+            m = mbox.next()
+        return msgs
+
+
+    # utilities
+
+    def fromLineFrom(self,email,date):
+        """
+        Generate a conformant mbox From line from email and date strings.
+
+        (unless date is unparseable, in which case we omit that part)
+        """
+        # "email" is in fact a real name or zwiki username - adapt it
+        email = re.sub(r'\s','',email) or 'unknown'
+        try:
+            d = DateTime(date)
+            return 'From %s %s %s %d %02d:%02d:%02d %s %d\n' % (
+                email,d.aDay(),d.aMonth(),d.day(),d.hour(),
+                d.minute(),d.second(),d.timezone(),d.year())
+        except (DateTimeSyntaxError,AttributeError,IndexError):
+            return 'From %s\n' % email
+
+    def messageIdFromTime(self,time):
+        """
+        Generate a somewhat unique email message-id based on a DateTime
+        """
+        msgid = time.strftime('%Y%m%d%H%M%S')+time.rfc822()[-5:]+'@'
+        if hasattr(self,'REQUEST'):
+            msgid += re.sub(r'http://','',self.REQUEST.get('SERVER_URL',''))
+        msgid = '<%s>' % msgid
+        return msgid
+
+    security.declareProtected(Permissions.View, 'upgradeComments')
+    def upgradeComments(self,REQUEST=None):
+        """
+        Update the format of any comments on this page.
+        """
+        # XXX it would be good if this could upgrade old-style
+        # (non-rfc2822) zwiki comments to the new style
+        pass
+
+        # convert From: to proper From delimiters, no longer needed
+        #if re.search(r'\n\nFrom: ',self.text()):
+        #    msgs = ''
+        #    mailbox = PortableUnixMailbox(StringIO(
+        #        re.sub(r'\n\nFrom: ',r'\n\nFrom \nFrom: ',self.text())))
+        #    m = mailbox.next()
+        #    while m is not None:
+        #        msgs += self.fromLineFrom(m.get('from'),m.get('date'))
+        #        msgs += string.join(m.headers,'')
+        #        msgs += '\n'
+        #        msgs += m.fp.read()
+        #        m = mailbox.next()
+        #    new = re.split('\n\nFrom: ',self.text(),1)[0]+'\n\n'+msgs
+        #    self.edit(text=new, REQUEST=REQUEST,log='upgraded comments')
+        #    BLATHER('upgraded comments on',self.id())
+
+    # backwards compatibility
+    supportsMessages = supportsComments
+    hasMessages = hasComments
+    messageCount = commentCount
+    messagesPart = discussionPart
+    messages = comments
+    upgradeMessages = upgradeComments
+
+InitializeClass(PageCommentsSupport)
+

Added: zope-zwiki/branches/upstream/current/Comments_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/Comments_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Comments_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,27 @@
+import string
+from testsupport import *
+ZopeTestCase.installProduct('ZCatalog')
+ZopeTestCase.installProduct('ZWiki')
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    return suite
+
+class Tests(ZwikiTestCase):
+
+    def test_commentCount(self):
+        p = self.page
+        self.assertEqual(p.commentCount(),0)
+        p.comment('test')
+        self.assertEqual(p.commentCount(),1)
+        p.comment('test')
+        self.assertEqual(p.commentCount(),2)
+
+    def test_unicodeInComments(self):
+        p = self.page
+        u = unicode(string.uppercase,'utf8')
+        p.comment(text=u)
+        self.assertEqual(p.commentCount(),1)
+        self.assertEqual(p.comments()[-1].get_payload(),u)
+

Added: zope-zwiki/branches/upstream/current/Defaults.py
===================================================================
--- zope-zwiki/branches/upstream/current/Defaults.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Defaults.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,95 @@
+######################################################################
+# global flags and constants for ZWiki
+# see also plugins/*
+
+PAGE_METATYPE =      'ZWiki Page' # meta_type of ZWikiPage objects
+PAGE_PORTALTYPE =    'Wiki Page'  # content type used in CMF/Plone
+WIKI_ADD_MENU_NAME = 'ZWiki'      # items in ZMI add menu.. 
+PAGE_ADD_MENU_NAME = 'ZWiki Page' # (this one must match PAGE_METATYPE)
+
+AUTO_UPGRADE = 1             # upgrade old pages when viewed
+DISABLE_JAVASCRIPT = 1       # disable javascript, etc. in edits ?
+PREFER_USERNAME_COOKIE = 0   # prefer cookie to authenticated name ?
+MAX_NEW_LINES_DISPLAY = 200  # truncate each diff (and mailout)
+MAX_OLD_LINES_DISPLAY = 20   # at this number of lines
+LINK_TO_ALL_CATALOGED = 0    # link to all pages in the catalog ? unimplemented
+LINK_TO_ALL_OBJECTS = 0      # link to non-wiki page objects ? unimplemented
+LARGE_FILE_SIZE = 1024*1024  # images larger than this will not be inlined
+LEAVE_PLACEHOLDER = 0        # leave a placeholder page when renaming ?
+WIKINAME_LINKS = 1           # enable/disable various wiki link syntaxes 
+ISSUE_LINKS = 1              # by default
+BRACKET_LINKS = 1
+DOUBLE_BRACKET_LINKS = 1
+DOUBLE_PARENTHESIS_LINKS = 0
+BORING_PAGES = ['TestPage','SandBox'] # pages we don't want to see/hear much
+IDS_TO_AVOID = ['RESPONSE','REQUEST','Epoz','epoz','URL','outline','recycle_bin']
+
+# Standard metadata fields which Zwiki will expect in page brain objects.
+# Plugins will add more of these.
+# NB for best large-wiki performance, all of these must be in the wiki
+# catalog so that ensureCompleteMetadataIn() does not have to go to the
+# ZODB. To be safe, setupCatalog will add them all.
+# see also http://zwiki.org/ZwikiAndZCatalog
+PAGE_METADATA = [
+    'Title',
+    'creation_time',
+    'creator',      
+    'id',
+    'lastEditTime',
+    'last_edit_time',
+    'last_editor',   
+    'last_log',
+    'page_type',     
+    'parents',
+    'size',
+    'subscriber_list',
+    'summary',
+    #'links', # XXX problems for epoz/plone, not needed ?
+    ]
+
+#from Utils import BLATHER
+def registerPageMetaData(t):
+    """
+    Add an attribute name to the list of standard page metadata.
+
+    >>> from Products.ZWiki.Defaults import registerPageMetaData
+    >>> registerPageMetaData('myattribute')
+
+    """
+    PAGE_METADATA.append(t)
+    #BLATHER('registered standard metadata field: %s'%t)
+
+
+# standard catalog indexes which should be present for best performance.
+# setupCatalog will install these. Included here so they are easy to find.
+
+TEXTINDEXES = [
+    'Title',
+    'text',
+    ]
+#XXX are these correct choice of FieldIndexes vs. KeywordIndexes ?
+FIELDINDEXES = [
+    'isBoring',
+    'creation_time',
+    'creator',
+    'id',
+    'last_edit_time',
+    'last_editor',
+    'meta_type',
+    'page_type',
+    'rating',
+    'voteCount',
+    ]
+KEYWORDINDEXES = [
+    'canonicalLinks',
+    #'links', # XXX problems for epoz/plone, not needed ?
+    'parents',
+    ]
+DATEINDEXES = [
+    'creationTime',
+    'lastEditTime',
+    ]
+PATHINDEXES = [
+    'path',
+    ]
+

Added: zope-zwiki/branches/upstream/current/Diff.py
===================================================================
--- zope-zwiki/branches/upstream/current/Diff.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Diff.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,511 @@
+"""
+Simple revisions support for zwiki pages.
+
+Provides methods to look up and revert to old versions from the ZODB history,
+and a diff-browsing form.
+
+todo:
+- clean up 
+- separate out html vs. email diff methods
+
+"""
+
+from __future__ import nested_scopes
+from string import join, split, atoi
+import re
+from struct import pack, unpack
+
+from DocumentTemplate.DT_Util import html_quote
+from OFS.History import historicalRevision
+# Tim Peters' ndiff is now python 2.1's difflib module
+# use the former for compatibility with older zopes
+# XXX we don't support 1.5.2 now, change
+from OFS import ndiff
+from AccessControl import getSecurityManager, ClassSecurityInfo
+from Globals import InitializeClass
+
+from Defaults import MAX_OLD_LINES_DISPLAY, MAX_NEW_LINES_DISPLAY
+import Permissions
+from Utils import get_transaction, BLATHER, formattedTraceback
+
+def ISJUNK(line, pat=re.compile(r"\s*$").match):
+    return pat(line) is not None
+
+def prefix(lines,prefix): return map(lambda x:prefix+x,lines)
+
+def abbreviate(lines,prefix,maxlines=5):
+    output = []
+    if maxlines and len(lines) > maxlines:
+        extra = len(lines) - maxlines
+        for i in xrange(maxlines - 1):
+            output.append(prefix + lines[i])
+        output.append(prefix + "[%d more line%s...]" %
+                      (extra, ((extra == 1) and '') or 's')) # not working
+    else:
+        for line in lines:
+            output.append(prefix + line)
+    return output
+
+
+class PageDiffSupport:
+    """
+    I provide methods for browsing a zwiki page's 'edit history', or at
+    least the differences between recent edits.
+    """
+    security = ClassSecurityInfo()
+    
+    def diff(self,revA=1,revB=0,REQUEST=None,
+             test=None, # for testing
+             ):
+        """
+        Display a diff between two revisions of this page, as a web page.
+        
+        Uses the diffform template. See rawDiff for more.
+
+        XXX should skip uninteresting transactions
+        if re.search(r'(/edit|/comment|/append|PUT)',lastrevision['description']):
+        """
+        revA, revB = str(revA), str(revB)
+        t = test or self.htmlDiff(revA=revA,revB=revB)
+        return self.diffform(revA,t,REQUEST=REQUEST)
+
+    def prevDiff(self,currentRevision):
+        """
+        helpers for form buttons
+        """
+        return self.diff(int(currentRevision)+1,int(currentRevision))
+
+    def nextDiff(self,currentRevision):
+        """
+        helpers for form buttons
+        """
+        return self.diff(int(currentRevision)-1,int(currentRevision)-2)
+
+    def history(self):
+        """
+        Return the list of ZODB transaction history entries.
+
+        This is an alias for manage_change_history and is fairly
+        limited. History entries may relate to things other than text
+        changes, eg a property change. They contain some basic information
+        and may be used to fetch the old object (revision) from the
+        ZODB. When the ZODB is packed, history and revisions disappear.
+        The maximum number of history entries we can get is 20.
+        """
+        class EditRecord:
+            """
+            A brain-like object representing an edit (or other transaction).
+
+            Combines the contents of manage_change_history entries,
+            """
+            pass
+            
+        return self.manage_change_history()
+
+    def revisionCount(self):
+        """
+        How many old revisions are available in the ZODB ?
+        """
+        return len(self.history())
+
+    security.declareProtected(Permissions.View, 'pageRevision')
+    def pageRevision(self, rev):
+        """
+        Get one of the previous revisions of this page object.
+
+        The argument increases to select older revisions, eg revision 1 is
+        the most recent version prior to the current one, revision 2 is
+        the version before that, etc.
+        """
+        rev = int(rev)
+        try:
+            historyentry = self.history()[rev]
+            key = historyentry['key']
+            serial = apply(pack, ('>HHHH',)+tuple(map(atoi, split(key,'.'))))
+            return historicalRevision(self, serial)
+        except: # we don't have a version that old
+            return None
+
+    security.declareProtected(Permissions.View, 'revisionInfoFor')
+    def revisionInfoFor(self, rev):
+        """
+        A helper for the diffform view, fetches revision details for display.
+
+        This fetches the actual object, and is called on demand for each
+        revision.  Restricted code can't access the attributes directly.
+        Returns a dictionary of some useful and non-sensitive information.
+        """
+        old = self.pageRevision(rev)
+        if old:
+            return {
+                'last_editor':old.last_editor,
+                'last_edit_time':old.last_edit_time,
+                'lastEditTime':old.lastEditTime(),
+                }
+        else:
+            return None
+
+    security.declareProtected(Permissions.View, 'lasttext')
+    def lasttext(self, rev=1):
+        """
+        Return the text of the last or an earlier revision of this page.
+        """
+        revision = self.pageRevision(rev)
+        return revision and revision.text() or ''
+    
+    security.declareProtected(Permissions.Edit, 'revert')
+    def revert(self, currentRevision, REQUEST=None):
+        """
+        Revert to the state of the specified revision.
+
+        Copies a bunch of attributes from the old page object, and even
+        renames and reparents if needed.  Very useful for cleaning spam.
+        This is different from ZODB undo: it should be more reliable, and
+        it records new last editor details (and sends a mailout, etc)
+        instead of just restoring the old ones.
+        """
+        old = self.pageRevision(currentRevision)
+        self.setText(old.text())
+        self.setPageType(old.pageTypeId())
+        self.setVotes(old.votes())
+        if self.getParents() != old.getParents():
+            if not self.checkPermission(Permissions.Reparent, self):
+                raise 'Unauthorized', (
+                    _('You are not authorized to reparent this ZWiki Page.'))
+            self.setParents(old.getParents())
+            self.updateWikiOutline()
+        if self.pageName() != old.pageName():
+            if not self.checkPermission(Permissions.Rename, self):
+                raise 'Unauthorized', (
+                    _('You are not authorized to rename this ZWiki Page.'))
+            self.rename(old.pageName())
+        self.setLastEditor(REQUEST)
+        self.setLastLog('revert')
+        self.index_object()
+        self.sendMailToEditSubscribers(
+            'This page was reverted to the %s version.\n' % old.last_edit_time,
+            REQUEST=REQUEST,
+            subjectSuffix='',
+            subject='(reverted)')
+        if REQUEST is not None:
+            REQUEST.RESPONSE.redirect(self.pageUrl())
+
+    security.declareProtected(Permissions.Edit, 'revertEditsBy')
+    def revertEditsBy(self, username, REQUEST=None):
+        """
+        Revert all recent edits (the longest continuous sequence) by username.
+        """
+        # find the revision immediately before the latest continuous
+        # sequence of edits by username, if any.
+        if self.last_editor == username:
+            numrevs = self.revisionCount()
+            rev = 1
+            while rev <= numrevs and self.revisionInfoFor(rev)['last_editor'] == username:
+                rev += 1
+            if rev <= numrevs:
+                self.revert(rev,REQUEST=REQUEST) # got one, revert it
+
+    # restrict this one to managers, too powerful for passers-by
+    security.declareProtected(Permissions.manage_properties, 'revertEditsEverywhereBy')
+    def revertEditsEverywhereBy(self, username, REQUEST=None, batch=0):
+        """
+        Revert all the most recent edits by username throughout the wiki.
+        """
+        batch = int(batch)
+        n = 0
+        for p in self.pageObjects():
+            if p.last_editor == username:
+                n += 1
+                try:
+                    p.revertEditsBy(username,REQUEST=REQUEST)
+                except:
+                    BLATHER('failed to revert edits by %s at %s: %s' \
+                            % (username,p.id(),formattedTraceback()))
+                if batch and n % batch == 0:
+                    BLATHER('committing after %d reverts' % n)
+                    get_transaction().commit()
+        
+    def lastlog(self, rev=0, withQuotes=0):
+        """
+        Get the log note from an earlier revision of this page.
+
+        Just a quick helper for diff browsing.
+        """
+        rev = int(rev)
+        try:
+            note = self.history()[rev]['description']
+            match = re.search(r'"(.*)"',note)
+            if match:
+                if withQuotes: return match.group()
+                else: return match.group(1)
+            else:
+                return ''
+        except:
+            return '' # we don't have a version that old
+
+    def htmlDiff(self,revA=1,revB=0,a=None,b=None):
+        """
+        Generate a readable HTML-formatted diff of this page's revisions.
+
+        Revisions are numbered backwards from the latest (0).
+        Alternately, a and/or b texts can be specified.
+
+        We don't bother abbreviating text segments like textDiff does.
+        Should it use a page template ?
+        """
+        # XXX doesn't allow a=''
+        a = a or self.lasttext(rev=revA)
+        b = b or self.lasttext(rev=revB)
+        a = split(a,'\n')
+        b = split(b,'\n')
+        r = []
+        add, addm = r.append, r.extend
+        # diffform encloses all this in a pre, so need to avoid line
+        # breaks for now
+        def addnobr(s): r[-1] += s
+        for tag, alo, ahi, blo, bhi in self.rawDiff(a,b):
+            if tag == 'replace':
+                add('<b>changed:</b>')
+                addnobr('<span style="color:red;text-decoration:line-through">')
+                # remember to html-quote the diff segments
+                addm(prefix(map(html_quote, a[alo:ahi]),'-')) 
+                addnobr('</span>')
+                addnobr('<span style="color:green">')
+                addm(map(html_quote, b[blo:bhi]))
+                addnobr('</span>')
+                add('')
+            elif tag == 'delete':
+                add('<b>removed:</b>')
+                addnobr('<span style="color:red;text-decoration:line-through">')
+                addm(prefix(map(html_quote, a[alo:ahi]),'-'))
+                addnobr('</span>')
+                add('')
+            elif tag == 'insert':
+                add('<b>added:</b>')
+                addnobr('<span style="color:green">')
+                addm(map(html_quote, b[blo:bhi]))
+                addnobr('</span>')
+                add('')
+            else: # tag == 'equal'
+                pass
+        return '\n' + join(r,'\n')
+
+    def textDiff(self,revA=1,revB=0,a=None,b=None, verbose=1):
+        """
+        Generate readable a plain text diff of this page's revisions.
+
+        This should optimize for human readability, as people may be
+        getting a lot of these in mail-outs.
+
+        Revisions are numbered backwards from the latest (0).
+        Alternately, a and/or b texts can be specified.
+        verbose adds more decoration.
+
+        Each text segment is abbreviated according to built in constants,
+        to avoid eg generating monster mail-outs. This can be annoying.
+        """
+        a = a or self.lasttext(rev=revA)
+        b = b or self.lasttext(rev=revB)
+        a = split(a,'\n')
+        b = split(b,'\n')
+        r = []
+        add, addm = r.append, r.extend
+        for tag, alo, ahi, blo, bhi in self.rawDiff(a,b):
+            if tag == 'replace':
+                if verbose: add('??changed:')
+                addm(abbreviate(a[alo:ahi],'-',MAX_OLD_LINES_DISPLAY))
+                addm(abbreviate(b[blo:bhi],'',MAX_NEW_LINES_DISPLAY))
+                add('')
+            elif tag == 'delete':
+                if verbose: add('--removed:')
+                addm(abbreviate(a[alo:ahi],'-',MAX_OLD_LINES_DISPLAY))
+                add('')
+            elif tag == 'insert':
+                if verbose: add('++added:')
+                addm(abbreviate(b[blo:bhi],'',MAX_NEW_LINES_DISPLAY))
+                add('')
+            else: # tag == 'equal'
+                pass 
+        return '\n' + join(r,'\n')
+
+    def addedText(self,a,b):
+        """
+        Return any lines which are in b but not in a, according to difflib.
+        """
+        a = split(a,'\n')
+        b = split(b,'\n')
+        r = []
+        for tag, alo, ahi, blo, bhi in self.rawDiff(a,b):
+            if tag in ('insert','replace'): r.extend((b[blo:bhi]))
+            else: pass
+        return '\n' + join(r,'\n')
+
+    def rawDiff(self,a,b):
+        """
+        Return a diff between two texts, as difflib opcodes.
+        """
+        return ndiff.SequenceMatcher(
+            #isjunk=lambda x: x in " \\t", # requires newer difflib
+            isjunk=ISJUNK,
+            a=a,
+            b=b).get_opcodes()
+
+    # wikifornow stuff - roll em in, sort em out later
+#    def wfn_get_page_history(self, mode='condensed',
+#                         batchsize=30, first=0, last=30):
+#        """\
+#        Return history records for a page, culling according to mode param.
+#
+#        'complete': all records.
+#
+#        'condensed': Omit showing prior versions of page replaced
+#                     subsequently and soon after by the same person
+#                     using same (possibly empty) log entry
+#
+#        Currently 
+#        """
+#        r = self._p_jar.db().history(self._p_oid, None, 5000)
+#        for i in range(len(r)): r[i]['tacked_on_index'] = i
+#
+#        if mode == 'complete':
+#            pass
+#        elif mode == 'condensed':
+#            # Each entry may:
+#            #  - either continue an existing session or start a new one, and
+#            #  - either be a landmark or not.
+#            got = []
+#            carrying = None
+#            prevdescr = None
+#            # Put in least-recent-first order:
+#            r.reverse()
+#            for entry in r:
+#
+#                curdescr = split(entry['description'], '\012')[1:]
+#
+#                # Handle prior retained stuff:
+#                if carrying:
+#                    if carrying['user_name'] != entry['user_name']:
+#                        # Different user:
+#                        got.append(carrying)
+#                    elif curdescr != prevdescr:
+#                        # Different log entry:
+#                        got.append(carrying)
+#                    else:
+#                        itime, ctime = entry['time'], carrying['time']
+#                        if type(itime) == FloatType:
+#                            itime = entry['time'] = DateTime(itime)
+#                        if type(ctime) == FloatType:
+#                            ctime = carrying['time'] = DateTime(ctime)
+#                        if (float(itime - ctime) * 60 * 24) > 30:
+#                            # Enough time elapsed:
+#                            # XXX klm "Enough time" should be configurable...
+#                            got.append(carrying)
+#
+#                # Old-session, if any, was handled - move forward:
+#                carrying = entry
+#                prevdescr = curdescr
+#
+#            if carrying:
+#                # Retain final item
+#                got.append(carrying)
+#
+#            # Put back in most-recent-first order:
+#            got.reverse()
+#            r = got
+#        else:
+#            raise ValueError, "Unknown mode '%s'" % mode
+#
+#        for d in r:
+#            if type(d['time']) == FloatType:
+#                d['time'] = DateTime(d['time'])
+#            d['key']=join(map(str, unpack(">HHHH", d['serial'])),'.')
+#
+#        r=r[first:first+batchsize+1]
+#
+#        return r
+#    def wfn_history_copy_page_to_present(self, keys=[], REQUEST=None):
+#        """Create a new object copy with the contents of an historic copy."""
+#        request=getattr(self, 'REQUEST', None)
+#        if not self.isAllowed('edit', request):
+#            raise 'Unauthorized', "You're not allowed to edit this page"
+#        self.manage_historyCopy(keys=keys)
+#        if REQUEST is not None:
+#            REQUEST.RESPONSE.redirect(self.wiki_page_url())
+#    def wfn_history_compare_versions(self, keys=[], REQUEST=None):
+#        """Do history comparisons.
+#
+#        Mostly stuff adapted from OFS.History - manage_historicalComparison() 
+#        and manage_historyCompare(), with a bit of direct calling of
+#        html_diff."""
+#        from OFS.History import historicalRevision, html_diff
+#        if not keys:
+#            raise HistorySelectionError, (
+#                "No historical revision was selected.<p>")
+#        if len(keys) > 2:
+#            raise HistorySelectionError, (
+#                "Only two historical revision can be compared<p>")
+#        
+#        serial=apply(pack, ('>HHHH',)+tuple(map(string.atoi,
+#                                                split(keys[-1],'.'))))
+#        rev1=historicalRevision(self, serial)
+#        
+#        if len(keys)==2:
+#            serial=apply(pack,
+#                         ('>HHHH',)+tuple(map(string.atoi,
+#                                              split(keys[0],'.'))))
+#
+#            rev2=historicalRevision(self, serial)
+#        else:
+#            rev2=self
+#
+#        dt1=DateTime(rev1._p_mtime)
+#        dt2=DateTime(rev2._p_mtime)
+#        t1, t2 = rev1._st_data, rev2._st_data
+#        if t1 is None or t2 is None:
+#            t1, t2 = rev1.xread(), rev2.xread()
+#        top = self._manage_historyComparePage(
+#            self, REQUEST,
+#            dt1=dt1, dt2=dt2,
+#            historyComparisonResults=html_diff(t1, t2),
+#            manage_tabs=self.standard_wiki_header)
+#        bottom = self.standard_wiki_footer(self, REQUEST=REQUEST)
+#        return top + bottom
+#
+#
+#def dump(tag, x, lo, hi, r):
+#    r1=[]
+#    r2=[]
+#    for i in xrange(lo, hi):
+#        r1.append(tag)
+#        r2.append(x[i])
+#    r.append("<tr>\n"
+#            "<td valign=top width=1%%><pre>\n%s\n</pre></td>\n"
+#            "<td valign=top width=99%%><pre>\n%s\n</pre></td>\n"
+#            "</tr>\n"
+#            % (join(r1,'\n'), html_quote(join(r2, '\n'))))
+#
+#def replace(x, xlo, xhi, y, ylo, yhi, r):
+#
+#    rx1=[]
+#    rx2=[]
+#    for i in xrange(xlo, xhi):
+#        rx1.append('-')
+#        rx2.append(x[i])
+#
+#    ry1=[]
+#    ry2=[]
+#    for i in xrange(ylo, yhi):
+#        ry1.append('+')
+#        ry2.append(y[i])
+#
+#
+#    r.append("<tr>\n"
+#            "<td valign=top width=1%%><pre>\n%s\n%s\n</pre></td>\n"
+#            "<td valign=top width=99%%><pre>\n%s\n%s\n</pre></td>\n"
+#            "</tr>\n"
+#            % (join(rx1, '\n'), join(ry1, '\n'),
+#               html_quote(join(rx2, '\n')), html_quote(join(ry2, '\n'))))
+
+
+InitializeClass(PageDiffSupport)
+

Added: zope-zwiki/branches/upstream/current/Diff_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/Diff_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Diff_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,55 @@
+from testsupport import *
+ZopeTestCase.installProduct('ZCatalog')
+ZopeTestCase.installProduct('ZWiki')
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    return suite
+
+class Tests(ZwikiTestCase):
+
+    def test_textDiff(self):
+        p = self.page
+        self.assertEqual(p.textDiff(a='1',
+                                    b='1\n2'),
+                         '''
+++added:
+2
+''')
+        self.assertEqual(p.textDiff(a='1\n2',
+                                    b='2'),
+                         '''
+--removed:
+-1
+''')
+        self.assertEqual(p.textDiff(a='1',
+                                    b='12'),
+                         '''
+??changed:
+-1
+12
+''')
+
+    def test_htmlDiff(self):
+        p = self.page
+        self.assertEqual(p.htmlDiff(a='1',
+                                    b='1\n2'),
+                         '''
+<b>added:</b><span style="color:green">
+2</span>
+''')
+        self.assertEqual(p.htmlDiff(a='1\n2',
+                                    b='2'),
+                         '''
+<b>removed:</b><span style="color:red;text-decoration:line-through">
+-1</span>
+''')
+        self.assertEqual(p.htmlDiff(a='1',
+                                    b='12'),
+                         '''
+<b>changed:</b><span style="color:red;text-decoration:line-through">
+-1</span><span style="color:green">
+12</span>
+''')
+

Added: zope-zwiki/branches/upstream/current/Editing.py
===================================================================
--- zope-zwiki/branches/upstream/current/Editing.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Editing.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1088 @@
+"""
+Editing methods.
+"""
+
+from __future__ import nested_scopes
+import re, string, time
+from string import split,join,find,lower,rfind,atoi,strip
+from urllib import quote, unquote
+from types import *
+from email.Message import Message
+from copy import deepcopy
+
+import ZODB # need this for pychecker
+from AccessControl import getSecurityManager, ClassSecurityInfo
+from App.Common import rfc1123_date
+from DateTime import DateTime
+from Globals import InitializeClass
+try:
+    from zope.app.content_types import guess_content_type
+except ImportError:
+    from OFS.content_types import guess_content_type
+from OFS.DTMLDocument import DTMLDocument
+from OFS.ObjectManager import BadRequestException
+import OFS.Image
+
+from pagetypes import PAGETYPES
+from Defaults import DISABLE_JAVASCRIPT, LARGE_FILE_SIZE, LEAVE_PLACEHOLDER
+import Permissions
+from Regexps import javascriptexpr, htmlheaderexpr, htmlfooterexpr
+from Utils import get_transaction, BLATHER, parseHeadersBody
+from I18n import _
+
+
+class PageEditingSupport:
+    security = ClassSecurityInfo()
+    security.declareObjectProtected('View')
+    def checkPermission(self, permission, object):
+        return getSecurityManager().checkPermission(permission,object)
+
+    security.declareProtected(Permissions.Add, 'create') 
+    def create(self,page=None,text='',type=None,title='',REQUEST=None,log='',
+               sendmail=1, parents=None, subtopics=None, pagename=None):
+        """
+        Create a new wiki page, with optional extras.
+
+        Normally edit() will call this for you. 
+
+        We assume the page name comes url-quoted. If it's not a url-safe
+        name, we will create the page with a similar url-safe id, which we
+        assume won't match any existing page (or zwiki would have linked
+        instead of offering to create). Also it allows the alternate pagename
+        argument, to support the page management form (XXX temporary).
+        Other features:
+
+        - can upload a file at the same time.  
+
+        - can set the subtopics display property
+
+        - can handle a rename during page creation. This helps CMF/Plone
+        and is occasionally useful.
+        
+        - checks the edit_needs_username property as well as permissions.
+
+        - redirects to the new page or to the denied view if appropriate
+
+        - returns the new page's name or None
+
+        """
+        if not self.checkSufficientId(REQUEST):
+            if REQUEST: REQUEST.RESPONSE.redirect(self.pageUrl()+'/denied')
+            return None
+        
+        name = unquote(page or pagename)
+        id = self.canonicalIdFrom(name)
+
+        # here goes.. sequence is delicate here
+
+        # make a new page object and situate it in the wiki
+        # get a hold of it's acquisition wrapper
+        p = self.__class__(__name__=id)
+        # set title now since manage_afterAdd will use it for wiki outline
+        p.title = name
+        # newid should be the same as id, but don't assume
+        newid = self.folder()._setObject(id,p)
+        p = getattr(self.folder(),newid)
+
+        p.checkForSpam(text)
+        p.setCreator(REQUEST)
+        p.setLastEditor(REQUEST)
+        p.setLastLog(log)
+        p._setOwnership(REQUEST)
+        if parents == None: p.parents = [self.pageName()]
+        else: p.parents = parents
+        self.wikiOutline().add(p.pageName(),p.parents) # update wiki outline
+
+        # choose the specified type, the default type or whatever we're allowed 
+        p.setPageType(type or self.defaultPageType())
+        p.setText(text,REQUEST)
+        p.handleFileUpload(REQUEST)
+        p.handleSubtopicsProperty(subtopics,REQUEST)
+        if p.autoSubscriptionEnabled(): p.subscribeThisUser(REQUEST)
+        #if p.usingRegulations(): p.setRegulations(REQUEST,new=1)
+        # users can alter the page name in the creation form; allow that.
+        # We do a full rename, only after all the above, to make sure
+        # everything gets handled properly.  We must first commit though,
+        # to get p.cb_isMoveable(). Renaming will also get us indexed.
+        # We never leave a placeholder, always update backlinks.
+        if title and title != p.pageName():
+            get_transaction().note('rename during creation')
+            get_transaction().commit()
+            p.handleRename(title,0,1,REQUEST,log)
+        else:
+            # we got indexed after _setObject, but do it again with our text
+            p.index_object()
+
+        # mail subscribers, unless disabled
+        if sendmail:
+            p.sendMailToSubscribers(
+                p.read(),
+                REQUEST=REQUEST,
+                subjectSuffix='',
+                subject=log,
+                message_id=self.messageIdFromTime(p.creationTime())
+                )
+        # and move on
+        if REQUEST:
+            try:
+                u = (REQUEST.get('redirectURL',None) or
+                     REQUEST['URL2']+'/'+ quote(p.id()))
+                REQUEST.RESPONSE.redirect(u)
+            except KeyError: pass
+        return name
+
+    security.declarePublic('isDavLocked')
+    def isDavLocked(self):
+        return hasattr(self,'wl_isLocked') and self.wl_isLocked()
+
+    security.declareProtected(Permissions.Comment, 'comment')
+    def comment(self, text='', username='', time='',
+                note=None, use_heading=None, # not used
+                REQUEST=None, subject_heading='', message_id=None,
+                in_reply_to=None, exclude_address=None):
+        """
+        Add a comment to this page.
+
+        We try to do this without unnecessary rendering.  The comment will
+        also be mailed out to any subscribers.  If auto-subscription is in
+        effect, we subscribe the poster to this page.
+
+        subject_heading is so named to avoid a clash with some existing
+        zope subject attribute.  note and use_heading are not used and
+        kept only for backwards compatibility.
+        """
+        if not self.checkSufficientId(REQUEST):
+            return self.denied(
+                _("Sorry, this wiki doesn't allow anonymous edits. Please configure a username in options first."))
+
+        if self.isDavLocked(): return self.davLockDialog()
+
+        # gather various bits and pieces
+        oldtext = self.read()
+        if not username:
+            username = self.usernameFrom(REQUEST)
+            if re.match(r'^[0-9\.\s]*$',username): username = ''
+        subject_heading = self.cleanupText(subject_heading)
+        text = self.cleanupText(text)
+        # some subtleties here: we ensure the page comment and mail-out
+        # will use the same message-id, and the same timestamp if possible
+        # (helps threading & debugging)
+        if time: dtime = DateTime(time)
+        else:
+            dtime = self.ZopeTime()
+            time = dtime.rfc822()
+        if not message_id: message_id = self.messageIdFromTime(dtime)
+
+        # make a Message representing this comment
+        m = Message()
+        m['From'] = username
+        m['Date'] = time
+        m['Subject'] = subject_heading
+        m['Message-ID'] = message_id
+        if in_reply_to: m['In-Reply-To'] = in_reply_to
+        m.set_payload(text)
+        m.set_unixfrom(self.fromLineFrom(m['From'],m['Date'])[:-1])
+        
+        # discard junk comments
+        if not (m['Subject'] or m.get_payload()): return
+
+        # optimisation:
+        # add the comment to the page with minimal work - carefully append
+        # it to both source and _prerendered cached without re-rendering
+        # the whole thing! This might not be legal for all future page
+        # types.
+        # add to source, in standard rfc2822 format:
+        t = str(m)
+        self.checkForSpam(t)
+        t = '\n\n' + t
+        self.raw += t
+        # add to prerendered html:
+        # apply single-message prerendering XXX
+        t = self.pageType().preRenderMessage(self,m)
+        # if it's the first, add appropriate discussion separator
+        if self.messageCount()==1:
+            t=self.pageType().discussionSeparator(self) + t
+        # apply page's standard prerender to the lot XXX
+        t = self.pageType().preRender(self,t)
+        # and append to the page's prerendered html
+        self.setPreRendered(self.preRendered()+t)
+        self.cookDtmlIfNeeded()
+
+        self.setLastEditor(REQUEST)
+        self.setLastLog(subject_heading)
+        if self.autoSubscriptionEnabled(): self.subscribeThisUser(REQUEST)
+        self.index_object()
+
+        # send out mail to any subscribers
+        # hack the username in there for usernameFrom
+        if REQUEST: REQUEST.cookies['zwiki_username'] = m['From']
+        self.sendMailToSubscribers(m.get_payload(),
+                                   REQUEST,
+                                   subject=m['Subject'],
+                                   message_id=m['Message-ID'],
+                                   in_reply_to=m['In-Reply-To'],
+                                   exclude_address=exclude_address
+                                   )
+
+        if REQUEST: REQUEST.RESPONSE.redirect(REQUEST['URL1']+'#bottom')
+
+    security.declareProtected(Permissions.Comment, 'append')
+    def append(self, text='', separator='\n\n', REQUEST=None, log=''):
+        """
+        Appends some text to an existing wiki page and scrolls to the bottom.
+
+        Calls edit, may result in mail notifications to subscribers.
+        """
+        if text:
+            if REQUEST: REQUEST.set('redirectURL',REQUEST['URL1']+'#bottom')
+            self.edit(text=self.read()+separator+str(text), REQUEST=REQUEST,log=log)
+
+    security.declarePublic('edit')      # check permissions at runtime
+    def edit(self, page=None, text=None, type=None, title='', 
+             timeStamp=None, REQUEST=None, 
+             subjectSuffix='', log='', check_conflict=1, # temp (?)
+             leaveplaceholder=LEAVE_PLACEHOLDER, updatebacklinks=1,
+             subtopics=None): 
+        """
+        General-purpose method for editing & creating zwiki pages.
+
+        This method does a lot; combining all this stuff in one powerful
+        method simplifies the skin layer above, I think.
+
+        - changes the text and/or formatting type of this (or another )
+        page, or creates that page if it doesn't exist.
+
+        - when called from a time-stamped web form, detects and warn when
+        two people attempt to work on a page at the same time
+
+        - The username (authenticated user or zwiki_username cookie)
+        and ip address are saved in page's last_editor, last_editor_ip
+        attributes if a change is made
+
+        - If the text begins with "DeleteMe", delete this page
+        (move it to the /recycle_bin)
+
+        - If file has been submitted in REQUEST, create a file or
+        image object and link or inline it on the current page.
+
+        - if title differs from page, assume it is the new page name and
+        do a rename (the argument remains "title" for backwards
+        compatibility)
+
+        - may set, clear or remove this page's show_subtopics property
+
+        - sends mail notification to subscribers if appropriate
+
+        """
+        # what are we doing ?
+        if page: page = unquote(page)
+        if page is None:
+            p = self                    # changing this page
+        elif self.pageWithNameOrId(page):
+            p = self.pageWithNameOrId(page) # changing another page
+        else:
+            return self.create(page,
+                               text or '', # string expected here
+                               type,
+                               title,
+                               REQUEST,
+                               log,
+                               subtopics=subtopics) # creating a page
+
+        if not self.checkSufficientId(REQUEST):
+            return self.denied(
+                _("Sorry, this wiki doesn't allow anonymous edits. Please configure a username in options first."))
+
+        if check_conflict:
+            if self.checkEditConflict(timeStamp, REQUEST):
+                return self.editConflictDialog()
+            if self.isDavLocked():
+                return self.davLockDialog()
+
+        # ok, changing p. We may do several things at once; each of these
+        # handlers checks permissions and does the necessary.
+        if p.handleDeleteMe(text,REQUEST,log): return
+        p.handleEditPageType(type,REQUEST,log)
+        if text != None: p.handleEditText(text,REQUEST,subjectSuffix,log)
+        p.handleSubtopicsProperty(subtopics,REQUEST)
+        p.handleFileUpload(REQUEST,log)
+        p.handleRename(title,leaveplaceholder,updatebacklinks,REQUEST,log)
+        #if self.usingRegulations(): p.handleSetRegulations(REQUEST)
+
+        p.index_object()
+
+        # tell browser to reload the page (or redirect elsewhere)
+        if REQUEST:
+            try:
+                REQUEST.RESPONSE.redirect(
+                    (REQUEST.get('redirectURL',None) or
+                     REQUEST['URL2']+'/'+ quote(p.id())))
+            except KeyError: pass
+
+    def handleSubtopicsProperty(self,subtopics,REQUEST=None):
+        if subtopics is not None:
+            # do we have permission ?
+            if not self.checkPermission(Permissions.Reparent, self):
+                raise 'Unauthorized', (
+                    _('You are not authorized to reparent or change subtopics links on this ZWiki Page.'))
+            subtopics = int(subtopics or '0')
+            self.setSubtopicsPropertyStatus(subtopics,REQUEST)
+
+    # see Regulations.py
+    #def handleSetRegulations(self,REQUEST):
+    #    if REQUEST.get('who_owns_subs',None) != None:
+    #        # do we have permission ?
+    #        if not self.checkPermission(Permissions.ChangeRegs,self):
+    #            raise 'Unauthorized', (
+    #              _("You are not authorized to set this ZWiki Page's regulations."))
+    #        self.setRegulations(REQUEST)
+    #        self.preRender(clear_cache=1)
+    #        #self.setLastEditor(REQUEST)
+
+    def handleEditPageType(self,type,REQUEST=None,log=''):
+        # is the new page type valid and different ?
+        if (type is not None and
+            type != self.pageTypeId()):
+            # do we have permission ?
+            if not self.checkPermission(Permissions.ChangeType,self):
+                raise 'Unauthorized', (
+                    _("You are not authorized to change this ZWiki Page's type."))
+            # is it one of the allowed types for this wiki ?
+            #if not type in self.allowedPageTypes():
+            #    raise 'Unauthorized', (
+            #        _("Sorry, that's not one of the allowed page types in this wiki."))
+            # change it
+            self.setPageType(type)
+            self.preRender(clear_cache=1)
+            self.setLastEditor(REQUEST)
+            self.setLastLog(log)
+
+        """
+        Note log message, if provided.
+        """
+    def setLastLog(self,log):
+        if log and string.strip(log):
+            log = string.strip(log)
+            get_transaction().note('"%s"' % log)
+            self.last_log = log
+        else:
+            self.last_log = ''
+
+
+    def handleEditText(self,text,REQUEST=None, subjectSuffix='', log=''):
+        old = self.read()
+        new = self.cleanupText(text)
+        # is the new text different ?
+        if new != old:
+            # do we have permission ?
+            if (not
+                (self.checkPermission(Permissions.Edit, self) or
+                 (self.checkPermission(Permissions.Comment, self)
+                  and find(new,old) == 0))):
+                raise 'Unauthorized', (
+                    _('You are not authorized to edit this ZWiki Page.'))
+
+            # does this edit look like spam ?
+            # Tries to count the links added by this edit. Not perfect -
+            # existing links on a line that you tweak will be counted.
+            # Not sure what happens if you replace existing links.
+            self.checkForSpam(self.addedText(old, new))
+                
+            # change it
+            self.setText(text,REQUEST)
+            self.setLastEditor(REQUEST)
+            self.setLastLog(log)
+
+            # send mail if appropriate
+            self.sendMailToEditSubscribers(
+                self.textDiff(a=old,b=self.read()),
+                REQUEST=REQUEST,
+                subject='(edit) %s' % log)
+
+    def handleDeleteMe(self,text,REQUEST=None,log=''):
+        if not text or not re.match('(?m)^DeleteMe', text):
+            return 0
+        if (not
+            (self.checkPermission(Permissions.Edit, self) or
+             (self.checkPermission(Permissions.Comment, self)
+              and find(self.cleanupText(text),self.read()) == 0))):
+            raise 'Unauthorized', (
+                _('You are not authorized to edit this ZWiki Page.'))
+        if not self.checkPermission(Permissions.Delete, self):
+            raise 'Unauthorized', (
+                _('You are not authorized to delete this ZWiki Page.'))
+        self.setLastLog(log)
+        self.recycle(REQUEST)
+
+        if REQUEST:
+            # redirect to first existing parent, or front page
+            destpage = ''
+            for p in self.parents:
+                if hasattr(self.folder(),p):
+                    destpage = p
+                    break
+            REQUEST.RESPONSE.redirect(self.wiki_url()+'/'+quote(destpage))
+            # I used to think redirect did not return, guess I was wrong
+
+        # return true to terminate edit processing
+        return 1
+
+    def handleRename(self,newname,leaveplaceholder,updatebacklinks,
+                      REQUEST=None,log=''):
+        # rename does everything we need
+        return self.rename(newname,
+                           leaveplaceholder=leaveplaceholder,
+                           updatebacklinks=updatebacklinks,
+                           REQUEST=REQUEST)
+
+    security.declareProtected(Permissions.Delete, 'delete')
+    def delete(self,REQUEST=None, updatebacklinks=1, pagename=None):
+        """
+        Delete (move to recycle_bin) this page, if permissions allow.
+
+        If the pagename argument is provided (so named due to the page
+        management form), we will try to redirect all links which point to
+        this page, to that one. This is like doing a rename except this
+        page vanishes in a puff of smoke. See also rename. As with that
+        method, an updatebacklinks=0 argument will disable this.
+
+        XXX no it won't ? also, need a flag to disable reparenting
+        """
+        oldname, oldid = self.pageName(), self.getId()
+        # update parents attributes to avoid orphans
+        self.moveMyChildrenTo(self.primaryParentName())
+        # if a replacement page is specified, redirect all our backlinks there
+        if pagename and string.strip(pagename):
+            self.replaceLinksThroughoutWiki(oldname,pagename,REQUEST)
+        # get parent url while we still can
+        redirecturl = self.upUrl()
+        # unindex (and remove from outline) and move to the recycle bin folder
+        self.recycle(REQUEST)
+        # notify subscribers if appropriate
+        self.sendMailToEditSubscribers(
+            'This page was deleted.\n',
+            REQUEST=REQUEST,
+            subjectSuffix='',
+            subject='(deleted)')
+        if REQUEST: REQUEST.RESPONSE.redirect(redirecturl)
+
+    def ensureRecycleBin(self):
+        if not hasattr(self.folder().aq_base,'recycle_bin'):
+            self.folder().manage_addFolder('recycle_bin', 'deleted wiki pages')
+
+    def recycle(self, REQUEST=None):
+        """
+        Move this page to the recycle_bin subfolder, creating it if necessary.
+        """
+        self.ensureRecycleBin()
+        f = self.folder()
+        # cut or paste also unindexes, I believe
+        cb = f.manage_cutObjects(self.getId())
+        # kludge! don't let manage_pasteObjects catalog the new location
+        # (or add it to wiki outline)
+        save = self.__class__.manage_afterAdd
+        self.__class__.manage_afterAdd = lambda self,item,container: None
+        f.recycle_bin.manage_pasteObjects(cb)
+        self.__class__.manage_afterAdd = save
+
+    security.declareProtected(Permissions.Rename, 'rename')
+    def rename(self,pagename,
+               leaveplaceholder=LEAVE_PLACEHOLDER,
+               updatebacklinks=1,
+               sendmail=1,
+               REQUEST=None):
+        """
+        Rename this page, if permissions allow.
+
+        Another method that does quite a lot. Extras:
+        - preserve parentage of our children
+        - update links throughout the wiki. Warning, this may not be 100%
+        reliable. It replaces all occurrences of the old page name
+        beginning and ending with a word boundary. When changing between a
+        wikiname and freeform name, it should do the right thing with
+        brackets. It won't change a fuzzy freeform name though.
+        - leave a placeholder page
+        - notify subscribers
+        - if called with the existing name, ensures that id conforms to
+        canonicalId(title).
+
+        XXX the sendmail argument doesn't stop mailouts from updating backlinks
+        """
+        # anything to do ?
+        oldname, oldid = self.pageName(), self.getId()
+        # newlines would cause glitches later..
+        pagename = re.sub(r'[\r\n]','',pagename)
+        newname, newid = pagename, self.canonicalIdFrom(pagename)
+        if not newname or (newname == oldname and newid == oldid): return 
+
+        BLATHER('renaming %s (%s) to %s (%s)...'%(oldname,oldid,newname,newid))
+
+        # an old page just might have an empty title attribute - set it to
+        # avoid problems
+        if not self.title: self.title = self.getId()
+
+        # has the page name changed ?
+        if newname != oldname:
+            # update parents attributes (before our name changes)
+            self.moveMyChildrenTo(newname)
+            # update all links to oldname
+            # any later problems will undo all this (yay transactions!)
+            if updatebacklinks:
+                self.replaceLinksThroughoutWiki(oldname,newname,REQUEST)
+
+        # update wiki outline
+        # changeIdPreservingCreator->manage_renameObject->_delObject/_setObject
+        # -> manage_after* has the effect of losing our place in the
+        # hierarchy, take a snapshot so we can fix it up later
+        savedparentmap = deepcopy(self.wikiOutline().parentmap())
+        savedchildmap = deepcopy(self.wikiOutline().childmap())
+
+        # has the page id changed ?
+        if newid != oldid:
+            # NB manage_renameObject probably does an index_object() too
+            self.changeIdPreservingCreator(newid)
+            # update wikilinks to our old id, too, if not already done
+            # XXX optimisation: this is expensive so do it in one pass
+            if updatebacklinks and oldid != oldname:
+                self.replaceLinksThroughoutWiki(oldid,newid,REQUEST)
+
+        # change our name
+        self.title = newname
+        # update catalog
+        self.index_object() # XXX creator info may need reindexing too
+        # update wiki outline, using the copy we saved earlier
+        # nb that outline may not have been up to date, but replace will forgive
+        self.wikiOutline().setParentmap(savedparentmap)
+        self.wikiOutline().setChildmap(savedchildmap)
+        self.wikiOutline().replace(oldname,newname)
+
+        # do this after the above so it will have correct parent
+        if (newid != oldid) and leaveplaceholder:
+            # the url has changed, leave a placeholder
+            try: self.create(oldid,
+                             _("This page was renamed to %s. You can delete this one if no longer needed.\n") % (newname),
+                             sendmail=0)
+            # special case: we'll end up here when first saving a
+            # page that was created via the CMF/Plone content
+            # management interface - we can't save a placeholder
+            # page since the canonical ID hasn't really changed
+            except BadRequestException: pass
+
+        # notify subscribers if appropriate
+        if sendmail and newname != oldname:
+            self.sendMailToEditSubscribers(
+                'This page was renamed from %s to %s.\n'%(oldname,newname),
+                REQUEST=REQUEST,
+                subjectSuffix='',
+                subject='(renamed)')
+
+        BLATHER('rename complete')
+        if REQUEST: REQUEST.RESPONSE.redirect(self.pageUrl())
+
+    def changeIdPreservingCreator(self,newid):
+        creation_time, creator, creator_ip = \
+          self.creation_time, self.creator, self.creator_ip
+        self.folder().manage_renameObject(self.getId(),newid)
+        self.creation_time, self.creator, self.creator_ip = \
+          creation_time, creator, creator_ip
+
+    def moveMyChildrenTo(self,newparent):
+        children = self.childrenIdsAsList()
+        if children:
+            BLATHER('reparenting children of',self.getId())
+            for id in children:
+                child = getattr(self.folder(),id) # XXX poor caching
+                child.removeParent(self.pageName())
+                child.addParent(newparent)
+                child.index_object() # XXX need only reindex parents
+                
+        """
+        Replace one link with another throughout the wiki.
+
+        Freeform links should not be enclosed in brackets.
+        Comes with an appropriately big scary-sounding name. See
+        replaceLinks for more.
+        """
+    def replaceLinksThroughoutWiki(self,oldlink,newlink,REQUEST=None):
+        BLATHER('replacing all %s links with %s' % (oldlink,newlink))
+        for p in self.backlinksFor(oldlink):
+            # this is an extensive, risky operation which can fail for
+            # a number of reasons - carry on regardless so we don't
+            # block renames
+            # poor caching
+            try: p.getObject().replaceLinks(oldlink,newlink,REQUEST)
+            except:
+                BLATHER('replaceLinks failed to update %s links in %s' \
+                     % (oldlink,p.id))
+
+        """
+        Replace occurrences of oldlink with newlink in my text.
+
+        Freeform links should not be enclosed in brackets.
+        We'll also replace bare wiki links to a freeform page's id,
+        but not fuzzy links.
+        This tries not to do too much damage, but is pretty dumb.
+        Maybe it should use the pre-linking information.
+        It's slow, since it re-renders every page it changes.
+        """
+    def replaceLinks(self,oldlink,newlink,REQUEST=None):
+        if self.isWikiName(oldlink):
+            # add a \b to wikinames to make matches more accurate
+            oldpat = r'\b%s\b' % oldlink
+        else:
+            # replace both the freeform  and the equivalent bare wiki link
+            # XXX assumes single brackets are allowed in this wiki
+            oldpat = r'(\[%s\]|\b%s\b)' \
+                     % (re.escape(oldlink), self.canonicalIdFrom(oldlink))
+        newpat = (self.isWikiName(newlink) and newlink) or '[%s]' % newlink
+        self.edit(text=re.sub(oldpat, newpat, self.read()),
+                  REQUEST=REQUEST)
+
+    def handleFileUpload(self,REQUEST,log=''):
+        # is there a file upload ?
+        if (REQUEST and
+            hasattr(REQUEST,'file') and
+            hasattr(REQUEST.file,'filename') and
+            REQUEST.file.filename):     # XXX do something
+
+            # figure out the upload destination
+            if hasattr(self,'uploads'):
+                uploaddir = self.uploads
+            else:
+                uploaddir = self.folder()
+
+            # do we have permission ?
+            if not (self.checkPermission(Permissions.Upload,uploaddir)):# or
+                    #self.checkPermission(Permissions.UploadSmallFiles,
+                    #                self.folder())):
+                raise 'Unauthorized', (
+                    _('You are not authorized to upload files here.'))
+            if not (self.checkPermission(Permissions.Edit, self) or
+                    self.checkPermission(Permissions.Comment, self)):
+                raise 'Unauthorized', (
+                    _('You are not authorized to add a link on this ZWiki Page.'))
+            # can we check file's size ?
+            # yes! len(REQUEST.file.read()), apparently
+            #if (len(REQUEST.file.read()) > LARGE_FILE_SIZE and
+            #    not self.checkPermission(Permissions.Upload,
+            #                        uploaddir)):
+            #    raise 'Unauthorized', (
+            #        _("""You are not authorized to add files larger than
+            #        %s here.""" % (LARGE_FILE_SIZE)))
+
+            # create the File or Image object
+            file_id, content_type, size = \
+                    self._createFileOrImage(REQUEST.file,
+                                            title=REQUEST.get('title', ''),
+                                            REQUEST=REQUEST)
+            if file_id:
+                # link it on the page and finish up
+                self._addFileLink(file_id, content_type, size, REQUEST)
+                self.setLastLog(log)
+                self.index_object()
+            else:
+                # failed to create - give up (what about an error)
+                pass
+
+    def _createFileOrImage(self,file,title='',REQUEST=None):
+        # based on WikiForNow which was based on
+        # OFS/Image.py:File:manage_addFile
+        """
+        Add a new File or Image object, depending on file's filename
+        suffix. Returns a tuple containing the new id, content type &
+        size, or (None,None,None).
+        """
+        # macro to check folder contents without acquiring
+        folderHas = lambda folder,id: hasattr(folder.aq_base,id)
+
+        # set id & title from filename
+        title=str(title)
+        id, title = OFS.Image.cookId('', title, file)
+        if not id:
+            return None, None, None
+
+        # find out where to store files - in an 'uploads' subfolder if
+        # present, otherwise the wiki folder
+        folder = self.folder()
+        if (folderHas(folder,'uploads') and
+            folder.uploads.isPrincipiaFolderish):
+            folder = folder.uploads
+
+        # unless it already exists, create the file or image object
+        # use the CMF/Plone types if appropriate
+        # it will be renamed if there is an id collision with some other
+        # kind of object
+        if not (folderHas(folder,id) and
+                folder[id].meta_type in ('File','Image')):#,
+                                         #'Portal File','Portal Image')):
+            if guess_content_type(file.filename)[0][0:5] == 'image':
+                if self.inCMF():
+                    #XXX how ?
+                    id = folder._setObject(id, OFS.Image.Image(id,title,'')) 
+                else:
+                    id = folder._setObject(id, OFS.Image.Image(id,title,''))
+            else:
+                if self.inCMF():
+                    #XXX how ?
+                    id = folder._setObject(id, OFS.Image.File(id,title,''))
+                else:
+                    id = folder._setObject(id, OFS.Image.File(id,title,''))
+
+        # Now we "upload" the data.  By doing this in two steps, we
+        # can use a database trick to make the upload more efficient. (?)
+        ob = folder._getOb(id)
+        ob.manage_upload(file)
+
+        return (id, ob.content_type, ob.getSize())
+
+    def _addFileLink(self, file_id, content_type, size, REQUEST):
+        """
+        Link a file or image at the end of this page, if not already linked.
+        
+        If it's an image and not too big, display it inline.
+        """
+        if re.search(r'(src|href)="%s"' % file_id,self.text()): return
+
+        if hasattr(self,'uploads'): folder = 'uploads/'
+        else: folder = ''
+
+        if content_type[0:5] == 'image' and \
+           not (hasattr(REQUEST,'dontinline') and REQUEST.dontinline) and \
+           size <= LARGE_FILE_SIZE :
+            linktxt = self.pageType().inlineImage(self, file_id, folder+file_id)
+        else:
+            linktxt = self.pageType().linkFile(self, file_id, folder+file_id)
+        self.setText(self.read()+linktxt,REQUEST)
+        self.setLastEditor(REQUEST)
+
+        """
+        Set up the zope ownership of a new page appropriately.
+        """
+    def _setOwnership(self, REQUEST=None):
+        # To help control executable content, make sure the new page
+        # acquires it's owner from the parent folder.
+        self._deleteOwnershipAfterAdd()
+        #if not self.usingRegulations():
+        #    # To help control executable content, make sure the new page
+        #    # acquires it's owner from the parent folder.
+        #    self._deleteOwnershipAfterAdd()
+        #else:
+        #    self._setOwnerRole(REQUEST)
+            
+    # for IssueNo0157
+    _old_read = DTMLDocument.read
+    security.declareProtected(Permissions.View, 'read')
+    def read(self):
+        return re.sub('<!--antidecapitationkludge-->\n\n?','',
+                      self._old_read())
+
+    security.declareProtected(Permissions.View, 'text')
+    def text(self, REQUEST=None, RESPONSE=None):
+        """
+        Return this page's source text, with text/plain content type.
+        
+        (a permission-free version of document_src)
+        # XXX security ?
+        """
+        if RESPONSE is not None:
+            RESPONSE.setHeader('Content-Type', 'text/plain')
+            #RESPONSE.setHeader('Last-Modified', rfc1123_date(self._p_mtime))
+        return self.read()
+
+    def setText(self, text='', REQUEST=None):
+        """
+        Change this page's text.
+
+        Does cleanups and triggers pre-rendering and DTML re-parsing.
+        """
+        self.raw = self.cleanupText(text)
+        self.preRender(clear_cache=1)
+        # re-cook DTML's cached parse data if necessary
+        # will prevent edit if DTML can't parse.. hopefully no auth trouble
+        self.cookDtmlIfNeeded()
+        # try running the DTML, to prevent edits if DTML can't execute
+        # got authorization problems, commit didn't help..
+        #if self.supportsDtml() and self.dtmlAllowed():
+        #    #get_transaction().commit()
+        #    DTMLDocument.__call__(self,self,REQUEST,REQUEST.RESPONSE)
+
+    def checkForSpam(self, t):
+        """
+        Check for signs of spam in some text, and raise an error if found.
+
+        Also looks at the current user's info in REQUEST.
+        """
+        REQUEST = getattr(self,'REQUEST',None)
+        username = self.usernameFrom(REQUEST,ip_address=0)
+        ip = getattr(REQUEST,'REMOTE_ADDR','')
+        page = self.pageName()
+        def raiseSpamError(reason, verbose_reason):
+            BLATHER(('blocked edit from %s (%s) on %s (%s)\n%s\n') % \
+                    (ip, username, page, reason, t))
+            raise _("There was a problem: %s" % \
+                    (verbose_reason))
+            
+        # banned link pattern ?
+        for pat in getattr(self.folder(),'banned_links',[]):
+            pat = strip(pat)
+            if pat and re.search(pat,t):
+                raiseSpamError(_("banned_links match"),
+                               _("your edit contained a banned link pattern. Please contact the site administrator for help."))
+
+        # anonymous edit with too many urls ?
+        prop = 'max_anonymous_links'
+        # we'll handle either an int or string property
+        if (not self.requestHasUsername(REQUEST) and
+            hasattr(self.folder(), prop)):
+            try: max = int(getattr(self.folder(), prop))
+            except ValueError: max = None
+            if max is not None:
+                if len(re.findall(r'https?://',t)) > max:
+                    raiseSpamError(_("exceeded max_anonymous_links"),
+                                   _("adding of external links by unidentified users is restricted. Please back up and remove some of the http urls you added, or contact the site administrator for help."))
+
+        # and a similar check for identified users
+        # XXX simplify ? one property for both ?
+        prop = 'max_identified_links'
+        # we'll handle either an int or string property
+        if (hasattr(self.folder(), prop)):
+            try: max = int(getattr(self.folder(), prop))
+            except ValueError: max = None
+            if max is not None:
+                if len(re.findall(r'https?://',t)) > max:
+                    raiseSpamError(_("exceeded max_identified_links"),
+                                   _("adding of external links is restricted, even for identified users. Please back up and remove some of the http urls you added, or contact the site administrator for help."))
+
+    def cleanupText(self, t):
+        """
+        Do some cleanup of incoming text, also block spam links.
+        """
+        # strip any browser-appended ^M's
+        t = re.sub('\r\n', '\n', t)
+
+        # XXX epoz & dtml compatibility
+        # editing a page with Epoz changes
+        # <dtml-var "TestPage(bare=1,REQUEST=REQUEST)"> to
+        # <dtml-var ="" testpage(bare="1,REQUEST=REQUEST)&quot;"></dtml-var>
+        #
+        # <dtml-var expr="TestPage(bare=1,REQUEST=REQUEST)"> does better
+        # but still gets a </dtml-var> added.. we can strip this.  At
+        # least now a dtml page or method can be included safely in an
+        # epoz page.
+        #BLATHER('text from epoz:',t[:100])
+        #t = re.sub(r'</dtml-var>','',t)
+        #BLATHER('saving text:',t[:100])
+
+        # convert international characters to HTML entities for safekeeping
+        #for c,e in intl_char_entities:
+        #    t = re.sub(c, e, t)
+        # assume today's browsers will not harm these.. if this turns out
+        # to be false, do some smarter checking here
+
+        # here's the place to strip out any disallowed html/scripting elements
+        # XXX there are updates for this somewhere on zwiki.org
+        if DISABLE_JAVASCRIPT:
+            t = re.sub(javascriptexpr,r'&lt;disabled \1&gt;',t)
+
+        # strip out HTML header tags if present
+        def onlyBodyFrom(t):
+            # XXX these can be expensive, for now just skip if there's a problem
+            try:
+                t = re.sub(htmlheaderexpr,'',t)
+                t = re.sub(htmlfooterexpr,'',t)
+            except RuntimeError: pass
+            return t
+            # maybe better, but more inclined to mess with valid text ?
+            #return re.sub(htmlbodyexpr, r'\1', t)
+        t = onlyBodyFrom(t)
+
+        return t
+
+    def setLastEditor(self, REQUEST=None):
+        """
+        Record last editor info based on the current REQUEST and time.
+        """
+        if REQUEST:
+            self.last_editor_ip = REQUEST.REMOTE_ADDR
+            self.last_editor = self.usernameFrom(REQUEST)
+        else:
+            # this has been fiddled with before
+            # if we have no REQUEST, at least update last editor
+            self.last_editor_ip = ''
+            self.last_editor = ''
+        self.last_edit_time = DateTime(time.time()).ISO()
+
+    def hasCreatorInfo(self):
+        """
+        True if this page already has creator attributes.
+        """
+        return (hasattr(self,'creator') and
+                hasattr(self,'creation_time') and
+                hasattr(self,'creator_ip'))
+                
+
+    def setCreator(self, REQUEST=None):
+        """
+        record my creator, creator_ip & creation_time
+        """
+        self.creation_time = DateTime(time.time()).ISO()
+        if REQUEST:
+            self.creator_ip = REQUEST.REMOTE_ADDR
+            self.creator = self.usernameFrom(REQUEST)
+        else:
+            self.creator_ip = ''
+            self.creator = ''
+
+    security.declareProtected(Permissions.View, 'checkEditConflict')
+    def checkEditConflict(self, timeStamp, REQUEST):
+        """
+        Warn if this edit would be in conflict with another.
+
+        Edit conflict checking based on timestamps -
+        
+        things to consider: what if
+        - we are behind a proxy so all ip's are the same ?
+        - several people use the same cookie-based username ?
+        - people use the same cookie-name as an existing member name ?
+        - no-one is using usernames ?
+
+        strategies:
+        0. no conflict checking
+
+        1. strict - require a matching timestamp. Safest but obstructs a
+        user trying to backtrack & re-edit. This was the behaviour of
+        early zwiki versions.
+
+        2. semi-careful - record username & ip address with the timestamp,
+        require a matching timestamp or matching non-anonymous username
+        and ip.  There will be no conflict checking amongst users with the
+        same username (authenticated or cookie) connecting via proxy.
+        Anonymous users will experience strict checking until they
+        configure a username.
+
+        3. relaxed - require a matching timestamp or a matching, possibly
+        anonymous, username and ip. There will be no conflict checking
+        amongst anonymous users connecting via proxy. This is the current
+        behaviour.
+        """
+        username = self.usernameFrom(REQUEST)
+        if (timeStamp is not None and
+            timeStamp != self.timeStamp() and
+            (not hasattr(self,'last_editor') or
+             not hasattr(self,'last_editor_ip') or
+             username != self.last_editor or
+             REQUEST.REMOTE_ADDR != self.last_editor_ip)):
+            return 1
+        else:
+            return 0
+
+    security.declareProtected(Permissions.View, 'timeStamp')
+    def timeStamp(self):
+        return str(self._p_mtime)
+    
+    security.declareProtected(Permissions.FTP, 'manage_FTPget')
+    def manage_FTPget(self):
+        """
+        Get source for FTP download.
+        """
+        #candidates = list(self.allowedPageTypes())
+        #types = "%s (alternatives:" % self.pageTypeId()
+        #if self.pageTypeId() in candidates:
+        #    candidates.remove(self.pageTypeId())
+        #for i in candidates:
+        #    types = types + " %s" % i
+        #types = types + ")"
+        types = "%s" % self.pageTypeId()
+        return "Wiki-Safetybelt: %s\nType: %s\nLog: \n\n%s" % (
+            self.timeStamp(), types, self.read())
+
+    security.declareProtected(Permissions.Edit, 'PUT')
+    def PUT(self, REQUEST, RESPONSE):
+        """
+        Handle HTTP/FTP/WebDav PUT requests.
+        """
+        self.dav__init(REQUEST, RESPONSE)
+        self.dav__simpleifhandler(REQUEST, RESPONSE, refresh=1)
+        body=REQUEST.get('BODY', '')
+        self._validateProxy(REQUEST)
+
+        headers, body = parseHeadersBody(body)
+        log = string.strip(headers.get('Log', headers.get('log', ''))) or ''
+        type = (string.strip(headers.get('Type', headers.get('type', '')))
+                or None)
+        if type is not None:
+            type = string.split(type)[0]
+            #if type not in self.allowedPageTypes():
+            #    # Silently ignore it.
+            #    type = None
+        timestamp = string.strip(headers.get('Wiki-Safetybelt', '')) or None
+        if timestamp and self.checkEditConflict(timestamp, REQUEST):
+            RESPONSE.setStatus(423) # Resource Locked
+            return RESPONSE
+
+        #self.setText(body)
+        #self.setLastEditor(REQUEST)
+        #self.index_object()
+        #RESPONSE.setStatus(204)
+        #return RESPONSE
+        try:
+            self.edit(text=body, type=type, timeStamp=timestamp,
+                      REQUEST=REQUEST, log=log, check_conflict=0)
+        except 'Unauthorized':
+            RESPONSE.setStatus(401)
+            return RESPONSE
+        RESPONSE.setStatus(204)
+        return RESPONSE
+
+    security.declareProtected(Permissions.Edit, 'manage_edit')
+    def manage_edit(self, data, title, REQUEST=None):
+        """Do standard manage_edit kind of stuff, using our edit."""
+        #self.edit(text=data, title=title, REQUEST=REQUEST, check_conflict=0)
+        #I think we need to bypass edit to provide correct permissions
+        self.title = title
+        self.setText(data,REQUEST)
+        self.setLastEditor(REQUEST)
+        self.reindex_object()
+        if REQUEST:
+            message="Content changed."
+            return self.manage_main(self,REQUEST,manage_tabs_message=message)
+
+    def allowedPageTypes(self):
+        """
+        List the page type ids which may be selected in this wiki's edit form.
+
+        This will be all available page types, unless overridden by an
+        allowed_page_types property.
+        """
+        return (filter(lambda x:strip(x),getattr(self,'allowed_page_types',[]))
+                or map(lambda x:x._id, PAGETYPES))
+
+    def defaultPageType(self):
+        """This wiki's default page type."""
+        return self.allowedPageTypes()[0]
+
+    security.declareProtected(Permissions.Add, 'split')
+    def split(self):
+        """
+        Move this page's major sections to sub-pages, if supported.
+
+        Delegates to the page type; at present only the restructured
+        text page type does this.
+
+        Watch out for confusion with string.split which might arise
+        here and there.
+        """
+        return self.pageType().split(self)
+    
+    security.declareProtected(Permissions.Delete, 'merge')
+    def merge(self):
+        """
+        Merge sub-pages as sections of this page, if supported.
+
+        Delegates to the page type; at present only the restructured
+        text page type does this.
+        """
+        return self.pageType().merge(self)
+    
+InitializeClass(PageEditingSupport)
+

Added: zope-zwiki/branches/upstream/current/Editing_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/Editing_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Editing_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,633 @@
+from testsupport import *
+ZopeTestCase.installProduct('ZCatalog')
+ZopeTestCase.installProduct('ZWiki')
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    return suite
+
+# defined in module scope for easier reuse in plone tests XXX ?
+def test_rename(self):
+    # rename needs some identification
+    #self.login() # no effect ?
+    req = self.request
+    req.cookies['zwiki_username'] = 'testuser'
+    # under ZopeTestCase the page's _p_jar is present but None,
+    # which makes cb_isMoveable & manage_renameObject fail.
+    # hack it for the duration
+    ZWikiPage.cb_isMoveable = lambda x:1 # XXX affects later tests ?
+    # better, from the ZTC FAQ - but gives this:
+    #  File "/usr/local/zope/software/lib/python/ZODB/Transaction.py", line 235, in commit
+    #    ncommitted += self._commit_objects(objects)
+    #  File "/usr/local/zope/software/lib/python/ZODB/Transaction.py", line 349, in _commit_objects
+    #    jar.commit(o, self)
+    #  File "/usr/local/zope/software/lib/python/ZODB/Connection.py", line 389, in commit
+    #    dump(state)
+    #UnpickleableError: Cannot pickle <type 'file'> objects
+    #get_transaction().commit(1)
+    self.wiki.TestPage.rename(pagename='NewName',REQUEST=req)
+    self.assert_(hasattr(self.wiki,'NewName'))
+    # the wiki outline object is also updated
+    self.assert_(not self.wiki.NewName.wikiOutline().hasNode('TestPage'))
+    self.assert_(self.wiki.NewName.wikiOutline().hasNode('NewName'))
+    # again, this time with parents and offspring
+    self.wiki.NewName.create('NewNameChild')
+    self.wiki.NewNameChild.create('NewNameGrandChild')
+    self.wiki.NewNameChild.rename(pagename='NewNameChildRenamed',REQUEST=req)
+    self.assert_(hasattr(self.wiki,'NewNameChildRenamed'))
+    self.assert_('NewNameChildRenamed' in self.wiki.NewNameGrandChild.parents)
+    # the wiki outline object is also updated
+    self.assert_('NewNameChildRenamed' in \
+                 self.wiki.outline.parents('NewNameGrandChild'))
+    self.assert_('NewName' in \
+                 self.wiki.outline.parents('NewNameChildRenamed'))
+    
+
+class Tests(ZwikiTestCase):
+
+    def test_manage_addZWikiPage(self):
+        from Products.ZWiki.ZWikiPage import manage_addZWikiPage
+        manage_addZWikiPage(self.folder,'ZmiTestPage')
+        assert hasattr(self.folder,'ZmiTestPage')
+        # the wiki outline object is also updated
+        self.assert_(self.folder.ZmiTestPage.wikiOutline().hasNode('ZmiTestPage'))
+
+    def test_edit(self):
+        p = self.page
+        p.edit(text='something')
+        self.assertEqual(p.read(),'something')
+        p.edit(text='')
+        self.assertEqual(p.read(),'')
+
+    def test__createFileOrImage(self):
+        import OFS
+        p = self.page
+        f = p.aq_parent
+        file = OFS.Image.Pdata('test file data')
+
+        # our test page/folder initially has no uploads attr.
+        self.assert_(not hasattr(p,'uploads'))
+
+        # calling with an unnamed file should do nothing much
+        self.assertEqual(p._createFileOrImage(file),(None, None, None))
+        
+        # ditto for a blank filename
+        file.filename = ''
+        self.assertEqual(p._createFileOrImage(file),(None, None, None))
+
+        # here, a file object of unknown type should be created
+        name = 'testfile'
+        file.filename = name
+        id, content_type,size = p._createFileOrImage(file)
+        self.assertEqual(str(getattr(f,id)),'test file data')
+        self.assertEqual(content_type ,'application/octet-stream')
+        self.assertEqual(size,14)
+
+        # a text file
+        name = 'testfile.txt'
+        file.filename = name
+        id, content_type,size = p._createFileOrImage(file)
+        self.assertEqual(str(f[id]),'test file data')
+        self.assertEqual(content_type,'text/plain')
+
+        # an image
+        name = 'testfile.gif'
+        file.filename = name
+        id, content_type,size = p._createFileOrImage(file)
+        # evaluating an Image gives its html tag
+        self.assert_(re.match(r'<img.*testfile\.gif',str(f[id])))
+        self.assertEqual(content_type,'image/gif')
+
+    def testEditWithFileUpload(self):
+        import OFS
+        p = self.page
+        f = p.aq_parent
+
+        # add a file to a page
+        file = OFS.Image.Pdata('test file data')
+        file.filename = 'edittestfile'
+        p.REQUEST.file = file
+        p.edit(REQUEST=p.REQUEST)
+
+        # the new file should exist
+        self.assert_(hasattr(f,'edittestfile'))
+        # with the right data
+        self.assertEqual(str(f['edittestfile']),'test file data')
+        # and a link should have been added to the page
+        #XXX do this test for each page type ?
+        #self.assertEqual(p.read(),'\n\n<a href="edittestfile">edittestfile</a>\n') # stx
+        self.assertEqual(p.read(),'\n\n!`edittestfile`__\n\n__ edittestfile\n')     # rst
+
+        # a file with blank filename should be ignored
+        p.REQUEST.file.filename = ''
+        old = p.read()
+        p.edit(REQUEST=p.REQUEST)
+        self.assert_(p.read() == old)
+
+        ## ditto, with an image
+        p.edit(text='')
+        file = OFS.Image.Pdata('test file data')
+        file.filename = 'edittestimage.jpg'
+        p.REQUEST.file = file
+        p.edit(REQUEST=p.REQUEST)
+        self.assert_(hasattr(f,'edittestimage.jpg'))
+        self.assertEqual(f['edittestimage.jpg'].content_type,'image/jpeg')
+        #self.assertEqual(p.read(),'\n\n<img src="edittestimage.jpg" />\n') #stx
+        self.assertEqual(p.read(),'\n\n.. image:: edittestimage.jpg\n')     #rst
+
+        # images should not be inlined if dontinline is set
+        p.REQUEST.file.filename = 'edittestimage.png'
+        p.REQUEST.dontinline = 1
+        p.edit(REQUEST=p.REQUEST)
+        #self.assertEqual(p.read(),
+        #  '\n\n<img src="edittestimage.jpg" />\n\n\n<a href="edittestimage.png">edittestimage.png</a>\n') #stx
+        self.assertEqual(p.read(),
+          '\n\n.. image:: edittestimage.jpg\n\n\n!`edittestimage.png`__\n\n__ edittestimage.png\n') #rst
+
+    def testRedirectAfterDelete(self):
+        p = self.page
+        p.parents = ['chickens','dogs']
+        p.recycle = lambda x: None
+        req = MockRequest()
+        #req = makerequest(self.app)
+        class MockResponse:
+            def redirect(self, url): self.redirectedto = url
+        req.RESPONSE = MockResponse()
+
+        # redirect to wiki url if no existing parents
+        r = p.handleDeleteMe('DeleteMe',REQUEST=req)
+        self.assertEqual(r,1)
+        self.assert_(hasattr(req.RESPONSE,'redirectedto'))
+        self.assertEqual(req.RESPONSE.redirectedto,
+                         p.wiki_url()+'/')
+        
+        ## redirect to first existing parent
+        #p.create(page='Dogs')
+        ## was:
+        ##r = p.handleDeleteMe('DeleteMe',REQUEST=req)
+        ## started breaking when I introduced page titles.
+        ## incorrect anyway, should be something like:
+        #r = p.aq_parent.Dogs.handleDeleteMe('DeleteMe',REQUEST=req)
+        ## but the mock page won't support this
+        ## disable the lot for now
+        #self.assertEqual(r,1)
+        #self.assert_(hasattr(req.RESPONSE,'redirectedto'))
+        #self.assertEqual(req.RESPONSE.redirectedto,
+        #                 p.wiki_url()+'/'+'Dogs')
+
+    # can't test recycle easily, because manage_pasteObject needs an app
+    #def testDeleteMe(self):
+    #    #When we see a first line beginning with "DeleteMe":
+    #    #- move to recycle_bin
+    #    #- redirect to first parent or default page
+    #
+    #    p = mockPage(__name__='TestPage')
+    #    f = p.aq_parent
+    #    self.assert_(hasattr(f,'TestPage'))
+    #    self.assert_(not hasattr(f,'recycle_bin'))
+    #
+    #    #deleteme's not at the beginning shouldn't do anything
+    #    p.edit(text=p.read()+'\nDeleteMe')
+    #    self.assertEqual(p.read(),'\nDeleteMe')
+    #
+    #    #deleteme at the beginning will send it to recycle_bin
+    #    p.edit(text='DeleteMe, with comments\n')
+    #    self.assert_(not hasattr(f,'TestPage'))
+    #    self.assert_(hasattr(f,'recycle_bin'))
+    #    self.assertEqual(f.recycle_bin.TestPage.read(),'\nDeleteMe')
+    
+    # same problem as above
+    #def test_recycle(self):
+    #    p = mockPage(__name__='TestPage')
+    #    f = p.aq_parent
+    #    self.assert_(hasattr(f,'TestPage'))
+    #    p.recycle()                     
+    #    self.assert_(not hasattr(f,'TestPage'))
+    #    self.assert_(hasattr(f,'recycle_bin'))
+    #    self.assertEqual(f.recycle_bin.TestPage.read(),'\nDeleteMe')
+
+    #def test_delete(self):
+        #p = mockPage()
+        #f = p.folder()
+        #self.assert_(hasattr(f,'TestPage'))
+        #p.delete()
+        #self.assert_(not hasattr(f,'TestPage'))
+        #self.assert_(hasattr(f,'recycle_bin'))
+        #self.assert_(hasattr(f.recycle_bin,'TestPage'))
+
+    # failed to make this test work
+    #def test_delete_leaves_no_orphans(self):
+    #    p = mockPage(__name__='Page')
+    #    f = p.folder()
+    #    # create() would give real zwiki pages, build these by hand
+    #    child = mockPage(__name__='Child')
+    #    f._setObject('Child',child,set_owner=0)
+    #    child.parents = ['Page']
+    #    grandchild = mockPage(__name__='GrandChild')
+    #    f._setObject('GrandChild',grandchild,set_owner=0)
+    #    grandchild.parents = ['Child']
+    #    child.recycle = lambda x: None
+    #    child.REQUEST.cookies['zwiki_username'] = 'someusername'
+    #    child.delete(REQUEST=child.REQUEST)
+    #    self.assertEquals(grandchild.parents,['Page'])
+        
+    def testEditLastEditorStamping(self):
+        # Username stamping
+        p = self.page
+        f = p.aq_parent
+        p.last_editor = '-'
+
+        # if no username available, IP address should be recorded
+        p.REQUEST.set('REMOTE_ADDR', '1.2.3.4')
+        p.append(text='.',REQUEST=p.REQUEST)
+        self.assertEqual(p.last_editor,'1.2.3.4')
+        self.assertEqual(p.last_editor_ip,'1.2.3.4')
+
+        # use the zwiki_username cookie if available
+        p.REQUEST.cookies['zwiki_username'] = 'cookiename'
+        p.append(text='.',REQUEST=p.REQUEST)
+        self.assertEqual(p.last_editor,'cookiename')
+        self.assertEqual(p.last_editor_ip,'1.2.3.4')
+
+        # if we are authenticated, use that by preference
+        p.REQUEST.set('AUTHENTICATED_USER', MockUser('authusername'))
+        p.append(text='.',REQUEST=p.REQUEST)
+        self.assertEqual(p.last_editor,'authusername')
+        self.assertEqual(p.last_editor_ip,'1.2.3.4')
+
+        # don't record editor if nothing is actually changed
+        p.REQUEST.set('AUTHENTICATED_USER', MockUser('differentusername'))
+        p.REQUEST.set('REMOTE_ADDR', '5.6.7.8')
+        p.edit(text=p.read(),REQUEST=p.REQUEST)
+        self.assertEqual(p.last_editor,'authusername')
+        self.assertEqual(p.last_editor_ip,'1.2.3.4')
+
+    def test_create(self):
+        p = self.page
+        f = p.aq_parent
+        
+        # create a blank page
+        p.create('TestPage1',text='')
+        self.assert_(hasattr(f,'TestPage1'))
+        self.assertEqual(f.TestPage1.text(),'')
+        # the wiki outline object is also updated
+        self.assert_(p.wikiOutline().hasNode('TestPage1'))
+        # the parent is the creating page
+        self.assertEqual(f.TestPage1.parents,['TestPage'])
+        # or can be specified..
+        p.create('TestPageA',parents=['a','b'])
+        self.assertEqual(f.TestPageA.parents,['a','b'])
+        p.create('TestPageB',parents=[])
+        self.assertEqual(f.TestPageB.parents,[])
+        
+        # create a wwml page with some text
+        p.create('TestPage2',text='test page data',type='wwml')
+        self.assert_(hasattr(f,'TestPage1'))
+        self.assertEqual(f.TestPage2.read(),'test page data')
+        self.assertEqual(f.TestPage2.pageTypeId(),'wwml')
+
+# having trouble making MZP support this
+# handleFileUpload -> checkPermission(,MZP.folder()) loops
+# because page.aq_parent.aq_parent == page
+# even if you set it to None, somewhere it comes back
+#    def testCreateWithFileUpload(self):
+#        p = mockPage()
+#        f = p.folder()
+#        f.aq_parent = None
+#        
+#        # upload a file while creating a page
+#        # this capability broke - fix if ever needed
+#        # and most of this is tested above I think
+#        file = OFS.Image.Pdata('test file data')
+#        file.filename = 'test_file'
+#        p.REQUEST.file = file
+#        p.create('TestPage3',text='test page data',REQUEST=p.REQUEST)
+#        # the new file should exist
+#        self.assert_(hasattr(f,'test_file'))
+#        # with the right data
+#        self.assertEqual(str(f['test_file']),'test file data')
+#        # and a link should have been added to the new wiki page
+#        self.assertEqual(f.TestPage3.read(),
+#          'test page data\n\n<a href="test_file">test_file</a>\n')
+#
+#        # ditto with an image
+#        file.filename = 'test_image.gif'
+#        p.REQUEST.file = file
+#        f.TestPage.create('TestPage4',text='test page data',REQUEST=p.REQUEST)
+#        self.assert_(hasattr(f,'test_image.gif'))
+#        self.assertEqual(f['test_image.gif'].content_type,'image/gif')
+#        self.assertEqual(f.TestPage4.read(),
+#                         'test page data\n\n<img src="test_image.gif">\n')
+#
+#        # images should not be inlined if dontinline is set
+#        file.filename = 'test_image.JPG'
+#        p.REQUEST.dontinline = 1
+#        f.TestPage.create('TestPage5',text='',REQUEST=p.REQUEST)
+#        self.assertEqual(f.TestPage5.read(),
+#                         '\n\n<a href="test_image.JPG">test_image.JPG</a>\n')
+
+    def test_setText(self):
+        p = self.page
+        p.edit(text='<html blah>\n<body blah>\ntest\n</body>\n</html>')
+        self.assertEqual(p.read(),'\ntest\n')
+
+    def test_setLastEditor(self):
+        p = self.page
+        p.REQUEST.set('REMOTE_ADDR', '1.2.3.4')
+        p.REQUEST.set('AUTHENTICATED_USER', MockUser('user'))
+        p.setLastEditor(REQUEST=p.REQUEST)
+        self.assertEqual(p.last_editor,'user')
+        self.assertEqual(p.last_editor_ip,'1.2.3.4')
+
+    def test_setCreator(self):
+        p = self.page
+        r = MockRequest()
+        u = MockUser('test user')
+        r.set('AUTHENTICATED_USER',u)
+        r.set('REMOTE_ADDR','4.3.2.1')
+        p.setCreator()
+        self.assert_(p.creation_time)
+        self.assertEqual(p.creator_ip,'')
+        self.assertEqual(p.creator,'')
+        p.setCreator(r)
+        self.assertEqual(p.creator_ip,'4.3.2.1')
+        self.assertEqual(p.creator,'test user')
+        
+    def test_text(self):
+        p = self.page
+        # ensure we don't lose first lines to DTML's decapitate()
+        p.setText(r'first: line\n\nsecond line\n')
+        self.assertEqual(p.text(),'first: line\\n\\nsecond line\\n')
+        # ensure none of these reveal the antidecapkludge
+        p.edit(type='html')
+        p.setText('test text')
+        self.assertEqual(p.text(),'test text')
+        self.assertEqual(p.read(),'test text')
+        self.assertEqual(p.__str__(),'test text')
+
+    test_rename = test_rename
+
+    # MZP doesn't support manage_renameObject
+    #def testRenameLeavesNoOrphans(self):
+    #    p = mockPage('parent page')
+    #    c = p.create('child page')
+    #    p.rename('new parent name')
+    #    self.assertEquals(['new parent name'],c.parents)
+
+    def comment(self):
+        p = self.page
+        p.edit(text='test')
+
+        # check that page source has changed after a comment
+        p.comment(text='comment',username='me',time='1999/12/31 GMT')
+        self.assertEqual(
+            p.read(),
+            '''\
+test
+
+From me Fri Dec 31 00:00:00 GMT 1999
+From: me
+Date: 1999/12/31 GMT
+Subject: 
+Message-ID: <19991231000000+0000 at foo>
+
+comment''')
+        # check that the html cache has also been updated,
+        # and a discussion separator added
+        # XXX this was one of those "copy & paste" tests.. note the
+        # underlining of _1_ in the date heading, this is not what we
+        # want.
+        self.assertEqual(
+            p.preRendered(),
+            '''\
+<p>test
+ZWIKIMIDSECTION</p>
+<p><a name="comments"><br /><b><span class="commentsheader">comments:</span></b></a></p>
+<p><a name="msg19991231000000+0000 at foo"></a>
+<b>...</b> --me,  <a href="http://nohost/test_folder<u>1</u>/wiki/TestPage#msg19991231000000+0000 at foo">1999/12/31 GMT</a> <a href="http://nohost/test_folder<u>1</u>/wiki/TestPage?subject=&in_reply_to=%3C19991231000000%2B0000%40foo%3E#bottom">reply</a><br />
+comment</p>
+''')
+
+        # check there's at most one separator
+        p.comment(text='comment',username='me',time='1999/12/31 GMT')
+        self.assertEqual(
+            p.preRendered(),
+            '''\
+<p>test
+ZWIKIMIDSECTION</p>
+<p><a name="comments"><br /><b><span class="commentsheader">comments:</span></b></a></p>
+<p><a name="msg19991231000000+0000 at foo"></a>
+<b>...</b> --me,  <a href="http://nohost/test_folder<u>1</u>/wiki/TestPage#msg19991231000000+0000 at foo">1999/12/31 GMT</a> <a href="http://nohost/test_folder<u>1</u>/wiki/TestPage?subject=&in_reply_to=%3C19991231000000%2B0000%40foo%3E#bottom">reply</a><br />
+comment</p>
+<p><a name="msg19991231000000+0000 at foo"></a>
+<b>...</b> --me,  <a href="http://nohost/test_folder<u>1</u>/wiki/TestPage#msg19991231000000+0000 at foo">1999/12/31 GMT</a> <a href="http://nohost/test_folder<u>1</u>/wiki/TestPage?subject=&in_reply_to=%3C19991231000000%2B0000%40foo%3E#bottom">reply</a><br />
+comment</p>
+''')
+        
+        # check we ignore comments with no subject or body
+        old = p.read()
+        p.comment(text='',subject_heading='')
+        self.assertEqual(p.read(),old)
+
+    def testEndToEndCommentFormatting(self):
+        USER = "me"
+        TIME = "Fri, 31 Dec 1999 00:00:00 +0000"
+        COMMENT = """\
+short lines
+
+aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa
+aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa
+
+long lines
+
+bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb
+bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb
+
+citations
+
+> cccc cccc cccc cccc cccc cccc cccc cccc cccc cccc cccc
+> cccc cccc cccc cccc cccc cccc cccc cccc cccc cccc cccc
+
+long citations
+
+> dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dd
+> dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dd
+"""
+        SHOULDWRITE = """\
+
+
+From me Fri Dec 31 00:00:00 +0000 1999
+From: me
+Date: Fri, 31 Dec 1999 00:00:00 +0000
+Subject: 
+Message-ID: <>
+
+short lines
+
+aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa
+aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa
+
+long lines
+
+bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb
+bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb
+
+citations
+
+> cccc cccc cccc cccc cccc cccc cccc cccc cccc cccc cccc
+> cccc cccc cccc cccc cccc cccc cccc cccc cccc cccc cccc
+
+long citations
+
+> dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dd
+> dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dd
+"""
+        SHOULDDIFF = """\
+
+
+From me Fri Dec 31 00:00:00 +0000 1999
+From: me
+Date: Fri, 31 Dec 1999 00:00:00 +0000
+Subject: 
+Message-ID: <>
+
+short lines
+
+aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa
+aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa
+
+long lines
+
+bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb
+bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb
+
+citations
+
+> cccc cccc cccc cccc cccc cccc cccc cccc cccc cccc cccc
+> cccc cccc cccc cccc cccc cccc cccc cccc cccc cccc cccc
+
+long citations
+
+> dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dd
+> dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dd
+
+"""
+        # XXX this is getting confused
+        SHOULDMAILOUT = """\
+From me Fri Dec 31 00:00:00 +0000 1999 From: me Date: Fri, 31 Dec 1999
+00:00:00 +0000 Subject: Message-ID: <>
+
+short lines
+
+aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa
+aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa
+
+long lines
+
+bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb
+bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb
+bbbb bbbb bbbb bbbb
+
+citations
+
+> cccc cccc cccc cccc cccc cccc cccc cccc cccc cccc cccc cccc cccc
+> cccc cccc cccc cccc cccc cccc cccc cccc cccc
+
+long citations
+
+> dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd
+> dddd dddd dd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd dddd
+> dddd dddd dddd dddd dd"""
+        COMMENT2 = "bah\n"
+        SHOULDWRITE2 = "\n\nbah\n"
+        SHOULDDIFF2 = "\n\nbah\n\n"
+        SHOULDMAILOUT2 = "bah\n"
+
+        from Products.ZWiki.Diff import PageDiffSupport
+        p = self.page
+
+        # test formatting at each stage
+        oldtext = p.read()
+        p.comment(text=COMMENT,username=USER,time=TIME)
+        text = p.read()
+        text = re.sub(r'Message-ID: <[^>]+>',r'Message-ID: <>',text)
+        text = re.sub(r'In-reply-to: <[^>]+>',r'In-reply-to: <>',text)
+        self.assertEqual(text,SHOULDWRITE)
+        diff = PageDiffSupport().textDiff(a=oldtext,b=text,verbose=0)
+        self.assertEqual(diff,SHOULDDIFF)
+        #self.assertEqual(p.formatMailout(diff), SHOULDMAILOUT)
+
+        # a citation with no trailing newline
+        p.edit(text='')
+        oldtext = p.read()
+        p.comment(text='> test',username=USER,time=TIME)
+        text = p.read()
+        text = re.sub(r'Message-ID: <[^>]+>',r'Message-ID: <>',text)
+        text = re.sub(r'In-reply-to: <[^>]+>',r'In-reply-to: <>',text)
+        diff = PageDiffSupport().textDiff(a=oldtext,b=text,verbose=0)
+        #self.assertEqual(p.formatMailout(diff),
+#                         """\
+#From me Fri Dec 31 00:00:00 +0000 1999 From: me Date: Fri, 31 Dec 1999
+#00:00:00 +0000 Subject: Message-ID: <>
+#
+#> test
+#""")
+
+        # with 'edits' mailout policy (so edit sends the mailout, not comment)
+        p.folder().mailout_policy = 'edits'
+        p.edit(text='')
+        oldtext = p.read()
+        p.comment(text=COMMENT,username=USER,time=TIME)
+        text = p.read()
+        text = re.sub(r'Message-ID: <[^>]+>',r'Message-ID: <>',text)
+        text = re.sub(r'In-reply-to: <[^>]+>',r'In-reply-to: <>',text)
+        self.assertEqual(text,SHOULDWRITE)
+        diff = PageDiffSupport().textDiff(a=oldtext,b=text,verbose=0)
+        self.assertEqual(diff,SHOULDDIFF)
+        #self.assertEqual(p.formatMailout(diff), SHOULDMAILOUT)
+
+    #def test_stxToHtml(self):
+    #    p = self.page
+    #    # handle a STX table or other error gracefully
+    #    self.assertEquals(p.stxToHtml('+-+-+\n| | |\n+-+-+'),
+    #                      '')
+
+    def XXXtestNoDoubleHtmlTag(self):
+        p = self.page
+        p.edit(type='stx')
+        text = p.render()     # slow! why ?
+        self.assertEquals(len(re.findall(r'(?i)<html',text)),1)
+        self.assertEquals(len(re.findall(r'(?i)<body',text)),1)
+
+    def test_split_and_merge(self):
+        p = self.page
+        TEXT = """\
+zero
+
+xxx
+
+FIRST
+=====
+one
+
+aaa
+
+SECOND
+======
+two
+
+bbb
+"""
+        # test split
+        p.edit(text=TEXT)
+        p.split()
+        self.assertEquals(p.text(),'zero\n\nxxx')
+        self.assert_(p.pageWithName('FIRST'))
+        self.assertEquals(p.pageWithName('FIRST').text(),'one\n\naaa')
+        self.assert_(p.pageWithName('SECOND'))
+        self.assertEquals(p.pageWithName('SECOND').text(),'two\n\nbbb')
+        # test merge
+        #p.merge()
+        #self.assertEquals(p.text(),TEXT)
+

Added: zope-zwiki/branches/upstream/current/Extensions/Install.py
===================================================================
--- zope-zwiki/branches/upstream/current/Extensions/Install.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Extensions/Install.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,153 @@
+##############################################################################
+#
+# Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE
+# 
+##############################################################################
+"""
+CMF ZWiki Installation script
+
+This file is a CMF installation script for ZWiki.  It's meant to be used
+as an External Method. Compatible with the CMF quick installer, or to use
+manually, add an external method to the root of the CMF or Plone Site that
+you want ZWiki registered in with the configuration:
+
+ id:            cmf_install_zwiki
+ title:         
+ module name:   ZWiki.Install
+ function name: install
+
+Then call this method in the context of the CMF/Plone site, by visiting
+http://SITEURL/cmf_install_zwiki . The install function will execute and
+give information about the steps it took.
+"""
+
+import string
+from cStringIO import StringIO
+from ZODB.PersistentMapping import PersistentMapping
+from Products.CMFCore.TypesTool import ContentFactoryMetadata
+from Products.CMFCore.DirectoryView import addDirectoryViews
+from Products.CMFCore.utils import getToolByName
+from Products.ZWiki.CMFInit import wiki_globals, factory_type_information
+from Products.ZWiki.ZWikiPage import ZWikiPage
+from Products.ZWiki.Defaults import PAGE_PORTALTYPE#,ALLOWED_PAGE_TYPES_IN_PLONE
+from Products.CMFCore import CMFCorePermissions
+
+def install(self):
+    """
+    Register "Wiki Page" with portal_types and friends.
+    """
+    out = StringIO()
+    typestool = getToolByName(self, 'portal_types')
+    skinstool = getToolByName(self, 'portal_skins')
+    workflowtool = getToolByName(self, 'portal_workflow')
+    propertiestool = getToolByName(self, 'portal_properties')
+    
+    # Borrowed from CMFDefault.Portal.PortalGenerator.setupTypes()
+    # We loop through anything defined in the factory type information
+    # and configure it in the types tool if it doesn't already exist
+    for t in factory_type_information:
+        if t['id'] not in typestool.objectIds():
+            cfm = apply(ContentFactoryMetadata, (), t)
+            typestool._setObject(t['id'], cfm)
+            out.write('Registered %s with the types tool\n' % t['id'])
+        else:
+            out.write('Object "%s" already existed in the types tool\n' % (
+                t['id']))
+
+    # set up site catalog
+    # Make sure that all the indexes and metadata that Zwiki expects from
+    # a catalog are present (see setupCatalog or
+    # http://zwiki.org/ZwikiAndZCatalog for a list). NB these will apply
+    # for all catalogable plone objects, not just zwiki pages, but will
+    # (hopefully!) be empty/harmless for the non-pages.
+    ZWikiPage().__of__(self).setupCatalog()
+    # this would give an even more complete catalog.. should be unnecessary
+    #ZWikiPage().__of__(self).setupTracker(pages=0)
+
+    # Set up the skins
+    if 'zwiki' not in skinstool.objectIds():
+        addDirectoryViews(skinstool, 'skins', wiki_globals)
+
+    # add the zwiki skin layer to each existing skin
+    # XXX should also remove old zwiki_plone, zwiki_standard layers
+    skins = skinstool.getSkinSelections()
+    for skin in skins:
+        path = skinstool.getSkinPath(skin)
+        path = map(string.strip, string.split(path,','))
+        for dir in ['zwiki']:
+            if not dir in path:
+                try:
+                    idx = path.index('custom')
+                except ValueError:
+                    idx = 999
+                path.insert(idx+1, dir)
+        path = string.join(path, ', ')
+        # addSkinSelection will replace existing skins as well.
+        skinstool.addSkinSelection(skin, path)
+        out.write("Added zwiki layer to %s skin\n" % skin)
+
+    # remove workflow from Wiki pages
+    cbt = workflowtool._chains_by_type
+    if cbt is None:
+        cbt = PersistentMapping()
+    cbt[PAGE_PORTALTYPE] = []
+    workflowtool._chains_by_type = cbt
+    out.write("Removed all workflow from Wiki Page\n")
+
+    # shouldn't need this any more
+    # install an allowed_page_types property, to limit the offered page
+    # types. Should maybe go in propertiestool.site_properties, zwiki
+    # doesn't yet know how to check there
+    ##folder = propertiestool.site_properties
+    #folder = self
+    #prop = 'allowed_page_types'
+    #if not prop in map(lambda x:x['id'], folder._properties):
+    #    folder.manage_addProperty(prop,
+    #                              '\n'.join(ALLOWED_PAGE_TYPES_IN_PLONE),
+    #                              'lines')
+    #    out.write("Added a restricted 'allowed_page_types' site property\n")
+    #else:
+    #    out.write("An 'allowed_page_types' site property already exists\n")
+
+
+    # if External Editor is installed, make sure Wiki Pages have the
+    # external edit action.
+    if hasattr(self.Control_Panel.Products, 'ExternalEditor'):
+        # XXX Uses addAction and portal_migration, which are plonisms.
+        # How should we do this for vanilla CMF ? Do nothing for now.
+        try:
+            migrationtool = getToolByName(self, 'portal_migration')
+            for ctype in typestool.objectValues():
+                if ctype.getId() == 'Wiki Page':
+                    # We must detect plone 1 or plone 2 here because addAction has a 
+                    # different number of arguments
+                    # XXX actually I'm pretty sure we don't/don't need to support plone 1
+                    # any more, check
+                    if(migrationtool.getInstanceVersion().strip().startswith('1')):
+                        ctype.addAction( 'external_edit'
+                                       , name='External Edit'
+                                       , action='external_edit'
+                                       , permission=CMFCorePermissions.ModifyPortalContent
+                                       , category='object'
+                                       , visible=0 )
+                    else:
+                        ctype.addAction( 'external_edit'
+                                       , name='External Edit'
+                                       , action='string:$object_url/external_edit'
+                                       , condition=''
+                                       , permission=CMFCorePermissions.ModifyPortalContent
+                                       , category='object'
+                                       , visible=0 )
+            out.write("External Editor is installed, added the action to Wiki Page")
+        except AttributeError:
+            out.write("External Editor is installed, please add the external_edit action to Wiki Page in portal_types")
+
+    return out.getvalue()
+

Added: zope-zwiki/branches/upstream/current/Extensions/README
===================================================================
--- zope-zwiki/branches/upstream/current/Extensions/README	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Extensions/README	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,6 @@
+External Methods, to be installed in the ZODB.
+
+Install.py - standard CMF/Plone install script
+fixprops.py - utility for modifying an attribute of all wiki pages
+mailin.py - Zwiki's incoming mail handler
+mailin_test.py - *not* an external method, just unit tests

Added: zope-zwiki/branches/upstream/current/Extensions/__init__.py
===================================================================
--- zope-zwiki/branches/upstream/current/Extensions/__init__.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Extensions/__init__.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1 @@
+# This file is there to make the module importable

Added: zope-zwiki/branches/upstream/current/Extensions/fixprops.py
===================================================================
--- zope-zwiki/branches/upstream/current/Extensions/fixprops.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Extensions/fixprops.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,27 @@
+import string
+
+def fixprops(self,properties,old,new):
+    """
+    Do a text replace in certain properties of zwiki pages in this folder.
+    
+    For all zwiki pages in this folder, replace all occurrences of old
+    with new in the specified property or properties (must be string
+    properties). You could call this from your browser, eg like so:
+
+    http://.../wikifolder/fixprops?properties:list=creation_time&properties:list=last_edit_time&old=Central Standard Time&new=CST
+
+    Don't leave this method accessible to untrusted users.
+    """
+    if not old:
+        return
+    if type(properties) == type(''):
+        properties = (properties,)
+    # poor caching (ok)
+    for page in self.pageObjects():
+        for prop in properties:
+            s = getattr(page,prop,'')
+            if string.find(s,old) != -1:
+                setattr(page,prop,string.replace(s,old,new))
+                self.REQUEST.RESPONSE.write(
+                    "changed %s.%s from %s to %s\n" % \
+                    (page.id(),prop,s,getattr(page,prop)))

Added: zope-zwiki/branches/upstream/current/Extensions/mailin.py
===================================================================
--- zope-zwiki/branches/upstream/current/Extensions/mailin.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Extensions/mailin.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,557 @@
+"""
+Zwiki's mailin external method - posts an incoming email message to a wiki
+
+This external method receives a message in RFC2822 format and takes
+appropriate action in the wiki where it has been called (eg, adding a
+comment to one of the pages). This is usually invoked by a mail alias like::
+
+ thewiki: |curl -n -F 'msg=<-' http://mysite/mywikifolder/mailin
+
+See http://zwiki.org/HowToSetUpMailin for more help. For the delivery
+algorithm, see the MailIn class docs below.
+
+TODO:
+friendly non-subscriber bounce messages
+keep refactoring
+size limit
+html mail ?
+file attachments ?
+
+"""
+
+from types import *
+import string, re
+import email
+from email.Message import Message
+from email.Utils import parseaddr, getaddresses
+from email.Iterators import typed_subpart_iterator
+
+from Products.ZWiki.Regexps import wikiname1,wikiname2,bracketedexpr,urlchars
+from Products.ZWiki.Utils import BLATHER
+from Products.ZWiki.plugins.tracker.tracker import ISSUE_SEVERITIES
+DEFAULT_SEVERITY = ISSUE_SEVERITIES[len(ISSUE_SEVERITIES)/2]
+
+
+# use email aliases like these to influence delivery
+WIKIADDREXP =    r'(wiki|mailin)@'         # comments and new pages
+TRACKERADDREXP = r'(tracker|bugs|issues)@' # new tracker issues
+SPAMADDREXP =    r'(spam)@'                # spam reports
+MAILINADDREXP = r'(%s|%s|%s)' % (
+    WIKIADDREXP,
+    TRACKERADDREXP,
+    SPAMADDREXP,
+    )
+PAGEINSUBJECTEXP = bracketedexpr
+# extract a page name from the recipient real name
+# because different things show up here - 'name', mail address, etc. -
+# we recognize only page names beginning and ending with a word character
+# and not containing @
+#PAGEINREALNAMEEXP = r'(?=^[^@]*$).*?(?P<page>\w.*\w)' 
+MAX_SIGNATURE_STRIP_SIZE = 500
+
+
+class MailIn:
+    """
+    I represent an incoming mail message being posted to a wiki.
+
+    I parse the incoming rfc2822 message string and expose the parts of
+    interest, and (given a wiki context) figure out how to deliver myself.
+    Here are the delivery rules:
+    
+    - if the message appears to be a zwiki mailout or from an auto-responder
+      or junk, or it does't have a plain text part, DISCARD.
+    
+    - if we have been called in a page context (../SOMEPAGE/mailin), POST
+      message as a comment on that page.
+    
+    - (DISABLED: select virtual host:
+      Intended to allow a single mailin alias to serve many vhosts.  If there
+      is a recipient of the form .*MAILINADDREXP at vhost where vhost matches a
+      virtual host monster entry on this server, use that vhost's folder.
+      )
+    
+    - if there is not at least one zwiki page in the current folder, DISCARD.
+    
+    - check sender's subscription status:
+      unless the folder's mailin_policy property, possibly acquired, is
+      'open', check that the sender is either subscribed somewhere in the wiki
+      or listed in the mail_accept_nonmembers property, and if not BOUNCE the
+      message.
+    
+    - if the recipient looks like a spam reporting address (.*SPAMADDREXP),
+      UPDATE SPAM BLOCKING RULES and DISCARD (see updateSpamBlocks).
+    
+    - if the recipient looks like a tracker mailin address (.*TRACKERADDREXP),
+      CREATE AN ISSUE page.  Otherwise,
+    
+    - identify destination page name: the first [bracketed page name] in the
+      message subject, which may be a fuzzy/partial name; or the folder's
+      default_mailin_page property, possibly acquired; or the first zwiki page
+      in the folder - unless default_mailin_page was blank.
+    
+    - if no destination page could be found (default_mailin_page is
+      blank/false), DISCARD.
+    
+    - if no wiki page by that name exists (fuzzy match allowed), CREATE it
+    
+    - POST message as a comment to that page
+    
+    """
+
+    msg = None
+    folder = None
+    recipient = None
+    destpage = None
+    destpagename = None
+    workingpage = None
+    trackerissue = 0
+    newpage = 0
+    error = None
+
+    def __init__(self,
+                 context,
+                 message,
+                 ):
+        """
+        Extract the bits of interest from an RFC2822 message string.
+
+        This perhaps should do the isJunk test up front to avoid
+        unnecessary resource usage.
+        """
+        BLATHER('mailin.py processing incoming message:\n%s' % message)
+        #BLATHER('mailin.py processing incoming message')
+        self.context = context
+        self.original = message
+        self.msg = email.message_from_string(self.original)
+        self.date = self.msg['Date']
+        self.subject = re.sub(r'\n',r'',self.msg.get('Subject',''))
+        self.realSubject = re.sub(r'.*?\[.*?\] ?(.*)',r'\1',self.subject)
+        self.messageid = self.msg.get('Message-id','')
+        self.inreplyto = self.msg.get('In-reply-to','')
+        self.From = self.msg.get('From')
+        self.FromRealName = parseaddr(self.From)[0]
+        self.FromEmail    = parseaddr(self.From)[1]
+        self.FromUserName = (self.FromRealName or
+                             re.sub(r'@.*$',r'',self.FromEmail))
+        self.sender = self.msg.get('Sender')
+        self.senderEmail = (self.sender and
+                            parseaddr(self.sender)[1]) or None
+        tos = self.msg.get_all('to', [])
+        ccs = self.msg.get_all('cc', [])
+        resent_tos = self.msg.get_all('resent-to', [])
+        resent_ccs = self.msg.get_all('resent-cc', [])
+        self.recipients = getaddresses(tos + ccs + resent_tos + resent_ccs)
+
+        # mailing list support
+        # XXX x-beenthere is mailman-specific - need to support ezmlm & others here
+        #self.xbeenthere = (self.msg.get('X-BeenThere') or
+        #                   re.search(r'[^\s<]+@[^\s>]+',self.msg.get('Delivered-To')).group())
+        # ..Type Error - configured ezmlm to provide beenthere instead (?)
+        self.xbeenthere = self.msg.get('X-BeenThere')
+
+        # raises an exception if there's no text part
+        try:
+            plaintextpart = typed_subpart_iterator(self.msg,
+                                                   'text',
+                                                   'plain').next().get_payload(decode=1)
+        except StopIteration:
+            plaintextpart = ''
+        self.body = self.cleanupBody(plaintextpart)
+        
+    def isJunk(self):
+        """
+        Return true if this mail message should be silently ignored.
+
+        Ideally, this should block mail loops, auto-responders and spam,
+        but allow mailing list messages and mailouts from other zwikis.
+        Currently it flags everything that looks like it came from a bot.
+        Actually I don't think works as a way to filter autoresponders.
+        We should make sure to include mailing headers in our mailouts
+        and then most autoresponders should ignore us.
+
+        qmail-autoresponder's bot-filtering procedure is reportedly good - see
+        http://untroubled.org/qmail-autoresponder/procedure.txt .
+        TMDA and spamassassin are two good spam filters - see
+        http://software.libertine.org/tmda ,
+        http://spamassassin.taint.org .
+        """
+        msgtext = self.original
+        # a zwiki mailout
+        if re.search(r'(?mi)^X-Zwiki-Version:',msgtext):
+            return 1
+        # the most common auto-response subject
+        if re.search(r'(?mi)^Subject:.*out of office',msgtext):
+            return 1
+        # XXX don't need this ?
+        # mailing list or low precedence mail
+        # should allow these, but need to pass through the list loop
+        # headers to avoid mail loop between mutually-subscribed zwiki and
+        # mail list
+        #if re.search(r'(?mi)^(List-ID|(X-)?Mailing-List|X-ML-Name):',msgtext):
+        #    return 1
+        #if re.search(
+        #    r'(?mi)^List-(Help|Unsubscribe|Subscribe|Post|Owner|Archive):',msgtext):
+        #    return 1
+        #if re.search(r'(?mi)^Precedence:\s*(junk|bulk|list)\s*$',msgtext):
+        #    return 1
+        # no plaintext part
+        if not self.body:
+            return 1
+        return 0
+
+    def isSpamReport(self):
+        """
+        Return true if this message appears to be a spam report.
+        """
+        return re.search(SPAMADDREXP,self.recipientAddress()) and 1
+
+    def updateSpamBlocks(self):
+        """
+        Update the wiki's spam-blocking rules based on this message.
+
+        1. add any urls in the message body and/or attached message body to the
+           folder's banned_links property, if it exists (can acquire)
+        2. add the first ip address found in the message body, if any, to the
+           folder's banned_ips property, if it exists (can acquire). 
+
+        This means that any subscriber can forward a spam mailout to the
+        wiki's spam address, and/or submit spammer urls or one spammer's
+        IP address manually, and the banned_links/banned_ips properties
+        will be updated. It's probably best to create these on the root
+        folder; they will not be created automatically.
+
+        XXX how to prevent frivolous reports ?
+
+        XXX add support for banned_ips, see http://zwiki.org/BlockList.
+        Better to use apache ? should we append to some filesystem config
+        file instead ? make this a separate external method ?
+        call add_spammer_url() and add_spammer_ip() for each ?
+        
+        """
+        # update the banned links property
+        if hasattr(self.folder(),'banned_links'):
+            banned_links = list(self.folder().banned_links)
+            spam_links = re.findall(
+                r'((?:http|https|ftp|mailto|file):/*%s)' % urlchars,
+                self.subject + ' ' + self.body)
+            added_links = []
+            for l in spam_links:
+                if l not in banned_links:
+                    banned_links.append(l)
+                    added_links.append(l)
+            # have we got new urls to add ?
+            if added_links:
+                # update property - need to find the real  owner
+                folder = self.folder()
+                while not hasattr(folder.aq_base,'banned_links'):
+                    folder = folder.aq_parent
+                folder.manage_changeProperties(banned_links=banned_links)
+                # log, also try to notify admin by mail, for now
+                log = 'mailin.py: added %s to %s/banned_links' % \
+                      (added_links,string.join(folder.getPhysicalPath(),'/'))
+                BLATHER(log)
+                admin = getattr(self.folder(),'mail_admin',None)
+                page = self.workingPage()
+                if admin and page:
+                    page.sendMailTo(
+                        [],
+                        log,
+                        None,
+                        subject='(banned_links updated)',
+                        to=admin)
+
+    def cleanupBody(self,body):
+        """
+        Clean up/remove uninteresting parts of an incoming message body.
+        """
+        # strip trailing newlines that seem to get added in transit
+        body = re.sub(r'(?s)\n+$',r'\n',body)
+        # strip Bob's signature
+        body = self.stripSignature(body)
+        # strip TBC (typical bloody citations)
+        #body = re.sub(
+        #    r'(?si)----- ?message d\'origine.*',r'',body)
+        #body = re.sub(
+        #    r'(?si)----- ?original message.*',r'',body)
+        return body
+
+    def stripSignature(self,body):
+        """
+        Strip a signature after -- .
+
+        Can't really do this safely; we'll strip only if it's below a
+        certain size.
+        """
+        signature = re.search(r'(?s)\n--\n.*?$',body)
+        signature = signature and signature.group()
+        if signature and len(signature) <= MAX_SIGNATURE_STRIP_SIZE:
+            body = re.sub(re.escape(signature),'',body)
+        return body
+    
+    def contextIsPage(self):
+        return self.context.meta_type=='ZWiki Page'
+    
+    def contextIsFolder(self):
+        return not self.contextIsPage()
+    
+    def folder(self):
+        """
+        The wiki folder to which we are delivering.
+        """
+        if self.contextIsPage(): return self.context.aq_parent
+        else: return self.context
+
+    def recipient(self):
+        """
+        The recipient that was used to deliver here (an email tuple).
+
+        This may be needed to determine the mailin action.  If the message
+        has multiple recipients, decide which one refers to us as follows:
+        - the first recipient matching the folder's mail_from property,
+        - or the first one looking like a typical zwiki mailin alias (.*MAILINADDREXP),
+        - or the first one.
+        """
+        if len(self.recipients) == 1:
+            return self.recipients[0]
+        folder_mail_from = getattr(self.folder(),'mail_from',None)
+        if folder_mail_from:
+            for r in self.recipients:
+                if r[1] == folder_mail_from:
+                    return r
+        for r in self.recipients:
+            if re.search(MAILINADDREXP,r[1]):
+                return r
+        return self.recipients[0]
+
+    def recipientAddress(self):
+        """
+        Just the email address part of the recipient used to deliver here.
+        """
+        return self.recipient()[1]
+
+    def workingPage(self):
+        """
+        Try to get a wiki page object which we can use for further operations.
+
+        We'll try to ensure that new pages are parented somewhere sensible:
+        the default mailin page if specified, or FrontPage, or the
+        first page in the hierarchy.
+        """
+        allpages = self.folder().objectValues(spec='ZWiki Page')
+        if allpages:
+            alphafirst = allpages[0]
+            outlinefirst = alphafirst.pageWithName(
+                alphafirst.wikiOutline().first())
+            frontpage = alphafirst.pageWithName('FrontPage')
+            defaultmailinpage = alphafirst.pageWithName(
+                getattr(self.folder(),'default_mailin_page',None))
+            return defaultmailinpage or frontpage or outlinefirst or alphafirst
+        else:
+            return None
+        
+    def defaultMailinPage(self):
+        """
+        The name of the wiki's default destination page for mailins, or None.
+        """
+        return getattr(self.folder(),'default_mailin_page',
+                       ((self.workingPage() and self.workingPage().pageName())
+                        or None))
+        
+    def decideMailinAction(self):
+        """
+        Figure out what we should do with this mail-in.
+
+        Fairly involved calculations trying to figure out what to do in a
+        robust way (see the module docstring for more).  Sets
+        self.destpage, self.destpagename, self.newpage, self.trackerissue,
+        or sets a message in self.error if it can't.
+        """
+        if self.isJunk():
+            self.error = '\nDiscarding junk mailin.\n\n\n'
+            return
+
+        if self.isSpamReport():
+            BLATHER('mailin.py: processing spam report')
+            self.updateSpamBlocks()
+            self.error = '\nProcessed spam report.\n\n\n'
+            return
+
+        if self.contextIsPage():
+            self.destpage = self.workingpage = self.context
+            self.destpagename = self.destpage.pageName()
+            self.newpage = self.trackerissue = 0
+            self.checkMailinAllowed()
+            return
+
+        # posting in wiki folder context (the normal case)
+        # find a page to work from
+        self.workingpage = self.workingPage()
+        if not self.workingpage:
+            BLATHER('mailin.py: could not find a working page, discarding message')
+            self.error = '\nCould not find a wiki page to work from, discarding message.\n\n\n'
+            return
+
+        self.checkMailinAllowed()
+        if self.error: return
+
+        # are we creating a tracker issue, which doesn't need a name ?
+        # XXX todo: mail to tracker address is not always a new issue
+        if re.search(TRACKERADDREXP,self.recipientAddress()):
+            self.trackerissue = 1
+            return
+
+        # find the destination page name
+        ## in the recipient's real name part if enabled..
+        ##if self.checkrecipient:
+        ##    m = re.search(PAGEINREALNAMEEXP,self.recipientRealName())
+        ##    if m:
+        ##        self.destpagename = m.group('page')
+        # in the subject
+        if (not self.destpagename):
+            matches = re.findall(PAGEINSUBJECTEXP,self.subject)
+            if matches:
+                self.destpagename = matches[-1] # use rightmost
+                # strip enclosing []'s
+                self.destpagename = re.sub(bracketedexpr, r'\1',
+                                           self.destpagename)
+        # or use the default mailin page if any..
+        if (not self.destpagename):
+            self.destpagename = self.defaultMailinPage()
+
+        # now, either we have the name of an existing page (fuzzy match
+        # allowed)..
+        page = (self.destpagename and
+                self.workingpage.pageWithFuzzyName(self.destpagename,
+                                                   allow_partial=1))
+        if page:
+            # also adjust working page to get right parentage etc.
+            self.destpage = self.workingpage = page
+            self.destpagename = self.destpage.pageName()
+        # or we have the name of a new page to create..
+        elif self.destpagename:
+            self.newpage = 1
+        # or we discard this message
+        else:
+            self.error = '\nMessage had no destination page, ignored.\n\n\n'
+            BLATHER('mailin.py: message had no destination page, ignored')
+
+    def checkMailinAllowed(self):
+        """
+        Check if the mailin determined by decideMailinAction() is permitted.
+
+        Is the sender allowed to mail in here ?
+        - if open posting is allowed, we'll accept anybody.
+        - otherwise they must be a subscriber somewhere in the wiki
+        - or be listed in the mail_accept_nonmembers property
+          (useful to allow mailing lists, etc)
+        Otherwise, set self.error.
+        Requires self.workingpage to be already set up.
+        """
+        postingpolicy = getattr(self.folder(),'mailin_policy',None)
+        accept = getattr(self.folder(),'mail_accept_nonmembers',[])
+        if (postingpolicy == 'open' or
+            self.FromEmail in accept or
+            self.senderEmail in accept or
+            # XXX poor caching
+            self.workingpage.allSubscriptionsFor(self.FromEmail) or
+            self.workingpage.allSubscriptionsFor(self.senderEmail)):
+            return
+        else:
+            self.error = '\nSorry, you must be a subscriber to send mail to this wiki.\n\n\n'
+            BLATHER('mailin.py: bounced mail from non-subscriber',
+                    self.FromEmail)
+
+#    def destinationVHost(self, msg):
+#        """
+#        Do tricky vhost-folder-finding.
+#        
+#        If we have one of the special recipients listed above along with a
+#        matching virtual host, return the virtual host's folder; otherwise None.
+#        Also save the username part of the matched recipient for later.
+#        """
+#        folder = None
+#        vurt = getattr(self,'vurt',None)
+#        if vurt and msg.wikiRecipients:
+#            for address, realname in msg.wikiRecipients:
+#                alias, host = address
+#                # based on SiteAccess
+#                # extract this -->
+#                dict = getattr(vurt, 'domain_path', None)
+#                if dict:
+#                    real_host=None
+#                    l_host = string.lower(host)
+#                    if vurt.domain_path.has_key(l_host):
+#                        real_host=l_host
+#                    else:
+#                        for hostname in vurt.domain_path.keys():
+#                            if hostname[:2] == '*.':
+#                                if string.find(l_host, hostname[2:]) != -1:
+#                                    real_host = hostname
+#                    # <--
+#                    if real_host:
+#                        path = vurt.domain_path[real_host]
+#                        folder = self.getPhysicalRoot().unrestrictedTraverse(path)
+#                        msg.aliasUsed = alias
+#                        break
+#        return folder
+
+
+def mailin(self, msg):
+    """
+    See module docstring.
+    """
+    # parse and figure out how to deliver the message
+    m = MailIn(self, msg)
+    m.decideMailinAction()
+    if m.error: return m.error
+
+    # stash the sender's username in REQUEST as a hint for usernameFrom
+    self.REQUEST.set('MAILIN_USERNAME', m.FromUserName)
+
+    # now, create new page ?
+    subject = m.realSubject
+    subjectPrefix = ''
+    if m.newpage:
+        # XXX need to pass REQUEST for authentication ?  but "REQUEST has
+        # no URL2" and create fails. Leave out for now.
+        m.workingpage.create(m.destpagename,text='',sendmail=0)
+        m.destpage = m.workingpage.pageWithName(m.destpagename)
+        subjectPrefix = '(new) '
+
+    # or new tracker issue ?
+    elif m.trackerissue:
+        # cf IssueNo0879
+        # citations are normally formatted only within comments, but they
+        # are often found in mailed-in issues and we'd like to display
+        # these nicely. Options ?
+        # - format them here as a special case. This means the mailout
+        #   and page source contains ugly html.
+        # - enable citation rendering everywhere. This deviates from
+        #   standard STX etc.
+        # - leave them unformatted
+        # - post the issue details as a comment, not as the initial page
+        #   text. Hey, that makes sense.        
+        pagename = m.workingpage.createNextIssue(subject,
+                                                 severity=DEFAULT_SEVERITY,
+                                                 REQUEST=self.REQUEST,
+                                                 sendmail=0)
+        m.destpage = m.workingpage.pageWithName(pagename)
+        subjectPrefix = '(new) '
+
+    # add comment
+    # use the time of sending, or the time of posting to the wiki - see
+    # how the latter works out
+    # mailing list support: when a list and wiki are mutually subscribed,
+    # and a mail comes in from the list, we want to forward it out to all
+    # subscribers except the list, which has done it's own delivery.
+    # Some lists will detect the duplicate automatically, for others we
+    # expect the X-BeenThere header and tell zwiki to exclude that address.
+    m.destpage.comment(text=m.body,
+                       username=m.FromUserName,
+                       REQUEST=self.REQUEST,
+                       subject_heading=subjectPrefix+subject,
+                       exclude_address=m.xbeenthere,
+                       message_id=m.messageid,
+                       in_reply_to=m.inreplyto
+                       )
+    return None

Added: zope-zwiki/branches/upstream/current/Extensions/mailin_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/Extensions/mailin_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Extensions/mailin_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,336 @@
+from Products.ZWiki.testsupport import *
+from Products.ZWiki.Extensions import mailin
+
+THISPAGE    = 'TestPage'
+TESTSENDER  = 'sender'
+TESTTO      = 'recipient'
+TESTDATE    = 'date'
+TESTSUBJECT = 'subject'
+TESTBODY    = 'mailin comment\n'
+LONGSUBJECT = """\
+a long long long long long long long long long long long long long subject"""
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    return suite
+
+class TestMessage:
+    def __init__(self,sender=TESTSENDER,to=TESTTO,cc='',bcc='',
+                 date=TESTDATE,subject=TESTSUBJECT,body=TESTBODY):
+        self.sender,self.to,self.cc,self.bcc,self.date,self.subject,self.body=\
+          (sender,to,cc,bcc,date,subject,body)
+
+    def __call__(self):
+        s = """\
+From: %s
+To: %s
+""" % (self.sender, self.to)
+        if self.cc:
+            s = s + "Cc: %s\n" + self.cc
+        if self.bcc:
+            s = s + "Bcc: %s\n" + self.bcc
+        s = s + """\
+Date: %s
+Subject: %s
+
+%s
+""" % (self.date, self.subject, self.body)
+        return s
+
+    __str__ = __call__
+
+TESTMSG = str(TestMessage())
+
+
+class Tests(unittest.TestCase):
+
+    def setUp(self):
+        self.p = mockPage(__name__=THISPAGE)
+        self.p.folder().mailin_policy='open'
+        
+    def tearDown(self):
+        del self.p
+
+    # test the mailin delivery rules
+
+    # from mailin.py:    
+    #"decide which of the recipients is us, as follows:
+    #
+    #   1. if there's only one, it's that one
+    #   2. the first one whose address matches the folder's mail_from property
+    #   3. the first one whose address matches MAILINADDREXP
+    #   4. the first one
+    def testRecipientIdentification(self):
+        m = mailin.MailIn(self.p.folder(),str(TestMessage(
+            to='a'
+            )))
+        self.assertEqual(m.recipient(),('','a'))
+
+        m = mailin.MailIn(self.p.folder(),str(TestMessage(
+            to='a, b'
+            )))
+        self.assertEqual(m.recipient(),('','a'))
+
+        self.p.folder().mail_from = 'b'
+        m = mailin.MailIn(self.p.folder(),str(TestMessage(
+            to='a, b, wiki at c.c'
+            )))
+        self.assertEqual(m.recipient(),('','b'))
+        del self.p.folder().mail_from
+
+        m = mailin.MailIn(self.p.folder(),str(TestMessage(
+            to='a at a.a, mailin at b.b'
+            )))
+        self.assertEqual(m.recipient(),('','mailin at b.b'))
+
+        m = mailin.MailIn(self.p.folder(),str(TestMessage(
+            to='a at a.a, tracker at b.b'
+            )))
+        self.assertEqual(m.recipient(),('','tracker at b.b'))
+
+        m = mailin.MailIn(self.p.folder(),str(TestMessage(
+            to='a at a.a, bugs at b.b'
+            )))
+        self.assertEqual(m.recipient(),('','bugs at b.b'))
+
+        m = mailin.MailIn(self.p.folder(),str(TestMessage(
+            to='a at a.a, issues at b.b'
+            )))
+        self.assertEqual(m.recipient(),('','issues at b.b'))
+
+    #def testDestinationFromFirstExistingPage(self):
+    #    testmsg = str(TestMessage())
+    #    self.p.create('APage')
+    #    self.p.folder().default_page = 'NonExistentPage'
+    #    m = mailin.MailIn(self.p.folder(),testmsg)
+    #    m.decideMailinAction()
+    #    self.assertEqual(m.destpagename,THISPAGE)
+    
+    #def testDestinationFromRealNameWithRecognizedEmail(self):
+    #    testmsg = str(TestMessage(to='wiki at b.c (SomePage)'))
+    #    m = mailin.MailIn(self.p.folder(),testmsg,checkrecipient=1)
+    #    m.decideMailinAction()
+    #    self.assertEqual(m.destpagename,'SomePage')
+    
+    #def testDestinationFromRealNameWithAnyEmail(self):
+    #    testmsg = str(TestMessage(to='a at b.c (SomePage)'))
+    #    m = mailin.MailIn(self.p.folder(),testmsg,checkrecipient=1)
+    #    m.decideMailinAction()
+    #    self.assertEqual(m.destpagename,'SomePage')
+    
+    #def testDestinationFromRealNameWithSubject(self):
+    #    testmsg = str(TestMessage(
+    #        to='a at b.c (SomePage)',
+    #        subject='[AnotherPage]',
+    #        ))
+    #    m = mailin.MailIn(self.p.folder(),testmsg,checkrecipient=1)
+    #    m.decideMailinAction()
+    #    self.assertEqual(m.destpagename,'SomePage')
+    
+    def testDestinationWithNoNamedPage(self):
+        m = mailin.MailIn(self.p.folder(), str(TestMessage(subject='test')))
+        m.decideMailinAction()
+        self.assertEqual(m.destpagename,'TestPage') 
+
+    def testDestinationWithNoNamedPageAndDefaultMailinPageProperty(self):
+        # should create a different page here but I have things to do!
+        self.p.folder().default_mailin_page='TestPage'
+        m = mailin.MailIn(self.p.folder(), str(TestMessage(subject='test')))
+        m.decideMailinAction()
+        self.assertEqual(m.destpagename,'TestPage') 
+
+    def testDestinationWithNoNamedPageAndBlankDefaultMailinPageProperty(self):
+        self.p.folder().default_mailin_page=''
+        m = mailin.MailIn(self.p.folder(), str(TestMessage(subject='test')))
+        m.decideMailinAction()
+        self.assertEqual(m.destpagename,'') 
+
+    #def testDestinationFromWikiNameInSubject(self):
+    #    m = mailin.MailIn(self.p.folder(),
+    #        str(TestMessage(subject='SomePage')))
+    #    m.decideMailinAction()
+    #    self.assertEqual(m.destpagename,None) 
+
+    def testDestinationFromBracketedNameInSubject(self):
+        m = mailin.MailIn(self.p.folder(),
+            str(TestMessage(subject='[Some Page]')))
+        m.decideMailinAction()
+        self.assertEqual(m.destpagename,'Some Page')
+
+    def testDestinationFromMultipleBracketedNamesInSubject(self):
+        m = mailin.MailIn(
+            self.p.folder(),
+            str(TestMessage(subject='[Fwd:][LIST][Some Page]')))
+        m.decideMailinAction()
+        self.assertEqual(m.destpagename,'Some Page')
+    
+    def testDestinationFromLongSubject(self):
+        m = mailin.MailIn(
+            self.p.folder(),
+            str(TestMessage(subject='['+' ....'*20+'Test Page'+' ....'*20+']')))
+        m.decideMailinAction()
+        self.assertEqual(m.destpage.pageName(),'TestPage')
+    
+    def testDestinationFromLongSubjectWithLineBreak(self):
+        m = mailin.MailIn(
+            self.p.folder(),
+            str(TestMessage(subject='''\
+Re: [IssueNo0547 mail (with long subject ?) may go to wrong page
+ (test with long long long long long long subject)] property change''')))
+        m.decideMailinAction()
+        self.assertEqual(
+            m.destpagename,
+            'IssueNo0547 mail (with long subject ?) may go to wrong page (test with long long long long long long subject)')
+    
+    #def testDestinationWithBlankRealName(self):
+    #    m = mailin.MailIn(self.p.folder(),str(TestMessage(
+    #        to='wiki at b.c (   )',
+    #        subject='SomePage',
+    #        )),checkrecipient=1)
+    #    m.decideMailinAction()
+    #    self.assertEqual(m.destpagename,None)
+
+    #def testDestinationWithNoWordsInRealName(self):
+    #    m = mailin.MailIn(self.p.folder(),str(TestMessage(
+    #        to='wiki at b.c (...)',
+    #        subject='SomePage',
+    #        )),checkrecipient=1)
+    #    m.decideMailinAction()
+    #    self.assertEqual(m.destpagename,None)
+
+    #def testDestinationRealNameStripping(self):
+    #    m = mailin.MailIn(self.p.folder(),str(TestMessage(
+    #        to='wiki at b.c (  SomePage\t)',
+    #        )),checkrecipient=1)
+    #    m.decideMailinAction()
+    #    self.assertEqual(m.destpagename,'SomePage')
+
+    #def testDestinationWithQuotesInRealName(self):
+    #    m = mailin.MailIn(self.p.folder(),str(TestMessage(
+    #        to="wiki at b.c ('SomePage')",
+    #        )),checkrecipient=1)
+    #    m.decideMailinAction()
+    #    self.assertEqual(m.destpagename,'SomePage')
+    #    m = mailin.MailIn(self.p.folder(),str(TestMessage(
+    #        to='wiki at b.c ("SomePage")',
+    #        )),checkrecipient=1)
+    #    m.decideMailinAction()
+    #    self.assertEqual(m.destpagename,'SomePage')
+
+    #def testDestinationWithEmailInRealName(self):
+    #    m = mailin.MailIn(self.p.folder(),str(TestMessage(
+    #        to="wiki at b.c (wiki at b.c)",
+    #        )),checkrecipient=1)
+    #    m.decideMailinAction()
+    #    self.assertEqual(m.destpagename,None)
+
+    def testDestinationFromPageContext(self):
+        m = mailin.MailIn(self.p,str(TestMessage(
+            to='a at b.c (SomePage)',
+            subject='[SomePage] SomePage',
+            )))
+        m.decideMailinAction()
+        self.assertEqual(m.destpagename,THISPAGE)
+
+    def testDestinationFromTrackerAddress(self):
+        m = mailin.MailIn(self.p.folder(),str(TestMessage(
+            to='bugs at b.c',
+            )))
+        m.decideMailinAction()
+        self.assertEqual(m.trackerissue,1)
+
+    def testSubscriberMailin(self):
+        delattr(self.p.folder(),'mailin_policy')
+        old = self.p.text()
+        self.p.subscribe(TESTSENDER)
+        mailin.mailin(self.p,TESTMSG)
+        self.assertEqual(1, len(re.findall(TESTBODY,self.p.text())))
+        
+    def testNonSubscriberMailinFails(self):
+        delattr(self.p.folder(),'mailin_policy')
+        old = self.p.text()
+        mailin.mailin(self.p,TESTMSG)
+        self.assertEqual(old, self.p.read())
+        
+    def testNonSubscriberMailinWithOpenPosting(self):
+        old = self.p.text()
+        mailin.mailin(self.p,TESTMSG)
+        self.assertEqual(1, len(re.findall(TESTBODY,self.p.text())))
+        
+    def testMailinMultipart(self):
+        p = self.p
+        self.p.subscribe(TESTSENDER)
+        from email.MIMEText import MIMEText
+        from email.MIMEMultipart import MIMEMultipart
+        msg = MIMEMultipart()
+        msg['From'] = TESTSENDER
+        msg['To'] = TESTTO
+        msg.attach(MIMEText('*bold*'))
+        msg.attach(MIMEText('<b>bold</b>','html'))
+        mailin.mailin(p, msg.as_string())
+        self.assertEqual(1, p.commentCount())
+        self.assertEqual(1, len(re.findall(r'\*bold\*', p.text())))
+
+    def testMailinTrackerIssue(self):
+        self.p.upgradeFolderIssueProperties()
+        self.assertEqual(0, self.p.issueCount())
+        mailin.mailin(self.p.folder(),
+                      str(TestMessage(to='bugs at somewhere')))
+        self.assertEqual(1, self.p.issueCount())
+
+    # this works.. need a functional test which sends through mail
+    def testMailinTrackerIssueLongSubject(self):
+        longsubjmsg = str(TestMessage(to='bugs at somewhere',subject=LONGSUBJECT))
+        self.p.upgradeFolderIssueProperties()
+        self.assertEqual(0, self.p.issueCount())
+        mailin.mailin(self.p.folder(),longsubjmsg)
+        self.assertEqual(1, self.p.issueCount())
+
+    def testStripSignature(self):
+        # signatures after -- should be stripped
+        self.assertEqual(
+            mailin.MailIn(self.p.folder(),str(TestMessage())).stripSignature(
+            '''
+blah blah
+
+--
+my signature
+blah blah blah
+'''),
+            '''
+blah blah
+
+''')
+        # unless they are too large
+        from mailin import MAX_SIGNATURE_STRIP_SIZE
+        self.assertEqual(
+            mailin.MailIn(self.p.folder(),str(TestMessage())).stripSignature(
+            '''
+blah blah
+
+--
+''' + 'x'*(MAX_SIGNATURE_STRIP_SIZE+1)),
+            '''
+blah blah
+
+--
+''' + 'x'*(MAX_SIGNATURE_STRIP_SIZE+1))
+        # leave other things alone
+        self.assertEqual(
+            mailin.MailIn(self.p.folder(),str(TestMessage())).stripSignature(
+            '''blah
+---
+blah'''),
+            '''blah
+---
+blah''')
+        self.assertEqual(
+            mailin.MailIn(self.p.folder(),str(TestMessage())).stripSignature(
+            '''blah
+ --
+blah'''),
+            '''blah
+ --
+blah''')
+

Added: zope-zwiki/branches/upstream/current/FILESYSTEM_VS_WIKI_DOCS
===================================================================
--- zope-zwiki/branches/upstream/current/FILESYSTEM_VS_WIKI_DOCS	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/FILESYSTEM_VS_WIKI_DOCS	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,68 @@
+Clarify the role of filesystem and wiki docs
+
+
+Filesystem
+----------
+faster for one developer wielding a text editor
+or several devs who are good with darcs
+revision controlled - secure, trackable
+can work offline
+can get out of sync, uncommited changes here and there
+can be auto-generated - epydoc, test output, author stats etc.
+can be published (but not edited directly) online
+less visible and less pretty for readers
+better than wiki for large single documents
+
+current uses:
+
+CHANGES - release notes, also published at zwiki.org/ReleaseNotes
+CONTRIBUTORS - official contributor list
+GPL, LICENSE - license and copyright status
+REPOPOLICY - copyright and other developer policies for this repo
+README_tests - developer test documentation
+README - basic product info
+TODO - project plans & todos
+other READMEs - basic info for each directory
+plugins/latexwiki/LICENSE.txt,NOTES.txt,README.txt - latexwiki-specific copyright info, dev notes, admin/user notes
+plugins/mathaction/INSTALL.txt,LICENSE.txt,Notes,README.txt,UPGRADE - needs consolidation like the above
+TESTRESULTS - unit test output updated hourly, published at zwiki.org/TestResults
+misc/ - public notes & snippets, published but not committed
+MYNOTES/ - simon's notes & snippets, not published
+MYNOTES/RelNotesTemplate - template for CHANGES
+
+
+Wiki
+----
+slower to view and slower to edit
+more accessible and more editable for a wide audience
+one master copy used by everyone - simple
+no special tools needed
+email integration - notification and mailin
+good for indexing and searching many documents (local and google search)
+formatting aids - table of contents, headings, tables
+more effort to protect and maintain; more vulnerable to decay
+more expensive to host - every page takes memory & speed
+more public - indexed quickly, for ever
+can organize a large number of documents in a hierarchy
+
+current uses:
+ 
+zwiki.org, including
+NextReleaseNewsDraft - unused
+GeneralDiscussion
+InternationalisationDiscussion
+IssueTracker
+plone.demo.zwiki.org
+free zwikis, including kpug zope3 docs, leo, etc.
+zopewiki.org, joyful.com etc.
+
+
+Thoughts
+--------
+filesystem for developers, wiki for users/admins/general public
+use text files anywhere for fast developer notes
+one requirement, keep them current - but what to do with old/temporary notes ?
+no special docs directory, just upper-case, no suffix
+publish all filesystem docs online, like rdoc or within wiki (they will be googlable ?)
+restructured text and moving docs between FS and wiki encouraged
+wiki needs to be fast

Added: zope-zwiki/branches/upstream/current/GPL
===================================================================
--- zope-zwiki/branches/upstream/current/GPL	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/GPL	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,344 @@
+The General Public License (GPL)
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+675 Mass Ave, Cambridge, MA 02139, USA. Everyone is
+permitted to copy and distribute verbatim copies of
+this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take
+away your freedom to share and change it. By contrast,
+the GNU General Public License is intended to guarantee
+your freedom to share and change free software--to make
+sure the software is free for all its users. This
+General Public License applies to most of the Free
+Software Foundation's software and to any other program
+whose authors commit to using it. (Some other Free
+Software Foundation software is covered by the GNU
+Library General Public License instead.) You can apply
+it to your programs, too.
+
+When we speak of free software, we are referring to
+freedom, not price. Our General Public Licenses are
+designed to make sure that you have the freedom to
+distribute copies of free software (and charge for this
+service if you wish), that you receive source code or
+can get it if you want it, that you can change the
+software or use pieces of it in new free programs; and
+that you know you can do these things.
+
+To protect your rights, we need to make restrictions
+that forbid anyone to deny you these rights or to ask
+you to surrender the rights. These restrictions
+translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a
+program, whether gratis or for a fee, you must give the
+recipients all the rights that you have. You must make
+sure that they, too, receive or can get the source
+code. And you must show them these terms so they know
+their rights.
+
+We protect your rights with two steps: (1) copyright
+the software, and (2) offer you this license which
+gives you legal permission to copy, distribute and/or
+modify the software.
+
+Also, for each author's protection and ours, we want to
+make certain that everyone understands that there is no
+warranty for this free software. If the software is
+modified by someone else and passed on, we want its
+recipients to know that what they have is not the
+original, so that any problems introduced by others
+will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by
+software patents. We wish to avoid the danger that
+redistributors of a free program will individually
+obtain patent licenses, in effect making the program
+proprietary. To prevent this, we have made it clear
+that any patent must be licensed for everyone's free
+use or not licensed at all.
+
+The precise terms and conditions for copying,
+distribution and modification follow.
+
+GNU GENERAL PUBLIC LICENSE
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND
+MODIFICATION
+
+0. This License applies to any program or other work
+which contains a notice placed by the copyright holder
+saying it may be distributed under the terms of this
+General Public License. The "Program", below, refers to
+any such program or work, and a "work based on the
+Program" means either the Program or any derivative
+work under copyright law: that is to say, a work
+containing the Program or a portion of it, either
+verbatim or with modifications and/or translated into
+another language. (Hereinafter, translation is included
+without limitation in the term "modification".) Each
+licensee is addressed as "you".
+
+Activities other than copying, distribution and
+modification are not covered by this License; they are
+outside its scope. The act of running the Program is
+not restricted, and the output from the Program is
+covered only if its contents constitute a work based on
+the Program (independent of having been made by running
+the Program). Whether that is true depends on what the
+Program does.
+
+1. You may copy and distribute verbatim copies of the
+Program's source code as you receive it, in any medium,
+provided that you conspicuously and appropriately
+publish on each copy an appropriate copyright notice
+and disclaimer of warranty; keep intact all the notices
+that refer to this License and to the absence of any
+warranty; and give any other recipients of the Program
+a copy of this License along with the Program.
+
+You may charge a fee for the physical act of
+transferring a copy, and you may at your option offer
+warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or
+any portion of it, thus forming a work based on the
+Program, and copy and distribute such modifications or
+work under the terms of Section 1 above, provided that
+you also meet all of these conditions:
+
+a) You must cause the modified files to carry prominent
+notices stating that you changed the files and the date
+of any change.
+
+b) You must cause any work that you distribute or
+publish, that in whole or in part contains or is
+derived from the Program or any part thereof, to be
+licensed as a whole at no charge to all third parties
+under the terms of this License.
+
+c) If the modified program normally reads commands
+interactively when run, you must cause it, when started
+running for such interactive use in the most ordinary
+way, to print or display an announcement including an
+appropriate copyright notice and a notice that there is
+no warranty (or else, saying that you provide a
+warranty) and that users may redistribute the program
+under these conditions, and telling the user how to
+view a copy of this License. (Exception: if the Program
+itself is interactive but does not normally print such
+an announcement, your work based on the Program is not
+required to print an announcement.)
+
+These requirements apply to the modified work as a
+whole. If identifiable sections of that work are not
+derived from the Program, and can be reasonably
+considered independent and separate works in
+themselves, then this License, and its terms, do not
+apply to those sections when you distribute them as
+separate works. But when you distribute the same
+sections as part of a whole which is a work based on
+the Program, the distribution of the whole must be on
+the terms of this License, whose permissions for other
+licensees extend to the entire whole, and thus to each
+and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim
+rights or contest your rights to work written entirely
+by you; rather, the intent is to exercise the right to
+control the distribution of derivative or collective
+works based on the Program.
+
+In addition, mere aggregation of another work not based
+on the Program with the Program (or with a work based
+on the Program) on a volume of a storage or
+distribution medium does not bring the other work under
+the scope of this License.
+
+3. You may copy and distribute the Program (or a work
+based on it, under Section 2) in object code or
+executable form under the terms of Sections 1 and 2
+above provided that you also do one of the following:
+
+a) Accompany it with the complete corresponding
+machine-readable source code, which must be distributed
+under the terms of Sections 1 and 2 above on a medium
+customarily used for software interchange; or,
+
+b) Accompany it with a written offer, valid for at
+least three years, to give any third party, for a
+charge no more than your cost of physically performing
+source distribution, a complete machine-readable copy
+of the corresponding source code, to be distributed
+under the terms of Sections 1 and 2 above on a medium
+customarily used for software interchange; or,
+
+c) Accompany it with the information you received as to
+the offer to distribute corresponding source code.
+(This alternative is allowed only for noncommercial
+distribution and only if you received the program in
+object code or executable form with such an offer, in
+accord with Subsection b above.)
+
+The source code for a work means the preferred form of
+the work for making modifications to it. For an
+executable work, complete source code means all the
+source code for all modules it contains, plus any
+associated interface definition files, plus the scripts
+used to control compilation and installation of the
+executable. However, as a special exception, the source
+code distributed need not include anything that is
+normally distributed (in either source or binary form)
+with the major components (compiler, kernel, and so on)
+of the operating system on which the executable runs,
+unless that component itself accompanies the
+executable.
+
+If distribution of executable or object code is made by
+offering access to copy from a designated place, then
+offering equivalent access to copy the source code from
+the same place counts as distribution of the source
+code, even though third parties are not compelled to
+copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute
+the Program except as expressly provided under this
+License. Any attempt otherwise to copy, modify,
+sublicense or distribute the Program is void, and will
+automatically terminate your rights under this License.
+However, parties who have received copies, or rights,
+from you under this License will not have their
+licenses terminated so long as such parties remain in
+full compliance.
+
+5. You are not required to accept this License, since
+you have not signed it. However, nothing else grants
+you permission to modify or distribute the Program or
+its derivative works. These actions are prohibited by
+law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work
+based on the Program), you indicate your acceptance of
+this License to do so, and all its terms and conditions
+for copying, distributing or modifying the Program or
+works based on it.
+
+6. Each time you redistribute the Program (or any work
+based on the Program), the recipient automatically
+receives a license from the original licensor to copy,
+distribute or modify the Program subject to these terms
+and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights
+granted herein. You are not responsible for enforcing
+compliance by third parties to this License.
+
+7. If, as a consequence of a court judgment or
+allegation of patent infringement or for any other
+reason (not limited to patent issues), conditions are
+imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this
+License, they do not excuse you from the conditions of
+this License. If you cannot distribute so as to satisfy
+simultaneously your obligations under this License and
+any other pertinent obligations, then as a consequence
+you may not distribute the Program at all. For example,
+if a patent license would not permit royalty-free
+redistribution of the Program by all those who receive
+copies directly or indirectly through you, then the
+only way you could satisfy both it and this License
+would be to refrain entirely from distribution of the
+Program.
+
+If any portion of this section is held invalid or
+unenforceable under any particular circumstance, the
+balance of the section is intended to apply and the
+section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to
+infringe any patents or other property right claims or
+to contest validity of any such claims; this section
+has the sole purpose of protecting the integrity of the
+free software distribution system, which is implemented
+by public license practices. Many people have made
+generous contributions to the wide range of software
+distributed through that system in reliance on
+consistent application of that system; it is up to the
+author/donor to decide if he or she is willing to
+distribute software through any other system and a
+licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what
+is believed to be a consequence of the rest of this
+License.
+
+8. If the distribution and/or use of the Program is
+restricted in certain countries either by patents or by
+copyrighted interfaces, the original copyright holder
+who places the Program under this License may add an
+explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only
+in or among countries not thus excluded. In such case,
+this License incorporates the limitation as if written
+in the body of this License.
+
+9. The Free Software Foundation may publish revised
+and/or new versions of the General Public License from
+time to time. Such new versions will be similar in
+spirit to the present version, but may differ in detail
+to address new problems or concerns.
+
+Each version is given a distinguishing version number.
+If the Program specifies a version number of this
+License which applies to it and "any later version",
+you have the option of following the terms and
+conditions either of that version or of any later
+version published by the Free Software Foundation. If
+the Program does not specify a version number of this
+License, you may choose any version ever published by
+the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program
+into other free programs whose distribution conditions
+are different, write to the author to ask for
+permission. For software which is copyrighted by the
+Free Software Foundation, write to the Free Software
+Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving
+the free status of all derivatives of our free software
+and of promoting the sharing and reuse of software
+generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE,
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT
+PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
+STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER
+PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF
+ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
+NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF
+THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
+DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
+SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR
+AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY
+OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE
+PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
+DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
+LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE
+OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/I18n.py
===================================================================
--- zope-zwiki/branches/upstream/current/I18n.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/I18n.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,92 @@
+# -*- coding: utf-8 -*-
+# provide generic i18n support
+
+import re
+
+#problems.. due to circular import ?
+#from Utils import BLATHER
+#XXX temp
+def BLATHER(t):
+    import zLOG
+    zLOG.LOG('ZWiki',zLOG.BLATHER,t)
+
+USE_PTS=1
+
+try:
+    if USE_PTS:
+        from Products.PlacelessTranslationService.MessageID import MessageIDFactory
+        from Products.PlacelessTranslationService.PatchStringIO import get_request
+        # an i18n doc claimed it's good for _ to return a MessageIDFactory for
+        # some unicode reason, but it causes problems here and there for
+        # code that expects a string. We'll convert to a string for now.
+        # Also we'll put an ugly try except to allow this to just work
+        # in unit tests. Performance problem ?
+        #_ = lambda s:str(MessageIDFactory('zwiki')(s))
+        def _(s):
+            try:
+                return str(MessageIDFactory('zwiki')(s))
+            except AttributeError:
+                return str(s)
+        # this hack forced proper utf-8 header with PTS, but I seem not to
+        # need it any more.. possibly since zope 2.7.2 or some other upgrade ?
+        # reenable if utf-8 encoding is broken, and please report at zwiki.org
+        # XXX still happening with "you are here" in wiki contents view ?
+        #class MessageIDFactoryWithUtf8Fix(MessageIDFactory):
+        #    """
+        #    XXX wrapper ensuring proper utf-8 http header when _ is used.
+        #
+        #    Called for every i18n string, performance sensitive ?
+        #    When there is no request, do nothing so unit tests can run.
+        #    """
+        #    def __call__(self, ustr, default=None):
+        #        def setResponseCharset(RESPONSE, charset):
+        #            contenttype = RESPONSE.getHeader('content-type') or 'text/html'
+        #            if not 'charset' in contenttype:
+        #                RESPONSE.setHeader('Content-Type','%s; charset=utf-8' % contenttype)
+        #        REQUEST = get_request()
+        #        if not REQUEST: return ustr
+        #        else:
+        #            setResponseCharset(REQUEST.RESPONSE,'utf-8')
+        #            return MessageIDFactory.__call__(self,ustr,default)
+        #_ = lambda s:str(MessageIDFactoryWithUtf8Fix('zwiki')(s))
+        from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+        from Globals import HTMLFile, DTMLFile
+        BLATHER('using PlacelessTranslationService for i18n')
+
+    elif USE_LOCALIZER: # not supported at the moment
+        from Products.Localizer import Gettext
+        _ = Gettext.translation(globals())
+        from Products.Localizer import LocalPageTemplateFile as PageTemplateFile
+        from Products.Localizer import LocalDTMLFile as DTMLFile
+        from DocumentTemplate.DT_String import String
+        from DocumentTemplate.DT_Util import InstanceDict, namespace, render_blocks
+        BLATHER('using Localizer for i18n - not implemented')
+
+except (ImportError, NameError):
+    def _(s): return s
+    from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+    from Globals import HTMLFile, DTMLFile
+    class MockTranslateTag:
+        name='translate'
+        blockContinuations=()
+        _msgid = None
+        _domain = None
+        def __init__(self, blocks): 
+            self.blocks=blocks
+            tname, args, section = blocks[0]
+            self.__name__="%s %s" % (tname, args)
+        def render(self, md):
+            r=[]
+            for tname, args, section in self.blocks:
+                __traceback_info__=tname
+                r.append(section(None, md))
+            if r:
+                if len(r) > 1: r = "(%s)\n" % join(r,' ')
+                else: r = r[0]
+            else:
+                r = ''
+            return r + '\n'
+        __call__=render
+    from DocumentTemplate.DT_String import String
+    String.commands['translate'] = MockTranslateTag
+    BLATHER('did not find PlacelessTranslationService, the Zwiki skin will not be localized')

Added: zope-zwiki/branches/upstream/current/I18n_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/I18n_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/I18n_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,121 @@
+# -*- coding: latin-1 -*-
+#
+# tests to verify l10n works.. none of these work currently 
+#
+# OLD ISSUES
+#
+# 1. don't know how to make PTS return utf-8, so this file is latin-1
+#
+# 2. if PTS is on the filesystem, even without installProduct it does get
+#    imported by support and will be active. But we'd like to test some
+#    things without it. How do we prevent PTS installation ?
+#
+# 3. with PTS active, _() expects _getContext to find a request, normally
+#    saved by ZPublisher. We patched it for (some) tests below, but the
+#    problem remains for the other test modules, which also use _().  For
+#    now we'll patch PTS for all (in support) and figure out later how to
+#    let the below work.
+#
+# 4. should we skip translation tests when PTS is not available ?
+#
+# 5. these tests test PTS-based i18n, not generic i18n
+#
+## mock up stuff to get language control. The usual Pain.
+#from Products.PlacelessTranslationService.PlacelessTranslationService \
+#     import PlacelessTranslationService
+## leave negotiation intact for later tests
+#try:
+#    save1 = PlacelessTranslationService._getContext
+#    save2 = PlacelessTranslationService.negotiate_language
+#    PlacelessTranslationService._getContext = \
+#        lambda self,context: MockRequest()
+#    PlacelessTranslationService.negotiate_language = \
+#        lambda self,context,domain: language
+#    translation = _(string)
+#finally:
+#    PlacelessTranslationService._getContext = save1
+#    PlacelessTranslationService.negotiate_language = save2
+
+
+try:
+    from Products import PlacelessTranslationService
+    HAS_PTS = 1
+except ImportError:
+    HAS_PTS = 0
+
+if 1: #not HAS_PTS:
+    # dummy test suite
+    import unittest
+    def test_suite():
+        return unittest.TestSuite()
+
+else: # NEVER RUN
+    from testsupport import *
+    ZopeTestCase.installProduct('ZWiki')
+    ZopeTestCase.installProduct('PlacelessTranslationService')
+
+    from Products.ZWiki.I18n import _
+    from Products.ZWiki.Views import loadDtmlMethod
+
+    def test_suite():
+        suite = unittest.TestSuite()
+        suite.addTest(unittest.makeSuite(Tests))
+        suite.level = 2
+        return suite
+
+    class Tests(ZwikiTestCase):
+        """
+        Unit tests for Zwiki i18n, aka "blood, sweat and tears".
+
+        Tips for MockZWikiPage, MockRequest, PTS etc.:
+        - use a fresh request to avoid PTS language caching
+        - the REQUEST argument is often required
+        - set a page's REQUEST attribute as well
+        - bare=1 can also help get pages rendering
+
+        """
+        #def test_python_i18n(self):
+        #    self.assertEquals(_('NEW'), 'NUOVA')
+
+        def test_dtml_translate_tag(self):
+            self.p.allow_dtml = 1
+            self.p.edit(
+                text='<dtml-translate domain=zwiki>test</dtml-translate>')
+            self.assert_(re.search('test', self.p(bare=1)))
+
+        #def test_addwikipageform(self):
+        #    from DocumentTemplate.DT_Util import ParseError
+        #    form = loadDtmlMethod('addwikipageform')
+        #    try: form(REQUEST=MockRequest(),RESPONSE=MockRequest().RESPONSE)
+        #    except NameError: self.fail()
+        #    except KeyError: pass
+
+        #def test_zmi_dtml_i18n(self):
+        #    form = loadDtmlMethod('addwikipageform')
+        #    self.assert_(re.search('Add ZWiki Page',
+        #                           form(REQUEST=MockRequest(),
+        #                                RESPONSE=MockRequest().RESPONSE)))
+        #    self.assert_(re.search('Aggiungi pagina ZWiki',
+        #                           form(REQUEST=MockRequest(language='it'),
+        #                                RESPONSE=MockRequest().RESPONSE)))
+
+        #def test_skin_dtml_i18n(self):
+        #    # the searchwiki form includes searchwikidtml
+        #    t = self.p.searchwiki(REQUEST=MockRequest())
+        #    self.assert_(re.search('Enter a word',t))
+        #    
+        #    self.p.REQUEST = MockRequest(language='it')
+        #    t = self.p.searchwiki(REQUEST=self.p.REQUEST)
+        #    self.assert_(re.search(r'Inserisci una parola',t))
+
+        #def test_page_dtml_i18n(self):
+        #    self.p.allow_dtml = 1
+        #    self.p.edit(
+        #        text='<dtml-translate domain=zwiki>NEW</dtml-translate>')
+        #    self.assert_(re.search('NEW', self.p(bare=1)))
+        #    
+        #    self.p.REQUEST = MockRequest(language='it')
+        #    self.assert_(re.search('NUOVA', self.p(bare=1)))
+
+        #def test_pt_i18n(self):
+

Added: zope-zwiki/branches/upstream/current/LICENSE
===================================================================
--- zope-zwiki/branches/upstream/current/LICENSE	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/LICENSE	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,20 @@
+ZWiki - a zope-based wiki implementation
+Copyright (C) 1999,2000,2001,2002,2003,2004,2005 Simon Michael 
+<simon at joyful.com> for the zwiki community.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+If you need to discuss an alternate licensing arrangement, contact me at
+zwiki.org.

Added: zope-zwiki/branches/upstream/current/Mail.py
===================================================================
--- zope-zwiki/branches/upstream/current/Mail.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Mail.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,913 @@
+# PageMailSupport mixin
+
+import string, re, sys
+from string import split,join,find,lower,rfind,atoi,strip,lstrip
+from types import *
+
+from I18n import _
+from TextFormatter import TextFormatter
+from Utils import html_unquote,BLATHER,formattedTraceback,stripList, \
+     isIpAddress,isEmailAddress,isUsername
+from Defaults import AUTO_UPGRADE, PAGE_METATYPE
+
+
+class PageSubscriptionSupport:
+    """
+    This mixin class adds subscriber management to a wiki page (and folder).
+
+    Responsibilities: manage a list of subscribers for both this page and
+    it's folder, and expose these in the ZMI; also do auto-upgrading.
+
+    A "subscriber" is a string which may be either an email address or a
+    CMF member username. A list of these is kept in the page's and/or
+    folder's subscriber_list property.
+
+    For the moment, it's still called "email" in arguments to avoid
+    breaking legacy dtml (eg subscribeform).
+    """
+    subscriber_list = []
+    _properties=(
+        {'id':'subscriber_list', 'type': 'lines', 'mode': 'w'},
+        )
+
+    ## private ###########################################################
+
+    def _getSubscribers(self, parent=0):
+        """
+        Return a copy of this page's subscriber list, as a list.
+        
+        With parent flag, manage the parent folder's subscriber list instead.
+        """
+        if AUTO_UPGRADE: self._upgradeSubscribers()
+        if parent:
+            if hasattr(self.folder(),'subscriber_list'):
+                return stripList(self.folder().subscriber_list)
+            else:
+                return []
+        else:
+            return list(self.subscriber_list)
+
+    def _setSubscribers(self, subscriberlist, parent=0):
+        """
+        Set this page's subscriber list. 
+        With parent flag, manage the parent folder's subscriber list instead.
+        """
+        if AUTO_UPGRADE: self._upgradeSubscribers()
+        if parent:
+            self.folder().subscriber_list = subscriberlist
+        else:
+            self.subscriber_list = subscriberlist
+
+    def _resetSubscribers(self, parent=0):
+        """
+        Clear this page's subscriber list.
+        With parent flag, manage the parent folder's subscriber list instead.
+        """
+        self._setSubscribers([],parent)
+
+    def _upgradeSubscribers(self):
+        """
+        Upgrade old subscriber lists, both this page's and the folder's.
+
+        Called as needed, ie on each access and also from ZWikiPage.upgrade()
+        (set AUTO_UPGRADE=0 in Default.py to disable).
+        
+        XXX Lord have mercy! couldn't this be simpler
+        """
+        # upgrade the folder first; we'll check attributes then properties
+        changed = 0
+        f = self.folder().aq_base
+
+        # migrate an old zwiki subscribers or wikifornow _subscribers attribute
+        oldsubs = None
+        if (hasattr(f, 'subscribers') and
+            type(f.subscribers) is StringType):
+            if f.subscribers:
+                oldsubs = split(re.sub(r'[ \t]+',r'',f.subscribers),',')
+            try:
+                del f.subscribers
+            except KeyError:
+                BLATHER('failed to delete self.folder().subscribers')
+            changed = 1
+        elif hasattr(f, '_subscribers'):
+            oldsubs = f._subscribers.keys()
+            try:
+                del f._subscribers
+            except KeyError:
+                BLATHER('failed to delete self.folder()._subscribers')
+            changed = 1
+        # ensure a subscriber_list attribute
+        if not hasattr(f, 'subscriber_list'): f.subscriber_list = []
+        # transfer old subscribers to subscriber_list, unless it's already
+        # populated in which case discard them
+        if oldsubs and not f.subscriber_list: f.subscriber_list = oldsubs
+
+        # update _properties
+        props = map(lambda x:x['id'], f._properties)
+        if 'subscribers' in props:
+            f._properties = filter(lambda x:x['id'] != 'subscribers',
+                                   f._properties)
+            changed = 1
+        if not 'subscriber_list' in props:
+            f._properties = f._properties + \
+                ({'id':'subscriber_list','type':'lines','mode':'w'},)
+
+        if changed:
+            BLATHER('upgraded %s folder subscriber list' % (f.id))
+
+        # now do the page..
+        changed = 0
+        self = self.aq_base
+
+        # migrate an old zwiki subscribers attribute
+        oldsubs = None
+        if (hasattr(self, 'subscribers') and
+            type(self.subscribers) is StringType):
+            if self.subscribers:
+                oldsubs = split(re.sub(r'[ \t]+',r'',self.subscribers),',')
+            try:
+                del self.subscribers
+            except KeyError:
+                BLATHER('failed to delete %s.subscribers' % (self.id()))
+            changed = 1
+        # copy old subscribers to subscriber_list, unless it's already
+        # got some
+        # XXX merge instead
+        if oldsubs and not self.subscriber_list:
+            self.subscriber_list = oldsubs
+
+        # migrate a wikifornow _subscribers attribute
+        oldsubs = None
+        if hasattr(self, '_subscribers'):
+            oldsubs = self._subscribers.keys()
+            try:
+                del self._subscribers
+            except KeyError:
+                BLATHER('failed to delete %s._subscribers' % (self.id()))
+            changed = 1
+        if oldsubs and not self.subscriber_list:
+            self.subscriber_list = oldsubs
+
+        # update _properties
+        props = map(lambda x:x['id'], self._properties)
+        if 'subscribers' in props:
+            self._properties = filter(lambda x:x['id'] != 'subscribers',
+                                      self._properties)
+            changed = 1
+        if not 'subscriber_list' in props:
+            self._properties = self._properties + \
+                ({'id':'subscriber_list','type':'lines','mode':'w'},)
+
+        if changed:
+            BLATHER('upgraded %s subscriber list' % (self.id()))
+
+    ## page subscription api #############################################
+
+    # XXX rename to subscribers() & wikiSubscribers() ?
+    # XXX and add editSubscribers & wikiEditSubscribers 
+    def subscriberList(self, parent=0, edits=0):
+        """
+        Return a list of this page's subscribers, without the :edits suffix.
+
+        A subscriber is represented by a string containing an email
+        address or a CMF username, and an optional :edits suffix
+        indicating they have requested all edits. Note this method strips
+        the :edits suffix.
+
+        If edits flag is true, return only the subscribers who have
+        requested all edits; otherwise, return all subscribers.
+
+        If parent flag is true, query the parent folder's subscriber list
+        instead.
+        """
+        return [re.sub(r':edits$','',s)
+                for s in stripList(self._getSubscribers(parent))
+                if (not edits) or s.endswith(':edits')]
+
+    def subscriberCount(self, parent=0, edits=0):
+        """
+        Return the number of subscribers currently subscribed to this page.
+
+        With parent flag, count the parent folder's subscriber list instead.
+        With edits flag, count only subscribers who have requested all edits.
+        """
+        return len(self.subscriberList(parent,edits))
+
+    def isSubscriber(self, email, parent=0):
+        """
+        Is this email address or member id subscribed to this page ?
+
+        With parent flag, check the parent folder's subscriber list
+        instead.  Note "email" may be either an email address
+        (case-insensitive) or a CMF member id.  We'll accept either, and
+        find subscriptions using either.
+        """
+        subscriber = email
+        if subscriber:
+            email = self.emailAddressFrom(subscriber)
+            usernames = self.usernamesFrom(subscriber)
+            for sub in self.subscriberList(parent):
+                if not sub: continue
+                if ((email and (self.emailAddressFrom(sub) == email)) or
+                    (usernames and (sub in usernames))):
+                    return 1
+        return 0
+               
+    def subscribe(self, email, REQUEST=None, parent=0, edits=0):
+        """
+        Add an email subscriber to this page.
+
+        subscriber may be an email address or a CMF member id.
+        With parent flag, add to the parent folder's subscriber list instead.
+        With edits flag, mark this subscriber as one who wants
+        notification of all edits.
+        """
+        subscriber = email
+        if subscriber:
+            if not self.isSubscriber(subscriber,parent):
+                BLATHER('subscribed',subscriber,'to',self.id(),
+                        edits and '(all edits)' or '')
+                subs = self._getSubscribers(parent)
+                subs.append(subscriber + (edits and ':edits' or ''))
+                self._setSubscribers(subs,parent)
+                if not parent: self.index_object()
+        if REQUEST:
+            REQUEST.RESPONSE.redirect(
+                REQUEST.get('redirectURL',
+                            REQUEST['URL1']+'/subscribeform?email='+subscriber))
+
+    def unsubscribe(self, email, REQUEST=None, parent=0):
+        """
+        Remove email from this page's subscriber list.
+
+        email may be an email address or CMF username, we try to convert
+        usernames to email addresses as needed.
+
+        If parent flag is true, remove it from the parent folder's
+        subscriber list instead.
+        """
+        subscriber = string.lower(email)
+        if self.isSubscriber(subscriber,parent):
+            sl = self._getSubscribers(parent)
+            for s in sl:
+                if (self.emailAddressFrom(s) ==
+                    self.emailAddressFrom(subscriber)):
+                    BLATHER('unsubscribed',subscriber,'from',self.id())
+                    sl.remove(s)
+            self._setSubscribers(sl,parent)
+            if not parent: self.index_object()
+        if REQUEST:
+            REQUEST.RESPONSE.redirect(
+                REQUEST.get('redirectURL',
+                            REQUEST['URL1']+'/subscribeform?email='+subscriber))
+
+    ## folder subscription api ###########################################
+
+    def wikiSubscriberList(self, edits=0):
+        """whole-wiki version of subscriberList"""
+        return self.subscriberList(parent=1,edits=edits)
+
+    def wikiSubscriberCount(self, edits=0):
+        """whole-wiki version of subscriberCount"""
+        return self.subscriberCount(parent=1,edits=edits)
+
+    def isWikiSubscriber(self,email):
+        """whole-wiki version of isSubscriber"""
+        return self.isSubscriber(email,parent=1)
+
+    def wikiSubscribe(self, email, REQUEST=None, edits=0):
+        """whole-wiki version of subscribe"""
+        return self.subscribe(email,REQUEST,parent=1,edits=edits)
+
+    def wikiUnsubscribe(self, email, REQUEST=None):
+        """whole-wiki version of unsubscribe"""
+        return self.unsubscribe(email,REQUEST,parent=1)
+
+    ## misc api methods ##################################################
+
+    def subscribeThisUser(self,REQUEST):
+        """
+        Subscribe the current user to this page.
+
+        We'll use their username if appropriate, otherwise their email
+        address cookie.
+        """
+        if not REQUEST: return
+        user = ((self.inCMF() and str(REQUEST.get('AUTHENTICATED_USER'))) or
+                REQUEST.cookies.get('email',None))
+        if user and not (self.isSubscriber(user) or self.isWikiSubscriber(user)):
+            self.subscribe(user)
+
+    def allSubscriptionsFor(self, email):
+        """
+        Return the ids of all pages to which a subscriber is subscribed
+        ('whole_wiki' indicates a wiki subscription).
+
+        XXX catalog case duplicates isSubscriber code
+        """
+        subscriber = email
+        subscriptions = []
+        # subscriber may be an email address or a member id, and
+        # they may be subscribed as either
+        email = self.emailAddressFrom(subscriber)
+        usernames = self.usernamesFrom(subscriber)
+
+        if not (email or usernames):
+            return []
+        if self.isWikiSubscriber(subscriber):
+            subscriptions.append('whole_wiki')
+        # optimization: try to use catalog for memory efficiency..
+        # XXX can we do better - index subscriber_list and search
+        # it directly ?
+        if self.hasCatalogIndexesMetadata(
+            (['meta_type','path'], ['subscriber_list'])):
+            pages = self.pages()
+            for page in pages:
+                for sub in page.subscriber_list:
+                    if not sub: continue
+                    if ((email and (self.emailAddressFrom(sub) == email)) or
+                        (usernames and (sub in usernames))):
+                        subscriptions.append(page.id)
+        else:
+            # poor caching
+            for id, page in self.folder().objectItems(spec=PAGE_METATYPE):
+                if page.isSubscriber(subscriber):
+                    subscriptions.append(id)
+        return subscriptions
+
+    def otherPageSubscriptionsFor(self, email):
+        """
+        Ack, this was too hard in DTML. Return the ids of all pages to
+        which a subscriber is subscribed, excluding the current page and
+        'whole_wiki'.
+        """
+        subscriber = email
+        subs = self.allSubscriptionsFor(subscriber)
+        thispage = self.id()
+        if thispage in subs: subs.remove(thispage)
+        if 'whole_wiki' in subs: subs.remove('whole_wiki')
+        return subs
+
+    def autoSubscriptionEnabled(self):
+        if getattr(self,'auto_subscribe',0):
+            return 1
+        else:
+            return 0
+
+    def usernameOrEmailOfSubscriber(self):
+        """
+        If the user is logged into the CMF, return his/her username
+        else return his/her email address cookie.
+        """
+        if self.inCMF():
+            username = str(self.portal_membership.getAuthenticatedMember())
+            if username and not self.portal_membership.isAnonymousUser():
+                return username
+        return self.REQUEST.get('email',None)
+
+
+    # utilities
+
+    def emailAddressFrom(self,subscriber):
+        """
+        Convert a zwiki subscriber list entry to an email address.
+        
+        A zwiki subscriber list entry can be: an email address, or a CMF
+        member id (if we are in a CMF/Plone site), or either of those with
+        ':edits' appended.  We figure out the bare email address and
+        return it (lower-cased), or if we can't, return None.
+        """
+        if not subscriber or type(subscriber) != StringType:
+            return None
+        subscriber = re.sub(r':edits$','',subscriber)
+        if isEmailAddress(subscriber):
+            email = subscriber
+        elif self.inCMF():
+            #and not self.portal_membership.isAnonymousUser()
+            # don't look up member email addresses if user is anonymous ?
+            # No I think it's better to minimise confusion due to
+            # authenticated vs. unauthenticated (un)subscriptions, even if
+            # it allows an anonymous visitor to unsubscribe a member whose
+            # address they know
+            from Products.CMFCore.utils import getToolByName
+            membership = getToolByName(self,'portal_membership')
+            memberdata = getToolByName(self,'portal_memberdata')
+            member = membership.getMemberById(subscriber)
+            if not member:
+                # also check for a pseudo-member (a user acquired from above)
+                # NB doesn't work with CMFMember
+                if hasattr(memberdata,'_members'):
+                    member = memberdata._members.get(subscriber,None)
+            email = getattr(member,'email','')
+        else:
+            email = ''
+        return string.lower(email) or None
+
+    def emailAddressesFrom(self,subscribers):
+        """
+        Convert a list of subscribers to a list of email addresses.
+
+        Any of these which are usernames for which we can't find an
+        address are converted to an obvious bogus address to help
+        troubleshooting.
+        """
+        emails = []
+        for s in subscribers:
+            e = self.emailAddressFrom(s)
+            # for troubleshooting, but breaks some MTAs
+            #emails.append(e or 'NO_ADDRESS_FOR_%s' % s)
+            if e: emails.append(e)
+        return emails
+
+    def usernamesFrom(self,subscriber):
+        """
+        Convert subscriber to username(s) if needed and return as a list.
+
+        Ie if subscriber is a username, return that username; if
+        subscriber is an email address, return the usernames of any CMF
+        members with that email address.
+        XXX too expensive, disabled; on plone.org with 7k members, this
+        maxed out cpu for 10 minutes. Refactor.
+        """
+        if isUsername(subscriber):
+            return [subscriber]
+        else:
+            return []
+            # XXX plone.org performance issue
+            #email = string.lower(subscriber)
+            #usernames = []
+            #folder = self.folder()
+            #try:
+            #    for user in folder.portal_membership.listMembers():
+            #        member = folder.portal_memberdata.wrapUser(user)
+            #        if string.lower(member.email) == email:
+            #            usernames.append(member.name)
+            #except AttributeError:
+            #    pass
+            #return usernames
+        
+
+class PageMailSupport:
+    """
+    This mixin class provides mail-out support and general mail utilities.
+    """
+
+    def isMailoutEnabled(self):
+        """
+        Has mailout been configured ?
+        """
+        if (self.mailhost() and
+            (self.fromProperty() or self.replyToProperty())):
+            return 1
+        else:
+            return 0
+
+    def mailoutPolicy(self):
+        """
+        Get my mail-out policy - comments or edits ?
+        """
+        return getattr(self,'mailout_policy','comments')
+
+    def fromProperty(self):
+        """
+        Give the mail_from property for this page.
+
+        Usually acquires from the folder.
+        """
+        return getattr(self,'mail_from','')
+    
+    def replyToProperty(self):
+        """
+        Give the mail_replyto property for this page.
+
+        Usually acquires from the folder.
+        """
+        return getattr(self,'mail_replyto','')
+    
+    def toProperty(self):
+        """
+        Give the mail_to property for this page.
+
+        Usually acquires from the folder.
+        """
+        return getattr(self,'mail_to','')
+    
+    def fromHeader(self,REQUEST=None):
+        """
+        Give the appropriate From: header for mail-outs from this page.
+
+        Tries to give the best attribution based on configuration and
+        available information.  XXX todo: use an authenticated CMF
+        member's email property
+        """
+        address = (self.fromProperty() or
+                   #self.usersEmailAddress() or
+                   self.replyToProperty())
+        realname = self.usernameFrom(REQUEST,ip_address=0) or _('anonymous')
+        return '%s (%s)' % (address, realname)
+
+    def replyToHeader(self):
+        """
+        Give the appropriate Reply-to: header for mail-outs from this page.
+        """
+        return self.replyToProperty() or self.fromProperty()
+    
+    def listId(self):
+        """
+        Give the "list id" for mail-outs from this page.
+        """
+        return self.fromProperty() or self.replyToProperty()
+    
+    def listPostHeader(self):
+        """
+        Give the appropriate List-Post: header for mail-outs from this page.
+        """
+        return '<mailto:%s>' % (self.listId())
+
+    def listIdHeader(self):
+        """
+        Give the appropriate List-ID: header for mail-outs from this page.
+        """
+        return '%s <%s>' % (self.folder().title,self.listId())
+
+    def xBeenThereHeader(self):
+        """
+        Give the appropriate X-Been-There: header for mail-outs from this page.
+        """
+        return self.listId()
+
+    def bccHeader(self,recipients):
+        """
+        Give the appropriate Bcc: header for mail-outs from this page.
+
+        Expects a list of recipient addresses.
+        """
+        return join(stripList(recipients), ', ')
+
+    def subjectHeader(self,subject='',subjectSuffix=''):
+        """
+        Give the appropriate Subject: header for mail-outs from this page.
+
+        - adds a prefix if configured in mail_subject_prefix;
+        - includes page name in brackets unless disabled with mail_page_name
+        - abbreviates issue tracker page names to just the number, except
+          when creating the page or when overridden with mail_issue_name.
+          Temp kludge: we assume the page is being created if it's less than
+          30s old.
+          (XXX tracker plugin dependency)
+        - appends subjectSuffix if provided
+        """
+        if getattr(self.folder(),'mail_page_name',1):
+            # we will add the page name
+            if (self.issueNumber()
+                and (self.getPhysicalRoot().ZopeTime()-self.creationTime()) > 30.0/24/60/60
+                and not getattr(self.folder(),'mail_issue_name',0)):
+                # we will truncate it to just the issue number
+                pagename = '[#%s] ' % self.issueNumber()
+            else:
+                pagename = '[%s] ' % self.pageName()
+        else:
+            # page name has been suppressed
+            pagename = ''
+        return (
+            strip(getattr(self.folder(),'mail_subject_prefix','')) +
+            pagename +
+            subject +
+            strip(subjectSuffix))
+
+    def toHeader(self):
+        """
+        Give the appropriate To: header for mail-outs from this page.
+
+        When sending a mail-out, we put the subscribers in Bcc for privacy.
+        Something is needed in To, what should we use ?
+        1. if there is a mail_to property, use that
+        2. if there is a mail_replyto or mail_from property, use that.
+           NB if you use a real address and also subscribe with it you may
+           get duplicates; also when using the wiki mailin address a copy
+           is sent quickly back to the wiki, possible cause of conflicts
+           leading to slow comments ? Not recently.
+        3. or use ";" which is a legal "nowhere" address but causes messy cc
+           header in replies
+        """
+        return (self.toProperty() or
+                self.replyToProperty() or
+                self.fromProperty() or
+                ';')
+
+    def signature(self, message_id=None):
+        """
+        Give the appropriate signature to add to mail-outs from this page.
+
+        That is:
+        - the contents of the mail_signature property
+        - or a semi-permalink to a comment if its message id is provided
+        - or a link to this page
+        """
+        url = self.pageUrl()
+        if message_id:
+            # sync with makeCommentHeading
+            url += '#msg%s' % re.sub(r'^<(.*)>$',r'\1',message_id) 
+        return getattr(self.folder(),'mail_signature',
+                       '--\nforwarded from %s' % url) # XXX i18n
+
+    def mailhost(self):
+        """
+        Give the MailHost that should be used for sending mail, or None.
+
+        This needs to just work, as follows: we want to find a real
+        mailhost in a robust way, ie not relying only on a MailHost id,
+        and acquiring it from a parent folder if necessary.  NB there are
+        at least two kinds, a MaildropHost can be transaction-safe and
+        prevents duplicates, a MailHost sends immediately and almost never
+        sends duplicates in practice; we won't favour one or the other.
+        So: look for the first object with Maildrop Host or Mail Host
+        meta_type in this folder, then in the parent folder, and so on.
+        """
+        mhost = None
+        folder = self.folder()
+        # XXX folder might not have objectValues, don't know why (#938)
+        while (not mhost) and folder and hasattr(folder,'objectValues'):
+            mhosts = folder.objectValues(
+                spec=['Mail Host', 'Secure Mail Host', 'Maildrop Host'])
+            if mhosts: mhost = mhosts[0]
+            folder = getattr(folder,'aq_parent',None)
+        return mhost
+
+    def sendMailToSubscribers(self, text, REQUEST, subjectSuffix='',
+                              subject='',message_id=None,in_reply_to=None,
+                              exclude_address=None):
+        """
+        Send mail to this page's and the wiki's subscribers, if any.
+        
+        If a mailhost and mail_from property have been configured and
+        there are subscribers to this page, email text to them.  So as not
+        to prevent page edits, catch any mail-sending errors (and log them
+        and try to mail them to an admin).
+
+        This is used for sending things of interest to all subscribers,
+        like comments and page creations. To reduce noise we apply a few
+        special cases:
+        - if text is empty, don't send
+        - if this is a boring page, don't send to wiki subscribers unless
+          they've requested all edits
+        """
+        if text:
+            self.sendMailTo(
+                self.emailAddressesFrom(
+                    self.subscriberList() + \
+                    self.wikiSubscriberList(edits=self.isBoring())),
+                text,
+                REQUEST,
+                subjectSuffix=subjectSuffix,
+                subject=subject,
+                message_id=message_id,
+                in_reply_to=in_reply_to,
+                exclude_address=exclude_address)
+
+    def sendMailToEditSubscribers(self, text, REQUEST, subjectSuffix='',
+                                  subject='',message_id=None,in_reply_to=None,
+                                  exclude_address=None):
+        """
+        Send mail to this page's and the wiki's all edits subscribers, if any.
+        
+        Like sendMailToSubscribers, but sends only to the subscribers who
+        have requested notification of all edits. If text is empty, send
+        nothing.
+
+        For backwards compatibility, a mailout_policy property with value
+        edits on the wiki folder will override this and send to all
+        subscribers.  I think that needs to go away as it makes the user's
+        choice on subscribeform useless. During upgrade we could remove it
+        and convert all subscribers to edits subscribers.
+        """
+        if not text: return
+        if self.mailoutPolicy() == 'edits':        #XXX deprecate
+            recipients = self.subscriberList() + \
+                         self.wikiSubscriberList()
+        else:
+            recipients = self.subscriberList(edits=1) + \
+                         self.wikiSubscriberList(edits=1)
+        self.sendMailTo(
+            self.emailAddressesFrom(recipients),
+            text,
+            REQUEST,
+            subjectSuffix=subjectSuffix,
+            subject=subject,
+            message_id=message_id,
+            in_reply_to=in_reply_to,
+            exclude_address=exclude_address)
+        
+
+    def sendMailTo(self, recipients, text, REQUEST,
+                   subjectSuffix='',
+                   subject='',
+                   message_id=None,
+                   in_reply_to=None,
+                   to=None,
+                   exclude_address=None,
+                   ):
+        """
+        Send a mail-out containing text to a list of email addresses.
+
+        If mail-out is not configured in this wiki or there are no valid
+        recipients, do nothing.  Catch and log any errors when sending
+        mail.
+        
+        XXX templatize ?
+        XXX ezmlm won't deliver with precedence: bulk, which these are, what to do
+        """
+        if not self.isMailoutEnabled(): return
+
+        # gather bits and pieces
+        msgid = message_id or self.messageIdFromTime(self.ZopeTime())
+        tohdr = to or self.toHeader()
+
+        # do some last-minute winnowing-out of recipients we don't want to
+        # send to (and mail we don't want to send)
+
+	# help mailin.py to exclude a list address to avoid a loop
+        try: recipients.remove(exclude_address)
+        except ValueError: pass
+
+        if not recipients: return
+        
+	# some lists may deliver duplicated addresses twice; try to avoid
+        # unnecessary
+        #unique = []
+        #for r in recipients:
+        #    if not r in unique:
+        #        unique.append(r)
+        #if self.toProperty() in unique: unique.remove(self.toProperty())
+
+        msg = """\
+From: %s
+Reply-To: %s
+To: %s
+Bcc: %s
+Subject: %s
+Message-ID: %s%s
+X-Zwiki-Version: %s
+X-BeenThere: %s
+List-Id: %s
+List-Post: %s
+List-Subscribe: <%s/subscribeform>
+List-Unsubscribe: <%s/subscribeform>
+List-Archive: <%s>
+List-Help: <%s>
+Content-Type: text/plain; charset="utf-8"
+
+%s
+%s
+""" \
+        % (self.fromHeader(REQUEST),
+           self.replyToHeader(),
+           tohdr,
+           self.bccHeader(recipients),
+           self.subjectHeader(subject,subjectSuffix),
+           msgid,
+           (in_reply_to and '\nIn-reply-to: %s' % in_reply_to) or '',
+           self.zwiki_version(),
+           self.xBeenThereHeader(),
+           self.listIdHeader(),
+           self.listPostHeader(),
+           self.pageUrl(),
+           self.pageUrl(),
+           self.pageUrl(),
+           self.wikiUrl(),
+           text,
+           self.signature(msgid),
+           )
+        # send
+        try:
+            self.mailhost().send(msg)
+            #BLATHER('sent mail:\n%s' % msg)
+            BLATHER('sent mail to subscribers:\nTo: %s\nBcc: %s' % (
+                tohdr,self.bccHeader(recipients)))
+        # if there is any failure, notify admin or log
+        except:
+            BLATHER('failed to send mail to %s: %s' % (recipients,
+                                                       formattedTraceback()))
+            admin = getattr(self.folder(),'mail_admin',None)
+            if admin:
+                try:
+                    self.sendMailTo( #XXX possible infinite recursion ?
+                        [],text,REQUEST,
+                        subjectSuffix='ERROR, subscriber mailout failed',
+                        to=admin)
+                except:
+                    BLATHER('failed to send error report to admin: %s' % \
+                            formattedTraceback())
+
+
+        # XXX experimental
+        #self.sendCiaBotMail
+#    def sendCiaBotMail(self):
+#        """
+#        Send mail to an IRC channel via ciabot (or similar).
+#
+#        This is sent separately so we can provide the special headers.
+#        """
+#        mail_irc_address = getattr(self.folder(),'mail_irc_address',None)
+#        if mail_irc_address:
+#            msg = """\
+#From: %s
+#To: %s
+#Subject: %s
+#
+#%s: %s
+#%s
+#""" \
+#            % (fromhdr,
+#               mail_irc_address,
+#               getattr(self.folder(),'mail_irc_subject',''),
+#               username,
+#               body,
+#               signature,
+#               )
+#            self.mailhost().send(msg)
+#            BLATHER('sending mailout to IRC:',msg)
+
+
+        #if subject == 'test':
+        #    BLATHER('discarding test mailout:\n%s' % msg)
+        #    #self.sendTestMail()
+#    def sendTestMail(self):
+#        """
+#        Send a mail which users won't see, but we can monitor in tests
+#        """
+#        BLATHER('diverting test mailout to test server:\n%s' % msg)
+#        # I tried sending to a test SMTP server, but it blocked
+#        #try:
+#        #    self.TestMailHost.send(msg)
+#        #    BLATHER('sent mailout to test server')
+#        #    BLATHER('TestMailHost info:',
+#        #         self.TestMailHost.smtp_host,
+#        #         self.TestMailHost.smtp_port)
+#        #except:
+#        #    type, val, tb = sys.exc_info()
+#        #    err = string.join(
+#        #        traceback.format_exception(type,val,tb),'')
+#        #    BLATHER('failed to send mailout to test server:',
+#        #         err,
+#        #         self.TestMailHost.smtp_host,
+#        #         self.TestMailHost.smtp_port)
+#        # instead, I sent as usual and hacked mailman to drop it
+#        # do add a X-No-Archive header
+#        msg = re.sub(r'(?m)(List-Help:.*$)',
+#                     r'\1\nX-No-Archive: yes',
+#                     msg)
+#        BLATHER('sending mailout:\n%s' % msg)
+#        self.mailhost().send(msg)
+
+
+    #def formatMailout(self, text):
+    #    """
+    #    Format some text (usually a page diff) for email delivery.
+    #
+    #    This is supposed to present a diff, but in the most human-readable
+    #    and clutter-free way possible, since people may be receiving many
+    #    of these. In the case of a simple comment, it should look as if
+    #    the comment was just forwarded out.  See
+    #    test_formatMailout/testEndToEndCommentFormatting for examples.
+    #
+    #    """
+    #    if not text: return ''
+    #    
+    #    # try to do some useful formatting
+    #    # wrap and fill each paragraph, except indented ones,
+    #    # and preserve citation prefixes
+    #    paragraphs = stripList(split(text,'\n\n'))
+    #    for i in range(len(paragraphs)):
+    #        p = paragraphs[i]
+    #        indent = len(p) - len(lstrip(p))
+    #        #if indent or p[0] == '>': continue
+    #        if indent: continue
+    #        m = re.match(r'^[>\s]+',p)
+    #        if m:
+    #            prefix = m.group()
+    #            p = re.sub(r'(?m)^'+prefix,'',p)
+    #        else:
+    #            prefix = ''
+    #        # TextFormatter loses a trailing newline
+    #        # (and a single leading newline, but that shouldn't apply)
+    #        if p[-1] == '\n': nl = '\n'
+    #        else: nl = ''
+    #        p = TextFormatter([{'width':70-len(prefix),
+    #                            'margin':0,
+    #                            'fill':1,
+    #                            'pad':0}]).compose([p])
+    #        p = re.sub(r'(?m)^',prefix,p)
+    #        p += nl
+    #        paragraphs[i] = p
+    #        
+    #    text = join(paragraphs,'\n\n')
+    #
+    #    # strip leading newlines
+    #    text = re.sub(r'(?s)^\n+',r'',text)
+    #    # strip trailing newlines
+    #    text = re.sub(r'(?s)\n+$',r'\n',text)
+    #    # lose any html quoting
+    #    text = html_unquote(text)
+    #    return text
+

Added: zope-zwiki/branches/upstream/current/Mail_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/Mail_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Mail_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,154 @@
+from testsupport import *
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(TestsOfMailout))
+    suite.addTest(unittest.makeSuite(TestsOfSubscription))
+    return suite
+
+class TestsOfMailout(unittest.TestCase):
+    def setUp(self):
+        self.p = mockPage()
+        # mock up and record mail sending
+        # XXX hacks MockZWikiPage class!
+        self.p.mock_mailout_happened = 0
+        def mock_sendMailToSubscribers(self, text, REQUEST, subjectSuffix='',
+                                       subject='',message_id=None,in_reply_to=None,
+                                       exclude_address=None):
+            self.mock_mailout_happened = 1
+            self.mock_mailout_text = text
+            self.mock_mailout_REQUEST = REQUEST
+            self.mock_mailout_subjectSuffix = subjectSuffix
+            self.mock_mailout_subject = subject
+        self.savemethod = self.p.__class__.sendMailToSubscribers
+        self.p.__class__.sendMailToSubscribers = mock_sendMailToSubscribers
+
+    def tearDown(self):
+        self.p.__class__.sendMailToSubscribers = self.savemethod
+        
+    # see also testCommentFormatting
+    def testCommentMailout(self):
+        self.p.comment(text='comment',username='me',time='1999/12/31 GMT')
+        self.assertEquals(self.p.mock_mailout_happened,1)
+
+    #def testMailoutCommentWithOrWithoutSubjectField(self):
+    # need to call the real sendMailToSubscribers
+    #    self.p.comment(text='comment',username='me',time='now',
+    #                   subject_heading='[test]')
+    #    self.assertEquals(self.p.mock_mailout_happened,1)
+    #    self.p.comment(text='comment',username='me',time='now')
+    #    self.assertEquals(self.p.mock_mailout_happened,1)
+
+    def testTextFormatter(self):
+        # what's textformatter really doing ?
+        from Products.ZWiki.TextFormatter import TextFormatter
+        formatter = TextFormatter((
+            {'width':78, 'fill':0, 'pad':0},
+            ))
+        self.assertEqual(formatter.compose(('',)),'')
+        self.assertEqual(formatter.compose(('sometext',)),'sometext')
+        self.assertEqual(formatter.compose(('sometext\n',)),'sometext')
+        self.assertEqual(formatter.compose(('sometext\n\n',)),'sometext\n')
+        self.assertEqual(formatter.compose(('sometext\n\n\n',)),'sometext\n\n')
+        self.assertEqual(formatter.compose(('\nsometext',)),'\n sometext')
+        self.assertEqual(formatter.compose(('\n\nsometext',)),'\n\nsometext')
+        # chops a trailing newline and inserts a space after a single
+        # leading newline
+
+    # see also testZWikiPage.testCommentFormatting
+    #def test_formatMailout(self):
+    #    #fmt = self.p.formatMailout
+    #    fmt = PageMailSupport().formatMailout
+    #    # formatting nothing is ok
+    #    self.assertEqual(fmt(' '),'')
+    #    # fill paragraphs, strip leading and trailing newlines,
+    #    # don't touch indented paragraphs or citations
+    #    self.assertEqual(
+    #        fmt('''
+#
+#long long long long long long long long long long long long long long long
+#long long long line
+#long long long long long long long long long long long long long long long
+#long long long line
+#
+# long long long long long long long long long long long long long long long
+#
+#>long long long long long long long long long long long long long long long
+#'''),
+#            '''\
+#long long long long long long long long long long long long long long
+#long long long long line long long long long long long long long long
+#long long long long long long long long long line
+#
+# long long long long long long long long long long long long long long long
+#
+#>long long long long long long long long long long long long long long
+#>long
+#''')
+
+
+class TestsOfSubscription(unittest.TestCase):
+    def test_isSubscriber(self):
+        sl = mockPage()
+        sl._setSubscribers(['a','b'])
+        self.assert_(sl.isSubscriber('a'))
+        self.assert_(not sl.isSubscriber('c'))
+        self.assert_(not sl.isSubscriber(''))
+        self.assert_(not sl.isSubscriber(' '))
+
+    def test_subscribe(self):
+        sl = mockPage()
+        sl._setSubscribers(['spamandeggs'])
+        self.assertEquals(sl.subscriberList(),['spamandeggs'])
+        sl._resetSubscribers()
+        self.assertEquals(sl.subscriberList(),[])
+        self.assertEquals(sl.subscriberCount(),0)
+        sl.subscribe('1 at test.com')
+        self.assertEquals(sl.subscriberList(),['1 at test.com'])
+        # check issue #161
+        self.assertEquals(MockZWikiPage.subscriber_list,[]) 
+        self.assertEquals(sl.subscriberCount(),1)
+        self.assert_(sl.isSubscriber('1 at test.com'))
+        self.assert_(not sl.isSubscriber('2 at test.com'))
+        sl.subscribe('2 at test.com')
+        self.assertEquals(sl.subscriberList(),['1 at test.com', '2 at test.com'])
+        self.assertEquals(sl.subscriberCount(),2)
+        self.assert_(sl.isSubscriber('2 at test.com'))
+        sl.subscribe('1 at test.com')
+        self.assertEquals(sl.subscriberList(),['1 at test.com', '2 at test.com'])
+        sl.unsubscribe('1 at test.com')
+        self.assertEquals(sl.subscriberList(),['2 at test.com'])
+        sl.unsubscribe('1 at test.com')
+        self.assertEquals(sl.subscriberList(),['2 at test.com'])
+        sl.unsubscribe('2 at TesT.cOm')
+        self.assertEquals(sl.subscriberList(),[])
+
+    # XXX doesn't test subscription by CMF member id
+    def test_allSubscriptionsFor(self):
+        p = mockPage()
+        p._resetSubscribers()
+        p._resetSubscribers(parent=1)
+        p.subscribe('a at a.a')
+        p.subscribe('b at b.b')
+        p.wikiSubscribe('b at b.b')
+        self.assertEquals(p.allSubscriptionsFor('a at a.a'),['TestPage'])
+        self.assertEquals(p.allSubscriptionsFor('b at b.b'),['whole_wiki', 'TestPage'])
+        self.assertEquals(p.allSubscriptionsFor('c at c.c'),[])
+        
+    def test_otherSubscriptionsFor(self):
+        thispage = mockPage(__name__='ThisPage')
+        thispage.create('ThatPage')
+        thatpage = thispage.aq_parent.ThatPage
+        thispage.subscribe('me')
+        thatpage.subscribe('me')
+        thatpage.wikiSubscribe('me')
+        self.assertEquals(thispage.otherPageSubscriptionsFor('me'),['ThatPage'])
+
+    def test_unsubscribePreservesEditSubscriptions(self):
+        """Test for #1255 bugfix"""
+        p = mockPage()
+        p.subscribe('a at a.a',edits=1)
+        p.subscribe('b at b.b')
+        p.unsubscribe('b at b.b')
+        self.assert_('a at a.a' in p.subscriberList(edits=1))
+        

Added: zope-zwiki/branches/upstream/current/Outline.py
===================================================================
--- zope-zwiki/branches/upstream/current/Outline.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Outline.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,408 @@
+# zwiki Outline class (page hierarchy helper)
+from __future__ import nested_scopes
+from types import *
+
+class Outline:
+    """
+    I represent and answer questions about a multi-root, multi-parent
+    hierarchy of objects, usually strings, efficiently.
+
+    This is based on Ken Manheimer's WikiNesting enhancement.
+    For the moment, an Outline has
+      _parentmap = {'Root':[],'Child':['Root'],'GrandChild':['Child'],'Single':[]}
+      _childmap =  {'Root':['Child'],'Child':['GrandChild'],'GrandChild':[],'Single':[]}
+      _nesting =   [['Root',['Child','GrandChild']],'Single']
+    A nesting represents outline nodes as follows:
+      Leaves: the string name of the page
+      Nodes with children: a list beginning with the parent node's name
+      Nodes with omitted children (for brevity): list with one string.
+    _childmap and _nesting are derived from _parentmap.
+    Outlines and nestings should perhaps be the same thing.
+
+    """
+    _parentmap = {}
+    _childmap =  {}
+    _nesting =   []
+    def parentmap(self): return self._parentmap
+    def setParentmap(self,parentmap): self._parentmap = parentmap
+    def childmap(self): return self._childmap
+    def setChildmap(self,childmap): self._childmap = childmap
+    def nesting(self): return self._nesting
+    def setNesting(self,nesting): self._nesting = nesting
+    def nodes(self):
+        """Return a sorted list of all nodes."""
+        nodes = self.parentmap().keys()
+        nodes.sort()
+        return nodes
+    def nodeCount(self): return len(self.nodes())
+    def hasNode(self,node): return node in self.nodes()
+    def flat(self):
+        """Return a flattened version of the outline, preserving order."""
+        return flatten(self.nesting())
+    def roots(self):
+        """Return a sorted list of the root nodes."""
+        return filter(lambda x:not self.parents(x), self.nodes())
+    def leaves(self):
+        """Return a sorted list of the leaf nodes."""
+        return filter(lambda x:not self.children(x), self.nodes())
+    def updateChildmap(self,reset=0):
+        """Regenerate childmap from parentmap.
+
+        childmap is the inverse of parentmap - except, it remembers any
+        manual re-ordering of children. Unless reset is true we try to
+        preserve the order of children, which complicates things badly.
+        """
+        nodes = self.nodes()
+        # XXX still problems with things not getting updated properly
+        oldchildmap = self.childmap()
+        if reset:
+            childmap = {}
+        else:
+            # backwards compatibility: 0.39 might have set this to None
+            childmap = self.childmap() or {} 
+            # remove any no-longer-existing nodes from childmap
+            for p in childmap.keys()[:]:
+                if not p in nodes: del childmap[p]
+                else:
+                    for c in childmap[p][:]: # a copy
+                        if not c in nodes: childmap[p].remove(c)
+        # make sure each existing node appears in the childmap
+        for c in nodes:
+            for p in self.parents(c):
+                # each parent should have a childmap entry including this child
+                if not childmap.has_key(p): childmap[p] = [c]
+                elif not c in childmap[p]: childmap[p].append(c)
+        # add a childmap entry for any nodes we missed (non-parents)
+        for l in filter(lambda x:x not in childmap.keys(),nodes):
+            childmap[l] = []
+        self.setChildmap(childmap)
+    def updateNesting(self):
+        """Regenerate nesting from childmap and roots."""
+        self.setNesting(self.offspring(self.roots()))
+    def update(self):
+        """Regenerate everything from the parentmap."""
+        self.updateChildmap()
+        self.updateNesting()
+    def __init__(self,parentmap={}):
+        self.setParentmap(parentmap)
+        self.update()
+    def add(self,node,parents=[],update=1):
+        """
+        Add node to the outline, under the specified parents if any.
+
+        If node is already present, it will be reparented.
+        """
+        parentmap = self.parentmap()
+        parentmap[node] = parents[:] # use a copy
+        self.setParentmap(parentmap)
+        if update: self.update()
+    def delete(self,node,update=1):
+        """
+        Remove node from the outline.
+        """
+        for c in self.children(node):
+            self.reparent(c,self.parents(node),update=0)
+        parentmap = self.parentmap()
+        del parentmap[node]
+        self.setParentmap(parentmap)
+        if update: self.update()
+    def replace(self,node,newnode,update=1):
+        """
+        Replace node with newnode in the outline.
+
+        If node wasn't there, just add newnode. This is useful for rename().
+        Should this sort of robustness check be done here or there ?
+
+        Tries to preserve node's ordering among it's siblings, as in
+        updateChildMap.
+        """
+        parentmap = self.parentmap()
+        # replace node with newnode, preserving node's parents
+        parents = self.parents(node)
+        if parentmap.has_key(node): del parentmap[node]
+        parentmap[newnode] = parents
+        # reparent node's children under newnode
+        for c in filter(lambda x:node in parentmap[x],parentmap.keys()):
+            parentmap[c].remove(node)
+            parentmap[c].append(newnode)
+        self.setParentmap(parentmap)
+
+        # tweak childmap before updateChildMap, to preserve node's position
+        childmap = self.childmap()
+        for p in childmap.keys():
+            if node in childmap[p]:
+                childmap[p][childmap[p].index(node)] = newnode
+        self.setChildmap(childmap)
+
+        if update: self.update()
+    def reparent(self,node,newparents,update=1):
+        """
+        Change node's parents to newparents in the outline.
+        """
+        # help prepare childmap for updateChildMap 
+        childmap = self.childmap()
+        for p in self.parents(node): childmap[p].remove(node)
+        self.setChildmap(childmap)
+            
+        self.add(node,newparents,update)
+    def reorder(self,node,child):
+        """
+        Moves child one place to the left among node's children (in _childmap).
+        """
+        childmap = self.childmap()
+        #we do no error checking in this class IIRC
+        #if not childmap.has_key(node): return
+        children = childmap[node]
+        #if not child in children: return
+        i = children.index(child)
+        #if not i: return
+        children[i-1], children[i] = children[i], children[i-1]
+        childmap[node] = children
+        self.setChildmap(childmap)
+        self.updateNesting()
+    def first(self):
+        """
+        Get the first node in the outline.
+        """
+        list = self.flat()
+        if list: return list[0]
+        else: return None
+    def last(self):
+        """
+        Get the last node in the outline.
+        """
+        list = self.flat()
+        if list: return list[-1]
+        else: return None
+    def next(self,node,wrap=0):
+        """
+        Get the next node in the outline.
+        """
+        list = self.flat()
+        if node in list:
+            i = list.index(node)
+            if i < len(list)-1: return list[i+1]
+            elif wrap: return list[0]
+        return None
+    def previous(self,node,wrap=0):
+        """
+        Get the previous node in the outline.
+        """
+        list = self.flat()
+        if node in list:
+            i = list.index(node)
+            if i > 0: return list[i-1]
+            elif wrap: return list[-1]
+        return None
+    def ancestors(self,node):
+        """
+        Return a nesting representing the ancestors of the specified node.
+
+        node itself is included.
+        """
+        ancestors = {}
+        tops = {}
+        offspring = {}
+        todo = {node: None}
+        # Go up, identifying all and topmost forebears:
+        while todo:
+            doing = todo
+            todo = {}
+            for n in doing.keys():
+                if ancestors.has_key(n): continue # already collected this one
+                else:
+                    ancestors[n] = None
+                    parents = self.parents(n)
+                    if parents:
+                        for p in parents:
+                            if offspring.has_key(p): offspring[p].append(n)
+                            else: offspring[p] = [n]
+                            todo[p] = None
+                    else:
+                        tops[n] = None
+        # Ok, now go back down, unravelling each forebear only once:
+        tops = tops.keys()
+        tops.sort
+        did = {}; got = []
+        for t in tops:
+            got.append(descend_ancestors(t, ancestors, did, offspring))
+        return got
+    def ancestorsAndSiblings(self,node):
+        """
+        Return a nesting representing the ancestors and siblings of node.
+        """
+        ancestors = {}
+        tops = {}
+        offspring = {}
+        todo = {node: None}
+        # Go up, identifying all and topmost forebears:
+        while todo:
+            doing = todo
+            todo = {}
+            for n in doing.keys():
+                if ancestors.has_key(n): continue
+                else:
+                    ancestors[n] = None
+                    parents = self.parents(n)
+                    if parents:
+                        for p in parents:
+                            if p != n:
+                                if offspring.has_key(p): offspring[p].append(n)
+                                else: offspring[p] = [n]
+                            todo[p] = None
+                    else:
+                        tops[n] = None
+        # Ok, now go back down, unravelling each forebear only once:
+        tops = tops.keys()
+        tops.sort
+        did = {}; got = []
+        for t in tops:
+            if t == node: got.append([t])
+            else:
+                got.append(descend_ancestors(t,ancestors,did,offspring))
+        return got
+    def ancestorsAndChildren(self,node):
+        """
+        Return a nesting representing the ancestors and children of node.
+        """
+        # Go up, identifying all and topmost forebears:
+        ancestors = {}
+        tops = {}     
+        todo = {node: None}
+        while todo:
+            doing = todo
+            todo = {}
+            for n in doing.keys():
+                if ancestors.has_key(n): continue
+                else:
+                    ancestors[n] = None
+                    parents = self.parents(n)
+                    if parents:
+                        for p in parents:
+                            todo[p] = None
+                    else: tops[n] = None
+        ancestors[node] = None      # Finesse inclusion of page's offspring
+        # Ok, now go back down, showing offspring of all intervening ancestors:
+        tops = tops.keys()
+        tops.sort
+        did = {}; got = []
+        for t in tops:
+            got.append(descend_ancestors(t, ancestors, did, self.childmap()))
+        return got
+    def parents(self,node=None):
+        """
+        Return a nesting/list representing node's immediate parents.
+        """
+        #XXX temporary nasty kludge: there seems no obvious way to prevent
+        #zcatalog from trying to index this object, calling any methods
+        #which (like this one) match catalog index names, when a user does
+        #find all objects. So don't break when that happens.
+        if not node: return None
+        return self.parentmap().get(node,[])[:]
+            
+    def firstParent(self,node):
+        """
+        Return the first parent of node, if any.
+        """
+        parents = self.parentmap().get(node,None)
+        if parents: return parents[0]
+        else: return None
+    def siblings(self,node): 
+        """
+        Return a nesting/list representing node's siblings.
+
+        Ie, any other children of node's first parent. Any siblings by the
+        other parents are not included.
+        """
+        parent = self.firstParent(node)
+        sibs = self.children(parent)
+        sibs.remove(node)
+        sibs.sort()
+        return sibs
+    def children(self,node=None):
+        """
+        Return a nesting/list representing node's immediate children.
+
+        If node is None or [], return the roots.
+        """
+        if self.hasNode(node): return self.childmap()[node][:]
+        elif not node: return self.roots()
+        else: return []
+    def offspring(self,nodes,did=None,depth=None):
+        """
+        Return a nesting representing all descendants of all specified nodes.
+
+        nodes is a list of nodes; these will be included in the nesting.
+        did is used only for recursion.
+
+        If depth is specified, descendendants beyond that depth will be
+        ignored.
+        XXX this is better done in the view layer, remove it.
+        
+        """
+        if did is None: did = {}
+        got = []
+        for n in nodes:
+            been_there = did.has_key(n)
+            did[n] = None
+            if self.childmap().has_key(n) and not depth==0:
+                children = self.childmap()[n]
+                if children:
+                    subgot = [n]
+                    if not been_there:
+                        subgot.extend(
+                            self.offspring(children,
+                                           depth=(depth and depth-1),
+                                           did=did))
+                    got.append(subgot)
+                else:
+                    got.append(n)
+            else:
+                got.append(n)
+        return got
+
+# helper functions
+
+def descend_ancestors(page, ancestors, did, children):
+    """
+    Create nesting of ancestors leading to page.
+
+    page is the name of the subject page.
+    ancestors is a mapping whose keys are pages that are ancestors of page
+    children is a mapping whose keys are pages children, and the values
+       are the children's parents.
+
+    Do not repeat ones we already did.
+    """
+    got = []
+    for c in ((children.has_key(page) and children[page]) or []):
+        if not ancestors.has_key(c):
+            # We don't descend offspring that are not ancestors.
+            got.append(c)
+        elif ((children.has_key(c) and children[c]) or []):
+            if did.has_key(c):
+                # We only show offspring of ancestors once...
+                got.append([c])
+            else:
+                # ... and this is the first time.
+                did[c] = None
+                got.append(descend_ancestors(c, ancestors, did, children))
+        else:
+            got.append(c)
+    got.sort()                  # Terminals will come before composites.
+    got.insert(0, page)
+    return got
+
+# copied from Utils to avoid zope dependencies
+def flatten(recursiveList):
+    """
+    Flatten a recursive list/tuple structure.
+    """
+    flatList = []
+    for i in recursiveList:
+        if type(i) in (ListType,TupleType): flatList.extend(flatten(list(i)))
+        else: flatList.append(i)
+    return flatList
+
+flatten2 = lambda l,f=lambda L,F : type(L) != type([]) and [L] or reduce(lambda a,b,F=F : a + F(b,F), L, []) :f(l,f)
+

Added: zope-zwiki/branches/upstream/current/OutlineSupport.py
===================================================================
--- zope-zwiki/branches/upstream/current/OutlineSupport.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/OutlineSupport.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1050 @@
+# zwiki page hierarchy functionality
+# based on original code by Ken Manheimer
+#
+# The PageOutlineSupport mixin manages the wiki's page hierarchy, making use
+# of the more generic Outline class.  It is broken into several smaller
+# mixins to help keep things organized.
+#
+# glossary:
+#  primary parent: our designated parent page, or the first if more than one
+#  siblings: pages which share a parent with us
+#  context: our parents and their parents up to the top, and maybe our siblings
+#  children: pages for which we are a parent
+#  offspring: all our children and their children to the bottom
+#  subtopics: end-user name for offspring or children
+#  nesting: nested list structure representing a piece of hierarchy
+#  outline: an Outline object, encapsulatng a nesting and other info
+#  wiki outline, page hierarchy: the hierarchy of pages within a wiki
+#
+# todo:
+# evaluate experimental separate outline structure
+# -cache wiki nesting structure on folder
+# -encapsulate it as an Outline object
+# -make code work with an Outline object
+# -move generic operations there
+# -remove getWikiParentInfo
+# -add mutators to help with syncing
+# -add
+# -delete
+# -replace
+# -reparent
+# -add tests and keep it synced in parallel with parents attributes
+# -keep it synced during rename
+# -keep it synced during create
+# -keep it synced during delete
+# -keep it synced during reparent
+# -keep it synced during ZMI operations
+# -check mutators for persistence compatibility ?
+# -refactor PageOutlineSupport
+# try dropping parents property/index/metadata
+# upgrade process
+# code cleanup/renaming
+# simplify Outline implementation
+# remove Outline/nesting split ?
+# refactor/simplify OutlineRendering
+
+from __future__ import nested_scopes
+import string, re
+from string import join
+from types import *
+from urllib import quote, unquote
+
+from AccessControl import ClassSecurityInfo
+import Acquisition
+from App.Common import absattr
+from Globals import InitializeClass, REPLACEABLE
+import Persistence
+from OFS.SimpleItem import SimpleItem
+
+import Permissions
+from Utils import flatten, BLATHER
+from Defaults import PAGE_METATYPE
+from Regexps import bracketedexpr
+import Outline
+
+from I18n import _
+
+def deepappend(nesting, page):
+    """
+    Append a page to the very bottom of a nesting.
+    """
+    if type(nesting[-1]) is type([]):
+        nesting[-1] = deepappend(nesting[-1], page)
+    else:
+        if len(nesting) is 1: nesting.append(page)
+        else: nesting[-1] = [nesting[-1],page]
+    return nesting
+
+class PersistentOutline(Outline.Outline, SimpleItem):
+    """
+    I am a persistent version of Outline.
+
+    XXX do my mutators need to do more of this sort of thing ?:
+    # do an attr assignment in case we ever cache this as a persistent object
+    if childmap.has_key(parent): pchildren = childmap[parent]
+    else: pchildren = []
+    if name not in pchildren: pchildren.append(name)
+    childmap[parent] = pchildren
+    or:
+    self._p_changed = 1...
+    """
+    meta_type = 'Zwiki Outline Cache'
+    # always create with this id:
+    id = 'outline'
+    # these objects get auto-generated by ZWikiPage's manage_afterAdd
+    # causing problems for the ATCT migrator in plone 2.1rc<=3. To avoid
+    # it, allow them to be overwritten without complaint.  Maybe drop this
+    # later though, the outline cache can contain valuable ordering
+    # information ?
+    __replaceable__ = REPLACEABLE
+
+InitializeClass(PersistentOutline)
+
+
+class ParentsProperty:
+    """
+    I provide the parents property, the old way to store page hierarchy.
+
+    For now we keep this property up to date, in sync with the wiki
+    outline, but we'll try removing it completely at some point. (?)
+
+    Although it's a simple and relatively robust design, it doesn't scale
+    so well: generating the hierarchy structure from the parents
+    properties each time is expensive, and although modifying
+    decentralized parents properties seems better than a shared outline
+    object from the perspective of avoiding conflict errors, you still
+    need to update the central catalog so there may be no great advantage.
+    """
+    security = ClassSecurityInfo()
+
+    parents = []
+    _properties=(
+        {'id':'parents', 'type': 'lines', 'mode': 'w'},
+        )
+
+    def ensureParentsPropertyIsList(self):
+        """
+        Ensure our parents property is a list, returning true if changed.
+
+        Zope lines properties switched from tuple to list a while back,
+        and lingering tuples cause ongoing breakage.  Called by upgrade,
+        ensureValidParents and accessors for maximum robustness.
+        """
+        if type(self.parents) != ListType:
+            BLATHER("converting %s's parents property to a list" % self.pageName())
+            self.setParents(self.parents)
+            return True
+        else:
+            return False
+
+    # I'd call this parents, but too many upgrade hassles ?
+    def getParents(self):
+        """
+        Robust accessor returning a copy of our parents list.
+        """
+        return list(self.parents)
+
+    def setParents(self,parents):
+        parents = list(parents)
+        parents.sort()
+        self.parents = parents
+
+    def addParent(self,parent):
+        if parent:
+            # we sometimes start page names with space as a subtopic
+            # ordering hack.. 
+            #parent = string.strip(parent)
+            if parent and not parent in self.parents:
+                self.ensureParentsPropertyIsList()
+                self.parents.append(parent)
+
+    def removeParent(self,parent):
+        self.ensureParentsPropertyIsList()
+        try: self.parents.remove(parent)
+        except ValueError:
+            BLATHER("failed to remove %s from %s's parents (%s)" \
+                 % (parent,self.getId(),self.parents))
+
+    def ensureValidParents(self):
+        """
+        Ensure that this page's parents are all valid, and reindex if needed.
+        """
+        parents = self.getParents()
+        # convert to exact page names, filtering out any which don't exist
+        cleanedupparents = map(lambda x:absattr(x.Title),
+                               filter(lambda x:x,
+                                      map(lambda x:self.pageWithName(x),
+                                          parents)))
+        # make sure we're not parented under ourself
+        if self.pageName() in cleanedupparents:
+            cleanedupparents.remove(self.pageName())
+        # sort
+        cleanedupparents.sort()
+        # if changed, save and reindex
+        if cleanedupparents != parents:
+            BLATHER("adjusting %s's parents from %s to %s" % 
+                 (self.pageName(), parents, cleanedupparents))
+            self.setParents(cleanedupparents)
+            self.index_object() #XXX only need to update parents index & metadata
+
+InitializeClass(ParentsProperty) 
+
+
+class ShowSubtopicsProperty:
+    """
+    I determine when to display subtopics on a page.
+    """
+    security = ClassSecurityInfo()
+
+    def subtopicsEnabled(self,**kw):
+        """
+        Decide in a complicated way if this page should display it's subtopics.
+
+        First, if the folder has a show_subtopics property (can acquire)
+        and it's false, we will never show subtopics.  Otherwise look for
+        a show_subtopics property
+        - in REQUEST
+        - on the current page
+        - on our primary ancestor pages, all the way to the top,
+        and return the first one we find. Otherwise return true.
+        """
+        prop = 'show_subtopics'
+        if getattr(self.folder(),prop,1):
+            if kw.has_key(prop):
+                return kw[prop] and 1
+            elif hasattr(self,'REQUEST') and hasattr(self.REQUEST,prop):
+                return getattr(self.REQUEST,prop) and 1
+            elif hasattr(self.aq_base,prop):
+                return getattr(self,prop) and 1
+            elif self.primaryParent():
+                # poor caching
+                try: return self.primaryParent().subtopicsEnabled() 
+                except:
+                    # experimental: support all-brains
+                    try: return self.primaryParent().getObject().subtopicsEnabled() 
+                    except: # XXX still run into errors here, investigate
+                        BLATHER('DEBUG: error in subtopicsEnabled for %s, primaryParent is: %s'\
+                             % (self.id(),`self.primaryParent()`))
+                        return not (getattr(getattr(self,'REQUEST',None),
+                                            'zwiki_displaymode',
+                                            None) == 'minimal')
+            else:
+                #return not (getattr(getattr(self,'REQUEST',None),
+                #                    'zwiki_displaymode',
+                #                    None) == 'minimal')
+                return 1
+        else:
+            return 0
+
+    def subtopicsPropertyStatus(self):
+        """
+        Get the status of the show_subtopics property on this page.
+
+        no property:    -1 ("default")
+        true property:   1 ("always")
+        false property:  0 ("never")
+        """
+        if not hasattr(self.aq_base,'show_subtopics'): return -1
+        else: return self.show_subtopics and 1
+
+    def setSubtopicsPropertyStatus(self,status,REQUEST=None):
+        """
+        Set, clear or remove this page's show_subtopics property.
+
+        Same values as getSubtopicsStatus.
+        """
+        props = map(lambda x:x['id'], self._properties)
+        if status == -1:
+            if 'show_subtopics' in props:
+                self.manage_delProperties(ids=['show_subtopics'],
+                                          REQUEST=REQUEST)
+        elif status:
+            if not 'show_subtopics' in props:
+                self.manage_addProperty('show_subtopics',1,'boolean',
+                                        REQUEST=REQUEST)
+            else:
+                self.manage_changeProperties(show_subtopics=1,
+                                             REQUEST=REQUEST)
+        else:
+            if not 'show_subtopics' in props:
+                self.manage_addProperty('show_subtopics',0,'boolean',
+                                        REQUEST=REQUEST)
+            else:
+                self.manage_changeProperties(show_subtopics=0,
+                                             REQUEST=REQUEST)
+
+InitializeClass(ShowSubtopicsProperty)
+
+
+class OutlineManager:
+    """
+    I manage and query a cached outline object for the wiki.
+
+    When first accessed I create a PersistentOutline based on the parents
+    properties and store it in the wiki folder.  This can be queried more
+    efficiently.
+
+    old:
+    KM: We could make this a persistent object and minimize recomputes.
+    Put it in a standard place in the wiki's folder, or have the pages in
+    a folder share an instance, but use a single persistent one which need
+    not recompute all the relationship maps every time - just needs to
+    compare all pages parents settings with the last noticed parents
+    settings, and adjust the children, roots, and parents maps just for
+    those that changed.
+    """
+    security = ClassSecurityInfo()
+
+    # mutators
+
+    def wikiOutline(self):
+        """
+        Get the outline cache which holds details of the wiki's page hierarchy.
+
+        We'll generate it if needed, ie if it's missing or if it's one of
+        the older types which get lost during a folder rename or when
+        moving pages to a new folder.
+
+        This is called by any method which requires the outline cache, and
+        also by upgrade() on each page view, to ensure that renaming or
+        moving an old wiki just works without requiring the user to
+        manually updateWikiOutline.
+        """
+        if (not hasattr(self.folder().aq_base,'outline')
+            or not self.folder().outline):
+            self.updateWikiOutline()
+        return self.folder().outline
+
+    security.declareProtected(Permissions.View, 'updateWikiOutline')
+    def updateWikiOutline(self):
+        """
+        Regenerate the wiki folder's cached outline object.
+
+        The wiki's outline object (a PersistentOutline) is a
+        representation of the page hierarchy, containing the same
+        information as in the pages' parents properties but in a form
+        easier to query. This method either generates a new one from the
+        parents properties, or updates an old one trying to preserve the
+        order of subtopics. Complications.
+
+        This checks and corrects any invalid parents information.  It also
+        loads all page objects from the ZODB, which is probably ok as this
+        is not done frequently.
+        """
+        BLATHER('regenerating outline data for wiki',self.folder().getId())
+        oldchildmap = {}
+        # backwards compatibility
+        # there have been three kinds of outline cache: folder attribute,
+        # non-SimpleItem-based PersistentOutline object, and
+        # SimpleItem-based PersistentOutline object
+        # a pre-0.39 outline is just an attribute, delete (but save childmap)
+        if (hasattr(self.folder().aq_base,'outline') and
+            not 'outline' in self.folder().objectIds()):
+            oldchildmap = self.folder().outline.childmap()
+            del self.folder().outline
+        # if there's no outline object, make one
+        if not hasattr(self.folder().aq_base,'outline'):
+            self.folder()._setObject('outline', PersistentOutline())
+            self.folder().outline.setChildmap(oldchildmap)
+        # regenerate the parentmap
+        parentmap = {}
+        for p in self.pageObjects():
+            p.ensureValidParents() # poor caching
+            parentmap[p.pageName()] = p.getParents()
+        self.folder().outline.setParentmap(parentmap)
+        # update the childmap (without losing subtopics order) and nesting
+        self.folder().outline.update()
+
+    # easier-to-type alias ? XXX remove ? updateoutline ?
+    updatecontents = updateWikiOutline
+        
+    security.declareProtected(Permissions.Reparent, 'reparent')
+    def reparent(self, parents=[], REQUEST=None, pagename=None):
+        """
+        Move this page under the named parent pages in the wiki outline.
+
+        parent page names may be passed in several ways:
+        - in the parents argument (a list or string of page names)
+        - in the pagename argument (a single name)
+        (this last is to support the page management form).
+
+        Page names may be ids, or fuzzy, even partial. Any which do not
+        resolve to an existing page or are duplicates will be ignored.
+        """
+        oldparents = self.getParents()
+        # clean the arguments carefully to avoid parenting anomalies
+        # page mgmt form must use pagename field:
+        if pagename:
+            parents = [pagename] 
+        # or parents might be a string
+        elif type(parents) != ListType:
+            parents = [parents] 
+        # empty strings are common, remove before calling pageWithFuzzyName
+        parents = filter(lambda x:x, parents)
+        # look up the page (brain) corresponding to each (fuzzy) parent name
+        parents = map(lambda x:self.pageWithFuzzyName(x,allow_partial=1),
+                      parents)
+        # strip out Nones (pages not found)
+        parents = filter(lambda x:x, parents)
+        # convert back to proper page names
+        parents = map(lambda x:absattr(x.Title), parents)
+        # remove any duplicates
+        uniqueparents = []
+        for p in parents:
+            if not p in uniqueparents: uniqueparents.append(p)
+            
+        # finally - update our parents property, the outline cache, and catalog
+        self.setParents(uniqueparents) 
+        self.wikiOutline().reparent(self.pageName(),uniqueparents)
+        self.index_object()
+
+        # send mail if appropriate
+        self.sendMailToEditSubscribers(
+            '%s was reparented from %s to %s.' % (
+              self.pageName(), oldparents, uniqueparents),
+            REQUEST=REQUEST,
+            subject='(reparented)')
+
+        if REQUEST is not None: REQUEST.RESPONSE.redirect(REQUEST['URL1'])
+
+    security.declareProtected(Permissions.Reparent, 'reorder')
+    def reorder(self, child, REQUEST=None):
+        """
+        Move child one place to the left among this page's children.
+
+        Ordering is only stored in the wiki outline cache, and will be
+        lost if the outline is completely regenerated.
+
+        When invoked from the web, redirects to /backlinks.
+        """
+        if not child in self.childrenAsList(): return
+        self.wikiOutline().reorder(self.pageName(),child)
+        if REQUEST is not None: REQUEST.RESPONSE.redirect(REQUEST['URL1']+'/backlinks')
+
+    # queries
+
+    def primaryParentName(self):
+        """
+        Get the name of this page's primary (alphabetically first) parent.
+        """
+        return self.wikiOutline().firstParent(self.pageName())
+
+    def primaryParent(self):
+        """
+        Return this page's primary parent page.
+        """
+        p = self.primaryParentName()
+        if p: return self.pageWithName(p)
+        else: return None
+
+    def primaryParentUrl(self):
+        """
+        Get the URL of this page's primary parent.
+        """
+        p = self.primaryParent()
+        if p: return p.pageUrl()
+        else: return None
+
+    def upUrl(self):
+        """
+        Get the URL of whatever is "above" this page.
+        """
+        return self.primaryParentUrl() or self.defaultPageUrl()
+
+    security.declareProtected(Permissions.View, 'firstPage')
+    def firstPage(self):
+        """
+        Get the name of the first page in the hierarchy.
+        """
+        return self.wikiOutline().first()
+
+    security.declareProtected(Permissions.View, 'firstPageUrl')
+    def firstPageUrl(self):
+        """
+        Get the URL of the first page in the hierarchy.
+        """
+        p = self.pageWithName(self.firstPage())
+        if p: return p.pageUrl()
+        else: return None
+
+    security.declareProtected(Permissions.View, 'lastPage')
+    def lastPage(self):
+        """
+        Get the name of the last page in the hierarchy.
+        """
+        return self.wikiOutline().last()
+
+    security.declareProtected(Permissions.View, 'lastPageUrl')
+    def lastPageUrl(self):
+        """
+        Get the URL of the last page in the hierarchy.
+        """
+        p = self.pageWithName(self.lastPage())
+        if p: return p.pageUrl()
+        else: return None
+
+    security.declareProtected(Permissions.View, 'nextPage')
+    def nextPage(self):
+        """
+        Get the name of the next page in the hierarchy.
+
+        XXX nextPageName ?
+        """
+        return self.wikiOutline().next(self.pageName())
+
+    security.declareProtected(Permissions.View, 'nextPageUrl')
+    def nextPageUrl(self):
+        """
+        Get the URL of the next page in the hierarchy.
+        """
+        p = self.pageWithName(self.nextPage())
+        if p: return p.pageUrl()
+        else: return None
+
+    security.declareProtected(Permissions.View, 'previousPage')
+    def previousPage(self):
+        """
+        Get the name of the previous page in the hierarchy.
+        """
+        return self.wikiOutline().previous(self.pageName())
+
+    security.declareProtected(Permissions.View, 'previousPageUrl')
+    def previousPageUrl(self):
+        """
+        Get the URL of the previous page in the hierarchy.
+        """
+        p = self.pageWithName(self.previousPage())
+        if p: return p.pageUrl()
+        else: return None
+
+    security.declareProtected(Permissions.View, 'ancestorsAsList')
+    def ancestorsAsList(self, REQUEST=None):
+        """
+        Return the names of all my ancestor pages as a flat list, eldest first.
+
+        If there are multiple lines of ancestry, return only the first.
+        """
+        try: return flatten(self.ancestorsNesting())[:-1]
+        except: return [] # XXX temp, get rid of
+
+    security.declareProtected(Permissions.View, 'siblingsAsList')
+    def siblingsAsList(self):
+        """
+        Return the names of other pages sharing my first parent.
+
+        Siblings by my other parents are ignored.
+        """
+        return self.wikiOutline().siblings(self.pageName())
+
+    security.declareProtected(Permissions.View, 'childrenAsList')
+    def childrenAsList(self):
+        """
+        Return the list of names of my immediate children, if any.
+        """
+        return self.wikiOutline().children(self.pageName())
+
+    security.declareProtected(Permissions.View, 'childrenIdsAsList')
+    def childrenIdsAsList(self, REQUEST=None):
+        """
+        Return all my children's page ids as a flat list.
+        """
+        return map(lambda x:absattr(self.pageWithNameOrId(x).id),
+                   self.childrenAsList())
+
+    security.declareProtected(Permissions.View, 'offspringAsList')
+    def offspringAsList(self, REQUEST=None):
+        """
+        Return my offsprings' page names as a flat list, excluding my name.
+        """
+        list = flatten(self.offspringNesting())
+        list.remove(self.pageName())
+        return list
+
+    security.declareProtected(Permissions.View, 'offspringIdsAsList')
+    def offspringIdsAsList(self, REQUEST=None):
+        """
+        Return my offsprings' page ids as a flat list.
+        """
+        return map(lambda x:absattr(self.pageWithNameOrId(x).id),
+                   self.offspringAsList())
+
+    # queries returning nestings (lists-of-lists) - a low-level
+    # representation of all or part of the wiki outline, which can be
+    # processed by certain render methods. See also nestingAsRenderList's
+    # docstring.
+
+    def ancestorsNesting(self):
+        """
+        Return a nesting representing this page's ancestors.
+        """
+        return self.wikiOutline().ancestors(self.pageName())
+
+    def ancestorsAndSiblingsNesting(self):
+        """
+        Return a nesting representing this page's ancestors and siblings.
+        """
+        return self.wikiOutline().ancestorsAndSiblings(self.pageName())
+
+    def ancestorsAndChildrenNesting(self):
+        """
+        Return a nesting representing this page's ancestors and children.
+        """
+        return self.wikiOutline().ancestorsAndChildren(self.pageName())
+
+    def childrenNesting(self):
+        """
+        Return a nesting representing this page's children.
+        """
+        return self.wikiOutline().children(self.pageName())
+
+    def offspringNesting(self,depth=None):
+        """
+        Return a nesting representing this page's descendants.
+        """
+        return self.wikiOutline().offspring([self.pageName()],depth=depth)
+
+InitializeClass(OutlineManager)
+
+
+class OutlineRendering:
+    """
+    I present various parts of the wiki outline as HTML.
+
+    Some code cleanup here would be nice.
+    """
+    security = ClassSecurityInfo()
+
+    security.declareProtected(Permissions.View, 'contents')
+    def contents(self, REQUEST=None, here=None):
+        """
+        Show the entire page hierarchy, using the contentspage template.
+
+        Includes all the branches in the wiki - from the possibly multiple
+        roots - and all singletons, ie those without parents or children.
+        The page named by here, or the current page, will be highlighted
+        with "you are here".
+        """
+        nesting = self.wikiOutline().nesting()
+        singletons = []
+        combos = []
+        baseurl = self.wiki_url()
+        for i in nesting:
+            if type(i) == StringType:
+                #try:
+                #    # XXX poor caching ?
+                #    linktitle = self.folder()[i].linkTitle()
+                #except:
+                linktitle = ''
+                singletons.append(\
+                    '<a href="%s/%s" name="%s" title="%s">%s</a>'\
+                    % (baseurl, self.canonicalIdFrom(i), quote(i),
+                       linktitle,
+                       self.formatWikiname(i)))
+            else:
+                combos.append(i)
+        # this view is often invoked via a default page, not the current one,
+        # to reduce bot traffic (see contentsUrl). Try to figure out the
+        # current page for "you are here".
+        here = unquote(here or self.referringPageName() or '')
+        return self.contentspage(
+            self.renderNesting(combos,here=here),
+            singletons,
+            REQUEST=REQUEST)
+
+    def referringPageId(self,REQUEST=None):
+        """
+        If the referrer was a page in this wiki, return its id, or None.
+        """
+        if not REQUEST: REQUEST = self.REQUEST
+        if not REQUEST: return None
+        referrer = REQUEST.get('HTTP_REFERER', None)
+        if not referrer: return None
+        m = re.match(r'^'+re.escape(self.wikiUrl())+r'/?([^?#/]*)', referrer)
+        if m: return m.group(1)
+        else: return None
+
+    def referringPageName(self,REQUEST=None):
+        """
+        If the referrer was a page in this wiki, return its name, or None.
+        """
+        id = self.referringPageId(REQUEST=REQUEST)
+        if id:
+            p = self.pageWithId(id)
+            if p: return p.pageName()
+        return None
+
+    security.declareProtected(Permissions.View, 'context')
+    def context(self, REQUEST=None, with_siblings=0, enlarge_current=0):
+        """
+        Return HTML showing this page's ancestors and siblings.
+
+        XXX how can we use a page template for this ? macro ?
+        """
+        # get the nesting structure
+        here = self.pageName()
+        if with_siblings:
+            nesting = self.ancestorsAndSiblingsNesting()
+        else:
+            # why does the above require a nesting and not this one ?
+            # nesting = self.get_ancestors()
+            #nesting = WikiNesting(self.folder()).get_ancestors(here,self)
+            nesting = self.ancestorsNesting()
+            # XXX looks like cruft
+            if (len(nesting) == 0  or
+                (len(nesting) == 1 and len(nesting[0]) == 1)) and not enlarge_current:
+                return "&nbsp;"
+
+        # format and link it
+        # backwards compatibility: in case of an old editform template
+        # which shows context, include the new page name at the bottom (unlinked)
+        if REQUEST and REQUEST.has_key('page') and REQUEST['page'] != here:
+            here = REQUEST['page']
+            nesting = deepappend(nesting, here)
+            suppress_hyperlink=1
+        else:
+            suppress_hyperlink=0
+        hierarchy = self.renderNesting(
+            nesting, here,
+            enlarge_current=enlarge_current,
+            suppress_hyperlink=suppress_hyperlink)
+        # special case: if parent seems to be missing, reset
+        # XXX will not match ? clean up
+        if hierarchy == '<ul>\n</ul>':
+            self.setParents([])
+            self.index_object()
+            hierarchy = self.renderNesting(
+                nesting, here, 
+                enlarge_current=enlarge_current,
+                suppress_hyperlink=suppress_hyperlink)
+        # if a SiteMap page exists, point the contents link there
+        contentsurl = self.contentsUrl()
+        contentslink = \
+          '<a href="%s" title="show wiki contents">%s contents</a>' \
+          % (contentsurl, self.folder().title)
+        #with a contents link
+        #return '<small><ul>%s\n%s\n</ul></small>' % (contentslink,hierarchy)
+        #XXX temp
+        if self.usingPloneSkin():
+            return '%s\n' % (hierarchy)
+        else:
+            return '<small>%s\n</small>' % (hierarchy)
+
+    security.declareProtected(Permissions.View, 'contextX')
+    def contextX(self, REQUEST=None, with_siblings=0):
+        """
+        Return this page's context information as a skin-renderable structure.
+
+        Like context, but allows a skin template to control the rendering.
+        See nestingAsRenderList.
+        """
+        if with_siblings:
+            nesting = self.ancestorsAndChildrenNesting()
+        else:
+            nesting = self.ancestorsNesting()
+
+        # backwards compatibility: in case of an old editform template
+        # which shows context, include the new page name at the bottom (unlinked)
+        here = self.pageName()
+        if REQUEST.has_key('page') and REQUEST['page'] is not here:
+            here = REQUEST['page']
+            nesting = deepappend(nesting, here)
+            suppress_hyperlink=1
+        else:
+            suppress_hyperlink=0
+
+        # convert to a render list
+        renderlist = self.nestingAsRenderList(nesting, here)
+        # special case: if parent seems to be missing, reset XXX
+        if len(renderlist) == 2 :
+            self.setParents([])
+            self.index_object()
+            renderlist = self.nestingAsRenderList(nesting, here)
+
+        return {'contentsUrl':self.contentsUrl(), 'hierarchy':renderlist}
+
+    security.declareProtected(Permissions.View, 'children')
+    def children(self):
+        """
+        Return HTML showing my immediate children, if any.
+        """
+        children = self.childrenAsList()
+        if children:
+            return self.renderNesting(children)
+        else:
+            return ''
+
+    security.declareProtected(Permissions.View, 'offspring')
+    def offspring(self, REQUEST=None, info=None, exclude_self=0, depth=None):
+        """
+        Return HTML displaying all my offspring.
+        """
+        here = self.pageName()
+        return self.renderNesting(
+            self.offspringNesting(depth=depth),here,suppress_current=exclude_self)
+
+    security.declareProtected(Permissions.View, 'subtopics')
+    def subtopics(self, REQUEST=None, **kw):
+        """
+        Render my subtopics as a HTML fragment, using a template.
+
+        Allows the template to be selected by subtopics_style folder
+        property. If there is no property or the specified template
+        does not exist, uses the built-in subtopics_outline.
+        Some overlap with the show_subtopics property.
+
+        Pass any arguments, like max depth, through to the template.
+        """
+        DEFAULTSTYLE = 'outline'
+        style = getattr(self,'subtopics_style',None)
+        if not (style and self.hasSkinTemplate('subtopics_'+style)):
+            style = DEFAULTSTYLE
+        return self.getSkinTemplate('subtopics_'+style)(self,REQUEST,**kw)
+
+    security.declareProtected(Permissions.View, 'navlinks')
+    def navlinks(self):
+        """
+        Return HTML for my next/previous/up links.
+
+        XXX not used ?
+        """
+        none = 'none'
+        t = ''
+        prev, next = self.previousPage(), self.nextPage()
+        if prev: prev = self.renderLink('['+prev+']',access_key='P')
+        else: prev = none
+        if next: next = self.renderLink('['+next+']',access_key='N')
+        else: next = none
+        t += '<span class="accesskey">n</span>ext:&nbsp;%s <span class="accesskey">p</span>revious:&nbsp;%s' \
+             % (next,prev) # Info style!
+        t += ' <span class="accesskey">u</span>p:&nbsp;%s' \
+             % ((self.parents and self.renderLink('['+self.primaryParentName()+']',
+                                                  access_key='U'))
+                or none)
+        #if contents:
+        #    contentsurl = self.contentsUrl()
+        #    contentslink = \
+        #      '<a href="%s" title="show wiki contents">contents</a>'\
+        #      % (contentsurl)
+        #    t += ' contents:&nbsp;%s' % contentslink
+        return t
+
+    security.declareProtected(Permissions.View, 'renderNesting')
+    def renderNesting(self, nesting, here=None, enlarge_current=0,
+                      suppress_hyperlink=0, suppress_current=0,
+                      did=None, got=None, indent=''):
+        """
+        Format a nesting structure as HTML unordered lists of wiki links.
+
+        - nesting is the nesting to be formatted
+        - here is the name of the page to highlight with "you are here", if any
+        - if enlarge_current is true, here will be enlarged instead
+        - if suppress_hyperlink is true, here will not be linked
+          (backwards compatibility for old editforms)
+        - if suppress_current is true, here will not be shown at all
+        - did, got & indent are for recursion, callers should not use
+        
+        Do we need all this complicated code, can't we do it in the skin
+        template ? I think so, except for two issues: for very large
+        nestings the python version might be perceptibly quicker; and,
+        it's easier to recurse with python. See also nestingAsRenderList. 
+        """
+        # XXX oh yeah.. kludgorama
+        def renderContentsLink(page):
+            """Render a link to page, suitable for contents or context."""
+            # quicker than renderLinkToPage, since we know it exists:
+            wikiurl = self.wiki_url()
+            def quicklink(page):
+                id = self.canonicalIdFrom(page)
+                return '<a href="%s/%s" name="%s">%s</a>' \
+                       % (wikiurl,id,id,self.formatWikiname(page))
+            if here and page == here: 
+                if enlarge_current:
+                    # just assume we are in the page header, and link to
+                    # backlinks as well as enlarging
+                    #return '<big><big><big><big><strong>%s</strong></big></big></big></big>' % \
+                    return '<h1 style="display:inline;">%s</h1>' % \
+                           ('<a href="%s/%s/backlinks" title="%s" name="%s">%s</a>' % \
+                            (wikiurl,
+                             self.canonicalIdFrom(page),
+                             _("which pages link to this one ?"),
+                             page,
+                             self.formatWikiname(page)))
+                else:
+                    # just highlight "here"
+                    return '%s <span id="youarehere"><-- %s.</span>' % \
+                           ((suppress_hyperlink and page) # another special case
+                            or quicklink(page),
+                            _("You are here"))
+            else:
+                #return self.renderLinkToPage(page,name=page)
+                return quicklink(page)
+            
+        #XXX cleanup
+        if suppress_current and nesting[0] == here: # a single childless page
+            return ''
+        if did is None: did = []
+        if got is None:
+            got = ['<ul class="outline expandable">']
+            recursing = 0
+        else:
+            recursing = 1
+        for n in nesting:
+            if type(n) == ListType:
+                if not (n[0]==here and suppress_current): #XXX temp
+                    got.append('%s <li>%s' % (indent,renderContentsLink(n[0])))
+                if len(n) > 1:
+                    if not (n[0]==here and suppress_current): #XXX temp
+                        got.append('<ul class="outline expandable">')
+                    for i in n[1:]:
+                        if type(i) == ListType:
+                            got = self.renderNesting(
+                                [i],
+                                here=here,
+                                enlarge_current=enlarge_current,
+                                suppress_hyperlink=suppress_hyperlink,
+                                suppress_current=suppress_current,
+                                did=did,
+                                got=got,
+                                indent=indent+' ')
+                        else:
+                            got.append('%s <li>%s</li>' % (indent,renderContentsLink(i)))
+                    if not (n[0]==here and suppress_current): #XXX temp
+                        got.append("</ul>")
+                else:
+                    got[-1] += ' ...' # a parent whose children were omitted
+                if not (n[0]==here and suppress_current):
+                    got.append('%s </li>' % indent)
+            else:
+                got.append('%s <li>%s</li>' % (indent,renderContentsLink(n)))
+
+        if recursing:
+            return got
+        else:
+            got.append("</ul>")
+            return join(got, "\n")
+
+    security.declareProtected(Permissions.View, 'nestingAsRenderList')
+    def nestingAsRenderList(self, nesting, here=None, suppress_current=0,
+                      did=None, got=None, indent=''):
+        """
+        Convert a nesting structure to a skin-renderable intermediate form.
+
+        This was renderNestingX in Dan McMullen's skin refactoring
+        (http://zwiki.org/WikipageX). The intermediate form is a flat list
+        which a skin template can render without needing recursion.
+
+        Example: a chunk of page hierarchy like::
+
+          AnnoyingQuote
+            AnnoyingQuoteArchive
+              AngryDenial
+            AnnoyingQuoteDiscussion
+
+        which is stored as a nesting like::
+
+          [['AnnoyingQuote', ['AnnoyingQuoteArchive', 'AngryDenial'], 'AnnoyingQuoteDiscussion']]        
+
+        gets converted to a render list like::
+
+          [
+          {'type': '+'}, 
+          {'href': 'zwikib/AnnoyingQuote', 'type': '=', 'page': 'AnnoyingQuote', 'name': 'AnnoyingQuote'}, 
+          {'type': '+'}, 
+          {'href': 'zwikib/AnnoyingQuoteArchive', 'type': '=', 'page': 'AnnoyingQuoteArchive', 'name': 'AnnoyingQuoteArchive'}, 
+          {'type': '+'}, 
+          {'href': 'zwikib/AngryDenial', 'type': '=', 'page': 'AngryDenial', 'name': 'AngryDenial'}, 
+          {'type': '-'}, 
+          {'href': 'zwikib/AnnoyingQuoteDiscussion', 'type': '=', 'page': 'AnnoyingQuoteDiscussion', 'name': 'AnnoyingQuoteDiscussion'}, 
+          {'type': '-'}, 
+          {'type': '-'}
+          ]
+
+        which can be rendered by some TAL like::
+
+          <span tal:define="ctx python: here.contextX(request)">
+            <a href="contentsUrl" title="show wiki contents" accesskey="c"
+              tal:attributes="href ctx/contentsUrl"
+              tal:content="python: container.title + ' contents'">contents</a>
+            <span tal:repeat="ii ctx/hierarchy" tal:omit-tag="">
+              <span tal:condition="python: '+' in ii['type']"
+                tal:replace="structure string:<ul style=&quot;margin: 0;&quot;>">ul</span>
+              <span tal:condition="python: '=' in ii['type']">
+                <li tal:condition="python: '!' in ii['type']">
+                  <big><big><big><big><strong><a href="href" name="name"
+                  tal:attributes="href python: ii['href'] + '/backlinks'; name ii/name"
+                  tal:content="ii/page">page</a></strong></big></big></big></big>
+                  <span tal:condition="python: '.' in ii['type']"> ...</span>
+                </li>
+                <li tal:condition="python: '!' not in ii['type']">
+                  <a href="href" name="name"
+                    tal:attributes="href ii/href; name ii/name"
+                    tal:content="ii/page">page</a>
+                    <span tal:condition="python: '.' in ii['type']"> ...</span>
+                </li>
+              </span>
+              <span tal:condition="python: '-' in ii['type']"
+                tal:replace="structure string:</ul>">ultag</span>
+            </span>
+          </span>
+        """
+
+        if suppress_current and nesting[0] == here: # a single childless page
+            return []
+        if did is None: did = []
+        if got is None:
+            got = [ {'type':'+'} ]
+            recursing = 0
+        else:
+            recursing = 1
+        for n in nesting:
+            if type(n) == ListType:
+                if not (n[0]==here and suppress_current): #XXX temp
+                    t = (n[0]==here and '=!' or '=')
+                    got.append( {'type':t, 'page':str(n[0])} )
+                if len(n) > 1:
+                    if not (n[0]==here and suppress_current): #XXX temp
+                        got.append( {'type':'+'} )
+                    for i in n[1:]:
+                        if type(i) == ListType:
+                            got = self.nestingAsRenderList(
+                                [i],here,did=did,got=got,indent=indent+' ')
+                        else:
+                            t = (i==here and '=!' or '=')
+                            got.append( {'type':t, 'page':str(i)} )
+                    if not (n[0]==here and suppress_current): #XXX temp
+                        got.append( {'type':'-'} )
+                else:
+                    
+                    got[-1]['type'] += '.' # a parent whose children were omitted
+            else:
+                t = (n==here and '=!' or '=')
+                got.append( {'type':t, 'page':str(n)} )
+        if recursing: return got
+
+        # finish up, do pretty printing options and wiki links
+        got.append( {'type':'-'} )
+
+        wikiurl = self.wiki_url()
+        for g in got :
+            if '=' in g['type'] :
+                g['href'] = wikiurl + '/' + self.canonicalIdFrom(g['page'])
+                g['name'] = quote(g['page'])
+                
+        return got
+
+    # backwards compatibility
+    map = contents
+
+InitializeClass(OutlineRendering)
+
+class PageOutlineSupport(
+    ParentsProperty,
+    ShowSubtopicsProperty,
+    OutlineManager, 
+    OutlineRendering
+    ):
+    """
+    I make a page aware of it's place within the overall wiki outline
+    (page hierarchy).
+    """
+    pass

Added: zope-zwiki/branches/upstream/current/OutlineSupport_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/OutlineSupport_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/OutlineSupport_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,104 @@
+from testsupport import *
+ZopeTestCase.installProduct('ZCatalog')
+ZopeTestCase.installProduct('ZWiki')
+
+from Products.ZWiki.Outline import Outline
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    return suite
+
+def setupSomePageHierarchy(self):
+    self.page.create('RootPage')
+    self.wiki.RootPage.reparent(REQUEST=self.request)
+    self.wiki.RootPage.create('ChildPage')
+    self.wiki.ChildPage.create('GrandChildPage')
+    self.page.create('SingletonPage')
+    self.wiki.SingletonPage.reparent(REQUEST=self.request)
+
+class Tests(ZwikiTestCase):
+    def afterSetUp(self):
+        ZwikiTestCase.afterSetUp(self)
+        setupSomePageHierarchy(self)
+
+    def beforeTearDown(self):
+        # this usually gets generated.. clear it so next tests
+        # will get a fresh one
+        self.wiki._delObject('outline')
+
+    def test_wikiOutline(self):
+        self.assert_(hasattr(self.wiki,'outline'))
+        o = self.page.wikiOutline()
+        self.assertEquals(o,self.wiki.outline)
+        self.assertEquals(o.nesting(),
+                          [['RootPage',
+                            ['ChildPage',
+                             'GrandChildPage']],
+                           'SingletonPage',
+                           'TestPage',
+                           ])
+        # stray empty parents should be ignored
+        self.wiki.TestPage.parents = ['']
+        self.wiki.ChildPage.parents.append('')
+        o = self.page.wikiOutline()
+        self.assertEquals(o.nesting(),
+                          [['RootPage',
+                            ['ChildPage',
+                             'GrandChildPage']],
+                           'SingletonPage',
+                           'TestPage',
+                           ])
+        self.assertEquals(o.parentmap()['TestPage'],[])
+        self.assertEquals(o.parentmap()['ChildPage'],['RootPage'])
+        
+    def test_context(self):
+        self.assertEquals(self.wiki.RootPage.context(),
+                          '&nbsp;') # XXX should be as below I think
+        self.assertEquals(self.wiki.RootPage.context(with_siblings=1),
+                          '<small><ul class="outline expandable">\n <li><a href="http://nohost/test_folder_1_/wiki/RootPage" name="RootPage">RootPage</a> <span id="youarehere"><-- You are here.</span> ...\n </li>\n</ul>\n</small>'
+                          )
+        self.assertEquals(self.wiki.ChildPage.context(),
+                          '<small><ul class="outline expandable">\n <li><a href="http://nohost/test_folder_1_/wiki/RootPage" name="RootPage">RootPage</a>\n<ul class="outline expandable">\n <li><a href="http://nohost/test_folder_1_/wiki/ChildPage" name="ChildPage">ChildPage</a> <span id="youarehere"><-- You are here.</span></li>\n</ul>\n </li>\n</ul>\n</small>'
+                          )
+        
+    def test_reparent(self):
+        p = self.wiki.SingletonPage
+        self.wiki.RootPage.create('Parent Page')
+        self.wiki.RootPage.create('Parent Page 2')
+        self.wiki.RootPage.create('Parent Page 3')
+        # no args clears parents
+        p.parents = ['old']
+        p.reparent(REQUEST=self.request)
+        self.assertEquals(p.parents,[])
+        # invalid page names are stripped
+        p.reparent(parents=['nosuchpage'],REQUEST=self.request)
+        self.assertEquals(p.parents,[])
+        # reparent by id, leaves title in parents
+        p.reparent(parents=['ParentPage'],REQUEST=self.request)
+        self.assertEquals(p.parents,['Parent Page'])
+        # reparent by fuzzy name
+        p.reparent(parents=[' Parent page 2..'],REQUEST=self.request)
+        self.assertEquals(p.parents,['Parent Page 2'])
+        # reparent by freeform name, as string
+        p.reparent(parents='Parent Page 3',REQUEST=self.request)
+        self.assertEquals(p.parents,['Parent Page 3'])
+        # duplicates are removed
+        p.reparent(parents=['ParentPage','Parent Page','parent-page'],
+                   REQUEST=self.request)
+        self.assertEquals(p.parents,['Parent Page'])
+        # the wiki outline object is also updated
+        self.assertEquals(p.wikiOutline().parents('SingletonPage'),
+                          ['Parent Page'])
+        p.reparent(parents=['TestPage'],REQUEST=self.request)
+        self.assertEquals(p.wikiOutline().parents('SingletonPage'),
+                          ['TestPage'])
+
+    def test_offspringIdsAsList(self):
+        self.assertEquals(self.wiki.RootPage.offspringIdsAsList(),
+                          ['ChildPage','GrandChildPage'])
+        self.assertEquals(self.wiki.ChildPage.offspringIdsAsList(),
+                          ['GrandChildPage'])
+        self.assertEquals(self.wiki.GrandChildPage.offspringIdsAsList(),
+                          [])
+

Added: zope-zwiki/branches/upstream/current/Outline_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/Outline_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Outline_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,206 @@
+from testsupport import *
+ZopeTestCase.installProduct('ZCatalog')
+ZopeTestCase.installProduct('ZWiki')
+from Products.ZWiki.Outline import Outline
+#or to test it alone, just set up your pythonpath and do
+#from Outline import Outline
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    return suite
+
+class Tests(unittest.TestCase):
+    def setUp(self):
+        self.outline = Outline(
+            {
+            'RootPage':[],
+            'ChildPage':['RootPage'],
+            'GrandChildPage':['ChildPage'],
+            'SingletonPage':[],
+            'TestPage':[],
+            })
+
+    def test_init(self):
+        o = Outline({1:[],2:[],3:[]})
+        self.assertEquals(o.nodeCount(),3)
+
+    def test_parentmap(self):
+        o = self.outline
+        parentmap = o.parentmap()
+        self.assertEquals(len(parentmap.keys()),5)
+        self.assertEquals(parentmap['RootPage'],[])
+        self.assertEquals(parentmap['ChildPage'],['RootPage'])
+        self.assertEquals(parentmap['GrandChildPage'],['ChildPage'])
+        self.assertEquals(parentmap['SingletonPage'],[])
+        self.assertEquals(parentmap['TestPage'],[])
+
+    def test_childmap(self):
+        o = self.outline
+        childmap = o.childmap()
+        self.assertEquals(len(childmap.keys()),5)
+        self.assertEquals(childmap['RootPage'],['ChildPage'])
+        self.assertEquals(childmap['ChildPage'],['GrandChildPage'])
+        self.assertEquals(childmap['GrandChildPage'],[])
+        self.assertEquals(childmap['SingletonPage'],[])
+        self.assertEquals(childmap['TestPage'],[])
+
+    def test_roots(self):
+        o = self.outline
+        self.assertEquals(o.roots(),['RootPage','SingletonPage','TestPage'])
+
+    def test_nodes(self):
+        o = self.outline
+        self.assertEquals(o.nodes(),
+                          ['ChildPage','GrandChildPage','RootPage',
+                           'SingletonPage','TestPage'])
+
+    def test_flat(self):
+        o = self.outline
+        self.assertEquals(o.flat(),
+                          ['RootPage','ChildPage','GrandChildPage',
+                           'SingletonPage','TestPage'])
+
+    def test_nesting(self):
+        o = self.outline
+        self.assertEquals(o.nesting(),
+                          [
+                           ['RootPage',
+                            ['ChildPage',
+                             'GrandChildPage']],
+                           'SingletonPage',
+                           'TestPage',
+                           ])
+        
+    def test_next(self):
+        o = self.outline
+        self.assertEquals(o.next('RootPage'),'ChildPage')
+        self.assertEquals(o.next('GrandChildPage'),'SingletonPage')
+        self.assertEquals(o.next('TestPage'),None)
+
+    def test_previous(self):
+        o = self.outline
+        self.assertEquals(o.previous('RootPage'),None)
+        self.assertEquals(o.previous('ChildPage'),'RootPage')
+        self.assertEquals(o.previous('SingletonPage'),'GrandChildPage')
+
+    def test_ancestors(self):
+        o = self.outline
+        self.assertEquals(o.ancestors('RootPage'),[['RootPage']])
+        self.assertEquals(o.ancestors('ChildPage'),[['RootPage','ChildPage']])
+        self.assertEquals(o.ancestors('GrandChildPage'),
+                          [['RootPage',['ChildPage','GrandChildPage']]])
+
+    def test_ancestorsAndSiblings(self):
+        o = self.outline
+        self.assertEquals(o.ancestorsAndSiblings('RootPage'),
+                          [['RootPage']])
+        self.assertEquals(o.ancestorsAndSiblings('ChildPage'),
+                          [['RootPage', 'ChildPage']])
+        self.assertEquals(o.ancestorsAndSiblings('GrandChildPage'),
+                          [['RootPage',['ChildPage','GrandChildPage']]])
+
+    def test_ancestorsAndChildren(self):
+        o = self.outline
+        self.assertEquals(o.ancestorsAndChildren('RootPage'),
+                          [['RootPage','ChildPage']])
+        self.assertEquals(o.ancestorsAndChildren('ChildPage'),
+                          [['RootPage', ['ChildPage','GrandChildPage']]])
+        self.assertEquals(o.ancestorsAndChildren('GrandChildPage'),
+                          [['RootPage',['ChildPage','GrandChildPage']]])
+
+    def test_offspring(self):
+        o = self.outline
+        self.assertEquals(o.offspring(['RootPage']),
+                          [['RootPage',['ChildPage','GrandChildPage']]])
+        self.assertEquals(o.offspring(['ChildPage']),
+                          [['ChildPage','GrandChildPage']])
+        self.assertEquals(o.offspring(['GrandChildPage']),
+                          ['GrandChildPage'])
+        self.assertEquals(o.offspring(['RootPage'],depth=1),
+                          [['RootPage','ChildPage']])
+        self.assertEquals(o.offspring(['RootPage'],depth=2),
+                          [['RootPage',['ChildPage','GrandChildPage']]])
+    
+    def test_parents(self):
+        o = self.outline
+        self.assertEquals(o.parents('RootPage'),[])
+        self.assertEquals(o.parents('ChildPage'),['RootPage'])
+
+    def test_siblings(self):
+        o = self.outline
+        self.assertEquals(o.siblings('RootPage'),['SingletonPage','TestPage'])
+        self.assertEquals(o.siblings('ChildPage'),[])
+
+    def test_children(self):
+        o = self.outline
+        self.assertEquals(o.children('RootPage'),['ChildPage'])
+        self.assertEquals(o.children('GrandChildPage'),[])
+
+    def test_add(self):
+        o = self.outline
+        self.assert_(not o.hasNode('NewPageOne'))
+        o.add('NewPageOne')
+        self.assert_(o.hasNode('NewPageOne'))
+
+    def test_delete(self):
+        o = self.outline
+        count = o.nodeCount()
+        o.delete('TestPage')
+        self.assertEquals(o.nodeCount(),count-1)
+        # any children should be reparented
+        self.assertEquals(o.nesting(),
+                          [
+                           ['RootPage',
+                            ['ChildPage',
+                             'GrandChildPage']],
+                           'SingletonPage',
+                           ])
+        o.delete('ChildPage')
+        self.assertEquals(o.nesting(),
+                          [
+                           ['RootPage',
+                            'GrandChildPage'],
+                           'SingletonPage',
+                           ])
+        parentmap = o.parentmap()
+        self.assertEquals(len(parentmap.keys()),3)
+        self.assertEquals(parentmap['RootPage'],[])
+        self.assertEquals(parentmap['GrandChildPage'],['RootPage'])
+        self.assertEquals(parentmap['SingletonPage'],[])
+        childmap = o.childmap()
+        self.assertEquals(len(childmap.keys()),3)
+        self.assertEquals(childmap['RootPage'],['GrandChildPage'])
+        self.assertEquals(childmap['GrandChildPage'],[])
+        self.assertEquals(childmap['SingletonPage'],[])
+        o.delete('RootPage')
+        self.assertEquals(o.nesting(),
+                          [
+                           'GrandChildPage',
+                           'SingletonPage',
+                           ])
+        parentmap = o.parentmap()
+        self.assertEquals(len(parentmap.keys()),2)
+        self.assertEquals(parentmap['GrandChildPage'],[])
+        self.assertEquals(parentmap['SingletonPage'],[])
+        childmap = o.childmap()
+        self.assertEquals(len(childmap.keys()),2)
+        self.assertEquals(childmap['GrandChildPage'],[])
+        self.assertEquals(childmap['SingletonPage'],[])
+
+    def test_replace(self):
+        o = self.outline
+        self.assert_(o.hasNode('TestPage'))
+        self.assert_(not o.hasNode('RenamedPage'))
+        children = o.children('TestPage')
+        o.replace('TestPage','RenamedPage')
+        self.assert_(not o.hasNode('TestPage'))
+        self.assert_(o.hasNode('RenamedPage'))
+        self.assertEquals(o.children('RenamedPage'),children)
+
+    def test_reparent(self):
+        o = self.outline
+        self.assertEquals(o.parents('ChildPage'),['RootPage'])
+        o.reparent('ChildPage',['TestPage'])
+        self.assertEquals(o.parents('ChildPage'),['TestPage'])
+

Added: zope-zwiki/branches/upstream/current/PageTypes.py
===================================================================
--- zope-zwiki/branches/upstream/current/PageTypes.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/PageTypes.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,4 @@
+# temporary backwards compatibility for LatexWiki
+
+from pagetypes.common import *
+from pagetypes import *

Added: zope-zwiki/branches/upstream/current/Permissions.py
===================================================================
--- zope-zwiki/branches/upstream/current/Permissions.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Permissions.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,22 @@
+######################################################################
+# ZWiki permissions
+
+from AccessControl.Permissions import view, manage_properties, \
+     add_documents_images_and_files, ftp_access
+View          = view
+Upload        = add_documents_images_and_files
+FTPRead = FTP = ftp_access
+
+AddWiki       = 'Zwiki: Add wikis'
+Add           = 'Zwiki: Add pages'
+Comment       = 'Zwiki: Add comments'
+ChangeType    = 'Zwiki: Change page types'
+Delete        = 'Zwiki: Delete pages'
+Edit          = 'Zwiki: Edit pages'
+Rename        = 'Zwiki: Rename pages'
+Rate          = 'Zwiki: Rate pages'
+Reparent      = 'Zwiki: Reparent pages'
+
+AddPage = Add
+Change = Edit
+Append = Comment

Added: zope-zwiki/branches/upstream/current/README
===================================================================
--- zope-zwiki/branches/upstream/current/README	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/README	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,8 @@
+A wiki engine for Zope. 
+
+For documentation and assistance, please see http://zwiki.org .
+All feedback, bug reports and other help appreciated.
+
+(c) 1999-2004 Simon Michael <simon at joyful.com> for the zwiki community.
+This product is released under the GNU General Public License.  
+All rights reserved, all disclaimers apply, etc.

Added: zope-zwiki/branches/upstream/current/REPO_POLICY
===================================================================
--- zope-zwiki/branches/upstream/current/REPO_POLICY	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/REPO_POLICY	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,22 @@
+Policies for the main ZWiki repository
+======================================
+
+In this code repository we recommend the following policies:
+
+- This is the official Zwiki project "trunk" repo, used for the
+  monthly Zwiki product releases and for running zwiki.org. The url is
+  http://zwiki.org/repos/ZWiki . A darcsweb interface is available at
+  http://joyful.com/darcsweb/darcsweb.cgi?r=ZWiki;a=summary .
+
+- Contributors to this repo should read and sign CONTRIBUTORS.txt,
+  which describes this repo's copyright and license policy.
+
+- To submit patches, use darcs send (or if you need the full url:
+  darcs send http://zwiki.org/repos/ZWiki). Patches are forwarded to
+  Simon Michael for approval.
+
+- (when I get this working..) Patches digitally signed by approved
+  committers are applied immediately.
+
+- (when I get this working..) Patches which would cause unit tests to
+  fail are rejected.

Added: zope-zwiki/branches/upstream/current/RSS.py
===================================================================
--- zope-zwiki/branches/upstream/current/RSS.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/RSS.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,129 @@
+# zwiki RSS feed functionality
+
+from __future__ import nested_scopes
+import string, re
+from string import join
+from types import *
+from urllib import quote, unquote
+from DateTime import DateTime
+from AccessControl import ClassSecurityInfo
+from Globals import InitializeClass
+
+import Permissions
+from Utils import BLATHER, html_quote
+
+from I18n import _
+
+class PageRSSSupport:
+    """
+    I provide various kinds of RSS feed for the page and the whole wiki.
+    """
+    security = ClassSecurityInfo()
+
+    security.declareProtected(Permissions.View, 'pages_rss')
+    def pages_rss(self, num=10, REQUEST=None):
+        """
+        Provide an RSS feed showing this wiki's recently created pages.
+        """
+        feedtitle = self.folder().title_or_id() + ' new pages'
+        feeddescription = feedtitle
+        feedlanguage = 'en'
+        feeddate = str(self.folder().bobobase_modification_time()) #XXX ?
+        wikiurl = self.wikiUrl()
+        REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
+        t = """\
+<rss version="2.0">
+<channel>
+<title>%(feedtitle)s</title>
+<link>%(feedurl)s</link>
+<description>%(feeddescription)s</description>
+<language>%(feedlanguage)s</language>
+<pubDate>%(feeddate)s</pubDate>
+""" % {
+            'feedtitle':feedtitle,
+            'feeddescription':feeddescription,
+            'feedurl':wikiurl,
+            'feedlanguage':feedlanguage,
+            'feeddate':feeddate,
+            }
+        for p in self.pages(sort_on='creation_time',
+                            sort_order='reverse',
+                            sort_limit=num,
+                            isBoring=0):
+            pobj = p.getObject()
+            t += """\
+<item>
+<title>%(title)s</title>
+<link>%(wikiurl)s/%(id)s</link>
+<description><![CDATA[%(summary)s]]></description>
+<pubDate>%(creation_time)s</pubDate>
+</item>
+""" % {
+            'title':p.Title,
+            'wikiurl':wikiurl,
+            'id':p.id,
+            'summary':pobj.summary(1000),
+            'creation_time':pobj.creationTime().rfc822(), # be robust here
+            }
+        #      <description><![CDATA[%(summary)s]]></description>
+        t += """\
+</channel>
+</rss>
+"""
+        return t
+
+    security.declareProtected(Permissions.View, 'changes_rss')
+    def changes_rss(self, num=10, REQUEST=None):
+        """
+        Provide an RSS feed showing this wiki's recently edited pages.
+
+        This is not the same as all recent edits.
+        """
+        feedtitle = self.folder().title_or_id() + ' changed pages'
+        feeddescription = feedtitle
+        feedlanguage = 'en'
+        feeddate = str(self.folder().bobobase_modification_time()) #XXX ?
+        wikiurl = self.wikiUrl()
+        REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
+        t = """\
+<rss version="2.0">
+<channel>
+<title>%(feedtitle)s</title>
+<link>%(feedurl)s</link>
+<description>%(feeddescription)s</description>
+<language>%(feedlanguage)s</language>
+<pubDate>%(feeddate)s</pubDate>
+""" % {
+            'feedtitle':feedtitle,
+            'feeddescription':feeddescription,
+            'feedurl':wikiurl,
+            'feedlanguage':feedlanguage,
+            'feeddate':feeddate,
+            }
+        for p in self.pages(sort_on='last_edit_time',
+                            sort_order='reverse',
+                            sort_limit=num,
+                            isBoring=0):
+            pobj = p.getObject()
+            t += """\
+<item>
+<title>%(title)s</title>
+<link>%(wikiurl)s/%(id)s</link>
+<description>%(last_log)s</description>
+<pubDate>%(last_edit_time)s</pubDate>
+</item>
+""" % {
+            'title':'[%s] %s' % (p.Title,html_quote(p.last_log)),
+            'wikiurl':wikiurl,
+            'id':p.id,
+            'last_log':html_quote(pobj.textDiff()),
+            'last_edit_time':pobj.lastEditTime().rfc822(), # be robust here
+            }
+        t += """\
+</channel>
+</rss>
+"""
+        return t
+
+
+InitializeClass(PageRSSSupport) 

Added: zope-zwiki/branches/upstream/current/Regexps.py
===================================================================
--- zope-zwiki/branches/upstream/current/Regexps.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Regexps.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,206 @@
+######################################################################
+# regular expressions used by Zwiki
+#
+# Some people, when confronted with a problem, think 'I know, I'll use
+# regular expressions.' Now they have two problems. --Jamie Zawinski
+#
+# Be brave. Read on.
+#
+# don't bother trying to keep to 80 char lines, here
+
+import re, string
+
+import Defaults
+from Utils import BLATHER, DEBUG, formattedTraceback
+
+# URLs/URIs (better regexps in urllib/urlparse ?)
+urlchars = r'[A-Za-z0-9/:;@_%~#=&\.\-\?\+\$,]+'
+url      = r'["=]?((about|gopher|http|https|ftp|mailto|file):%s)' % (urlchars)
+
+# valid characters for zwiki page ids
+# These are the characters which are used to form the ids of zwiki page
+# objects.  They must be legal in both zope ids and urls, and exclude _
+# which is used for quoting. Cf http://zwiki.org/HowZwikiTitleAndIdWorks .
+# It is possible to enable single-byte non-ascii letters in page ids here
+# if you also hack bad_id in zope's OFS/ObjectManager.py, but then your
+# urls would be illegal.
+zwikiidcharsexpr = re.compile(r'[a-zA-Z0-9.-]')
+
+# used in generating page ids
+# XXX NB this is affected by locale - may not be what we want
+spaceandlowerexpr = re.compile(r'\s+([%s])'%(string.lowercase))
+
+# free-form wiki links
+# zwiki uses three kinds of delimiters to enclose free-form wiki page names:
+
+# single bracketed phrases (only) [...]
+# what's inside the brackets should be group 1
+singlebracketedexpr = r'\[(?:(?!\[))([^\n\]]+)\]'
+
+# wikipedia-style double brackets [[...]]
+doublebracketedexpr = r'\[\[([^\n\]]+)\]\]'
+
+# wicked-style double parentheses ((...)), for international users whose
+# keyboards make brackets hard to type
+doubleparenthesisexpr = r'\(\(([^\n\]]+)\)\)'
+
+# match either single or double brackets, to simplify later regexps a little
+bracketedexpr       = r'\[\[?([^\n\]]+)\]\]?'
+
+# bare wikinames
+#
+# "bare wikinames" here means page names which will be automatically
+# wiki-linked without needing to be enclosed in brackets. Zwiki's
+# wikinames are standard c2.com-style CamelCase plus the following
+# additions:
+#
+# - words of a single letter are allowed (APage, PageA)
+#
+# - trailing digits are allowed (PageVersion22, but not Page22Version)
+#   (XXX for simplicity and to reduce unexpected wikilinking, eg of big
+#   random texts. Change this ?)
+#
+# - non-ascii letters are allowed. We aim to as far as possible work as
+#   international users would expect, out of the box and regardless of
+#   python version, locale setting, platform etc. Better ideas are
+#   welcome. One of two possible setups is chosen at startup:
+#
+#   1. if a system locale is configured, the locale's letters are allowed
+#
+#      We include these in our regexps below. We need them utf8-encoded
+#      since zwiki text is always stored utf8-encoded. So we convert them
+#      from the system's default encoding to unicode and re-encode as
+#      utf8.  It's hard to see how to do this robustly on all systems and
+#      it has been the cause of many zwiki startup problems, so we must be
+#      careful not to let any error stop product initialisation (#769,
+#      #1158). Other notes: don't rely on python 2.3's
+#      getpreferredencoding, gives wrong answer; work around a python bug
+#      with some locales (#392).
+#
+#   2. if no system locale is configured or there was an error during the
+#      above, a default set of non-ascii letters are allowed
+#
+#      On systems where we can't detect the locale's characters, we jump
+#      through some hoops to support a number of non-ascii letters common
+#      in latin and other languages so things are more likely to "just
+#      work" for more users.
+
+# we'll set up the following strings to use when building the regexps:
+# U:   'A|B|C|... '
+# L:   'a|b|c|...'
+# Ubr: '[ABC...]'
+# Lbr: '[abc...]'
+# where A, b etc. are the utf8-encoded upper & lower-case letters.
+try:
+    import locale
+    lang, encoding = locale.getlocale()
+    U =           '|'.join([c.encode('utf8') for c in unicode(string.uppercase, encoding)])
+    L =           '|'.join([c.encode('utf8') for c in unicode(string.lowercase, encoding)])
+    Ubr = '[%s]' % ''.join([c.encode('utf8') for c in unicode(string.uppercase, encoding)])
+    Lbr = '[%s]' % ''.join([c.encode('utf8') for c in unicode(string.lowercase, encoding)])
+    relocaleflag = r'(?L)'
+    wordboundary = r'\b'
+except:
+    # no locale is set, or there was a problem detecting it or a
+    # problem decoding its letters.
+    # XXX must be a less ugly way to do this:
+    # if it's just that there's no locale, don't log a warning
+    try: lang, encoding = locale.getlocale()
+    except: lang, encoding = -1,-1
+    if (lang, encoding) == (None, None): pass
+    else:
+        BLATHER('the system locale gave a problem in Regexps.py, so WikiNames will not be locale-aware')
+        DEBUG(formattedTraceback())
+    # define a useful default set of non-ascii letters, mainly european letters
+    # from http://zwiki.org/InternationalCharacterExamples
+    # XXX more have been added to that page (latvian, polish).. how far
+    # should we go with this ?  Could we make it always recognise all
+    # letters and forget locale awareness ?  Are regexps getting slow ?
+    # XXX needs more work, see failing links at
+    # http://zwiki.org/InternationalCharactersInPageNames
+    uppercase = string.uppercase + '\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x87\xc3\x90\xc3\x91\xc3\x9e'
+    lowercase = string.lowercase + '\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbf\xc2\xb5\xc3\x9f\xc3\xa7\xc3\xb0\xc3\xb1\xc3\xbe'
+    U =           '|'.join([c.encode('utf8') for c in unicode(uppercase,'utf-8')])
+    L =           '|'.join([c.encode('utf8') for c in unicode(lowercase,'utf-8')])
+    Ubr = '[%s]' % ''.join([c.encode('utf8') for c in unicode(uppercase,'utf-8')])
+    Lbr = '[%s]' % ''.join([c.encode('utf8') for c in unicode(lowercase,'utf-8')])
+    relocaleflag = ''
+    wordboundary = '(?<![A-Za-z0-9\x80-\xff])' 
+
+# the basic bare wikiname regexps
+# ?: means "don't remember", apparently a performance optimization
+wikiname1 = r'%s%s(?:%s)+(?:%s)+(?:%s)(?:%s|%s)*[0-9]*' % (relocaleflag,wordboundary,U,L,U,U,L)
+wikiname2 = r'%s%s(?:%s)(?:%s)+(?:%s)(?:%s|%s)*[0-9]*'  % (relocaleflag,wordboundary,U,U,L,U,L)
+
+# are we having fun yet ?
+
+# don't match things like &RightArrow;
+# could also do this in markLinksIn and make it per-pagetype ?
+wikiname3        = r'(?:%s|%s)' % (wikiname1, wikiname2)
+
+# is there a reason for the following regexp ?
+# I think no ampersand before or an ampersand but no char/; behind is enough
+# cautiously commented  --StefanRank
+# more trouble: the XML spec also allows &---WikiName---;
+#wikiname4        = r'(?:(?<!&)%s|(?<=&)%s(?![%s;]))' % (wikiname3, wikiname3, U+L)
+wikiname4        = r'(?:(?<!&)%s(?![%s])|(?<=&)%s(?![%s;]))' % (wikiname3, U+L, wikiname3, U+L)
+
+wikiname         = r'!?(%s)' %(wikiname4)
+
+# issue number links XXX should be in the tracker plugin ?
+simplehashnumber = r'\#[0-9]+'
+# avoid html entities like &#123;
+hashnumberexpr   = r'(?:(?<!&)%s|(?<=&)%s(?![0-9;]))' % (simplehashnumber, simplehashnumber)
+                   
+wikilink         = r'!?(%s|%s|%s|%s|%s)' % (wikiname4,bracketedexpr,doubleparenthesisexpr,url,hashnumberexpr)
+localwikilink1   = r'(?:%s|%s|%s|%s)' % (wikiname4,bracketedexpr,doubleparenthesisexpr,hashnumberexpr)
+localwikilink    = r'!?(%s)' % (localwikilink1)
+interwikilink    = r'!?((?P<local>%s):(?P<remote>%s))' % (localwikilink1,urlchars)
+anywikilinkexpr  = re.compile(r'(%s|%s)' % (interwikilink,wikilink))
+markedwikilinkexpr  = re.compile(r'<zwiki>(.*?)</zwiki>')
+untitledwikilinkexpr = re.compile(r'<a href="([^"/]*/)*(?P<page>[^/"]*)" title="">.*?</a>')
+wikinamewords    = r'((%s(?!%s))+|%s%s+|[0-9]+)'%(Ubr,Lbr,Ubr,Lbr)
+remotewikiurl    = r'(?mi)RemoteWikiURL[:\s]+(?P<remoteurl>[^\s]*)\s*$'
+protected_line   = r'(?m)^!(.*)$'
+
+# stx footnotes 
+# handled by us so as to co-exist with our bracketed links
+# real stx allows refchars = r'[0-9_%s-]' % (string.letters)
+footnoteexpr     = r'(?sm)^\.\. \[([^\n\]]+)\]'
+
+# for stripping javascript
+# XXX needs work, eg should not match
+# <input... name="ZPythonScriptHTML_editAction:method">
+javascriptexpr   = r'(?iL)<(([^>\w]*script|iframe)[^>]*)>' # \1 will be displayed
+
+# for stripping HTML header/footer
+# XXX these are expensive, may hit max recursion limit on bsd
+htmlheaderexpr = r'(?si)^(\s*<!doctype.*?)?\s*<html.*?<body.*?>'
+htmlfooterexpr = r'(?si)</body.*?>\s*</html.*?>\s*$'
+# better ? safe ?
+htmlbodyexpr = r'(?si)^.*?<body[^>]*?>(.*)</body[^>]*?>.*?$'
+
+# one more badass regexp:
+# sgml tags, including ones containing dtml & python expressions and multiline
+# Notes:
+# - r'(?s)<((".*?")|[^">]+)*>' takes exponential time
+# - r'(?s)<((".*?")|[^">]+(?![^">]))*>' avoids backtracking (see perlre)
+# - to avoid matching casual angle bracket use, treat dtml separately
+# - recognising that stuff like <!-- dtml-var ...> & </dtml ...> is also dtml
+# - and that a simple sgml tag may contain a dtml tag
+# - put dtml pattern first, longest match does not apply with (|) I think
+# - not perfect, but seems to match everything in practice
+dtmlentity =     r'(?i)&dtml.*?;'
+dtmltag =        r'(?si)<[-/! ]*dtml((".*?")|[^">]+(?![^">]))*>'
+tagchars =       r'[%s0-9\.\=\'\"\:\/\-\#\+\s\*\;\!\&\-]' % string.letters
+sgmltag =        r'<((".*?")|(%s)|%s+(?!%s))>' % (dtmltag,tagchars,tagchars)
+dtmlorsgmlexpr = r'(%s|%s|%s)' % (dtmltag,sgmltag,dtmlentity)
+
+
+# From_ separator used to recognize rfc2822 messages - regexp from mailbox.py
+# used in Comments.py
+fromlineexpr = r'(?m)(?:^|\n\n)From \s*[^\s]+\s+\w\w\w\s+\w\w\w\s+\d?\d\s+\d?\d:\d\d(:\d\d)?(\s+[^\s]+)?\s+\d\d\d\d\s*$'
+
+# purple numbers NIDs XXX should be in purplenumbers plugin ?
+nidexpr = r'\s*({nid (?P<nid>[0-9A-z]+?)})'
+

Added: zope-zwiki/branches/upstream/current/TESTS
===================================================================
--- zope-zwiki/branches/upstream/current/TESTS	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/TESTS	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,86 @@
+About the Zwiki unit tests 
+
+XXX old, needs update:
+
+See http://zopewiki.org/TestingZope for help with running these.
+They require
+- the ZopeTestCase package, installed under SOFTWARE_HOME/lib/python/Testing
+- the CMF product(s) (permissions used in support.py)
+- the Plone product(s) (for testCMFPlone.py)
+- two fixes to CMFPlone/tests/PloneTestcase.py::
+
+  default_user = 'testuser' #SKWM ZopeTestCase.user_name no longer exists
+
+ and::
+
+  #SKWM "AttributeError: 'module' object has no attribute 'Functional'"
+  #class FunctionalTestCase(ZopeTestCase.Functional, PloneTestCase):
+  #    '''Convenience class for functional unit testing'''
+
+- TextIndexNG2 installation (?). Do 'python setup.py install' in
+  Products/TextIndexNG2 to install some required c modules.
+
+This test suite has mostly grown opportunistically: tests are added as
+needed, eg when writing a new piece of code, when fixing a bug, or when
+trying to understand some behaviour. Gradually the coverage is becoming
+more complete, and the tests and infrastructure are becoming more robust.
+
+Naming conventions: where possible, test files, classes and methods
+correspond to the names of the things they test. The goal is to make it
+extremely quick, easy and mechanical to jump between code and tests.  So
+generally each source file has a corresponding testMODULENAME.py file, and
+each method should have a test_METHODNAME test method. There are
+additional test methods which don't correspond one-to-one; these do not
+have _ in their names.
+
+
+
+# Unit tests for ZWiki. These have been through a few contortions.
+# Working on simplifying them and conforming to the latest One True Way
+# (running at the command line via testrunner.py). 
+#
+# Old notes:
+#
+#  how to do authentication/permissions-related testing ?
+#
+#  test functionality of all the different page types, with no, good &
+#  bad dtml
+#
+#  test edit's various cases
+#
+#  test leading & trailing newline preservation
+#
+#  test initial http-like-header: preservation
+#
+#  test whether stx heading on first line works
+#
+#  test all the various kinds of links - mailto, http, wikiname,
+#  remotewikilink, stx, combinations..
+#
+#  test handling of large cookies, empty cookies, missing cookies by
+#  UserOptions, editform, standard_wiki_header...
+#
+#  test rendering without dtml methods and with various other versions
+#  of the methods
+#
+#  test with other zope versions (at least product startup). Test
+#  with/without ZWikiWebs; ZUnit; doctest; other ZWiki versions; other
+#  related products
+#
+#  test zwiki_base,page_url with & without a SiteRoot
+#
+#  test permissions
+#
+#  the prerelease checklist on http://zwiki.org/ZWikiWebs
+#
+#  check all version nos. are correct (special prerelease test ?)
+#
+#  what's the best way to handle sometimes-applicable tests - like the
+#  above, or testing virtual hosting only if SiteAccess is found 
+#
+#  tests that would catch eg the deepappend bug that broke page
+#  creation from a top-level page, eg: visit both
+#  TestPage/editform?page=NewPage and
+#  TestPage/SubPage/editform?page=NewPage, in a basic wiki (simple
+#  title) and a zwikidotorg wiki (with show_hierarchy enabled)
+#  (SubPage should be a child of TestPage, add this to setup)

Added: zope-zwiki/branches/upstream/current/TODO
===================================================================
--- zope-zwiki/branches/upstream/current/TODO	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/TODO	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,45 @@
+General plans and todos for the zwiki project.
+
+PROCESS
+-------
+highlight active contributors, code and docs
+author stats
+automatic release
+more automated release announcement, wider announcement
+ditto release notes
+auto testing
+open commit - direct push/open send/approved send, reliable, clear instructions
+better dev docs
+CIA or other bot, darcs, issues etc. on irc
+build dev community on darcs, irc & email
+use ruby and haskell
+hosting stats & cost reporting
+lighter monthly release, perhaps a more thoroughly polished quarterly release
+
+DOCS
+clarify division/integration between fs and wiki docs
+publish fs docs online - darcsweb ? epydoc ? trac ? zwiki ?
+get epydoc working
+pursue literate-programming-like wins
+generally rename code files to lower-case
+simpler more focussed wiki docs
+
+SITES
+profile, speed up, simplify
+good stats.. bite google analytics bullet ?
+better tracking of free wikis
+better free wiki signup/marketing/maintenance
+close down dead wikis
+
+PRODUCT
+-------
+fix 1284 acquisition bug - Views_tests
+built-in helppage, editform help
+
+VIEWS AND SKINS
+keep cleaning up and simplifying
+
+TESTS
+fix cmf tests
+aftersetup -> setup ? clarify in all fixtures
+bring back doctests ?

Added: zope-zwiki/branches/upstream/current/TextFormatter.py
===================================================================
--- zope-zwiki/branches/upstream/current/TextFormatter.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/TextFormatter.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,171 @@
+#===================================================================
+#!/usr/bin/env python
+# File:    TextFormatter.py
+# Author:  Hamish B Lawson
+# Date:    19/11/1999
+# from http://www.faqts.com/knowledge_base/view.phtml/aid/4517
+"""
+Here is TextFormatter, a simple module for formatting text into
+columns of specified widths. It does multiline wrapping and supports
+left, center and right alignment.
+
+SKWM made filling & padding optional, tweaked some edge cases
+"""
+
+import string
+
+left  = 0
+center = centre = 1
+right  = 2
+
+class TextFormatter:
+
+    """
+    Formats text into columns.
+
+    Constructor takes a list of dictionaries that each specify the
+    properties for a column. Dictionary entries can be:
+
+       width         the width within which the text will be wrapped
+       alignment     left|center|right
+       margin        amount of space to prefix in front of column
+
+    The compose() method takes a list of strings and returns a formatted
+    string consisting of each string wrapped within its respective column.
+
+    Example:
+
+        formatter = TextFormatter(
+            (
+                {'width': 10},
+                {'width': 12, 'margin': 4},
+                {'width': 20, 'margin': 8, 'alignment': right},
+            )
+        )
+
+        print formatter.compose(
+            (
+                "A rather short paragraph",
+                "Here is a paragraph containing a veryveryverylongwordindeed.",
+                "And now for something on the right-hand side.",
+            )
+        )
+
+    gives:
+
+        A rather      Here is a                    And now for
+        short         paragraph               something on the
+        paragraph     containing a            right-hand side.
+                      veryveryvery
+                      longwordinde
+                      ed.
+
+    """
+    class Column:
+
+        def __init__(self, width=75, alignment=left, margin=0, fill=1, pad=1):
+            self.width = width
+            self.alignment = alignment
+            self.margin = margin
+            self.fill = fill
+            self.pad = pad
+            self.lines = []
+
+        def align(self, line):
+            if self.alignment == center:
+                return string.center(line, self.width)
+            elif self.alignment == right:
+                return string.rjust(line, self.width)
+            else:
+                if self.pad:
+                    return string.ljust(line, self.width)
+                else:
+                    return line
+
+        def wrap(self, text):
+            self.lines = []
+            words = []
+            if self.fill:               # SKWM
+                for word in string.split(text):
+                    if word <= self.width:  # don't understand this
+                        words.append(word)
+                    else:
+                        for i in range(0, len(word), self.width):
+                            words.append(word[i:i+self.width])
+            else:
+                for line in string.split(text,'\n'):
+                    for word in string.split(line):
+                        for i in range(0, len(word), self.width):
+                            words.append(word[i:i+self.width])
+                    words.append('\n')
+                if words[-1] == '\n': words.pop()
+                
+            if words:
+                current = words.pop(0)
+                for word in words:
+                    increment = 1 + len(word)
+                    if word == '\n':
+                        self.lines.append(self.align(current))
+                        current = ''
+                    elif len(current) + increment > self.width:
+                        self.lines.append(self.align(current))
+                        current = word
+                    else:
+                        if current:
+                            current = current + ' ' + word
+                        else:
+                            current = word
+                if current: self.lines.append(self.align(current))
+
+        def getline(self, index):
+            if index < len(self.lines):
+                return ' '*self.margin + self.lines[index]
+            else:
+                if self.pad:
+                    return ' ' * (self.margin + self.width)
+                else:
+                    return ''
+
+        def numlines(self):
+            return len(self.lines)
+
+    def __init__(self, colspeclist):
+        self.columns = []
+        for colspec in colspeclist:
+            self.columns.append(apply(TextFormatter.Column, (), colspec))
+
+    def compose(self, textlist):
+        numlines = 0
+        textlist = list(textlist)
+        if len(textlist) != len(self.columns):
+            raise IndexError, "Number of text items does not match columns"
+        for text, column in map(None, textlist, self.columns):
+            column.wrap(text)
+            numlines = max(numlines, column.numlines())
+        complines = [''] * numlines
+        for ln in range(numlines):
+            for column in self.columns:
+                complines[ln] = complines[ln] + column.getline(ln)
+        #return string.join(complines, '\n') + '\n'
+        return string.join(complines, '\n')
+
+
+def test():
+    formatter = TextFormatter(
+        (
+            {'width': 10},
+            {'width': 12, 'margin': 4},
+            {'width': 20, 'margin': 8, 'alignment': right},
+        )
+    )
+
+    print formatter.compose(
+        (
+            "A rather short paragraph",
+            "Here is a paragraph containing a veryveryverylongwordindeed.",
+            "And now for something on the right-hand side.",
+        )
+    )
+
+if __name__ == '__main__':
+    test()

Added: zope-zwiki/branches/upstream/current/Utils.py
===================================================================
--- zope-zwiki/branches/upstream/current/Utils.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Utils.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,822 @@
+######################################################################
+#  miscellaneous utility methods and functions
+
+from types import *
+from string import split,join,find,lower,rfind,atoi,strip,lstrip
+import os, re, sys, traceback, math
+from urllib import quote, unquote
+
+from AccessControl import getSecurityManager, ClassSecurityInfo
+from App.Common import absattr
+from Globals import InitializeClass
+from OFS.SimpleItem import SimpleItem
+import zLOG # LOG,ERROR,INFO,WARNING,BLATHER,DEBUG
+from DateTime import DateTime
+try: # zope 2.7
+    from DateTime import SyntaxError
+    DateTimeSyntaxError = SyntaxError()
+except ImportError:
+    DateTimeSyntaxError = DateTime.SyntaxError
+try:
+    v = open(os.path.join(SOFTWARE_HOME,'version.txt')).read()
+    m = re.match(r'(?i)zope\s*([0-9]+)\.([0-9]+)\.([0-9]+)',v)
+    ZOPEVERSION = (int(m.group(1)),int(m.group(2)),int(m.group(3)))
+except:
+    ZOPEVERSION = (9,9,9) # (cvs)
+
+from Products.ZWiki import __version__
+from Defaults import PREFER_USERNAME_COOKIE, PAGE_METADATA, BORING_PAGES
+import Permissions
+from I18n import _
+
+# adapt to zope 2.9 transaction api
+try: from transaction import get as get_transaction
+except ImportError: get_transaction = get_transaction
+
+ZWIKI_BIRTHDATE='1999/11/05'
+
+
+class PageUtils:
+    """
+    Miscellaneous utility methods for zwiki pages.
+    """
+    security = ClassSecurityInfo()
+    security.declareObjectProtected('View')
+
+    ######################################################################
+    # misc security utilities
+    
+    def checkPermission(self, permission, object):
+        return getSecurityManager().checkPermission(permission,object)
+
+    # Zwiki implements a little extra access control in addition to Zope's
+    # permissions, to allow more lightweight security based on cookies etc.
+    def checkSufficientId(self, REQUEST=None):
+        REQUEST = REQUEST or getattr(self,'REQUEST',None)
+        return (self.requestHasUsername(REQUEST) or
+                not getattr(self,'edits_need_username',0))
+
+    # used this in standard templates for while, so must keep it for
+    # backwards compatibility. The name is no longer accurate.
+    userIsIdentified = checkSufficientId
+
+    def requestHasUsername(self,REQUEST=None):
+        """
+        Check REQUEST has either an authenticated user or a username cookie.
+        """
+        REQUEST = REQUEST or getattr(self,'REQUEST',None)
+        username = self.usernameFrom(REQUEST)
+        return (username and username != REQUEST.REMOTE_ADDR)
+
+    def usernameFrom(self, REQUEST=None, ip_address=1):
+        """
+        Get the best available user id from the current visitor's REQUEST.
+
+        We use the first of:
+        - a MAILIN_USERNAME set by mailin.py
+        - an authenticated username
+        - a zwiki_username cookie
+        - the client's IP address, unless disabled
+
+        Or, if PREFER_USERNAME_COOKIE in Defaults.py is true, we'll let
+        the cookie take precedence. This means an authenticated user could
+        pretend to be someone else by setting the cookie, but it's useful
+        for this case: a simple community wiki protected by a single
+        common login, multiple users distinguished by their
+        zwiki_username.
+
+        We'll find REQUEST ourself if necessary (helps backwards compatibility
+        with old skin templates).
+        """
+        REQUEST = REQUEST or getattr(self,'REQUEST',None)
+        if not REQUEST: return ''
+        authenticated_name = None
+        user = REQUEST.get('AUTHENTICATED_USER')
+        if user:
+            authenticated_name = user.getUserName()
+            if authenticated_name == str(user.acl_users._nobody):
+                authenticated_name = None
+        cookie_name = REQUEST.cookies.get('zwiki_username',None)
+        mailin_name = REQUEST.get('MAILIN_USERNAME',None)
+        ip_addr = ip_address and REQUEST.REMOTE_ADDR or ''
+        if PREFER_USERNAME_COOKIE:
+            return mailin_name or cookie_name or authenticated_name or ip_addr
+        else:
+            return mailin_name or authenticated_name or cookie_name or ip_addr
+
+    ######################################################################
+
+    def size(self):
+        """
+        Give the size of this page's text.
+        """
+        return len(self.text())
+
+    def cachedSize(self):
+        """
+        Give the total size of this page's text plus cached render data.
+        """
+        return self.size() + len(self.preRendered()) + self.cachedDtmlSize()
+
+    def cachedDtmlSize(self):
+        """
+        Estimate the size of this page's cached DTML parse data.
+        """
+        strings = flattenDtmlParse(getattr(self,'_v_blocks',''))
+        strings = filter(lambda x:type(x)==type(''), strings)
+        return len(join(strings,''))
+
+    def summary(self,size=200,paragraphs=1):
+        """
+        Give a short plaintext summary of this page's content.
+
+        We generate this by excerpting the first paragraph.
+        Specifically, we take the page's document part, strip html tags,
+        and return up to the specified number of characters or paragraphs,
+        replacing the last word with an ellipsis if we had to truncate.
+        """
+        size, paragraphs = int(size), int(paragraphs)
+        t = self.documentPart()
+        t = re.sub(r'<(?=\S)[^>]+>','',t).strip() # strip html tags
+        if paragraphs: t = join(split(t,'\n\n')[:paragraphs],'\n\n')
+        if len(t) > size:
+            t = t[:size]
+            t = re.sub(r'\w*$',r'',t) + '...'
+        return html_quote(t)
+
+    def renderedSummary(self,size=500,paragraphs=1):
+        """
+        Give a summary of this page's content, as rendered html.
+
+        Similar to summary(), but this one tries to apply the page's
+        formatting rules and do wiki linking. We remove any enclosing <p>.
+        """
+        return re.sub(r'(?si)^<p>(.*)</p>\n?$', r'\1',
+            self.renderLinksIn(
+            self.pageType().format(
+            self.summary(size=size, paragraphs=paragraphs))))
+
+    security.declareProtected(Permissions.View, 'excerptAt')
+    def excerptAt(self, expr, size=100, highlight=1, text=None):
+        """
+        Return a highlighted search result excerpt from this page (or text).
+
+        This method searches this page's text, or the provided text, for
+        the first occurrence of expr (cleaned up) and returns the
+        surrounding text chunk, html quoted, and optionally with the
+        matches enclosed in styled spans. If no match is found, it just
+        returns a chunk from the beginning.
+
+        It should mimic the search strategy of SearchPage, but that
+        depends on catalog configuration and it currently doesn't do a
+        very good job, so the excerpts and highlights can be misleading.
+        """
+        text = text or self.text()
+        string = re.sub(r'\*','',expr)
+        m = re.search(r'(?i)'+re.escape(string),text)
+        if m and string:
+            middle = (m.start()+m.end())/2
+            exstart = max(middle-size/2-1,0)
+            exend = min(middle+size/2+1,len(text))
+            excerpt = html_quote(text[exstart:exend])
+            if highlight:
+                excerpt = re.sub(
+                    r'(?i)'+re.escape(html_quote(string)),
+                    #'<span class="hit">%s</span>' % html_quote(m.group()),
+                    # XXX temp
+                    '<span class="hit" style="background-color:yellow;font-weight:bold;">%s</span>' % html_quote(m.group()),
+                    excerpt)
+            return excerpt
+        else:
+            return html_quote(text[:size])
+
+    def metadataFor(self,page):
+        """
+        Make a catalog-brain-like object containing page's principal metadata.
+
+        Given a real page object, this returns a PageBrain which emulates
+        a catalog brain object (search result), for use when there is no
+        catalog. All PAGE_METADATA fields will be included, plus a few more
+        for backwards compatibility with old skin templates.
+
+        Warning: fields such as the parents list may be
+        copies-by-reference, and should not be mutated.
+        """
+        class PageBrain(SimpleItem): # XXX why a SimpleItem ?
+            def __init__(self,obj): self._obj = obj
+            def getObject(self): return self._obj
+        brain = PageBrain(page)
+        for attr in PAGE_METADATA+['page_url','title_or_id']:
+            # protect against import or attr errors when a page type has
+            # been uninstalled
+            try:
+                # don't acquire these properties
+                # aq_base won't be present during unit tests.. messy
+                setattr(brain, attr,
+                        absattr(getattr(getattr(page,'aq_base',page),attr,None)))
+            except (ImportError, AttributeError):
+                setattr(brain, attr, None)
+        #XXX not using now.. leave blank so tests pass
+        brain.linkTitle = '' 
+        return brain
+
+    def ensureCompleteMetadataIn(self,brain):
+        """
+        Ensure brain has all the expected metadata, looking in ZODB if needed.
+
+        This should only happen with catalog brains, where the catalog does not
+        have all the metadata Zwiki expects. We can't add fields to catalog brains,
+        so in that case we'll return a PageBrain instead.
+
+        If the catalog says eg page id is None, we don't do anything about that;
+        we'll return it in the metadata.
+
+        If getObject() returns None (a stale catalog entry), we return None.
+        """
+        for attr in PAGE_METADATA:
+            if not hasattr(brain,attr):
+                # incomplete brain - make a PageBrain
+                p = brain.getObject()
+                if p: return self.metadataFor(p)
+                else: return None
+        return brain
+
+    security.declareProtected(Permissions.View, 'isZwikiPage')
+    def isZwikiPage(self,object):
+        return getattr(object,'meta_type',None) == self.meta_type
+
+    security.declareProtected(Permissions.View, 'zwiki_version')
+    def zwiki_version(self):
+        """
+        Return the zwiki product version.
+        """
+        return __version__
+
+    # expose these darn things for dtml programmers once and for all!
+    # XXX security issue ?
+    security.declareProtected(Permissions.View, 'htmlquote')
+    def htmlquote(self, text):
+        return html_quote(text)
+
+    security.declareProtected(Permissions.View, 'htmlunquote')
+    def htmlunquote(self, text):
+        return html_unquote(text)
+
+    security.declareProtected(Permissions.View, 'urlquote')
+    def urlquote(self, text):
+        return quote(text)
+
+    security.declareProtected(Permissions.View, 'urlunquote')
+    def urlunquote(self, text):
+        return unquote(text)
+
+    def __repr__(self):
+        return ("<%s %s at 0x%s>"
+                % (self.__class__.__name__, `self.id()`, hex(id(self))[2:]))
+
+    security.declareProtected(Permissions.View, 'pageUrl')
+    def pageUrl(self):
+        """Return the url for this wiki page."""
+        return self.wiki_url() + '/' + quote(self.id())
+
+    page_url=pageUrl
+
+    security.declareProtected(Permissions.View, 'wikiUrl')
+    def wikiUrl(self):
+        """Return the url for this wiki's folder."""
+        try: return self.folder().absolute_url()
+        except (KeyError,AttributeError): return '' # for debugging/testing
+
+    wiki_url=wikiUrl
+
+    security.declareProtected(Permissions.View, 'wikiPath')
+    def wikiPath(self):
+        """Return the path part of this wiki's url.
+        """
+        # absolute_url_path and virtual_url_path just don't work 
+        # in a apache proxy-vhm-zope situation, apparently.
+        #try: return self.folder().absolute_url_path()
+        try: return re.sub(r'.*?//.*?/',r'/',self.folder().absolute_url())
+        except (KeyError,AttributeError): return '' # for debugging/testing
+
+    def defaultPageUrl(self):
+        p = self.defaultPage()
+        return (p and p.pageUrl()) or ''
+
+    def urlForDtmlPageOrMethod(self,pagename,methodname):
+        """
+        Return the url of an existing dtml page, or of a method, or ''.
+        """
+        p = self.pageWithName(pagename)
+        if p and p.dtmlAllowed() and p.hasDynamicContent(): return p.pageUrl()
+        elif methodname: return self.defaultPage().pageUrl()+'/'+methodname
+        else: return ''
+
+    def urlForPageOrDefault(self,pagename,default=''):
+        """
+        Return the url of an existing page, or the default.
+        """
+        p = self.pageWithName(pagename)
+        return (p and p.pageUrl()) or default
+
+    # XXX keeping these page names in the skin might be easier for i18n ?
+    # but way too cumbersome right now
+    security.declareProtected(Permissions.View, 'homeUrl')
+    def homeUrl(self):
+        return self.urlForPageOrDefault('FrontPage',self.wikiUrl())
+
+    security.declareProtected(Permissions.View, 'contentsUrl')
+    def contentsUrl(self, scroll=1):
+        """
+        Return the url of zwiki's contents method.
+
+        In general, we try to keep these urls stable, so as to minimise
+        useless work done for web robots. For the contents page, this was
+        tricky because we like it to know what page we were looking at
+        (for you are here), and to scroll there. Here's what we do now:
+
+        - use front page url as our fixed base
+
+        - add #PageId so the browser will scroll; most robots ignore
+          this part, we think
+
+        - have the contents page figure out"you are here" from the http referer
+
+        """
+        url = self.defaultPageUrl() + '/contents'
+        if scroll: url += '#' + self.pageId()
+        return url
+    
+    security.declareProtected(Permissions.View, 'changesUrl')
+    def changesUrl(self):
+        return self.urlForDtmlPageOrMethod('RecentChanges','recentchanges')
+
+    security.declareProtected(Permissions.View, 'discussionUrl')
+    def discussionUrl(self):
+        p = self.pageWithName('UserDiscussion') or self.pageWithName('GeneralDiscussion')
+        return (p and p.pageUrl()) or ''
+
+    security.declareProtected(Permissions.View, 'indexUrl')
+    def indexUrl(self):
+        return self.urlForDtmlPageOrMethod('AllPages','') #'allpages')
+
+    security.declareProtected(Permissions.View, 'uploadsUrl')
+    def uploadsUrl(self):
+        return '' #self.urlForDtmlPageOrMethod('UploadsPage','uploads')
+
+    security.declareProtected(Permissions.View, 'preferencesUrl')
+    def preferencesUrl(self):
+        return self.urlForDtmlPageOrMethod('UserOptions','useroptions')
+
+    security.declareProtected(Permissions.View, 'helpUrl')
+    def helpUrl(self):
+        return self.urlForDtmlPageOrMethod('HelpPage','helppage')
+
+    security.declareProtected(Permissions.View, 'searchUrl')
+    def searchUrl(self):
+        return self.urlForDtmlPageOrMethod('SearchPage','searchwiki')
+
+    security.declareProtected(Permissions.View, 'creationTime')
+    def creationTime(self):
+        """
+        Return our creation time as a DateTime, guessing if necessary
+        """
+        try: return DateTime(self.creation_time)
+        except (AttributeError,DateTimeSyntaxError):
+            # if the time is corrupt or missing somehow, don't beat
+            # around the bush; be darn sure to give it some fixed time
+            # or we'll see repeats in rss feeds & planets.
+            # folder's creation time would be good but that's not
+            # available.
+            return DateTime(ZWIKI_BIRTHDATE)
+
+    security.declareProtected(Permissions.View, 'lastEditTime')
+    def lastEditTime(self):
+        """
+        Return our last edit time as a DateTime, guessing if necessary
+        """
+        try: return DateTime(self.last_edit_time)
+        except (AttributeError,DateTimeSyntaxError):
+            # similar considerations to creationTime()
+            return DateTime(ZWIKI_BIRTHDATE)
+
+    security.declareProtected(Permissions.View, 'folder')
+    def folder(self):
+        """
+        return this page's containing folder
+
+        We used to use self.aq_parent everywhere, now
+        self.aq_inner.aq_parent to ignore acquisition paths.
+        Work for pages without a proper acquisition wrapper too.
+        """
+        return getattr(getattr(self,'aq_inner',self),'aq_parent',None)
+
+    security.declareProtected(Permissions.View, 'age')
+    def age(self):
+        """
+        return a string describing the approximate age of this page
+        """
+        return self.asAgeString(self.creation_time)
+
+    security.declareProtected(Permissions.View, 'lastEditInterval')
+    def ageInDays(self):
+        """
+        return the number of days since page creation
+        """
+        return int(self.getPhysicalRoot().ZopeTime() -
+                   self.creationTime())
+
+    security.declareProtected(Permissions.View, 'lastEditInterval')
+    def lastEditInterval(self):
+        """
+        return a string describing the approximate interval since last edit
+        """
+        return self.asAgeString(self.last_edit_time)
+
+    security.declareProtected(Permissions.View, 'lastEditInterval')
+    def lastEditIntervalInDays(self):
+        """
+        return the number of days since last edit
+        """
+        return int(self.getPhysicalRoot().ZopeTime() -
+                   self.lastEditTime())
+
+    security.declareProtected(Permissions.View, 'lastEditInterval')
+    def lastEditIntervalInHours(self):
+        """
+        return the number of hours since last edit
+        """
+        return int((self.getPhysicalRoot().ZopeTime() -
+                    self.lastEditTime()) * 24)
+
+    security.declareProtected(Permissions.View, 'asAgeString')
+    def asAgeString(self,time):
+        """
+        return a string describing the approximate elapsed period since time
+
+        time may be a DateTime or suitable string. Returns a blank string
+        if there was a problem. Based on the dtml version in ZwikiTracker.
+        """
+        if not time:
+            return 'some time'
+        if type(time) is StringType:
+            time = DateTime(time)
+        # didn't work on a page in CMF, perhaps due to skin acquisition magic
+        #elapsed = self.ZopeTime() - time
+        elapsed = self.getPhysicalRoot().ZopeTime() - time
+        hourfactor=0.041666666666666664
+        minutefactor=0.00069444444444444447
+        secondsfactor=1.1574074074074073e-05
+        days=int(math.floor(elapsed))
+        weeks=days/7
+        months=days/30
+        years=days/365
+        hours=int(math.floor((elapsed-days)/hourfactor))
+        minutes=int(math.floor((elapsed-days-hourfactor*hours)/minutefactor))
+        seconds=int(round((
+            elapsed-days-hourfactor*hours-minutefactor*minutes)/secondsfactor))
+  
+        datepattern = ("%(nb)d %(period)s")
+       
+        if years:
+            s = datepattern % {"nb": years, "period": years > 1 and _('years') or _('year')}
+        elif months:
+            s = datepattern % {"nb":months, "period":months > 1 and _('months') or _('month')}
+        elif weeks:
+            s = datepattern % {"nb":weeks, "period":weeks > 1 and _('weeks') or _('week')}
+        elif days:
+            s = datepattern % {"nb":days, "period": days > 1 and _('days') or _('day') }
+        elif hours:
+            s = datepattern % {"nb":hours, "period":hours > 1 and _('hours') or _('hour')}
+        elif minutes:
+            s = datepattern % {"nb":minutes, "period":minutes > 1 and _('minutes') or _('minute')}
+        else:
+            s = datepattern % {"nb":seconds, "period":seconds > 1 and _('seconds') or _('second')}
+            
+        return s
+
+    security.declareProtected(Permissions.View,'include')
+    def include(self,page,REQUEST=None, **kw):
+        """
+        Convenience method for including the body of one page within another.
+
+        Renders without the skin, passes REQUEST in case authentication is
+        needed, fails silently if page does not exist.
+        """
+        REQUEST = REQUEST or self.REQUEST
+        p = self.pageWithNameOrId(page)
+        if p: return p(bare=1,REQUEST=REQUEST, **kw)
+        else: return ''
+        
+    def isBoring(self):
+        """
+        Is this page one which should be quieter, eg test pages ?
+
+        Boring pages are pages which we don't usually want to see in blog
+        listings, rss feeds etc. (?) or hear mail from unless subscribed
+        directly. These are TestPage, SandBox and their offspring, by
+        default. You can configure different pages in a boring_pages lines
+        folder property, one per line.
+        """
+        boring = getattr(self,'boring_pages', BORING_PAGES)
+        if self.pageName() in boring:
+            return 1
+        ancestors = self.ancestorsAsList()
+        for p in boring:
+            if p in ancestors:
+                return 1
+        return 0
+
+InitializeClass(PageUtils)
+
+
+# generic utilities
+def BLATHER(*args):
+    tmp = []
+    for arg in args: tmp.append(str(arg))
+    zLOG.LOG('ZWiki',zLOG.BLATHER,' '.join(tmp))
+
+def WARN(*args):
+    tmp = []
+    for arg in args: tmp.append(str(arg))
+    zLOG.LOG('ZWiki',zLOG.WARNING,' '.join(tmp))
+
+def DEBUG(*args):
+    tmp = []
+    for arg in args: tmp.append(str(arg))
+    zLOG.LOG('ZWiki',zLOG.DEBUG,' '.join(tmp))
+
+def formattedTraceback():
+    type,val,tb = sys.exc_info()
+    try:     return join(traceback.format_exception(type,val,tb),'')
+    finally: del tb  # Clean up circular reference, avoid IssueNo0536
+
+from cgi import escape
+def html_quote(s): return escape(str(s))
+def html_unquote(s,
+                 character_entities=(
+                       (('&amp;'),    '&'),
+                       (('&lt;'),    '<' ),
+                       (('&gt;'),    '>' ),
+                       (('&lt;'), '\213' ),
+                       (('&gt;'), '\233' ),
+                       (('&quot;'),    '"'))): #"
+        text=str(s)
+        for re,name in character_entities:
+            if find(text, re) >= 0: text=join(split(text,re),name)
+        return text
+
+def stringBefore(pattern, str):
+    m = re.search(pattern,str)
+    if m: return str[:m.start()]
+    else: return str
+
+def stringBeforeAndIncluding(pattern, str):
+    m = re.search(pattern,str)
+    if m: return str[:m.end()]
+    else: return str
+
+def stringAfter(pattern, str):
+    m = re.search(pattern,str)
+    if m: return str[m.end():]
+    else: return ''
+
+def stringAfterAndIncluding(pattern, str):
+    m = re.search(pattern,str)
+    if m: return str[m.start():]
+    else: return ''
+
+#def flatten(seq):
+#  """
+#  Translate a nested sequence into a flat list of string-terminals.
+#  We omit duplicates terminals in the process.
+#  """
+#  got = []
+#  pending = [seq]
+#  while pending:
+#    cur = pending.pop(0)
+#    if type(cur) == StringType:
+#      if cur not in got:
+#        got.append(cur)
+#    else:
+#      pending.extend(cur)
+#  return got
+
+def flatten(recursiveList):
+    """
+    Flatten a recursive list/tuple structure.
+    """
+    flatList = []
+    for i in recursiveList:
+        if type(i) in (ListType,TupleType): flatList.extend(flatten(list(i)))
+        else: flatList.append(i)
+    return flatList
+
+flatten2 = lambda l,f=lambda L,F : type(L) != type([]) and [L] or reduce(lambda a,b,F=F : a + F(b,F), L, []) :f(l,f)
+
+## flatten from WFN
+#def flatten3(seq):
+#  """Translate a nested sequence into a flat list of string-terminals.
+#  We omit duplicates terminals in the process."""
+#  got = []
+#  pending = [seq]
+#  while pending:
+#    cur = pending.pop(0)
+#    if type(cur) == StringType:
+#      if cur not in got:
+#        got.append(cur)
+#    else:
+#      pending.extend(cur)
+#  return got
+
+def flattenDtmlParse(i):
+    """
+    Roughly flatten a DTML parse structure, for estimating it's size.
+    """
+    flatList = []
+    if type(i) in (ListType,TupleType):
+        if len(i) > 0: flatList.extend(flattenDtmlParse(i[0]))
+        if len(i) > 1: flatList.extend(flattenDtmlParse(i[1:]))
+    elif hasattr(i,'section'):
+        flatList.extend(flattenDtmlParse(i.section))
+    elif hasattr(i,'im_self'):
+        flatList.extend(flattenDtmlParse(i.im_self))
+    else:
+        flatList.append(i)
+    return flatList
+
+# Boldly taken from tres seaver's PTK code.
+# Then lifted from ken manheimer's WFN code.
+def parseHeadersBody( body, headers=None ):
+    """
+    Parse any leading 'RFC-822'-ish headers from an uploaded
+    document, returning a tuple containing the headers in a dictionary
+    and the stripped body.
+
+    E.g.::
+
+        Title: Some title
+        Creator: Tres Seaver
+        Format: text/plain
+        X-Text-Format: structured
+
+        Overview
+
+        This document .....
+
+    would be returned as::
+
+        { 'Title' : 'Some title'
+        , 'Creator' : 'Tres Seaver'
+        , 'Format' : 'text/plain'
+        , 'text_format': 'structured'
+        }
+
+    as the headers, plus the body, starting with 'Overview' as
+    the first line (the intervening blank line is a separator).
+
+    Allow passing initial dictionary as headers.
+    """
+    cr = re.compile( '^.*\r$' )
+    lines = map( lambda x, cr=cr: cr.match( x ) and x[:-1] or x
+               , split( body, '\n' ) )
+
+    i = 0
+    if headers is None:
+        headers = {}
+    else:
+        headers = headers.copy()
+
+    hdrlist = []
+    for line in lines:
+        if line and line[-1] == '\r':
+            line = line[:-1]
+        if not line:
+            break
+        tokens = split( line, ':' )
+        if len( tokens ) > 1:
+            hdrlist.append( ( tokens[0], join( tokens[1:], ':' ) ) )
+        elif i == 0:
+            return headers, body     # no headers, just return those passed in.
+        else:    # continuation
+            last, hdrlist = hdrlist[ -1 ], hdrlist[ :-1 ]
+            hdrlist.append( ( last[ 0 ]
+                            , join( ( last[1], lstrip( line ) ), '\n' )
+                            ) )
+        i = i + 1
+
+    for hdr in hdrlist:
+        headers[ hdr[0] ] = hdr[ 1 ]
+
+    return headers, join( lines[ i+1: ], '\n' )
+
+#from python FAQ:
+import tempfile
+import os
+class Popen3:
+    """
+    This is a deadlock-safe version of popen, that returns
+    an object with errorlevel, out (a string) and err (a string).
+    (capturestderr may not work under windows.)
+    Example: print Popen3('grep spam','\n\nhere spam\n\n').out
+    """
+    def __init__(self,command,input='',capturestderr=0):
+        outfile=tempfile.mktemp()
+        command="( %s ) > %s" % (command,outfile)
+        if input:
+            infile=tempfile.mktemp()
+            open(infile,"w").write(input)
+            command=command+" <"+infile
+        if capturestderr:
+            errfile=tempfile.mktemp()
+            command=command+" 2>"+errfile
+        self.errorlevel=os.system(command) >> 8
+        self.out=open(outfile,"r").read()
+        os.remove(outfile)
+        if input:
+            os.remove(infile)
+        if capturestderr:
+            self.err=open(errfile,"r").read()
+            os.remove(errfile)
+
+def stripList(lines):
+    """
+    Strip whitespace elements from a list of strings, such as a lines property.
+
+    Accept a list or tuple, return a list. (Zope 2.7 props are tuples.)
+    """
+    return filter(lambda x:x.strip(),list(lines))
+
+def isIpAddress(s):
+    """
+    True if s looks like an IP address.
+    """
+    return re.match(r'[0-9\.\s]*$',s) and 1
+
+def isEmailAddress(s):
+    """
+    True if s looks like an email address.
+    """
+    if type(s) is StringType and '@' in s: return 1
+    else: return 0
+
+def isUsername(s):
+    """
+    True if s looks like a username (for Mail.py's purposes).
+    """
+    return not isEmailAddress(s)
+
+# utilities for managing lists of callable actions, "hooks" as they're
+# called in emacs.  Certain core zwiki methods allow themselves to be
+# extended at run-time by "hooking in" additional methods/fns, usually by
+# plugins.  Cf aspect-oriented programming, method annotations, ...
+#
+# Declare a hook list before a method like this:
+#
+#   # allow extra actions to be added to this method
+#   global methodname_hooks
+#   methodname_hooks = []
+#
+# and have the method call the hooks like this:
+#
+#   callHooks(methodname_hooks, self)
+#
+# then other code can add a hook like this:
+#
+#   from Products.ZWiki.Utils import addHook
+#   from Products.ZWiki.Modulename import methodname_hooks
+#   addHook(methodname_hooks, hookmethod)
+#
+# the hook needs to accept the type of argument callHooks gives it.
+# see eg Admin.py:upgrade and plugins/tracker/__init__.py
+
+#def declareHook(method):
+#    """
+#    Declare a hook list for method, to allow extra actions to be registered.
+#    """
+#    import exec
+#    exec (method+'_hooks = []')
+#    exec ('global '+method+'_hooks')
+
+def addHook(hooks, fn):
+    """
+    Add a function to a list of hook actions to be called.
+    """
+    hooks.append(fn)
+
+def callHooks(hooks, arg):
+    """
+    Call each of a list of functions with arg, returning any error code.
+
+    Hook functions are called with one argument.  We catch and log any
+    exceptions, and return the last non-null return code if any.
+    """
+    err = None
+    for hook in hooks:
+        try:
+            err = hook(arg) or err
+        except:
+            BLATHER(
+                'could not call hook, skipping (traceback follows)\n%s' % (
+                formattedTraceback()))
+    return err

Added: zope-zwiki/branches/upstream/current/Utils_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/Utils_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Utils_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,17 @@
+from testsupport import *
+#ZopeTestCase.installProduct('ZCatalog')
+ZopeTestCase.installProduct('ZWiki')
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    return suite
+
+class Tests(ZwikiTestCase):
+    def test_checkSufficientId(self):
+        p, r = self.page, self.request
+        self.failUnless(p.checkSufficientId(r))
+        p.edits_need_username = 1
+        self.failIf(p.checkSufficientId(r))
+        p.edits_need_username = 0
+        self.failUnless(p.checkSufficientId(r))

Added: zope-zwiki/branches/upstream/current/Views.py
===================================================================
--- zope-zwiki/branches/upstream/current/Views.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Views.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,816 @@
+"""
+Zwiki's main UI views and UI-related utilities.
+
+Zwiki needs to work both outside and inside Plone/CMF, so cannot rely on
+the CMF skin mechanism alone. There is a built-in mechanism which works
+like this:
+
+Overview
+--------
+
+- *view methods* are defined for wiki pages (via mixin class, usually in
+  Views.py). These define the standard views which are always available no
+  matter what kind of site we are in (main view, editform, backlinks etc.)
+
+- view methods usually call a *view template* of the same name to render
+  the view, sometimes passing data as arguments. These templates can be
+  customized by wiki admins.
+
+- view methods use getSkinTemplate() to find their helper templates. It
+  looks for a page template or dtml method of the specified name, in the
+  following places:
+
+  1. first, in the wiki folder in the ZODB
+
+  2. or, elsewhere in the ZODB by acquisition (including the CMF skin
+     layers if we are in a CMF/Plone site)
+
+  3. finally, in a built-in TEMPLATES dictionary containing the skin
+     templates defined by the files in skins/zwiki/ (and others registered
+     by plugins).
+
+More about templates
+--------------------
+
+- the standard templates use METAL macros so that they can be broken up
+  into manageable chunks (like the comment form) and reused easily.
+  Usually there is a template file to define each macro, but this is just
+  convention. At runtime all the macros are gathered from TEMPLATES and
+  made available as here/macros.
+
+- Currently all templates, except those provided by plugins, are defined
+  in skins/zwiki and are designed to work in both standard and CMF/Plone
+  wikis.  The need to be compatible with CMF/Plone's main_template puts
+  certain constraints on Zwiki's templates.
+
+- view templates call the here/main_template/macros/master macro to wrap
+  themselves in the overall site skin. This calls CMF/Plone's main
+  template if we are in CMF, or Zwiki's if we are not. (main_template is a
+  ComputedAttribute on zwiki pages, which calls the get_main_template method,
+  which calls CMF/Plone's main_template or Zwiki's main_template_zwiki template).
+
+Skin object types
+-----------------
+
+Aside from the view methods, which are built in to the product code, all
+skin objects - view templates, helper templates, dtml methods, files,
+images - may be customized in the ZODB. Here's a review:
+
+**page templates**
+  Zope page templates are the workhorse for making dynamic views. They
+  provide better i18n features than dtml. Zwiki's are well-formed HTML and
+  can be edited in a wysiwyg html editor without damage (untried).
+
+**macros**
+  METAL macros are chunks of page template which can be reused in other
+  page templates. They are more powerful than a simple include mechanism,
+  you could say they are used in one of two ways:
+
+  1. filling - called template fills a space within the caller
+  2. wrapping - called template takes over, and caller fills spaces
+     (slots) within it
+
+**dtml methods**
+  Zope DTML methods are the precursor to page templates. They are a little
+  faster, a little less explicit, not well-formed HTML, a little harder to
+  debug, easier to understand than macros.
+
+**files**
+  Best for chunks of content which do not change much and should be
+  cached. A File object works well when customizing the stylesheet (though
+  see below).
+
+**images**
+  Like files, but better suited to graphics. The zwiki skin includes a
+  couple of icons.
+
+Other notes
+-----------
+  
+- several Zwiki views (eg recentchanges) are developed iteratively as dtml
+  wiki pages on zwiki.org.  These are reused in the skin as dtml methods
+  (RecentChanges.dtml) embedded within page templates
+  (recentchanges.pt). The page templates may be customized to not use dtml
+  if preferred.
+
+- the stylesheet view method will accept a skin object called
+  ``stylesheet`` *or* ``stylesheet.css``.  It may be a File object, a DTML
+  Method, or an editable wiki page (see
+  http://zwiki.org/HowToSetUpAnEditableStylesheet).
+
+- from 0.54, all of the built in filesystem-based templates, dtml methods
+  and macros refresh when running in debug mode.
+
+"""
+
+
+from __future__ import nested_scopes
+import os, sys, re, string, time, math
+import string
+from string import split,join,find,lower,rfind,atoi,strip
+
+from App.Common import rfc1123_date
+from AccessControl import getSecurityManager, ClassSecurityInfo
+import Permissions
+from OFS.Image import File
+from Globals import InitializeClass, MessageDialog
+from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
+from Products.PageTemplates.Expressions import SecureModuleImporter
+from ComputedAttribute import ComputedAttribute
+
+from Defaults import PAGE_METATYPE
+from Utils import BLATHER, formattedTraceback
+from I18n import _, DTMLFile, HTMLFile
+
+
+# utilities
+
+def loadPageTemplate(name,dir='skins/zwiki'):
+    """
+    Load the named page template from the filesystem.
+    """
+    return PageTemplateFile(
+        os.path.join(dir,'%s.pt' % name),
+        globals(),
+        __name__=name)
+
+def loadDtmlMethod(name,dir='skins/zwiki'):
+    """
+    Load the named DTML method from the filesystem.
+    """
+    # need this one for i18n gettext patch to work ?
+    #dm = DTMLFile(os.path.join(dir,name), globals())
+    dm = HTMLFile(os.path.join(dir,name), globals())
+    # work around some (2.7 ?) glitch
+    if not hasattr(dm,'meta_type'): dm.meta_type = 'DTML Method (File)'
+    return dm
+
+def loadStylesheet(name,dir='skins/zwiki'):
+    """
+    Load the stylesheet file from the filesystem.
+    """
+    f = loadFile(name,dir=dir)
+    if f:
+        f.content_type = 'text/css'
+        return f
+
+def loadFile(name,dir='skins/zwiki'):
+    """
+    Load a File from the filesystem.
+
+    Also work around a modification time bug.
+    """
+    THISDIR = os.path.split(os.path.abspath(__file__))[0]
+    filepath = os.path.join(THISDIR,dir,name)
+    data,mtime = '',0
+    try:
+        try:
+            fp = open(filepath,'rb')
+            data = fp.read()
+            mtime = os.path.getmtime(filepath)
+            file = File('stylesheet','',data)
+            # bug workaround: bobobase_modification_time will otherwise be current time
+            file.bobobase_modification_time = lambda:mtime
+            return file # whee! does the finally first
+        except:
+            return None
+    finally:
+        fp.close()
+
+
+def isPageTemplate(obj):
+    return getattr(obj,'meta_type',None) in (
+        'Page Template',            # template found in wiki folder or above
+        'Filesystem Page Template', # default template in CMF skin/SkinnedFolder
+        'Page Template (File)',     # default from filesystem
+        )
+
+def isDtmlMethod(obj):
+    return getattr(obj,'meta_type',None) in (
+        'DTML Method', 
+        'Filesystem DTML Method',
+        'DTML Method (File)',
+        'DTML Document', 
+        'Filesystem DTML Document',
+        'DTML Document (File)',
+        )
+
+def isTemplate(obj):
+    return isPageTemplate(obj) or isDtmlMethod(obj)
+
+def isFile(obj):
+    return getattr(obj,'meta_type',None) in (
+        'File',
+        )
+
+def isZwikiPage(obj):
+    return getattr(obj,'meta_type',None) in (
+        PAGE_METATYPE,
+        )
+
+def addErrorTo(text,error):
+    return """<div class="error">%s</div>\n%s""" % (error,text)
+
+
+# the standard zwiki skin templates
+TEMPLATES = {}
+for t in [
+    # main view templates
+    'badtemplate', # should be first
+    'backlinks',
+    'contentspage',
+    'denied',
+    'diffform',
+    'editform',
+    'recentchanges',
+    'searchwiki',
+    'helppage',
+    'subscribeform',
+    'useroptions',
+    'wikipage',
+    # additional macro-providing templates
+    'accesskeys',
+    'commentform',
+    'content',
+    'head',
+    'hierarchylinks',
+    'links',
+    'maintemplate',
+    'pageheader',
+    'pagemanagementform',
+    'siteheader',
+    'testtemplate',
+    ]:
+    TEMPLATES[t] = loadPageTemplate(t)
+
+# helper dtml methods
+for t in [
+    'RecentChanges',
+    'SearchPage',
+    'UserOptions',
+    'subtopics_outline',
+    'subtopics_board',
+    ]:
+    TEMPLATES[t] = loadDtmlMethod(t)
+
+# other things
+TEMPLATES['stylesheet'] = loadStylesheet('stylesheet.css')
+# XXX this really expects to be a full wiki page
+# for now, read it as a file and format it in helppage.pt
+# one issue: File does not refresh in debug mode ?
+TEMPLATES['HelpPage'] = loadFile('HelpPage.stx')
+
+
+# set up easy access to all macros via here/macros.
+# XXX We use a computed attribute (below) to call getmacros on each
+# access, to ensure they are always fresh in debug mode - or when a zodb
+# template is customized. Right ?  So we have to check for customized
+# templates each time. getmacros is called a lot, are we getting into
+# performance concerns yet ? This seems a lot of work, there must
+# be some simpler acceptable setup we can offer.
+# we'll save the list of initial ZPT ids and check only these
+PAGETEMPLATEIDS = [t for t in TEMPLATES.keys()
+                   if isinstance(TEMPLATES[t],PageTemplateFile)]
+#XXX temp - need at least this too, it defines a macro
+PAGETEMPLATEIDS.extend(['ratingform'])
+MACROS = {}
+def getmacros(self):
+    """
+    Return a dictionary of all the latest macros from our PageTemplateFiles.
+
+    This is called for each access to here/macros (MACROS)
+    """
+    if not self:
+        # for initialisation, just use standard templates
+        [MACROS.update(t.pt_macros())
+         for t in TEMPLATES.values() if isinstance(t,PageTemplateFile)]
+    else:
+        # when called in zope context, reflect any zodb customizations
+        for id in PAGETEMPLATEIDS:
+            MACROS.update(self.getSkinTemplate(id).pt_macros())
+    return MACROS
+
+# provide old macros for backwards compatibility
+# pre-0.52 these were defined in wikipage, old custom templates may need them
+# two more were defined in contentspage, we won't support those
+getmacros(None)
+MACROS['linkpanel']   = MACROS['links']
+MACROS['navpanel']    = MACROS['hierarchylinks']
+nullmacro = ZopePageTemplate(
+    'null','<div metal:define-macro="null" />').pt_macros()['null']
+MACROS['favicon']     = nullmacro
+MACROS['logolink']    = nullmacro
+MACROS['pagelinks']   = nullmacro
+MACROS['pagenameand'] = nullmacro
+MACROS['wikilinks']   = nullmacro
+
+
+
+class SkinViews:
+    """ 
+    This mixin defines the main Zwiki UI views as methods.
+
+    These view methods usually just call a built-in template of the same
+    name, which may be overridden by a similarly-named template in the
+    ZODB (a page template, a dtml method, sometimes a File..) A few
+    methods don't use a template at all.
+    """
+    security = ClassSecurityInfo()
+
+    security.declareProtected(Permissions.View, 'backlinks')
+    def backlinks(self, REQUEST=None):
+        """
+        Render the backlinks form (template-customizable).
+        """
+        return self.getSkinTemplate('backlinks')(self,REQUEST)
+
+    security.declareProtected(Permissions.View, 'contentspage')
+    def contentspage(self, hierarchy, singletons, REQUEST=None):
+        """
+        Render the contents view (template-customizable).
+
+        hierarchy and singletons parameters are required.
+        """
+        return self.getSkinTemplate('contentspage')(self,REQUEST,
+                                                    hierarchy=hierarchy,
+                                                    singletons=singletons)
+
+    security.declareProtected(Permissions.Add, 'createform')
+    def createform(self, REQUEST=None, page=None, text=None, pagename=None):
+        """
+        Render the create form (template-customizable).
+
+        This usually just calls editform; it is protected by a
+        different permission and also allows an alternate pagename
+        argument to support the page management form (XXX temporary).
+        It may also be customized by a createform skin template, in
+        which case page creation and page editing forms are different.
+        """
+        if not self.checkSufficientId(REQUEST):
+            return self.denied(
+                _("Sorry, this wiki doesn't allow anonymous edits. Please configure a username in options first."))
+
+        if self.hasSkinTemplate('createform'):
+            return self.getSkinTemplate('createform')(
+                REQUEST, page or pagename, text)
+        else:
+            return self.editform(
+                REQUEST, page or pagename, text, action='Create')
+
+    security.declareProtected(Permissions.View, 'davLockDialog')
+    def davLockDialog(self):
+        """
+        web page displayed in webDAV lock conflict situations.
+        """
+        titlestr=_('Page is locked')
+        return MessageDialog(
+            title=titlestr,
+            message="""
+            <b>%s</b>
+            <p>
+            %s
+            <p>
+            %s
+            """ % (
+            titlestr,
+            _("""
+            This page has a webDAV lock. Someone is probably editing it
+            with an external editor.  You'll need to wait until they've
+            finished and then try again.  If you've just made some changes,
+            you may want to back up and copy your version of the text for
+            reference.
+            """),
+            _("To discard your changes and try again, click OK."),
+            ),
+            action=self.pageUrl()+'/editform')
+
+    security.declarePublic('denied')
+    def denied(self, reason=None, REQUEST=None):
+        """
+        Render the denied form (template-customizable).
+        """
+        return self.getSkinTemplate('denied')(self,REQUEST,reason=reason)
+
+    security.declareProtected(Permissions.View, 'diffform')
+    def diffform(self, revA, difftext, REQUEST=None):
+        """
+        Render the diff form (template-customizable).
+
+        revA and difftext parameters are required.
+        """
+        return self.getSkinTemplate('diffform')(self,REQUEST,
+                                                 revA=revA,
+                                                 difftext=difftext)
+
+    security.declareProtected(Permissions.View, 'editConflictDialog')
+    def editConflictDialog(self):
+        """
+        web page displayed in edit conflict situations.
+        """
+        #XXX form = self.getMessageDialog('editconflict')
+        #XXX form = self.getSkinTemplate('editconflict')
+        titlestr=_('Edit conflict')
+        return MessageDialog(
+            title=titlestr,
+            message="""
+            <b>%s</b>
+            <p>
+            %s.
+            %s:
+            <ol>
+            <li>%s
+            <li>%s
+            <li>%s
+            <li>%s
+            <li>%s.
+            </ol>
+            %s,
+            <p>
+            %s.
+            """ % (
+            titlestr,
+            _("Someone else has saved this page while you were editing"),
+            _("To resolve the conflict, do this"),
+            _("Click your browser's back button"),
+            _("Copy your recent edits to the clipboard"),
+            _("Click your browser's refresh button"),
+            _("Paste in your edits again, being mindful of the latest changes"),
+            _("Click the Change button again"),
+            _("or"),
+            _("To discard your changes and start again, click OK"),
+            ),
+            action=self.pageUrl()+'/editform')
+
+    security.declareProtected(Permissions.Edit, 'editform')
+    def editform(self, REQUEST=None, page=None, text=None, action='Change'):
+        """
+        Render the edit form (template-customizable).
+
+        This is usually called by createform also, and can handle both
+        editing and creating. The form's textarea contents may be specified.
+        """
+        if not self.checkSufficientId(REQUEST):
+            return self.denied(
+                _("Sorry, this wiki doesn't allow anonymous edits. Please configure a username in options first."))
+        
+        if ((not page or page == self.pageName()) and
+            hasattr(self,'wl_isLocked') and self.wl_isLocked()):
+            return self.davLockDialog()
+
+        # what are we going to do ? set up page, text & action accordingly
+        if page is None:
+            # no page specified - editing the current page
+            page = self.pageName()
+            text = self.read()
+        elif self.pageWithName(page):
+            # editing a different page
+            text = self.pageWithName(page).read()
+        else:
+            # editing a brand-new page
+            action = 'Create'
+            text = text or ''
+
+        # display the edit form - a dtml method or the builtin default
+        # NB we redefine id as a convenience, so that one header can work
+        # for pages and editforms
+        # XXX can we simplify this/make dtml more version independent ?
+        # NB 'id' and 'oldid' are no longer used, but provide them for
+        # backwards compatibility with old templates
+            
+        return self.getSkinTemplate('editform')(self,REQUEST,
+                                                page=page,
+                                                text=text,
+                                                action=action,
+                                                id=page,
+                                                oldid=self.id())
+
+    security.declareProtected(Permissions.View, 'recentchanges')
+    def recentchanges(self, REQUEST=None):
+        """
+        Render the recentchanges form (template-customizable).
+        """
+        return self.getSkinTemplate('recentchanges')(self,REQUEST)
+
+    # we call this searchwiki, not searchpage, for clarity
+    security.declareProtected(Permissions.View, 'searchwiki')
+    def searchwiki(self, REQUEST=None):
+        """
+        Render the searchwiki form (template-customizable).
+        """
+        return self.getSkinTemplate('searchwiki')(self,REQUEST)
+
+    searchpage = searchwiki # alias
+
+    security.declareProtected(Permissions.View, 'helppage')
+    def helppage(self, REQUEST=None):
+        """
+        Render the helppage form (template-customizable).
+        """
+        return self.getSkinTemplate('helppage')(self,REQUEST)
+
+    security.declareProtected(Permissions.View, 'showAccessKeys')
+    def showAccessKeys(self):
+        """
+        Show the access keys supported by the built-in skins.
+        """
+        return _("""
+        Access keys can be accessed in mozilla-based browsers by pressing alt-<key>
+        IE users: must also press enter
+        Mac users: command-<key>
+        Opera users: shift-escape-<key>
+        These won't work here, back up to the previous page to try them out.
+
+        0    show these access key assignments
+
+        wiki functions:
+        f    show front page
+        c    show wiki contents
+        r    show wiki recent changes
+             show discussion page
+        t    show issue tracker
+        i    show wiki index
+        o    show wiki options (preferences)
+        h    show help page
+        s    go to search field
+        
+        page functions:
+        +    (in a plone/cmf site with skin switching set up) use zwiki's plone/cmf skin
+        -    (in a plone/cmf site with skin switching set up) use zwiki's standard skin
+        v    view page
+        m    mail subscription
+        b    show backlinks (links to this page)
+        d    show diffs (page edit history)
+        y    show full history (in ZMI)
+        e    edit this page                       
+        x    edit with an external editor
+             print this page (and subtopics)
+        q    view page source (quick-view)
+             wipe and regenerate this page's render cache
+             go to subtopics
+             go to comments (messages)
+             go to page author's home page, if possible
+        n    next page
+        p    previous page
+        u    up to parent page
+        
+        in edit form:
+        s    save changes
+        p    preview
+        
+        when viewing diffs:
+        n    next edit
+        p    previous edit
+        """)
+    
+    security.declareProtected(Permissions.View, 'stylesheet')
+    def stylesheet(self, REQUEST=None):
+        """
+        Return the style sheet used by the other templates.
+
+        Template-customizable. Unlike the other skin methods, this one can
+        be overridden by either a 'stylesheet' or a 'stylesheet.css'
+        template - this is a little annoying.
+
+        Also the template in this case is usually a File (but can also be
+        a page template or dtml method for a dynamic stylesheet). When a
+        File is used the Last-modified header is set to help caching.
+        (Also, all pages use a single stylesheet url -
+        DEFAULTPAGE/stylesheet).
+        """
+        if REQUEST: REQUEST.RESPONSE.setHeader('Content-Type', 'text/css')
+        #XXX self.getSkinTemplate('stylesheet')
+        form = getattr(self.folder(),'stylesheet',
+                       getattr(self.folder(),'stylesheet.css',
+                               TEMPLATES['stylesheet']
+                               ))
+        if isPageTemplate(form) or isDtmlMethod(form):
+            return form.__of__(self)(self,REQUEST)
+        else: # a File
+            if REQUEST:
+                modified = form.bobobase_modification_time()
+                REQUEST.RESPONSE.setHeader('Last-Modified',
+                                           rfc1123_date(modified))
+            return form.index_html(REQUEST,REQUEST.RESPONSE)
+
+    security.declareProtected(Permissions.View, 'subscribeform')
+    def subscribeform(self, REQUEST=None):
+        """
+        Render the mail subscription form (template-customizable).
+        """
+        return self.getSkinTemplate('subscribeform')(self,REQUEST)
+
+    security.declareProtected(Permissions.View, 'useroptions')
+    def useroptions(self, REQUEST=None):
+        """
+        Render the useroptions form (template-customizable).
+        """
+        return self.getSkinTemplate('useroptions')(self,REQUEST)
+
+InitializeClass(SkinViews)
+
+
+
+class SkinUtils:
+    """
+    This mixin provides utilities for our views, so that they can work in
+    any kind of configuration - default or customized, standard or
+    cmf/plone, old or new templates..
+    """
+    security = ClassSecurityInfo()
+
+    # make MACROS available to all templates as here/macros
+    macros = ComputedAttribute(getmacros,1)
+
+    ## backwards compatibility - some old plone wikis expect wikipage_view
+    ## or wikipage actions ?
+    #security.declareProtected(Permissions.View, 'wikipage')
+    #def wikipage(self, dummy=None, REQUEST=None, RESPONSE=None):
+    #    """
+    #    Render the main page view (dummy method to allow standard skin in CMF).
+    #
+    #    XXX should be going away soon. Old comment: the wikipage template
+    #    is usually applied by __call__ -> addSkinTo, but this method is
+    #    provided so you can configure it as the"view" action
+    #    in portal_types -> Wiki Page -> actions and get use Zwiki's standard 
+    #    skin inside a CMF/Plone site.
+    #    """
+    #    return self.render(REQUEST=REQUEST,RESPONSE=RESPONSE)
+    #wikipage_view = wikipage
+    
+    # backwards compatibility - some old templates expect
+    # wikipage_template().macros or wikipage_macros something something
+    def wikipage_template(self, REQUEST=None): return self
+    wikipage_macros = wikipage_template
+
+    security.declareProtected(Permissions.View, 'getmaintemplate')
+    def getmaintemplate(self, REQUEST=None):
+        """
+        Return the standard Zwiki or CMF/Plone main template, unevaluated.
+
+        This fetches the appropriate main template depending on whether we
+        are in or out of cmf/plone (and in the latter case, whether the
+        user has selected standard or plone skin mode). We point the
+        'main_template' computed attribute at this method, which allows
+        our templates to use here/main_template and always be
+        appropriately skinned.
+        """
+        # XXX not really working out yet.. need this hack
+        # all skin templates wrap themselves with main_template
+        # in CMF, use the cmf/plone one, otherwise use ours
+        # should allow use of ours in cmf/plone also
+        if self.inCMF() and self.displayMode() == 'plone':
+            return self.getSkinTemplate('main_template') # plone's
+        else:
+            return self.getSkinTemplate('maintemplate')  # zwiki's
+    main_template = ComputedAttribute(getmaintemplate,1)
+
+    def getSkinTemplate(self,name):
+        """
+        Get the named skin template from the ZODB or filesystem.
+
+        This will find either a Page Template or DTML Method with the
+        specified name. We look first for a template with this name in the
+        ZODB acquisition context, trying the .pt, .dtml or no suffix in
+        that order. Then we look in skins/zwiki on the filesystem. If no
+        matching template can be found, we return a generic error template.
+
+        For convenient skin development, we return the template wrapped in
+        the current page's context (so here will be the page, container
+        will be the folder, etc).
+                
+        This is basically duplicating the CMF skin mechanism, but in a
+        way that works everywhere, and with some extra error-handling
+        to help skin customizers. Still evolving, it will all shake
+        out in the end.
+        """
+        obj = getattr(self.folder(), name+'.pt',
+                      getattr(self.folder(), name+'.dtml',
+                              getattr(self.folder(), name,
+                                      None)))
+        if not isTemplate(obj): # don't accept a non-template object
+            obj = TEMPLATES.get(name, TEMPLATES['badtemplate'])
+        # return it with both folder and page in the acquisition context,
+        # setting container and here
+        return obj.__of__(self.folder()).__of__(self)
+
+    def hasSkinTemplate(self,name):
+        """
+        Does the named skin template exist in the aq context or filesystem ?
+        """
+        # != ignores any acquisition wrapper
+        return self.getSkinTemplate(name) != TEMPLATES['badtemplate']
+        
+    security.declareProtected(Permissions.View, 'addSkinTo')
+    def addSkinTo(self,body,**kw):
+        """
+        Add the main wiki page skin to some body text, unless 'bare' is set.
+
+        XXX used only for the main page view. Perhaps a wikipage view
+        method should replace it ? Well for now this is called by the page
+        type render methods, which lets them say whether the skin is
+        applied or not.
+        """
+        REQUEST = getattr(self,'REQUEST',None)
+        if (hasattr(REQUEST,'bare') or kw.has_key('bare')):
+            return body
+        else:
+            return self.getSkinTemplate('wikipage')(self,REQUEST,body=body,**kw)
+
+InitializeClass(SkinUtils)
+
+
+
+class SkinSwitchingUtils:
+    """
+    This mixin provides methods for switching between alternate skins
+    (or between display modes within a single zope skin).
+    """
+    security = ClassSecurityInfo()
+
+    security.declareProtected(Permissions.View, 'setskin')
+    def setskin(self,skin=None):
+        """
+        When in a CMF/Plone site, switch between standard and plonish UI.
+
+        The user's preferred skin mode is stored in a zwiki_displaymode
+        cookie.  This was once used to change the appearance of the
+        non-plone standard skin (full/simple/minimal); later it acquired
+        the ability to switch between CMF skins in CMF/plone; now it just
+        selects the zwiki or plone appearance in CMF/plone, by setting a
+        cookie for getmaintemplate().
+        """
+        if skin in ('plone', 'cmf'):
+            self.setDisplayMode('plone')
+        else:
+            self.setDisplayMode('zwiki')
+
+    security.declareProtected(Permissions.View, 'setDisplayMode')
+    def setDisplayMode(self,mode):
+        """
+        Save the user's choice of skin mode as a cookie.
+
+        For 1 year, should they be permanent ?
+        """
+        REQUEST = self.REQUEST
+        RESPONSE = REQUEST.RESPONSE
+        RESPONSE.setCookie('zwiki_displaymode',
+                           mode,
+                           path='/',
+                           expires=(self.ZopeTime() + 365).rfc822())
+        RESPONSE.redirect(REQUEST.get('came_from',
+                                      REQUEST.get('URL1')))
+
+    setSkinMode = setDisplayMode #backwards compatibility
+
+    security.declareProtected(Permissions.View, 'displayMode')
+    def displayMode(self,REQUEST=None):
+        """
+        Find out the user's preferred skin mode.
+        """
+        REQUEST = REQUEST or self.REQUEST
+        defaultmode = (self.inCMF() and 'plone') or 'zwiki'
+        m = REQUEST.get('zwiki_displaymode', None)
+        if not m in ['zwiki','plone']:
+            m = defaultmode
+        return m
+
+    security.declareProtected(Permissions.View, 'usingPloneSkin')
+    def usingPloneSkin(self,REQUEST=None):
+        """
+        Convenience utility for templates: are we using plone skin ?
+
+        Ie, are we using the plone display mode of zwiki's standard skin.
+        """
+        return (self.inCMF() and self.displayMode()=='plone')
+        
+    security.declareProtected(Permissions.View, 'setCMFSkin')
+    def setCMFSkin(self,REQUEST,skin):
+        """
+        Change the user's CMF/Plone skin preference, if possible.
+        """
+        # are we in a CMF site ?
+        if not self.inCMF(): return
+        portal_skins = self.portal_url.getPortalObject().portal_skins
+        portal_membership = self.portal_url.getPortalObject().portal_membership
+        # does the named skin exist ?
+        def hasSkin(s): return portal_skins.getSkinPath(s) != s
+        if not hasSkin(skin): return
+        # is the user logged in ? if not, return harmlessly
+        member = portal_membership.getAuthenticatedMember()
+        if not hasattr(member,'setProperties'): return
+        # change their skin preference and reload page
+        REQUEST.form['portal_skin'] = skin
+        member.setProperties(REQUEST)
+        portal_skins.updateSkinCookie()
+        REQUEST.RESPONSE.redirect(REQUEST.get('URL1'))
+
+InitializeClass(SkinSwitchingUtils)
+
+
+class PageViews(
+    SkinViews,
+    SkinUtils,
+    SkinSwitchingUtils,
+    ):
+    pass

Added: zope-zwiki/branches/upstream/current/Views_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/Views_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/Views_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,107 @@
+from testsupport import *
+ZopeTestCase.installProduct('ZWiki')
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    suite.addTest(unittest.makeSuite(BindingsTests))
+    return suite
+
+class Tests(ZwikiTestCase):
+
+    def test_templatesHaveMetaType(self):
+        TEMPLATES = ZWiki.Views.TEMPLATES
+        # do all default templates have meta_type ? this has been fragile
+        self.failIf(filter(lambda x:not hasattr(x,'meta_type'),TEMPLATES.values()))
+
+class BindingsTests(ZwikiTestCase):
+    """
+    Tests of template bindings and acquisition context, for eg #1285 and #1220.
+
+    I want to test that "container" is the current page's folder in all cases.
+    """
+    def afterSetUp(self):
+        ZwikiTestCase.afterSetUp(self)
+        #self.folder.template = PageTemplate('test')
+
+    def checkContainerIsFolder(self, template):
+        container = re.match(r'container=(.*)', template(self.page,self.request)).group(1)
+        self.assertEquals(container, repr(self.page.folder()))        
+
+    """
+    standard wiki:
+     uncustomised template from fs
+    """
+    def test_bindingsCase1(self):
+        template = self.page.getSkinTemplate('testtemplate')
+        self.checkContainerIsFolder(template)
+
+    """
+     customised template from wiki folder
+    """
+    def Xtest_bindingsCase2(self):
+        template = self.page.getSkinTemplate('testtemplate')
+        self.assertEquals(
+            repr(template),
+            '<PageTemplateFile at /test_folder_1_/wiki/testtemplate used for /test_folder_1_/wiki/TestPage>'
+            )
+        installTemplateInZodb(self.folder, template)
+        template = self.page.getSkinTemplate('testtemplate')
+        self.assertEquals(
+            repr(template),
+            '<ZopePageTemplate at /test_folder_1_/wiki/testtemplate used for /test_folder_1_/wiki/TestPage>'
+            ) # actually '<ZopePageTemplate at /test_folder_1_/testtemplate used for /test_folder_1_/wiki/TestPage>'
+        self.checkContainerIsFolder(template)
+
+    """
+     customised template acquired from parent folder
+    """
+    def Xtest_bindingsCase3(self):
+        template = self.page.getSkinTemplate('testtemplate')
+        self.assertEquals(
+            repr(template),
+            '<PageTemplateFile at /test_folder_1_/wiki/testtemplate used for /test_folder_1_/wiki/TestPage>'
+            )
+        installTemplateInZodb(self.folder.aq_parent, template)
+        template = self.page.getSkinTemplate('testtemplate')
+        self.assertEquals(
+            repr(template),
+            '<ZopePageTemplate at /test_folder_1_/testtemplate used for /test_folder_1_/wiki/TestPage>'
+            ) # actually '<ZopePageTemplate at /testtemplate used for /test_folder_1_/wiki/TestPage>'
+        
+        self.checkContainerIsFolder(template)
+
+    """
+    plone wiki, in a subfolder, not the root
+     uncustomised fs template from portal_skins/zwiki
+    """
+    def test_bindingsCase4(self):
+        pass
+
+    """
+     customised zodb template from portal_skins/custom
+    """
+    def test_bindingsCase5(self):
+        pass
+
+    """
+     customised template from wiki folder
+    """
+    def test_bindingsCase6(self):
+        pass
+
+    """
+     customised template acquired from parent folder
+    """
+    def test_bindingsCase7(self):
+        pass
+
+
+from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
+
+def installTemplateInZodb(folder, template):
+    obj = ZopePageTemplate(template.getId(), template._text, template.content_type)
+    obj.expand = 0
+    obj.write(template.read())
+    id = obj.getId()
+    folder._setObject(id, obj)

Added: zope-zwiki/branches/upstream/current/ZWikiPage.py
===================================================================
--- zope-zwiki/branches/upstream/current/ZWikiPage.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/ZWikiPage.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1466 @@
+"""
+The main Zwiki module. See README.txt.
+
+(c) 1999-2004 Simon Michael <simon at joyful.com> for the zwiki community.
+Wikiwikiweb formatting by Tres Seaver <tseaver at zope.com>
+Parenting code and regulations by Ken Manheimer <klm at zope.com>
+Initial Zope CMF integration by Chris McDonough <chrism at zope.com>
+Full credits are at http://zwiki.org/ZwikiContributors .
+
+This product is available under the GNU GPL.  All rights reserved, all
+disclaimers apply, etc.
+
+
+STYLE NOTES
+    
+imports
+
+ are usually in three groups: python, then zope, then zwiki imports
+
+docstrings
+
+ "The first line should always be a short, concise summary of the
+ object's purpose.  For brevity, it should not explicitly state the
+ object's name or type, since these are available by other means (except
+ if the name happens to be a verb describing a function's operation).
+ This line should begin with a capital letter and end with a period.
+
+ If there are more lines in the documentation string, the second line
+ should be blank, visually separating the summary from the rest of the
+ description.  The following lines should be one or more paragraphs
+ describing the object's calling conventions, its side effects, etc.
+
+ Data attributes override method attributes with the same name; to
+ avoid accidental name conflicts, which may cause hard-to-find bugs in
+ large programs, it is wise to use some kind of convention 
+ [such as] verbs for methods and nouns for data attributes."
+
+method visibility
+
+ naming with _ for privacy obscures the code, and so do excessive
+ security declarations. Omitting docstrings or documenting with comments
+ are not good either. Where a docstring is needed, I'm considering
+ putting it above the method name to indicate private methods, which
+ avoids these problems and makes it easy to change your mind.
+ No, too weird.
+
+"""
+
+from __future__ import nested_scopes
+import os, sys, re, string, time, thread
+from string import split,join,find,lower,rfind,atoi,strip
+from urllib import quote, unquote
+from types import *
+
+#import ZODB # need this for pychecker
+from AccessControl import getSecurityManager, ClassSecurityInfo
+from App.Common import rfc1123_date
+from DateTime import DateTime
+from Globals import InitializeClass
+from OFS.DTMLDocument import DTMLDocument
+from webdav.WriteLockInterface import WriteLockInterface
+
+import Permissions
+from Defaults import AUTO_UPGRADE, IDS_TO_AVOID, \
+     PAGE_METATYPE, LINK_TO_ALL_CATALOGED, LINK_TO_ALL_OBJECTS, \
+     WIKINAME_LINKS, BRACKET_LINKS, DOUBLE_BRACKET_LINKS, \
+     DOUBLE_PARENTHESIS_LINKS, ISSUE_LINKS
+from Regexps import url, bracketedexpr, singlebracketedexpr, \
+     doublebracketedexpr, doubleparenthesisexpr, wikiname, wikilink, \
+     interwikilink, remotewikiurl, protected_line, zwikiidcharsexpr, \
+     anywikilinkexpr, markedwikilinkexpr, localwikilink, \
+     spaceandlowerexpr, dtmlorsgmlexpr, wikinamewords, hashnumberexpr
+from Utils import PageUtils, BLATHER
+from Views import PageViews
+from OutlineSupport import PageOutlineSupport
+from Diff import PageDiffSupport
+from Mail import PageSubscriptionSupport, PageMailSupport
+from Catalog import PageCatalogSupport
+from CMF import PageCMFSupport
+from Comments import PageCommentsSupport
+from Admin import PageAdminSupport
+from Editing import PageEditingSupport
+from RSS import PageRSSSupport
+from I18n import DTMLFile, _
+from pagetypes import PAGETYPES, PAGE_TYPES
+from pagetypes.common import MIDSECTIONMARKER
+from pagetypes.stx import PageTypeStx
+from plugins import PLUGINS
+
+DEFAULT_PAGETYPE = PAGETYPES[0]
+
+
+class ZWikiPage(    
+    PLUGINS[0], # see plugins/__init__.py    
+    PLUGINS[1],
+    PLUGINS[2],
+    PLUGINS[3],
+    PLUGINS[4],
+    PLUGINS[5],
+    PLUGINS[6],
+    PLUGINS[7],
+    PLUGINS[8],
+    PLUGINS[9],
+    PLUGINS[10],
+    PLUGINS[11],
+    PLUGINS[12],
+    PLUGINS[13],
+    PLUGINS[14],
+    PLUGINS[15],
+    PageEditingSupport, 
+    PageOutlineSupport,
+    PageDiffSupport,
+    PageMailSupport,
+    PageSubscriptionSupport,
+    PageCatalogSupport,
+    PageCommentsSupport,
+    PageAdminSupport,
+    PageRSSSupport,
+    PageUtils,
+    PageViews,
+    DTMLDocument,
+    # XXX last to avoid PortalContent.id overriding DTMLDocument.id(),
+    # as older code expects ZWikiPage.id() to be callable.
+    PageCMFSupport,
+    ):
+    """
+    A ZWikiPage is essentially a DTML Document which knows how to render
+    itself in various wiki styles, and can function inside or outside a
+    CMF site. A lot of extra methods are provided to support
+    wiki-building, email, issue tracking, etc.  Mixins are used to
+    organize functionality into modules.
+    """
+    __implements__ = (WriteLockInterface, PageCMFSupport.__implements__)
+    security = ClassSecurityInfo()
+    security.declareObjectProtected('View')
+    security.declareProtected(Permissions.Edit, 'revert')
+    security.declareProtected(Permissions.Edit, 'manage_upload')
+    security.declareProtected(Permissions.FTP, 'manage_FTPstat') # needed
+    security.declareProtected(Permissions.FTP, 'manage_FTPlist') # ?
+    # perms need at least one declaration (in this file ?) to be recognized
+    # this is dumb indeed.. need tests to figure out the rules of this game
+    security.declareProtected(Permissions.ChangeType, 'dummy')
+    def dummy(self): pass
+    security.declareProtected(Permissions.Reparent, 'dummy2')
+    def dummy2(self): pass
+    def checkPermission(self, permission, object):
+        return getSecurityManager().checkPermission(permission,object)
+
+    # properties visible in the ZMI
+    _properties=(
+        # XXX title is read only for now to avoid de-syncing title & id
+        # but they can still rename in ZMI.. we should override
+        # manage_changeProperties and manage_renameObject perhaps
+        # reverted - too many breakages
+        {'id':'title', 'type': 'string', 'mode':'w'},
+        # page_type is now an object.. can we show pageTypeId() ?
+        #{'id':'page_type', 'type': 'selection', 'mode': 'w',
+        # 'select_variable': 'ALL_PAGE_TYPES'},
+        {'id':'creator', 'type': 'string', 'mode': 'r'},
+        {'id':'creator_ip', 'type': 'string', 'mode': 'r'},
+        {'id':'creation_time', 'type': 'string', 'mode': 'r'},
+        {'id':'last_editor', 'type': 'string', 'mode': 'r'},
+        {'id':'last_editor_ip', 'type': 'string', 'mode': 'r'},
+        {'id':'last_edit_time', 'type': 'string', 'mode': 'r'},
+        {'id':'last_log', 'type': 'string', 'mode': 'r'},
+        ) \
+        + PageOutlineSupport._properties \
+        + PageSubscriptionSupport._properties \
+        + PageCatalogSupport._properties
+
+    meta_type = PAGE_METATYPE
+    icon      = "misc_/ZWiki/ZWikiPage_icon"
+    creator = ''
+    creator_ip = ''
+    creation_time = ''
+    last_editor = ''
+    last_editor_ip = ''
+    last_edit_time = ''
+    last_log = ''
+    PAGE_TYPES = PAGE_TYPES # used by skin templates
+    # page_type used to be a string used to select a render method. 
+    # As of 0.25 it is an object which encapsulates the page's formatting
+    # behaviour. It will return the old id string when called, which
+    # should keep existing catalogs working.
+    page_type = DEFAULT_PAGETYPE()
+
+    # XXX page_type's are separate instances - use class or singleton instance ?
+    def setPageType(self,id=None): self.page_type = self.lookupPageType(id)()
+    security.declarePublic('pageType') # useful for troubleshooting
+    def pageType(self):
+        """Return this page's page type object."""
+        # check for page type problems
+        # old-style page type string ?
+        if type(self.page_type) == StringType:
+            new = self.newPageTypeIdFor(self.page_type)
+            BLATHER("upgrading %s's page type from %s to %s" % (self.id(),self.page_type,new))
+            self.setPageType(new)
+        # page type whose plugin is no longer installed ?
+        elif not hasattr(self.page_type,'render'):
+            self.setPageType(DEFAULT_PAGETYPE)
+        return self.page_type
+    def lookupPageType(self,id=None):
+        """Return the page type object with this id (or the default)"""
+        match = filter(lambda x:x._id==id,PAGETYPES)
+        return (match and match[0]) or DEFAULT_PAGETYPE
+    security.declarePublic('pageTypeId') # useful for troubleshooting
+    def pageTypeId(self):
+        """Return the short id for this page's page type."""
+        return self.pageType().id()
+
+    # pre-rendered text cache
+    _prerendered = ''   
+    def setPreRendered(self,t): self._prerendered = t
+    def preRendered(self):
+        # cope with non-existing or None attribute on old instances - needed ?
+        return getattr(self,'_prerendered','') or ''
+
+    ######################################################################
+    # initialization
+
+    def __init__(self, source_string='', mapping=None, __name__=''):
+        """
+        Initialise this instance, including it's CMF data if applicable.
+
+        Ugly, but putting PageCMFSupport before DTMLDocument in the
+        inheritance order creates problems.
+        """
+        if self.supportsCMF():
+            PageCMFSupport.__init__(self,
+                                  source_string=source_string,
+                                  mapping=mapping,
+                                  __name__=__name__,
+                                  )
+        else:
+            DTMLDocument.__init__(self,
+                                  source_string=source_string,
+                                  mapping=mapping,
+                                  __name__=__name__,
+                                  )
+
+    ######################################################################
+    # generic rendering code (see also pagetypes/*)
+
+    security.declareProtected(Permissions.View, '__call__')
+    def __call__(self, client=None, REQUEST={}, RESPONSE=None, **kw):
+        """
+        Render this zwiki page, also upgrading it on the fly if needed.
+        """
+        if AUTO_UPGRADE: self.upgrade(REQUEST)
+        rendered = self.render(client,REQUEST,RESPONSE,**kw)
+        return rendered
+
+    def render(self, client=None, REQUEST={}, RESPONSE=None, **kw):
+        """
+        Render this page according to it's page_type.
+
+        Also tries to ensure the HTTP content-type (and charset) have an
+        appropriate value. These may be set by the page type, or
+        overridden by a zwiki_content_type property (LatexWiki support).
+        NB this can also get set in I18n.py.
+        """
+        if not self.preRendered(): self.preRender()
+        r = self.pageType().render(self, REQUEST, RESPONSE, **kw)
+        if RESPONSE:
+            if hasattr(self,'zwiki_content_type'):
+                RESPONSE.setHeader('content-type',getattr(self,'zwiki_content_type'))
+            elif not RESPONSE.getHeader('content-type'):
+                RESPONSE.setHeader('content-type','text/html')
+        return r
+
+    def preRender(self,clear_cache=0):
+        """
+        Make sure any applicable pre-rendering for this page has been done.
+        
+        If clear_cache is true, blow away any cached data.
+        XXX I think this happens anyway.
+        """
+        if clear_cache: self.clearCache()
+        self.setPreRendered(self.pageType().preRender(self))
+
+    def renderText(self, text, type, **kw):
+        """
+        Render some source text according to the specified page type.
+        """
+        return self.lookupPageType(type)().renderText(self,text,**kw)
+            
+    security.declareProtected(Permissions.View, 'clearCache')
+    def clearCache(self,REQUEST=None):
+        """
+        forcibly clear out any cached render data for this page
+        """
+        self.setPreRendered('')
+        if hasattr(self,'_v_cooked'):
+            delattr(self,'_v_cooked')
+            delattr(self,'_v_blocks')
+        if REQUEST: REQUEST.RESPONSE.redirect(self.pageUrl())
+
+    def cookDtmlIfNeeded(self):
+        if self.dtmlAllowed() and self.hasDynamicContent(): self.cook()
+
+    security.declareProtected(Permissions.View, 'cook')
+    def cook(self, cooklock=thread.allocate_lock()):
+        """
+        Pre-parse this page's text (the pre-rendered, if available) for DTML.
+        """
+        cooklock.acquire()
+        try:
+            self._v_blocks=self.parse(self.preRendered() or self.read())
+            self._v_cooked=None
+        finally:
+            cooklock.release()
+
+    def evaluatePreRenderedAsDtml(self,client=None, REQUEST={},
+                                  RESPONSE=None, **kw):
+        # optimization: to save memory, avoid unnecessarily calling DTML
+        # and generating _v_blocks data
+        if not self.hasDynamicContent(): return self.preRendered()
+        return DTMLDocument.__call__(
+            self.__of__(self.folder()), # ensure dtml in pages can acquire
+            client,
+            REQUEST,
+            RESPONSE,
+            **kw)
+    
+    def renderMidsectionIn(self, text, **kw):
+        """
+        Insert some final things between the rendered document and discussion.
+
+        A page's "midsection" is after the pristine gem-like main document,
+        right before the mudslinging. This is where we want to put the
+        automatic children list (subtopics), next/prev links, etc.
+
+        XXX This is not good enough. The midsection marker can get mixed
+        up with other rendering in the various page types.
+        
+        """
+        # page may not have been prerendered with midsection marker yet -
+        # we'll also insert at a messages separator, if we see one,
+        # otherwise leave it be
+        if string.find(text,MIDSECTIONMARKER) != -1:
+            try: doc, discussion = re.split(MIDSECTIONMARKER,text)
+            except ValueError:
+                #our marker got clobbered, or there's more than one - bail out
+                return text 
+                
+        elif string.find(text,r'<a name="messages">') != -1:
+            doc, discussion = re.split(r'<a name="messages">',text)
+            discussion = '<a name="messages">' + discussion
+        else:
+            return text
+        return doc + self.renderMidsection(**kw) + discussion
+
+    def renderMidsection(self,**kw):
+        """
+        Render whatever should be in this page's midsection.
+
+        This is the subtopics, in the preferred style, if enabled, or
+        nothing.  As a convenience, if it seems subtopics are already
+        displayed via custom DTML code, we won't display them again.
+        """
+        if self.subtopicsEnabled(**kw) and not self.displaysSubtopicsWithDtml():
+            return self.subtopics()
+        else:
+            return ''
+
+    def displaysSubtopicsWithDtml(self):
+        """
+        True if this page appears to display subtopics via custom DTML.
+        """
+        return (self.hasDynamicContent() and
+                self.dtmlAllowed() and
+                (re.search(r'(?i)(<dtml-var["\s]+|&dtml-)subtopics',
+                           self.read()) is not None))
+    
+    security.declareProtected(Permissions.View, 'supportsStx')
+    def supportsStx(self): 
+        """supportsStx""" 
+        return self.pageType().supportsStx()
+
+    security.declareProtected(Permissions.View, 'supportsRst')
+    def supportsRst(self): 
+        """supportsRst""" 
+        return self.pageType().supportsRst()
+
+    security.declareProtected(Permissions.View, 'supportsWwml')
+    def supportsWwml(self): 
+        """supportsWwml""" 
+        return self.pageType().supportsWwml()
+
+    security.declareProtected(Permissions.View, 'supportsWikiLinks')
+    def supportsWikiLinks(self): 
+        """supportsWikiLinks"""
+        return self.pageType().supportsWikiLinks()
+
+    security.declareProtected(Permissions.View, 'supportsHtml')
+    def supportsHtml(self): 
+        """Does this page render ordinary HTML tags ?"""
+        return self.pageType().supportsHtml()
+
+    security.declareProtected(Permissions.View, 'supportsDtml')
+    def supportsDtml(self): 
+        """Does this page support embedded DTML ?"""
+        return self.pageType().supportsDtml()
+
+    security.declareProtected(Permissions.View, 'hasDynamicContent')
+    def hasDynamicContent(self):
+        """hasDynamicContent"""
+        return (self.supportsDtml() and
+                re.search(r'(?i)(<dtml|&dtml)',self.read()) is not None)
+
+    security.declareProtected(Permissions.View, 'dtmlAllowed')
+    def dtmlAllowed(self):
+        """Is embedded DTML permitted on this page ?"""
+        return (
+            getattr(self,'allow_dtml',0) and
+            not hasattr(self,'no_dtml')
+            )
+
+    security.declareProtected(Permissions.View, 'supportsEpoz')
+    def supportsEpoz(self):
+        """Is Epoz editing available for this page ?"""
+        return self.epozInstalled() and self.pageType().supportsEpoz()
+
+    security.declareProtected(Permissions.View, 'epozInstalled')
+    def epozInstalled(self):
+        """Is Epoz installed ?"""
+        return hasattr(self,'Epoz')
+
+    ######################################################################
+    # link rendering and handling
+
+    def wikinameLinksAllowed(self):
+        """Are wikinames linked in this wiki ?"""
+        return getattr(self,'use_wikiname_links',WIKINAME_LINKS)
+
+    def issueLinksAllowed(self):
+        """Are issue numbers (#NNNN) linked in this wiki ?"""
+        return getattr(self,'use_issue_links',ISSUE_LINKS)
+
+    def bracketLinksAllowed(self):
+        """Are bracketed freeform names linked in this wiki ?"""
+        return getattr(self,'use_bracket_links',BRACKET_LINKS)
+
+    def doubleBracketLinksAllowed(self):
+        """Are wikipedia-style double bracketed names linked in this wiki ?"""
+        return getattr(self,'use_double_bracket_links',DOUBLE_BRACKET_LINKS)
+
+    def doubleParenthesisLinksAllowed(self):
+        """Are wicked-style double parenthesis names linked in this wiki ?"""
+        return getattr(
+            self,'use_double_parenthesis_links',DOUBLE_PARENTHESIS_LINKS)
+
+    def isWikiName(self,name):
+        """Is name a WikiName ?"""
+        return re.match('^%s$' % wikiname,name) is not None
+
+    def isValidWikiLinkSyntax(self,link):
+        """Does link look a valid wiki link syntax for this wiki ?
+        """
+        return ((
+            (self.wikinameLinksAllowed() and
+                re.match(wikiname,link))
+            or (self.issueLinksAllowed() and
+                re.match(hashnumberexpr,link))
+            or (self.bracketLinksAllowed() and
+                re.match(singlebracketedexpr,link))
+            or (self.doubleBracketLinksAllowed() and
+                re.match(doublebracketedexpr,link))
+            or (self.doubleParenthesisLinksAllowed() and
+                re.match(doubleparenthesisexpr,link))) and 1)
+
+    def markLinksIn(self,text,urls=1):
+        """
+        Find and mark links in text, for fast replacement later.
+
+        Successor to _preLink. Instead of generating a list of text
+        extents and link names, this simply marks the links in place to
+        make them easy to find again.  Tries to be smart about finding
+        links only where you want it to.
+
+        As well as all kinds of Zwiki wiki-links, marks bare urls, unless
+        urls is false (useful for restructured text).
+        """
+        markedtext = ''
+        state = {'lastend':0,'inpre':0,'incode':0,'intag':0,'inanchor':0}
+        lastpos = 0
+        while 1:
+            m = anywikilinkexpr.search(text,lastpos)
+            if m:
+                # found some sort of link pattern - check if we should link it
+                link = m.group()
+                linkstart,linkend = m.span()
+                if (link[0]=='!'
+                    or not (self.isValidWikiLinkSyntax(link)
+                            or (urls and re.match(url,link))
+                            )
+                    or within_literal(linkstart,linkend-1,state,text) # XXX these
+                    or withinSgmlOrDtml((linkstart,linkend),text)):   # overlap ?
+                    # no - ignore it (and strip the !)
+                    if link[0] == '!':
+                        link=link[1:]
+                    markedtext += text[lastpos:linkstart] + link
+                else:
+                    # yes - mark it for later
+                    markedtext += '%s<zwiki>%s</zwiki>' \
+                                  % (text[lastpos:linkstart],link)
+                lastpos = linkend
+            else:
+                # no more links - save the final text extent & quit
+                markedtext += text[lastpos:]
+                break
+        return markedtext
+
+    def renderMarkedLinksIn(self,text):
+        """
+        Render the links in text previously marked by markLinksIn.
+        """
+        return re.sub(markedwikilinkexpr,self.renderLink,text)
+        #XXX optimisation - could call renderLink for unique links only
+
+    def renderLinksIn(self,text):
+        """
+        Find and render all links in text in one step.
+
+        An alternative to the more usual markLinksIn + renderMarkedLinksIn.
+        """
+        t = self.applyWikiLinkLineEscapesIn(text)
+        # ken's clever thunk_substituter helps provide context (or something)
+        return re.sub(anywikilinkexpr,
+                      thunk_substituter(self.renderLink, t, 1),
+                      t)
+
+    wikilink = renderLinksIn # convenience alias
+
+    security.declareProtected(Permissions.View, 'applyWikiLinkLineEscapesIn')
+    def applyWikiLinkLineEscapesIn(self, text):
+        """
+        Escape all wikilinks in lines in text which begin with !.
+        """
+        return re.sub(
+            protected_line,
+            lambda m:re.sub(wikilink, r'!\1', m.group(1)),
+            text)
+        
+    def renderLink(self,link,allowed=0,state=None,text='',
+                   link_title=None,access_key=None):
+        """
+        Render various kinds of hyperlink, based on page and wiki state.
+
+        Can be called three ways:
+        - directly (link should be a string)
+        - from re.sub (link will be a match object, state will be None)
+        - from re.sub via thunk substituter (state will be a dictionary) (old)
+        """
+        # preliminaries
+        if not link: return ''
+        if type(link) == StringType:
+            text = self.preRendered()
+        elif state == None:
+            link = link.group()
+            text = self.preRendered()
+        else:
+            match = link
+            link = match.group()
+            # we are being called from re.sub, using thunk_substituter to
+            # keep state - do the within_literal and within sgml checks that
+            # would normally be done in markLinksIn
+            if (within_literal(match.start(),match.end()-1,state,text) or
+                withinSgmlOrDtml(match.span(),text)):
+                return link
+        link = linkorig = re.sub(markedwikilinkexpr, r'\1', link)
+
+        # here we go
+        # is this link escaped ?
+        if link[0] == '!':
+            return link[1:]
+
+        # is it an interwiki link ?
+        if re.match(interwikilink,link):
+            return self.renderInterwikiLink(link)
+
+        # is it a STX footnote ? check for matching named anchor in the page text
+        if re.match(singlebracketedexpr,link):
+            linknobrackets = re.sub(singlebracketedexpr, r'\1', link)
+            if re.search(
+                r'(?s)<a name="ref%s"' % (re.escape(linknobrackets)),text):
+                return '<a href="%s#ref%s" title="footnote %s">[%s]</a>' % (
+                    self.pageUrl(),linknobrackets,
+                    linknobrackets,linknobrackets)
+
+        # is it a bare URL ?
+        if re.match(url,link):
+            return '<a href="%s">%s</a>' % (link, link)
+
+        # is it a hash number issue link (#123) ?
+        if re.match(hashnumberexpr,link):
+            # yes - convert to the id of the issue page with that number
+            # and continue; if we can't, don't bother linking
+            p = self.issuePageWithNumber(self.issueNumberFrom(link))
+            if p:
+                try: link = p.getId() # XXX poor caching
+                except: link = p.id   # all-brains
+                return self.renderLinkToPage(link,
+                                             linkorig=linkorig,
+                                             link_title=link_title,
+                                             access_key=access_key)
+            else:
+                return linkorig
+
+        # is it a wiki link, of a kind that's allowed in this wiki ?
+        # (bare, bracketed, double bracketed, double parenthesis)
+        if not self.isValidWikiLinkSyntax(link):
+            # no - we have exhausted our linking arsenal, give up
+            return linkorig
+
+        # is it a freeform wiki link ?
+        if not self.isWikiName(link):
+            # yes - use fuzzy matching to match an existing page if possible.
+            # strip brackets/parentheses
+            link = stripDelimitersFrom(linkorig)
+            p = self.pageWithFuzzyName(link)
+            if p:
+                try: link = p.getId() # XXX poor caching
+                except: link = p.id   # all-brains
+                # and fall through
+            
+        # must be either a WikiName link, or an existing page's id from above
+        return self.renderLinkToPage(link,
+                                     linkorig=linkorig,
+                                     link_title=link_title,
+                                     access_key=access_key)
+
+    # XXX helper for above
+    def renderLinkToPage(self,page,linkorig=None,link_title=None,
+                         access_key=None,name=None):
+                         
+        """
+        Render a wiki link to page, which may or may not exist.
+
+        page is renderLink's best guess at the id or name of the page
+        intended.
+        """
+        # does page exist in this wiki ?
+        p = self.pageWithNameOrId(page)
+        if p:
+            # yes - link to it
+            # make sure we have the page's id
+            if not self.pageWithId(page): # XXX this check helps avoid zodb loads ?
+                try: page = p.getId() # XXX poor caching
+                except: page = p.id   # all-brains
+            title     = (link_title and ' title="%s"' % link_title) or '' #' title="%s"' % self.pageWithId(page).linkTitle()
+            name      = (name and ' name="%s"' % name) or ''
+            accesskey = (access_key and ' accesskey="%s"' % access_key) or ''
+            # XXX tracker plugin dependency
+            if p.isIssue():
+                try:
+                    style=' style="background-color:%s;"' % p.issueColour() # poor caching
+                except:
+                    style=' style="background-color:%s;"' % p.issueColour # all-brains
+            else:
+                style = ''
+            link      = stripDelimitersFrom(linkorig or page)
+            return '<a href="%s/%s"%s%s%s%s>%s</a>' % (
+                self.wikiUrl(),
+                quote(page),
+                title,
+                name,
+                accesskey,
+                style,
+                self.formatWikiname(link))
+        else:
+            # no - provide a creation link
+            return (
+                '%s<a class="new visualNoPrint" href="%s/%s/createform?page=%s" title="%s">?</a>' % (
+                self.formatWikiname(linkorig or page),
+                self.wikiUrl(),
+                quote(self.id()),
+                quote(page),
+                _("create this page")))
+                  
+        # subwiki support: or does a matching page exist in the parent folder ?
+        # XXX this is dumber than the above; doesn't handle i18n
+        # characters, freeform names
+        #if (hasattr(self.folder(),'aq_parent') and
+        #      hasattr(self.folder().aq_parent, page) and
+        #      self.isZwikiPage(getattr(self.folder().aq_parent,page))): #XXX poor caching
+        #    return '<a href="%s/../%s" title="%s">../%s</a>'\
+        #           % (self.wiki_url(),quote(page),_("page in parent wiki"),
+        #              self.formatWikiname(linkorig))
+
+
+    def renderInterwikiLink(self, link):
+        """
+        Render an occurence of interwikilink. link is a string.
+        """
+        if link[0] == '!': return link[1:]
+        m = re.match(interwikilink,link)
+        local, remote  = m.group('local'), m.group('remote')
+        # check local is an allowed link syntax for this wiki
+        if not self.isValidWikiLinkSyntax(local): return link
+        local = re.sub(bracketedexpr, r'\1', local) #XXX should support ((..))
+        # look for a RemoteWikiURL definition
+        if hasattr(self.folder(), local): 
+            m = re.search(remotewikiurl,getattr(self.folder(),local).text())
+            if m:
+                return '<a href="%s%s">%s:%s</a>' \
+                       % (m.group('remoteurl'),remote,local,remote)
+                       #XXX old html_unquote needed ? I don't think so
+        # otherwise return unchanged
+        return link
+
+    security.declareProtected(Permissions.View, 'formatWikiname')
+    def formatWikiname(self,wikiname):
+        """
+        Convert a wikiname to this wiki's standard display format.
+
+        Ie, leave it be or add ungodly spaces depending on the
+        'space_wikinames' property.
+        """
+        if self.spacedWikinamesEnabled():
+            return self.spacedNameFrom(wikiname)
+        else: 
+            return wikiname
+
+    security.declareProtected(Permissions.View, 'spacedNameFrom')
+    def spacedNameFrom(self,pagename):
+        """
+        Return pagename with spaces inserted if it's a WikiName, or unchanged.
+
+        Tries to be conformant with the wikiname regexp wrt. i18n, etc.
+        """
+        #spaced = pagename[0]
+        #for c in pagename[1:]:
+        #    if c in string.uppercase: spaced += ' '
+        #    spaced += c
+        #return spaced
+        if re.match('^%s$' % wikiname, pagename):
+            words = [x[0] for x in re.findall(wikinamewords,pagename)]
+            return ' '.join(words)
+        else:
+            return pagename
+
+    security.declareProtected(Permissions.View, 'spacedWikinamesEnabled')
+    def spacedWikinamesEnabled(self):
+        """Should all wikinames be displayed with spaces in this wiki ?"""
+        return getattr(self.folder(),'space_wikinames',0) and 1
+
+    security.declareProtected(Permissions.View, 'links')
+    def links(self):
+        """
+        List the unique links occurring on this page - useful for cataloging.
+
+        Includes urls & interwiki links but not structured text links.
+        Extracts the marked links from prerendered data.  Does not
+        generate this if missing - too expensive when cataloging ?
+        """
+        #if not self.preRendered(): self.preRender()
+        links = []
+        for l in re.findall(markedwikilinkexpr,self.preRendered()):
+            if not l in links: links.append(l)
+        return links
+
+    security.declareProtected(Permissions.View, 'canonicalLinks')
+    def canonicalLinks(self):
+        """
+        List the canonical id form of the local wiki links in this page.
+
+        Useful for calculating backlinks. Extracts this information
+        from prerendered data, does not generate this if missing.
+        """
+        clinks = []
+        localwikilinkexpr = re.compile(localwikilink)
+        for link in self.links():
+            if localwikilinkexpr.match(link):
+                if link[0] == r'[' and link[-1] == r']':
+                    link = link[1:-1]
+                clink = self.canonicalIdFrom(link)
+                clinks.append(clink)
+        return clinks
+
+    security.declareProtected(Permissions.View, 'linkTitle')
+    def linkTitle(self,prettyprint=0):
+        """
+        return a suitable value for the title attribute of links to this page
+
+        with prettyprint=1, format it for use in the standard header.
+        """
+        return self.linkTitleFrom(self.last_edit_time,
+                                  self.last_editor,
+                                  prettyprint=prettyprint)
+
+    # please clean me up
+    security.declareProtected(Permissions.View, 'linkTitleFrom')
+    def linkTitleFrom(self,last_edit_time=None,last_editor=None,prettyprint=0):
+        """
+        make a link title string from these last_edit_time and editor strings
+        
+        with prettyprint=1, format it for use in the standard header.
+        """
+        interval = self.asAgeString(last_edit_time)
+        if not prettyprint:
+            s = _("last edited %(interval)s ago") % {"interval":interval}
+        else:
+            try:
+                #XXX do timezone conversion ?
+                lastlog = self.lastlog()
+                if lastlog: lastlog = ' ('+lastlog+')'
+                
+                # build the link around the interval
+                linked_interval = (
+                    ' <a href="%s/diff" title="%s (%s)" >%s</a>' % (
+                    self.pageUrl(),
+                    _('show last edit'),
+                    lastlog, 
+                    interval))
+                
+                # use the link in a clear i18n way                                                                         
+                s =  _('last edited %(interval)s ago')  % {"interval": linked_interval}
+
+            except:
+                s = _('last edited %(interval)s ago') % {"interval": interval}
+                
+        if (last_editor and
+            not re.match(r'^[0-9\.\s]*$',last_editor)):
+            # escape some things that might cause trouble in an attribute
+            editor = re.sub(r'"',r'',last_editor)
+
+            #XXX cleanup
+            if not prettyprint:
+                s = s + " " + _("by %(editor)s")% {"editor":editor}
+            else:
+                s = s + " " + _("by %(editor)s") % {"editor":"<b>%s</b>" % editor} 
+        return s
+    
+    def linkToAllCataloged(self):
+        return getattr(self,'link_to_all_cataloged',
+                       LINK_TO_ALL_CATALOGED) and 1
+
+    def linkToAllObjects(self):
+        return getattr(self,'link_to_all_objects',
+                       LINK_TO_ALL_OBJECTS) and 1
+
+    ######################################################################
+    # page naming and lookup
+
+    security.declareProtected(Permissions.View, 'pageName')
+    def pageName(self):
+        """
+        Return the name of this wiki page.
+
+        This is normally in the title attribute, but use title_or_id
+        to handle eg pages created via the ZMI.
+        """
+        return self.title_or_id()
+
+    def pageId(self):
+        return self.id()
+    
+    security.declareProtected(Permissions.View, 'spacedPageName')
+    def spacedPageName(self):
+        """
+        Return this page's name, with spaces inserted if it's a WikiName.
+
+        We use this for eg the html title tag to improve search engine relevance.
+        """
+        return self.spacedNameFrom(self.pageName())
+    
+    security.declareProtected(Permissions.View, 'formattedPageName')
+    def formattedPageName(self):
+        """
+        Return this page's name in the standard display format (spaced or not).
+        """
+        return self.formatWikiname(self.pageName())
+
+    security.declarePublic('Title')
+    def Title(self):
+        """
+        Title
+        """
+        return self.pageName()
+
+    security.declareProtected(Permissions.View, 'canonicalIdFrom')
+    def canonicalIdFrom(self,name):
+        """
+        Convert a free-form page name to a canonical url- and zope-safe id.
+
+        Constraints for zwiki page ids:
+        - it must be a legal zope object id
+        - it should be legal in urls
+        - it should be unique for a given name (ignoring whitespace)
+        - we'd like it to be as similar to the name and as simple to read
+          and work with as possible
+        - we'd like to encourage serendipitous linking between free-form
+          and wikiname links & pages
+        - it must avoid certain zope-significant names, to avoid breakage
+
+        So, we
+        - discard non-word-separating punctuation (')
+        - convert remaining punctuation to spaces
+        - capitalize and join whitespace-separated words into a wikiname
+        - convert any non-zope-and-url-safe characters and _ to _hexvalue
+        - if this results in an id that begins with _ (illegal), prepend X
+        - or if it's one of the delicate IDS_TO_AVOID (eg REQUEST), append X
+          Note these last break the uniqueness property. Better ideas welcome.
+
+        performance-sensitive
+        """
+        if name == None: return None # XXX review later
+        # remove punctuation, preserving word boundaries.
+        # ' is not considered a word boundary.
+        name = re.sub(r"'",r"",name)
+        name = re.sub(r'[%s]+'%re.escape(string.punctuation),r' ',name)
+        
+        # capitalize whitespace-separated words (preserving existing
+        # capitals) then strip whitespace
+        id = ' '+name
+        id = spaceandlowerexpr.sub(lambda m:string.upper(m.group(1)),id)
+        id = string.join(string.split(id),'')
+
+        # quote any remaining unsafe characters (international chars)
+        safeid = ''
+        for c in id:
+            if zwikiidcharsexpr.match(c):
+                safeid = safeid + c
+            else:
+                safeid = safeid + '_%02x' % ord(c)
+
+        # zope ids may not begin with _
+        if len(safeid) > 0 and safeid[0] == '_': safeid = 'X'+safeid
+
+        # some ids collide with common zope objects and would break things
+        if safeid in IDS_TO_AVOID: safeid = safeid+'X'
+
+        return safeid
+
+    security.declareProtected(Permissions.View, 'canonicalId')
+    def canonicalId(self):
+        """
+        Give the canonical id of this page.
+        """
+        return self.canonicalIdFrom(self.pageName())
+
+    # XXX poor caching when attributes are accessed
+    security.declareProtected(Permissions.View, 'pageObjects')
+    def pageObjects(self):
+        """
+        Return a list of all pages in this wiki.
+        """
+        return self.folder().objectValues(spec=self.meta_type)
+
+    def wikiPath(self):
+        """
+        This wiki's folder path, for filtering our pages from catalog results
+        """
+        return self.getPath()[:self.getPath().rfind('/')]
+
+    security.declareProtected(Permissions.View, 'pages')
+    def pages(self, **kw):
+        """
+        Look up metadata (brains) for some or all pages in this wiki.
+
+        optimisation: prior to 0.22 this returned the actual page objects,
+        but to help with caching efficiency it now uses the catalog, if
+        possible.  The page metadata objects are catalog brains (search
+        results) containing the catalog's metadata, or workalikes
+        containing a limited number of fields and getObject().
+
+        Warning: fields such as the parents list may be
+        copies-by-reference, and should not be mutated.
+
+        Any keyword arguments will be passed through to the catalog, for
+        refining the search, sorting etc. When there is no catalog, only
+        these arguments are supported: id, Title, text, isIssue, and they
+        do case insensitive partial matching.  With no arguments, all
+        pages in the wiki are returned.
+
+        With a partial catalog, ie a catalog which does not include all
+        the metadata Zwiki expects, we'll get the missing fields from the
+        zodb and add them to the catalog brains. In this case the
+        catalog's caching advantage is lost.
+
+        ensureCompleteMetadata may return None, indicating a stale catalog
+        entry; we filter those out.
+
+        Different catalog configurations screw up our title and text
+        searches somewhat. For the standard search form, we want: case
+        insensitive, partial matching in page names and page text.
+        
+        """
+        if self.hasCatalogIndexesMetadata((['meta_type','path'], [])):
+            if self.linkToAllCataloged():
+                # look at all cataloged pages ?
+                return filter(lambda x:x is not None,
+                              map(lambda x:self.ensureCompleteMetadataIn(x),
+                                  self.searchCatalog(meta_type=self.meta_type,
+                                                     **kw)))
+            else:
+                # or (usually) just the ones in this folder
+                wikipath = self.wikiPath()
+                def folderpath(s): return s[:s.rfind('/')]
+                return filter(lambda x:x is not None,
+                              map(lambda x:self.ensureCompleteMetadataIn(x),
+                                  filter(lambda x:folderpath(x.getPath())==wikipath,
+                                         self.searchCatalog(meta_type=self.meta_type,
+                                                            path=wikipath,
+                                                            **kw))))
+        else:
+            results = []
+            for p in self.pageObjects(): results.append(self.metadataFor(p))
+            # emulate (some) catalog arguments in a rudimentary way
+            # these are all partial matching, case insensitive
+            if kw:
+                for arg in kw.keys():
+                    value = kw[arg]
+                    # catalog may use wildcards, but we won't
+                    def stripWildCardsFrom(s):
+                        try: return s.replace('*','')
+                        except AttributeError: return s
+                    value = stripWildCardsFrom(value)
+                    if arg == 'text':
+                        results = filter(
+                            lambda x:find(x.getObject().text().lower(),
+                                          value.lower()) != -1,
+                            results)
+                    if arg == 'id':
+                        results = filter(
+                            lambda x:find(x.id.lower(),value.lower()) != -1,
+                            results)
+                    if arg == 'Title':
+                        results = filter(
+                            lambda x:find(x.Title.lower(),value.lower()) != -1,
+                            results)
+                    if arg == 'isIssue':
+                        results = filter(
+                            lambda x:self.isIssue(x.Title) == value,
+                            results)
+                    #if arg == 'sort_order':
+                    #if arg == 'sort_on':
+            return results
+
+    security.declareProtected(Permissions.View, 'pageCount')
+    def pageCount(self):
+        """
+        Return the number of pages in this wiki.
+        """
+        return len(self.pages())
+
+    security.declareProtected(Permissions.View, 'pageIds')
+    def pageIds(self):
+        """
+        Return a list of all page ids in this wiki.
+
+        If there's junk in the catalog, pages could return a page with id
+        None; we guard against that.
+        """
+        # faster, & more robust
+        return self.folder().objectIds(spec=self.meta_type) 
+        # catalog-driven, so could work across folders (cf ALLBRAINS etc.)
+        #return filter(lambda x:x is not None, map(lambda x:x.id,self.pages())) 
+
+    security.declareProtected(Permissions.View, 'pageNames')
+    def pageNames(self):
+        """
+        Return a list of all page names in this wiki.
+        """
+        return map(lambda x:x.Title,self.pages())
+
+    security.declareProtected(Permissions.View, 'pageIdsStartingWith')
+    def pageIdsStartingWith(self,text):
+        """
+        pageIdsStartingWith
+        """
+        return filter(lambda x:x[:len(text)]==text,self.pageIds())
+
+    security.declareProtected(Permissions.View, 'pageNamesStartingWith')
+    def pageNamesStartingWith(self,text):
+        """
+        pageNamesStartingWith
+        """
+        return filter(lambda x:x[:len(text)]==text,self.pageNames())
+
+    security.declareProtected(Permissions.View, 'firstPageIdStartingWith')
+    def firstPageIdStartingWith(self,text):
+        """
+        firstPageIdStartingWith
+        """
+        return (self.pageIdsStartingWith(text) or [None])[0]
+
+    security.declareProtected(Permissions.View, 'firstPageNameStartingWith')
+    def firstPageNameStartingWith(self,text):
+        """
+        firstPageNameStartingWith
+        """
+        return (self.pageNamesStartingWith(text) or [None])[0]
+
+    security.declareProtected(Permissions.View, 'pageIdsMatching')
+    def pageIdsMatching(self,text):
+        """
+        pageIdsMatching
+        """
+        text = text.lower()
+        return filter(lambda x:x.lower().find(text)!=-1,self.pageIds())
+
+    security.declareProtected(Permissions.View, 'pageNamesMatching')
+    def pageNamesMatching(self,text):
+        """
+        pageNamesMatching
+        """
+        text = text.lower()
+        return filter(lambda x:x.lower().find(text)!=-1,self.pageNames())
+
+    security.declareProtected(Permissions.View, 'defaultPage')
+    def defaultPage(self):
+        """
+        Return this wiki's default page object, where eg mail goes by default.
+        
+        That is:
+
+        - a page named in the default_page string or lines property
+        - or the page named FrontPage
+        - or the first page object in the folder
+        - or None.
+        """
+        # default_page property could be a list, tuple or string
+        default_page_names = getattr(self.folder(),'default_page',[])
+        if type(default_page_names) == StringType: 
+            default_page_names = [default_page_names]
+        elif type(default_page_names) == TupleType:
+            default_page_names = list(default_page_names)
+        default_page_names.append('FrontPage')
+        for name in default_page_names:
+            p = self.pageWithName(name)
+            if p: return p
+        # pageObjects could be a LazyMap
+        return (list(self.pageObjects())+[None])[0]
+        
+    security.declareProtected(Permissions.View, 'defaultPageId')
+    def defaultPageId(self):
+        """
+        Return this wiki's default page ID.
+        
+        See defaultPage. 
+        """
+        p = self.defaultPage()
+        return (p and p.id()) or None
+
+    security.declareProtected(Permissions.View, 'pageWithId')
+    def pageWithId(self,id,url_quoted=0,ignore_case=0):
+        """
+        Return the page in this folder (or in the catalog) with this id.
+
+        Can also do a case-insensitive id search, and optionally unquote
+        id.  If no such page exists, return None.
+
+        XXX if ALLBRAINS is set true below, this and all the methods based
+        on it will return a page brain, not the actual page object.
+        Rats.. enabling this actually slows down zwiki.org FrontPage
+        rendering by 2.5 (due to extra catalog searching work ?) It should
+        still perform better for many pages, small cache, low memory.. in
+        theory.
+
+        When link_to_all_cataloged is enabled, this will find any matching
+        page in the catalog, regardless of physical location. As above, a
+        brain will be returned, and performance implications are not known.
+
+        """
+        ALLBRAINS=0
+
+        if id == None: return None # XXX review later
+        if url_quoted: id = unquote(id)
+        if self.linkToAllCataloged() or ALLBRAINS:
+            page = self.pages(id=id) or (ignore_case and self.pages(id_nocase=id))
+            return (page and page[0]) or None
+        else:
+            f = self.folder()
+            # don't acquire
+            # XXX special case: aq_base adds a REQUEST attribute
+            # ('<Special Object Used to Force Acquisition>')
+            if id in f.objectIds() and self.isZwikiPage(f[id]): # poor caching
+                return f[id]
+            elif ignore_case:
+                id = string.lower(id)
+                for i in self.pageIds():
+                    if i.lower() == id:
+                        return f[i]
+            else:
+                return None
+
+    security.declareProtected(Permissions.View, 'pageWithName')
+    def pageWithName(self,name,url_quoted=0):
+        """
+        Return the page in this folder which has this name, or None.
+
+        page name may be different from page id, and if so is stored in
+        the title property. Ie page name is currently defined as
+        the value given by title_or_id().
+
+        As of 0.17, page ids and names always follow the invariant
+        id == canonicalIdFrom(name).
+        """
+        return (self.pageWithId(self.canonicalIdFrom(name),url_quoted))
+
+    security.declareProtected(Permissions.View, 'pageWithNameOrId')
+    def pageWithNameOrId(self,name,url_quoted=0):
+        """
+        Return the page in this folder with this as it's name or id, or None.
+        """
+        return (self.pageWithId(name,url_quoted) or 
+                self.pageWithName(name,url_quoted))
+        
+    security.declareProtected(Permissions.View, 'pageWithFuzzyName')
+    def pageWithFuzzyName(self,name,url_quoted=0,allow_partial=0,
+                          ignore_case=1, numeric_match=0):
+                          
+        """
+        Return the page in this folder for which name is a fuzzy link, or None.
+
+        A fuzzy link ignores whitespace, case and punctuation.  If there
+        are multiple fuzzy matches, return the page whose name is
+        alphabetically first.  The allow_partial flag allows even fuzzier
+        matching. As of 0.17 ignore_case is not used and kept only for
+        backward compatibility. numeric_match modifies partial matching so
+        that [1] does not match a page "12...".
+
+        performance-sensitive
+        """
+        if url_quoted:
+            name = unquote(name)
+        p = self.pageWithName(name)
+        if p: return p
+        id = self.canonicalIdFrom(name)
+        idlower = string.lower(id)
+        ids = self.pageIds()
+        # in case this is a BTreeFolder (& old zope ?), work around as per
+        # IssueNo0535PageWithFuzzyNameAndBTreeFolder.. may not return
+        # the alphabetically first page in this case
+        try:
+            ids.sort()
+        except AttributeError:
+            pass
+        for i in ids:
+            ilower = string.lower(i)
+            if (ilower == idlower or 
+                ((allow_partial and ilower[:len(idlower)] == idlower) and not
+                 (numeric_match and re.match(r'[0-9]',ilower[len(idlower):])))
+                ):
+                return self.pageWithId(i)
+        return None
+        
+    security.declareProtected(Permissions.View, 'backlinksFor')
+    def backlinksFor(self, page):
+        """
+        Return metadata objects for all the pages that link to page.
+
+        Optimisation: like pages(), this method used to return actual page
+        objects but now returns metadata objects (catalog results if possible,
+        or workalikes) to improve caching. 
+
+        page may be a name or id, and need not exist in the wiki
+
+        The non-catalog search is not too smart.
+        """
+        p = self.pageWithNameOrId(page)
+        if p:
+            try: id = p.getId() # poor caching
+            except: id = p.id #all-brains
+        else: id = page
+        if self.hasCatalogIndexesMetadata(
+            (['meta_type','path','canonicalLinks'], [])):
+            return self.pages(canonicalLinks=id)
+        else:
+            # brute-force search (poor caching)
+            # find both [page] and bare wiki links
+            # XXX should check for fuzzy links
+            # XXX should do a smarter search (eg use links())
+            results = []
+            linkpat = re.compile(r'\b(%s|%s)\b'%(page,id))
+            for p in self.pageObjects():
+                if linkpat.search(p.read()):
+                    results.append(self.metadataFor(p))
+            return results
+
+    security.declareProtected(Permissions.View, 'translateHelper')
+    def translateHelper(self,msgid,map=None):
+        """
+        When you want to translate a part of a sentence in a tag attribute,
+        which is computed, you can not use i18n:attribute. and it's difficult
+        to call _("") from the python: Expression.
+
+        dont forget to force i18n extraction with something like
+        
+        <span tal:condition='nothing'>
+            <!-- force i18n extraction -->
+            <span title='Sentence' i18n:attributes='title'></span>            
+        </span>
+        """
+    
+        translate_msg = _(msgid)
+        if map:
+            try:
+                translate_msg = translate_msg % (map)
+            except:
+                return translate_msg
+        return translate_msg
+
+    ######################################################################
+    # backwards compatibility
+
+    # API methods for old skin templates
+    # need security declarations here ?
+    security.declareProtected(Permissions.View, 'quickcomment')
+    quickcomment = slowcomment = PageEditingSupport.comment
+    security.declareProtected(Permissions.View, 'stxToHtml')
+    stxToHtml = PageTypeStx().format
+    src = PageEditingSupport.text
+    editTimestamp = PageEditingSupport.timeStamp
+    checkEditTimeStamp = PageEditingSupport.checkEditConflict
+    wiki_page_url = PageUtils.page_url
+    wiki_base_url = PageUtils.wiki_url
+    zwiki_username_or_ip = PageUtils.usernameFrom
+    applyLineEscapesIn = applyWikiLinkLineEscapesIn 
+
+    # CMF compatibility
+    view = __call__
+
+InitializeClass(ZWikiPage)
+
+
+# rendering helper functions
+
+def thunk_substituter(func, text, allowed):
+    """Return a function which takes one arg and passes it with other args
+    to passed-in func.
+
+    thunk_substituter passes in the value of it's parameter, 'allowed', and a
+    dictionary {'lastend': int, 'inpre': bool, 'intag': bool}.
+
+    This is for use in a re.sub situation, to get the 'allowed' parameter and
+    the state dict into the callback.
+
+    (The technical term really is "thunk".  Honest.-)"""
+    state = {'lastend':0,'inpre':0,'incode':0,'intag':0,'inanchor':0}
+    return lambda arg, func=func, allowed=allowed, text=text, state=state: (
+        func(arg, allowed, state, text))
+
+def within_literal(upto, after, state, text,
+                   rfind=rfind, lower=lower):
+    """
+    Check text from state['lastend'] to upto for literal context:
+
+    - within an enclosing '<pre>' preformatted region '</pre>'
+    - within an enclosing '<code>' code fragment '</code>'
+    - within a tag '<' body '>'
+    - within an '<a href...>' tag's contents '</a>'
+
+    We also update the state dict accordingly.
+    """
+    # XXX This breaks on badly nested angle brackets and <pre></pre>, etc.
+    lastend,inpre,incode,intag,inanchor = \
+      state['lastend'], state['inpre'], state['incode'], state['intag'], \
+      state['inanchor']
+      
+    newintag = newincode = newinpre = newinanchor = 0
+    text = lower(text)
+    
+    # Check whether '<pre>' is currently (possibly, still) prevailing.
+    opening = rfind(text, '<pre', lastend, upto)
+    if (opening != -1) or inpre:
+        if opening != -1: opening = opening + 4
+        else: opening = lastend
+        if -1 == rfind(text, '</pre>', opening, upto):
+            newinpre = 1
+    state['inpre'] = newinpre
+
+    # Check whether '<code>' is currently (possibly, still) prevailing.
+    opening = rfind(text, '<code', lastend, upto)
+    if (opening != -1) or incode:
+        if opening != -1: opening = opening + 5
+        # We must already be incode, start at beginning of this segment:
+        else: opening = lastend
+        if -1 == rfind(text, '</code>', opening, upto):
+            newincode = 1
+    state['incode'] = newincode
+
+    # Determine whether we're (possibly, still) within a tag.
+    opening = rfind(text, '<', lastend, upto)
+    if (opening != -1) or intag:
+        # May also be intag - either way, we skip past last <tag>:
+        if opening != -1: opening = opening + 1
+        # We must already be intag, start at beginning of this segment:
+        else: opening = lastend
+        if -1 == rfind(text, '>', opening, upto):
+            newintag = 1
+    state['intag'] = newintag
+
+    # Check whether '<a href...>' is currently (possibly, still) prevailing.
+    #XXX make this more robust
+    opening = rfind(text, '<a href', lastend, upto)
+    if (opening != -1) or inanchor:
+        if opening != -1: opening = opening + 5
+        else: opening = lastend
+        if -1 == rfind(text, '</a>', opening, upto):
+            newinanchor = 1
+    state['inanchor'] = newinanchor
+
+    state['lastend'] = after
+    return newinpre or newincode or newintag or newinanchor
+
+def withinSgmlOrDtml(span,text):
+    """
+    report whether the span lies inside an sgml or dtml tag in text
+    """
+    spans = sgmlAndDtmlSpansIn(text)
+    for s in spans:
+        if span[0] >= s[0] and span[1] <= s[1]:
+            return 1
+    return 0
+
+def sgmlAndDtmlSpansIn(text):
+    """
+    return a list of spans (tuples) of all sgml and dtml tags in text
+    """
+    pat = re.compile(dtmlorsgmlexpr)
+    spans = []
+    lastpos = 0
+    while 1:
+        m = pat.search(text,lastpos)
+        if not m:
+            break
+        else:
+            s = m.span()
+            spans.append(s)
+            lastpos = s[1]
+    return spans
+
+def stripDelimitersFrom(link):
+    """Strip a wiki link's enclosing [], [[]] or (())."""
+    return re.sub(r'^(\[\[|\[|\(\()(.*?)(\]\]|\]|\)\))$',r'\2',link)
+
+
+# ZMI page creation form
+manage_addZWikiPageForm = DTMLFile('skins/zwiki/addwikipageform', globals())
+
+def manage_addZWikiPage(self, name, REQUEST=None):
+    """
+    Add a new ZWiki Page to the current folder, in the ZMI.
+    """
+    # create page
+    # this should be done in the proper order. Based on create()
+    # XXX extract common method ?
+    id = ZWikiPage().canonicalIdFrom(name)
+    p = ZWikiPage(__name__=id)
+    p.title=name
+    newid = self._setObject(id,p)
+    p = getattr(self,newid)
+    p.setCreator(REQUEST)
+    p.setLastEditor(REQUEST)
+    p._setOwnership(REQUEST)
+    p.setPageType(p.defaultPageType())
+    p.setText('',REQUEST) # no harm
+    #p.index_object() # should be no need
+    p.wikiOutline().add(p.pageName())
+    if REQUEST:
+        if REQUEST.get('redirect','')=='page': u = p.pageUrl()
+        else: u = REQUEST['URL1']+'/manage_main'
+        REQUEST.RESPONSE.redirect(u)

Added: zope-zwiki/branches/upstream/current/ZWikiPage_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/ZWikiPage_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/ZWikiPage_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,226 @@
+from testsupport import *
+ZopeTestCase.installProduct('ZCatalog')
+ZopeTestCase.installProduct('ZWiki')
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    return suite
+
+class Tests(ZwikiTestCase):
+
+    def test_excerptAt(self):
+        self.page.edit(text='This is a test of the<br />\n excerptAt method,')
+        self.assertEquals(self.page.excerptAt('excerptat',size=10,highlight=0),
+                          '\n excerptAt ')
+        #self.assertEquals(self.page.excerptAt('this*',size=21,highlight=1),
+        #                  '<span class="hit">This</span> is a tes')
+        #self.assertEquals(self.page.excerptAt('br',size=4),
+        #                  'e&lt;<span class="hit">br</span>&gt;\n')
+        # XXX temp
+        self.assertEquals(self.page.excerptAt('this*',size=21,highlight=1),
+                          '<span class="hit" style="background-color:yellow;font-weight:bold;">This</span> is a tes')
+        self.assertEquals(self.page.excerptAt('br',size=4),
+                          'e&lt;<span class="hit" style="background-color:yellow;font-weight:bold;">br</span> /')
+        self.assertEquals(self.page.excerptAt('<br />',size=4,highlight=0),
+                          '&lt;br /&gt;')
+        self.assertEquals(self.page.excerptAt('nomatch'), 'This is a test of the&lt;br /&gt;\n excerptAt method,')
+        self.assertEquals(self.page.excerptAt(''), 'This is a test of the&lt;br /&gt;\n excerptAt method,')
+
+    def testWithPartialCatalog(self):
+        # a number of things are known to be affected by a partial catalog
+        # - usually a standard CMF/plone portal_catalog that wasn't set up
+        # for Zwiki, but could also be a catalog that's had some of the
+        # zwiki fields removed - eg IssueNo0623.  These seem to boil down
+        # to ensuring the brains returned by pages() have all expected
+        # fields.
+        self.page.setupCatalog()
+        self.page.catalog().manage_delColumn('parents')
+        brain = self.page.pages()[0]
+        self.assert_(hasattr(brain,'parents'))
+
+    def test_canonicalIdFrom(self):
+        p = self.page
+        self.assertEquals(p.canonicalIdFrom('WikiName'),'WikiName')
+        self.assertEquals(p.canonicalIdFrom('ZWikiWikiNames2'),'ZWikiWikiNames2')
+        self.assertEquals(p.canonicalIdFrom('a page with !'),'APageWith')
+        self.assertEquals(p.canonicalIdFrom('a_page'),'APage')
+        self.assertEquals(p.canonicalIdFrom('Test\xc3Page'),'Test_c3Page') # A tilde
+        self.assertEquals(p.canonicalIdFrom('\xc3Page'),'X_c3Page')
+        self.assertEquals(p.canonicalIdFrom('_c3Page'),'C3Page')
+
+    def test_asAgeString(self):
+        #p = self.page
+        p = mockPage()
+        self.assertEqual(p.asAgeString(p.last_edit_time),'some time')
+
+    def test_pageIdsStartingWith(self):
+        p = self.page
+        p.create('TestPage2')
+        self.assertEqual(p.pageIdsStartingWith('Test'),
+                         ['TestPage','TestPage2'])
+
+    def test_pageNamesStartingWith(self):
+        p = self.page
+        p.title = 'Test Page'
+        p.create('Test Page 2')
+        self.assertEqual(p.pageNamesStartingWith('Test'),
+                         ['Test Page','Test Page 2'])
+
+    def test_firstPageIdStartingWith(self):
+        p = self.page
+        p.create('TestPage2')
+        self.assertEqual(p.firstPageIdStartingWith('Test'),'TestPage')
+
+    def test_firstPageNameStartingWith(self):
+        p = self.page
+        p.title = 'Test Page'
+        p.create('Test Page 2')
+        self.assertEqual(p.firstPageNameStartingWith('Test'),'Test Page')
+
+    def test_pageWithId(self):
+        p = self.page
+        self.failIf(p.pageWithId('nosuchid'))
+        self.failUnless(p.pageWithId('TestPage'))
+        self.failIf(p.pageWithId('testpage'))
+        self.failUnless(p.pageWithId('testpage',ignore_case=1))
+
+    def test_pageWithName(self):
+        p = self.page
+        p.title = 'Test page'
+        self.failUnless(p.pageWithName(p.title))
+
+    def test_pageWithFuzzyName(self):
+        p = self.page
+        p.title = 'Test page'
+        self.failUnless(p.pageWithFuzzyName('Test page'))
+        self.failUnless(p.pageWithFuzzyName(' Test  page\t'))
+        self.failUnless(p.pageWithFuzzyName('TestPage'))
+        self.failUnless(p.pageWithFuzzyName('TEST Page'))
+        self.failUnless(p.pageWithFuzzyName('Testpage'))
+        self.failIf(p.pageWithFuzzyName('test'))
+        self.failUnless(p.pageWithFuzzyName('test',allow_partial=1))
+
+    def test_backlinksFor(self):
+        p = self.page
+        p.title = 'Test Page'
+        p.create('PageTwo',text='[Test Page]')
+        p.create('PageThree',text='TestPage')
+        self.assertEqual(len(p.backlinksFor('Test Page')),2)
+
+    def test_isWikiName(self):
+        p = self.page
+        self.assert_(p.isWikiName('WikiName'))
+        self.assert_(p.isWikiName('WikiName2'))
+        self.assert_(p.isWikiName('AWikiName'))
+        self.assert_(not p.isWikiName('Wikiname'))
+        self.assert_(not p.isWikiName('Wiki2Name'))
+
+    def test_isValidWikiLinkSyntax(self):
+        self.assertEquals(self.p.isValidWikiLinkSyntax('WikiName'),1)
+        self.p.use_wikiname_links = 0
+        self.assertEquals(self.p.isValidWikiLinkSyntax('WikiName'),0)
+        self.p.use_wikiname_links = 1
+        self.assertEquals(self.p.isValidWikiLinkSyntax('WikiName'),1)
+        self.assertEquals(self.p.isValidWikiLinkSyntax('[freeform name]'),1)
+        self.p.use_bracket_links = 0
+        self.assertEquals(self.p.isValidWikiLinkSyntax('[freeform name]'),0)
+        self.p.use_bracket_links = 1
+        self.assertEquals(self.p.isValidWikiLinkSyntax('[freeform name]'),1)
+        self.assertEquals(self.p.isValidWikiLinkSyntax('[[double brackets]]'),1)
+        self.p.use_double_bracket_links = 0
+        self.assertEquals(self.p.isValidWikiLinkSyntax('[[double brackets]]'),0)
+        self.p.use_double_bracket_links = 1
+        self.assertEquals(self.p.isValidWikiLinkSyntax('[[double brackets]]'),1)
+
+    def test_markLinksIn(self):
+        self.assertEquals(self.p.markLinksIn('test'),'test')
+        self.assertEquals(self.p.markLinksIn('http://url'),
+                          '<zwiki>http://url</zwiki>')
+        self.assertEquals(
+            self.p.markLinksIn(
+            'WikiName, [freeform name], [[double brackets]], ((double parentheses))'),
+            '<zwiki>WikiName</zwiki>, <zwiki>[freeform name]</zwiki>, <zwiki>[[double brackets]]</zwiki>, ((double parentheses))')
+        self.p.use_wikiname_links = 0
+        self.p.use_bracket_links = 0
+        self.p.use_double_bracket_links = 0
+        self.p.use_double_parenthesis_links = 1
+        self.assertEquals(
+            self.p.markLinksIn(
+            'WikiName, [freeform name], [[double brackets]], ((double parentheses))'),
+            'WikiName, [freeform name], [[double brackets]], <zwiki>((double parentheses))</zwiki>')
+
+    def test_formatWikiname(self):
+        self.assertEquals(self.p.formatWikiname('CamelCase'),'CamelCase')
+        self.p.folder().space_wikinames = 1
+        self.assertEquals(self.p.formatWikiname('CamelCase'),'Camel Case')
+
+    def test_renderLink(self):
+        self.assertEquals(
+            self.p.renderLink('[unbalanced (]')[-53:],
+            'page=unbalanced%20%28" title="create this page">?</a>')
+        self.assertEquals(
+            self.p.renderLink('http://some.url'),
+            '<a href="http://some.url">http://some.url</a>')
+        #self.p.folder().space_wikinames = 1
+        #self.assertEquals(self.p.renderLink('CamelCase')[:10],'Camel Case')
+        
+    def test_renderLinksIn(self):
+        self.assertEquals(self.p.renderLinksIn('nolink'),'nolink')
+        self.assertEquals(self.p.renderLinksIn('http://a.b.c/d'),
+                          '<a href="http://a.b.c/d">http://a.b.c/d</a>')
+        self.assertEquals(self.p.renderLinksIn('mailto://a@b.c'),
+                          '<a href="mailto://a@b.c">mailto://a@b.c</a>')
+        #import pdb; pdb.set_trace()
+        self.assertEquals(self.p.renderLinksIn('TestPage'),
+                          '<a href="http://nohost/test_folder_1_/wiki/TestPage">TestPage</a>')
+#                          '<a href="/test_folder_1_/wiki/TestPage" title="" style="background-color:;">TestPage</a>')
+        self.assertEquals(self.p.renderLinksIn('NewTestPage'),
+                          'NewTestPage<a class="new visualNoPrint" href="http://nohost/test_folder_1_/wiki/TestPage/createform?page=NewTestPage" title="create this page">?</a>')
+#                          'NewTestPage<a class="new" href="/test_folder_1_/wiki/TestPage/editform?page=NewTestPage" title="create this page">?</a>')
+        self.assertEquals(self.p.renderLinksIn('!TestPage'),'TestPage')
+        self.assertEquals(self.p.renderLinksIn('[newpage]'),
+                          '[newpage]<a class="new visualNoPrint" href="http://nohost/test_folder_1_/wiki/TestPage/createform?page=newpage" title="create this page">?</a>')
+#                          '[newpage]<a class="new visualNoPrint" href="/test_folder_1_/wiki/TestPage/editform?page=newpage" title="create this page">?</a>')
+        # a problem with escaping remote wiki links was reported
+        self.p.edit(text='RemoteWikiURL: URL/')
+        self.assertEquals(self.p.renderLinksIn('TestPage:REMOTEPAGE'),
+                          '<a href="URL/REMOTEPAGE">TestPage:REMOTEPAGE</a>')
+        self.assertEquals(self.p.renderLinksIn('!TestPage:REMOTEPAGE'),
+                          'TestPage:REMOTEPAGE')
+        self.assertEquals(self.p.renderLinksIn('[ ]'),
+                          '[ ]<a class="new visualNoPrint" href="http://nohost/test_folder_1_/wiki/TestPage/createform?page=%20" title="create this page">?</a>')
+#                          '[ ]<a class="new visualNoPrint" href="/test_folder_1_/wiki/TestPage/editform?page=%20" title="create this page">?</a>')
+        # do display the brackets prior to page creation
+        self.assertEquals(self.p.renderLinksIn('[newpage]'),
+                          '[newpage]<a class="new visualNoPrint" href="http://nohost/test_folder_1_/wiki/TestPage/createform?page=newpage" title="create this page">?</a>')
+#                          '[newpage]<a class="new visualNoPrint" href="/test_folder_1_/wiki/TestPage/editform?page=newpage" title="create this page">?</a>')
+        # don't link wikinames inside <a href...>...</a>
+        self.assertEquals(self.p.renderLinksIn('<a href>WikiName</a>'),
+                          '<a href>WikiName</a>')
+        # do link wikinames after <a name...> with no closing </a>
+        self.assertEquals(self.p.renderLinksIn('<a name>WikiName'),
+#                          '<a name>WikiName<a class="new visualNoPrint" href="/test_folder_1_/wiki/TestPage/editform?page=WikiName" title="create this page">?</a>')
+                          '<a name>WikiName<a class="new visualNoPrint" href="http://nohost/test_folder_1_/wiki/TestPage/createform?page=WikiName" title="create this page">?</a>')
+
+    def Xtest_renderLink_speed(self):
+        import time
+        for i in range(999):
+            self.p.create('TestPage%03d'%i)
+        t = time.time()
+        self.assertEquals(self.p.pageCount(),1000)
+        print time.time() - t
+        
+    def test_displaysSubtopicsWithDtml(self):
+        self.p.edit(text='')
+        self.failIf(self.p.displaysSubtopicsWithDtml())
+        self.p.edit(text='<dtml subtopics')
+        self.failIf(self.p.displaysSubtopicsWithDtml())
+        self.p.edit(text='<dtml-var subtopics')
+        self.failIf(self.p.displaysSubtopicsWithDtml())
+        self.p.allow_dtml = 1
+        self.p.edit(text='<dtml-var subtopics')
+        self.failUnless(self.p.displaysSubtopicsWithDtml())
+        self.p.edit(text='&dtml-subtopics')
+        self.failUnless(self.p.displaysSubtopicsWithDtml())
+

Added: zope-zwiki/branches/upstream/current/__init__.py
===================================================================
--- zope-zwiki/branches/upstream/current/__init__.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/__init__.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,344 @@
+# product initialization
+
+__doc__="""
+ZWiki product
+"""
+__version__='0.58.0'
+
+import os, re, os.path, string, urllib
+
+from AccessControl import getSecurityManager
+from Globals import package_home, MessageDialog, ImageFile
+from OFS.Folder import Folder
+from OFS.Image import Image, File
+from OFS.ObjectManager import customImporters
+from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
+from Products.PythonScripts.PythonScript import PythonScript
+
+import Admin, Defaults, OutlineSupport, Permissions, ZWikiPage
+from Admin import addDTMLMethod
+from I18n import _, DTMLFile
+from pagetypes import PAGETYPES
+
+
+misc_ = {
+    'ZWikiPage_icon': ImageFile(os.path.join('skins','zwiki','wikipage_icon.gif'), globals()),
+    # backwards compatibility
+    'ZWikiPage_icon.gif': ImageFile(os.path.join('skins','zwiki','wikipage_icon.gif'),globals()),
+    # for the rating plugin
+    'star_icon': ImageFile(os.path.join('skins','zwiki','star.png'),globals()),
+    'blank_star_icon': ImageFile(os.path.join('skins','zwiki','blank_star.png'),globals()),
+    }
+
+def dummyOutlineConstructor(self):
+    """Stub so we can get PersistentOutline registered with ZMI.
+
+    The real constructor is a zwikipage method and is called automatically.
+    """
+    return MessageDialog(
+        title=_("No need to add a Zwiki Outline Cache"),
+        message=_("""Zwiki Outline Cache appears in the ZMI Add menu
+        for implementation reasons, but should not be added directly.
+        Zwiki will create it for you as needed.
+        """))
+
+def initialize(context): 
+    """Initialize the ZWiki product.
+    """
+    try: 
+        # register the wiki page class
+        context.registerClass(
+            ZWikiPage.ZWikiPage,
+            #I want to change the zmi add menu.. but not the meta_type
+            #meta_type=Defaults.PAGE_ADD_MENU_NAME,
+            permission=Permissions.Add,
+            icon = 'skins/zwiki/wikipage_icon.gif',
+            constructors = ( 
+                ZWikiPage.manage_addZWikiPageForm,
+                ZWikiPage.manage_addZWikiPage,
+                ),
+            )
+        # and the PersistentOutline class, so it's zmi-manageable
+        context.registerClass(
+            OutlineSupport.PersistentOutline,
+            permission=Permissions.manage_properties,
+            #icon = 'images/ZWikiPage_icon.gif',
+            constructors = (
+                dummyOutlineConstructor,
+                ),
+            )
+        # set up an "add wiki" menu item
+        context.registerClass(
+            Folder,
+            meta_type=Defaults.WIKI_ADD_MENU_NAME,
+            permission=Permissions.AddWiki,
+            #icon = 'images/Wiki_icon.gif'
+            constructors = ( 
+                manage_addWikiForm,
+                manage_addWiki,
+                listWikis,
+                listZodbWikis,
+                listFsWikis,
+                addWikiFromFs,
+                addWikiFromZodb,
+                )
+            )
+        # do CMF initialisation if installed
+        try:
+            import CMFInit
+            CMFInit.initialize(context)
+        except ImportError:
+            pass
+        # register skin as customizable dir if FileSystemSite is installed
+        try:
+            from Products.FileSystemSite.DirectoryView import registerDirectory
+            registerDirectory('skins/zwiki', globals())
+        except ImportError:
+            pass
+
+    # don't let any error prevent initialisation
+    except:
+        # log it
+        import sys, traceback, string
+        type, val, tb = sys.exc_info()
+        sys.stderr.write(string.join(traceback.format_exception(type, val, tb),
+                                     ''))
+        del type, val, tb
+
+
+# set up hooks for ZMI operations on zwiki objects, for:
+#
+# 1. setting zwiki creator information
+# We do this for a newly-added page object, but not one
+# that has just been renamed or imported.
+#
+# 2. updating the wiki outline cache
+# Note: manage_renameObject will lose parentage in the wiki outline (?)
+#
+# 3. catalog awareness
+
+def manage_afterAdd(self, item, container):
+    if not self.hasCreatorInfo():
+        self.setCreator(getattr(self,'REQUEST',None)) 
+    self.wikiOutline().add(self.pageName())
+    self.index_object()
+ZWikiPage.ZWikiPage.manage_afterAdd = manage_afterAdd
+
+def manage_afterClone(self, item):
+    if not self.hasCreatorInfo():
+        self.setCreator(getattr(self,'REQUEST',None))
+    self.wikiOutline().add(self.pageName())
+    self.index_object()
+ZWikiPage.ZWikiPage.manage_afterClone = manage_afterClone
+
+def manage_beforeDelete(self, item, container):
+    # update the wiki outline, but if it's out of date just ignore
+    try: self.wikiOutline().delete(self.pageName())
+    except KeyError: pass
+    self.unindex_object()
+ZWikiPage.ZWikiPage.manage_beforeDelete = manage_beforeDelete
+
+original_addProperty = ZWikiPage.ZWikiPage.manage_addProperty
+def manage_addProperty(self, id, value, type, REQUEST=None):
+    """Add property and reindex"""
+    r = original_addProperty(self,id,value,type,REQUEST)
+    self.reindex_object()
+    return r
+ZWikiPage.ZWikiPage.manage_addProperty = manage_addProperty
+
+original_delProperties = ZWikiPage.ZWikiPage.manage_delProperties
+def manage_delProperties(self, ids=None, REQUEST=None):
+    """Delete properties and reindex"""
+    r = original_delProperties(self, ids, REQUEST)
+    self.reindex_object()
+    return r
+ZWikiPage.ZWikiPage.manage_delProperties = manage_delProperties
+
+original_changeProperties = ZWikiPage.ZWikiPage.manage_changeProperties
+def manage_changeProperties(self, REQUEST=None, **kw):
+    """Update properties and reindex"""
+    r = apply(original_changeProperties,(self, REQUEST), kw)
+    self.reindex_object()
+    return r
+ZWikiPage.ZWikiPage.manage_changeProperties = manage_changeProperties
+
+original_editProperties = ZWikiPage.ZWikiPage.manage_editProperties
+def manage_editProperties(self, REQUEST):
+    """Edit Properties and reindex"""
+    r = original_editProperties(self, REQUEST)
+    self.reindex_object()
+    return r
+ZWikiPage.ZWikiPage.manage_editProperties = manage_editProperties
+
+######################################################################
+# and here are functions for adding new wikis
+
+manage_addWikiForm = DTMLFile('skins/zwiki/addwikiform', globals())
+
+def manage_addWiki(self, new_id, new_title='', wiki_type='zwikidotorg',
+                       REQUEST=None, enter=0):
+    """
+    Create a new zwiki web of the specified type
+    """
+    if not REQUEST: REQUEST = self.REQUEST
+    
+    # check for a configuration wizard
+    if hasattr(self,wiki_type+'_config'):
+        REQUEST.RESPONSE.redirect('%s/%s_config?new_id=%s&new_title=%s' % \
+                                  (REQUEST['URL1'],
+                                   wiki_type,
+                                   urllib.quote(new_id),
+                                   urllib.quote(new_title)))
+        
+    else:
+        if wiki_type in self.listFsWikis():
+            self.addWikiFromFs(new_id,new_title,wiki_type,REQUEST)
+        elif wiki_type in self.listZodbWikis():
+            self.addWikiFromZodb(new_id,new_title,wiki_type,REQUEST)
+        else:
+            return MessageDialog(
+                title=_('Unknown wiki type'),
+                message='',
+                action=''
+                )
+
+        if REQUEST is not None:
+            folder = getattr(self, new_id)
+            if hasattr(folder, 'setup_%s'%(wiki_type)):
+                REQUEST.RESPONSE.redirect(REQUEST['URL3']+'/'+new_id+'/setup_%s'%(wiki_type))
+            elif enter:
+                # can't see why this doesn't work after addWikiFromFs
+                #REQUEST.RESPONSE.redirect(getattr(self,new_id).absolute_url())
+                REQUEST.RESPONSE.redirect(REQUEST['URL3']+'/'+new_id+'/')
+            else:
+                try: u=self.DestinationURL()
+                except: u=REQUEST['URL1']
+                REQUEST.RESPONSE.redirect(u+'/manage_main?update_menu=1')
+
+def addWikiFromZodb(self,new_id, new_title='', wiki_type='zwikidotorg',
+                        REQUEST=None):
+    """
+    Create a new zwiki web by cloning the specified template
+    in /Control_Panel/Products/ZWiki
+    """
+    # locate the specified wiki prototype
+    # these are installed in /Control_Panel/Products/ZWiki
+    prototype = self.getPhysicalRoot().Control_Panel.Products.ZWiki[wiki_type]
+
+    # clone it
+    self.manage_clone(prototype, new_id, REQUEST)
+    wiki = getattr(self, new_id)
+    wiki.manage_changeProperties(title=new_title)
+    # could do stuff with ownership here
+    # set it to low-privileged "nobody" by default ?
+
+
+def addWikiFromFs(self, new_id, title='', wiki_type='zwikidotorg',
+                      REQUEST=None):
+    """
+    Create a new zwiki web from the specified template on the filesystem.
+    """
+    parent = self.Destination()
+    # Go with a BTreeFolder from the start to avoid hassle with large
+    # wikis on low-memory hosted servers ?
+    #parent.manage_addProduct['BTreeFolder2'].manage_addBTreeFolder(
+    #str(new_id),str(title))
+    # No - the standard folder's UI is more useful for small wikis,
+    # and more importantly BTreeFolder2 isn't standard until 2.8.0b2
+    f = Folder()
+    f.id, f.title = str(new_id), str(title)
+    new_id = parent._setObject(f.id, f)
+    f = parent[new_id]
+    # add objects from wiki template
+    # cataloging really slows this down!
+    dir = os.path.join(package_home(globals()),'wikis',wiki_type)
+    filenames = os.listdir(dir)
+    for filename in filenames:
+        if re.match(r'(?:\..*|CVS|_darcs)', filename): continue
+        m = re.search(r'(.+)\.(.+)',filename)
+        id, type = filename, ''
+        if m: id, type = m.groups()
+        text = open(dir + os.sep + filename, 'r').read()
+        if type == 'dtml':
+            addDTMLMethod(f, filename[:-5], title='', file=text)
+        elif re.match(r'(?:(?:stx|html|latex)(?:dtml)?|txt)', type):
+            addZWikiPage(f,id,title='',page_type=type,file=text)
+        elif type == 'pt':
+            f._setObject(id, ZopePageTemplate(id, text, 'text/html'))
+        elif type == 'py':
+            f._setObject(id, PythonScript(id))
+            f._getOb(id).write(text)
+        elif type == 'zexp' or type == 'xml':
+            connection = self.getPhysicalRoot()._p_jar
+            f._setObject(id, connection.importFile(dir + os.sep + filename, 
+                customImporters=customImporters))
+            #self._getOb(id).manage_changeOwnershipType(explicit=0)
+        elif re.match(r'(?:jpe?g|gif|png)', type):
+            f._setObject(filename, Image(filename, '', text))
+        else:
+            id = f._setObject(filename, File(filename, '', text))
+            if type == 'css': f[filename].content_type = 'text/css'
+
+def addZWikiPage(self, id, title='',
+                  page_type=PAGETYPES[0]._id, file=''):
+    id=str(id)
+    title=str(title)
+
+    # parse optional parents list
+    m = re.match(r'(?si)(^#parents:(.*?)\n)?(.*)',file)
+    if m.group(2):
+        parents = string.split(string.strip(m.group(2)),',')
+    else:
+        parents = []
+    text = m.group(3)
+
+    # create zwiki page in this folder
+    ob = ZWikiPage.ZWikiPage(source_string=text, __name__=id)
+    ob.title = title
+    ob.setPageType(page_type)
+    ob.parents = parents
+
+    username = getSecurityManager().getUser().getUserName()
+    ob.manage_addLocalRoles(username, ['Owner'])
+    # the new page object is owned by the current authenticated user, if
+    # any; not desirable for executable content.  Remove any such
+    # ownership so that the page will acquire it's owner from the parent
+    # folder.
+    ob._deleteOwnershipAfterAdd() # or _owner=UnownableOwner ?
+    #ob.setSubOwner('both') # regulations setup ?
+    self._setObject(id, ob)
+
+    return getattr(self, id)
+
+
+def listWikis(self):
+    """
+    list all wiki templates available in the filesystem or zodb
+    """
+    wikis = self.listFsWikis()
+    for w in self.listZodbWikis():
+        if not w in wikis: wikis.append(w)
+    wikis.sort()
+    return wikis
+
+def listZodbWikis(self):
+    """
+    list the wiki templates available in the ZODB
+    """
+    list = self.getPhysicalRoot().Control_Panel.Products.ZWiki.objectIds()
+    list.remove('Help')
+    return list
+    
+def listFsWikis(self):
+    """
+    list the wiki templates available in the filesystem
+    """
+    try:
+        list = os.listdir(package_home(globals()) + os.sep + 'wikis')
+        # likewise for Subversion
+        if '.svn' in list: list.remove('.svn')
+        if 'tracker' in list: list.remove('tracker') #XXX temp
+        return list
+    except OSError:
+        return []
+

Added: zope-zwiki/branches/upstream/current/i18n/af.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/af.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/af.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1360 @@
+# Afrikaans translation for zwiki
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the zwiki package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-03-15 21:09+0000\n"
+"Last-Translator: Simon Michael <simon at joyful.com>\n"
+"Language-Team: Afrikaans <af at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr ""
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr ""
+
+#: src/ZWiki/Diff.py:174
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr ""
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr ""
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr ""
+
+#: src/ZWiki/Editing.py:830
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+msgid "exceeded max_identified_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr ""
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr ""
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr ""
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr ""
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr ""
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr ""
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr ""
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr ""
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr ""
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr ""
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr ""
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr ""
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr ""
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr ""
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr ""
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr ""
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr ""
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr ""
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr ""
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr ""
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr ""
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr ""
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr ""
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr ""
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr ""
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr ""
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr ""
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr ""
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr ""
+
+#: src/ZWiki/Views.py:490
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:809
+msgid "show last edit"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr ""
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr ""
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+msgid "Revert this change and all successive changes"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+msgid "plone"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+msgid "show all features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+msgid "show basic features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+msgid "simple"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+msgid "subtopic"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+msgid "for this page"
+msgstr ""
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+msgid "title"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+msgid "Issue browser"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+msgid "Issue tracker"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "Lewer kommentaar op wiki bladsy"
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+msgid "age"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+msgid "Here are the wiki's issue pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+msgid "search options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+msgid "Severities:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+msgid "Enter a search term, click the numbers to the right,"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+msgid "Name"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+msgid "filter issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+msgid "Optional subject"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+msgid "Optional comment"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "Las Wiki By"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+msgid "Id:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+msgid "Title:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "Las Wiki By"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr "Soek"
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+msgid "recent"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+msgid "Email address:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+msgid "(allows mail subscription)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+msgid "Page&nbsp;name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "Las 'n Wiki Bladsy By"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+msgid "Topic"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+msgid "Comments"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+msgid "Views"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+msgid "Created"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+msgid "Subtopics"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+msgid "Here are it's subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+msgid "Related pages"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+msgid "Parents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+msgid "Backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+msgid "No other pages link to this one."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr ""
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+msgid "Edit history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+#, fuzzy
+msgid "Edit:"
+msgstr "Redigeer"
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+msgid "Manage"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+msgid "Revert this and later edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+msgid "Time:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+msgid "Note:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "preview this edit"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr ""
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+msgid "label_preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr "nuwe"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+msgid "parent,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+msgid "replacement,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+msgid "page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "reparent"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "make this page a subtopic of the page you have entered"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+msgid "Recent changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+msgid "Search this wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+msgid "all edits"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr ""
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr ""
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr ""
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+msgid "subscribe_desc_comments"
+msgstr ""
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+msgid "subscribe_desc_edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr ""
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr ""
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr ""
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+msgid "User options"
+msgstr ""
+
+#, fuzzy
+#~ msgid "add a comment"
+#~ msgstr "'n Komentaar"
+
+#~ msgid "View"
+#~ msgstr "Uitsig"
+
+#~ msgid "Comment"
+#~ msgstr "Kommentaar"
+
+#~ msgid "Table of Contents"
+#~ msgstr "Inhoudsopgawe"
+
+#~ msgid "A Wiki"
+#~ msgstr "'n Wiki"
+
+#~ msgid "Wiki"
+#~ msgstr "Wiki"
+
+#~ msgid "Change Wiki Page"
+#~ msgstr "Verander Wiki Bladsy"
+
+#~ msgid "Wiki User"
+#~ msgstr "Wiki Gebruiker"
+
+#~ msgid "Wiki visitors, which can only view and comment on wikis."
+#~ msgstr "Wiki besoekers, wat wikis kan kyk en kommentaar lewer."
+
+#~ msgid "A Wiki Page"
+#~ msgstr "'n Wiki Bladsy"
+
+#~ msgid "Wiki Page"
+#~ msgstr "Wiki Bladsy"
+
+#~ msgid "Wiki Page Comment"
+#~ msgstr "Wiki Bladsy Kommentaar"
+
+#~ msgid "View a Wiki Page"
+#~ msgstr "Vertoon 'n Wiki Bladsy"
+
+#~ msgid "View Wiki Page"
+#~ msgstr "Vertoon Wiki Bladsy"
+
+#~ msgid "Comment on Wiki Page"
+#~ msgstr "Kommentaar op wiki bladsy"
+
+#~ msgid "Delete Wiki Page"
+#~ msgstr "Verwyder Wiki Bladsy"

Added: zope-zwiki/branches/upstream/current/i18n/ar.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/ar.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/ar.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1380 @@
+# Arabic translation for zwiki
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the zwiki package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-03-15 21:10+0000\n"
+"Last-Translator: Simon Michael <simon at joyful.com>\n"
+"Language-Team: Arabic <ar at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr "غير مسمح لك بتطوير جميع الصفحات"
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr ""
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "غير مسمح لك بأعادة تسمية صفحة Wiki هذه"
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "غير مسمح لك بأعادة تسمية صفحة Wiki هذه"
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr ""
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr "غير مسمح لك بحذف صفحة Wiki هذه"
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr ""
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr ""
+
+#: src/ZWiki/Editing.py:830
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+msgid "exceeded max_identified_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr "مجهول"
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr ""
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr "أمت هنا"
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr ""
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr ""
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr ""
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr ""
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr ""
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr ""
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr ""
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr ""
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr ""
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr ""
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr ""
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr ""
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr ""
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr ""
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr ""
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr ""
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr ""
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr ""
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr ""
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr ""
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr ""
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr ""
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr ""
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr ""
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr ""
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr ""
+
+#: src/ZWiki/Views.py:490
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:809
+msgid "show last edit"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr ""
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr ""
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+msgid "Revert this change and all successive changes"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+msgid "plone"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+msgid "show all features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+msgid "show basic features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+msgid "simple"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+msgid "subtopic"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+msgid "for this page"
+msgstr ""
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+msgid "title"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+msgid "Issue browser"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+msgid "Issue tracker"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "غير مسمح لك بأعادة تسمية صفحة Wiki هذه"
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+msgid "age"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+msgid "Here are the wiki's issue pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+msgid "search options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+msgid "Severities:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+msgid "Enter a search term, click the numbers to the right,"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+msgid "Name"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+msgid "filter issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+msgid "Optional subject"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+msgid "Optional comment"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "أضافة Wiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+msgid "Id:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+msgid "Title:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "أضافة Wiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr "بحث"
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+msgid "recent"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+msgid "Email address:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+msgid "(allows mail subscription)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+msgid "Page&nbsp;name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "أضافة صفحة Wiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+msgid "Topic"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+msgid "Comments"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+msgid "Views"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+msgid "Created"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+msgid "Subtopics"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+msgid "Here are it's subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+msgid "Related pages"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+msgid "Parents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+msgid "Backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+msgid "No other pages link to this one."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr ""
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+msgid "Edit history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+#, fuzzy
+msgid "Edit:"
+msgstr "تعديل"
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+msgid "Manage"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+msgid "Revert this and later edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+msgid "Time:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+msgid "Note:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "preview this edit"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr ""
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+msgid "label_preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr "جديد"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+msgid "parent,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+msgid "replacement,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+msgid "page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "reparent"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "make this page a subtopic of the page you have entered"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+msgid "Recent changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+msgid "Search this wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+msgid "all edits"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr ""
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr ""
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr ""
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+msgid "subscribe_desc_comments"
+msgstr ""
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+msgid "subscribe_desc_edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr ""
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr ""
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr ""
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+#, fuzzy
+msgid "User options"
+msgstr "اشتركات"
+
+#, fuzzy
+#~ msgid "add a comment"
+#~ msgstr "تعليق"
+
+#~ msgid "View"
+#~ msgstr "عاين"
+
+#~ msgid "Comment"
+#~ msgstr "تعليق"
+
+#~ msgid "Menu for Wiki Page related actions."
+#~ msgstr "قائمة"
+
+#~ msgid "Table of Contents"
+#~ msgstr "المحنوى"
+
+#~ msgid "TOC"
+#~ msgstr "المحتوى"
+
+#~ msgid "Change Wiki Page"
+#~ msgstr "تعديل صفحة Wiki"
+
+#~ msgid "Wiki User"
+#~ msgstr "مستخدم Wiki"
+
+#~ msgid "A Wiki Page"
+#~ msgstr "صفحة Wiki"
+
+#~ msgid "Wiki Page"
+#~ msgstr "صفحة Wiki"
+
+#~ msgid "A Wiki Page Comment"
+#~ msgstr "تعليق على صفحة Wiki"
+
+#~ msgid "Wiki Page Comment"
+#~ msgstr "تعليق على صفحة Wiki"
+
+#~ msgid "Wiki Editor"
+#~ msgstr "محرر Wiki"
+
+#~ msgid "The Wiki Editor can create and edit wikis."
+#~ msgstr "محرر Wiki يمكن أن ينشأ و يعدل wikis"
+
+#~ msgid "Wiki Administrator"
+#~ msgstr "مدير Wiki"
+
+#~ msgid "The Wiki Admin can fully manage wiki pages."
+#~ msgstr "مدير Wiki يمكنه ان يتحكم بجميع الصفحات"
+
+#~ msgid "View a Wiki Page"
+#~ msgstr "عاين صفحة Wiki"
+
+#~ msgid "View Wiki Page"
+#~ msgstr "عاين صفحة Wiki"
+
+#~ msgid "Comment on Wiki Page"
+#~ msgstr "علق على صفحة Wiki"
+
+#~ msgid "Make a comment on Wiki Page"
+#~ msgstr "علق على صفحة Wiki"
+
+#~ msgid "Edit Wiki Page"
+#~ msgstr "تعديل صفحة Wiki"
+
+#~ msgid "Delete Wiki Page"
+#~ msgstr "حذف صفحة Wiki"

Added: zope-zwiki/branches/upstream/current/i18n/de.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/de.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/de.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1731 @@
+# translation of zwiki-de.po to German
+# Old translators:
+# Andreas Mayer <an.ma at web.de>, 2005.
+# Jens Nachtigall <nachtigall at web.de>, 2005.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki-de\n"
+"Report-Msgid-Bugs-To:\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-05-29 07:47+0000\n"
+"Last-Translator: Stefan Kose <Kamikaze482 at gmx.net>\n"
+"Language-Team: German <debian-l10n-german at lists.debian.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+"Language-code: de\n"
+"Language-name: German\n"
+"Preferred-encodings: utf-8\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr ""
+"Sie sind nicht berechtigt die Wiki-Seiten zu aktualisieren (You are not "
+"authorized to upgrade all pages)."
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr "(folder -> Manage properties)"
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "Sie sind nicht berechtigt, diese ZWiki-Seite zu löschen."
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+#, fuzzy
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "Sie sind nicht berechtigt, diese ZWiki-Seite zu löschen."
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+#, fuzzy
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+"In diesem Wiki sind keine anonymen Eintragungen erlaubt. \n"
+"Bitte stellen Sie zunächst Ihren Nutzernamen in den Optionen ein."
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr ""
+"Sie sind nicht berechtigt, Seiten in der Wiki-Hierarchie zu verschieben."
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr "Sie sind nicht berechtigt, das Format dieser ZWiki-Seite zu ändern."
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr "Sie sind nicht berechtigt, diese ZWiki-Seite zu bearbeiten."
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr "Sie sind nicht berechtigt, diese ZWiki-Seite zu löschen."
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+"Diese ZWiki-Seite wurde in %s umbenannt. Sie können die Seite löschen,sollte "
+"sie nicht mehr gebraucht werden.\n"
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr "Sie sind nicht berechtigt, Dateien in dieses Wiki hochzuladen."
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr ""
+"Sie sind nicht berechtigt, einen Link zu dieser ZWiki-Seite hinzuzufügen."
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr "'banned_links'-Treffer"
+
+#: src/ZWiki/Editing.py:830
+#, fuzzy
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr ""
+"Ein Problem ist aufgetreten: %s. Bitte kontaktieren Sie den Administrator "
+"dieser Webseite, falls Sie Hilfe benötigen."
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr "'max_anonymous_links' überschritten"
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+#, fuzzy
+msgid "exceeded max_identified_links"
+msgstr "'max_anonymous_links' überschritten"
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr "anonym"
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr "Welche Seiten verweisen auf diese?"
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr "Sie befinden sich hier."
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr "Jahre"
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr "Jahr"
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr "Monat"
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr "Monate"
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr "Wochen"
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr "Woche"
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr "Tag"
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr "Tage"
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr "Stunden"
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr "Stunde"
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr "Minute"
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr "Minuten"
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr "Sekunde"
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr "Sekunden"
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr "Seite ist gesperrt"
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+"\n"
+"            Diese Seite wurde per WebDAV gesperrt. Vermutlich wird sie\n"
+"            gerade von jemand anderem mit einem externen Editor bearbeitet\n"
+"            Sie müssen warten, bis derjenige fertig ist, bevor Sie es\n"
+"            erneut versuchen können. Falls Sie den Text dieser Seite\n"
+"            bereits geändert haben, sollten Sie diese Änderungen bis dahin\n"
+"            sicherheitshalber speichern.\n"
+"            "
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr ""
+"Um Ihre Änderungen zu verwerfen und von vorne zu beginnen, klicken Sie auf "
+"'OK'."
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr "Bearbeitungskonflikt"
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr "Jemand hat diese Seite geändert, während Sie sie bearbeitet haben."
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr "So können Sie diesen Konflikt lösen:"
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr ""
+"Kehren Sie zum Bearbeitungsformular zurück, indem Sie in Ihrem Browser auf "
+"die 'Zurück'-Schaltfläche klicken."
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr "Kopieren Sie Ihre letzten Änderungen in die Zwischenablage."
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr ""
+"Aktualisieren Sie das Bearbeitungsformular, indem Sie in Ihrem Browser auf "
+"die 'Neu laden'-Schaltfläche klicken."
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr ""
+"Fügen Sie Ihre Änderungen erneut ein. Beachten Sie dabei, dass die Seite in "
+"der Zwischenzeit bereits von jemand anderem geändert wurde."
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr "Speichern Sie die Seite mit Ihren Änderungen erneut."
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr "oder"
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr ""
+"Um Ihre Änderungen zu verwerfen und von vorne zu beginnen, klicken Sie auf "
+"'OK'."
+
+#: src/ZWiki/Views.py:490
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+"\n"
+"        Kurztasten nutzen Sie in mozilla-basierten Browsern durch Drücken "
+"der <Alt>-Taste\n"
+"        IE-Benutzer: müssen außerdem <enter> drücken\n"
+"        Mac-Benutzer: <Strg>-Taste\n"
+"        Opera-Benutzer: <Umschalt>-<Esc>-Taste\n"
+"        Die Kurztasten funktionieren nicht hier, sondern auf der vorherigen "
+"Seite. Kehren Sie zu dieser zurück, um sie auszuprobieren.\n"
+"\n"
+"        0    zeige diese Übersicht über Kurztasten\n"
+"\n"
+"        Wiki-weite Aktionen:\n"
+"        f    Startseite zeigen\n"
+"        c    Inhaltsverzeichnis zeigen\n"
+"        r    Letzte Änderungen des Wikis zeigen\n"
+"             Diskussionsseite zeigen\n"
+"        t    Problemliste zeigen\n"
+"        i    Index zeigen\n"
+"        o    Wiki-Optionen (Einstellungen) zeigen\n"
+"        h    Hilfe-Seite zeigen\n"
+"        s    gehe zur Suche\n"
+"        \n"
+"        Seiten-bezogene Aktionen:\n"
+"        +    (in einer Plone/CMF-Webseite mit wechselbaren Skins) betrachte "
+"Seiten im Plone/CMF-Skin\n"
+"        -    (in einer Plone/CMF-Webseite mit wechselbaren Skins) betrachte "
+"Seiten im Standard-Skin\n"
+"        v    Seite betrachten\n"
+"        m    E-Mail-Abonnement\n"
+"        b    Backlinks zeigen (Verweise auf diese Seite)\n"
+"        d    Änderungen zeigen (alte Versionen)\n"
+"        y    alle Versionen anzeigen (im ZMI)\n"
+"        e    bearbeite diese Seite                       \n"
+"        x    bearbeite diese Seite mit externem Editor\n"
+"             drucke diese Seite (samt Unterthemen)\n"
+"        q    Quell-Code dieser Seite zeigen (Schnellansicht)\n"
+"             lösche den 'Render-Cache' dieser Seite und erstelle diesen dann "
+"neu\n"
+"             Unterthemen anzeigen\n"
+"             Kommentare anzeigen (Nachrichten)\n"
+"             gehe zur Homepage des Autors, sofern möglich\n"
+"        n    nächste Seite\n"
+"        p    vorherige Seite\n"
+"        u    zur übergeordneten Seite\n"
+"        \n"
+"        im Bearbeitungsformular:\n"
+"        s    Speichern\n"
+"        p    Vorschau\n"
+"        \n"
+"        beim Betrachten von Änderungen:\n"
+"        n    nächste Änderung\n"
+"        p    vorherige Änderung\n"
+"        "
+
+#: src/ZWiki/Wikis.py:49
+#, fuzzy
+msgid "Unknown wiki type"
+msgstr "Unbekanntes Wiki Format"
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr "Diese Seite erstellen"
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr "Zuletzt geändert vor %(interval)s"
+
+#: src/ZWiki/ZWikiPage.py:809
+msgid "show last edit"
+msgstr "Letzte Änderung zeigen"
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr "von %(editor)s"
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr "Zwiki-Outline-Cache nicht selbst hinzufügen"
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+"Zwiki-Outline-Cache erscheint nur aus\n"
+"         technischen Gründen mit »ZMI Add Menü«\n"
+"         und sollte hier nicht direkt hinzugefügt werden.\n"
+"         Zwiki wird den Outline-Cache bei Bedarf selbst erstellen.\n"
+"        "
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr "Kommentare"
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr "Erwartete \"=\" nach \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr "Erwartete einen Wert nach Schlüsselwort \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr "Erstelle neue Zeichnung \"%(filename)s\""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr "Lade neuen Anhang \"%(filename)s\" hoch"
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr "Bearbeite Zeichnung %(filename)s"
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr "Erwartete \"%(wanted)s\" nach \"%(key)s\", erhielt aber \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr "Erwartete einen Integerwert \"%(key)s\" vor \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr "Erwatete einen Integerwert \"%(arg)s\" nach \"%(key)s\""
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr "Erwartete einen Farbwert \"%(arg)s\" nach \"%(key)s\""
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr "Antworten"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr "Alle Versionen"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr "<< vorherige Änderung"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr "nächste Änderung >>"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+#, fuzzy
+msgid "Revert this change and all successive changes"
+msgstr "Diese und alle folgenden Änderungen rückgängig machen"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+#, fuzzy
+msgid "plone"
+msgstr "Notiz"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+#, fuzzy
+msgid "show all features"
+msgstr "Suche auf allen Seiten"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+#, fuzzy
+msgid "show basic features"
+msgstr "Letzte Änderung zeigen"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+#, fuzzy
+msgid "simple"
+msgstr "Datei"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+#, fuzzy
+msgid "subtopic"
+msgstr "Unterkategorien"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+#, fuzzy
+msgid "for this page"
+msgstr "Diese Seite erstellen"
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+#, fuzzy
+msgid "title"
+msgstr "Titel"
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr "Probleme filtern"
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+msgid "Issue browser"
+msgstr "Problembrowser"
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+msgid "Issue tracker"
+msgstr "Problemliste"
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "Sie sind nicht berechtigt, diese ZWiki-Seite zu bearbeiten."
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+#, fuzzy
+msgid "category"
+msgstr "Kategorie"
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+#, fuzzy
+msgid "severity"
+msgstr "Schweregrad"
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+#, fuzzy
+msgid "status"
+msgstr "Status"
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+#, fuzzy
+msgid "age"
+msgstr "Seite"
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+#, fuzzy
+msgid "modified"
+msgstr "Geändert"
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+#, fuzzy
+msgid "Add a new issue:"
+msgstr "Neues Problem hinzufügen:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+#, fuzzy
+msgid "Name:"
+msgstr "Name,"
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+#, fuzzy
+msgid "Category:"
+msgstr "Kategorie:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+#, fuzzy
+msgid "Severity:"
+msgstr "Schweregrad:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+#, fuzzy
+msgid "Status:"
+msgstr "Status:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+#, fuzzy
+msgid "Here are the wiki's issue pages."
+msgstr "Diese Wiki-Seite erstellen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr "Details:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+#, fuzzy
+msgid "add issue"
+msgstr "Problem hinzufügen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+#, fuzzy
+msgid "More advanced"
+msgstr "Erweiterte Suche in der"
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+#, fuzzy
+msgid "issue tracker"
+msgstr "Problemliste"
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+msgid "search options"
+msgstr "Einstellungen speichern"
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+#, fuzzy
+msgid "Name contains any of:"
+msgstr "Name enthält:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+#, fuzzy
+msgid "Page text contains any of:"
+msgstr "Text enthält:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr "Kategorien:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+#, fuzzy
+msgid "Severities:"
+msgstr "Schweregrade:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+#, fuzzy
+msgid "Statuses:"
+msgstr "Status:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+#, fuzzy
+msgid "Enter a search term, click the numbers to the right,"
+msgstr ""
+"Geben Sie einen Suchterm ein, klicken Sie die Nummern auf der rechten Seite "
+"an,"
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+#, fuzzy
+msgid "Submitted by"
+msgstr "Eingereicht von"
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+#, fuzzy
+msgid "Name"
+msgstr "Name"
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+#, fuzzy
+msgid "Category"
+msgstr "Kategorie"
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+#, fuzzy
+msgid "filter issues"
+msgstr "Probleme filtern"
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+#, fuzzy
+msgid "Severity"
+msgstr "Schweregrad"
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+#, fuzzy
+msgid "Status"
+msgstr "Status"
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+#, fuzzy
+msgid "Optional subject"
+msgstr "Notiz zu den Änderungen (optional)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+#, fuzzy
+msgid "Optional comment"
+msgstr "Notiz zu den Änderungen (optional)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "Wiki hinzufügen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+#, fuzzy
+msgid "Id:"
+msgstr "Id"
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+#, fuzzy
+msgid "Title:"
+msgstr "Titel"
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "Wiki hinzufügen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+#, fuzzy
+msgid "browse open issues"
+msgstr "offene Probleme durchsuchen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr "Seiten mit Änderungen innerhalb von"
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr "Kürzlich veränderte Seiten, mit Zusammenfassungen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr "Auszüge anzeigen?"
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr "Aktualisieren"
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr "Seite"
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr "Von"
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr "Zeit"
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr "Neu"
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr "Mit (Neu) markierte Seiten wurden innerhalb der letzten Woche erstellt"
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+#, fuzzy
+msgid "search issues"
+msgstr "Probleme filtern"
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr ""
+"Geben Sie einen oder mehrere Begriffe ein und drücken Sie die Eingabetaste, "
+"um das gesamte Wiki zu durchsuchen."
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr ""
+"Das Ergebnis ist das selbe, als wenn Sie das Suchfeld in der rechten oberen "
+"Ecke benutzen."
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr ""
+"Tipp: Ein einzelner Begriff eignet sich am besten für die Suche nach "
+"passenden Seitennamen."
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+"Je nach Ihrer Katalogkonfiguration, werden Groß- und Kleinschreibung "
+"ignoriert und Platzhalter unterstützt."
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr "Mit einem leeren Suchfeld erhalten Sie eine Liste aller Seiten."
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr "Suchen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr "Gefundene Seitennamen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr "Gefundene Textstellen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr "Gründliche (nicht katalog-basierte) Suche nach passenden Textstellen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+#, fuzzy
+msgid "recent"
+msgstr "Unterordnen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr "Wählen Sie Ihre Einstellungen für dieses Wiki:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr "Benutzername:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr "(kennzeichnet Ihre Änderungen)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+msgid "Email address:"
+msgstr "E-Mail-Adresse:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+msgid "(allows mail subscription)"
+msgstr "(für E-Mail-Abonnements)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr "Ihre Zeitzone:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr "(für Zeitangaben im Wiki)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr "Höhe des Bearbeitungsformulars:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr "(bestimmt die Größe des Textfelds)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr "Einstellungen speichern"
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+#, fuzzy
+msgid "all"
+msgstr "Alle"
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr "Einstellungen löschen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr "ZWiki-Seite hinzufügen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+#, fuzzy
+msgid "Page&nbsp;name:"
+msgstr "Seitenname"
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "Wiki-Seite hinzufügen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+msgid "Topic"
+msgstr "Thema"
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr "Letzte Änderung"
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+msgid "Comments"
+msgstr "Kommentare"
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+msgid "Views"
+msgstr "Ansichten"
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+msgid "Created"
+msgstr "Erstellt"
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr "#"
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr "von"
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr "<dtml-var lasteditinterval> vor</dtml-var>"
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr "am"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+msgid "Subtopics"
+msgstr "Unterkategorien"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr "Diese Seite besitzt keine Unterkategorien."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+#, fuzzy
+msgid "Here are it's subtopics."
+msgstr "Diese Seite besitzt folgende Unterkategorien:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+#, fuzzy
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr ""
+"Sie können die Reihenfolge der Unterkategorien verändern, indem Sie auf den "
+"Knopf mit dem ^ drücken."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+#, fuzzy
+msgid "Related pages"
+msgstr "Diese Seite erstellen"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+msgid "Parents"
+msgstr "Ãœbergeordnete Seiten"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr "hat keine Oberkategorie."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr "ist eine untergeordnete Seite von:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+msgid "Backlinks"
+msgstr "Backlinks"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr "Diese Seiten verweisen auf sie:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+msgid "No other pages link to this one."
+msgstr "Keine anderen Seiten verweisen auf diese."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+"Wählen Sie eine oder mehrere Checkboxen an, oder geben die hier einen "
+"Seitennamen an. Bestätigen Sie per Click auf den Button."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+"Geben Sie hier einen Seitennamen an, und bestätigen Sie per Click auf den "
+"Button"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+#, fuzzy
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+"Sie brauchen nur wenige Anfangsbuchstaben eingeben, Groß- und "
+"Kleinschreibung sowie Zeichensetzung werden ignoriert."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr "Unterordnen"
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+"Ein Problem mit einem der Skin-Templates dieses Wikis ist aufgetreten. "
+"Eventuell existiert eine Seite oder ein Nicht-Page-Template- bzw. Nicht-DTML-"
+"Method-Objekt mit der selben ID, welches das Skin-Template »überdeckt«. "
+"Eventuell fehlt das Skin-Template auch im Dateisystem (eine unvollständige "
+"Zwiki-Installation)."
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr "Betreff"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr ""
+"Mit aussagekräftigen Betreffen kann man Diskussionen leichter folgen und die "
+"Liste der jüngsten Änderungen wird informativer."
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr "Antwort auf einen Kommentar"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+"Um diese Seite zu kommentieren (und alle Abonnenten zu benachrichtigen), "
+"geben Sie hier einen Text ein und klicken Sie auf 'Kommentar hinzufügen'."
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr "${nb} Abonnenten"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr "1 Abonnent"
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr "Kommentar hinzufügen"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr "Wiki-Inhalt"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr "Singletons"
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr "Nicht erlaubt"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+#, fuzzy
+msgid "Edit history"
+msgstr "Alle Versionen"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+#, fuzzy
+msgid "Edit:"
+msgstr "Bearbeiten"
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+#, fuzzy
+msgid "Manage"
+msgstr "Ändern"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+#, fuzzy
+msgid "Revert this and later edits"
+msgstr "Diese und alle folgenden Änderungen rückgängig machen"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr "Zurück zu"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+#, fuzzy
+msgid "Time:"
+msgstr "Zeit"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+#, fuzzy
+msgid "Note:"
+msgstr "Name,"
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr "Zwischen Quell- und WYSIWYG-Modus wechseln"
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr "Notiz zu den Änderungen (optional)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr "Durch Notizen wird die Liste der letzten Änderungen nützlicher."
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr "Datei oder Bild hochladen"
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr ""
+"Soll eine Datei oder ein Bild ins Wiki hochgeladen und ein Verweis darauf zu "
+"dieser Seite hinzugefügt werden?"
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr "Hilfe zum Bearbeiten von Seiten finden Sie unter"
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr "HilfeSeite"
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr "TextFormatierungsRegeln"
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "preview this edit"
+msgstr "Vorschau der bearbeiteten Seite"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr "Vorschau"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr "Bearbeitung abbrechen und zur ursprünglichen Seite zurückkehren"
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr "Erstellen"
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr "Diese Wiki-Seite erstellen"
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+msgid "label_preview"
+msgstr "VORSCHAU"
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr "Seitenname"
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr ""
+"Der Name dieser Wiki-Seite. (es kann sehr lange dauern, den Namen einer "
+"Seite zu ändern!)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr "Typ"
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr ""
+"Wählen Sie die Art und Weise, wie diese Seite formatiert und dargestellt "
+"werden soll."
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr "Diese Seite mit einem externem Editor bearbeiten"
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr "Startseite"
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr "Letzte Änderungen zeigen"
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr "Änderungen"
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr "Diskussionsseite aufrufen"
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr "Diskussion"
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr "Problemliste (Issue Tracker) aufrufen"
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr "Probleme"
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr "Inhaltverzeichnis aufrufen"
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr "Inhalt"
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr "Index aufrufen"
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr "Index"
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr "Dateien anzeigen, die in dieses Wiki hochgeladen wurden"
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr "Dateien"
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr "Hilfeseite aufrufen"
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr "Hilfe"
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr "Wiki-Einstellungen aufrufen"
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr "Einstellungen"
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr "Backlinks"
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr "E-Mail-Abonnements für diese Seite oder das gesamte Wiki ändern"
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr "Abonnement"
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr "Alte Versionen dieser Seite zeigen"
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr "Startseite aufrufen"
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr "Unterschiede"
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr "Bearbeiten"
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr "Mit externem Editor bearbeiten"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr "Startseite aufrufen"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr "Suche auf allen Seiten"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr "Neu:"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+msgid "parent,"
+msgstr "Oberkategorie,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr "Name,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+msgid "replacement,"
+msgstr "Ersatzseite,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+msgid "page"
+msgstr "Seite"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+"geben Sie den Namen einer Seite ein und klicken Sie auf die Knöpfe rechts "
+"(eine Hilfe erscheint, wenn Sie die Maus über die Knöpfe bewegen)"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "reparent"
+msgstr "Unterordnen"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "make this page a subtopic of the page you have entered"
+msgstr "Diese Seite zu einem Unterthema der eingegebenen Seite machen"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+"Diese Seite in den eingegebenen Namen umbenennen und alle Links aktualisieren"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename"
+msgstr "Umbenennen"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr "Löschen!"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr ""
+"Diese Seite löschen. Sofern direkte Links auf die eingegebene Seite "
+"existieren, diese umleiten."
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+"Erstelle eine Seite mit dem eingegebenen Namen als Unterthema dieser Seite."
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create"
+msgstr "Erstellen"
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+msgid "Recent changes"
+msgstr "Letzte Änderungen"
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+#, fuzzy
+msgid "Search this wiki"
+msgstr "Wiki durchsuchen"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+msgid "all edits"
+msgstr "alle Bearbeitungen"
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr "Sie haben das gesamte Wiki abonniert."
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr "Sie haben nicht das gesamte Wiki abonniert."
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr "E-Mail-Abonnement"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr "Abonnement des gesamten Wikis kündigen"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr "Gesamtes Wiki abonnieren"
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr "Sie haben folgende weiteren Seiten abonniert"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr "Abonnenten dieser Seite"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr "Abonnenten des gesamten Wikis"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+msgid "subscribe_desc_comments"
+msgstr ""
+"Sie können diese Seite oder das gesamte Wiki abonnieren. Als Abonnent werden "
+"Sie per E-Mail benachrichtigt, wenn Kommentare hinzugefügt werden. Sie "
+"können auch zurückkehren zu"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+msgid "subscribe_desc_edits"
+msgstr ""
+"Sie können diese Seite oder das gesamte Wiki abonnieren. Als Abonnent werden "
+"Sie per E-Mail benachrichtigt, wenn diese Seite bzw. das Wiki verändert "
+"werden. Oder kehren Sie zurück zu"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr "Ihre E-Mail-Adresse"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr "Ändern"
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr "Bitte geben Sie für das Abonnement Ihre E-Mail-Adresse ein."
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr "Sie haben diese Seite abonniert."
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr "Sie haben diese Seite nicht abonniert."
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr " Abonnement dieser Seite kündigen "
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr " Diese Seite abonnieren "
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+msgid "User options"
+msgstr "Benutzer Optionen"
+
+#~ msgid "your edit contained a banned link pattern"
+#~ msgstr "Ihre Bearbeitung enthielt einen verbotenen Link"
+
+#~ msgid "adding of external links by anonymous authors is restricted"
+#~ msgstr ""
+#~ "anonyme Autoren dürfen nur eine begrenzte Anzahl externer Links hinzufügen"
+
+#~ msgid "Add a ZWiki web"
+#~ msgstr "Ein ZWiki-Web hinzufügen"
+
+#~ msgid "Type"
+#~ msgstr "Typ"
+
+#~ msgid "Create wiki"
+#~ msgstr "Wiki erstellen"
+
+#~ msgid "and enter"
+#~ msgstr "und betreten"
+
+#~ msgid ""
+#~ "You may create a new ZWiki Page object using the form below. You may also "
+#~ "choose to upload an existing html file from your local computer by "
+#~ "clicking the <i>Browse</i> button."
+#~ msgstr ""
+#~ "Mit Hilfe des Eingabeformulars können Sie eine neue ZWiki-Seite "
+#~ "erstellen. Sie können aber auch eine existierende HTML-Seite von ihrem "
+#~ "eigenen Computer hochladen, indem Sie den Knopf rechts vom 'Datei'-Feld "
+#~ "klicken."
+
+#~ msgid "Add"
+#~ msgstr "Hinzufügen"
+
+#~ msgid "Add and Edit"
+#~ msgstr "Hinzufügen und Bearbeiten"
+
+#~ msgid "Backlinks for"
+#~ msgstr "Backlinks für"
+
+#~ msgid "singleton_desc"
+#~ msgstr "Singletons sind Seiten auf oberster Ebene der Seitenhierarchie."
+
+#~ msgid "History for"
+#~ msgstr "Alte Versionen von"
+
+#~ msgid "return to page"
+#~ msgstr "Zurück zur Seite"
+
+#~ msgid "help_shortname"
+#~ msgstr ""
+#~ "Achtung: In einem großen Wiki kann es sehr lange dauern, eine Seite "
+#~ "umzubenennen. Wenn möglich, werden dabei Verweise in anderen Seiten "
+#~ "aktualisiert."
+
+#~ msgid "label_body_text"
+#~ msgstr "Seiteninhalt"
+
+#~ msgid "help_wikibody"
+#~ msgstr ""
+#~ "Verwenden Sie WikiNamen oder  [eckige Klammern] um auf andere Seiten zu "
+#~ "verweisen. Verweise auf Seiten, die noch nicht existieren, werden mit "
+#~ "einem kleinen <code>?</code> gekennzeichnet. Klicken Sie auf dieses "
+#~ "Fragezeichen, um die fehlende Seite zu erstellen."
+
+#~ msgid "label_note"
+#~ msgstr "Notiz für die Versionskontrolle (optional)"
+
+#~ msgid "help_wikinote"
+#~ msgstr "Kurze Beschreibung ihrer Änderungen:"
+
+#~ msgid "label_upload_contents_optional"
+#~ msgstr "Datei oder Bild hochladen (optional)"
+
+#~ msgid "help_wikiupload"
+#~ msgstr "Fügen Sie hier eine Datei oder ein Bild zu dieser Seite hinzu."
+
+#~ msgid "label_format"
+#~ msgstr "Seitenformat"
+
+#~ msgid "help_format"
+#~ msgstr ""
+#~ "Wenn Sie bei der Wahl des Formats unsicher sind, wählen Sie 'Plain Text'."
+
+#~ msgid "Save"
+#~ msgstr "Speichern"
+
+#~ msgid "heading_edit_wiki_page"
+#~ msgstr "${itemtype} \"${pagename}\" bearbeiten"
+
+#~ msgid "description_edit_wiki_page"
+#~ msgstr "Tragen Sie hier alle Einzelheiten zur Wiki-Seite ein."
+
+#~ msgid "legend_wiki_page_details"
+#~ msgstr "Einzelheiten zur Wiki-Seite"
+
+#~ msgid "label_pagename"
+#~ msgstr "Seitenname"
+
+#~ msgid "Required"
+#~ msgstr "Erforderlich"
+
+#~ msgid "label_required"
+#~ msgstr "(erforderlich)"
+
+#~ msgid "heading_wiki_recent_changes"
+#~ msgstr "Letzte Änderungen"
+
+#~ msgid "heading_wiki_search_wiki"
+#~ msgstr "Suche in diesem Wiki"
+
+#~ msgid "Unsubscribe from this page"
+#~ msgstr "Abonnement für diese Seite kündigen"
+
+#~ msgid "Subscribe to this page"
+#~ msgstr "Diese Seite abonnieren"
+
+#~ msgid "heading_wiki_user_options"
+#~ msgstr "Benutzereinstellungen"
+
+#~ msgid "heading_wiki_filter_issues"
+#~ msgstr "Probleme filtern"
+
+#~ msgid "heading_wiki_issue_browser"
+#~ msgstr "Problem-Browser"
+
+#~ msgid "heading_wiki_issue_tracker"
+#~ msgstr "Problemliste"
+
+#~ msgid "property change"
+#~ msgstr "Eigenschaften ändern"
+
+#~ msgid "backlinks_reparent_help"
+#~ msgstr ""
+#~ "Sie können dieser Seite andere Seiten als Oberkategorien zuordnen, um sie "
+#~ "in der Wiki-Hierarchie zu platzieren. Setzen Sie dazu ein Häkchen vor die "
+#~ "gewünschten(n) Seite(n) oder geben Sie den Namen einer Seite ein."
+
+#~ msgid "backlinks_reparent_help2"
+#~ msgstr "und hier klicken"
+
+#~ msgid "View"
+#~ msgstr "Anzeigen"
+
+#~ msgid "Comment"
+#~ msgstr "Kommentar"
+
+#~ msgid "A Comment"
+#~ msgstr "Ein Kommentar"
+
+#~ msgid "Menu for Wiki Page related actions."
+#~ msgstr "Menü für auf Wiki-Seiten bezogene Aktionen."
+
+#~ msgid "A Wiki"
+#~ msgstr "Ein Wiki"
+
+#~ msgid "Wiki"
+#~ msgstr "Wiki"
+
+#~ msgid "Table of Contents"
+#~ msgstr "Inhaltsverzeichnis"
+
+#~ msgid "TOC"
+#~ msgstr "Inhaltsverzeichnis"
+
+#~ msgid "Subscriptions"
+#~ msgstr "E-Mail-Abonnements"
+
+#~ msgid "Change Wiki Page"
+#~ msgstr "Wiki-Seite ändern"
+
+#~ msgid "Wiki User"
+#~ msgstr "Wiki-Benutzer"
+
+#~ msgid "Wiki visitors, which can only view and comment on wikis."
+#~ msgstr ""
+#~ "Wiki-Besucher, die Wiki-Seiten nur betrachten oder kommentieren dürfen."
+
+#~ msgid "A Wiki Page"
+#~ msgstr "Eine Wiki-Seite"
+
+#~ msgid "Wiki Page"
+#~ msgstr "Wiki-Seite"
+
+#~ msgid "A Wiki Page Comment"
+#~ msgstr "Ein Kommentar einer Wiki-Seite"
+
+#~ msgid "Wiki Page Comment"
+#~ msgstr "Kommentar einer Wiki-Seite"
+
+#~ msgid "Wiki Editor"
+#~ msgstr "Wiki-Bearbeiter"
+
+#~ msgid "The Wiki Editor can create and edit wikis."
+#~ msgstr "Ein Wiki-Bearbeiter darf Wiki-Seiten erstellen und bearbeiten."
+
+#~ msgid "Wiki Administrator"
+#~ msgstr "Wiki-Administrator"
+
+#~ msgid "The Wiki Admin can fully manage wiki pages."
+#~ msgstr "Der Wiki-Administrator darf Wiki-Seiten vollständig verwalten."
+
+#~ msgid "View a Wiki Page"
+#~ msgstr "Eine Wiki-Seite anzeigen"
+
+#~ msgid "View Wiki Page"
+#~ msgstr "Wiki-Seite anzeigen"
+
+#~ msgid "Comment on Wiki Page"
+#~ msgstr "Wiki-Seite kommentieren"
+
+#~ msgid "Make a comment on Wiki Page"
+#~ msgstr "Einer Wiki-Seite einen Kommentar hinzufügen"
+
+#~ msgid "Edit Wiki Page"
+#~ msgstr "Wiki-Seite bearbeiten"
+
+#~ msgid "Delete Wiki Page"
+#~ msgstr "Wiki-Seite löschen"
+
+#~ msgid "Reparent a Wiki Page"
+#~ msgstr "Eine Wiki-Seite in der Wiki-Hierarchie verschieben"
+
+#~ msgid "Reparent Wiki Page"
+#~ msgstr "Wiki-Seite in der Wiki-Hierarchie verschieben"
+
+#~ msgid "Minimal Wiki Page Container implementation "
+#~ msgstr "Minimale Implementation eines Wiki-Seiten-Containers "

Added: zope-zwiki/branches/upstream/current/i18n/en_GB.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/en_GB.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/en_GB.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1307 @@
+# English (United Kingdom) translation for zwiki
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the zwiki package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: English (United Kingdom) <en_GB at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr ""
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr ""
+
+#: src/ZWiki/Diff.py:174
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr ""
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr ""
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr ""
+
+#: src/ZWiki/Editing.py:830
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+msgid "exceeded max_identified_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr ""
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr ""
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr ""
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr ""
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr ""
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr ""
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr ""
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr ""
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr ""
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr ""
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr ""
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr ""
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr ""
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr ""
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr ""
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr ""
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr ""
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr ""
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr ""
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr ""
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr ""
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr ""
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr ""
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr ""
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr ""
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr ""
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr ""
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr ""
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr ""
+
+#: src/ZWiki/Views.py:490
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:809
+msgid "show last edit"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr ""
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr ""
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+msgid "Revert this change and all successive changes"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+msgid "plone"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+msgid "show all features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+msgid "show basic features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+msgid "simple"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+msgid "subtopic"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+msgid "for this page"
+msgstr ""
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+msgid "title"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+msgid "Issue browser"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+msgid "Issue tracker"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+msgid "age"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+msgid "Here are the wiki's issue pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+msgid "search options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+msgid "Severities:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+msgid "Enter a search term, click the numbers to the right,"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+msgid "Name"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+msgid "filter issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+msgid "Optional subject"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+msgid "Optional comment"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+msgid "Add ZWiki"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+msgid "Id:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+msgid "Title:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+msgid "Add wiki"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+msgid "recent"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+msgid "Email address:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+msgid "(allows mail subscription)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+msgid "Page&nbsp;name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+msgid "Add wiki page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+msgid "Topic"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+msgid "Comments"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+msgid "Views"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+msgid "Created"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+msgid "Subtopics"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+msgid "Here are it's subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+msgid "Related pages"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+msgid "Parents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+msgid "Backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+msgid "No other pages link to this one."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr ""
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+msgid "Edit history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+msgid "Edit:"
+msgstr ""
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+msgid "Manage"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+msgid "Revert this and later edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+msgid "Time:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+msgid "Note:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "preview this edit"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr ""
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+msgid "label_preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+msgid "parent,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+msgid "replacement,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+msgid "page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "reparent"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "make this page a subtopic of the page you have entered"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+msgid "Recent changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+msgid "Search this wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+msgid "all edits"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr ""
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr ""
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr ""
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+msgid "subscribe_desc_comments"
+msgstr ""
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+msgid "subscribe_desc_edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr ""
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr ""
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr ""
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+msgid "User options"
+msgstr ""

Added: zope-zwiki/branches/upstream/current/i18n/es.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/es.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/es.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1708 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-03-15 19:03+0000\n"
+"Last-Translator: Pablo Puppo <ilpuppo at gmail.com>\n"
+"Language-Team: spanish <es at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: es\n"
+"Language-name: Spanish\n"
+"Preferred-encodings: utf-8 latin1\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr "No estás autorizado a migrar todas las páginas."
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr "(carpeta -> Manejar propiedades)"
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "No estas autorizado a renombrar esta página Zwiki."
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "No estas autorizado a renombrar esta página Zwiki."
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+"Disculpa, pero este wiki no admite ediciones anónimas.Por favor primero "
+"configura un usuario en las opciones."
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr ""
+"No estás autorizado a cambiar el padre o los subtemas de esta página ZWiki."
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr "No estás autorizado a cambiar el tipo de esta página ZWiki."
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr "No estás autorizado a editar esta página ZWiki."
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr "No estás autorizado a borrar esta página ZWiki."
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+"Esta página se ha renombrado a %s. Puedes borrar ésta si ya no es "
+"necesaria.\n"
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr "No estás autorizado a cargar ficheros aquí."
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr "No estás autorizado a añadir un enlace en esta página ZWiki."
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr "banned_links encontrados"
+
+#: src/ZWiki/Editing.py:830
+#, fuzzy
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr ""
+"Ha ocurrido un problema: %s. Por favor, contacta con el administrador para "
+"obtener ayuda."
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr "\"max_anonymous_links\" excedido"
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+#, fuzzy
+msgid "exceeded max_identified_links"
+msgstr "\"max_anonymous_links\" excedido"
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr "anónimo"
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr "¿ qué páginas enlazan a ésta ?"
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr "Estás aquí"
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr "años"
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr "año"
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr "mes"
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr "meses"
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr "semanas"
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr "semana"
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr "día"
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr "días"
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr "horas"
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr "hora"
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr "minuto"
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr "minutos"
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr "segundo"
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr "segundos"
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr "La página está bloqueada"
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+"\n"
+"            Esta página tiene un bloqueo webDAV. Probablemente alquien la\n"
+"            está editando con un editor externo. Tienes que esperar hasta "
+"que\n"
+"            acabe e intentarlo de nuevo. Si has hecho cambios, puedes "
+"guardar\n"
+"            tu versión del texto para referenciarlo.\n"
+"            "
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr "Para descartar tus cambios y volver a empezar, pulsa Ok"
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr "Conflicto de edición"
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr "Otra persona guardo esta página mientras tú estabas editando"
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr "Para resolver el conflicto haz esto"
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr "Pulsa el botón de ir atrás de tu navegador"
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr "Copia tus cambios recientes en el portapapeles"
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr "Pulsa el botón de refresco de tu navegador"
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr "Pega en tus ediciones otra vez, presta atención a los últimos cambios"
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr "Pulsa el botón Cambiar otra vez"
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr "o"
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr "Para descartar tus cambios recientes y volver a empezar, pulsa Ok"
+
+#: src/ZWiki/Views.py:490
+#, fuzzy
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+"\n"
+"        En navegadores mozilla, podemos acceder a las teclas rápidas "
+"pulsando alt-<key>\n"
+"        Usuarios IE: deben pulsar también enter\n"
+"        Usuarios Mac: command-<key>\n"
+"        Usuarios Opera: shift-escape-<key>\n"
+"        Estas no funcionan aquí, vuelve a la página anterior para probarlo.\n"
+"\n"
+"        0    muestra estas teclas rápidas\n"
+"\n"
+"        funciones del wiki:\n"
+"        f    muestra la página principal\n"
+"        c    muestra los contenidos del wiki\n"
+"        r    muestra los cambios recientes del wiki\n"
+"             muestra la página de discusión\n"
+"        t    muestra el registro de incidencias\n"
+"        i    muestra el índice del wiki\n"
+"        o    muestra las opciones del wiki (preferencias)\n"
+"        h    muestra la página de ayuda\n"
+"        s    ir al campo de búsquda\n"
+"        \n"
+"        funciones de la página:\n"
+"        +    ver páginas en plone/cmf skin (en sitio plone/cmf)\n"
+"        =    ver páginas en standard skin, modo completo\n"
+"        _    ver páginas en standard skin, modo simple\n"
+"        -    ver páginas en standard skin, modo compacto\n"
+"        v    ver páginas sin cambiar el modo de visualización\n"
+"        m    suscripción por email\n"
+"        b    muestra enlaces (enlaces a esta página)\n"
+"        d    muestra diferencias (historia de cambios de la página)\n"
+"        y    muestra historia completa (en ZMI)\n"
+"        e    editar esta página                   \n"
+"        x    editar con el editor externo\n"
+"             imprimir esta página (y subtemas)\n"
+"        q    ver código fuente de la página (vista rápida)\n"
+"             regenera la cache de visualización de la página\n"
+"             ir a subtemas\n"
+"             ir a comentarios (mensajes)\n"
+"             ir a la página principal del autor, si es posible\n"
+"        n    página siguiente\n"
+"        p    página anterior\n"
+"        u    ir a la página padre\n"
+"        \n"
+"        en el formulario de edición:\n"
+"        s    guardar cambios\n"
+"        p    previsualizar\n"
+"        \n"
+"        cuando estamos viendo diferencias:\n"
+"        n    edición siguiente\n"
+"        p    edición anterior\n"
+"        "
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr "crear esta página"
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr "editada hace %(interval)s"
+
+#: src/ZWiki/ZWikiPage.py:809
+msgid "show last edit"
+msgstr "muesta última edición"
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr "por %(editor)s"
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr ""
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr "comentarios"
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr "Se esperaba \"=\" después de \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr "Se esperaba un valor para la tecla \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr "Cargar nuevo anexo \"%(filename)s\""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr "Se esperaba un entero \"%(key)s\" antes de \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr "Se esperaba un entero \"%(arg)s\" después de \"%(key)s\""
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr "Se esperaba un valor de color \"%(arg)s\" después de \"%(key)s\""
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr "responder"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr "historia completa"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr "<< edición anterior"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr "edición siguiente >>"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+#, fuzzy
+msgid "Revert this change and all successive changes"
+msgstr "Deshacer este cambio y todos los siguientes"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr "mostrar skin plone"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+msgid "plone"
+msgstr "plone"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+msgid "show all features"
+msgstr "mostrar todas las características"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr "completo"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+msgid "show basic features"
+msgstr "mostrar características básicas"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+msgid "simple"
+msgstr "simple"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr "mostrar sólo las características esenciales"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr "compacto"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+msgid "subtopic"
+msgstr "subtema"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+msgid "for this page"
+msgstr "para esta página"
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+msgid "title"
+msgstr "título"
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr "Filtrar incidencias"
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+msgid "Issue browser"
+msgstr "Ver incidencias"
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+msgid "Issue tracker"
+msgstr "Registro incidencias"
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "No estás autorizado a editar esta página ZWiki."
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr "categoría"
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr "gravedad"
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr "estado"
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+msgid "age"
+msgstr "creada"
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr "modificada"
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr "Añadir una nueva incidencia:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr "Nombre:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr "Categoría:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr "Gravedad:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr "Estado:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+msgid "Here are the wiki's issue pages."
+msgstr "Aquí están las páginas de incidencias del wiki."
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr "Detalles:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr "añadir incidencia"
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr "Avanzado"
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr "registro de incidencias"
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+msgid "search options"
+msgstr "opciones de búsqueda"
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr "Nombre contiene cualquiera de:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr "Texto de la página contiene cualquiera de:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr "Categorías:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+msgid "Severities:"
+msgstr "Gravedad:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr "Estados:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+#, fuzzy
+msgid "Enter a search term, click the numbers to the right,"
+msgstr "Introduce un término de búsqueda, o pulsa los números a la derecha, o"
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr "Enviado por"
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+msgid "Name"
+msgstr "Nombre"
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr "Categoría"
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+msgid "filter issues"
+msgstr "filtra incidencias"
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr "Gravedad"
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr "Estado"
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+msgid "Optional subject"
+msgstr "Asunto opcional"
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+msgid "Optional comment"
+msgstr "Comentario opcional"
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "Añadir Wiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+#, fuzzy
+msgid "Id:"
+msgstr "Id"
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+#, fuzzy
+msgid "Title:"
+msgstr "Título"
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "Añadir Wiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr "Páginas modificadas en los últimos"
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr "Páginas modificadas recientemente, con sumarios"
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr "¿Mostrar sumarios?"
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr "Refrescar"
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr "Página"
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr "Editada&nbsp;por"
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr "Fecha"
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr "NUEVA"
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr "Las páginas marcadas (NUEVA) han sido creadas en la última semana"
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr "busca incidencias"
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr ""
+"Introduce una palabra o frase y pulsa enter para buscar en todo el wiki."
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr ""
+"Esto es lo mismo que usar el campo de búsqueda en la parte superior derecha."
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr "Consejos: Una única palabra va mejor para encontrar nombres de página."
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+"No distinguir mayúsculas-minúsculas y comodines pueden ser soportadas "
+"dependiendo de la configuración del catálogo."
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr "Dejar en blanco para listar todas las páginas."
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr "Buscar"
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr "Nombres de página coincidentes"
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr "Texto coincidente"
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr "Búsqueda completa (sin catálogo)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+msgid "recent"
+msgstr "recientes"
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr "Cambia tus preferencias para este wiki:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr "Usuario:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr "(identifica tus cambios)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+msgid "Email address:"
+msgstr "Email:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+msgid "(allows mail subscription)"
+msgstr "(permite suscripción por correo)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr "Tu zona de tiempo:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr "(localiza la mayoría de horarios)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr "Edita la altura del formulario:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr "(ajusta tamaño del formulario)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr "Guardar opciones"
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr "todas"
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr "Descartar opciones"
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr "Añadir una página ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+#, fuzzy
+msgid "Page&nbsp;name:"
+msgstr "Nombre de la página"
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "Añadir una Página Wiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+msgid "Topic"
+msgstr "Tema"
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr "Última modificación"
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+msgid "Comments"
+msgstr "Comentarios"
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+msgid "Views"
+msgstr "Visitas"
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+msgid "Created"
+msgstr "Creado"
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr "por"
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr "hace <dtml-var lasteditinterval></dtml-var>"
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr "en"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+msgid "Subtopics"
+msgstr "Subtemas"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr "Está página no tiene subtemas."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+#, fuzzy
+msgid "Here are it's subtopics."
+msgstr "Aquí están sus subtemas:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+#, fuzzy
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr "Puedes cambiar el orden de los subtemas pulsando los botones ^."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+#, fuzzy
+msgid "Related pages"
+msgstr "crear esta página"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+msgid "Parents"
+msgstr "Padres"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr "es un tema de primer nivel"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr "es un subtema de:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+msgid "Backlinks"
+msgstr "Enlaces"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr "Aquí están las páginas que me enlazan:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+msgid "No other pages link to this one."
+msgstr "Ninguna página enlaza a esta."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr "Cambiar padre"
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+#, fuzzy
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+"Hay un problema con una de las plantillas de este wiki. Puede haber un "
+"objeto con un ID de plantilla que no es un Page Template o DTML Method, o la "
+"plantilla no está."
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr "asunto"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr "el asunto ayuda a leer los hilos y los Cambios Recientes"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr "respondiendo"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+"para comentar (y cc a cualquier suscriptor) introduce aquí el texto y pulsa "
+"añadir"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr "${nb} subscriptores"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr "1 suscriptor"
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr "Añadir un comentario"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr "Contenidos del wiki"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+#, fuzzy
+msgid "Edit history"
+msgstr "historia completa"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+#, fuzzy
+msgid "Edit:"
+msgstr "Editar"
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+#, fuzzy
+msgid "Manage"
+msgstr "Cambiar"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+#, fuzzy
+msgid "Revert this and later edits"
+msgstr "Deshacer este cambio y todos los siguientes"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr "Volver a la página"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+#, fuzzy
+msgid "Time:"
+msgstr "Fecha"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+#, fuzzy
+msgid "Note:"
+msgstr "Nombre:"
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr "cambia de modo fuente/WYSIWYG"
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr "Nota de cambio opcional"
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr "una nota hace Cambios Recientes más útil"
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr "Carga un fichero o imagen"
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr "carga un fichero y enlázalo en esta página"
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr "Para ayuda sobre edición, ver"
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr "Página de Ayuda"
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr "Reglas de Formateo de Texto"
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "preview this edit"
+msgstr "previsualizar los cambios"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr "Previsualizar"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr "cancelar la edición y volver a la página"
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr "Crear"
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr "crear esta página wiki"
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+msgid "label_preview"
+msgstr "PREVISUALIZAR"
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr "Nombre de la página"
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr "el nombre de esta página wiki (cambiarlo puede ser lento!)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr "tipo"
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr "selecciona el estilo de formato y visualización para esta página"
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr "(edición externa)"
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr "inicio"
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr "mostrar cambios recientes del wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr "cambios"
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr "mostrar página de discusión"
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr "discusión"
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr "mostrar registro de incidencias"
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr "incidencias"
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr "mostrar contenidos del wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr "contenidos"
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr "mostrar índice del wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr "índice"
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr "mostrar página cargada"
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr "mostrar página de ayuda"
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr "ayuda"
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr "mostrar opciones del wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr "opciones"
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr "enlaces"
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr "configurar suscripción por email a esta página o sitio"
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr "suscripción"
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr "mostrar la historia de cambios de esta página"
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr "mostrar página principal"
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr "diff"
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr "editar"
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr "editar con el editor externo"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr "ir a la página inicio"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr "buscar en todas las páginas"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr "nuevo"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+msgid "parent,"
+msgstr "padre,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr "cambiar nombre,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+msgid "replacement,"
+msgstr "reemplazar,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+#, fuzzy
+msgid "page"
+msgstr "creada"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+"introduce un nombre de página y pulsa los botones de la derecha (pasa sobre "
+"ellos para ayuda)"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+#, fuzzy
+msgid "reparent"
+msgstr "Cambiar padre"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "make this page a subtopic of the page you have entered"
+msgstr "hacer esta página subtema de la que has introducido"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr "renombrar esta página con este nombre, modificando todos los enlaces"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+#, fuzzy
+msgid "rename"
+msgstr "cambiar nombre,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr ""
+"borrar esta página y redirigir los enlaces a la página introducida, si la hay"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr "crear una página con el nombre introducido, como subtema de ésta"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+#, fuzzy
+msgid "create"
+msgstr "Crear wiki"
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+msgid "Recent changes"
+msgstr "Cambios Recientes"
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+msgid "Search this wiki"
+msgstr "Buscar en el wiki"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+#, fuzzy
+msgid "all edits"
+msgstr "editar"
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr ""
+"Actualmente estás suscrito<br />\n"
+"                al wiki completo."
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr ""
+"Actualmente no estás suscrito<br />\n"
+"                al wiki completo."
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr "Suscripción por correo"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr "Desuscribirse del wiki completo"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr "Suscribirse al wiki completo"
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr "Estás suscrito a estas otras páginas"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr "Suscriptores de la página"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr "Suscriptores del wiki"
+
+#  "You can subscribe to this page or to the whole wiki.\n"
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+msgid "subscribe_desc_comments"
+msgstr ""
+"Puedes suscribirte a esta página o al wiki completo.\n"
+"          Los suscriptores reciben una copia de los comentarios por correo.\n"
+"          O vuelve a"
+
+#  "You can subscribe to this page or to the whole wiki.\n"
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+msgid "subscribe_desc_edits"
+msgstr ""
+"Puedes suscribirte a esta página o al wiki completo.\n"
+"          Los suscriptores reciben una copia de todas las modificaciones por "
+"correo.\n"
+"          O vuelve a"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr "Tu dirección email"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr "Cambiar"
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr "Para suscribirte, configura tu dirección email."
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr ""
+"Actualmente estás suscrito<br />\n"
+"                a esta página."
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr ""
+"Actualmente no estás suscrito<br />\n"
+"                a esta página."
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr " Desuscribirse de esta página "
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr " Suscribirse a esta página "
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+#, fuzzy
+msgid "User options"
+msgstr "opciones de búsqueda"
+
+#~ msgid "your edit contained a banned link pattern"
+#~ msgstr "tu edición contiene un patrón de enlace 'banned'"
+
+#~ msgid "adding of external links by anonymous authors is restricted"
+#~ msgstr "los usuarios anónimos no pueden añadir enlaces externos"
+
+#~ msgid "Add a ZWiki web"
+#~ msgstr "Añadir una web ZWiki"
+
+#~ msgid "Type"
+#~ msgstr "Tipo"
+
+#~ msgid "Create wiki"
+#~ msgstr "Crear wiki"
+
+#~ msgid "and enter"
+#~ msgstr "y pulsa el retorno de carro"
+
+#~ msgid ""
+#~ "You may create a new ZWiki Page object using the form below. You may also "
+#~ "choose to upload an existing html file from your local computer by "
+#~ "clicking the <i>Browse</i> button."
+#~ msgstr ""
+#~ "Puedes crear una nueva página ZWiki utilizando este formulario. También "
+#~ "puedes cargar un fichero html desde tu máquina local pulsando el botón "
+#~ "<i>Browse</i>."
+
+#~ msgid "File"
+#~ msgstr "Fichero"
+
+#~ msgid "Add"
+#~ msgstr "Añadir"
+
+#~ msgid "Add and Edit"
+#~ msgstr "Añadir y editar"
+
+#~ msgid "log_note"
+#~ msgstr "Nota en el log:"
+
+#~ msgid "Backlinks for"
+#~ msgstr "Enlaces para"
+
+#~ msgid "singleton_desc"
+#~ msgstr "Singletons son páginas que no están conectadas a otras páginas."
+
+#~ msgid "History for"
+#~ msgstr "Historia para"
+
+#~ msgid "return to page"
+#~ msgstr "volver a la página"
+
+#~ msgid "help_shortname"
+#~ msgstr ""
+#~ "Nota: Renombrar una página en un wiki grande puede ser lento. Otras "
+#~ "páginas serán modificadas si es posible."
+
+#~ msgid "label_body_text"
+#~ msgstr "Texto"
+
+#~ msgid "help_wikibody"
+#~ msgstr ""
+#~ "En una página Wiki, puedes usar [corchetes] para crear enlaces. Cuando "
+#~ "guardas la página, el contenido\n"
+#~ "            de los corchetes tendrá un pequeño enlace <code>?</code> a "
+#~ "continuación, que puedes pulsar para crear\n"
+#~ "            una nueva página con ese nombre."
+
+#~ msgid "help_wikiwords"
+#~ msgstr "Este wiki también soporta WikiWords como mecanismo de enlace."
+
+#~ msgid "label_note"
+#~ msgstr "Nota para la historia de la página (opcional)"
+
+#~ msgid "help_wikinote"
+#~ msgstr "Una pequeña descripción de tus cambios."
+
+#~ msgid "label_upload_contents_optional"
+#~ msgstr "Carga un fichero o imagen (opcional)"
+
+#~ msgid "help_wikiupload"
+#~ msgstr "Anexa un fichero o imagen a esta página wiki."
+
+#~ msgid "label_format"
+#~ msgstr "Formato de la página"
+
+#~ msgid "help_format"
+#~ msgstr ""
+#~ "Si no estás seguro del formato a usar, selecciona Texto Plano\n"
+#~ "            y escribe el documento de la manera habitual."
+
+#~ msgid "Save"
+#~ msgstr "Guardar"
+
+#~ msgid "heading_edit_wiki_page"
+#~ msgstr ""
+#~ "Editar\n"
+#~ "        ${itemtype} \n"
+#~ "\n"
+#~ "        \"${pagename}\""
+
+#~ msgid "description_edit_wiki_page"
+#~ msgstr "Una página wiki permite crear páginas interconectadas."
+
+#~ msgid "legend_wiki_page_details"
+#~ msgstr "Detalles de la Página Wiki"
+
+#~ msgid "label_pagename"
+#~ msgstr "Nombre de la página"
+
+#~ msgid "Required"
+#~ msgstr "Obligatorio"
+
+#~ msgid "label_required"
+#~ msgstr "(Obligatorio)"
+
+#~ msgid "heading_wiki_recent_changes"
+#~ msgstr "Cambios recientes"
+
+#~ msgid "heading_wiki_search_wiki"
+#~ msgstr "Buscar en el wiki"
+
+#~ msgid "Unsubscribe from this page"
+#~ msgstr "Desuscribirse de esta página"
+
+#~ msgid "Subscribe to this page"
+#~ msgstr "Suscribirse a esta página"
+
+#~ msgid "heading_wiki_user_options"
+#~ msgstr "Opciones del usuario"
+
+#, fuzzy
+#~ msgid "add a comment"
+#~ msgstr "Añadir un comentario"
+
+#~ msgid "heading_wiki_filter_issues"
+#~ msgstr "Filtra incidencias"
+
+#~ msgid "heading_wiki_issue_browser"
+#~ msgstr "Registro de incidencias"
+
+#~ msgid "heading_wiki_issue_tracker"
+#~ msgstr "Registro de incidencias"
+
+#, fuzzy
+#~ msgid "property change"
+#~ msgstr "Cambios Recientes"
+
+#~ msgid "backlinks_reparent_help"
+#~ msgstr ""
+#~ "Puedes cambiar el padres(s) de la página para situarla dentro de la "
+#~ "jerarquía\n"
+#~ "global. Marca uno o más checks o introduce un nuevo nombre de página aquí:"
+
+#~ msgid "backlinks_reparent_help2"
+#~ msgstr "y pulsa"
+
+#, fuzzy
+#~ msgid "View"
+#~ msgstr "Fichero"
+
+#~ msgid "Comment"
+#~ msgstr "Comentario"
+
+#~ msgid "A Comment"
+#~ msgstr "Un comentario"
+
+#~ msgid "Menu for Wiki Page related actions."
+#~ msgstr "Menú para acciones relacionadas con la Página Wiki"
+
+#~ msgid "Table of Contents"
+#~ msgstr "Tabla de Contenidos"
+
+#~ msgid "A Wiki"
+#~ msgstr "Un Wiki"
+
+#~ msgid "Wiki"
+#~ msgstr "Wiki"
+
+#, fuzzy
+#~ msgid "TOC"
+#~ msgstr "Tabla de Contenido"
+
+#~ msgid "Subscriptions"
+#~ msgstr "Suscripciones"
+
+#~ msgid "Change Wiki Page"
+#~ msgstr "Cambiar Página Wiki"
+
+#~ msgid "Wiki User"
+#~ msgstr "Usuario del Wiki"
+
+#~ msgid "Wiki visitors, which can only view and comment on wikis."
+#~ msgstr "Visitantes del wiki, que sólo pueden ver y comentar sobre el wiki."
+
+#~ msgid "A Wiki Page"
+#~ msgstr "Una Página Wiki"
+
+#~ msgid "Wiki Page"
+#~ msgstr "Página Wiki"
+
+#~ msgid "A Wiki Page Comment"
+#~ msgstr "Un Comentario de la Página Wiki"
+
+#~ msgid "Wiki Page Comment"
+#~ msgstr "Comentario de la Página Wiki"
+
+#~ msgid "Wiki Editor"
+#~ msgstr "Editor Wiki"
+
+#~ msgid "The Wiki Editor can create and edit wikis."
+#~ msgstr "El Editor Wiki puede crear y editar wikis."
+
+#~ msgid "Wiki Administrator"
+#~ msgstr "Administrador del Wiki"
+
+#~ msgid "The Wiki Admin can fully manage wiki pages."
+#~ msgstr "El Admin del Wiki puede administrar las páginas wiki."
+
+#~ msgid "View a Wiki Page"
+#~ msgstr "Ver una Página Wiki"
+
+#~ msgid "View Wiki Page"
+#~ msgstr "Ver una Página Wiki"
+
+#~ msgid "Comment on Wiki Page"
+#~ msgstr "Comentario en una Página Wiki"
+
+#~ msgid "Make a comment on Wiki Page"
+#~ msgstr "Hacer un comentario en una Página Wiki."
+
+#~ msgid "Edit Wiki Page"
+#~ msgstr "Editar una Página Wiki"
+
+#~ msgid "Delete Wiki Page"
+#~ msgstr "Borrar Página Wiki"
+
+#~ msgid "Reparent a Wiki Page"
+#~ msgstr "Cambiar el padre de una Página Wiki"
+
+#~ msgid "Reparent Wiki Page"
+#~ msgstr "Cambiar el padre de una Página Wiki"
+
+#~ msgid "page in parent wiki"
+#~ msgstr "página en wiki padre"
+
+#~ msgid "uploads_desc"
+#~ msgstr "Esta página lista todos los uploads en este Wiki."
+
+#~ msgid "save"
+#~ msgstr "guardar"
+
+#~ msgid "view"
+#~ msgstr "ver"
+
+#~ msgid "no_files_uploaded"
+#~ msgstr "No se han cargado ficheros."
+
+#~ msgid "box_wiki_navigation"
+#~ msgstr "Navegación del Wiki"
+
+#~ msgid "enter comments here and click add; or, click edit"
+#~ msgstr "introduce comentarios aquí y pulsa añadir; o, pulsa editar"
+
+#~ msgid "You are not authorized to add ZWiki Pages here."
+#~ msgstr "No estás autorizado a añadir páginas ZWiki aquí."
+
+#~ msgid "You are not authorized to set this ZWiki Page's regulations."
+#~ msgstr ""
+#~ "No estás autorizado a cambiar las regulaciones de esta página Zwiki."
+
+#~ msgid "Add a ZWiki web.."
+#~ msgstr "Añadir una web ZWiki.."
+
+#~ msgid " permission is required."
+#~ msgstr " permiso requerido."
+
+#~ msgid "You are not authorized to add files larger than"
+#~ msgstr "No estás autorizado a añadir ficheros más largos que"
+
+#~ msgid "here"
+#~ msgstr "aquí"

Added: zope-zwiki/branches/upstream/current/i18n/et.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/et.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/et.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1351 @@
+# Estonian translation for zwiki
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the zwiki package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-03-15 21:10+0000\n"
+"Last-Translator: Simon Michael <simon at joyful.com>\n"
+"Language-Team: Estonian <et at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr "Sul ei ole õigust uuendada kõiki lehekülgi."
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr ""
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "Sul puudub õigus kustuda see ZWiki lehekülg."
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+#, fuzzy
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "Sul puudub õigus kustuda see ZWiki lehekülg."
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr ""
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr "Sul puudub õigus redigeerida seda ZWiki lehekülge."
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr "Sul puudub õigus kustuda see ZWiki lehekülg."
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr ""
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr ""
+
+#: src/ZWiki/Editing.py:830
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+msgid "exceeded max_identified_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr "anonüümne"
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr ""
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr "Sa oled siin"
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr "aastat"
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr "aasta"
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr "kuu"
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr "kuud"
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr "nädalat"
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr "nädal"
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr "päev"
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr "päeva"
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr "tundi"
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr "tund"
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr "minut"
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr "minutit"
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr "sekund"
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr "sekundit"
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr "Lehekülg on lukustatud"
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr ""
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr ""
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr ""
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr ""
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr ""
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr ""
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr ""
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr ""
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr ""
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr "või"
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr ""
+
+#: src/ZWiki/Views.py:490
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:809
+msgid "show last edit"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr ""
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr ""
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr "kommentaarid"
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+msgid "Revert this change and all successive changes"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+msgid "plone"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+msgid "show all features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+msgid "show basic features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+msgid "simple"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+msgid "subtopic"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+msgid "for this page"
+msgstr ""
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+msgid "title"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+msgid "Issue browser"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+msgid "Issue tracker"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "Sul puudub õigus redigeerida seda ZWiki lehekülge."
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+msgid "age"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+msgid "Here are the wiki's issue pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+msgid "search options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+msgid "Severities:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+msgid "Enter a search term, click the numbers to the right,"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+msgid "Name"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+msgid "filter issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+msgid "Optional subject"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+msgid "Optional comment"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "Lisa Wiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+msgid "Id:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+msgid "Title:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "Lisa Wiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr "Otsing"
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+msgid "recent"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+msgid "Email address:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+msgid "(allows mail subscription)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+msgid "Page&nbsp;name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "Wiki lehekülg"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+msgid "Topic"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+msgid "Comments"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+msgid "Views"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+msgid "Created"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+msgid "Subtopics"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+msgid "Here are it's subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+msgid "Related pages"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+msgid "Parents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+msgid "Backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+msgid "No other pages link to this one."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr ""
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+msgid "Edit history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+#, fuzzy
+msgid "Edit:"
+msgstr "Redigeeri"
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+msgid "Manage"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+msgid "Revert this and later edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+msgid "Time:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+msgid "Note:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "preview this edit"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr ""
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+msgid "label_preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr "uus"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+msgid "parent,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+msgid "replacement,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+msgid "page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "reparent"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "make this page a subtopic of the page you have entered"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+msgid "Recent changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+msgid "Search this wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+msgid "all edits"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr ""
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr ""
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr ""
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+msgid "subscribe_desc_comments"
+msgstr ""
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+msgid "subscribe_desc_edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr ""
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr ""
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr ""
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+msgid "User options"
+msgstr ""
+
+#, fuzzy
+#~ msgid "add a comment"
+#~ msgstr "kommentaarid"
+
+#~ msgid "View"
+#~ msgstr "Vaade"
+
+#~ msgid "Comment"
+#~ msgstr "Kommentaar"
+
+#~ msgid "Table of Contents"
+#~ msgstr "Sisukord"
+
+#~ msgid "Change Wiki Page"
+#~ msgstr "Muuda Wiki lehekülge"
+
+#~ msgid "Wiki User"
+#~ msgstr "Wiki kasutaja"
+
+#~ msgid "Wiki Page"
+#~ msgstr "Wiki lehekülg"
+
+#~ msgid "A Wiki Page Comment"
+#~ msgstr "Wiki lehekülje kommentaar"
+
+#~ msgid "Wiki Page Comment"
+#~ msgstr "Wiki lehekülje kommentaar"
+
+#~ msgid "Wiki Editor"
+#~ msgstr "Wiki redigeerija"
+
+#~ msgid "Wiki Administrator"
+#~ msgstr "Wiki administraator"
+
+#~ msgid "Delete Wiki Page"
+#~ msgstr "Kustuta Wiki lehekülg"

Added: zope-zwiki/branches/upstream/current/i18n/fi.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/fi.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/fi.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1434 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-03-21 06:27+0000\n"
+"Last-Translator: Marko Kervinen <marko_kervinen at hotmail.com>\n"
+"Language-Team: Finnish <fi at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: fi\n"
+"Language-name: Finnish\n"
+"Preferred-encodings: utf-8\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+#, fuzzy
+msgid "You are not authorized to upgrade all pages."
+msgstr "Sinulla ei ole oikeuksia päivittää kaikkia sivuja."
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr "(kansio -> Hallinnoi ominaisuuksia) / (folder -> Manage properties)"
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "Sinulla ei ole valtuutta uudelleennimet tt ZWiki-sivua."
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "Sinulla ei ole valtuutta uudelleennimet tt ZWiki-sivua."
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+#, fuzzy
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+"Tämä wiki ei salli kirjautumattomia muokkauksia. Valitse käyttäjänimi "
+"valikosta ensin."
+
+#: src/ZWiki/Editing.py:327
+#, fuzzy
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr "Sinulla ei ole valtuutta list linkki tlle ZWiki-sivulle."
+
+#: src/ZWiki/Editing.py:349
+#, fuzzy
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr "Sinulla ei ole valtuutta muuttaa tämän ZWiki-sivun tyyppiä."
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+#, fuzzy
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr "Sinulla ei ole valtuutta muokata tätä ZWiki-sivua."
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr "Sinulla ei ole valtuutta poistaa tätä ZWiki-sivua."
+
+#: src/ZWiki/Editing.py:563
+#, fuzzy
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+"Tämä sivu on uudelleennimetty %s. Voit tuhota sivun jos sitä ei tarvita.\n"
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr "Sinulla ei ole valtuutta lisätä tänne tiedostoja."
+
+#: src/ZWiki/Editing.py:663
+#, fuzzy
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr "Sinulla ei ole valtuutta lisätä linkkiä tälle ZWiki-sivulle."
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr ""
+
+#: src/ZWiki/Editing.py:830
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+msgid "exceeded max_identified_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr ""
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr ""
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr ""
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr ""
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr ""
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr ""
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr ""
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr ""
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr ""
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr ""
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr ""
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr ""
+
+#: src/ZWiki/Utils.py:473
+#, fuzzy
+msgid "hour"
+msgstr "tai"
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr ""
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr ""
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr ""
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr ""
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr "Sivu on lukittu"
+
+#: src/ZWiki/Views.py:357
+#, fuzzy
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+"\n"
+"            Tm sivu on webDAV-lukittu.  Joka luultavasti muokkaa sivua\n"
+"ulkoisella editorilla.  Sinun tulee odottaa kunnos muokkaus on\n"
+"valmis ja sitten yritt uudelleen.  Jos olet juuri tehnyt muutoksia,\n"
+"haluat ehk menn takaisin ja kopioida oman tekstisi talteen.\n"
+"            "
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr "Jos haluat hylt muutoksesi ja yritt uudelleen, npyt OK."
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr "Muokkaustrmys"
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr "Joku muu on tallentanut sivun sill vlin kun muokkasit sivua"
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr "Trmyksen ratkaisemiseksi tee nin"
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr "Npyt selaimesi takaisin- tai back-nappi"
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr "Kopioi muutoksesi leikepydlle"
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr "Npyt selaimesi virkistysnappia (refresh)"
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr "Kopioi muutoksesi leikepydlt huomioiden tuoreet muutokset"
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr "Npyt uudelleen Muuta -nappia"
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr "tai"
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr "Jos haluat hylt muutoksesi ja aloittaa alusta, npyt OK"
+
+#: src/ZWiki/Views.py:490
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:809
+msgid "show last edit"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr ""
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr ""
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+msgid "Revert this change and all successive changes"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+msgid "plone"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+msgid "show all features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+msgid "show basic features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+#, fuzzy
+msgid "simple"
+msgstr "Tiedosto"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+msgid "subtopic"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+#, fuzzy
+msgid "for this page"
+msgstr "Luo wiki"
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+#, fuzzy
+msgid "title"
+msgstr "Otsikko"
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+msgid "Issue browser"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+msgid "Issue tracker"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "Sinulla ei ole valtuutta muokata tätä ZWiki-sivua."
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+msgid "age"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+#, fuzzy
+msgid "Here are the wiki's issue pages."
+msgstr "Luo wiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+#, fuzzy
+msgid "search options"
+msgstr "Luo wiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+msgid "Severities:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+msgid "Enter a search term, click the numbers to the right,"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+#, fuzzy
+msgid "Name"
+msgstr "Luo wiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+msgid "filter issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+msgid "Optional subject"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+msgid "Optional comment"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "Lis ZWiki-sivu"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+#, fuzzy
+msgid "Id:"
+msgstr "Tunniste"
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+#, fuzzy
+msgid "Title:"
+msgstr "Otsikko"
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "Lis ZWiki-sivu"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+#, fuzzy
+msgid "Time"
+msgstr "Otsikko"
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+msgid "recent"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+msgid "Email address:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+msgid "(allows mail subscription)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr "Lis ZWiki-sivu"
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+msgid "Page&nbsp;name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "Lis ZWiki-sivu"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+msgid "Topic"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+msgid "Comments"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+msgid "Views"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+#, fuzzy
+msgid "Created"
+msgstr "Luo wiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+msgid "Subtopics"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+#, fuzzy
+msgid "This page has no subtopics."
+msgstr "Sivun uusi nimi on %s."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+#, fuzzy
+msgid "Here are it's subtopics."
+msgstr "Luo wiki"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+msgid "Related pages"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+msgid "Parents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+msgid "Backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+msgid "No other pages link to this one."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr ""
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+msgid "Edit history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+msgid "Edit:"
+msgstr ""
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+msgid "Manage"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+msgid "Revert this and later edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+#, fuzzy
+msgid "Time:"
+msgstr "Otsikko"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+msgid "Note:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "preview this edit"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+#, fuzzy
+msgid "Create"
+msgstr "Luo wiki"
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+#, fuzzy
+msgid "create this wiki page"
+msgstr "Luo wiki"
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+msgid "label_preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+#, fuzzy
+msgid "type"
+msgstr "Tyyppi"
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+msgid "parent,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+msgid "replacement,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+msgid "page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "reparent"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "make this page a subtopic of the page you have entered"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+#, fuzzy
+msgid "rename"
+msgstr "Luo wiki"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+#, fuzzy
+msgid "create"
+msgstr "Luo wiki"
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+msgid "Recent changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+#, fuzzy
+msgid "Search this wiki"
+msgstr "Luo wiki"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+msgid "all edits"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr ""
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr ""
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr ""
+
+#  "You can subscribe to this page or to the whole wiki.\n"
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+msgid "subscribe_desc_comments"
+msgstr ""
+
+#  "You can subscribe to this page or to the whole wiki.\n"
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+msgid "subscribe_desc_edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr ""
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr ""
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr ""
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+#, fuzzy
+msgid "User options"
+msgstr "Luo wiki"
+
+#~ msgid "Add a ZWiki web"
+#~ msgstr "Lis ZWiki-sivusto"
+
+#~ msgid "Type"
+#~ msgstr "Tyyppi"
+
+#~ msgid "Create wiki"
+#~ msgstr "Luo wiki"
+
+#, fuzzy
+#~ msgid "and enter"
+#~ msgstr "(ja paina enter)"
+
+#, fuzzy
+#~ msgid ""
+#~ "You may create a new ZWiki Page object using the form below. You may also "
+#~ "choose to upload an existing html file from your local computer by "
+#~ "clicking the <i>Browse</i> button."
+#~ msgstr ""
+#~ "Voit luoda uuden ZWiki-sivun allaolevalla lomakkeella.  Voit mys \n"
+#~ "list uuden html-tiedoston omalta koneeltasi \n"
+#~ "<i>Selaa</i>- tai <i>Browse</i>-napilla."
+
+#~ msgid "File"
+#~ msgstr "Tiedosto"
+
+#~ msgid "Add"
+#~ msgstr "Lis"
+
+#~ msgid "Add and Edit"
+#~ msgstr "Lis ja muokkaa"
+
+#~ msgid "Table of Contents"
+#~ msgstr "Sisällysluettelo"
+
+#, fuzzy
+#~ msgid "A Wiki"
+#~ msgstr "Lis ZWiki-sivu"
+
+#, fuzzy
+#~ msgid "Change Wiki Page"
+#~ msgstr "Lis ZWiki-sivu"
+
+#~ msgid "Wiki User"
+#~ msgstr "Wikikäyttäjä"
+
+#, fuzzy
+#~ msgid "A Wiki Page"
+#~ msgstr "Lis ZWiki-sivu"
+
+#, fuzzy
+#~ msgid "Wiki Page"
+#~ msgstr "Lis ZWiki-sivu"
+
+#, fuzzy
+#~ msgid "A Wiki Page Comment"
+#~ msgstr "Lis ZWiki-sivu"
+
+#~ msgid "Wiki Editor"
+#~ msgstr "Widi-editori"
+
+#, fuzzy
+#~ msgid "View a Wiki Page"
+#~ msgstr "Lis ZWiki-sivu"
+
+#, fuzzy
+#~ msgid "View Wiki Page"
+#~ msgstr "Lis ZWiki-sivu"
+
+#, fuzzy
+#~ msgid "Edit Wiki Page"
+#~ msgstr "Lis ZWiki-sivu"
+
+#, fuzzy
+#~ msgid "Delete Wiki Page"
+#~ msgstr "Lis ZWiki-sivu"
+
+#, fuzzy
+#~ msgid "Reparent Wiki Page"
+#~ msgstr "Lis ZWiki-sivu"
+
+#~ msgid "You are not authorized to add ZWiki Pages here."
+#~ msgstr "Sinulla ei ole valtuutta list tnne ZWiki-sivuja."
+
+#~ msgid "You are not authorized to set this ZWiki Page's regulations."
+#~ msgstr "Sinulla ei ole valtuutta asettaa tmn ZWiki-sivun sntj."

Added: zope-zwiki/branches/upstream/current/i18n/fr.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/fr.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/fr.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1611 @@
+# translation of zwiki-fr.po to French
+# Encolpe DEGOUTE <<encolpe.degoute at ingeniweb.com>>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki-fr\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-02-26 09:02+0000\n"
+"Last-Translator: Encolpe Degoute <encolpe at colpi.info>\n"
+"Language-Team: French <support at ingeniweb.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"x-is-fallback-for: fr-be fr-ca fr-lu fr-mc fr-ch\n"
+"Language-code: fr\n"
+"Language-name: French\n"
+"Preferred-encodings: utf-8\n"
+"Domain: zwiki\n"
+"X-Generator: KBabel 1.10.2\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr "Vous n'êtes pas autorisé à mettre à niveau l'ensemble des pages."
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr "(dossier -> Gérer les propriétés)"
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "Vous n'êtes pas autorisé à supprimer cette page ZWiki."
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+#, fuzzy
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "Vous n'êtes pas autorisé à supprimer cette page ZWiki."
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr ""
+"Vous n'êtes pas autorisé à modifier l'ascendance ou changer les liens des "
+"sous rubriques sur cette page ZWiki."
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr "Vous n'êtes pas autorisé à changer le type de cette page ZWiki."
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr "Vous n'êtes pas autorisé à éditer cette page ZWiki."
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr "Vous n'êtes pas autorisé à supprimer cette page ZWiki."
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+"Cette page a été renommée en «%s». Vous pouvez supprimer celle-ci si elle "
+"n'est plus requise.\n"
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr ""
+"Vous n'êtes pas autorisé à transférer des fichiers vers cette destination."
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr "Vous n'êtes pas autorisé à ajouter de lien sur cette page ZWiki."
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr "Correspondance de liens bannis"
+
+#: src/ZWiki/Editing.py:830
+#, fuzzy
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr ""
+"Il y a un problème %s. Veuillez contacter le gestionnaire du site pour "
+"obtenir de l'aide."
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr "dépassement du nombres maximum de liens anonymes"
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+#, fuzzy
+msgid "exceeded max_identified_links"
+msgstr "dépassement du nombres maximum de liens anonymes"
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr "anonyme"
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr "quelles sont les pages liées à celle-ci ?"
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr "Vous êtes ici"
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr "ans"
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr "an"
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr "mois"
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr "mois"
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr "semaines"
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr "semaine"
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr "jour"
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr "jours"
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr "heures"
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr "heure"
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr "minute"
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr "minutes"
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr "seconde"
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr "secondes"
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr "La page est verouillée"
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+"\n"
+"            Un verrou webDAV est posé sur cette page.\n"
+"            Quelqu'un est probablement en train de la modifier avec un\n"
+"            éditeur externe. Attendez qu'il ait fini, puis réessayer. \n"
+"            Si vous avez fait des changements,\n"
+"            vous devriez copier et enregistrer votre version du texte pour\n"
+"            vous y référer ultérieurement.\n"
+"            "
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr "Pour abandonner vos changements et réessayer, cliquez sur OK"
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr "Conflit d'édition"
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr "Quelqu'un d'autre a enregistré cette page pendant que vous éditiez"
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr "Pour résoudre le conflit, faites ceci"
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr "Cliquez sur le bouton «Page Précédente» de votre navigateur"
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr "Copiez vos modifications dans le presse-papiers"
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr "Cliquez sur le bouton «Actualiser» de votre navigateur"
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr ""
+"Collez à nouveau vos modifications, mais en tenant compte des changements "
+"apportés entre temps"
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr "Cliquez sur le bouton «Changer» à nouveau"
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr "ou"
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr "Pour abandonner vos modifications et recommencer, cliquez sur OK."
+
+#: src/ZWiki/Views.py:490
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+"\n"
+"        Les touches d'accés sont accessibles sur les navigateurs basés sur "
+"Mozilla en pressant Alt + <touche>\n"
+"Les utilisateurs d'Internet Explorer doivent en plus appuyer sur la touche « "
+"Entrée »\n"
+"Les utilisateurs Mac : command + <touche>\n"
+"Les utilisateurs d'Opéra : Shift + Espace + <touche>\n"
+"Cela ne fonctionnera pas sur cette page. Retournez sur la page précédente et "
+"essayez-les.\n"
+"\n"
+"        0 montrer les assignements des touches d'accès rapide\n"
+"\n"
+"        fonctions du Wiki:\n"
+"        f    afficher la page d'accueil\n"
+"        c    afficher le contenu du Wiki\n"
+"        r    afficher les changements récents dans le Wiki\n"
+"             afficher la page de discussion\n"
+"        t    afficher la page de suivi des problèmes\n"
+"        i    afficher l'index du Wiki\n"
+"        o    afficher la page d'options du Wiki (préférences)\n"
+"        h    afficher la page d'aide\n"
+"        s    lancer une recherche\n"
+"        \n"
+"        fonctions des pages:\n"
+"        v    voir la page\n"
+"        +    afficher toutes les caractéristiques (mode «complet»)\n"
+"        =    afficher les caractéristiques de base (mode «simple»)\n"
+"        -    afficher seulement caractéristiques essentielles (mode "
+"«minimal»)\n"
+"        m    abonnement par courriel\n"
+"        b    afficher les rétroliens (liens vers cette page)\n"
+"        d    afficher les différences (historique des dernières éditions)\n"
+"        y    afficher l'historique complet dans l'interface de gestion de "
+"Zope (ZMI)\n"
+"        e    éditer cette page\n"
+"        x    modifier avec un éditeur externe\n"
+"             imprimer cette page (et les sous-rubriques)\n"
+"        q    afficher les sources de la page (visualisation rapide)\n"
+"             effacer et régénérer le rendu de cette page en antémémoire\n"
+"             accéder aux sous-rubriques\n"
+"             accéder aux commentaires (messages)\n"
+"             accéder à la page d'accueil de l'auteur, si cela est possible\n"
+"        n    page suivante\n"
+"        p    page précédente\n"
+"        u    remonter à la page supérieure dans la hiérarchie\n"
+"        \n"
+"        dans le formulaire d'édition:\n"
+"        s    sauvegarder vos changements\n"
+"        \n"
+"        dans la page de visualisation des différences:\n"
+"        n    version suivante\n"
+"        p    version précédente\n"
+"        "
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr "créer cette page"
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr "dernière édition il y a %(interval)s"
+
+#: src/ZWiki/ZWikiPage.py:809
+msgid "show last edit"
+msgstr "afficher la dernière modification"
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr "par %(editor)s"
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr "Il n'est pas nécessaire d'ajouter une Cache Hors-ligne ZWiki"
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+"Le Cache Hors-ligne ZWiki apparait dans le menu d'ajout de la ZMI\n"
+"pour des raisons d'implémentation, mais ne peut pas être rajouter "
+"directement.\n"
+"ZWiki le crée pour vous si cele est nécessaire.\n"
+"        "
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr "commentaires"
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr "« = » est attendu après « %(token)s »"
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr "Une valeur est attendue pour la clé « %(token)s »"
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr "Création d'un nouveau dessin « %(filename)s »"
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr "Téléchargement d'un nouvel fichier joint « %(filename)s »"
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr "Édition du dessin « %(filename)s »"
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr ""
+"« %(wanted)s » est attendu après « %(key)s », à la place de « %(token)s »"
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr "Un entier « %(key)s » est attendu avant « %(token)s »"
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr "Un entier « %(arg)s » est attendu après « %(key)s »"
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr "Une couleur « %(arg)s » est attendue après « %(key)s »"
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr "répondre"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr "Historique complet"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr "« précédente édition"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr "prochaine édition »"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+#, fuzzy
+msgid "Revert this change and all successive changes"
+msgstr "Revenir à cette précédente version et"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+#, fuzzy
+msgid "plone"
+msgstr "Note de l'historique:"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+#, fuzzy
+msgid "show all features"
+msgstr "rechercher dans toutes les pages"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+#, fuzzy
+msgid "show basic features"
+msgstr "afficher la dernière modification"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+#, fuzzy
+msgid "simple"
+msgstr "Fichier"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+#, fuzzy
+msgid "subtopic"
+msgstr "est une sous-rubrique de:"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+#, fuzzy
+msgid "for this page"
+msgstr "créer cette page"
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+#, fuzzy
+msgid "title"
+msgstr "Titre"
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr "Filtrer les problèmes"
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+msgid "Issue browser"
+msgstr "navigateur de problèmes"
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+msgid "Issue tracker"
+msgstr "Suivi des problèmes"
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "Vous n'êtes pas autorisé à éditer cette page ZWiki."
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr "catégorie"
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr "sévérité"
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr "statut"
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+msgid "age"
+msgstr "âge"
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr "modifié"
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr "Ajouter un nouveau problème :"
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr "Nom :"
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr "Catégorie :"
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr "Sévérité :"
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr "Statut :"
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+msgid "Here are the wiki's issue pages."
+msgstr "Voici les pages de problèmes du wiki."
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr "Détails :"
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr "ajouter un problème"
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr "Plus d'options avancées"
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr "suivi des problèmes"
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+msgid "search options"
+msgstr "options de recherche"
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr "Nom contenant :"
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr "Texte de la page contenant :"
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr "Catégories :"
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+msgid "Severities:"
+msgstr "Sévérités :"
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr "Statuts :"
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+#, fuzzy
+msgid "Enter a search term, click the numbers to the right,"
+msgstr "Entrez un terme de recherche, ou cliquez sur les nombres à droite, ou"
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr "Soumis par :"
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+msgid "Name"
+msgstr "Nom"
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr "Catégorie"
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+msgid "filter issues"
+msgstr "Filtrer les problèmes"
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr "Sévérité"
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr "Statut"
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+msgid "Optional subject"
+msgstr "Sujet optionnel"
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+msgid "Optional comment"
+msgstr "Commentaire optionnel"
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "Ajouter une page ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+#, fuzzy
+msgid "Id:"
+msgstr "Identifiant"
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+#, fuzzy
+msgid "Title:"
+msgstr "Titre"
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "Ajouter une page ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr "Pages modifiées dans les derniers"
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr "Pages récemment modifiées, avec leurs résumés"
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr "Afficher les résumés ?"
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr "Rafraîchir"
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr "Page"
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr "Édité&nbsp;par"
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr "Date"
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr "NOUVEAU"
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr "Les pages marquées (NOUVEAU) ont été créées il y a moins d'une semaine"
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr "Rechercher des problèmes"
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr ""
+"Entrez un mot ou une phrase and pressez sur la touche Entrée pour lancer la "
+"recherche dans l'ensemble du Wiki."
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr ""
+"Cette recherche est identique à celle effectuée par le champs de recherche "
+"dans le coin supérieur droit."
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr ""
+"Conseil: Pour trouver les noms de pages, une recherche sur un seul mot est "
+"souvent plus fructueuse."
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+"L'insensibilité à la casse et les caractères de recherche approximative "
+"peuvent être supportés selon la configuration du «catalogue» (contacter "
+"l'administrateur pour plus de renseignements)."
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr "Laissez ce champ vide pour lister toutes les pages."
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr "Rechercher"
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr "Noms de page concordants"
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr "Concordances dans le texte"
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr "Recherche complète, sans le catalogue, pour la correspondance de texte"
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+msgid "recent"
+msgstr "récent"
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr "Veuillez définir vos préférences pour ce Wiki :"
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr "Nom d'utilisateur :"
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr "(identifie vos modifications)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+msgid "Email address:"
+msgstr "Adresse électronique (courriel) :"
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+msgid "(allows mail subscription)"
+msgstr "(autorise les abonnements par courriel)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr "Fuseau horaire :"
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr "(permet la localisation de la plupart des dates)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr "Hauteur du formulaire d'édition :"
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr "(ajuste la taille du formulaire)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr "Enregistrer les options"
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr "tous"
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr "Oubliez les options"
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr "Ajouter une page ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+#, fuzzy
+msgid "Page&nbsp;name:"
+msgstr "Nom de la page"
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "Ajouter une page ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+msgid "Topic"
+msgstr "Rubrique"
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr "Dernière modification"
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+msgid "Comments"
+msgstr "Commentaires"
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+msgid "Views"
+msgstr "Vues"
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+msgid "Created"
+msgstr "Créé"
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr "#"
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr "par"
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr "il y a <dtml-var lasteditinterval> </dtml-var>"
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr "sur"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+msgid "Subtopics"
+msgstr "est une sous-rubrique de:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr "Cette page n'a pas de sous-rubriques."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+#, fuzzy
+msgid "Here are it's subtopics."
+msgstr "Voici les sous-rubriques :"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+#, fuzzy
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr ""
+"Vous pouvez modifier l'ordre des sous-rubriques en cliquant sur les boutons "
+"« ^ »."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+#, fuzzy
+msgid "Related pages"
+msgstr "créer cette page"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+msgid "Parents"
+msgstr "Parents"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr "est une rubrique de premier niveau."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr "est une sous-rubrique de :"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+msgid "Backlinks"
+msgstr "Rétroliens"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr "Voici les pages qui pointent sur celle-ci:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+msgid "No other pages link to this one."
+msgstr "Aucune page n'est plus liés à celle-ci."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr "Ré-hiérarchiser"
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+"Il y avait un problème avec un des modèles d'apparence du wiki. Il est "
+"possible qu'un objet avec un identifiant de modèle d'apparence ne soit pas "
+"un modèle de page ou une méthode DTML, ou que le modèle soit manquant sur le "
+"système de fichiers (installation incomlète de ZWiki)."
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr "sujet"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr ""
+"Un sujet aide à clarifier les fils de discussion et la page des changements "
+"récents"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr "réponse"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+"Pour ajouter un commentaire (et le faire parvenir aux abonnés) entrez votre "
+"texte ici et cliquez sur ajouter"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr "${nb} abonnés"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr "1 abonné"
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr "ajouter un commentaire"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr "Contenu du Wiki"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr "Singletons"
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+#, fuzzy
+msgid "Edit history"
+msgstr "Historique complet"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+#, fuzzy
+msgid "Edit:"
+msgstr "éditer"
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+#, fuzzy
+msgid "Manage"
+msgstr "Modifier"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+#, fuzzy
+msgid "Revert this and later edits"
+msgstr "Revenir à cette précédente version et"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr "Retourner à la page"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+#, fuzzy
+msgid "Time:"
+msgstr "Date"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+#, fuzzy
+msgid "Note:"
+msgstr "Nom :"
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr "basculer entre les modes source et WYSIWYG"
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr "Commentaire de modification facultatif"
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr "un commentaire rend la page des changements récents plus utile"
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr "Transférer une image ou un fichier vers le Wiki"
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr "transférer un fichier vers le Wiki et le lier à cette page ?"
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr "Pour obtenir de l'aide sur l'édition, consultez"
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr "Le Manuel"
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr "Les Règles de formattage"
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "preview this edit"
+msgstr "Apercevoir cette modification"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr "Apercevoir"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr "Annuler"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr "annuler cette édition et retourner à la page"
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr "Créer"
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr "créer cette page wiki"
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+msgid "label_preview"
+msgstr "Aperçu"
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr "Nom de la page"
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr "le nom de cette page wiki (en changer peut être lent!)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr "type"
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr "sélectionnez le style de formatage et de rendu pour cette page"
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr "(éditeur externe)"
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr "accueil"
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr "afficher les modifications récentes dans le Wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr "modifications"
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr "afficher la page de discussion"
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr "discussion"
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr "afficher la page de suivi des problèmes"
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr "problèmes"
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr "afficher le contenu du wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr "contenu"
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr "afficher l'index du Wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr "index"
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr "afficher la page de transfert vers le serveur"
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr "transferts"
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr "afficher la page d'aide"
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr "aide"
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr "afficher la page d'options du Wiki (préférences)"
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr "préférences"
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr "rétroliens"
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr ""
+"Paramétrer l'abonnement à la diffusion électronique pour cette page ou ce "
+"site"
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr "s'abonner"
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr "afficher l'historique des changements de cette page"
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr "afficher la page d'accueil"
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr "différences"
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr "éditer"
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr "modifier avec un éditeur externe"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr "Aller sur la page d'accueil"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr "rechercher dans toutes les pages"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr "nouveau"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+msgid "parent,"
+msgstr "parent"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr "nom,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+msgid "replacement,"
+msgstr "replacement,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+msgid "page"
+msgstr "page"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+"entrez un nom de page et cliquez sur les boutons à droite (survolez les "
+"boutons pour de l'aide)"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "reparent"
+msgstr "Ré-hiérarchiser"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "make this page a subtopic of the page you have entered"
+msgstr ""
+"Placer la page courante sous la hiérarchie de la page dont vous avez entré "
+"le nom"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+"Renommer cette page avec le nom que vous avez entré, et mettre à jour tous "
+"les liens"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename"
+msgstr "renommer"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr "supprimer"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr ""
+"Supprimer cette page et rediriger les liens de vers la page que vous avez "
+"entré, s'il y en a une"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+"créer une page avec le nom que vous avez entré comme sous-rubrique de celle-"
+"ci"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create"
+msgstr "créer"
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+msgid "Recent changes"
+msgstr "Modifications récentes"
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+msgid "Search this wiki"
+msgstr "Chercher dans ce Wiki"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+msgid "all edits"
+msgstr "toutes les modifications"
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr ""
+"Vous êtes actuellement abonné <br />\n"
+"                à la totalité du wiki."
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr ""
+"Vous n'êtes actuellement pas abonné <br />\n"
+"                à la totalité du wiki."
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr "Abonnement par courriel"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr "Désabonnez-vous du wiki dans sa totalité"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr "Abonnez-vous au wiki dans sa totalité"
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr "Vous êtes abonné à ces autres pages"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr "Abonnés à cette page"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr "Abonnés au Wiki"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+msgid "subscribe_desc_comments"
+msgstr ""
+"Vous pouvez vous abonner à cette page ou au Wiki dans sa totalité.\n"
+"          Les abonnés reçoivent une copie des commentaires par\n"
+"          courriel (mais pas les modifications générales, à moins\n"
+"          que cette fonctionnalité n'ai été activée par\n"
+"          l'administrateur du site).\n"
+"          Ou retourner à"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+msgid "subscribe_desc_edits"
+msgstr ""
+"Vous pouvez vous abonner à cette page ou au Wiki dans sa totalité.\n"
+"          Les abonnés reçoivent une copie des commentaires par\n"
+"          courriel (mais pas les modifications générales, à moins\n"
+"          que cette fonctionnalité n'ai été activée par\n"
+"          l'administrateur du site).\n"
+"          Ou retourner à"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr "Votre adresse de courriel"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr "Modifier"
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr "Pour vous abonner, veuillez configurer votre adresse de courriel"
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr ""
+"Vous êtes actuellement abonné <br />\n"
+"                à cette page"
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr ""
+"Vous n'êtes actuellement pas abonné <br />\n"
+"                à cette page"
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr " Se désabonnez de cette page "
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr " S'abonnez à cette page "
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+#, fuzzy
+msgid "User options"
+msgstr "options de recherche"
+
+#~ msgid "your edit contained a banned link pattern"
+#~ msgstr "Votre édition contient une correspondance de liens bannis"
+
+#~ msgid "adding of external links by anonymous authors is restricted"
+#~ msgstr "L'ajout de liens externes pas les auteurs anonymes est restreint"
+
+#~ msgid "Add a ZWiki web"
+#~ msgstr "Ajouter une toile ZWiki"
+
+#~ msgid "Type"
+#~ msgstr "type"
+
+#~ msgid "Create wiki"
+#~ msgstr "Créer un Wiki"
+
+#~ msgid "and enter"
+#~ msgstr "et entrer"
+
+#~ msgid ""
+#~ "You may create a new ZWiki Page object using the form below. You may also "
+#~ "choose to upload an existing html file from your local computer by "
+#~ "clicking the <i>Browse</i> button."
+#~ msgstr ""
+#~ "Vous pouvez créer un nouvel object de page ZWiki en utilisant le "
+#~ "formulaire ci-dessous. Vous pouvez aussi choisir de transférer un fichier "
+#~ "html existant, depuis votre ordinateur vers le Wiki, en cliquant sur le "
+#~ "boutton <i>Parcourir</i>."
+
+#~ msgid "Add"
+#~ msgstr "Ajouter"
+
+#~ msgid "Add and Edit"
+#~ msgstr "Ajouter et Modifier"
+
+#~ msgid "Backlinks for"
+#~ msgstr "Rétroliens pour"
+
+#~ msgid "singleton_desc"
+#~ msgstr ""
+#~ "Les singletons sont des pages qui ne sont pas connectées à d'autres."
+
+#~ msgid "History for"
+#~ msgstr "Historique pour"
+
+#~ msgid "return to page"
+#~ msgstr "Retourner à la page"
+
+#~ msgid "help_shortname"
+#~ msgstr ""
+#~ "Note: Renommer une page dans un wiki de taille importante peut être lent. "
+#~ "Les autres pages seront mises à jour si cela est possible."
+
+#~ msgid "label_body_text"
+#~ msgstr "Corps du texte"
+
+#~ msgid "help_wikibody"
+#~ msgstr ""
+#~ "Dans une page Wiki, utilisez des [crochets] pour créer des liens. Quand "
+#~ "vous enregistrerez la page, le nom entre crochets sera suffixé par un "
+#~ "<code>?</code>. Quand vous cliquerez dessus, une nouvelle page sera créée "
+#~ "avec ce nom."
+
+#~ msgid "help_wikiwords"
+#~ msgstr "Ce wiki supporte aussi les WikiMots comme mécanisme de liaison."
+
+#~ msgid "label_note"
+#~ msgstr "Note pour l'historique de la page (optionnel)"
+
+#~ msgid "help_wikinote"
+#~ msgstr "Une courte description de vos changements."
+
+#~ msgid "label_upload_contents_optional"
+#~ msgstr "Envoyer un fichier ou une image vers le Wiki (optionnel)"
+
+#~ msgid "help_wikiupload"
+#~ msgstr "Attacher un fichier ou une image à cette page wiki."
+
+#~ msgid "label_format"
+#~ msgstr "Format de la page"
+
+#, fuzzy
+#~ msgid "help_format"
+#~ msgstr "Si vous n'êtes pas sûr du format à utiliser, sélectionnez"
+
+#~ msgid "Save"
+#~ msgstr "Enregistrer"
+
+#~ msgid "heading_edit_wiki_page"
+#~ msgstr ""
+#~ "Éditer\n"
+#~ "        ${itemtype} \n"
+#~ "\n"
+#~ "        « ${pagename} »"
+
+#~ msgid "description_edit_wiki_page"
+#~ msgstr ""
+#~ "Une page Wiki vous permet de créer des pages richement interconnectées."
+
+#~ msgid "legend_wiki_page_details"
+#~ msgstr "Détails de la page Wiki"
+
+#~ msgid "label_pagename"
+#~ msgstr "Nom de la page"
+
+#~ msgid "Required"
+#~ msgstr "Requis"
+
+#~ msgid "label_required"
+#~ msgstr "(Requis)"
+
+#~ msgid "heading_wiki_recent_changes"
+#~ msgstr "Changements récents"
+
+#~ msgid "heading_wiki_search_wiki"
+#~ msgstr "Chercher dans ce Wiki"
+
+#~ msgid "Unsubscribe from this page"
+#~ msgstr "Se désabonner de cette page"
+
+#~ msgid "Subscribe to this page"
+#~ msgstr "S'abonner à cette page"
+
+#~ msgid "heading_wiki_user_options"
+#~ msgstr "Options de l'utilisateur"
+
+#, fuzzy
+#~ msgid "add a comment"
+#~ msgstr "ajouter un commentaire"
+
+#~ msgid "heading_wiki_filter_issues"
+#~ msgstr "Filtrer les problèmes"
+
+#~ msgid "heading_wiki_issue_browser"
+#~ msgstr "Suivi des problèmes"
+
+#~ msgid "heading_wiki_issue_tracker"
+#~ msgstr "Suivi des problèmes"
+
+#~ msgid "property change"
+#~ msgstr "propriété modifiée"
+
+#~ msgid "backlinks_reparent_help"
+#~ msgstr ""
+#~ "Vous pouvez changer l'ascendance de cette page pour la placer dans\n"
+#~ "la hiérarchie globale des pages. Cochez les cases ou entrez un nouveau\n"
+#~ "nom de page et cliquez sur Ré-hiérarchiser.\n"
+#~ "Une seul page parente est généralement suffisante."

Added: zope-zwiki/branches/upstream/current/i18n/he.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/he.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/he.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1518 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: ZWiki-0-34-0\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-02-26 09:03+0000\n"
+"Last-Translator: Ofer Weisglass <ofer at plone.org.il>\n"
+"Language-Team: <zwiki at zwiki.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: zope/app/locales/extract.py\n"
+"Language-code: he\n"
+"Language-name: Hebrew\n"
+"Preferred-encodings: utf-8 latin1\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr ""
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr ""
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "אינך מורשה לעלות קבצים לעמוד זויקי זה"
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+#, fuzzy
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "אינך מורשה לעלות קבצים לעמוד זויקי זה"
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr ""
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr "אינך מורשה לעלות קבצים לכאן"
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr "אינך מורשה לעלות קבצים לעמוד זויקי זה"
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr ""
+
+#: src/ZWiki/Editing.py:830
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+msgid "exceeded max_identified_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr "אנונימי"
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr ""
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr "הנך כאן"
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr "שנים"
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr "שנה"
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr "חודש"
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr "חודשים"
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr "שבועות"
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr "שבוע"
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr "יום"
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr "ימים"
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr "שעות"
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr "שעה"
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr "דקה"
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr "דקות"
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr "שניה"
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr "שניות"
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr "עמוד זה נעול"
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr ""
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr "קונפליקט עריכה"
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr ""
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr ""
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr ""
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr ""
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr ""
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr ""
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr "לחץ על כפתור השינוי שוב"
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr "או"
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr ""
+
+#: src/ZWiki/Views.py:490
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr "צור עמוד זה"
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:809
+#, fuzzy
+msgid "show last edit"
+msgstr "הצג פיציירים בסיסיים"
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr ""
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr ""
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr "הערות"
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr "הגב"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr "היסטוריה מלאה"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr "<< עריכה קודמת"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr "עריכה הבאה>>"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+msgid "Revert this change and all successive changes"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+msgid "plone"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+msgid "show all features"
+msgstr "הצג את כל הפיציירים"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr "מלא"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+msgid "show basic features"
+msgstr "הצג פיציירים בסיסיים"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+msgid "simple"
+msgstr "פשוט"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr "הצג רק פיציירים חיוניים"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr "נומינלי"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+msgid "subtopic"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+#, fuzzy
+msgid "for this page"
+msgstr "צור עמוד זה"
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+#, fuzzy
+msgid "title"
+msgstr "כותרת"
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+msgid "Issue browser"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+msgid "Issue tracker"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "אינך מורשה לעלות קבצים לעמוד זויקי זה"
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr "קטגוריה"
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr "מצב"
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+msgid "age"
+msgstr "גיל"
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr "עודכן"
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+#, fuzzy
+msgid "Add a new issue:"
+msgstr "הוסף נושא"
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr "שם:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr "קטגוריה:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr "מצב:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+#, fuzzy
+msgid "Here are the wiki's issue pages."
+msgstr "צור עמוד ויקי זה"
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr "פרטים:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr "הוסף נושא"
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+msgid "search options"
+msgstr "אפשרויות חיפוש"
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr "קטגוריות"
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+msgid "Severities:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+#, fuzzy
+msgid "Statuses:"
+msgstr "מצב:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+msgid "Enter a search term, click the numbers to the right,"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+msgid "Name"
+msgstr "שם"
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr "קטגוריה"
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+msgid "filter issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr "מצב"
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+#, fuzzy
+msgid "Optional subject"
+msgstr "נושא"
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+#, fuzzy
+msgid "Optional comment"
+msgstr "נושא"
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "הוסף עמוד ויקי"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+msgid "Id:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+#, fuzzy
+msgid "Title:"
+msgstr "כותרת"
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "הוסף עמוד ויקי"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr "עמודים שהשתנו לאחרונה"
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr "הצג סיכומים?"
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr "רעון"
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr "עמוד"
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr "עמוד"
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr "חדש"
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+#, fuzzy
+msgid "search issues"
+msgstr "אפשרויות חיפוש"
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr "חיפוש"
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr "טקסט תואם"
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+msgid "recent"
+msgstr "לאחרונה"
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+#, fuzzy
+msgid "User name:"
+msgstr "שם משתמש"
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+#, fuzzy
+msgid "Email address:"
+msgstr "תיבת הדואר האלקטרוני שלך"
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+#, fuzzy
+msgid "(allows mail subscription)"
+msgstr "רישום לדורא"
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+#, fuzzy
+msgid "Your time zone:"
+msgstr "קו זמן"
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr "שמור אפשרויות"
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr "כולם"
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr "שכח אפשרויות"
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr "הוסף עמוד ויקי"
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+#, fuzzy
+msgid "Page&nbsp;name:"
+msgstr "שם עמוד"
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "הוסף עמוד ויקי"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+msgid "Topic"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+#, fuzzy
+msgid "Comments"
+msgstr "הערות"
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+#, fuzzy
+msgid "Views"
+msgstr "צפה"
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+#, fuzzy
+msgid "Created"
+msgstr "צור"
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+msgid "Subtopics"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+#, fuzzy
+msgid "Here are it's subtopics."
+msgstr "צור עמוד ויקי זה"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+#, fuzzy
+msgid "Related pages"
+msgstr "צור עמוד זה"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+#, fuzzy
+msgid "Parents"
+msgstr "לאחרונה"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+msgid "Backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+msgid "No other pages link to this one."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr "נושא"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr "נרשם 1"
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr "הוסף הערה"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr "תכני ויקי"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr "הצעות"
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+#, fuzzy
+msgid "Edit history"
+msgstr "היסטוריה מלאה"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+#, fuzzy
+msgid "Edit:"
+msgstr "ערוך"
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+#, fuzzy
+msgid "Manage"
+msgstr "שינוי"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+msgid "Revert this and later edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr "חזור לעמוד"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+#, fuzzy
+msgid "Time:"
+msgstr "עמוד"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+#, fuzzy
+msgid "Note:"
+msgstr "שם:"
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr "העלאת קובץ או תמונה"
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr "העלה קובץ וקשר אותו לעמוד זה?"
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr "לעזרה בעריכה, ראה"
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr "עמוד עזרה"
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+#, fuzzy
+msgid "preview this edit"
+msgstr "<< עריכה קודמת"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+#, fuzzy
+msgid "Preview"
+msgstr "צפה"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr "ביטול"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr "בטל עריכה זו וחזור לעמוד"
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr "צור"
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr "צור עמוד ויקי זה"
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+#, fuzzy
+msgid "label_preview"
+msgstr "צפה"
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr "שם עמוד"
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr "סוג"
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr "בית"
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr "הצג שינויי ויקי אחרונים"
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr "שינויים"
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr "הצג עמוד דיוניים"
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr "דיוניים"
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr "הצג תכני ויקי"
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr "תכנים"
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr "אינדקס"
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr "הצג עמוד עזרה"
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr "עזרה"
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr "הצג אפשרויות ויקי"
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr "אפשרויות"
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr "רישום"
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr "הצג עמוד קידמי"
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr "ערוך"
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr "עבור לעמוד הבית"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr "חפש בכל העמודים"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr "חדש"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+#, fuzzy
+msgid "parent,"
+msgstr "לאחרונה"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+#, fuzzy
+msgid "name,"
+msgstr "שם"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+#, fuzzy
+msgid "replacement,"
+msgstr "לאחרונה"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+#, fuzzy
+msgid "page"
+msgstr "גיל"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+#, fuzzy
+msgid "reparent"
+msgstr "לאחרונה"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "make this page a subtopic of the page you have entered"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+#, fuzzy
+msgid "rename"
+msgstr "שם"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+#, fuzzy
+msgid "create"
+msgstr "צור"
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+#, fuzzy
+msgid "Recent changes"
+msgstr "הצג שינויי ויקי אחרונים"
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+#, fuzzy
+msgid "Search this wiki"
+msgstr "צור עמוד ויקי זה"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+#, fuzzy
+msgid "all edits"
+msgstr "ערוך"
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr ""
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr "רישום לדורא"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr "בטל רישום מכל הויקי"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr "הרשם לויקי"
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr "רישומים לעמוד"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr "רישומים לויקי"
+
+#  "You can subscribe to this page or to the whole wiki.\n"
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+msgid "subscribe_desc_comments"
+msgstr ""
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+#, fuzzy
+msgid "subscribe_desc_edits"
+msgstr "רישום"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr "תיבת הדואר האלקטרוני שלך"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr "שינוי"
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr ""
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr " בטל רישום מעמוד זה "
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr " הרשם לעמוד זה "
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+#, fuzzy
+msgid "User options"
+msgstr "אפשרויות חיפוש"
+
+#~ msgid "Type"
+#~ msgstr "סוג"
+
+#~ msgid "Create wiki"
+#~ msgstr "צור ויקי"
+
+#~ msgid "File"
+#~ msgstr "קובץ"
+
+#~ msgid "Add"
+#~ msgstr "הוסף"
+
+#~ msgid "Add and Edit"
+#~ msgstr "הוסף וערוך"
+
+#~ msgid "History for"
+#~ msgstr "היסטוריה ל"
+
+#~ msgid "return to page"
+#~ msgstr "חזור לעמוד"
+
+#~ msgid "label_body_text"
+#~ msgstr "טקסט עמוד"
+
+#~ msgid "Save"
+#~ msgstr "שמור"
+
+#~ msgid "Required"
+#~ msgstr "נדרש"
+
+#~ msgid "Unsubscribe from this page"
+#~ msgstr "בטל רישום מעמוד זה"
+
+#~ msgid "Subscribe to this page"
+#~ msgstr "רשומים לעמוד זה"
+
+#~ msgid "heading_wiki_user_options"
+#~ msgstr "אפשרויות משתמש"
+
+#, fuzzy
+#~ msgid "add a comment"
+#~ msgstr "הוסף הערה"
+
+#, fuzzy
+#~ msgid "heading_wiki_issue_browser"
+#~ msgstr "אפשרויות משתמש"
+
+#, fuzzy
+#~ msgid "property change"
+#~ msgstr "הצג שינויי ויקי אחרונים"
+
+#, fuzzy
+#~ msgid "View"
+#~ msgstr "צפה"
+
+#, fuzzy
+#~ msgid "Comment"
+#~ msgstr "הערות"
+
+#, fuzzy
+#~ msgid "A Comment"
+#~ msgstr "הערות"
+
+#, fuzzy
+#~ msgid "Table of Contents"
+#~ msgstr "תכנים"
+
+#, fuzzy
+#~ msgid "A Wiki"
+#~ msgstr "הוסף עמוד ויקי"
+
+#, fuzzy
+#~ msgid "Subscriptions"
+#~ msgstr "רישום לדורא"
+
+#, fuzzy
+#~ msgid "Change Wiki Page"
+#~ msgstr "הוסף עמוד ויקי"
+
+#, fuzzy
+#~ msgid "Wiki User"
+#~ msgstr "רישומים לויקי"
+
+#, fuzzy
+#~ msgid "A Wiki Page"
+#~ msgstr "הוסף עמוד ויקי"
+
+#, fuzzy
+#~ msgid "Wiki Page"
+#~ msgstr "הוסף עמוד ויקי"
+
+#, fuzzy
+#~ msgid "A Wiki Page Comment"
+#~ msgstr "הוסף עמוד ויקי"
+
+#, fuzzy
+#~ msgid "Wiki Page Comment"
+#~ msgstr "תכני ויקי"
+
+#, fuzzy
+#~ msgid "View a Wiki Page"
+#~ msgstr "הוסף עמוד ויקי"
+
+#, fuzzy
+#~ msgid "View Wiki Page"
+#~ msgstr "הוסף עמוד ויקי"
+
+#, fuzzy
+#~ msgid "Edit Wiki Page"
+#~ msgstr "הוסף עמוד ויקי"
+
+#, fuzzy
+#~ msgid "Delete Wiki Page"
+#~ msgstr "הוסף עמוד ויקי"
+
+#, fuzzy
+#~ msgid "Reparent Wiki Page"
+#~ msgstr "הוסף עמוד ויקי"
+
+#~ msgid "File Uploads"
+#~ msgstr "העלאת קבצים"
+
+#~ msgid "save"
+#~ msgstr "שמור"
+
+#~ msgid "view"
+#~ msgstr "צפה"
+
+#~ msgid "no_files_uploaded"
+#~ msgstr "לא הועלו קבצים"
+
+#~ msgid "box_wiki_navigation"
+#~ msgstr "ניווט ויקי"
+
+#~ msgid "Contents"
+#~ msgstr "תכנים"
+
+#~ msgid "page rating"
+#~ msgstr "דירוג עמוד"
+
+#~ msgid "click to rate"
+#~ msgstr "לחץ על מנת לדרג"
+
+#~ msgid "voting as"
+#~ msgstr "הצבע כ"
+
+#~ msgid "Here are the pages which link to"
+#~ msgstr "הנה העמודים שמקושרים ל"
+
+#~ msgid "height"
+#~ msgstr "גובה"
+
+#~ msgid "Your local time is"
+#~ msgstr "הזמן המקומי שלך הוא"
+
+#~ msgid "No"
+#~ msgstr "לא"
+
+#~ msgid "Yes"
+#~ msgstr "כן"
+
+#~ msgid "in full mode"
+#~ msgstr "במצב מלא"
+
+#~ msgid "no subscribers"
+#~ msgstr "אין נרשמים"

Added: zope-zwiki/branches/upstream/current/i18n/hu.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/hu.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/hu.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1847 @@
+# translation of zwiki.pot to Hungarian
+# József Jároli (kaixo) <yo at jaroli.de>, 2004.
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki-hu\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-02-26 09:01+0000\n"
+"Last-Translator: József Jároli (kaixo) <en at innen.hu>\n"
+"Language-Team: Hungarian <hu at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: hu\n"
+"Language-name: Magyar\n"
+"Preferred-encodings: utf-8\n"
+"Domain: zwiki\n"
+"X-Generator: KBabel 1.3\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr "Nincs jogosultsága az összes lap aktualizálásához."
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr "(mappa -> Tulajnonságok beállítása)"
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "Nincs jogosultsága átnevezni ezt a ZWiki lapot."
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "Nincs jogosultsága átnevezni ezt a ZWiki lapot."
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr ""
+"Nincs jogosultsága újraszármaztatni a lapot vagy megváltoztatni a "
+"fejezetekre mutató hivatkozásokat ezen a ZWiki lapon."
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr "Nincs jogosultsága megváltoztatni a ZWiki lap típusát."
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr "Nincs jogosultsága szerkeszteni ezt a ZWiki lapot."
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr "Nincs jogosultsága törölni ezt a ZWiki lapot."
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+"Ez a lap át lett nevezve. Új neve: %s. Letörölheti ezt a lapot, ha nincs rá "
+"egyébként már szükség.\n"
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr "Nincs jogosultsága ide fájlokat feltölteni."
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr "Nincs jogosultsága hivatkozások hozzáadásához ezen a ZWiki lapon."
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr ""
+
+#: src/ZWiki/Editing.py:830
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+msgid "exceeded max_identified_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr "névtelen"
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr "Mely lapokról mutat hivatkozás erre a lapra?"
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr "Aktuális lap"
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr "év"
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr "év"
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr "hónap"
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr "hónap"
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr "hét"
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr "hét"
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr "nap"
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr "nap"
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr "óra"
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr "óra"
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr "perc"
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr "perc"
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr "másodperc"
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr "másodperc"
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr "Zárolt lap"
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+"\n"
+"            A lapot zárolták webDAV protokollal. Valószínűleg valaki épp "
+"szerkeszti\n"
+"            egy külső szerkesztővel. Meg kell várnia amíg befejezik,\n"
+"            majd újra próbálkozni.  Ha már éppen megváltoztatott néhány "
+"dolgot,\n"
+"            akkor mentse el máshol a változtatásokat és másolja be az Ön "
+"verzióját \n"
+"            összehasonlításképp.\n"
+"            "
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr ""
+"A változtatások elvetéséhez és az újrakezdéshez nyomja meg az \"OK\" gombot."
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr "Ellentmondás feloldása"
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr "Más már rámentett az lapra, amíg Ön szerkesztette azt."
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr "Az ellentmondás feloldásához tegye a következőket:"
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr "Nyomja meg a böngészője \"Vissza\" gombját."
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr "Másolja a legutóbbi változtatásokat a vágólapra."
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr "Nyomja meg böngészője \"Frissítés\" gombját"
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr ""
+"Szúrja be a szerkesztett részeket újra, szem előtt tartva a legutóbbi "
+"változtatásokat."
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr "Nyomja meg a \"Változtat\" gombot még egyszer."
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr "vagy"
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr ""
+"A változások elvetéséhez és az újrakezdéshez nyomja meg az \"OK\" gombot."
+
+#: src/ZWiki/Views.py:490
+#, fuzzy
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+"\n"
+"        0    billentyűkombinációk kilistázása\n"
+"\n"
+"        wiki funkciók:\n"
+"        f    Nyitóoldal\n"
+"        c    Tartalomjegyzék\n"
+"        r    Legutóbbi változtatások\n"
+"             Hozzászólások\n"
+"        t    Ügykezelő\n"
+"        i    Wiki névmutató\n"
+"        o    Wiki beállítások\n"
+"        h    Súgóoldal\n"
+"        s    Keresőmező\n"
+"        \n"
+"        oldal funkciói:\n"
+"        v    Lap megjelenítése\n"
+"        +    Teljes megjelenítés\n"
+"        =    Egyszerű megjelenítés\n"
+"        -    Minimális megjelenítés\n"
+"        m    Feliratkozás e-mail címmel\n"
+"        b    Idemutató (hivatkozások erre az oldalra)\n"
+"        d    Összevetés (szerkesztések története)\n"
+"        y    Összes előzmény (a Zope kezelőfelületén)\n"
+"        e    Aktuális lap szerkesztése\n"
+"        x    Külső szerkesztő használata\n"
+"             Lap és alfejezeteinek kinyomtatása \n"
+"        q    Lap forrásának gyorsnézete\n"
+"             Lap gyorstárának kiürítése és újragenerálása\n"
+"             Alfejezetek megjelenítése\n"
+"             Hozzászólások megjelenítése\n"
+"             Lap szerzője kezdőoldalának megjelenítése, ha lehetséges\n"
+"        n    Következő lap\n"
+"        p    Előző lap\n"
+"        u    Fel a származási oldalra\n"
+"        \n"
+"        Szerkesztőmezőben:\n"
+"        s    változtatások mentése\n"
+"        \n"
+"        Összevetés megjelenítésekor:\n"
+"        n    következő szerkesztés\n"
+"        p    előző szerkesztés\n"
+"        "
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr "Hozd létre ezt a lapot"
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr "szerkesztés óta eltelt: %(interval)s"
+
+#: src/ZWiki/ZWikiPage.py:809
+#, fuzzy
+msgid "show last edit"
+msgstr "utolsó szerkesztés megjelenítése: %(lastlog)s"
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr "<br />szerkesztette: %(editor)s"
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr ""
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr "Hozzászólások"
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr "\"=\" jelnek kellene követnie ezt: \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr "Értéket kellene adni ennek a kulcsnak: \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr "Új rajz létrehozása: \"%(filename)s\""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr "Új csatolmány feltöltése: \"%(filename)s\""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr "A %(filename)s nevű rajz szerkesztése"
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr ""
+"\"%(wanted)s\" után \"%(key)s\" kellene következzen ehelyett: \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr "Egész \"%(key)s\" értéknek kellene lennie \"%(token)s\" előtt"
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr "Egész \"%(arg)s\" értéknek kellene következnie \"%(key)s\" után"
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr "Szín értéknek \"%(arg)s\" kellene következnie \"%(key)s\" után"
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr "Válasz"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr "Az összes változtatás listája"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr "<< előző változtatás"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr "következő változtatás >>"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+#, fuzzy
+msgid "Revert this change and all successive changes"
+msgstr "E változtatás és az összes ezt követő változtatás visszavonása"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+#, fuzzy
+msgid "plone"
+msgstr ""
+"Az lap előzményeinek kilistázásakor látható kiegészítő megjegyzés (nem "
+"kötelező)"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+msgid "show all features"
+msgstr "Az összes felhasználói lehetőség megjelenítése"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr "teljes nézet"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+msgid "show basic features"
+msgstr "Az alapvető felhasználói lehetőségek megjelenítése"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+msgid "simple"
+msgstr "egyszerű nézet"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr "Csak a legszükségesebb felhasználói lehetőségek megjelenítése"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr "minimális nézet"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+msgid "subtopic"
+msgstr "alfejezet létrehozása"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+#, fuzzy
+msgid "for this page"
+msgstr "Hozd létre ezt a lapot"
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+msgid "title"
+msgstr "cím"
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr "Ügyek szűrése"
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+#, fuzzy
+msgid "Issue browser"
+msgstr "Ügykezelő"
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+#, fuzzy
+msgid "Issue tracker"
+msgstr "Ügykezelő"
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "Nincs jogosultsága szerkeszteni ezt a ZWiki lapot."
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr "kategória"
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr "fontosság"
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr "állapot"
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+msgid "age"
+msgstr "kor"
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr "módosítva"
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr "Új Ügy hozzáadása:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr "Név:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr "Kategória:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr "Fontosság:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr "Állapot:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+msgid "Here are the wiki's issue pages."
+msgstr "A wiki ügykezelő lapjai."
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr "Részletek:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr "Ügy hozzáadása"
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr "Haladó"
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr "Ügykezelő"
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+msgid "search options"
+msgstr "keresési beállítások"
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr "A névben megtalálható:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr "A lap szövegében megtalálható:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr "Kategóriák:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+msgid "Severities:"
+msgstr "Fontosságok:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr "Állapotok:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+#, fuzzy
+msgid "Enter a search term, click the numbers to the right,"
+msgstr ""
+"Írja be a kereső-kifejezést, vagy kattintson egy jobboldali számra, vagy"
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr "Beküldte"
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+msgid "Name"
+msgstr "Név"
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr "Kategória"
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+msgid "filter issues"
+msgstr "ügyek szűrése"
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr "Fontosság"
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr "Állapot"
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+#, fuzzy
+msgid "Optional subject"
+msgstr "Kiegészítő megjegyzés"
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+#, fuzzy
+msgid "Optional comment"
+msgstr "Kiegészítő megjegyzés"
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "Zwiki Lap hozzáadása"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+#, fuzzy
+msgid "Id:"
+msgstr "Azonosító"
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+#, fuzzy
+msgid "Title:"
+msgstr "Cím"
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "Zwiki Lap hozzáadása"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr "Legutóbb változtatott lapok listája az eltelt idő szerint:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr "Legutóbb változtatott lapok, összefoglalókkal"
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr "Összefoglalók megjelenítése?"
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr "Frissít"
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr "Lap"
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr "Szerkesztette:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr "Idő"
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr "ÚJ"
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr "A ÚJ-ként jelölt lapokat egy héten belül hozták létre"
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr "Keresés az ügyek között"
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr ""
+"Írjon be egy szót vagy kifejezést, majd nyomja meg az ENTER gombot az egész "
+"wikiben való kereséshez."
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr ""
+"Ez ugyanaz, mintha a jobb felső sarokban található keresőmezőt használná."
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr "Javaslat: Lapcímek keresésekor a legjobb, ha csak egy szót használ."
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+"Kisbetű-nagybetű különbség és speciális helyettesítő karakterek is "
+"számíthatnak a Zope katalógusának beállításaitól függően."
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr "Hagyja üresen, ha az összes lapot szeretné kilistázni."
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr "Keres"
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr "Az alábbi lapok neve tartalmazza a keresett kifejezést:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr "Az alábbi lapok tartalmazzák a keresett kifejezést:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+msgid "recent"
+msgstr "friss"
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr "A Wiki felhasználói beállításai:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr "Felhasználói név:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr "(azonosítja az Ön szerkesztéseit)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+msgid "Email address:"
+msgstr "E-mail cím:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+msgid "(allows mail subscription)"
+msgstr "(lehetővé teszi az előfizetést e-mail címre)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr "Az Ön időzónája:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr "(a legtöbb időt átváltja helyire)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr "Szerkesztőmező magassága:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr "(beállítja a szerkesztőmező méretét)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr "Beállítások mentése"
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr "minden"
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr "Beállítások elvetése"
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr "Zwiki Lap hozzáadása"
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+#, fuzzy
+msgid "Page&nbsp;name:"
+msgstr "Lap neve"
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "Zwiki Lap hozzáadása"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+#, fuzzy
+msgid "Topic"
+msgstr "alfejezet létrehozása"
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+#, fuzzy
+msgid "Comments"
+msgstr "Hozzászólások"
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+#, fuzzy
+msgid "Views"
+msgstr "Megtekint"
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+#, fuzzy
+msgid "Created"
+msgstr "Létrehoz"
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+#, fuzzy
+msgid "Subtopics"
+msgstr "alfejezet létrehozása"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+#, fuzzy
+msgid "Here are it's subtopics."
+msgstr "A wiki ügykezelő lapjai."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+#, fuzzy
+msgid "Related pages"
+msgstr "Hozd létre ezt a lapot"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+#, fuzzy
+msgid "Parents"
+msgstr "szülő-lap,"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr "a hierarchia legfelső szintjén található."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr "alfejezete a következő lapnak:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+#, fuzzy
+msgid "Backlinks"
+msgstr "idemutató"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr "Idemutató lapok:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+#, fuzzy
+msgid "No other pages link to this one."
+msgstr "Mely lapokról mutat hivatkozás erre a lapra?"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr "Újraszármaztat"
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+#, fuzzy
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+"Probléma lépett fel valamelyik wiki megjelenítő sablonnal. Lehet, hogy "
+"létezik egy elem, melynek azonosítója egyezik egy sablonéval, amely nem Page "
+"Template vagy DTML Method elem, vagy hiányzik a kérdéses sablon."
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr "Hozzászólás tárgya"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr ""
+"A tárgy megadása segíti a hozzászólások és a LegutóbbiVáltozások "
+"nyomonkövetését."
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr "válaszadás"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+"Ha hozzá szeretne szólni az oldal témájához, töltse ki ezt a mezőt, majd "
+"nyomja meg a \"Hozzászólás beküldése\" gombot. (A hozzászólásról értesítést "
+"kap levélben az összes előfizető.)"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr "${nb} előfizető"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr "egy előfizető"
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr "Hozzászólás beküldése"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr "A wiki tartalma"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr "Árva lapok"
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+#, fuzzy
+msgid "Edit history"
+msgstr "Az összes változtatás listája"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+#, fuzzy
+msgid "Edit:"
+msgstr "szerkeszt"
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+#, fuzzy
+msgid "Manage"
+msgstr "Változtat"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+#, fuzzy
+msgid "Revert this and later edits"
+msgstr "E változtatás és az összes ezt követő változtatás visszavonása"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr "Visszatérés a következő lapra:"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+#, fuzzy
+msgid "Time:"
+msgstr "Idő"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+#, fuzzy
+msgid "Note:"
+msgstr "Név:"
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr "váltás a forráskód megjelenítése és a vizuális szerkesztő-nézet között"
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr "Kiegészítő megjegyzés a változtatásokhoz"
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr ""
+"A megjegyzés a LegutóbbiVáltozások című átnézeti oldalt teszi használhatóbbá."
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr "Fájl vagy kép feltöltése"
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr "Fájl feltöltése és meghivatkozása erről a lapról?"
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr "Itt talál segítséget a szerkesztéshez:"
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr "SúgóLap"
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr "SzövegFormázásiSzabályok"
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "preview this edit"
+msgstr "szerkesztés előnézete"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr "Előnézet"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr "Elvet"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr "A szerkesztés elvetése, visszatérés a laphoz."
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr "Létrehoz"
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr "wiki lap létrehozása"
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+#, fuzzy
+msgid "label_preview"
+msgstr "(kötelező)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr "Lap neve"
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr "a wiki lap neve (A változtatás eltarthat egy ideig!)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr "típus"
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr "A lap formázási és megjelenítési stílusának kiválasztása"
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr "(külső szerkesztés)"
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr "nyitólap"
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr "A wiki legutóbbi változtatásainak megjelenítése"
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr "változások"
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr "Ugrás a hozzászólás-lapra (fórum)"
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr "hozzászólások"
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr "Ugrás az Ügykezelőre"
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr "ügykezelő"
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr "Ugrás a wiki tartalomjegyzékére"
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr "tartalomjegyzék"
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr "Ugrás a wiki névmutatójára"
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr "névmutató"
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr "Ugrás a feltöltési lapra"
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr "feltöltések"
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr "Ugrás a súgólapra"
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr "segítség"
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr "Wiki felhasználói beállításainak megjelenítése"
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr "beállítások"
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr "idemutató"
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr "E-mail címmel történő előfizetés erre a lapra, vagy az egész wikire."
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr "előfizet"
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr "változtatások történetének megjelenítése"
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr "Ugrás a nyitólapra"
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr "összevet"
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr "szerkeszt"
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr "szerkesztés külső szerkesztővel"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr "vissza a nyitólapra"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr "Keresés az összes lapon"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr "új"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+msgid "parent,"
+msgstr "szülő-lap,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr "név,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+msgid "replacement,"
+msgstr "lapok kicserélése,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+#, fuzzy
+msgid "page"
+msgstr "kor"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+"írja be a lap nevét, majd kattintson a jobboldali gombokra (menjen föléjük "
+"az egérrel segítségért)"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+#, fuzzy
+msgid "reparent"
+msgstr "Újraszármaztat"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+#, fuzzy
+msgid "make this page a subtopic of the page you have entered"
+msgstr "Újraszármaztatja az lapot az Ön által megadott szülő-laphoz."
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+"Megváltoztatja a lap nevét az ide beírt névre, a lapra mutató össze link "
+"aktualizálásával."
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename"
+msgstr "átnevez"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr "töröl!"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+#, fuzzy
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr "Újraszármaztatja az lapot az Ön által megadott szülő-laphoz."
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+#, fuzzy
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+"Megváltoztatja a lap nevét az ide beírt névre, a lapra mutató össze link "
+"aktualizálásával."
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create"
+msgstr "létrehoz"
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+#, fuzzy
+msgid "Recent changes"
+msgstr "A wiki legutóbbi változtatásainak megjelenítése"
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+#, fuzzy
+msgid "Search this wiki"
+msgstr "wiki lap létrehozása"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+#, fuzzy
+msgid "all edits"
+msgstr "szerkeszt"
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr "Előfizetett az egész wikire."
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr "Jelenleg nincs előfizetve az egész wikire."
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr "Előfizetés e-mail címmel"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr "Előfizetés törlése az egész wikiről."
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr "Előfizetés az egész wikire"
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr "A következő lapokra van még előfizetve"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr "A lap előfizetői"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr "A wiki előfizetői"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+#, fuzzy
+msgid "subscribe_desc_comments"
+msgstr ""
+"Előfizethet csak erre a lapra, vagy az egész wikire.\n"
+"          Az előfizetők e-mailban értesülnek az új hozzászólásokról.\n"
+"          (De nem értesülnek a szövegtörzs változtatásairól, hacsak a "
+"rendszer adminisztrárora másképpen nem rendelkezett.).\n"
+"          Vagy visszatérhet a következő lapra:"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+#, fuzzy
+msgid "subscribe_desc_edits"
+msgstr ""
+"Előfizethet csak erre a lapra, vagy az egész wikire.\n"
+"          Az előfizetők e-mailban értesülnek az új hozzászólásokról.\n"
+"          (De nem értesülnek a szövegtörzs változtatásairól, hacsak a "
+"rendszer adminisztrárora másképpen nem rendelkezett.).\n"
+"          Vagy visszatérhet a következő lapra:"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr "Az Ön e-mail címe"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr "Változtat"
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr "A sikeres előfizetéshez szükséges az e-mail cím megadása."
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr "Előfizetett erre a lapra."
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr "Nincs előfizetve erre a lapra."
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr " Előfizetés törlése erről a lapról "
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr " Előfizetés erre a lapra "
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+#, fuzzy
+msgid "User options"
+msgstr "keresési beállítások"
+
+#~ msgid "Add a ZWiki web"
+#~ msgstr "ZWiki hálózat hozzáadása"
+
+#~ msgid "Type"
+#~ msgstr "Típus"
+
+#~ msgid "Create wiki"
+#~ msgstr "Wiki létrehozása"
+
+#~ msgid "and enter"
+#~ msgstr "és belépés"
+
+#~ msgid ""
+#~ "You may create a new ZWiki Page object using the form below. You may also "
+#~ "choose to upload an existing html file from your local computer by "
+#~ "clicking the <i>Browse</i> button."
+#~ msgstr ""
+#~ "Létrehozhat egy ZWiki Lap elemet az alábbi szerkesztőmező segítségével, "
+#~ "vagy akár feltölthet egy html fájlt a saját gépéről a <i>Tallózás</i> "
+#~ "gomb megnyomásával."
+
+#~ msgid "File"
+#~ msgstr "Fájl"
+
+#~ msgid "Add"
+#~ msgstr "Hozzáad"
+
+#~ msgid "Add and Edit"
+#~ msgstr "Hozzáad és szerkeszt"
+
+#~ msgid "log_note"
+#~ msgstr ""
+#~ "Az lap előzményeinek kilistázásakor látható kiegészítő megjegyzés (nem "
+#~ "kötelező)"
+
+#~ msgid "Backlinks for"
+#~ msgstr "Idemutató hivatkozások:"
+
+#~ msgid "singleton_desc"
+#~ msgstr ""
+#~ "Árva lapok azok az oldalak, amelyekre nem mutat hivatkozás egyetlen más "
+#~ "lapról sem, tehát nincsen szülő-lapjuk."
+
+#~ msgid "History for"
+#~ msgstr "A következő oldal változtatásainak előzményei:"
+
+#~ msgid "return to page"
+#~ msgstr "visszatérés ehhez a laphoz"
+
+#~ msgid "help_shortname"
+#~ msgstr ""
+#~ "Megjegyzés: A lap átnevezése sokáig tarthat, ha nagy a wiki hálózat. "
+#~ "Mindeközben a többi lap is aktualizálásra kerül, ha lehetséges."
+
+#~ msgid "label_body_text"
+#~ msgstr "Szövegtörzs"
+
+#~ msgid "help_wikibody"
+#~ msgstr ""
+#~ "A wiki lapokon szögletes zárójelek [] használatosak a hivatkozások "
+#~ "automatikus létrehozására. Ha elmenti az lapot, akkor a szögletes "
+#~ "zárójelbe tett szöveg után egy kérdőjel <code>?</code> jelenik meg, "
+#~ "melyre kattintva egy új lap szerkesztése kezdhető meg a zárójelben "
+#~ "szereplő névvel."
+
+#~ msgid "help_wikiwords"
+#~ msgstr ""
+#~ "Létrehozhatóak még hivatkozások a WikiSzavak mechanizmusával is. (A szó "
+#~ "közepén használt nagybetűvel.)"
+
+#~ msgid "label_note"
+#~ msgstr ""
+#~ "A lap előzményeinek listázásakor megjelenített megjegyzés (nem kötelező)"
+
+#~ msgid "help_wikinote"
+#~ msgstr "A változtatások rövid leírása."
+
+#~ msgid "label_upload_contents_optional"
+#~ msgstr "Fájl vagy kép feltöltése (nem kötelező)"
+
+#~ msgid "help_wikiupload"
+#~ msgstr "Fájlt, vagy képet csatol ehhez a laphoz."
+
+#~ msgid "label_format"
+#~ msgstr "A lap szövegformátuma"
+
+#~ msgid "help_format"
+#~ msgstr ""
+#~ "Ha nem biztos abban, hogy melyik formátumot használja, akkor válassza a "
+#~ "Plain text formátumot, és írja meg a dokumentumot úgy, ahogy általában "
+#~ "szokta."
+
+#~ msgid "Save"
+#~ msgstr "Elment"
+
+#~ msgid "heading_edit_wiki_page"
+#~ msgstr ""
+#~ "Szerkesztés: \n"
+#~ "        ${itemtype} \n"
+#~ "\n"
+#~ "        \"${pagename}\""
+
+#~ msgid "description_edit_wiki_page"
+#~ msgstr ""
+#~ "A Wiki Lap sűrű hálózattal összakapcsolt lapok létrehozását teszi "
+#~ "lehetővé."
+
+#~ msgid "legend_wiki_page_details"
+#~ msgstr "Wiki Lap részletei"
+
+#~ msgid "label_pagename"
+#~ msgstr "Lap neve"
+
+#~ msgid "Required"
+#~ msgstr "Kötelező"
+
+#~ msgid "label_required"
+#~ msgstr "(kötelező)"
+
+#~ msgid "heading_wiki_recent_changes"
+#~ msgstr "Legutóbbi változtatások"
+
+#~ msgid "heading_wiki_search_wiki"
+#~ msgstr "Keresés a wikiben"
+
+#~ msgid "Unsubscribe from this page"
+#~ msgstr "Előfizetés törlése erről a lapról"
+
+#~ msgid "Subscribe to this page"
+#~ msgstr "Előfizetés erre az lapra"
+
+#~ msgid "heading_wiki_user_options"
+#~ msgstr "Felhasználói beállítások"
+
+#, fuzzy
+#~ msgid "add a comment"
+#~ msgstr "Hozzászólás beküldése"
+
+#~ msgid "heading_wiki_filter_issues"
+#~ msgstr "Ügyek szűrése"
+
+#, fuzzy
+#~ msgid "heading_wiki_issue_browser"
+#~ msgstr "Ügykezelő"
+
+#~ msgid "heading_wiki_issue_tracker"
+#~ msgstr "Ügykezelő"
+
+#, fuzzy
+#~ msgid "property change"
+#~ msgstr "A wiki legutóbbi változtatásainak megjelenítése"
+
+#~ msgid "backlinks_reparent_help"
+#~ msgstr ""
+#~ "Megváltoztathatja a lap szülő-lapját, ezzel megváltoztatja a lap helyét \n"
+#~ "a wiki hálózat hierarchiájában. Jelölje be a megfelelő opciót, vagy írjon "
+#~ "be egy új oldalnevet, majd klikkeljen az \"Újraszármaztat\"gombra.\n"
+#~ "Általában egy lapnak elég egy szülő-lap."
+
+#, fuzzy
+#~ msgid "backlinks_reparent_help2"
+#~ msgstr ""
+#~ "Megváltoztathatja a lap szülő-lapját, ezzel megváltoztatja a lap helyét \n"
+#~ "a wiki hálózat hierarchiájában. Jelölje be a megfelelő opciót, vagy írjon "
+#~ "be egy új oldalnevet, majd klikkeljen az \"Újraszármaztat\"gombra.\n"
+#~ "Általában egy lapnak elég egy szülő-lap."
+
+#, fuzzy
+#~ msgid "View"
+#~ msgstr "Megtekint"
+
+#, fuzzy
+#~ msgid "Comment"
+#~ msgstr "Hozzászólások"
+
+#, fuzzy
+#~ msgid "A Comment"
+#~ msgstr "Hozzászólások"
+
+#, fuzzy
+#~ msgid "Table of Contents"
+#~ msgstr "Tartalom"
+
+#, fuzzy
+#~ msgid "A Wiki"
+#~ msgstr "Zwiki Lap hozzáadása"
+
+#, fuzzy
+#~ msgid "Subscriptions"
+#~ msgstr "Előfizetés e-mail címmel"
+
+#, fuzzy
+#~ msgid "Change Wiki Page"
+#~ msgstr "Zwiki Lap hozzáadása"
+
+#, fuzzy
+#~ msgid "Wiki User"
+#~ msgstr "A wiki előfizetői"
+
+#, fuzzy
+#~ msgid "A Wiki Page"
+#~ msgstr "Zwiki Lap hozzáadása"
+
+#, fuzzy
+#~ msgid "Wiki Page"
+#~ msgstr "Zwiki Lap hozzáadása"
+
+#, fuzzy
+#~ msgid "A Wiki Page Comment"
+#~ msgstr "Zwiki Lap hozzáadása"
+
+#, fuzzy
+#~ msgid "Wiki Page Comment"
+#~ msgstr "A wiki tartalma"
+
+#, fuzzy
+#~ msgid "View a Wiki Page"
+#~ msgstr "Zwiki Lap hozzáadása"
+
+#, fuzzy
+#~ msgid "View Wiki Page"
+#~ msgstr "Zwiki Lap hozzáadása"
+
+#, fuzzy
+#~ msgid "Edit Wiki Page"
+#~ msgstr "Zwiki Lap hozzáadása"
+
+#, fuzzy
+#~ msgid "Delete Wiki Page"
+#~ msgstr "Zwiki Lap hozzáadása"
+
+#, fuzzy
+#~ msgid "Reparent Wiki Page"
+#~ msgstr "Zwiki Lap hozzáadása"
+
+#~ msgid "page in parent wiki"
+#~ msgstr "Lap a szülő-wikiben"
+
+#~ msgid "XXX"
+#~ msgstr "XXX"
+
+#~ msgid "File Uploads"
+#~ msgstr "Fájlfeltöltések"
+
+#~ msgid "uploads_desc"
+#~ msgstr "Ez az lap kilistázza a wikire feltöltött összes fájlt."
+
+#~ msgid "save"
+#~ msgstr "Elment"
+
+#~ msgid "view"
+#~ msgstr "Megtekint"
+
+#~ msgid "no_files_uploaded"
+#~ msgstr "Nem lett feltöltve fájl."
+
+#~ msgid "box_wiki_navigation"
+#~ msgstr "Navigáció a wikiben"
+
+#~ msgid "enter comments here and click add; or, click edit"
+#~ msgstr ""
+#~ "Írja be ide hozzászólását, majd kattintson a \"Hozzáad\" gombra, vagy "
+#~ "klikkeljen a \"Szerkeszt\" gombra."
+
+#~ msgid "Details & comments"
+#~ msgstr "Részletek és megjegyzések"
+
+#~ msgid "hits"
+#~ msgstr "találatok"
+
+#~ msgid ""
+#~ "no catalog or the catalog search gave an error, a brute-force search was "
+#~ "used"
+#~ msgstr ""
+#~ "Nem létezik katalógus, vagy a katalógusban való keresés hibaüzenetet "
+#~ "adott, ezért nyerskeresést kellett alkalmazni."
+
+#~ msgid "Contents"
+#~ msgstr "Tartalom"
+
+#~ msgid "Diffs for"
+#~ msgstr "Összevetés:"
+
+#~ msgid "name"
+#~ msgstr "név"
+
+#~ msgid "page rating"
+#~ msgstr "Lapértékelés"
+
+#~ msgid "rating_score"
+#~ msgstr ""
+#~ "pontszám: ${score} \n"
+#~ "(${nb_votes} szavazat)"
+
+#~ msgid "click to rate"
+#~ msgstr "Kattintson a számokra a lap értékeléséhez!<br />"
+
+#~ msgid "voting as"
+#~ msgstr "Szavazás az alábbi felhasználói néven"
+
+#~ msgid "Here are the pages which link to"
+#~ msgstr "A listában szereplő lapok hivatkoznak erre a lapra:"
+
+#~ msgid "box_canreparent"
+#~ msgstr ""
+#~ "Megváltoztathatja a lap <em>szülő-lapját, szülő-lapjait</em> "
+#~ "megváltoztatván ezzel a lap helyét a wiki hálózat hierarchiájában. "
+#~ "Jelölje be a megfelelő opciót, vagy írjon be egy új oldalnevet, majd "
+#~ "klikkeljen az \"Újraszármaztat\" &nbsp;gombra. Egy lapnak elég általában "
+#~ "egy szülő-lap."
+
+#~ msgid "Other parent"
+#~ msgstr "Más szülő-lap"
+
+#~ msgid "You may also click the full, simple, minimal links if provided."
+#~ msgstr ""
+#~ "Szintén klikkelhet a teljes, egyszerű és a minimális nézet "
+#~ "hivatkozásokra, ha láthatóak."
+
+#~ msgid "for subscribing"
+#~ msgstr "wiki lapok előfizetéséhez"
+
+#~ msgid "width"
+#~ msgstr "szélessége"
+
+#~ msgid "height"
+#~ msgstr "magassága"
+
+#~ msgid "textarea dimensions; width will be 100% if supported"
+#~ msgstr "Szövegmező méretei: szélessége 100%, ha lehetséges."
+
+#~ msgid "Your local time is"
+#~ msgstr "A helyi idő:"
+
+#~ msgid "Show logo ?"
+#~ msgstr "Logó megjelenítése?"
+
+#~ msgid "No"
+#~ msgstr "Nem"
+
+#~ msgid "Yes"
+#~ msgstr "Igen"
+
+#~ msgid "Show page hierarchy ?"
+#~ msgstr "Lapok hierarchiájának megjelenítése?"
+
+#~ msgid "This wiki keeps a page hierarchy, which you can use or ignore."
+#~ msgstr ""
+#~ "A ZWiki számontartja a lapok hierarchiáját, melyet felhasználhat, vagy "
+#~ "figyelmen kívül hagyhat."
+
+#~ msgid "Show search field ?"
+#~ msgstr "Keresőmező megjelenítése?"
+
+#~ msgid "except in minimal mode"
+#~ msgstr "kivéve a minimális nézetet"
+
+#~ msgid "Show AnnoyingQuote ?"
+#~ msgstr "ElcsépeltIdézetek megjelenítése?"
+
+#~ msgid "in full mode"
+#~ msgstr "teljes nézetben"
+
+#~ msgid "Show page management form ?"
+#~ msgstr "Lapkezelő űrlap megjelenítése?"
+
+#~ msgid "You must also configure a username or be logged in."
+#~ msgstr ""
+#~ "Szintén meg kell adnia egy felhasználói nevet, vagy be kell jelentkeznie "
+#~ "az oldalra."
+
+#~ msgid "no subscribers"
+#~ msgstr "nincs előfizető"
+
+#~ msgid "parent_name_replace"
+#~ msgstr "új szülő-lap, új név vagy áthelyezés"
+
+#~ msgid ""
+#~ "enter a new parent, new name, replacement page (if any) or subtopic name"
+#~ msgstr ""
+#~ "új szülő-lap megadása, lap átnevezése, cserelap megadása, vagy az "
+#~ "alfejezet neve (ha létezik)"
+
+#~ msgid "box_zwiki_showhierarchy"
+#~ msgstr ""
+#~ "Megváltoztathatja a lap <em>szülő-lapját, szülő-lapjait</em>,"
+#~ "megváltoztatván ezzel a lap helyét \n"
+#~ "a wiki hálózat hierarchiájában. Jelölje be a megfelelő opciót, vagy írjon "
+#~ "be egy új oldalnevet, majd klikkeljen az \"Újraszármaztat\" gombra.\n"
+#~ "Egy lapnak elég általában egy szülő-lap."
+
+#~ msgid ""
+#~ "move this page to the recycle bin, and relink to the name you have entered"
+#~ msgstr "Szemeteskosárba dobja a lapot, és újrahivatkoz a beírtak szerint."
+
+#~ msgid "create a new subtopic of this page"
+#~ msgstr "új alfejezet létrehozása"
+
+#~ msgid "cancel"
+#~ msgstr "elvet"

Added: zope-zwiki/branches/upstream/current/i18n/it.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/it.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/it.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1767 @@
+# Italian message catalog for ZWiki
+msgid ""
+msgstr ""
+"Project-Id-Version: ZWiki-0-32-0\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-02-26 09:01+0000\n"
+"Last-Translator: Lele Gaifax <lele at seldati.it>\n"
+"Language-Team: <zwiki at zwiki.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: zope/app/translation_files/extract.py\n"
+"Language-code: it\n"
+"Language-name: Italian\n"
+"Preferred-encodings: utf-8 latin1\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr "Non sei autorizzato ad aggiornare tutte le pagine."
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr "(folder -> Manage properties)"
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "Non sei autorizzato a cambiare il nome di questa pagina ZWiki."
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "Non sei autorizzato a cambiare il nome di questa pagina ZWiki."
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr ""
+"Non sei autorizzato a modificare la gerarchia o cambiare i collegamenti ai "
+"sotto argomenti di questa pagina ZWiki."
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr "Non sei autorizzato a cambiare il tipo di questa pagina ZWiki."
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr "Non sei autorizzato a modificare questa pagina ZWiki."
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr "Non sei autorizzato a cancellare questa pagina ZWiki."
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+"Questa pagina è stata rinominata %s.  Puoi cancellare questa se non serve "
+"più.\n"
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr "Non sei autorizzato a caricare dei file qui."
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr "Non sei autorizzato ad aggiungere collegamenti a questa pagina ZWiki."
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+#, fuzzy
+msgid "banned_links match"
+msgstr "i collegamenti vietati corrispondono"
+
+#: src/ZWiki/Editing.py:830
+#, fuzzy
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr ""
+"C'è stato un problema: Perfavore contatta l'amministratore del sito per un "
+"aiuto"
+
+#: src/ZWiki/Editing.py:841
+#, fuzzy
+msgid "exceeded max_anonymous_links"
+msgstr "hai raggiunto un numero massimo di link anonimi"
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+#, fuzzy
+msgid "exceeded max_identified_links"
+msgstr "hai raggiunto un numero massimo di link anonimi"
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr "anonimo"
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr "quali pagine referenziano questa ?"
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr "Ti trovi qui"
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr "anni"
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr "anno"
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr "mese"
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr "mesi"
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr "settimane"
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr "settimana"
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr "giorno"
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr "giorni"
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr "ore"
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr "ora"
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr "minuto"
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr "minuti"
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr "secondo"
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr "secondi"
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr "La pagina è bloccata"
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+"\n"
+"            Questa pagina è bloccata da webDAV.  Qualcun altro la sta\n"
+"            probabilmente modificando con un editor esterno.  Dovrai\n"
+"            aspettare che abbia finito e poi riprovare di nuovo.  Se hai\n"
+"            apportato delle modifiche, puoi tornare indietro e copiare la\n"
+"            tua versione del testo per riferimento.\n"
+"            "
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr "Per annullare le tue modifiche e riprovarci, premi OK."
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr "Modifiche in conflitto"
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr "Qualcun'altro ha salvato questa pagina mentre la stavi modificando"
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr "Per risolvere il conflitto, fai così"
+
+#: src/ZWiki/Views.py:415
+#, fuzzy
+msgid "Click your browser's back button"
+msgstr "Clicca il pulsante \"back\" del tuo browser per tornare indietro"
+
+#: src/ZWiki/Views.py:416
+#, fuzzy
+msgid "Copy your recent edits to the clipboard"
+msgstr "Copia le tue ultime modifiche che hai fatto nel clipboard"
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr "Ricarica la pagina con l'apposito pulsante del browser"
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr ""
+"Reinserisci le modifiche reincollandole, tenendo presenti i recenti "
+"cambiamenti"
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr "Premi di nuovo sul pulsante Modifica"
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr "oppure"
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr "Per annullare le tue modifiche e rifare tutto, premi OK"
+
+#: src/ZWiki/Views.py:490
+#, fuzzy
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+"\n"
+"        0    mostra queste associazioni dei tasti\n"
+"\n"
+"        funzioni wiki:\n"
+"        f    mostra front page\n"
+"        c    mostra i contenti de wiki\n"
+"        r    mostra le modifiche recenti\n"
+"             mostra discussion page\n"
+"        t    mostra l'issue tracker\n"
+"        i    mostra l'indice del wiki\n"
+"        o    mostra le opzioni wiki (preferenze)\n"
+"        h    mostra la pagina di aiuto\n"
+"        s    attiva il campo di ricerca\n"
+"        \n"
+"        funzioni sulla pagina:\n"
+"        v    mostra la pagina\n"
+"        +    mostra le pagine in modalità completa\n"
+"        =    mostra le pagine in modalità semplice\n"
+"        -    mostra le pagine in modalità minimale\n"
+"        m    sottoscrizione abbonamento email\n"
+"        b    mostra riferimenti inversi (link a questa pagina)\n"
+"        d    mostra differenze (storia delle modifiche alla pagina)\n"
+"        y    mostra la storia completa (nella ZMI)\n"
+"        e    modifica la pagina\n"
+"        x    modifica con un editor esterno\n"
+"             stampa questa pagina (e i sotto argomenti)\n"
+"        q    mostra il sorgente della pagina (quick-view)\n"
+"             azzera e rigenera la cache del render di questa pagina\n"
+"             vai ai sotto argomenti\n"
+"             vai ai commenti (messaggi)\n"
+"             vai alla pagina personale dell'autore di questa, se possibile\n"
+"        n    pagina successiva\n"
+"        p    pagina precedente\n"
+"        u    vai alla pagina sovrastante\n"
+"        \n"
+"        nel modulo di modifica:\n"
+"        s    salva le modifiche\n"
+"        \n"
+"        esaminando le modifiche:\n"
+"        n    modifica successiva\n"
+"        p    modifica precedente\n"
+"        "
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr "crea questa pagina"
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr "modificata %(interval)s fa"
+
+#: src/ZWiki/ZWikiPage.py:809
+#, fuzzy
+msgid "show last edit"
+msgstr "mostra l'ultima modifica %(lastlog)s"
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr "da %(editor)s"
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr ""
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr "commenti"
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr "\"%(token)s\" deve essere seguito da \"=\""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr "Deve essere specificato un valore per la chiave \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr "Crea un nuovo disegno \"%(filename)s\""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr "Carica un nuovo allegato \"%(filename)s\""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr "Modifica il disegno %(filename)s"
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr "Richiesto \"%(wanted)s\" dopo \"%(key)s\", invece di \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr "Richiesto un numero intero \"%(key)s\" prima di \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr "Richiesto un numero intero per \"%(arg)s\" dopo di \"%(key)s\""
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr "Richiesto il nome di un colore per \"%(arg)s\" dopo \"%(key)s\""
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr "replica"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr "storia completa"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr "<< modifica precedente"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr "modifica successiva >>"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+#, fuzzy
+msgid "Revert this change and all successive changes"
+msgstr "Ripristina questa e tutte le successive modifiche"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr "mostra la skin di plone"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+#, fuzzy
+msgid "plone"
+msgstr "plone"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+msgid "show all features"
+msgstr "mostra tutte le funzionalità"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr "completo"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+msgid "show basic features"
+msgstr "mostra funzionalità di base"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+msgid "simple"
+msgstr "semplice"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr "mostra le funzioni essenziali"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr "minimale"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+msgid "subtopic"
+msgstr "sotto argomento"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+#, fuzzy
+msgid "for this page"
+msgstr "crea questa pagina"
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+msgid "title"
+msgstr "titolo"
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr "Filtra i problemi"
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+#, fuzzy
+msgid "Issue browser"
+msgstr "archivio problematiche"
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+#, fuzzy
+msgid "Issue tracker"
+msgstr "archivio problematiche"
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "Non sei autorizzato a modificare questa pagina ZWiki."
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr "categoria"
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr "severità"
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr "stato"
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+msgid "age"
+msgstr "età"
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr "ultima modifica"
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr "Aggiungi un nuovo problema:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr "Nome:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr "Categoria:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr "Severità:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr "Stato:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+msgid "Here are the wiki's issue pages."
+msgstr "Ecco le pagine relative alle problematiche del wiki."
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr "Dettagli:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr "aggiungi problema"
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr "Altre opzioni di ricerca avanzate su"
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr "archivio problematiche"
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+msgid "search options"
+msgstr "opzioni di ricerca"
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr "Il nome contiene qualsiasi:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr "Il testo della pagina contiene qualsiasi:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr "Categorie:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+msgid "Severities:"
+msgstr "Severità:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr "Stati:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+#, fuzzy
+msgid "Enter a search term, click the numbers to the right,"
+msgstr ""
+"Inserisci un termine da cercare, o clicca su uno dei numeri sulla destra, o"
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr "Inserito da"
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+msgid "Name"
+msgstr "Nome"
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr "Categoria"
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+msgid "filter issues"
+msgstr "filtra i problemi"
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr "Severità"
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr "Stato"
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+#, fuzzy
+msgid "Optional subject"
+msgstr "Titolo opzionale"
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+#, fuzzy
+msgid "Optional comment"
+msgstr "Annotazione opzionale"
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "Aggiungi pagina ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+#, fuzzy
+msgid "Id:"
+msgstr "Id"
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+#, fuzzy
+msgid "Title:"
+msgstr "Titolo"
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "Aggiungi pagina ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr "Pagine modificate negli ultimi"
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr "Pagine modificate di recente, con sommario"
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr "Mostrare i sommari ?"
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr "Aggiorna"
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr "Pagina"
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr "Modificata&nbsp;da"
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr "Quando"
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr "NUOVA"
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr "Le pagine marcate con (NUOVA) sono state create nell'ultima settimana"
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr "cerca tra i problemi"
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr ""
+"Inserisci una parola o una frase e poi invio per cercare nell'intero wiki."
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr ""
+"Questo è lo stesso meccanismo usato dal campo di ricerca in alto a destra."
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr ""
+"Suggerimento: Una singola parola è l'ideale per cercare nei nomi delle "
+"pagine."
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+"La possibilità di ignorare il maiuscolo/minuscolo o di usare i\n"
+"caratteri jolly dipende dalla configurazione del tuo catalogo."
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr "Lascia in bianco per ottenere l'elenco di tutte le pagine."
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr "Cerca"
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr "Cerca nei nomi delle pagine"
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr "Cerca nel testo"
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+#, fuzzy
+msgid "Thorough (non-catalog) search for text matching"
+msgstr "ricerca accurata"
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+msgid "recent"
+msgstr "recente"
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr "Imposta le tue preferenze per questo wiki:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr "Nome utente:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr "(firma le tue modifiche)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+msgid "Email address:"
+msgstr "Indirizzo email:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+msgid "(allows mail subscription)"
+msgstr "(consenti sottoscrizione abbonamento email)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr "Il tuo fuso orario:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr "(per mostrare l'ora locale)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr "Cambia l'altezza del modulo di modifica:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr "(aggiusta le dimensioni del modulo)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr "Salva le opzioni"
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr "tutti"
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr "Dimentica le opzioni"
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr "Aggiungi pagina ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+#, fuzzy
+msgid "Page&nbsp;name:"
+msgstr "Nome della pagina"
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "Aggiungi pagina ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+#, fuzzy
+msgid "Topic"
+msgstr "sotto argomento"
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr "Ultimo aggiornamento"
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+#, fuzzy
+msgid "Comments"
+msgstr "commenti"
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+#, fuzzy
+msgid "Views"
+msgstr "visualizza"
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+#, fuzzy
+msgid "Created"
+msgstr "Crea"
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr "di"
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr "dtml-var lasteditinterval> fa </dtml-var>"
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr "attivo"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+#, fuzzy
+msgid "Subtopics"
+msgstr "sotto argomento"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr "Questa pagina non ha sottoargomenti"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+#, fuzzy
+msgid "Here are it's subtopics."
+msgstr "Ecco le pagine relative alle problematiche del wiki."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+#, fuzzy
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr "Puoi cambiare l'ordine dei sottoargomenti schiacciando il bottone ^"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+#, fuzzy
+msgid "Related pages"
+msgstr "crea questa pagina"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+#, fuzzy
+msgid "Parents"
+msgstr "sovrastante,"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr "è un argomento principale."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr "è un sotto argomento di:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+#, fuzzy
+msgid "Backlinks"
+msgstr "riferimenti inversi"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr "Queste sono le pagine che la referenziano:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+#, fuzzy
+msgid "No other pages link to this one."
+msgstr "quali pagine referenziano questa ?"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr "Aggiorna gerarchia"
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+#, fuzzy
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+"Si è verificato un problema con lo skin template di questo wiki.  Potrebbe "
+"esserci un oggetto con lo stesso nome dello skin che non è un Page Template "
+"o un metodo DTML, oppure potrebbe mancare il template."
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr "oggetto"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr "l'oggetto aiuta a mantenere chiari i thread e le ModificheRecenti"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr "in replica a"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+"Per commentare (in CC agli abbonati) inserisci qui il testo e premi sul "
+"pulsante"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr "${nb} abbonati"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr "1 abbonato"
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr "aggiungi un commento"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr "Contenuto del wiki"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr "Pagine singole"
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+#, fuzzy
+msgid "Edit history"
+msgstr "storia completa"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+#, fuzzy
+msgid "Edit:"
+msgstr "modifica"
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+#, fuzzy
+msgid "Manage"
+msgstr "Cambia"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+#, fuzzy
+msgid "Revert this and later edits"
+msgstr "Ripristina questa e tutte le successive modifiche"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr "Torna alla pagina"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+#, fuzzy
+msgid "Time:"
+msgstr "Quando"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+#, fuzzy
+msgid "Note:"
+msgstr "Nome:"
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr "passa da sorgente a modo WYSIWYG"
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr "Annotazione opzionale alla modifica"
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr "l'annotazione rende le ModificheRecenti più utili"
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr "Carica un file o un'immagine"
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr "allegare un file e inserne un collegamento su questa pagina ?"
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr "Per un aiuto, vedi"
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr "PaginaAiuto"
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr "RegoleFormattazioneTesto"
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "preview this edit"
+msgstr "anteprima delle modifiche"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr "Anteprima"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr "Annulla"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr "annulla queste modifiche e torna alla pagina"
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr "Crea"
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr "crea questa pagina wiki"
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+#, fuzzy
+msgid "label_preview"
+msgstr "(Obbligatorio)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr "Nome della pagina"
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr ""
+"nome di questa pagina wiki (questa modifica può richiedere molto tempo!)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr "tipo"
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr ""
+"seleziona la formattazione e lo stile di visualizzazione di questa pagina"
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr "(editor esterno)"
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr "principale"
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr "mostra le modifiche apportate di recente a questo wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr "modifiche"
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr "mostra pagina di discussione"
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr "discussione"
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr "mostra il gestore delle problematiche"
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr "problemi"
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr "contenuti del wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr "contenuti"
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr "mostra l'indice del wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr "indice"
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr "mostra pagina di caricamento allegati"
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr "allegati"
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr "mostra pagina di aiuto"
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr "aiuto"
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr "mostra opzioni wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr "opzioni"
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr "riferimenti inversi"
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr "configura l'abbonamento email a questa pagina o al sito"
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr "abbonati"
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr "mostra la storia delle modifiche a questa pagina"
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr "mostra pagina principale"
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr "differenze"
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr "modifica"
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr "modifica con un editor esterno"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr "vai alla pagina principale"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr "cerca in tutte le pagine"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr "nuovo"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+msgid "parent,"
+msgstr "sovrastante,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr "nome,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+msgid "replacement,"
+msgstr "sostituzione,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+#, fuzzy
+msgid "page"
+msgstr "età"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+"inserisci il nome della pagina e clicca i pulsanti sulla destra (spostaci "
+"sopra il mouse per un aiuto)"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+#, fuzzy
+msgid "reparent"
+msgstr "Aggiorna gerarchia"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "make this page a subtopic of the page you have entered"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+#, fuzzy
+msgid "rename"
+msgstr "nome"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+#, fuzzy
+msgid "create"
+msgstr "Crea"
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+#, fuzzy
+msgid "Recent changes"
+msgstr "mostra le modifiche apportate di recente a questo wiki"
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+#, fuzzy
+msgid "Search this wiki"
+msgstr "cerca questa pagina wiki"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+#, fuzzy
+msgid "all edits"
+msgstr "modifica"
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr ""
+"Attualmente sei abbonato <br />\n"
+"a tutto il wiki."
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr ""
+"Attualmente non sei abbonato <br />\n"
+"a tutto il wiki."
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr "Sottoscrizione abbonamento email"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr "Annulla l'abbonamento a tutto il wiki"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr "Sottoscrivi l'abbonamento a tutto il wiki"
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr "Sei abbonato queste altre pagine"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr "Abbonati alla pagina"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr "Abbonati al wiki"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+#, fuzzy
+msgid "subscribe_desc_comments"
+msgstr ""
+"Puoi sottoscrivere un abbonamento a questa pagina oppure a tutto il wiki.\n"
+"     Gli abbonati ricevono via email una copia delle annotazioni alle\n"
+"     modifiche (ma non alle modifiche senza annotazione, se non sono\n"
+"     state abilitate dall'amministratore del sito).\n"
+"     Oppure ritorna a"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+#, fuzzy
+msgid "subscribe_desc_edits"
+msgstr ""
+"Puoi sottoscrivere un abbonamento a questa pagina oppure a tutto il wiki.\n"
+"     Gli abbonati ricevono via email una copia delle annotazioni alle\n"
+"     modifiche (ma non alle modifiche senza annotazione, se non sono\n"
+"     state abilitate dall'amministratore del sito).\n"
+"     Oppure ritorna a"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr "Il tuo indirizzo email"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr "Cambia"
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr "Per abbonarti, inserisci il tuo indirizzo email."
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr ""
+"Sei attualmente abbonato<br />\n"
+"    a questa pagina."
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr ""
+"Non sei attualmente abbonato<br />\n"
+"    a questa pagina."
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr " Annulla l'abbonamento a questa pagina "
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr " Abbonati a questa pagina "
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+#, fuzzy
+msgid "User options"
+msgstr "opzioni di ricerca"
+
+#, fuzzy
+#~ msgid "your edit contained a banned link pattern"
+#~ msgstr "il tuo contenuto contiene un link non accettato"
+
+#, fuzzy
+#~ msgid "adding of external links by anonymous authors is restricted"
+#~ msgstr "un autore anonimo non può aggiungere collegamenti esterni"
+
+#~ msgid "Add a ZWiki web"
+#~ msgstr "Aggiungi un sito ZWiki"
+
+#~ msgid "Type"
+#~ msgstr "Tipo"
+
+#~ msgid "Create wiki"
+#~ msgstr "Crea il wiki"
+
+#~ msgid "and enter"
+#~ msgstr "e inserisci"
+
+#~ msgid ""
+#~ "You may create a new ZWiki Page object using the form below. You may also "
+#~ "choose to upload an existing html file from your local computer by "
+#~ "clicking the <i>Browse</i> button."
+#~ msgstr ""
+#~ "Puoi creare una nuova pagina ZWiki usando il modulo sottostante. Puoi\n"
+#~ "scegliere invece di caricare un file html presente sul tuo computer\n"
+#~ "locale cliccando sul pulsante <i>Browse</i>."
+
+#~ msgid "File"
+#~ msgstr "File"
+
+#~ msgid "Add"
+#~ msgstr "Aggiungi"
+
+#~ msgid "Add and Edit"
+#~ msgstr "Aggiungi e modifica"
+
+#~ msgid "log_note"
+#~ msgstr "Note:"
+
+#~ msgid "Backlinks for"
+#~ msgstr "Riferimenti inversi a"
+
+#~ msgid "singleton_desc"
+#~ msgstr ""
+#~ "Le pagine singole sono quelle che non sono connesse a nessun'altra pagina."
+
+#~ msgid "History for"
+#~ msgstr "Storia di"
+
+#~ msgid "return to page"
+#~ msgstr "torna alla pagina"
+
+#~ msgid "help_shortname"
+#~ msgstr ""
+#~ "Cambiare il nome di una pagina di un wiki molto esteso può richiedere "
+#~ "molto tempo.  Se possibile le altre pagine verranno aggiornate."
+
+#~ msgid "label_body_text"
+#~ msgstr "Testo della pagina"
+
+#~ msgid "help_wikibody"
+#~ msgstr ""
+#~ "In una pagina Wiki, usa le [parentesi quadre] per indicare un\n"
+#~ "collegamento.  Una volta salvata la pagina, troverai un piccolo\n"
+#~ "<code>?</code> vicino al testo fra parentesi: cliccandoci sopra ti\n"
+#~ "sarà possibile creare una pagina con quel nome."
+
+#~ msgid "help_wikiwords"
+#~ msgstr ""
+#~ "Questo wiki supporta anche le ParoleWiki come meccanismo di collegamento."
+
+#~ msgid "label_note"
+#~ msgstr "Annotazione per lo storico della pagina (opzionale)"
+
+#~ msgid "help_wikinote"
+#~ msgstr "Breve descrizione delle modifiche effettuate."
+
+#~ msgid "label_upload_contents_optional"
+#~ msgstr "Carica un file o un'immagine (opzionale)"
+
+#~ msgid "help_wikiupload"
+#~ msgstr "Allega un file o un'immagine a questa pagina wiki."
+
+#~ msgid "label_format"
+#~ msgstr "Formato della pagina"
+
+#~ msgid "help_format"
+#~ msgstr ""
+#~ "Se non sei sicuro su che formato utilizzare, seleziona Plain Text e\n"
+#~ "scrivi la pagina come fai di solito."
+
+#~ msgid "Save"
+#~ msgstr "Conferma"
+
+#~ msgid "heading_edit_wiki_page"
+#~ msgstr ""
+#~ "Modifica\n"
+#~ "        ${itemtype}\n"
+#~ "\n"
+#~ "        \"${pagename}\""
+
+#~ msgid "description_edit_wiki_page"
+#~ msgstr ""
+#~ "Una pagina Wiki ti consente di creare dei documenti con molte "
+#~ "interconnessioni."
+
+#~ msgid "legend_wiki_page_details"
+#~ msgstr "Dettagli della pagina"
+
+#~ msgid "label_pagename"
+#~ msgstr "Nome della pagina"
+
+#~ msgid "Required"
+#~ msgstr "Obbligatorio"
+
+#~ msgid "label_required"
+#~ msgstr "(Obbligatorio)"
+
+#~ msgid "heading_wiki_recent_changes"
+#~ msgstr "Modifiche recenti"
+
+#~ msgid "heading_wiki_search_wiki"
+#~ msgstr "Cerca in questo wiki"
+
+#~ msgid "Unsubscribe from this page"
+#~ msgstr "Annulla l'abbonamento a questa pagina"
+
+#~ msgid "Subscribe to this page"
+#~ msgstr "Abbonati a questa pagina"
+
+#~ msgid "heading_wiki_user_options"
+#~ msgstr "Opzioni utente"
+
+#, fuzzy
+#~ msgid "add a comment"
+#~ msgstr "aggiungi un commento"
+
+#~ msgid "heading_wiki_filter_issues"
+#~ msgstr "Filtra i problemi"
+
+#, fuzzy
+#~ msgid "heading_wiki_issue_browser"
+#~ msgstr "Gestione problematiche"
+
+#~ msgid "heading_wiki_issue_tracker"
+#~ msgstr "Gestione problematiche"
+
+#, fuzzy
+#~ msgid "property change"
+#~ msgstr "mostra le modifiche apportate di recente a questo wiki"
+
+#~ msgid "backlinks_reparent_help"
+#~ msgstr ""
+#~ "Puoi modificare le pagine superiori a questa nella gerarchia per\n"
+#~ "riposizionarla in maniera ottimale.  Seleziona l'opzione oppure\n"
+#~ "inserisci il nuovo nome della pagina e clicca su Reparent.\n"
+#~ "Di solito è sufficiente una singola pagina superiore."
+
+#, fuzzy
+#~ msgid "backlinks_reparent_help2"
+#~ msgstr ""
+#~ "Puoi modificare le pagine superiori a questa nella gerarchia per\n"
+#~ "riposizionarla in maniera ottimale.  Seleziona l'opzione oppure\n"
+#~ "inserisci il nuovo nome della pagina e clicca su Reparent.\n"
+#~ "Di solito è sufficiente una singola pagina superiore."
+
+#, fuzzy
+#~ msgid "View"
+#~ msgstr "visualizza"
+
+#, fuzzy
+#~ msgid "Comment"
+#~ msgstr "commenti"
+
+#, fuzzy
+#~ msgid "A Comment"
+#~ msgstr "commenti"
+
+#, fuzzy
+#~ msgid "Table of Contents"
+#~ msgstr "Contenuti"
+
+#, fuzzy
+#~ msgid "A Wiki"
+#~ msgstr "Aggiungi pagina ZWiki"
+
+#, fuzzy
+#~ msgid "Subscriptions"
+#~ msgstr "Sottoscrivi l'abbonamento"
+
+#, fuzzy
+#~ msgid "Change Wiki Page"
+#~ msgstr "Aggiungi pagina ZWiki"
+
+#, fuzzy
+#~ msgid "Wiki User"
+#~ msgstr "Abbonati al wiki"
+
+#~ msgid "A Wiki Page"
+#~ msgstr "Una pagina ZWiki"
+
+#~ msgid "Wiki Page"
+#~ msgstr "Pagina ZWiki"
+
+#, fuzzy
+#~ msgid "A Wiki Page Comment"
+#~ msgstr "Pagina commenti"
+
+#, fuzzy
+#~ msgid "Wiki Page Comment"
+#~ msgstr "Commenti al wiki"
+
+#~ msgid "Wiki Editor"
+#~ msgstr "Editor Wiki"
+
+#~ msgid "The Wiki Editor can create and edit wikis."
+#~ msgstr "L'editor Wiki può creare e modificare le pagine"
+
+#, fuzzy
+#~ msgid "View a Wiki Page"
+#~ msgstr "Aggiungi pagina ZWiki"
+
+#, fuzzy
+#~ msgid "View Wiki Page"
+#~ msgstr "Aggiungi pagina ZWiki"
+
+#, fuzzy
+#~ msgid "Edit Wiki Page"
+#~ msgstr "Aggiungi pagina ZWiki"
+
+#, fuzzy
+#~ msgid "Delete Wiki Page"
+#~ msgstr "Cancella pagina ZWiki"
+
+#~ msgid "Reparent a Wiki Page"
+#~ msgstr "Ricollega una pagina Wiki"
+
+#, fuzzy
+#~ msgid "Reparent Wiki Page"
+#~ msgstr "Aggiungi pagina ZWiki"
+
+#~ msgid "page in parent wiki"
+#~ msgstr "pagina nel wiki sovrastante"
+
+#~ msgid "XXX"
+#~ msgstr "XXX"
+
+#~ msgid "File Uploads"
+#~ msgstr "File allegati"
+
+#~ msgid "uploads_desc"
+#~ msgstr "Questa pagina elenca tutti gli allegati in questo Wiki."
+
+#~ msgid "save"
+#~ msgstr "conferma"
+
+#~ msgid "view"
+#~ msgstr "visualizza"
+
+#~ msgid "no_files_uploaded"
+#~ msgstr "Non ci sono allegati."
+
+#~ msgid "box_wiki_navigation"
+#~ msgstr "Navigazione del Wiki"
+
+#~ msgid "enter comments here and click add; or, click edit"
+#~ msgstr ""
+#~ "inserisci la tua annotazione e clicca su aggiungi commento; oppure clicca "
+#~ "su modifica"
+
+#~ msgid "Details & comments"
+#~ msgstr "Dettagli e commenti"
+
+#~ msgid "hits"
+#~ msgstr "visite"
+
+#~ msgid ""
+#~ "no catalog or the catalog search gave an error, a brute-force search was "
+#~ "used"
+#~ msgstr ""
+#~ "catalogo non presente oppure la ricerca sul catalogo ha generato un "
+#~ "errore: ho eseguito quindi una ricerca esaustiva"
+
+#~ msgid "Contents"
+#~ msgstr "Contenuti"
+
+#~ msgid "Diffs for"
+#~ msgstr "Differenze tra"
+
+#~ msgid "page rating"
+#~ msgstr "valutazione"
+
+#~ msgid "rating_score"
+#~ msgstr ""
+#~ "${score} con\n"
+#~ "  ${nb_votes} voti"
+
+#~ msgid "click to rate"
+#~ msgstr "clicca per dare un voto"
+
+#~ msgid "voting as"
+#~ msgstr "da parte di"
+
+#~ msgid "Here are the pages which link to"
+#~ msgstr "Queste sono le pagine che si riferiscono a"
+
+#~ msgid "box_canreparent"
+#~ msgstr ""
+#~ "Puoi anche riposizionare questa pagina nella gerarchia dei contenuti\n"
+#~ "impostandone la pagina <em>sovrastante</em>.  Attiva l'opzione o\n"
+#~ "inserisci il nuovo nome della pagina e clicca su Riposiziona.\n"
+#~ "Generalmente è sufficiente avere una sola pagina sovrastante."
+
+#~ msgid "Other parent"
+#~ msgstr "Altre pagine sovrastanti"

Added: zope-zwiki/branches/upstream/current/i18n/ja.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/ja.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/ja.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1723 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Zwiki 0.9.10\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-08-23 12:28+0000\n"
+"Last-Translator: jack <jack at jk.to>\n"
+"Language-Team: Japanese <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: ja\n"
+"Language-name: Japanese\n"
+"Preferred-encodings: utf-8\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr "全てのページをアップグレードする権限がありません"
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr "(フォルダ -> プロパティの管理)"
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "このページの名前を変更する権限がありません"
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "このページの名前を変更する権限がありません"
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+"匿名ユーザによる編集は許可されていません。まず、ユーザ設定をしてください。"
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr ""
+"このページのリペアレントやサブトピックリンクの変更をする権限がありません"
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr "このページのタイプ変更をする権限がありません"
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr "このページの編集権限がありません"
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr "このページの削除権限がありません"
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+"このページの名前は %s に変更されました。このページが不要であれば削除してもか"
+"まいません\n"
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr "ここにファイルをアップロードする権限がありません"
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr "このページにリンクを追加する権限がありません"
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr "禁止リンクにマッチ"
+
+#: src/ZWiki/Editing.py:830
+#, fuzzy
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr "問題(%s)が発生しました。サイトの管理者に連絡してください"
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr "最大匿名リンク数に到達しました"
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+#, fuzzy
+msgid "exceeded max_identified_links"
+msgstr "最大匿名リンク数に到達しました"
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr "匿名"
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr "どこからリンクされているでしょうか?"
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr "現在の位置"
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr "å¹´"
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr "å¹´"
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr "月"
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr "月"
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr "週"
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr "週"
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr "æ—¥"
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr "æ—¥"
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr "時間"
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr "時間"
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr "分"
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr "分"
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr "秒"
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr "秒"
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr "ページはロックされています"
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+"\n"
+"            このページはwebDAVによりロックされています。外部エディタにより\n"
+"            編集されていることが考えられます。その編集が終了してから、やり\n"
+"            直してください。あなたがなんらかの編集を完了している場合には、\n"
+"            参照用にバックアップ、コピーをすることもできます。\n"
+"            "
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr "修正するより、最初からやり直すほうがよいなら、「OK」をクリック"
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr "編集の衝突"
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr "あなたの編集中にだれかがこのページを更新しました"
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr "衝突を解消するために、以下のようにしてください"
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr "ブラウザの「戻る」ボタンをクリック"
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr "最後に編集した結果をクリップボードにコピーする"
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr "ブラウザの「更新」ボタンをクリック"
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr "ペーストし、最後にされた変更に注意しながら、編集しなおす"
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr "「変更」ボタンをクリック"
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr "または"
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr "修正するより、最初からやり直すほうがよいなら、「OK」をクリック"
+
+#: src/ZWiki/Views.py:490
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+"\n"
+"        0    これらのアクセスキーの割り当てを表示\n"
+"\n"
+"        wiki の機能:\n"
+"        f    フロントページを表示\n"
+"        c    wiki コンテンツを表示\n"
+"        r    新しい変更を表示\n"
+"             議論を表示\n"
+"        t    issue tracker を表示\n"
+"        i    wikiのインデックスを表示\n"
+"        o    wikiオプション(設定)を表示\n"
+"        h    ヘルプを表示\n"
+"        s    項目検索に行く\n"
+"        \n"
+"        ページの機能:\n"
+"        v    ページを見る\n"
+"        +    最大モードでページを見る\n"
+"        =    シンプルモードでページを見る\n"
+"        -    最小モードでページを見る\n"
+"        m    メールの講読\n"
+"        b    バックリンク(このページへのリンク)を表示\n"
+"        d    変更の表示(編集の履歴)\n"
+"        y    全ての履歴の表示(ZMIに行く)\n"
+"        e    ページの編集\n"
+"        x    外部エディタで編集\n"
+"             ページの印刷(含むサブトピック)\n"
+"        q    ページのソースを見る(クイック表示)\n"
+"             ページキャッシュを消去して再生成\n"
+"             サブトピックへ行く\n"
+"             コメント(メッセージ)へ行く\n"
+"             可能なら、ページ作者のホームページへ行く\n"
+"        n    次のページ\n"
+"        p    前のページ\n"
+"        u    親ページ\n"
+"        \n"
+"        編集フォーム内 :\n"
+"        s    変更の保存\n"
+"        \n"
+"        変更表示中:\n"
+"        n    次の変更\n"
+"        p    前の変更\n"
+"        "
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr "不明な Wiki タイプ"
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr "ページを作成"
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr "更新から %(interval)s 経過"
+
+#: src/ZWiki/ZWikiPage.py:809
+msgid "show last edit"
+msgstr "最後の更新を表示"
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr "編集者: %(editor)s"
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr "Zwiki アウトラインキャッシュを追加する必要はありません"
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+"ZMI の Add メニュー に\"Zwiki Outline Cache\"が現れますが\n"
+"        これは実装上の理由によるもので、直接追加する必要はありません。\n"
+"        必要になったときには自動的に作成されます\n"
+"        "
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr "コメント"
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr "\"=\" による \"%(token)\" のフォロー待ち"
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr "\"%(token)\"キーの値(value)待ち"
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr "新しいドロー\"%(filename)\" を作成"
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr "新しい添付ファイル\"%(filename)\"をアップロード"
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr "ドロー%(filename)を編集"
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr ""
+"\"%(key)s\" のあとの \"%(wanted)s\" 待ち、 \"%(token)s\"を取得してください"
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr "\"%(token)s\"の前の\"%(key)s\"には整数が必要です"
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr "\"%(key)s\"の後の\"%(arg)s\"には整数が必要です"
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr "\"%(key)s\"の後の\"%(arg)s\"には色の値が必要です"
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr "返信"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr "全ての履歴"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr "<< 前の変更"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr "次の変更 >>"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+#, fuzzy
+msgid "Revert this change and all successive changes"
+msgstr "これより後のすべての変更を取り消す"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+#, fuzzy
+msgid "plone"
+msgstr "更新記録"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+msgid "show all features"
+msgstr "全機能を表示"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr "詳細"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+msgid "show basic features"
+msgstr "基本的な機能を表示"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+msgid "simple"
+msgstr "シンプル"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr "最低限の機能のみ表示"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr "極小"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+msgid "subtopic"
+msgstr "追加"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+#, fuzzy
+msgid "for this page"
+msgstr "このwikiページを作成します"
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+msgid "title"
+msgstr "タイトル"
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr "問題点フィルタの設定"
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+#, fuzzy
+msgid "Issue browser"
+msgstr "Issue ブラウザ"
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+msgid "Issue tracker"
+msgstr "Issue tracker"
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "このページの編集権限がありません"
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr "分類"
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr "緊急度"
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr "状態"
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+msgid "age"
+msgstr "作成後の経過時間"
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr "変更後の経過時間"
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr "新しい問題点の登録:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr "名前:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr "分類:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr "緊急度:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr "状態:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+msgid "Here are the wiki's issue pages."
+msgstr "Wikiの問題点一覧ページです。"
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr "詳細:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr "問題点の登録"
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr "詳細な"
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr "IssueTracker"
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+msgid "search options"
+msgstr "検索オプション"
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr "名前フィルタ(以下の用語を名前に含む):"
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr "ページテキストフィルタ(以下の用語を含む):"
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr "分類:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+msgid "Severities:"
+msgstr "緊急度:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr "状態:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+#, fuzzy
+msgid "Enter a search term, click the numbers to the right,"
+msgstr "検索用語をテキストボックスに入力、または右の数字をクリック、あるいは"
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr "投稿者:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+msgid "Name"
+msgstr "名前"
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr "分類"
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+msgid "filter issues"
+msgstr "問題点フィルタの設定をしてください"
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr "緊急度"
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr "状態"
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+#, fuzzy
+msgid "Optional subject"
+msgstr "オプションの題名"
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+#, fuzzy
+msgid "Optional comment"
+msgstr "オプションのコメント"
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "ZWikiページの新規作成"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+#, fuzzy
+msgid "Id:"
+msgstr "Id"
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+#, fuzzy
+msgid "Title:"
+msgstr "タイトル"
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+#, fuzzy
+msgid "Template:"
+msgstr "悪いテンプレート"
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "ZWikiページの新規作成"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+#, fuzzy
+msgid "browse open issues"
+msgstr "開かれている issue を見る"
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr "最近変更されたページ:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr "最新の変更されたページ(要約付き)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr "要約を表示する"
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr "最新情報に更新"
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr "ページ"
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr "編集者"
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr "時間"
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr "NEW"
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr "(NEW)マークのついたページは一週間以内に作成されたページです。"
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr "問題点の検索"
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr "検索したい言葉やフレーズを入力してEnterを押すとWiki全体を検索します。"
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr "ここは右上の検索フィールドを使うのと同じです"
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr ""
+"ヒント: ページ名にマッチさせたい場合には一語の言葉を使うと確率が上がります。"
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+"大文字小文字を区別や、ワイルドカードのサポートはZCatalogの設定に依存します"
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr "すべてのページを一覧にする場合には検索用語を空欄にします。"
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr "検索"
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr "ページ名の一致"
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr "テキストの一致"
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+#, fuzzy
+msgid "Thorough (non-catalog) search for text matching"
+msgstr "(カタログベースでない)全文テキスト検索"
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+msgid "recent"
+msgstr "現在"
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr "このWikiでのユーザ設定を行います:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr "ユーザ名:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr "(編集者を識別するのに使用します)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+msgid "Email address:"
+msgstr "メールアドレス:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+msgid "(allows mail subscription)"
+msgstr "(メールで変更の通知を受け取れるようにします)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr "タイムゾーン:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr "(時間表示をユーザのタイムゾーンに合わせます。日本はGMT+0900です)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr "編集フォームの行数:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr "(フォームのサイズを変更します)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr "設定を保存する"
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr "すべて"
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr "設定を消去する"
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr "ZWikiページの新規作成"
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+#, fuzzy
+msgid "Page&nbsp;name:"
+msgstr "ページ名"
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "ZWikiページの新規作成"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+#, fuzzy
+msgid "Topic"
+msgstr "追加"
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr "最終更新"
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+#, fuzzy
+msgid "Comments"
+msgstr "コメント"
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+#, fuzzy
+msgid "Views"
+msgstr "表示"
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+#, fuzzy
+msgid "Created"
+msgstr "作成済み"
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr "by"
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr "<dtml-var lasteditinterval> 前</dtml-var>"
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr "on"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+#, fuzzy
+msgid "Subtopics"
+msgstr "サブトピック"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr "サブトピックはありません"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+#, fuzzy
+msgid "Here are it's subtopics."
+msgstr "サブトピック一覧です"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr "「^」ボタンをクリックして順序を変えることができます"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+#, fuzzy
+msgid "Related pages"
+msgstr "ページを作成"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+#, fuzzy
+msgid "Parents"
+msgstr "親,"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr "は上位レベルのトピックです"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr "は以下の下位トピックです:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+#, fuzzy
+msgid "Backlinks"
+msgstr "バックリンク"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr "ここにリンクしているページ群:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+#, fuzzy
+msgid "No other pages link to this one."
+msgstr "どこからリンクされているでしょうか?"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr "全てのページの階層の中から、このページの親を設定することができます"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+"最初の数文字を入力して下さい。なお、大文字/小文字や句読点は同一視されます"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr "Reparent"
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr "悪いテンプレート"
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+#, fuzzy
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+"Wikiのスキンテンプレートのどれかに問題があります。同じIDのページか、他のペー"
+"ジテンプレートでもdtml-method でもないオブジェクトがあるか、あいまいなテンプ"
+"レートです。またはファイルシステム上にテンプレートがみつかりません(インストー"
+"ルが不完全です)。"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr "題名"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr "題名はスレッドや最近の更新をわかりやすくします"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr "返信する"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+"コメントを書いて「コメントを追加」を押すと追記されます(変更通知も送信されま"
+"す)"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr "人の購読者"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr "1 人の購読者"
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr "コメントの追加"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr "Wiki コンテンツ"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr "Singletons"
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr "許可されていない"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+#, fuzzy
+msgid "Edit history"
+msgstr "履歴の編集"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+#, fuzzy
+msgid "Edit:"
+msgstr "編集"
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+#, fuzzy
+msgid "Manage"
+msgstr "変更"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+#, fuzzy
+msgid "Revert this and later edits"
+msgstr "これより後のすべての変更を取り消す"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr "ページに戻る"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+#, fuzzy
+msgid "Time:"
+msgstr "時間"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+#, fuzzy
+msgid "Note:"
+msgstr "名前:"
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr "ソース/WYSIWYGモードを切り替える"
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr "変更の概要"
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr "noteは変更の記録としてRecentChangeに表示されます"
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr "ファイルや画像のアップロード"
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr "ファイルをアップロードしてこのページにリンクを置きますか?"
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr "編集のヘルプは"
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr "HelpPage"
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr "TextFormattingRules"
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "preview this edit"
+msgstr "編集内容を確認します"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr "プレビュー"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr "編集をキャンセルして前のページに戻ります"
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr "作成"
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr "このwikiページを作成します"
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+#, fuzzy
+msgid "label_preview"
+msgstr "プレビュー"
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr "ページ名"
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr "このwikiページの名前です(変更するには時間がかかります!)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr "タイプ"
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr "このページのフォーマットと描画スタイルを選択してください"
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr "(ExternalEditor)"
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr "ホーム"
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr "最近の変更を表示"
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr "最近の変更"
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr "議論ページを表示"
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr "è­°è«–"
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr "問題追跡を表示"
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr "問題"
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr "目次を表示"
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr "目次"
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr "索引を表示"
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr "索引"
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr "アップロードページを表示"
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr "アップロード"
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr "ヘルプを表示"
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr "ヘルプ"
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr "設定を表示"
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr "設定"
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr "逆リンク"
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr "このページやサイト全体の購読のためのE-Mailアドレスを設定"
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr "購読"
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr "このページの変更履歴を表示"
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr "FrontPageを表示"
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr "差分"
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr "編集"
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr "ExternalEditorを使って編集"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr "ホームページへ移動"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr "全ページ検索"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr "新規"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+msgid "parent,"
+msgstr "親,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr "名前,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+msgid "replacement,"
+msgstr "削除,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+#, fuzzy
+msgid "page"
+msgstr "作成後の経過時間"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+"ページ名を入力して実行したい内容のボタンを押してください(マウスをボタンに重ね"
+"るとヘルプが表示されます)"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+#, fuzzy
+msgid "reparent"
+msgstr "Reparent"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "make this page a subtopic of the page you have entered"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+#, fuzzy
+msgid "rename"
+msgstr "名前,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+#, fuzzy
+msgid "create"
+msgstr "作成"
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+#, fuzzy
+msgid "Recent changes"
+msgstr "最近の変更"
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+#, fuzzy
+msgid "Search this wiki"
+msgstr "このwikiからの検索"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+#, fuzzy
+msgid "all edits"
+msgstr "編集"
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr "現在あなたはこのWiki全体を講読しています"
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr "Wiki全体の変更の通知は設定されていません。"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr "メール講読"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr "Wiki全体の変更通知を解除"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr "Wiki全体の変更を通知"
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr "通知を設定している他のページ"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr "ページ講読者"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr "Wiki 講読者"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+#, fuzzy
+msgid "subscribe_desc_comments"
+msgstr ""
+"このページまたは wiki 全体を講読することができます\n"
+"        講読者になると、コメントのコピーをメールで受けとれます\n"
+"        (但し、サイト管理者によって許可されている場合以外には一般的は編集によ"
+"るものは含まれません)        Or return to(未訳)"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+#, fuzzy
+msgid "subscribe_desc_edits"
+msgstr ""
+"このページまたは wiki 全体を講読することができます\n"
+"        講読者になると、コメントのコピーをメールで受けとれます\n"
+"        (但し、サイト管理者によって許可されている場合以外には一般的は編集によ"
+"るものは含まれません)        Or return to(未訳)"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr "メールアドレス"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr "変更"
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr "講読するために、メールアドレスを設定してください"
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr "現在あなたはこのページを講読しています"
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr "現在あなたはこのページを講読していません"
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr " このページの購読を解除 "
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr " このページを購読 "
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+#, fuzzy
+msgid "User options"
+msgstr "検索オプション"
+
+#~ msgid "your edit contained a banned link pattern"
+#~ msgstr "禁止リンクパターンが編集内容に含まれています"
+
+#~ msgid "adding of external links by anonymous authors is restricted"
+#~ msgstr "匿名ユーザによる外部リンクの追加は制限されています"
+
+#~ msgid "Add a ZWiki web"
+#~ msgstr "ZWikiウェブの新規作成"
+
+#~ msgid "Type"
+#~ msgstr "種類"
+
+#~ msgid "Create wiki"
+#~ msgstr "Wikiの新規作成"
+
+#~ msgid "and enter"
+#~ msgstr "Wikiページ作成後に表示する"
+
+#~ msgid ""
+#~ "You may create a new ZWiki Page object using the form below. You may also "
+#~ "choose to upload an existing html file from your local computer by "
+#~ "clicking the <i>Browse</i> button."
+#~ msgstr ""
+#~ "下のフォームを使って新規のZWikiページオブジェクトを作成することができま"
+#~ "す。<i>参照...</i>ボタンをクリックすると、ローカルコンピュータの既存のHTML"
+#~ "ファイルをアップロードすることもできます。"
+
+#~ msgid "File"
+#~ msgstr "ファイル"
+
+#~ msgid "Add"
+#~ msgstr "新規作成"
+
+#~ msgid "Add and Edit"
+#~ msgstr "作成後すぐに編集"
+
+#~ msgid "log_note"
+#~ msgstr "更新記録"
+
+#~ msgid "Backlinks for"
+#~ msgstr "このページへのリンク:"
+
+#~ msgid "singleton_desc"
+#~ msgstr "Singleton とは他のページとリンクされていないページです。"
+
+#~ msgid "History for"
+#~ msgstr "履歴:"
+
+#~ msgid "return to page"
+#~ msgstr "ページに戻る"
+
+#~ msgid "help_shortname"
+#~ msgstr ""
+#~ "注: 大規模なwikiでページの名前を変更するのは時間がかかることがあります。他"
+#~ "のページも可能なら変更されます。"
+
+#~ msgid "label_body_text"
+#~ msgstr "本文"
+
+#~ msgid "help_wikibody"
+#~ msgstr ""
+#~ "Wikiページの中では [カギかっこ] でリンクを作成できます。ページを保存すると"
+#~ "カギ括弧の\n"
+#~ "内容に<code>?</code>が付いたリンクが表示されるので、クリックするとその名前"
+#~ "でページを\n"
+#~ "作成します。(訳注:英数字以外を使う場合はパッチが必要な場合もあります)"
+
+#~ msgid "help_wikiwords"
+#~ msgstr "WikiWordsでのリンクの仕組みもサポートされています。"
+
+#~ msgid "label_note"
+#~ msgstr "バージョン説明(任意)"
+
+#~ msgid "help_wikinote"
+#~ msgstr "この変更についての簡単な説明を書きます。"
+
+#~ msgid "label_upload_contents_optional"
+#~ msgstr "ファイル・画像のアップロード (任意)"
+
+#~ msgid "help_wikiupload"
+#~ msgstr "ファイル・画像をこのwikiページに添付します。"
+
+#~ msgid "label_format"
+#~ msgstr "フォーマット"
+
+#~ msgid "help_format"
+#~ msgstr ""
+#~ "どのフォーマットにするかわからない場合は、平文テキストを選んで普通に入力し"
+#~ "ます。"
+
+#~ msgid "Save"
+#~ msgstr "保存"
+
+#~ msgid "heading_edit_wiki_page"
+#~ msgstr "${itemtype} \"${pagename}\" の編集"
+
+#~ msgid "description_edit_wiki_page"
+#~ msgstr "Wiki Page は相互リンクしているページを作ることができます。"
+
+#~ msgid "legend_wiki_page_details"
+#~ msgstr "Wiki Page 詳細"
+
+#~ msgid "label_pagename"
+#~ msgstr "ページ名"
+
+#~ msgid "Required"
+#~ msgstr "必須入力"
+
+#~ msgid "label_required"
+#~ msgstr "(å¿…é ˆ)"
+
+#~ msgid "heading_wiki_recent_changes"
+#~ msgstr "最近の更新"
+
+#~ msgid "heading_wiki_search_wiki"
+#~ msgstr "Wikiを検索"
+
+#~ msgid "Unsubscribe from this page"
+#~ msgstr "このページの講読を解除する"
+
+#~ msgid "Subscribe to this page"
+#~ msgstr "このページを講読する"
+
+#~ msgid "heading_wiki_user_options"
+#~ msgstr "ユーザオプション"
+
+#, fuzzy
+#~ msgid "add a comment"
+#~ msgstr "コメントの追加"
+
+#~ msgid "heading_wiki_filter_issues"
+#~ msgstr "問題の絞り込み"
+
+#, fuzzy
+#~ msgid "heading_wiki_issue_browser"
+#~ msgstr "Issue tracker"
+
+#~ msgid "heading_wiki_issue_tracker"
+#~ msgstr "Issue tracker"
+
+#, fuzzy
+#~ msgid "property change"
+#~ msgstr "最近の変更を表示"
+
+#~ msgid "backlinks_reparent_help"
+#~ msgstr ""
+#~ "このページをコンテンツの階層の中でどこに配置させるかを決めるために、親を設"
+#~ "定\n"
+#~ "することもできます。チェックボックスで選択するか、他の親ページ名を入力"
+#~ "し、\n"
+#~ "「Reparent」をクリックしてください。普通、親ページは一つで充分です"
+
+#, fuzzy
+#~ msgid "backlinks_reparent_help2"
+#~ msgstr ""
+#~ "このページをコンテンツの階層の中でどこに配置させるかを決めるために、親を設"
+#~ "定\n"
+#~ "することもできます。チェックボックスで選択するか、他の親ページ名を入力"
+#~ "し、\n"
+#~ "「Reparent」をクリックしてください。普通、親ページは一つで充分です"
+
+#, fuzzy
+#~ msgid "View"
+#~ msgstr "表示"
+
+#, fuzzy
+#~ msgid "Comment"
+#~ msgstr "コメント"
+
+#, fuzzy
+#~ msgid "A Comment"
+#~ msgstr "コメント"
+
+#, fuzzy
+#~ msgid "Table of Contents"
+#~ msgstr "目次"
+
+#, fuzzy
+#~ msgid "A Wiki"
+#~ msgstr "ZWikiページの新規作成"
+
+#, fuzzy
+#~ msgid "Subscriptions"
+#~ msgstr "メール講読"
+
+#, fuzzy
+#~ msgid "Change Wiki Page"
+#~ msgstr "ZWikiページの新規作成"
+
+#, fuzzy
+#~ msgid "Wiki User"
+#~ msgstr "Wiki 講読者"
+
+#, fuzzy
+#~ msgid "A Wiki Page"
+#~ msgstr "ZWikiページの新規作成"
+
+#, fuzzy
+#~ msgid "Wiki Page"
+#~ msgstr "ZWikiページの新規作成"
+
+#, fuzzy
+#~ msgid "A Wiki Page Comment"
+#~ msgstr "ZWikiページの新規作成"
+
+#, fuzzy
+#~ msgid "Wiki Page Comment"
+#~ msgstr "Wiki コンテンツ"
+
+#, fuzzy
+#~ msgid "View a Wiki Page"
+#~ msgstr "ZWikiページの新規作成"
+
+#, fuzzy
+#~ msgid "View Wiki Page"
+#~ msgstr "ZWikiページの新規作成"
+
+#, fuzzy
+#~ msgid "Edit Wiki Page"
+#~ msgstr "ZWikiページの新規作成"
+
+#, fuzzy
+#~ msgid "Delete Wiki Page"
+#~ msgstr "ZWikiページの新規作成"
+
+#, fuzzy
+#~ msgid "Reparent Wiki Page"
+#~ msgstr "ZWikiページの新規作成"
+
+#~ msgid "page in parent wiki"
+#~ msgstr "親wikiページ中"
+
+#~ msgid "File Uploads"
+#~ msgstr "アップロードされているファイル"
+
+#~ msgid "uploads_desc"
+#~ msgstr "このページはこのWikiにアップロードされたファイルの一覧です"
+
+#~ msgid "save"
+#~ msgstr "保存"
+
+#~ msgid "view"
+#~ msgstr "表示"
+
+#~ msgid "no_files_uploaded"
+#~ msgstr "ファイルはアップロードされていません"
+
+#~ msgid "box_wiki_navigation"
+#~ msgstr "Wiki ナビゲーション"
+
+#~ msgid "enter comments here and click add; or, click edit"
+#~ msgstr ""
+#~ "ここにコメントを入れ、「コメントの追加」をクリックするか、「編集」をクリッ"
+#~ "クしてください"
+
+#~ msgid "Details & comments"
+#~ msgstr "詳細とコメント"
+
+#~ msgid "hits"
+#~ msgstr "ヒット"
+
+#~ msgid ""
+#~ "no catalog or the catalog search gave an error, a brute-force search was "
+#~ "used"
+#~ msgstr "カタログがないかエラーのため、全数検索が使われました"
+
+#~ msgid "Contents"
+#~ msgstr "目次"
+
+#~ msgid "Diffs for"
+#~ msgstr "Diffs for"
+
+#~ msgid "page rating"
+#~ msgstr "ページの評価"
+
+#~ msgid "rating_score"
+#~ msgstr "評価点"
+
+#~ msgid "click to rate"
+#~ msgstr "クリックして評価"
+
+#~ msgid "voting as"
+#~ msgstr "投票:"
+
+#~ msgid "Here are the pages which link to"
+#~ msgstr "このページのリンク先"
+
+#~ msgid "box_canreparent"
+#~ msgstr ""
+#~ "このページをコンテンツの階層の中でどこに配置させるかを決めるために、\n"
+#~ "    <em>親</em>を設定することもできます。チェックボックスで選択するか\n"
+#~ "    他の親ページ名を入力し、「Reparent」をクリックしてください。普通、\n"
+#~ "    親ページは一つで充分です"
+
+#~ msgid "Other parent"
+#~ msgstr "他の親"

Added: zope-zwiki/branches/upstream/current/i18n/nl.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/nl.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/nl.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1574 @@
+# translation of zwiki-nl.po to Nederlands
+# translation of nl.po to Nederlands
+# translation of zwiki.po to Nederlands
+# Jaap Noordzij <jaap at jaapnoordzij.nl>, 2004.
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki-nl\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-03-06 16:08+0000\n"
+"Last-Translator: Frank laurijssens <frank at laurijssens.nl>\n"
+"Language-Team: <zwiki at zwiki.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: zope/app/translation_files/extract.py\n"
+"Language-code: nl\n"
+"Language-name: Nederlands\n"
+"Preferred-encodings: utf-8 latin1\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr "U bent niet gemachtigd om alle pagina's te vernieuwen"
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr "Eigenschappen"
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "U bent niet gemachtigd om deze Wiki pagina te verwijderen"
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+#, fuzzy
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "U bent niet gemachtigd om deze Wiki pagina te verwijderen"
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+"Sorry, deze wiki staat geem bewerkingen toe door anonieme gebruikers. "
+"Configureer eerst een gebruikersnaam bij opties."
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr ""
+"U bent niet gemachtigd om een nieuwe ouder te kiezen of om sub-onderwerp "
+"links te wijzigen in deze Wiki"
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr "U bent niet gemachtigd om het pagina type in deze Wiki te wijzigen"
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr "U bent niet gemachtigd om deze Wiki pagina te wijzigen"
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr "U bent niet gemachtigd om deze Wiki pagina te verwijderen"
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+"Deze pagina is hernoemd naar %s. U kunt deze pagina verwijderen als hij niet "
+"meer nodig is\n"
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr "U bent niet gemachtigd om hier bestanden te laden"
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr "U bent niet gemachtigd om een link aan deze ZWiki pagina toe te voegen"
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr "Je wijziging bevatte een verboden link"
+
+#: src/ZWiki/Editing.py:830
+#, fuzzy
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr ""
+"Er was een probleem: %s. Neem contact op met de site beheerder voor hulp."
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr "max_anonymous_links overschreden"
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+#, fuzzy
+msgid "exceeded max_identified_links"
+msgstr "max_anonymous_links overschreden"
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr "anoniem"
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr "Welke pagina's linken naar deze ?"
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr "U bent hier"
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr "jaren"
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr "jaar"
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr "maand"
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr "maanden"
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr "weken"
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr "week"
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr "dag"
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr "dagen"
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr "uren"
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr "uur"
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr "minuut"
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr "minuten"
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr "seconde"
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr "seconden"
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr "Pagina is geblokkeerd"
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+"\n"
+"            Deze pagina heeft een webDAV blokkering. Iemand wijzigt hem "
+"waarschijnlijk\n"
+"            met een externe editor.  U moet wachten totdat men gereed is \n"
+"            en het dan opnieuw proberen.  Wanneer U zojuist wijzigingen hebt "
+"gemaakt,\n"
+"            zult u waarschijnlijk terug willen gaan en de wijzigingen "
+"kopiëren naar het\n"
+"            klembord om ze later te kunnen toevoegen.\n"
+"            "
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr ""
+"Klik op OK om uw wijzigingen te laten voor wat ze zijn en het opnieuw te "
+"proberen"
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr "Conflict bij bewerken"
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr "Iemand anders heeft deze pagina opgeslagen terwijl u hem wijzigde"
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr "Doe het volgende om het conflict op te lossen"
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr "Klik op de terug-toets van uw browser"
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr "Kopieer uw recente wijzigingen naar het klembord"
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr "Klik de verversen-knop van uw browser"
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr "Plak uw wijzigingen opnieuw in, let op de laatste wijzigingen"
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr "Klik opnieuw op de wijzigen-knop"
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr "of"
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr "Om uw wijzigingen te laten vervallen, klik op OK"
+
+#: src/ZWiki/Views.py:490
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+"\n"
+"        0    toon deze sneltoets koppelingen\n"
+"\n"
+"        wiki functies:\n"
+"        f    laat voorpagina zien\n"
+"        c    laat wiki inhoud zien\n"
+"        r    laat recente wijzigingen zien\n"
+"             laat discussie zien\n"
+"        t    laat issue logboek zien\n"
+"        i    laat wiki index zien\n"
+"        o   laat wiki opties zien (voorkeuren)\n"
+"        h    laat help pagina zien\n"
+"        s    ga naar zoekveld\n"
+"        \n"
+"        pagina functies:\n"
+"        v    laat pagina zien\n"
+"        +    laat volledige pagina zien\n"
+"        =    laat eenvoudige pagina zien\n"
+"        -    laat minimale pagina zien\n"
+"        m    e-mail abonnement\n"
+"        b    laat terugverwijzingen zien\n"
+"        d    laat historie zien\n"
+"        y    laat volledige historie zien (in ZMI)\n"
+"        e    pagina bewerken \n"
+"        x    bewerken met een externe editor\n"
+"             pagina afdrukken (en sub-onderwerpen)\n"
+"        q    pagina bron laten zien\n"
+"             de cache voor deze pagina wissen en opnieuw genereren\n"
+"             ga naar sub-onderwerpen\n"
+"             ga naar opmerkingen\n"
+"             ga naar ledenpagina indien mogelijk\n"
+"        n    volgende pagina\n"
+"        p    vorige pagina\n"
+"        u    omhoog\n"
+"        \n"
+"        in bewerkformulier:\n"
+"        s    wijzigingen opslaan\n"
+"        \n"
+"        bij het bekijken van historie:\n"
+"        n    volgende wijziging\n"
+"        p    vorige wijziging\n"
+"        "
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr "Onbekend wiki type"
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr "maak deze pagina"
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr "laatst gewijzigd %(interval)s geleden"
+
+#: src/ZWiki/ZWikiPage.py:809
+msgid "show last edit"
+msgstr "toon laatste wijziging"
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr "door %(editor)s"
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr "Het is niet nodig een Zwiki Outline Cache toe te voegen"
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+"Zwiki Outline Cache staat in het Add menu in de ZMI\n"
+"        om technische redenen, maar dit doet u niet met de hand.\n"
+"        Zwiki maakt deze automatisch aan als dat nodig is.\n"
+"        "
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr "opmerkingen"
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr "Verwacht \"=\" na \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr "Verwacht een waarde voor sleutel \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr "Maak nieuwe tekening \"%(filename)s\""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr "Upload nieuwe bijlage \"%(filename)s\""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr "Bewerk tekening %(filename)s"
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr "Er werd \"%(wanted)s\" na \"%(key)s\" verwacht, er kwam \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr "Verwachtte een geheel getal \"%(key)s\" voor \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr "Verwachtte een geheel getal \"%(arg)s\" na \"%(key)s\""
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr "Verwachtte een kleurwaarde \"%(arg)s\" na \"%(key)s\""
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr "antwoord"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr "volledige historie"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr "<< vorige wijziging"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr "volgende wijziging >>"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+#, fuzzy
+msgid "Revert this change and all successive changes"
+msgstr "Maak deze en latere wijzigingen ongedaan"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+#, fuzzy
+msgid "plone"
+msgstr "Aantekening:"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+#, fuzzy
+msgid "show all features"
+msgstr "doorzoek all pagina's"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+#, fuzzy
+msgid "show basic features"
+msgstr "toon laatste wijziging"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+#, fuzzy
+msgid "simple"
+msgstr "Bestand"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+#, fuzzy
+msgid "subtopic"
+msgstr "Sub-onderwerpen"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+#, fuzzy
+msgid "for this page"
+msgstr "maak deze pagina"
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+#, fuzzy
+msgid "title"
+msgstr "Titel"
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr "Filter issues"
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+msgid "Issue browser"
+msgstr "Issue browser"
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+msgid "Issue tracker"
+msgstr "Issue logboek"
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "U bent niet gemachtigd om deze Wiki pagina te wijzigen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr "categorie"
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr "ernst"
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr "status"
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+msgid "age"
+msgstr "leeftijd"
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr "gewijzigd"
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr "Voeg een nieuw issue toe:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr "Naam:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr "Categorie:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr "Ernst:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr "Status:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+msgid "Here are the wiki's issue pages."
+msgstr "Dit zijn de issue pagina's van deze wiki."
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr "Details:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr "issue toevoegen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr "Geavanceerdere"
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr "Issue logboek"
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+msgid "search options"
+msgstr "zoekopties"
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr "Naam bevat één of meer van:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr "Pagina bevat één of meer van:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr "Categorieën:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+msgid "Severities:"
+msgstr "Ernst:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr "Status:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+#, fuzzy
+msgid "Enter a search term, click the numbers to the right,"
+msgstr "Voer een zoekterm in, of klik op de getallen rechts, of"
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr "Ingevoerd door:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+msgid "Name"
+msgstr "Naam"
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr "Categorie"
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+msgid "filter issues"
+msgstr "filter issues"
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr "Ernst"
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr "Status"
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+msgid "Optional subject"
+msgstr "Optioneel onderwerp"
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+msgid "Optional comment"
+msgstr "Optionele aantekening over deze wijziging"
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "Voeg ZWiki pagina toe"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+#, fuzzy
+msgid "Id:"
+msgstr "Id"
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+#, fuzzy
+msgid "Title:"
+msgstr "Titel"
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "Voeg ZWiki pagina toe"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr "Pagina's die zijn gewijzigd in de laatste"
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr "Recent gewijzigde pagina's met samenvattingen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr "Toon samenvattingen ?"
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr "Verversen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr "Pagina"
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr "Gewijzigd&nbsp;door"
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr "Tijd"
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr "NIEUW"
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr ""
+"Pagina's die zijn gemarkeerd als (NIEUW) zijn in de afgelopen week gemaakt"
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr "zoek issues"
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr "Geef een woord of een zin en toets Enter om de wiki te doorzoeken."
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr "Dit werkt hetzelfde als het gebruik van het zoekveld rechtsboven."
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr "Een enkel woord werkt het best voor het zoeken naar paginanamen."
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+"Case-onafhankelijkheid of wildcards kunnen ondersteund zijn, afhankelijk van "
+"de Catalog instellingen."
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr "Leeg laten om alle pagina's te tonen."
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr "Zoeken"
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr "Paginanamen die overeenkomen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr "Tekst overeenkomsten"
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr "Grondige zoekactie (zonder catalogus) voor tekstvergelijking"
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+msgid "recent"
+msgstr "recent"
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr "Geef hier uw voorkeurinstellingen voor deze wiki aan:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr "Gebruikersnaam:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr "(laat uw wijzigingen zien)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+msgid "Email address:"
+msgstr "E-mail adres:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+msgid "(allows mail subscription)"
+msgstr "(staat e-mail abonnement toe)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr "Uw tijdzone:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr "(maakt de meeste tijden lokaal)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr "Bewerk formulierhoogte:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr "(past formuliergrootte aan)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr "Bewaar deze opties"
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr "alles"
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr "Negeer deze opties"
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr "Voeg ZWiki pagina toe"
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+#, fuzzy
+msgid "Page&nbsp;name:"
+msgstr "Paginanaam"
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "Voeg ZWiki pagina toe"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+msgid "Topic"
+msgstr "Onderwerp"
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr "Laatst bijgewerkt"
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+msgid "Comments"
+msgstr "Opmerkingen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+msgid "Views"
+msgstr "Gezichtspunten"
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+msgid "Created"
+msgstr "Gemaakt"
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr "Nummer"
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr "door"
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr "<dtml-var lastEditInterval> geleden</dtml-var>"
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr "op"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+msgid "Subtopics"
+msgstr "Sub-onderwerpen"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr "Deze pagina heeft geen sub-onderwerpen."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+#, fuzzy
+msgid "Here are it's subtopics."
+msgstr "Dit zijn de sub-onderwerpen:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+#, fuzzy
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr ""
+"U kunt de volgorde van de sub-onderwerpen aanpassen door op de ^ knoppen te "
+"klikken."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+#, fuzzy
+msgid "Related pages"
+msgstr "maak deze pagina"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+msgid "Parents"
+msgstr "Ouders"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr "is een top-niveau onderwerp"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr "is een sub-onderwerp van:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+msgid "Backlinks"
+msgstr "Terugverwijzingen"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr "Dit zijn de pagina's die hiernaar verwijzen:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+msgid "No other pages link to this one."
+msgstr "Geen enkele pagina verwijst naar deze pagina."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr "Nieuwe ouder"
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+"Er was een probleem met een van de \"skin\" templates. Het kan zijn dat er "
+"een object bestaat met een template ID dat geen pagina-template of DTML "
+"Method is, of het template ontbreekt."
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr "onderwerp"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr ""
+"een onderwerp helpt ter verduidelijking van doorverwijzingen en recente "
+"wijzigingen"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr "antwoorden"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+"geef commentaar (met cc aan abonnees): voer de tekst in en klik op toevoegen"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr "${nb} abonnees"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr "1 abonnee"
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr "voeg opmerking toe"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr "Wiki inhoud"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr "Eenlingen"
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr "NIet toegestaan"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+#, fuzzy
+msgid "Edit history"
+msgstr "volledige historie"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+#, fuzzy
+msgid "Edit:"
+msgstr "bewerken"
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+#, fuzzy
+msgid "Manage"
+msgstr "Wijzig"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+#, fuzzy
+msgid "Revert this and later edits"
+msgstr "Maak deze en latere wijzigingen ongedaan"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr "Keer terug naar de pagina"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+#, fuzzy
+msgid "Time:"
+msgstr "Tijd"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+#, fuzzy
+msgid "Note:"
+msgstr "Naam:"
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr "schakel bron/WYSIWYG toestand"
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr "Optionele aantekening over deze wijziging"
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr "een aantekening maakt de Recente Wijzigingen beter bruikbaar"
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr "Laad een bestand of een afbeelding"
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr "laad een bestand en verwijs ernaar op deze pagina ?"
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr "Voor hulp met bewerken zie"
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr "HelpPage"
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr "TextFormattingRules"
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "preview this edit"
+msgstr "laat voorbeeld zien"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr "Voorbeeld"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr "Opheffen"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr "verlaat deze wijziging en keer terug naar de pagina"
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr "Maken"
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr "maak deze wiki pagina"
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+msgid "label_preview"
+msgstr "VOORBEELD"
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr "Paginanaam"
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr "de naam van deze pagina (deze wijziging kan lang duren !)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr "type"
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr "kies de formattering en opmaak stijl voor deze pagina"
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr "(externe editor)"
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr "start"
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr "toon de recente wijzigingen in de wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr "wijzigingen"
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr "toon discussie pagina"
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr "discussie"
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr "toon het issue logboek"
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr "issues"
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr "toon de wiki inhoud"
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr "inhoud"
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr "toon de wiki index"
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr "index"
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr "toon geladen bestanden"
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr "laden"
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr "toon de helppagina"
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr "help"
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr "toon de wiki opties"
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr "opties"
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr "terugverwijzingen"
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr "configureer e-mail abonnement op deze pagina of op deze site"
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr "abonnement"
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr "toon de wijzigingen-historie van deze pagina"
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr "toon de startpagina"
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr "verschil"
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr "bewerken"
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr "bewerk met behulp van de externe editor"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr "ga naar de startpagina"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr "doorzoek all pagina's"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr "nieuwe"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+msgid "parent,"
+msgstr "ouder,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr "naam,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+msgid "replacement,"
+msgstr "vervanging,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+msgid "page"
+msgstr "pagina"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+"voer een paginanaam in en klik op de knoppen rechts (wijs de knoppen aan met "
+"de muis voor hulp)"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "reparent"
+msgstr "nieuwe ouder"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "make this page a subtopic of the page you have entered"
+msgstr "geef deze pagina als nieuwe ouder de pagina die u hebt opgegeven"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+"hernoem deze pagina naar de naam die u hebt opgegeven. Alle verwijzingen "
+"worden bijgewerkt."
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename"
+msgstr "nieuwe naam"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr "verwijder!"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr ""
+"verwijder deze pagina, en leid links om naar de pagina die u hebt opgegeven, "
+"indien van toepassing"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+"maak een nieuwe pagina met de naam die u hebt opgegeven, als een sub-"
+"onderwerp van deze pagina"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create"
+msgstr "aanmaken"
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+msgid "Recent changes"
+msgstr "Recente wijzigingen"
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+msgid "Search this wiki"
+msgstr "Zoek in deze wiki"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+msgid "all edits"
+msgstr "alle wijzigingen"
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr "U bent op dit moment geabonneerd<br/>"
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr "U bent op dit moment niet geabonneerd <br/>"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr "Mail abonnement"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr "Zeg het abonnement op de complete wiki op"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr "Neem een abonnement op de complete wiki"
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr "U bent geabonneerd op deze andere pagina's"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr "Pagina abonnees"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr "Wiki abonnees"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+msgid "subscribe_desc_comments"
+msgstr ""
+"U kunt zich op deze pagina of op de hele wiki abonneren. Abonnees ontvangen "
+"een afschrift van opmerkingen die worden toegevoegd. Of keer terug naar"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+msgid "subscribe_desc_edits"
+msgstr ""
+"Als u zich op wijzingingen abonneert, krijgt u van alle paginawijzigingen "
+"bericht."
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr "Uw e-mail adres"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr "Wijzig"
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr "Om te abonneren moet u een e-mail adres opgeven."
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr "U bent geabonneerd <br/>"
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr "U bent op dit moment niet geabonneerd<b/>"
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr " Abonnement opzeggen op deze pagina "
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr " Neem een abonnement op deze pagina "
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+#, fuzzy
+msgid "User options"
+msgstr "zoekopties"
+
+#~ msgid "your edit contained a banned link pattern"
+#~ msgstr "uw wijziging bevat een link met een niet toegestaan patroon"
+
+#~ msgid "adding of external links by anonymous authors is restricted"
+#~ msgstr ""
+#~ "het toevoegen van externe links door anonieme gebruikers is ingeperkt"
+
+#~ msgid "Add a ZWiki web"
+#~ msgstr "Voeg een ZWiki web toe"
+
+#~ msgid "Type"
+#~ msgstr "Type"
+
+#~ msgid "Create wiki"
+#~ msgstr "Creëer een wiki"
+
+#~ msgid "and enter"
+#~ msgstr "en voeg toe"
+
+#~ msgid ""
+#~ "You may create a new ZWiki Page object using the form below. You may also "
+#~ "choose to upload an existing html file from your local computer by "
+#~ "clicking the <i>Browse</i> button."
+#~ msgstr ""
+#~ "U kunt een nieuwe ZWiki pagina maken met behulp van het formulier "
+#~ "hieronder. U kunt er ook voor kiezen een bestaande HTML pagina van uw "
+#~ "computer te laden via de <i>Browse</i> knop."
+
+#~ msgid "Add"
+#~ msgstr "Toevoegen"
+
+#~ msgid "Add and Edit"
+#~ msgstr "Toevoegen en Bewerken"
+
+#~ msgid "Backlinks for"
+#~ msgstr "Terugverwijzingen voor"
+
+#~ msgid "singleton_desc"
+#~ msgstr ""
+#~ "Eenlingen zijn pagina's die niet zijn verbonden via verwijzingen met "
+#~ "andere pagina's."
+
+#~ msgid "History for"
+#~ msgstr "Historie voor"
+
+#~ msgid "return to page"
+#~ msgstr "keer terug naar de pagina"
+
+#~ msgid "help_shortname"
+#~ msgstr ""
+#~ "NB: Hernoemen van een pagina in een grote wiki kan lang duren. Andere "
+#~ "pagina's zullen zo mogelijk worden bijgewerkt."
+
+#~ msgid "label_body_text"
+#~ msgstr "Body tekst"
+
+#~ msgid "help_wikibody"
+#~ msgstr ""
+#~ "In een Wiki pagina gebruikt u [vierkante haken] om verwijzingen te maken. "
+#~ "Wanneer u de pagina opslaat,"
+
+#~ msgid "help_wikiwords"
+#~ msgstr ""
+#~ "Deze pagina ondersteunt WikiWoorden als een middel voor verwijzingen"
+
+#~ msgid "label_note"
+#~ msgstr "Aantekening voor de pagina historie (optioneel)"
+
+#~ msgid "help_wikinote"
+#~ msgstr "Een korte beschrijving van de wijzigingen"
+
+#~ msgid "label_upload_contents_optional"
+#~ msgstr "Laad bestand of afbeelding (optioneel)"
+
+#~ msgid "help_wikiupload"
+#~ msgstr "Voegt een bestand of een afbeelding toe aan deze pagina"
+
+#~ msgid "label_format"
+#~ msgstr "Pagina Formaat"
+
+#~ msgid "help_format"
+#~ msgstr ""
+#~ "Wanneer u niet zeker bent welk formaat u moet gebruiken, kies dan \n"
+#~ "Plain Text en typ het document zoals u normaal gewend bent."
+
+#~ msgid "Save"
+#~ msgstr "Opslaan"
+
+#~ msgid "heading_edit_wiki_page"
+#~ msgstr "Wijzig"
+
+#~ msgid "description_edit_wiki_page"
+#~ msgstr ""
+#~ "Een Wikipagina maakt het mogelijk om pagina's te maken die op "
+#~ "verschillende manieren in verbinding staan met elkaar."
+
+#~ msgid "legend_wiki_page_details"
+#~ msgstr "Wiki pagina details"
+
+#~ msgid "label_pagename"
+#~ msgstr "Pagina naam"
+
+#~ msgid "Required"
+#~ msgstr "Vereist"
+
+#~ msgid "label_required"
+#~ msgstr "(Vereist)"
+
+#~ msgid "heading_wiki_recent_changes"
+#~ msgstr "Recente wijzigingen"
+
+#~ msgid "heading_wiki_search_wiki"
+#~ msgstr "Doorzoek deze wiki"
+
+#~ msgid "Unsubscribe from this page"
+#~ msgstr "Abonnement opzeggen voor deze pagina"
+
+#~ msgid "Subscribe to this page"
+#~ msgstr "Abonneer mij op deze pagina"
+
+#~ msgid "heading_wiki_user_options"
+#~ msgstr "Gebruikersopties"
+
+#~ msgid "add a comment"
+#~ msgstr "voeg opmerking toe"
+
+#~ msgid "heading_wiki_filter_issues"
+#~ msgstr "Filter issues"
+
+#~ msgid "heading_wiki_issue_browser"
+#~ msgstr ""
+#~ "Dit is het issue logboek van deze wiki. Voer een zoekterm in, klik op de "
+#~ "getallen rechts, of op"
+
+#~ msgid "heading_wiki_issue_tracker"
+#~ msgstr "Issue logboek"
+
+#~ msgid "property change"
+#~ msgstr "gewijzigde eigenschappen"
+
+#~ msgid "backlinks_reparent_help"
+#~ msgstr ""
+#~ "U kunt de ouder(s) van deze pagina instellen om 'm een plaats in de "
+#~ "hiërarchie te geven. Vink één of meer hokjes aan of voer hier een "
+#~ "paginanaam in:"
+
+#~ msgid "backlinks_reparent_help2"
+#~ msgstr "en klik dan op"

Added: zope-zwiki/branches/upstream/current/i18n/pl.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/pl.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/pl.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1824 @@
+# original translation of pl.po to Polish
+# Marek Ciesielski <ciesiel at pld.linux-org.pl>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ZWiki-0-31-0\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-02-26 09:03+0000\n"
+"Last-Translator: Jakub Wiśniowski <klippe at pf.pl>\n"
+"Language-Team: Polish <pl at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: pl\n"
+"Language-name: Polish\n"
+"Preferred-encodings: utf-8 latin2\n"
+"Domain: zwiki\n"
+"X-Generator: PajÄ…czek 5.2.0 Pro - testowy :(\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr "Nie masz autoryzacji do zmian wszystkich stron"
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr "(katalog -> zarządzanie właściwościami"
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "Nie masz odpowiednich praw do zmiany nazwy tej strony ZWiki"
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "Nie masz odpowiednich praw do zmiany nazwy tej strony ZWiki"
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr ""
+"Nie masz odpowiednich praw do zmiany lub dodania tematu odnośnika na tej "
+"stronie ZWiki"
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr "Nie masz odpowiednich praw do zmiany czcionki na tej stronie ZWiki"
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr "Nie masz odpowiednich praw do edycji tej strony ZWiki"
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr "Nie masz odpowiednich praw do skasowania tej strony ZWiki"
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+"Ta strona zmieniła nazwę na %s. Możesz ją skasować gdy nie będzie już "
+"potrzebna.\n"
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr "Nie masz odpowiednich praw do wgrania plików tutaj."
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr "Nie masz odpowiednich praw do dodania odnośnika na tej stronie ZWiki"
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr ""
+
+#: src/ZWiki/Editing.py:830
+#, fuzzy
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr "twój wpisa zawierał zabroniony wzór linku"
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr "przekroczona maksymalna liczba anonimowych linków"
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+#, fuzzy
+msgid "exceeded max_identified_links"
+msgstr "przekroczona maksymalna liczba anonimowych linków"
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr "anonimowy"
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr "które strony odnoszą się do tej strony?"
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr "JesteÅ› tutaj"
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr "lat temu"
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr "rok"
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr "miesiÄ…c"
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr "miesięcy temu"
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr "tygodnie"
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr "tydzień temu"
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr "dzień temu"
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr "dni temu"
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr "godzin temu"
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr "godzinÄ™ temu"
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr "minutÄ™ temu"
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr "minut temu"
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr "sekundÄ™ temu"
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr "sekund temu"
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr "Strona jest zablokowana"
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+"\n"
+"            Ta strona posiada blokadÄ™ webDAV. KtoÅ› prawdopodobnie edytuje "
+"jÄ…\n"
+"           zewnętrznym edytorem.  Musisz poczekać dopóki nie skończy\n"
+"           i powtórnie spróbować jeszcze raz. Jeśli dokonałeś jakichś "
+"ważnych\n"
+"            zmian możesz chcieć zarchiwizować i skopiować swoją wersję\n"
+"           dla przyszłego wykorzystania.\n"
+"            "
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr "Aby odrzucić dokonane zmiany i spróbować jeszcze raz naciśnij OK"
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr "Konflikt edycji"
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr "Ktoś zapisał zmiany na tej stronie podczas gdy ją edytowałeś"
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr "aby rozwiązać problem, wykonaj następujące kroki"
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr "W swojej przeglądarce naciśnij przycisk wstecz"
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr "Skopiuj wprowadzone przez siebie zmiany do schowka"
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr "W swojej przeglądarce naciśnij przycisk odswież"
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr "Wklej swoje zmiany uważając na dokonane przez kogoś innego modyfikacje"
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr "Ponownie naciśnij przycisk Zmień"
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr "lub"
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr "Aby anulować zmiany i rozpocząć ponownie, wciśnij OK"
+
+#: src/ZWiki/Views.py:490
+#, fuzzy
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+"\n"
+"        0    Pokaż przypisane klawisze\n"
+"\n"
+"        Funkcje wiki:\n"
+"        c    Pokaż zawartość wiki\n"
+"        r    Pokaż dokonane zmiany w wiki\n"
+"             Pokaż stronę z dyskusją\n"
+"        t    Pokaż listę zmian\n"
+"        i    Pokaż wykaz wiki\n"
+"        o    Pokaż preferencje wiki\n"
+"        h    Pokaż stronę z pomocą\n"
+"        s    Pokaż stronę z wyszukiwaniem\n"
+"        \n"
+"        Funkcje strony:\n"
+"        v    PodglÄ…d stron\n"
+"        +    Podgląd stron w trybie pełnoekranowym\n"
+"        =    Podgląd stron w trybie zwykłym\n"
+"        -    PodglÄ…d stron w trybie minimalnym\n"
+"        m    Prenumerata pocztowa\n"
+"        b    Pokaż odnośniki powrotne (do tej strony)\n"
+"        d    Pokaż różnice (strona z edycją historii)\n"
+"        y    Pokaż pełną historię (w ZMI)\n"
+"        e    Edytuj bieżącą stronę            \n"
+"        x    Edytuj za pomocą zewnętrznego edytora\n"
+"              Drukuj bieżącą stronę (i temat podrzędny)\n"
+"        q    Podgląd źródła strony (szybki podgląd)\n"
+"              Wyczyść i zregeneruj bufor tej strony\n"
+"              Przejdź do tematu podrzędnego\n"
+"              Przejdź do komentarza (wiadomości)\n"
+"              Przejdź do strony domowej autora, jeśli tylko jest to mozliwe\n"
+"        n    Następna strona\n"
+"        p    Poprzednia strona\n"
+"        u    Przejdź do strony nadrzędnej\n"
+"        \n"
+"        Edycja formatek:\n"
+"        s    Zapisanie zmian\n"
+"        \n"
+"        Kiedy wyświetlone zostaną zmiany:\n"
+"        n    Następna edycja\n"
+"        p    Poprzednia edycja\n"
+"        "
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr "utwórz tą stronę"
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr "ostatnia modyfikacja: %(interval)s"
+
+#: src/ZWiki/ZWikiPage.py:809
+#, fuzzy
+msgid "show last edit"
+msgstr "ostatnia edycja: %(lastlog)s"
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr "przez %(editor)s"
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr ""
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr "komentarze"
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr "Utwórz nowy rysunek \"%(filename)\""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr "Wgraj nowy załącznik \"%(filename)\""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr "Edytuj rysunek %(filename)"
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr "Spodziewane \"%(wanted)\" po \"%(key)\", otrzymano \"%(token)\""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr "Spodziewana wartość całkowita \"%(key)\" przed \"%(token)\""
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr "Spodziewana wartość całkowita \"%(arg)\"  po \"%(key)\""
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr "Spodziewana wartość koloru \"%(arg)\" po \"%(key)\""
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr "odpowiedź"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr "Pełna historia"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr "<< poprzednia edycja"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr "następna edycja >>"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+#, fuzzy
+msgid "Revert this change and all successive changes"
+msgstr "Cofnij tą i poźniejsze zmiany"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+#, fuzzy
+msgid "plone"
+msgstr "Notatka do historii zmian strony (opcjonalna)"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+msgid "show all features"
+msgstr "pokaż wszystkie możliwości"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr "pełny"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+msgid "show basic features"
+msgstr "pokaż podstawowe możliwości"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+msgid "simple"
+msgstr "prosty"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr "pokaż tylko wybrane mozliwości"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr "minimalny"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+#, fuzzy
+msgid "subtopic"
+msgstr "podtemat"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+msgid "for this page"
+msgstr "dla tej strony"
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+msgid "title"
+msgstr "tytuł"
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr "Szukaj spraw"
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+#, fuzzy
+msgid "Issue browser"
+msgstr "Rejestr spraw"
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+#, fuzzy
+msgid "Issue tracker"
+msgstr "rejestr spraw"
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "Nie masz odpowiednich praw do edycji tej strony ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr "kategoria"
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr "waga"
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr "status"
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+msgid "age"
+msgstr "wiek"
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr "zmodyfikowano"
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr "Dodaj nowÄ… sprawÄ™:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr "Nazwa"
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr "Kategoria:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr "Waga:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr "Status:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+msgid "Here are the wiki's issue pages."
+msgstr "To jest rejestr spraw."
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr "Szczegóły:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr "dodaj sprawÄ™"
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr "Przeszukaj"
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr "rejestr spraw"
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+msgid "search options"
+msgstr "określając zaawansowane parametry wyszukiwania"
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr "Nazwa zawiera dowolne spośród:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr "Treść strony zawiera dowolne spośród:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr "Kategorie:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+msgid "Severities:"
+msgstr "Wagi:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr "Statusy:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+#, fuzzy
+msgid "Enter a search term, click the numbers to the right,"
+msgstr "Określ parametry wyszukiwania, kliknij na numery po prawej lub"
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr "Zatwierdzone przez"
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+msgid "Name"
+msgstr "Nazwa"
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr "Kategoria"
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+msgid "filter issues"
+msgstr "przeszukaj sprawy"
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr "Waga"
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr "Status"
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+#, fuzzy
+msgid "Optional subject"
+msgstr "Opcjonalny temat"
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+msgid "Optional comment"
+msgstr "Opcjonalna notatka"
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "Dodaj stronÄ™ ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+#, fuzzy
+msgid "Id:"
+msgstr "Id"
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+#, fuzzy
+msgid "Title:"
+msgstr "Tytuł"
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "Dodaj stronÄ™ ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr "Strony zmienione w trakcie ostatnich"
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr "Ostatnio zmienione strony z podsumowaniami"
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr "Pokazać podsumowania?"
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr "Odśwież"
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr "Strona"
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr "Edytowana&nbsp;przez&nbsp;&nbsp;&nbsp;"
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr "Czas modyfikacji"
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr "NOWA"
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr ""
+"Strony oznaczone jako (NOWA) zostały utworzone w trakcie ostatniego tygodnia"
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr "szukaj spraw"
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr "Wpisz słowo lub frazę i naciśnij Enter aby przeszukać całe wiki."
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr "Działa to tak samo jak pole wyszukiwania w prawym górnym rogu."
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr ""
+"Rada: Wpisanie pojedynczego słowa pozwala szybko wyszukać odpowiadające mu "
+"nazwy stron."
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+"Brak wrażliwości na wielkość liter i możliwość stosowania symboli "
+"wieloznacznych może być włączona - zależnie od konfiguracji katalogu."
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr "Pozostaw to pole puste aby wyszukać wszystkie strony."
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr "Szukaj"
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr "PasujÄ…ce nazwy stron"
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr "PasujÄ…cy tekst"
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr "Dokładnie (nie katalogowe) wyszukiwanie pasującego tekstu"
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+msgid "recent"
+msgstr "najnowszych"
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+#, fuzzy
+msgid "Set your preferences for this wiki:"
+msgstr "Ustaw swoje preferencje dla tej strony:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr "Nazwa użytkownika"
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+#, fuzzy
+msgid "(identifies your edits)"
+msgstr "identyfikuje Twoje zmiany"
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+msgid "Email address:"
+msgstr "Adres e-mail:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+#, fuzzy
+msgid "(allows mail subscription)"
+msgstr "Prenumerata e-mail"
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr "Twoja strefa czasowa"
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr "(większość czasów lokalnych)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+#, fuzzy
+msgid "Edit form height:"
+msgstr "Rozmiary formularza edycyjnego"
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr "(dostosowuje rozmiar formatki)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr "Zapisz zmiany"
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr "w sumie"
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr "Odrzuć zmiany"
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr "Dodaj stronÄ™ ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+#, fuzzy
+msgid "Page&nbsp;name:"
+msgstr "Nazwa strony"
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "Dodaj stronÄ™ ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+msgid "Topic"
+msgstr "Temat"
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr "Ostatnio uaktualnione"
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+msgid "Comments"
+msgstr "Komentarze"
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+msgid "Views"
+msgstr "Widoki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+msgid "Created"
+msgstr "Utworzono"
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr "Lp."
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr "przez"
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr "<dtml-var lasteditinterval> temu</dtml-var>"
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr "na"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+msgid "Subtopics"
+msgstr "Podtematy"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr "Ta strona nie ma rejestru spraw."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+#, fuzzy
+msgid "Here are it's subtopics."
+msgstr "Tu sÄ… podtematy:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+#, fuzzy
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr "Możesz zmienić kolejność spraw klikając w przyciski ^"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+#, fuzzy
+msgid "Related pages"
+msgstr "utwórz tą stronę"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+#, fuzzy
+msgid "Parents"
+msgstr "Rodzice"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr "to jest temat główny."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr "to jest drugi temat z:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+#, fuzzy
+msgid "Backlinks"
+msgstr "Łącza wsteczne"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr "Strony, które odnoszą się do tej strony:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+#, fuzzy
+msgid "No other pages link to this one."
+msgstr "Żadne inne strony nie odnoszą sie do tej."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr "Zmień rodzica"
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+#, fuzzy
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+"Wystąpił problem z szablonami skórki wiki. Być może ID obiektu skórki nie "
+"jest szablonem lub stroną DTML lub szablon został skasowany."
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr "temat"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr "temat jest pomocny przy wÄ…tkowaniu i zmianach"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr "odpowiedź"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+"aby skomentować (z kopią dla prenumeratorów) wprowadź tekst i kliknij dodaj"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr "${nb} prenumeratorów"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr "1 prenumerator"
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr "Dodaj komentarz"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr "Zawartość wiki"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr "Pojedyncze strony"
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+#, fuzzy
+msgid "Edit history"
+msgstr "Pełna historia"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+#, fuzzy
+msgid "Edit:"
+msgstr "edycja"
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+#, fuzzy
+msgid "Manage"
+msgstr "Zmień"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+#, fuzzy
+msgid "Revert this and later edits"
+msgstr "Cofnij tą i poźniejsze zmiany"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr "Powrót do strony"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+#, fuzzy
+msgid "Time:"
+msgstr "Czas modyfikacji"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+#, fuzzy
+msgid "Note:"
+msgstr "Nazwa"
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr "przełączenie źródło/WYSIWYG mode"
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr "Opcjonalna zmiana notatki"
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr "notatka uczyni listę ostatnich zmian bardziej użyteczną"
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr "Wczytanie pliku lub obrazka"
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr "wczytać plik i utworzyć odnośnik do niego na tej stronie?"
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr "Aby wywołać pomoc dla edycji zobacz"
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr "Strona z pomocÄ…"
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr "Regóły formatowania tekstów"
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+#, fuzzy
+msgid "preview this edit"
+msgstr "podglÄ…d tej edycji"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr "PodglÄ…d"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr "Anuluj"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr "anuluj zmiany i wróć na stronę"
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr "Utwórz"
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr "Stwórz stronę wiki"
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+#, fuzzy
+msgid "label_preview"
+msgstr "(Wymagane)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr "Nazwa strony"
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr "nazwa tej strony wiwki (zmiana nazwy może trwać długo)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr "format"
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr "wybierz formatowanie i styl wyświetlania tej strony"
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr "(zewnętrzny edytor)"
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr "główna"
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr "pokaż zmiany w wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr "zmiany"
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr "pokaż stronę z dyskusją"
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr "dyskusja"
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr "pokaż rejestr spraw"
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr "sprawy"
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr "pokaż zawartość wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr "zawartość"
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr "pokaż indeks wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr "indeks"
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr "pokaż stronę z możliwością wczytania"
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr "wczytanie"
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr "pokaż stonę z pomocą"
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr "pomoc"
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr "pokaż opcje wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr "opcje"
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr "odnośniki powrotne"
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr ""
+"konfiguracja skrzynki e-mail dla prenumeraty tej strony lub całej witryny"
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr "prenumerata"
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr "pokaż historię zmian na tej stronie"
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr "pokaż stronę główną"
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr "różnica"
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr "edycja"
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr "edycja za pomocą zewnętrznego edytora"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr "przejdź do strony domowej"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr "przeszukaj wszystkie strony"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+#, fuzzy
+msgid "parent,"
+msgstr "rodzic,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr "nazwa,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+#, fuzzy
+msgid "replacement,"
+msgstr "zamiennik,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+#, fuzzy
+msgid "page"
+msgstr "wiek"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+"wprowadź nazwę strony i kliknij przyciski po prawej (najedź myszką by "
+"uzyskać pomoc)"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+#, fuzzy
+msgid "reparent"
+msgstr "Zmień rodzica"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+#, fuzzy
+msgid "make this page a subtopic of the page you have entered"
+msgstr "Uczyń stronę której nazwę wpisałeś rodzicem bieżącej strony"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+"Zmień nazwę strony na taką jaką wpisałeś (wszystkie odnośniki zostaną "
+"zaktualizowane)"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename"
+msgstr "zmień nazwę"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr "skasuj!"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+#, fuzzy
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr "Uczyń stronę której nazwę wpisałeś rodzicem bieżącej strony"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+#, fuzzy
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+"Zmień nazwę strony na taką jaką wpisałeś (wszystkie odnośniki zostaną "
+"zaktualizowane)"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create"
+msgstr "utwórz"
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+#, fuzzy
+msgid "Recent changes"
+msgstr "Zmiany w wiki"
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+#, fuzzy
+msgid "Search this wiki"
+msgstr "Szukaj w ZWiki"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+#, fuzzy
+msgid "all edits"
+msgstr "edycja"
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr ""
+"JesteÅ› obecnie prenumeratorem<br />\n"
+"całego wiki."
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr ""
+"Nie jesteÅ› obecnie prenumeratorem<br />\n"
+"całego wiki."
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr "Prenumerata e-mail"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr "Odwołanie prenumeraty całego wiki"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr "Prenumeruj całe wiki"
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr "Prenumerujesz te strony"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr "Prenumeratorzy strony"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr "Prenumeratorzy wiki"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+#, fuzzy
+msgid "subscribe_desc_comments"
+msgstr "Możesz tu włączyć prenumeratę tej strony lub całego wiki."
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+#, fuzzy
+msgid "subscribe_desc_edits"
+msgstr "Możesz tu włączyć prenumeratę tej strony lub całego wiki."
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr "Twój adres e-mail"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr "Zmień"
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr "Aby zostać prenumeratorem podaj swój adres e-mail."
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr ""
+"JesteÅ› obecnie prenumeratorem<br />\n"
+"tej strony."
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr ""
+"Obecnie nie jesteÅ› prenumeratorem<br />\n"
+"tej strony."
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr " Skasuj prenumeratÄ™ tej strony "
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr " Zaprenumeruj tÄ™ stronÄ™ "
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+#, fuzzy
+msgid "User options"
+msgstr "określając zaawansowane parametry wyszukiwania"
+
+#~ msgid "adding of external links by anonymous authors is restricted"
+#~ msgstr ""
+#~ "dodawanie zewnętrznych linków przez anonimowych autorów jest zabronione"
+
+#~ msgid "Add a ZWiki web"
+#~ msgstr "Dodaj witrynÄ™ ZWiki"
+
+#~ msgid "Type"
+#~ msgstr "Wzór"
+
+#~ msgid "Create wiki"
+#~ msgstr "Stwórz wiki"
+
+#~ msgid "and enter"
+#~ msgstr "i wprowadź"
+
+#~ msgid ""
+#~ "You may create a new ZWiki Page object using the form below. You may also "
+#~ "choose to upload an existing html file from your local computer by "
+#~ "clicking the <i>Browse</i> button."
+#~ msgstr ""
+#~ "Możesz stworzyć nową stronę ZWiki korzystając z poniższego formularza. "
+#~ "Możesz także wczytać istniejący plik html ze swojego komputera, "
+#~ "wybierajÄ…c przycisk <i>Browse</i>"
+
+#~ msgid "File"
+#~ msgstr "Plik"
+
+#~ msgid "Add"
+#~ msgstr "Dodaj"
+
+#~ msgid "Add and Edit"
+#~ msgstr "Dodaj i Edytuj"
+
+#, fuzzy
+#~ msgid "log_note"
+#~ msgstr "Notatka do historii zmian strony (opcjonalna)"
+
+#~ msgid "Backlinks for"
+#~ msgstr "Odnośniki powrotne dla"
+
+#~ msgid "singleton_desc"
+#~ msgstr ""
+#~ "Pojedyncze strony to strony, które nie są połączone z innymi stronami."
+
+#~ msgid "History for"
+#~ msgstr "Historia dla"
+
+#~ msgid "return to page"
+#~ msgstr "powrót do strony"
+
+#~ msgid "help_shortname"
+#~ msgstr ""
+#~ "Zmiana nazwy strony w dużym wiki może trwać długo. Spowodowane jest to "
+#~ "akutalizowaniem tej nazwy na innych stronach."
+
+#~ msgid "label_body_text"
+#~ msgstr "Treść strony"
+
+#~ msgid "help_wikibody"
+#~ msgstr ""
+#~ "Na Stronach Wiki do tworzenia odnośników używa się [nawiasów "
+#~ "kwadratowych]. Po zapisaniu strony,\n"
+#~ "za nawiasami kwadratowymi pojawi się mały odnośnik <code>?</code>.\n"
+#~ "Po jego naciśnięciu zostanie utworzona nowa strona o nazwie takiej jak "
+#~ "wpisana wewnątrz nawiasów kwadratowych."
+
+#~ msgid "help_wikiwords"
+#~ msgstr ""
+#~ "To wiki umożliwia również wykorzystanie SłówWiki do tworzenia odnośników."
+
+#~ msgid "label_note"
+#~ msgstr "Notatka do historii zmian strony (opcjonalna)"
+
+#~ msgid "help_wikinote"
+#~ msgstr "Krótki opis dokonanych zmian"
+
+#~ msgid "label_upload_contents_optional"
+#~ msgstr "Wczytaj plik lub obrazek (opcjonalnie)"
+
+#~ msgid "help_wikiupload"
+#~ msgstr "Dołącza plik lub obrazek do tej strony."
+
+#~ msgid "label_format"
+#~ msgstr "Format strony"
+
+#~ msgid "help_format"
+#~ msgstr ""
+#~ "Jeśli nie masz pewności jakiego formatu użyć wybierz Plain\n"
+#~ "Text i po prostu wpisz treść."
+
+#~ msgid "Save"
+#~ msgstr "Zapisz"
+
+#~ msgid "heading_edit_wiki_page"
+#~ msgstr ""
+#~ "Edytuj\n"
+#~ "        ${itemtype} \n"
+#~ "\n"
+#~ "        \"${pagename}\""
+
+#~ msgid "description_edit_wiki_page"
+#~ msgstr ""
+#~ "Strony Wiki pozwalają w łatwy sposób utworzyć zbiór połączonych ze sobą "
+#~ "stron."
+
+#~ msgid "legend_wiki_page_details"
+#~ msgstr "Szczegóły strony"
+
+#~ msgid "label_pagename"
+#~ msgstr "Nazwa strony"
+
+#~ msgid "Required"
+#~ msgstr "Wymagane"
+
+#~ msgid "label_required"
+#~ msgstr "(Wymagane)"
+
+#~ msgid "heading_wiki_recent_changes"
+#~ msgstr "Ostatnie zmiany"
+
+#~ msgid "heading_wiki_search_wiki"
+#~ msgstr "Przeszukaj wiki"
+
+#~ msgid "Unsubscribe from this page"
+#~ msgstr "Odwołaj prenumeratę tej strony"
+
+#~ msgid "Subscribe to this page"
+#~ msgstr "Prenumeruj tÄ… stronÄ™"
+
+#~ msgid "heading_wiki_user_options"
+#~ msgstr "Opcje użytkownika"
+
+#, fuzzy
+#~ msgid "add a comment"
+#~ msgstr "Dodaj komentarz"
+
+#~ msgid "heading_wiki_filter_issues"
+#~ msgstr "Przeszukaj sprawy"
+
+#, fuzzy
+#~ msgid "heading_wiki_issue_browser"
+#~ msgstr "Rejestr spraw"
+
+#~ msgid "heading_wiki_issue_tracker"
+#~ msgstr "Rejestr spraw"
+
+#, fuzzy
+#~ msgid "property change"
+#~ msgstr "Zmiany w wiki"
+
+#, fuzzy
+#~ msgid "View"
+#~ msgstr "Widok"
+
+#~ msgid "Comment"
+#~ msgstr "Komentarz"
+
+#, fuzzy
+#~ msgid "A Comment"
+#~ msgstr "Komentarz"
+
+#~ msgid "Table of Contents"
+#~ msgstr "Spis treści"
+
+#, fuzzy
+#~ msgid "A Wiki"
+#~ msgstr "Dodaj stronÄ™ ZWiki"
+
+#~ msgid "TOC"
+#~ msgstr "Spis tr."
+
+#~ msgid "Subscriptions"
+#~ msgstr "Subskrypcje"
+
+#, fuzzy
+#~ msgid "Change Wiki Page"
+#~ msgstr "Dodaj stronÄ™ ZWiki"
+
+#, fuzzy
+#~ msgid "Wiki User"
+#~ msgstr "Prenumeratorzy wiki"
+
+#~ msgid "Wiki visitors, which can only view and comment on wikis."
+#~ msgstr "Goście Wiki, którzy mogą tylko oglądać i komentować Wiki."
+
+#~ msgid "A Wiki Page"
+#~ msgstr "Strona ZWiki"
+
+#~ msgid "Wiki Page"
+#~ msgstr "Strona ZWiki"
+
+#~ msgid "A Wiki Page Comment"
+#~ msgstr "Dodaj komentarz do strony ZWiki"
+
+#~ msgid "Wiki Page Comment"
+#~ msgstr "Komentarz do strony ZWiki"
+
+#~ msgid "Wiki Editor"
+#~ msgstr "Edytor Wiki"
+
+#~ msgid "The Wiki Editor can create and edit wikis."
+#~ msgstr "Edytor ZWiki tworzy i edytuje strony ZWiki"
+
+#~ msgid "Wiki Administrator"
+#~ msgstr "Administrator ZWiki"
+
+#~ msgid "The Wiki Admin can fully manage wiki pages."
+#~ msgstr "Adminitrator Wiki może w pełni zarządzać stronami"
+
+#~ msgid "View a Wiki Page"
+#~ msgstr "Obejrzyj stronÄ™ ZWiki"
+
+#~ msgid "View Wiki Page"
+#~ msgstr "Obejrzyj stronÄ™ ZWiki"
+
+#~ msgid "Comment on Wiki Page"
+#~ msgstr "Skomentuj stronÄ™ Wiki"
+
+#~ msgid "Make a comment on Wiki Page"
+#~ msgstr "Skomentuj stronÄ™ Wiki"
+
+#~ msgid "Edit Wiki Page"
+#~ msgstr "Edytuj stronÄ™ ZWiki"
+
+#, fuzzy
+#~ msgid "Delete Wiki Page"
+#~ msgstr "Dodaj stronÄ™ ZWiki"
+
+#~ msgid "Reparent a Wiki Page"
+#~ msgstr "Zmień rodzica strony"
+
+#, fuzzy
+#~ msgid "Reparent Wiki Page"
+#~ msgstr "Dodaj stronÄ™ ZWiki"
+
+#~ msgid "page in parent wiki"
+#~ msgstr "strona w nadrzędnym wiki"
+
+#~ msgid "XXX"
+#~ msgstr "XXX"
+
+#~ msgid "File Uploads"
+#~ msgstr "Wysyłka plików"
+
+#~ msgid "uploads_desc"
+#~ msgstr "Ta strona pokazuje listę wszystkich wczytanych plików w tym wiki."
+
+#~ msgid "save"
+#~ msgstr "zapisz"
+
+#~ msgid "view"
+#~ msgstr "widok"
+
+#~ msgid "no_files_uploaded"
+#~ msgstr "Żadne pliki nie zostały wczytane."
+
+#~ msgid "box_wiki_navigation"
+#~ msgstr "Nawigacja wiki"
+
+#~ msgid "enter comments here and click add; or, click edit"
+#~ msgstr "wprowadź komentarz i naciśnij przycisk dodaj"
+
+#~ msgid "Details & comments"
+#~ msgstr "Detale i komentarze"
+
+#~ msgid ""
+#~ "no catalog or the catalog search gave an error, a brute-force search was "
+#~ "used"
+#~ msgstr ""
+#~ "brak katalogu lub przeszukiwanie katalogu spowodowało błąd, użyta została "
+#~ "metoda wyszukiwania brute-force"
+
+#~ msgid "Contents"
+#~ msgstr "Zawartość"
+
+#~ msgid "Diffs for"
+#~ msgstr "różnice dla"
+
+#~ msgid "name"
+#~ msgstr "nazwa"
+
+#~ msgid "page rating"
+#~ msgstr "ranking strony"
+
+#~ msgid "rating_score"
+#~ msgstr ""
+#~ "${score} na\n"
+#~ "  ${nb_votes} głosów"
+
+#~ msgid "click to rate"
+#~ msgstr "kliknij aby zwiększyć ranking"
+
+#~ msgid "voting as"
+#~ msgstr "głosujesz jako"
+
+#~ msgid "Here are the pages which link to"
+#~ msgstr "Strony odnoszÄ…ce siÄ™ do"
+
+#, fuzzy
+#~ msgid "box_canreparent"
+#~ msgstr "zmień rodzica"
+
+#~ msgid "Other parent"
+#~ msgstr "Inny rodzic"
+
+#~ msgid "You may also click the full, simple, minimal links if provided."
+#~ msgstr ""
+#~ "Możesz też kliknąć jeden z odnośników pełny, prosty, minimalny, jeśli są "
+#~ "widoczne."
+
+#~ msgid "for subscribing"
+#~ msgstr "dla prenumeraty"
+
+#~ msgid "width"
+#~ msgstr "szerokość"
+
+#~ msgid "height"
+#~ msgstr "wysokość"
+
+#~ msgid "textarea dimensions; width will be 100% if supported"
+#~ msgstr "szerokość pola tekstowego wyniesie 100%, jeśli będzie to możliwe"
+
+#~ msgid "Your local time is"
+#~ msgstr "Twój lokalny czas to"
+
+#~ msgid "Show logo ?"
+#~ msgstr "Pokazać logo?"
+
+#~ msgid "No"
+#~ msgstr "Nie"
+
+#~ msgid "Yes"
+#~ msgstr "Tak"
+
+#~ msgid "Show page hierarchy ?"
+#~ msgstr "Pokazać hirarchię stron?"
+
+#~ msgid "This wiki keeps a page hierarchy, which you can use or ignore."
+#~ msgstr ""
+#~ "To wiki utrzymuje hierarchię stron, którą możesz wykorzystać lub "
+#~ "zignorować."
+
+#~ msgid "Show search field ?"
+#~ msgstr "Pokazać pole wyszukiwania?"
+
+#~ msgid "except in minimal mode"
+#~ msgstr "za wyjÄ…tkiem trybu minimalnego"
+
+#~ msgid "Show AnnoyingQuote ?"
+#~ msgstr "Pokazać cytat dnia?"
+
+#~ msgid "in full mode"
+#~ msgstr "w trybie pełnym"
+
+#~ msgid "Show page management form ?"
+#~ msgstr "Pokazać formularz zarządzania stroną?"
+
+#~ msgid "You must also configure a username or be logged in."
+#~ msgstr "Musisz także ustawić nazwę użytkownika lub być zalogowanym."
+
+#~ msgid "no subscribers"
+#~ msgstr "brak prenumeratorów"
+
+#~ msgid "parent_name_replace"
+#~ msgstr "nowy rodzic, nazwa, usunięcie, podtemat"
+
+#~ msgid ""
+#~ "enter a new parent, new name, replacement page (if any) or subtopic name"
+#~ msgstr ""
+#~ "wprowadź dane strony podrzędnej, nowa nazwa lub zastąp stronę (jeżeli "
+#~ "istnieje)"
+
+#~ msgid "box_zwiki_showhierarchy"
+#~ msgstr ""
+#~ "Możesz zmienić <em>rodzica (ów)</em> tej strony, aby umiejscowić ją\n"
+#~ "    w hierarchii wiki.  Zaznacz ptaszki lub wpisz nowÄ… nazwÄ™ strony i "
+#~ "kliknij\n"
+#~ "    Zmień rodzica. Pojedynczy rodzic jest zazwyczaj wystarczający."
+
+#~ msgid ""
+#~ "move this page to the recycle bin, and relink to the name you have entered"
+#~ msgstr "umieść stronę w koszu i zaktualizuj odnośniki"
+
+#~ msgid "create a new subtopic of this page"
+#~ msgstr "utwórz nowy podtemat na tej stronie"
+
+#~ msgid "cancel"
+#~ msgstr "anuluj"

Added: zope-zwiki/branches/upstream/current/i18n/plone-br.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/plone-br.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/plone-br.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,56 @@
+# Breton translation for zwiki
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the zwiki package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Jun 11 09:11:35 2004\n"
+"PO-Revision-Date: 2006-06-09 14:30+0000\n"
+"Last-Translator: Fulup <fulup.jakez at ofis-bzh.org>\n"
+"Language-Team: Breton <br at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Domain: plone\n"
+
+msgid "View"
+msgstr "Gwelet"
+
+msgid "Edit"
+msgstr "Kemmañ"
+
+msgid "History"
+msgstr "Istor"
+
+msgid "Backlinks"
+msgstr "Killiammoù"
+
+msgid "Subscribe"
+msgstr "En em enskrivañ"
+
+msgid "Wiki contents"
+msgstr "Danvez ar wiki"
+
+msgid "Wiki changes"
+msgstr "Kemmoù er wiki"
+
+msgid "Issue tracker"
+msgstr "Heuliañ ar c'hudennoù"
+
+msgid "Filter issues"
+msgstr "Sil ar c'hudennoù"
+
+msgid "Search this wiki"
+msgstr "Klask er wiki-mañ"
+
+msgid "Wiki options"
+msgstr "Dibarzhioù ar wiki"
+
+msgid "Recent changes"
+msgstr "Kemmoù diwezhañ"
+
+msgid "Wiki search"
+msgstr "Klask wiki"
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/i18n/plone-de.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/plone-de.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/plone-de.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,63 @@
+# translation of zwiki-plone-de.po to German
+# Old translators:
+# Andreas Mayer <an.ma at web.de>, 2005.
+# Jens Nachtigall <nachtigall at web.de>, 2005.
+# Zwiki messages which must be in the plone domain - actions
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki-plone-de\n"
+"POT-Creation-Date: Fri Jun 11 09:11:35 2004\n"
+"PO-Revision-Date: 2005-08-29 09:21+0000\n"
+"Last-Translator: Jens Nachtigall <nachtigall at web.de>\n"
+"Language-Team: German <debian-l10n-german at lists.debian.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: de\n"
+"Language-name: German\n"
+"Preferred-encodings: utf-8\n"
+"Domain: plone\n"
+"X-Generator: KBabel 1.10\n"
+
+# CMF/Plone Wiki Page actions
+# some overlap with CMF/Plone and standard zwiki skin translations here
+msgid "View"
+msgstr "Anzeigen"
+
+msgid "Edit"
+msgstr "Bearbeiten"
+
+msgid "History"
+msgstr "Historie"
+
+msgid "Backlinks"
+msgstr "Backlinks"
+
+msgid "Subscribe"
+msgstr "Abonnement"
+
+msgid "Wiki contents"
+msgstr "Inhalt"
+
+msgid "Wiki changes"
+msgstr "Letzte Änderungen"
+
+msgid "Issue tracker"
+msgstr "Problemliste"
+
+msgid "Filter issues"
+msgstr "Problemfilter"
+
+msgid "Search this wiki"
+msgstr "Suche in Wiki"
+
+msgid "Wiki options"
+msgstr "Einstellungen"
+
+msgid "Recent changes"
+msgstr "Letzte Änderungen"
+
+msgid "Wiki search"
+msgstr "Wiki-Suche"
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/i18n/plone-es.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/plone-es.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/plone-es.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,55 @@
+# Zwiki messages which must be in the plone domain - actions
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: Fri Jun 11 09:11:35 2004\n"
+"PO-Revision-Date: 2005-08-29 09:22+0000\n"
+"Last-Translator: Jordi Mallach <jordi at canonical.com>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: es\n"
+"Language-name: Spanish\n"
+"Preferred-encodings: utf-8 latin1\n"
+"Domain: plone\n"
+
+# CMF/Plone Wiki Page actions
+msgid "View"
+msgstr "Ver"
+
+msgid "Edit"
+msgstr "Editar"
+
+msgid "History"
+msgstr "Historia"
+
+msgid "Backlinks"
+msgstr "Enlaces"
+
+msgid "Subscribe"
+msgstr "Suscribirse"
+
+msgid "Wiki contents"
+msgstr "Contenidos del Wiki"
+
+msgid "Wiki changes"
+msgstr "Cambios del Wiki"
+
+msgid "Issue tracker"
+msgstr "Registro incidencias"
+
+msgid "Filter issues"
+msgstr "Filtrar incidencias"
+
+msgid "Search this wiki"
+msgstr "Buscar en el wiki"
+
+msgid "Wiki options"
+msgstr "Opciones del wiki"
+
+msgid "Recent changes"
+msgstr "Cambios recientes"
+
+msgid "Wiki search"
+msgstr "Buscar en el wiki"
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/i18n/plone-fi.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/plone-fi.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/plone-fi.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,58 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: Fri Jun 11 09:11:35 2004\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: fi\n"
+"Language-name: Finnish\n"
+"Preferred-encodings: utf-8\n"
+"Domain: plone\n"
+
+# CMF/Plone Wiki Page actions
+msgid "View"
+msgstr ""
+
+msgid "Edit"
+msgstr ""
+
+msgid "History"
+msgstr ""
+
+msgid "Backlinks"
+msgstr ""
+
+msgid "Subscribe"
+msgstr ""
+
+msgid "Wiki contents"
+msgstr ""
+
+msgid "Wiki changes"
+msgstr ""
+
+msgid "Issue tracker"
+msgstr ""
+
+msgid "Filter issues"
+msgstr ""
+
+msgid "Search this wiki"
+msgstr ""
+
+msgid "Wiki options"
+msgstr ""
+
+msgid "Recent changes"
+msgstr ""
+
+msgid "Wiki search"
+msgstr ""
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/i18n/plone-fr.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/plone-fr.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/plone-fr.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,60 @@
+# translation of zwiki-plone-fr.po to French
+# Zwiki messages which must be in the plone domain - actions
+# Encolpe DEGOUTE <encolpe.degoute at ingeniweb.com>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki-plone-fr\n"
+"POT-Creation-Date: Fri Jun 11 09:11:35 2004\n"
+"PO-Revision-Date: 2005-08-29 09:21+0000\n"
+"Last-Translator: Jordi Mallach <jordi at canonical.com>\n"
+"Language-Team: French <support at ingeniweb.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"x-is-fallback-for: fr-be fr-ca fr-lu fr-mc fr-ch\n"
+"Language-code: fr\n"
+"Language-name: French\n"
+"Preferred-encodings: utf-8\n"
+"Domain: plone\n"
+"X-Generator: KBabel 1.10.2\n"
+
+# CMF/Plone Wiki Page actions
+# some overlap with CMF/Plone and standard zwiki skin translations here
+msgid "View"
+msgstr "Voir"
+
+msgid "Edit"
+msgstr "Éditer"
+
+msgid "History"
+msgstr "Historique"
+
+msgid "Backlinks"
+msgstr "Rétroliens"
+
+msgid "Subscribe"
+msgstr "S'abonner"
+
+msgid "Wiki contents"
+msgstr "Contenu du Wiki"
+
+msgid "Wiki changes"
+msgstr "Changements récents du Wiki"
+
+msgid "Issue tracker"
+msgstr "Suivi des problèmes"
+
+msgid "Filter issues"
+msgstr "Filtrer les problèmes"
+
+msgid "Search this wiki"
+msgstr "Chercher dans ce Wiki"
+
+msgid "Wiki options"
+msgstr "Options du Wiki"
+
+msgid "Recent changes"
+msgstr "Changement récents"
+
+msgid "Wiki search"
+msgstr "Recherche wiki"
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/i18n/plone-he.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/plone-he.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/plone-he.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,57 @@
+# Zwiki messages which must be in the plone domain - actions
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: Fri Jun 11 09:11:35 2004\n"
+"PO-Revision-Date: 2005-08-29 09:21+0000\n"
+"Last-Translator: Ofer Weisglass <ofer at plone.org.il>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: he\n"
+"Language-name: Hebrew\n"
+"Preferred-encodings: utf-8 latin1\n"
+"Domain: plone\n"
+
+# CMF/Plone Wiki Page actions
+msgid "View"
+msgstr "צפיה"
+
+msgid "Edit"
+msgstr "ערוך"
+
+msgid "History"
+msgstr "היסטוריה"
+
+msgid "Backlinks"
+msgstr ""
+
+msgid "Subscribe"
+msgstr "רישום"
+
+msgid "Wiki contents"
+msgstr "תכני ויקי"
+
+msgid "Wiki changes"
+msgstr "שינויי ויקי"
+
+msgid "Issue tracker"
+msgstr "עוקב Issue"
+
+msgid "Filter issues"
+msgstr "מסנן issues"
+
+msgid "Search this wiki"
+msgstr "חפש בויקי זה"
+
+msgid "Wiki options"
+msgstr "אפשרויות ויקי"
+
+#, fuzzy
+msgid "Recent changes"
+msgstr "שינויי ויקי"
+
+#, fuzzy
+msgid "Wiki search"
+msgstr "שינויי ויקי"
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/i18n/plone-hu.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/plone-hu.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/plone-hu.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,60 @@
+# translation of zwiki-plone.pot to Hungarian
+# Zwiki messages which must be in the plone domain - actions
+# József Jároli (kaixo) <yo at jaroli.de>, 2004.
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki-plone-hu\n"
+"POT-Creation-Date: Fri Jun 11 09:11:35 2004\n"
+"PO-Revision-Date: 2005-08-29 09:21+0000\n"
+"Last-Translator: József Jároli (kaixo) <en at innen.hu>\n"
+"Language-Team: Hungarian <hu at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: hu\n"
+"Language-name: Magyar\n"
+"Preferred-encodings: utf-8\n"
+"Domain: plone\n"
+"X-Generator: KBabel 1.3\n"
+
+# CMF/Plone Wiki Page actions
+msgid "View"
+msgstr "Nézet"
+
+msgid "Edit"
+msgstr "Szerkeszt"
+
+msgid "History"
+msgstr "Előzmények"
+
+msgid "Backlinks"
+msgstr "Idemutató"
+
+msgid "Subscribe"
+msgstr "Előfizet"
+
+msgid "Wiki contents"
+msgstr "Tartalomjegyzék"
+
+msgid "Wiki changes"
+msgstr "Wiki változások"
+
+msgid "Issue tracker"
+msgstr "Ügykezelő"
+
+msgid "Filter issues"
+msgstr "Ügyek szűrése"
+
+msgid "Search this wiki"
+msgstr "Keresés a wikiben"
+
+msgid "Wiki options"
+msgstr "Wiki beállítások"
+
+#, fuzzy
+msgid "Recent changes"
+msgstr "Wiki változások"
+
+#, fuzzy
+msgid "Wiki search"
+msgstr "Wiki változások"
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/i18n/plone-it.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/plone-it.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/plone-it.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,55 @@
+# Zwiki messages which must be in the plone domain - actions
+msgid ""
+msgstr ""
+"Project-Id-Version: ZWiki 0.31.0\n"
+"POT-Creation-Date: Fri Jun 11 09:11:35 2004\n"
+"PO-Revision-Date: 2006-02-26 09:00+0000\n"
+"Last-Translator: Lele Gaifax <lele at seldati.it>\n"
+"Language-Team: Italian <zwiki at zwiki.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: it\n"
+"Language-name: Italian\n"
+"Preferred-encodings: utf-8 latin1\n"
+"Domain: plone\n"
+
+# CMF/Plone Wiki Page actions
+msgid "View"
+msgstr "Visualizza"
+
+msgid "Edit"
+msgstr "Modifica"
+
+msgid "History"
+msgstr "Storia"
+
+msgid "Backlinks"
+msgstr "Riferimenti inversi"
+
+msgid "Subscribe"
+msgstr "Abbonati"
+
+msgid "Wiki contents"
+msgstr "Contenuti del wiki"
+
+msgid "Wiki changes"
+msgstr "Modifiche al wiki"
+
+msgid "Issue tracker"
+msgstr "Gestione problematiche"
+
+msgid "Filter issues"
+msgstr "Filtra i problemi"
+
+msgid "Search this wiki"
+msgstr "Cerca in questo wiki"
+
+msgid "Wiki options"
+msgstr "Opzioni wiki"
+
+msgid "Recent changes"
+msgstr "Modifiche recenti"
+
+msgid "Wiki search"
+msgstr "Cerca"
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/i18n/plone-ja.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/plone-ja.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/plone-ja.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,55 @@
+# Zwiki messages which must be in the plone domain - actions
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: Fri Jun 11 09:11:35 2004\n"
+"PO-Revision-Date: 2006-03-14 02:43+0000\n"
+"Last-Translator: jack <jack at jk.to>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: ja\n"
+"Language-name: Japanese\n"
+"Preferred-encodings: utf-8\n"
+"Domain: plone\n"
+
+# CMF/Plone Wiki Page actions
+msgid "View"
+msgstr "表示"
+
+msgid "Edit"
+msgstr "編集"
+
+msgid "History"
+msgstr "履歴"
+
+msgid "Backlinks"
+msgstr "バックリンク"
+
+msgid "Subscribe"
+msgstr "購読"
+
+msgid "Wiki contents"
+msgstr "Wiki コンテンツ"
+
+msgid "Wiki changes"
+msgstr "Wiki の変更"
+
+msgid "Issue tracker"
+msgstr "Issue tracker"
+
+msgid "Filter issues"
+msgstr "問題点フィルタの設定"
+
+msgid "Search this wiki"
+msgstr "このWiki からの検索"
+
+msgid "Wiki options"
+msgstr "Wiki オプション"
+
+msgid "Recent changes"
+msgstr "最近の変更を表示"
+
+msgid "Wiki search"
+msgstr "Wiki 検索"
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/i18n/plone-nl.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/plone-nl.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/plone-nl.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,58 @@
+# translation of zwiki-plone-nl.po to Nederlands
+# Zwiki messages which must be in the plone domain - actions
+# Jaap Noordzij <jaap at jaapnoordzij.nl>, 2004.
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki-plone-nl\n"
+"POT-Creation-Date: Fri Jun 11 09:11:35 2004\n"
+"PO-Revision-Date: 2006-01-20 18:36+0000\n"
+"Last-Translator: Frank laurijssens <frank at laurijssens.nl>\n"
+"Language-Team: <zwiki at zwiki.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: nl\n"
+"Language-name: Nederlands\n"
+"Preferred-encodings: utf-8 latin1\n"
+"Domain: plone\n"
+
+# CMF/Plone Wiki Page actions
+# some overlap with CMF/Plone and standard zwiki skin translations here
+msgid "View"
+msgstr "Bekijken"
+
+msgid "Edit"
+msgstr "Bewerken"
+
+msgid "History"
+msgstr "Geschiedenis"
+
+msgid "Backlinks"
+msgstr "Terugverwijzingen"
+
+msgid "Subscribe"
+msgstr "Abonnement"
+
+msgid "Wiki contents"
+msgstr "Wiki inhoud"
+
+msgid "Wiki changes"
+msgstr "Wiki wijzigingen"
+
+msgid "Issue tracker"
+msgstr "Issue logboek"
+
+msgid "Filter issues"
+msgstr "Filter issues"
+
+msgid "Search this wiki"
+msgstr "Zoeken in deze wiki"
+
+msgid "Wiki options"
+msgstr "Wiki opties"
+
+msgid "Recent changes"
+msgstr "Recente wijzigingen"
+
+msgid "Wiki search"
+msgstr "Zoek in de wiki"
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/i18n/plone-pl.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/plone-pl.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/plone-pl.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,57 @@
+# Zwiki messages which must be in the plone domain - actions
+msgid ""
+msgstr ""
+"Project-Id-Version: ZWiki-0-31-0\n"
+"POT-Creation-Date: Fri Jun 11 09:11:35 2004\n"
+"PO-Revision-Date: 2005-08-29 09:22+0000\n"
+"Last-Translator: Jakub Wiśniowski <klippe at pf.pl>\n"
+"Language-Team: Polish <pl at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: pl\n"
+"Language-name: Polish\n"
+"Preferred-encodings: utf-8 latin2\n"
+"Domain: plone\n"
+
+# CMF/Plone Wiki Page actions
+msgid "View"
+msgstr "Widok"
+
+msgid "Edit"
+msgstr "Edycja"
+
+msgid "History"
+msgstr "Historia"
+
+msgid "Backlinks"
+msgstr "Łącza wsteczne"
+
+msgid "Subscribe"
+msgstr "Prenumerata"
+
+msgid "Wiki contents"
+msgstr "Zawartość wiki"
+
+msgid "Wiki changes"
+msgstr "Zmiany w wiki"
+
+msgid "Issue tracker"
+msgstr "Rejestr spraw"
+
+msgid "Filter issues"
+msgstr "Przeszukaj sprawy"
+
+msgid "Search this wiki"
+msgstr "Szukaj w wiki"
+
+msgid "Wiki options"
+msgstr "Opcje wiki"
+
+#, fuzzy
+msgid "Recent changes"
+msgstr "Zmiany w wiki"
+
+#, fuzzy
+msgid "Wiki search"
+msgstr "Zmiany w wiki"
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/i18n/plone-pt.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/plone-pt.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/plone-pt.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,58 @@
+# Portuguese translation for ZWiki CMF/Plone actions
+# placeholder, copied from the brazilian portuguese version - SM
+msgid ""
+msgstr ""
+"Project-Id-Version: ZWiki 0.41.0\n"
+"POT-Creation-Date: Fri Jun 11 09:11:35 2004\n"
+"PO-Revision-Date: 2005-08-29 09:22+0000\n"
+"Last-Translator: Jean Rodrigo Ferri <jeanrodrigoferri at yahoo.com.br>\n"
+"Language-Team: João Villa-Lobos <joaovlb at gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: pt_PT\n"
+"Language-name: Português\n"
+"Preferred-encodings: utf-8\n"
+"Domain: plone\n"
+
+# CMF/Plone Wiki Page actions
+msgid "View"
+msgstr "Visualizar"
+
+msgid "Edit"
+msgstr "Editar"
+
+msgid "History"
+msgstr "Histórico"
+
+msgid "Backlinks"
+msgstr "Links de retorno"
+
+msgid "Subscribe"
+msgstr "Inscrição"
+
+msgid "Wiki contents"
+msgstr "Conteúdos do wiki"
+
+msgid "Wiki changes"
+msgstr "Alterações no wiki"
+
+msgid "Issue tracker"
+msgstr "Acompanhamento de ocorrências"
+
+msgid "Filter issues"
+msgstr "Filtro de ocorrências"
+
+msgid "Search this wiki"
+msgstr "Buscar neste wiki"
+
+msgid "Wiki options"
+msgstr "Opções do wiki"
+
+#, fuzzy
+msgid "Recent changes"
+msgstr "Alterações no wiki"
+
+#, fuzzy
+msgid "Wiki search"
+msgstr "Alterações no wiki"
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/i18n/plone-pt_BR.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/plone-pt_BR.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/plone-pt_BR.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,57 @@
+# Brazilian Portuguese translation for ZWiki
+# Jean Rodrigo Ferri <jeanrodrigoferri at yahoo.com.br>, 2004
+msgid ""
+msgstr ""
+"Project-Id-Version: ZWiki 0.33.0\n"
+"POT-Creation-Date: Fri Jun 11 09:11:35 2004\n"
+"PO-Revision-Date: 2005-11-15 22:03+0000\n"
+"Last-Translator: Daniel Nobre <danielnnobre at yahoo.com.br>\n"
+"Language-Team: TcheZope.org <tchezope at yahoogrupos.com.br>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: pt_BR\n"
+"Language-name: Português do Brasil\n"
+"Preferred-encodings: utf-8\n"
+"Domain: plone\n"
+
+# CMF/Plone Wiki Page actions
+# some overlap with CMF/Plone and standard zwiki skin translations here
+msgid "View"
+msgstr "Visualizar"
+
+msgid "Edit"
+msgstr "Editar"
+
+msgid "History"
+msgstr "Histórico"
+
+msgid "Backlinks"
+msgstr "Links de retorno"
+
+msgid "Subscribe"
+msgstr "Inscrição"
+
+msgid "Wiki contents"
+msgstr "Conteúdos do wiki"
+
+msgid "Wiki changes"
+msgstr "Alterações no wiki"
+
+msgid "Issue tracker"
+msgstr "Acompanhamento de ocorrências"
+
+msgid "Filter issues"
+msgstr "Filtro de ocorrências"
+
+msgid "Search this wiki"
+msgstr "Buscar neste wiki"
+
+msgid "Wiki options"
+msgstr "Opções do wiki"
+
+msgid "Recent changes"
+msgstr "Alterações recentes"
+
+msgid "Wiki search"
+msgstr "Busca no wiki"
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/i18n/plone-ru.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/plone-ru.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/plone-ru.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,56 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: ZWiki-0-31-0dev\n"
+"POT-Creation-Date: Fri Jun 11 09:11:35 2004\n"
+"PO-Revision-Date: 2005-08-29 09:22+0000\n"
+"Last-Translator: Jordi Mallach <jordi at canonical.com>\n"
+"Language-Team: <spliter(at)is.lg.ua>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: ru\n"
+"Language-name: Russian\n"
+"Preferred-encodings: latin1 utf-8\n"
+"Domain: plone\n"
+
+# CMF/Plone Wiki Page actions
+msgid "View"
+msgstr "Вид"
+
+msgid "Edit"
+msgstr "Редактировать"
+
+msgid "History"
+msgstr "История"
+
+msgid "Backlinks"
+msgstr "Обратные ссылки"
+
+msgid "Subscribe"
+msgstr "Подписаться"
+
+msgid "Wiki contents"
+msgstr "Содержание"
+
+msgid "Wiki changes"
+msgstr "Изменения"
+
+msgid "Issue tracker"
+msgstr "Свойства элемента"
+
+msgid "Filter issues"
+msgstr "Фильтровать элементы"
+
+msgid "Search this wiki"
+msgstr "Искать в этой wiki"
+
+msgid "Wiki options"
+msgstr "Свойства wiki"
+
+#, fuzzy
+msgid "Recent changes"
+msgstr "Изменения"
+
+#, fuzzy
+msgid "Wiki search"
+msgstr "Изменения"
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/i18n/plone-sv.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/plone-sv.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/plone-sv.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,58 @@
+# Swedish translation for zwiki
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the zwiki package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Jun 11 09:11:35 2004\n"
+"PO-Revision-Date: 2006-03-15 21:18+0000\n"
+"Last-Translator: Simon Michael <simon at joyful.com>\n"
+"Language-Team: Swedish <sv at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+"Domain: plone\n"
+
+msgid "View"
+msgstr "Visa"
+
+msgid "Edit"
+msgstr "Redigera"
+
+msgid "History"
+msgstr "Historik"
+
+msgid "Backlinks"
+msgstr "Baklänkar"
+
+msgid "Subscribe"
+msgstr "Prenumerera"
+
+msgid "Wiki contents"
+msgstr "Wiki innehåll"
+
+msgid "Wiki changes"
+msgstr "Wiki ändringar"
+
+msgid "Issue tracker"
+msgstr "Problemhanterare"
+
+msgid "Filter issues"
+msgstr "Filterproblem"
+
+msgid "Search this wiki"
+msgstr "Sök i denna wiki"
+
+msgid "Wiki options"
+msgstr "Wiki inställningar"
+
+msgid "Recent changes"
+msgstr "Senaste ändringar"
+
+msgid "Wiki search"
+msgstr "Wiki sök"
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/i18n/plone-tr.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/plone-tr.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/plone-tr.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,58 @@
+# Turkish translation for zwiki
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the zwiki package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Jun 11 09:11:35 2004\n"
+"PO-Revision-Date: 2006-03-15 21:18+0000\n"
+"Last-Translator: Simon Michael <simon at joyful.com>\n"
+"Language-Team: Turkish <tr at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+"Domain: plone\n"
+
+msgid "View"
+msgstr "Görünüm"
+
+msgid "Edit"
+msgstr "Düzenle"
+
+msgid "History"
+msgstr "Geçmiş"
+
+msgid "Backlinks"
+msgstr ""
+
+msgid "Subscribe"
+msgstr "Kayıt Ol"
+
+msgid "Wiki contents"
+msgstr "Wiki içerikleri"
+
+msgid "Wiki changes"
+msgstr "Wiki deÄŸiÅŸiklikleri"
+
+msgid "Issue tracker"
+msgstr ""
+
+msgid "Filter issues"
+msgstr ""
+
+msgid "Search this wiki"
+msgstr "Bunu wiki de ara"
+
+msgid "Wiki options"
+msgstr "wiki seçenekleri"
+
+msgid "Recent changes"
+msgstr "Son deÄŸiÅŸiklikler"
+
+msgid "Wiki search"
+msgstr "Wiki ara"
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/i18n/plone-zh_CN.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/plone-zh_CN.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/plone-zh_CN.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,57 @@
+# Zwiki messages which must be in the plone domain - actions
+msgid ""
+msgstr ""
+"Project-Id-Version: ZWiki-0-31-0\n"
+"POT-Creation-Date: Fri Jun 11 09:11:35 2004\n"
+"PO-Revision-Date: 2005-08-29 09:22+0000\n"
+"Last-Translator: Jordi Mallach <jordi at canonical.com>\n"
+"Language-Team: <zwiki at zwiki.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: zope/app/translation_files/extract.py\n"
+"Language-code: zh-cn\n"
+"Language-name: 简体中文\n"
+"Preferred-encodings: utf-8\n"
+"Domain: plone\n"
+
+# CMF/Plone Wiki Page actions
+# some overlap with CMF/Plone and standard zwiki skin translations here
+msgid "View"
+msgstr "检视"
+
+msgid "Edit"
+msgstr "修改"
+
+msgid "History"
+msgstr "历史"
+
+msgid "Backlinks"
+msgstr "回溯"
+
+msgid "Subscribe"
+msgstr "订阅"
+
+msgid "Wiki contents"
+msgstr "快纪内容"
+
+msgid "Wiki changes"
+msgstr "快纪变更"
+
+msgid "Issue tracker"
+msgstr "事例追踪"
+
+msgid "Filter issues"
+msgstr "过滤事例"
+
+msgid "Search this wiki"
+msgstr "搜寻快纪"
+
+msgid "Wiki options"
+msgstr "快纪选项"
+
+msgid "Recent changes"
+msgstr "最近变更"
+
+msgid "Wiki search"
+msgstr "快纪搜寻"
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/i18n/plone-zh_TW.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/plone-zh_TW.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/plone-zh_TW.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,57 @@
+# Zwiki messages which must be in the plone domain - actions
+msgid ""
+msgstr ""
+"Project-Id-Version: ZWiki-0-31-0\n"
+"POT-Creation-Date: Fri Jun 11 09:11:35 2004\n"
+"PO-Revision-Date: 2005-08-29 09:22+0000\n"
+"Last-Translator: Jordi Mallach <jordi at canonical.com>\n"
+"Language-Team: <zwiki at zwiki.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: zope/app/translation_files/extract.py\n"
+"Language-code: zh-tw\n"
+"Language-name: 正體中文\n"
+"Preferred-encodings: utf-8\n"
+"Domain: plone\n"
+
+# CMF/Plone Wiki Page actions
+# some overlap with CMF/Plone and standard zwiki skin translations here
+msgid "View"
+msgstr "檢視"
+
+msgid "Edit"
+msgstr "修改"
+
+msgid "History"
+msgstr "歷史"
+
+msgid "Backlinks"
+msgstr "回溯"
+
+msgid "Subscribe"
+msgstr "訂閱"
+
+msgid "Wiki contents"
+msgstr "快紀內容"
+
+msgid "Wiki changes"
+msgstr "快紀變更"
+
+msgid "Issue tracker"
+msgstr "事例追蹤"
+
+msgid "Filter issues"
+msgstr "過濾事例"
+
+msgid "Search this wiki"
+msgstr "搜尋快紀"
+
+msgid "Wiki options"
+msgstr "快紀選項"
+
+msgid "Recent changes"
+msgstr "最近變更"
+
+msgid "Wiki search"
+msgstr "快紀搜尋"
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/i18n/pt.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/pt.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/pt.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1691 @@
+# Portuguese Portuguese translation for ZWiki
+# João Villa-Lobos <jeoaovlb at gmail.com>, 2005
+msgid ""
+msgstr ""
+"Project-Id-Version: ZWiki 0.41.0\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-02-26 09:03+0000\n"
+"Last-Translator: João Villa-Lobos <joaovlb at gmail.com>\n"
+"Language-Team: João Villa-Lobos <joaovlb at gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: pt\n"
+"Language-name: Português\n"
+"Preferred-encodings: utf-8\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr "Não está autorizado a actualizar todas as páginas."
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr "(pasta -> Gerir propriedades)"
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "Não está autorizado a renomear esta página ZWiki."
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "Não está autorizado a renomear esta página ZWiki."
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr ""
+"Não está autorizado a perfilhar ou alterar subtópicos linkados nesta página "
+"ZWiki."
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr "Não está autorizado a alterar o tipo desta página ZWiki."
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr "Não está autorizado a editar esta página ZWiki."
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr "Não está autorizado a apagar esta página ZWiki."
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+"Esta página foi renomeada para %s. Pode apaga-la caso já não seja "
+"necessária.\n"
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr "Não está autorizado a transferir arquivos aqui."
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr "Não está autorizado a adicionar um link nesta Página ZWiki."
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr ""
+
+#: src/ZWiki/Editing.py:830
+#, fuzzy
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr ""
+"Ocorreu um problema: %s. Por favor, contacte o administrador do sítio para "
+"auxílio."
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+msgid "exceeded max_identified_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr ""
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr "que páginas que apontam para esta ?"
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr ""
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr "anos"
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr "ano"
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr "mês"
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr "meses"
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr "semanas"
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr "semana"
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr "dia"
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr "dias"
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr "horas"
+
+#: src/ZWiki/Utils.py:473
+#, fuzzy
+msgid "hour"
+msgstr "ou"
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr ""
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr ""
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr ""
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr ""
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr "A página está bloqueada"
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+"\n"
+"            Esta página está bloqueada por webDAV. Provavelmente alguém está "
+"editando-a\n"
+"            com um editor externo. Aguarde até que a outra pessoa acabe\n"
+"            e tente novamente. Caso tenha feito alguma alteração,\n"
+"            guarde a sua versão do texto como referência e aceda novamente "
+"à\n"
+"            página.\n"
+"            "
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr "Para descartar suas alterações e tentar novamente, clique em OK."
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr "Editar conflito"
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr "Alguém gravou esta página enquanto a editava"
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr "Para resolver o conflito, faça o seguinte"
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr "Clique no botão voltar do seu navegador"
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr "Copiar suas edições recentes para o clipboard"
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr "Clique no botão actualizar do seu navegador"
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr ""
+"Cole novamente as suas edições, mantendo em mente as últimas alterações"
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr "Clique novamente no botão Alterar"
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr "ou"
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr "Para descartar as suas alterações e começar de novo, clique em OK"
+
+#: src/ZWiki/Views.py:490
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+#, fuzzy
+msgid "create this page"
+msgstr "voltar à página"
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:809
+#, fuzzy
+msgid "show last edit"
+msgstr "mostrar funcionalidades básicas"
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr ""
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr ""
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr "comentários"
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr "história completa"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr "<< edição anterior"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr "próxima edição >>"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+msgid "Revert this change and all successive changes"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+#, fuzzy
+msgid "plone"
+msgstr "Nota para a história da página (opcional)"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+msgid "show all features"
+msgstr "mostrar todas as funcionalidades"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+msgid "show basic features"
+msgstr "mostrar funcionalidades básicas"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+msgid "simple"
+msgstr "simples"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr "mostrar apenas funcionalidades essenciais"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+#, fuzzy
+msgid "subtopic"
+msgstr "é um subtópico de:"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+#, fuzzy
+msgid "for this page"
+msgstr "ir para a página inicial"
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+msgid "title"
+msgstr "título"
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+msgid "Issue browser"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+msgid "Issue tracker"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "Não está autorizado a editar esta página ZWiki."
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr "gravidade"
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr "estado"
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+#, fuzzy
+msgid "age"
+msgstr "Altere"
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr "Nome:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr "Categoria:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr "Gravidade:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr "Estado:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+msgid "Here are the wiki's issue pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr "Detalhes:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+#, fuzzy
+msgid "search options"
+msgstr "mostrar o conteúdo da wiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+#, fuzzy
+msgid "Severities:"
+msgstr "nunca"
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr "Estados:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+msgid "Enter a search term, click the numbers to the right,"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+#, fuzzy
+msgid "Name"
+msgstr "Nome da página"
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr "Categoria"
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+#, fuzzy
+msgid "filter issues"
+msgstr "Filtro de assuntos"
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr "Gravidade"
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr "Estado"
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+#, fuzzy
+msgid "Optional subject"
+msgstr "Nota de alteração opcional"
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+#, fuzzy
+msgid "Optional comment"
+msgstr "Nota de alteração opcional"
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "Adicionar Wiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+msgid "Id:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+#, fuzzy
+msgid "Title:"
+msgstr "Título"
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "Adicionar Wiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+#, fuzzy
+msgid "Page"
+msgstr "Nome da página"
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+#, fuzzy
+msgid "Time"
+msgstr "Título"
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+#, fuzzy
+msgid "search issues"
+msgstr "Filtro de assuntos"
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+#, fuzzy
+msgid "Page names matching"
+msgstr "Nome da página"
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+#, fuzzy
+msgid "recent"
+msgstr "Perfilhar"
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr "Nome de utilizador:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+#, fuzzy
+msgid "Email address:"
+msgstr "O seu endereço de email"
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+#, fuzzy
+msgid "(allows mail subscription)"
+msgstr "Subscrição por email"
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr "Guardar opções"
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+#, fuzzy
+msgid "Page&nbsp;name:"
+msgstr "Nome da página"
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "Uma Página Wiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+msgid "Topic"
+msgstr "Tópico"
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+msgid "Comments"
+msgstr "Comentários"
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+#, fuzzy
+msgid "Views"
+msgstr "Visualizar"
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+msgid "Created"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr "#"
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr "por"
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+msgid "Subtopics"
+msgstr "Subtópicos"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+msgid "Here are it's subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+#, fuzzy
+msgid "Related pages"
+msgstr "voltar à página"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+#, fuzzy
+msgid "Parents"
+msgstr "Perfilhar"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr "é um tópico principal."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr "é um subtópico de:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+#, fuzzy
+msgid "Backlinks"
+msgstr "Links para"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr "Aqui estão as páginas que apontam para esta:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+#, fuzzy
+msgid "No other pages link to this one."
+msgstr "que páginas que apontam para esta ?"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr "Perfilhar"
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+#, fuzzy
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+"Ocorreu um problema com um destes templates de aspecto do wiki. Talvez "
+"exista um objecto com um ID de um template de aspecto que não é um Page "
+"Template ou DTML Method, ou o template pode estar danificado."
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr "assunto"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr "um assunto ajuda a clarificar discussões e AlteracoesRecentes"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+"para comentar (e contactar via cc quaisquer subscritores) introduza texto "
+"aqui e clique adicionar"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+#, fuzzy
+msgid "${nb} subscribers"
+msgstr "Subscritores da página"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+#, fuzzy
+msgid "1 subscriber"
+msgstr "Subscritores da Wiki"
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+#, fuzzy
+msgid "add-comment"
+msgstr "adicionar um comentário"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+#, fuzzy
+msgid "Wiki contents"
+msgstr "Conteúdo da Wiki"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr "Simples"
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+#, fuzzy
+msgid "Edit history"
+msgstr "história completa"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+#, fuzzy
+msgid "Edit:"
+msgstr "Editar"
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+#, fuzzy
+msgid "Manage"
+msgstr "Altere"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+msgid "Revert this and later edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr "Regressar à página"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+#, fuzzy
+msgid "Time:"
+msgstr "Título"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+#, fuzzy
+msgid "Note:"
+msgstr "Nome:"
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr "Nota de alteração opcional"
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr "Transferir um arquivo ou imagem"
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+#, fuzzy
+msgid "upload a file and link it on this page ?"
+msgstr "Transferir um arquivo ou imagem"
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr "Para ajuda na edição, veja"
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+#, fuzzy
+msgid "preview this edit"
+msgstr "<< edição anterior"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr "criar esta página wiki"
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+#, fuzzy
+msgid "label_preview"
+msgstr "(Obrigatório)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr "Nome da página"
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr "tipo"
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+#, fuzzy
+msgid "(external edit)"
+msgstr "editar utilizando um editor externo"
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+#, fuzzy
+msgid "show wiki recent changes"
+msgstr "mostrar o conteúdo da wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr "alterações"
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr "discussão"
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr "mostrar o conteúdo da wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+#, fuzzy
+msgid "contents"
+msgstr "Conteúdos"
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+#, fuzzy
+msgid "show wiki index"
+msgstr "mostrar o conteúdo da wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr "índice"
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+#, fuzzy
+msgid "uploads"
+msgstr "Esta página mostra todas as transferências efectuadas nesta Wiki."
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+#, fuzzy
+msgid "show help page"
+msgstr "ir para a página inicial"
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr "ajuda"
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+#, fuzzy
+msgid "show wiki options"
+msgstr "mostrar o conteúdo da wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+#, fuzzy
+msgid "backlinks"
+msgstr "Links para"
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr "configurar a subscrição por email para esta página ou site"
+
+# Default: ""
+# "You can subscribe to this page or to the whole wiki.\n"
+# "          Subscribers receive a copy of comments via email\n"
+#: src/ZWiki/skins/zwiki/links.pt:73
+#, fuzzy
+msgid "subscribe"
+msgstr "Pode tornar-se subscritor desta página ou da wiki na sua totalidade."
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr "mostrar o historial relativo a alterações desta página"
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr "editar"
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr "editar utilizando um editor externo"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr "ir para a página inicial"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+#, fuzzy
+msgid "search all pages"
+msgstr "mostrar todas as funcionalidades"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+#, fuzzy
+msgid "parent,"
+msgstr "Perfilhar"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+#, fuzzy
+msgid "replacement,"
+msgstr "Perfilhar"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+#, fuzzy
+msgid "page"
+msgstr "Altere"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+#, fuzzy
+msgid "reparent"
+msgstr "Perfilhar"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+#, fuzzy
+msgid "make this page a subtopic of the page you have entered"
+msgstr "perfilhe esta página em relação à página que introduziu"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+"renomeie esta página para o nome dado por si, actualizando todos os links"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+#, fuzzy
+msgid "rename"
+msgstr "Nome da página"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+#, fuzzy
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr "perfilhe esta página em relação à página que introduziu"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+#, fuzzy
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+"renomeie esta página para o nome dado por si, actualizando todos os links"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+msgid "Recent changes"
+msgstr "Alterações recentes"
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+msgid "Search this wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+#, fuzzy
+msgid "all edits"
+msgstr "editar"
+
+# Default: ""
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr ""
+"Encontra-se subscrito <br /n>\n"
+"à totalidade da wiki"
+
+# Default: ""
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr ""
+"Não se encontra subscrito <br /n>\n"
+"à totalidade da wiki"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr "Subscrição por email"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr "Anular a subscrição da wiki na sua totalidade"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr "Subscrever a wiki na sua totalidade"
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr "Está subscrito a estas outras páginas"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr "Subscritores da página"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr "Subscritores da Wiki"
+
+# Default: ""
+# "You can subscribe to this page or to the whole wiki.\n"
+# "          Subscribers receive a copy of comments via email\n"
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+#, fuzzy
+msgid "subscribe_desc_comments"
+msgstr "Pode tornar-se subscritor desta página ou da wiki na sua totalidade."
+
+# Default: ""
+# "You can subscribe to this page or to the whole wiki.\n"
+# "          Subscribers receive a copy of comments via email\n"
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+#, fuzzy
+msgid "subscribe_desc_edits"
+msgstr "Pode tornar-se subscritor desta página ou da wiki na sua totalidade."
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr "O seu endereço de email"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr "Altere"
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr "Para subscrever, por favor introduza o endereço de email."
+
+# Default: ""
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr ""
+"Encontra-se subscrito<br />\n"
+"a esta página."
+
+# Default: ""
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr ""
+"Não se encontra subscrito<br />\n"
+"a esta página."
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+#, fuzzy
+msgid " Unsubscribe from this page "
+msgstr " Anular a subscrição da wiki na sua totalidade "
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+#, fuzzy
+msgid " Subscribe to this page "
+msgstr " Subscrever a wiki na sua totalidade "
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+#, fuzzy
+msgid "User options"
+msgstr "mostrar o conteúdo da wiki"
+
+#, fuzzy
+#~ msgid "Type"
+#~ msgstr "tipo"
+
+#~ msgid "File"
+#~ msgstr "Ficheiro"
+
+#~ msgid "Add and Edit"
+#~ msgstr "Adicionar e Editar"
+
+#~ msgid "Backlinks for"
+#~ msgstr "Links para"
+
+#, fuzzy
+#~ msgid "singleton_desc"
+#~ msgstr "Simples"
+
+#~ msgid "History for"
+#~ msgstr "Histórico para"
+
+#~ msgid "return to page"
+#~ msgstr "voltar à página"
+
+#~ msgid "help_shortname"
+#~ msgstr ""
+#~ "Nota: Renomear uma página numa grande wiki pode ser lento. Outras páginas "
+#~ "serão actualizadas se possível."
+
+#~ msgid "label_body_text"
+#~ msgstr "Corpo do texto"
+
+# Default: ""
+# "In a Wiki page, you use [square brackets] to create links. When you save the page, the contents\n"
+#~ msgid "help_wikibody"
+#~ msgstr ""
+#~ "Numa página Wiki, utilizam-se [parêntesis rectos] para criar links. "
+#~ "Quando a página é gravada, o conteúdo introduzido\n"
+#~ "            dentro dos parêntesis rectos terá um pequeno link <code>?</"
+#~ "code> à sua frente que pode ser utilizado para criar\n"
+#~ "            uma nova página com esse nome."
+
+# Default: ""
+# "In a Wiki page, you use [square brackets] to create links. When you save the page, the contents\n"
+#, fuzzy
+#~ msgid "help_wikiwords"
+#~ msgstr ""
+#~ "Numa página Wiki, utilizam-se [parêntesis rectos] para criar links. "
+#~ "Quando a página é gravada, o conteúdo introduzido"
+
+#~ msgid "label_note"
+#~ msgstr "Nota para a história da página (opcional)"
+
+#~ msgid "help_wikinote"
+#~ msgstr "Uma curta descrição de suas alterações."
+
+#~ msgid "label_upload_contents_optional"
+#~ msgstr "Transferir um arquivo ou imagem (opcional)"
+
+#~ msgid "help_wikiupload"
+#~ msgstr "Anexar um arquivo ou uma imagem para esta página wiki."
+
+#~ msgid "label_format"
+#~ msgstr "Formato da página"
+
+# Default: ""
+#~ msgid "help_format"
+#~ msgstr ""
+#~ "Se está incerto sobre qual formato usar, simplesmente seleccione Texto\n"
+#~ "            Simples e escreva o texto como faz normalmente."
+
+#~ msgid "Save"
+#~ msgstr "Gravar"
+
+# Default: ""
+# "Edit\n"
+# "        ${itemtype} \n"
+#~ msgid "heading_edit_wiki_page"
+#~ msgstr ""
+#~ "Editar\n"
+#~ "        ${itemtype} \n"
+#~ "\n"
+#~ "        \"${pagename}\""
+
+#~ msgid "description_edit_wiki_page"
+#~ msgstr "Uma página Wiki permite-lhe criar páginas ricamente interligadas."
+
+#~ msgid "legend_wiki_page_details"
+#~ msgstr "Detalhes da Página Wiki"
+
+#~ msgid "label_pagename"
+#~ msgstr "Nome da página"
+
+#~ msgid "Required"
+#~ msgstr "Obraigatório"
+
+#~ msgid "label_required"
+#~ msgstr "(Obrigatório)"
+
+#~ msgid "heading_wiki_recent_changes"
+#~ msgstr "Alterações recentes"
+
+#~ msgid "heading_wiki_search_wiki"
+#~ msgstr "Procurar nesta wiki"
+
+#, fuzzy
+#~ msgid "Unsubscribe from this page"
+#~ msgstr "Anular a subscrição da wiki na sua totalidade"
+
+#, fuzzy
+#~ msgid "Subscribe to this page"
+#~ msgstr "Subscrever a wiki na sua totalidade"
+
+#~ msgid "heading_wiki_user_options"
+#~ msgstr "Opções do utilizador"
+
+#, fuzzy
+#~ msgid "add a comment"
+#~ msgstr "adicionar um comentário"
+
+#~ msgid "heading_wiki_filter_issues"
+#~ msgstr "Filtro de assuntos"
+
+#, fuzzy
+#~ msgid "heading_wiki_issue_browser"
+#~ msgstr "Filtro de assuntos"
+
+#, fuzzy
+#~ msgid "property change"
+#~ msgstr "Alterações recentes"
+
+# Default: ""
+# "You can change this page's parent(s) to place it within the overall page\n"
+#~ msgid "backlinks_reparent_help"
+#~ msgstr ""
+#~ "Pode alterar o(s) pai(s) desta página de modo a colocá-la dentro da "
+#~ "hierarquia geral das páginas.\n"
+#~ " Seleccione a caixa ou insira um novo nome de página e clique em "
+#~ "Perfilhar.\n"
+#~ "Regra geral, ter apenas um pai é suficiente."
+
+# Default: ""
+# "You can change this page's parent(s) to place it within the overall page\n"
+#, fuzzy
+#~ msgid "backlinks_reparent_help2"
+#~ msgstr ""
+#~ "Pode alterar o(s) pai(s) desta página de modo a colocá-la dentro da "
+#~ "hierarquia geral das páginas."
+
+#~ msgid "View"
+#~ msgstr "Visualizar"
+
+#, fuzzy
+#~ msgid "Comment"
+#~ msgstr "Conteúdos"
+
+#, fuzzy
+#~ msgid "A Comment"
+#~ msgstr "adicionar um comentário"
+
+#, fuzzy
+#~ msgid "Table of Contents"
+#~ msgstr "Conteúdos"
+
+#~ msgid "Wiki"
+#~ msgstr "Wiki"
+
+#, fuzzy
+#~ msgid "Subscriptions"
+#~ msgstr "Descrição"
+
+#, fuzzy
+#~ msgid "Wiki User"
+#~ msgstr "Subscritores da Wiki"
+
+#~ msgid "Wiki Page"
+#~ msgstr "Página Wiki"
+
+#, fuzzy
+#~ msgid "Wiki Page Comment"
+#~ msgstr "Conteúdo da Wiki"
+
+#~ msgid "Wiki Editor"
+#~ msgstr "Editor Wiki"
+
+#~ msgid "The Wiki Editor can create and edit wikis."
+#~ msgstr "O Editor Wiki pode criar ou editar wikis."
+
+#~ msgid "Wiki Administrator"
+#~ msgstr "Administrador Wiki"
+
+#~ msgid "Edit Wiki Page"
+#~ msgstr "Editar Página Wiki"
+
+#~ msgid "Delete Wiki Page"
+#~ msgstr "Remover Página Wiki"
+
+#, fuzzy
+#~ msgid "Reparent Wiki Page"
+#~ msgstr "Perfilhar"
+
+#~ msgid "XXX"
+#~ msgstr "XXX"
+
+#~ msgid "File Uploads"
+#~ msgstr "Transferência de Ficheiros"
+
+#~ msgid "uploads_desc"
+#~ msgstr "Esta página mostra todas as transferências efectuadas nesta Wiki."
+
+#, fuzzy
+#~ msgid "save"
+#~ msgstr "Gravar"
+
+#, fuzzy
+#~ msgid "view"
+#~ msgstr "Visualizar"
+
+#~ msgid "no_files_uploaded"
+#~ msgstr "Não foram transferidos ficheiros."
+
+#~ msgid "box_wiki_navigation"
+#~ msgstr "Navegação da Wiki"
+
+#~ msgid "Diffs for"
+#~ msgstr "Diferenças para"
+
+#~ msgid "Show subtopics on this page & below ?"
+#~ msgstr "Mostrar subtópicos nesta página e filhas?"
+
+#~ msgid "default"
+#~ msgstr "padrão"
+
+#~ msgid "parent_name_replace"
+#~ msgstr "novo pai, nome ou substituto"
+
+#~ msgid ""
+#~ "move this page to the recycle bin, and relink to the name you have "
+#~ "entered."
+#~ msgstr ""
+#~ "envie esta página para o recycle bin e altere o link para o nome que "
+#~ "introduziu."
+
+#, fuzzy
+#~ msgid "Here are the pages which link to"
+#~ msgstr "Aqui estão as páginas que apontam para esta:"
+
+# Default: ""
+# "You can also set this page's <em>parent(s)</em>, to locate it within the\n"
+#~ msgid "box_zwiki_showhierarchy"
+#~ msgstr ""
+#~ "Pode também definir o(s) <em>pai(s)</em> desta página de modo a colocá-la "
+#~ "dentro da\n"
+#~ " hierarquia de conteúdo. Seleccione as caixas ou introduza o nome de uma "
+#~ "nova página e clique\n"
+#~ " Perfilhar. Regra geral apenas um pai é suficiente."
+
+#~ msgid "Other parent"
+#~ msgstr "Outro pai"
+
+#, fuzzy
+#~ msgid "&laquo; previous edit"
+#~ msgstr "<< edição anterior"
+
+#, fuzzy
+#~ msgid "next edit &raquo;"
+#~ msgstr "próxima edição >>"
+
+#~ msgid "pagetype"
+#~ msgstr "Tipo da página"
+
+#~ msgid "Change and View"
+#~ msgstr "Altere e Visualize"

Added: zope-zwiki/branches/upstream/current/i18n/pt_BR.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/pt_BR.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/pt_BR.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1897 @@
+# Brazilian Portuguese translation for ZWiki
+# Jean Rodrigo Ferri <jeanrodrigoferri at yahoo.com.br>, 2004
+msgid ""
+msgstr ""
+"Project-Id-Version: ZWiki 0.33.0\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-01-20 18:10+0000\n"
+"Last-Translator: Jean Rodrigo Ferri <jeanrodrigoferri at yahoo.com.br>\n"
+"Language-Team: TcheZope.org <tchezope at yahoogrupos.com.br>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: pt_BR\n"
+"Language-name: Português do Brasil\n"
+"Preferred-encodings: utf-8\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr "Você não está autorizado a atualizar todas as páginas."
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr "(pasta -> Gerenciar propriedades)"
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "Você não está autorizado a renomear esta página ZWiki."
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "Você não está autorizado a renomear esta página ZWiki."
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr ""
+"Você não está autorizado a reorientar ou alterar subtópicos linkados nesta "
+"página ZWiki."
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr "Você não está autorizado a alterar o tipo desta página ZWiki."
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr "Você não está autorizado a editar esta página ZWiki."
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr "Você não está autorizado a deletar esta página ZWiki."
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+"Esta página foi renomeada para %s. Você poderá deletá-la se não precisar "
+"mais.\n"
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr "Você não está autorizado a carregar arquivos aqui."
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr "Você não está autorizado a adicionar um link nesta Página ZWiki."
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr ""
+
+#: src/ZWiki/Editing.py:830
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+msgid "exceeded max_identified_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr "anônimo"
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr "Que páginas linkam para esta?"
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr "Você está aqui"
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr "anos"
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr "ano"
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr "mês"
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr "meses"
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr "semanas"
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr "semana"
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr "dia"
+
+#: src/ZWiki/Utils.py:471
+#, fuzzy
+msgid "days"
+msgstr "dias"
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr "horas"
+
+#: src/ZWiki/Utils.py:473
+#, fuzzy
+msgid "hour"
+msgstr "hora"
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr "minuto"
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr "minutos"
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr "segundo"
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr "segundos"
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr "A página está bloqueada"
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+"\n"
+"            Esta página tem um bloqueio webDAV. Provavelmente alguém está "
+"editando-a\n"
+"            com um editor externo. Você precisa aguardar até isto ser\n"
+"            finalizado e então tentar novamente. Se você tiver feito alguma "
+"alteração,\n"
+"            você deve voltar e copiar a sua versão do texto como\n"
+"            referência.\n"
+"            "
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr "Para descartar suas alterações e tentar novamente, clique em OK."
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr "Editar conflito"
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr "Alguém salvou esta página enquanto você estava editando"
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr "Para resolver o conflito, faça isto"
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr "Clique no botão voltar do seu navegador"
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr "Copiar suas edições recentes para o clipboard"
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr "Clique no botão atualizar do seu navegador"
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr ""
+"Colar novamente nas suas edições, sendo lembradas as últimas alterações"
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr "Clique novamente no botão Alterar"
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr "ou"
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr "Para descartar suas alterações e iniciar novamente, clique em OK"
+
+#: src/ZWiki/Views.py:490
+#, fuzzy
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+"\n"
+"        0    mostrar as atribuições dessa chave de acesso\n"
+"\n"
+"        funções do wiki:\n"
+"        f    mostrar a página frontal\n"
+"        c    mostrar os conteúdos do wiki\n"
+"        r    mostrar as alterações recentes no wikis\n"
+"             mostrar a página de discussões\n"
+"        t    mostrar o acompanhamento de ocorrências\n"
+"        i    mostrar o sumário do wiki\n"
+"        o    mostrar as opções do wiki (preferências)\n"
+"        h    mostrar a página de ajuda\n"
+"        s    ir para o campo de busca\n"
+"        \n"
+"        funções da página:\n"
+"        v    visualizar a página\n"
+"        +    visualizar as páginas em modo cheio\n"
+"        =    visializar as páginas em modo simples\n"
+"        -    visualizar as páginas em modo mínimo\n"
+"        m    inscrição de e-mail\n"
+"        b    mostrar links de retorno (links para esta página)\n"
+"        d    mostrar comparações (página do histórico de edições)\n"
+"        y    mostrar todo o histórico (na ZMI)\n"
+"        e    editar esta página                       \n"
+"        x    editar com um editor externo\n"
+"             imprimir esta página (e os subtópicos)\n"
+"        q    visualizar o código fonte da página (visão-rápida)\n"
+"             Limpar e gerar esta página renderizada em cache\n"
+"             ir para os subtópicos\n"
+"             ir para os comentários (mensagens)\n"
+"             ir para a home page do autor, se for possível\n"
+"        n    próxima página\n"
+"        p    página anterior\n"
+"        u    subir para a página pai\n"
+"        \n"
+"        no formulário de edições:\n"
+"        s    salvar alterações\n"
+"        \n"
+"        quando visualizando comparações:\n"
+"        n    próxima edição\n"
+"        p    edição anterior\n"
+"        "
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr "criar esta página"
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr "última edição %(interval)s atrás"
+
+#: src/ZWiki/ZWikiPage.py:809
+#, fuzzy
+msgid "show last edit"
+msgstr "mostrar a última edição %(lastlog)s"
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr "por %(editor)s"
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr ""
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/pagetypes/common.py:253
+#, fuzzy
+msgid "comments"
+msgstr "comentários"
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr "responder"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr "toda a história"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+#, fuzzy
+msgid "<< previous edit"
+msgstr "<< edição anterior"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+#, fuzzy
+msgid "next edit >>"
+msgstr "próxima edição >>"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+msgid "Revert this change and all successive changes"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+#, fuzzy
+msgid "plone"
+msgstr "Nota para a história da página (opcional)"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+msgid "show all features"
+msgstr "mostrar todas as características"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr "tudo"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+msgid "show basic features"
+msgstr "mostrar características básicas"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+msgid "simple"
+msgstr "simples"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr "mostrar somente características essenciais"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr "mínimo"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+#, fuzzy
+msgid "subtopic"
+msgstr "é um subtópico de:"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+#, fuzzy
+msgid "for this page"
+msgstr "criar esta página"
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+#, fuzzy
+msgid "title"
+msgstr "Título"
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr "Filtro de ocorrências"
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+#, fuzzy
+msgid "Issue browser"
+msgstr "acompanhamento de ocorrências"
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+#, fuzzy
+msgid "Issue tracker"
+msgstr "acompanhamento de ocorrências"
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "Você não está autorizado a editar esta página ZWiki."
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr "categoria"
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+#, fuzzy
+msgid "severity"
+msgstr "variedade"
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr "estado"
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+#, fuzzy
+msgid "age"
+msgstr "idade"
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr "modificado"
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr "Adicionar uma nova ocorrência:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+#, fuzzy
+msgid "Name:"
+msgstr "Nome:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr "Categoria:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+#, fuzzy
+msgid "Severity:"
+msgstr "Variedade:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr "Estado:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+#, fuzzy
+msgid "Here are the wiki's issue pages."
+msgstr "Aqui estão as páginas de ocorrências do wiki."
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr "Detalhes:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr "adiciona ocorrência"
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr "Mais avançado"
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+#, fuzzy
+msgid "issue tracker"
+msgstr "acompanhamento de ocorrências"
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+#, fuzzy
+msgid "search options"
+msgstr "opções de busca"
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr "Nome contém:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr "Texto da página contém:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr "Categorias:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+#, fuzzy
+msgid "Severities:"
+msgstr "Variedades:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr "Estados"
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+#, fuzzy
+msgid "Enter a search term, click the numbers to the right,"
+msgstr "Insira um termo de busca, ou clique nos números a direita, ou"
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr "Enviado por"
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+#, fuzzy
+msgid "Name"
+msgstr "Nome"
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr "Categoria"
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+#, fuzzy
+msgid "filter issues"
+msgstr "filtro de ocorrências"
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+#, fuzzy
+msgid "Severity"
+msgstr "Variedade"
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr "Estado"
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+#, fuzzy
+msgid "Optional subject"
+msgstr "Nota opcional"
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+#, fuzzy
+msgid "Optional comment"
+msgstr "Nota opcional"
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "adicionar uma Página ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+#, fuzzy
+msgid "Id:"
+msgstr "Identificador"
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+#, fuzzy
+msgid "Title:"
+msgstr "Título"
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "adicionar uma Página ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr "Páginas alteradas ultimamente"
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr "Páginas recentemente alteradas, com os sumários"
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr "Mostrar sumários ?"
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr "Atualizar"
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+#, fuzzy
+msgid "Page"
+msgstr "Página"
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr "Editado&nbsp;por"
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr "Tempo"
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr "NOVO"
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr "Páginas marcadas (NOVO) foram criadas durante a última semana"
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr "buscar ocorrências"
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr ""
+"Insira uma paravra ou frase e acesse enter para buscar no wiki inteiro."
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr "Isto é o mesmo que usar o campo de busca no topo direito."
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr ""
+"Dicas: Uma palavra simples funciona melhor para nomes de páginas combinados."
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+"Insensível-a-caixa e wildcards podem ser suportados dependendo da "
+"configuração do seu catálogo."
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr "Deixe em branco para listar todas as páginas."
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr "Buscar"
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+#, fuzzy
+msgid "Page names matching"
+msgstr "Nomes das páginas combinados"
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr "Texto combinado"
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+#, fuzzy
+msgid "recent"
+msgstr "recente"
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+#, fuzzy
+msgid "Set your preferences for this wiki:"
+msgstr "Configure suas preferências do site abaixo."
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+#, fuzzy
+msgid "User name:"
+msgstr "Nome do usuário"
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+#, fuzzy
+msgid "(identifies your edits)"
+msgstr "identifique suas edições"
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+#, fuzzy
+msgid "Email address:"
+msgstr "Endereço de e-mail"
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+#, fuzzy
+msgid "(allows mail subscription)"
+msgstr "Envio de inscrição"
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+#, fuzzy
+msgid "Your time zone:"
+msgstr "Local de tempo"
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr "(localizar a maioria dos tempos)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+#, fuzzy
+msgid "Edit form height:"
+msgstr "Editar formulário"
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+#, fuzzy
+msgid "Save options"
+msgstr "Salvar opções"
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr "todos"
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+#, fuzzy
+msgid "Forget options"
+msgstr "Opções esquecidas"
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+#, fuzzy
+msgid "Add ZWiki Page"
+msgstr "adicionar uma Página ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+#, fuzzy
+msgid "Page&nbsp;name:"
+msgstr "Nome da página"
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "adicionar uma Página ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+#, fuzzy
+msgid "Topic"
+msgstr "é um subtópico de:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+#, fuzzy
+msgid "Comments"
+msgstr "comentários"
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+#, fuzzy
+msgid "Views"
+msgstr "visualizar"
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+#, fuzzy
+msgid "Created"
+msgstr "Criar"
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+#, fuzzy
+msgid "Subtopics"
+msgstr "é um subtópico de:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+#, fuzzy
+msgid "Here are it's subtopics."
+msgstr "Aqui estão as páginas de ocorrências do wiki."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+#, fuzzy
+msgid "Related pages"
+msgstr "criar esta página"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+#, fuzzy
+msgid "Parents"
+msgstr "Reordenar"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr "é um tópico de nível superior."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr "é um subtópico de:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+#, fuzzy
+msgid "Backlinks"
+msgstr "links para"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr "Aqui estão as páginas que apontam para esta:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+#, fuzzy
+msgid "No other pages link to this one."
+msgstr "Que páginas linkam para esta?"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr "Reordenar"
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+#, fuzzy
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+"Existe um problema com um destes templates de pele do wiki. Talvez exista um "
+"objeto com um ID de um template de pele que não é uma Page Template ou DTML "
+"Method, ou o template pode estar danificado."
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr "assunto"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr "um assunto ajuda a esclarecer threads e RecentChanges"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr "respondendo"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+"para comentar (e enviar cópia para alguns inscritos) insira o texto aqui e "
+"clique em adicionar"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr "${nb} inscritos"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr "1 inscrito"
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr "Adicionar um comentário"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+#, fuzzy
+msgid "Wiki contents"
+msgstr "Conteúdos do wiki"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr "Simples"
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+#, fuzzy
+msgid "Edit history"
+msgstr "toda a história"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+#, fuzzy
+msgid "Edit:"
+msgstr "editar"
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+#, fuzzy
+msgid "Manage"
+msgstr "Alterar"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+msgid "Revert this and later edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+#, fuzzy
+msgid "Return to page"
+msgstr "voltar para a página"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+#, fuzzy
+msgid "Time:"
+msgstr "Tempo"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+#, fuzzy
+msgid "Note:"
+msgstr "votos"
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr "comutar entre os modos fonte/WYSIWYG"
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr "Nota de alteração opcional"
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr "uma nota cria ModificacoesRecentes mais usáveis"
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr "Carregar um arquivo ou imagem"
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+#, fuzzy
+msgid "upload a file and link it on this page ?"
+msgstr "carregar um arquivo e apontá-lo nesta página"
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr "Para ajuda na ediçao, veja"
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr "PaginaDeAjuda"
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr "RegrasDeFormatacaoDeTexto"
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+#, fuzzy
+msgid "preview this edit"
+msgstr "<< edição anterior"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+#, fuzzy
+msgid "Preview"
+msgstr "visualizar"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+#, fuzzy
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr "cancelar esta edição e retornar para a página"
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr "Criar"
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr "criar esta página wiki"
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+#, fuzzy
+msgid "label_preview"
+msgstr "(Requerido)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr "Nome da página"
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr "o nome desta página wiki (a alteração disto pode ser lenta!)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr "tipo"
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr "selecione o estilo de formatação e renderização desta página"
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr "(edição externa)"
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr "inicial"
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+#, fuzzy
+msgid "show wiki recent changes"
+msgstr "mostrar as alterações recentes no wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+#, fuzzy
+msgid "changes"
+msgstr "alterações"
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr "mostrar a página de discussões"
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr "discussão"
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+#, fuzzy
+msgid "show issue tracker"
+msgstr "mostrar acompanhamento de ocorências"
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr "ocorrências"
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr "mostrar os conteúdos do wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+#, fuzzy
+msgid "contents"
+msgstr "conteúdos"
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr "mostrar o sumário do wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr "sumário"
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr "mostrar a página de atualizações"
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr "atualizações"
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr "mostrar a página de ajuda"
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr "ajuda"
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr "mostrar as opções do wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr "opções"
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+#, fuzzy
+msgid "backlinks"
+msgstr "links para"
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr "configurar a inscrição de e-mail para esta página ou site"
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr "inscreva"
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr "mostrar o histórico de alterações desta página"
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr "mostrar a página de frente"
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr "comparar"
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr "editar"
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr "editar usando um editor externo"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr "vá para a página inicial"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr "buscar em todas as páginas"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+#, fuzzy
+msgid "parent,"
+msgstr "Reordenar"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+#, fuzzy
+msgid "name,"
+msgstr "nome"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+#, fuzzy
+msgid "replacement,"
+msgstr "reordenar"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+#, fuzzy
+msgid "page"
+msgstr "idade"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+#, fuzzy
+msgid "reparent"
+msgstr "Reordenar"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+#, fuzzy
+msgid "make this page a subtopic of the page you have entered"
+msgstr "reordene esta página na página que você quer inserir"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+"renomeie esta página para o nome que você quer inserir, atualizando todos os "
+"links"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+#, fuzzy
+msgid "rename"
+msgstr "renomear"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr "deletar!"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+#, fuzzy
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr "reordene esta página na página que você quer inserir"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+#, fuzzy
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+"renomeie esta página para o nome que você quer inserir, atualizando todos os "
+"links"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+#, fuzzy
+msgid "create"
+msgstr "criar"
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+#, fuzzy
+msgid "Recent changes"
+msgstr "mostrar as alterações recentes no wiki"
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+#, fuzzy
+msgid "Search this wiki"
+msgstr "criar esta página wiki"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+#, fuzzy
+msgid "all edits"
+msgstr "editar"
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr ""
+"Você está atualmente inscrito<br />\n"
+"                em todo o wiki."
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr ""
+"Você não está atualmente inscrito<br />\n"
+"                no em todo o wiki."
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr "Envio de inscrição"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr "Desfazer inscrição em todo o wiki"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr "Inscrever-se em todo o wiki"
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr "Você está inscrito nestas outras páginas"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr "Inscritos na página"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr "Inscritos no wiki"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+#, fuzzy
+msgid "subscribe_desc_comments"
+msgstr ""
+"Você pode inscrever-se nesta página ou em todo o wiki.\n"
+"          Os inscritos recebem uma cópia dos comentários via e-mail\n"
+"          (porém não as edições gerais, a menos que seja habilitado pelo "
+"administrador do site).\n"
+"          Ou retorne para"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+#, fuzzy
+msgid "subscribe_desc_edits"
+msgstr ""
+"Você pode inscrever-se nesta página ou em todo o wiki.\n"
+"          Os inscritos recebem uma cópia dos comentários via e-mail\n"
+"          (porém não as edições gerais, a menos que seja habilitado pelo "
+"administrador do site).\n"
+"          Ou retorne para"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr "Seu endereço de e-mail"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr "Alterar"
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr "Para inscrever-se, por favor configure o seu endereço de e-mail."
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr ""
+"Você está atualmente inscrito<br />\n"
+"                nesta página."
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr ""
+"Você não está atualmente inscrito<br />\n"
+"                nesta página."
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr " Desfazer inscrição nesta página "
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr " Inscrever nesta página "
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+#, fuzzy
+msgid "User options"
+msgstr "opções de busca"
+
+#~ msgid "Add a ZWiki web"
+#~ msgstr "Adicione um ZWiki web"
+
+#, fuzzy
+#~ msgid "Type"
+#~ msgstr "tipo"
+
+#~ msgid "Create wiki"
+#~ msgstr "Criar um wiki"
+
+#~ msgid "and enter"
+#~ msgstr "e entre"
+
+#~ msgid ""
+#~ "You may create a new ZWiki Page object using the form below. You may also "
+#~ "choose to upload an existing html file from your local computer by "
+#~ "clicking the <i>Browse</i> button."
+#~ msgstr ""
+#~ "Você pode criar um novo objeto Página ZWiki usando o formulário abaixo. "
+#~ "Você também pode escolher atualizar um arquivo html existente do seu "
+#~ "computador local clicando o botão <i>Navegar</i>."
+
+#~ msgid "File"
+#~ msgstr "Arquivo"
+
+#~ msgid "Add"
+#~ msgstr "Adicionar"
+
+#~ msgid "Add and Edit"
+#~ msgstr "Adicionar e Editar"
+
+#, fuzzy
+#~ msgid "log_note"
+#~ msgstr "Nota para a história da página (opcional)"
+
+#~ msgid "Backlinks for"
+#~ msgstr "Links para"
+
+#, fuzzy
+#~ msgid "singleton_desc"
+#~ msgstr "Simples"
+
+#, fuzzy
+#~ msgid "History for"
+#~ msgstr "Histórico para"
+
+#~ msgid "return to page"
+#~ msgstr "voltar para a página"
+
+#~ msgid "help_shortname"
+#~ msgstr ""
+#~ "Nota: Renomear uma página em um wiki grande pode ser lento. Outras "
+#~ "páginas serão atualizadas se possível."
+
+#~ msgid "label_body_text"
+#~ msgstr "Corpo do texto"
+
+#~ msgid "help_wikibody"
+#~ msgstr ""
+#~ "Em uma página Wiki, você usa [colchetes] para criar links. Quando você "
+#~ "salva a página, os conteúdos\n"
+#~ "            entre colchetes terão um pequeno link <code>?</code> depois "
+#~ "deles, que você clica para criar\n"
+#~ "            uma nova página com esse nome."
+
+#, fuzzy
+#~ msgid "help_wikiwords"
+#~ msgstr ""
+#~ "Em uma página Wiki, você usa [colchetes] para criar links. Quando você "
+#~ "salva a página, os conteúdos\n"
+#~ "            entre colchetes terão um pequeno link <code>?</code> depois "
+#~ "deles, que você clica para criar\n"
+#~ "            uma nova página com esse nome."
+
+#~ msgid "label_note"
+#~ msgstr "Nota para a história da página (opcional)"
+
+#~ msgid "help_wikinote"
+#~ msgstr "Uma curta descrição de suas alteraçães."
+
+#~ msgid "label_upload_contents_optional"
+#~ msgstr "Carregar um arquivo ou imagem (opcional)"
+
+#~ msgid "help_wikiupload"
+#~ msgstr "Anexar um arquivo ou uma imagem nesta página wiki."
+
+#~ msgid "label_format"
+#~ msgstr "Formato da página"
+
+#~ msgid "help_format"
+#~ msgstr ""
+#~ "Se você está incerto de que formato usar, simplesmente selecione Texto\n"
+#~ "            Plano e digite o documento como você geralmente faz."
+
+#~ msgid "Save"
+#~ msgstr "Salvar"
+
+#~ msgid "heading_edit_wiki_page"
+#~ msgstr ""
+#~ "Editar\n"
+#~ "        ${itemtype} \n"
+#~ "\n"
+#~ "        \"${pagename}\""
+
+#~ msgid "description_edit_wiki_page"
+#~ msgstr ""
+#~ "Uma página do Wiki permite a você criar páginas ricamente interconectadas."
+
+#~ msgid "legend_wiki_page_details"
+#~ msgstr "Detalhes da Página Wiki"
+
+#~ msgid "label_pagename"
+#~ msgstr "Nome da página"
+
+#~ msgid "Required"
+#~ msgstr "Requerido"
+
+#~ msgid "label_required"
+#~ msgstr "(Requerido)"
+
+#~ msgid "heading_wiki_recent_changes"
+#~ msgstr "Alterações recentes"
+
+#~ msgid "heading_wiki_search_wiki"
+#~ msgstr "Buscar neste wiki"
+
+#~ msgid "Unsubscribe from this page"
+#~ msgstr "Desfazer inscrição nesta página"
+
+#~ msgid "Subscribe to this page"
+#~ msgstr "Inscrever nesta página"
+
+#~ msgid "heading_wiki_user_options"
+#~ msgstr "Opções do usuário"
+
+#~ msgid "heading_wiki_filter_issues"
+#~ msgstr "Filtro de ocorrências"
+
+#, fuzzy
+#~ msgid "heading_wiki_issue_browser"
+#~ msgstr "Acompanhamento de ocorrências"
+
+#~ msgid "heading_wiki_issue_tracker"
+#~ msgstr "Acompanhamento de ocorrências"
+
+#, fuzzy
+#~ msgid "property change"
+#~ msgstr "mostrar as alterações recentes no wiki"
+
+#~ msgid "backlinks_reparent_help"
+#~ msgstr ""
+#~ "Você pode alterar o(s) pai(s) desta(s) página(s) para colocá-la(s) com "
+#~ "todas as páginas\n"
+#~ "da hierarquia. Selecione a caixa ou insira um novo nome de página e "
+#~ "clique em Reparentar.\n"
+#~ "Um pai simples é geralmente suficiente."
+
+#, fuzzy
+#~ msgid "backlinks_reparent_help2"
+#~ msgstr ""
+#~ "Você pode alterar o(s) pai(s) desta(s) página(s) para colocá-la(s) com "
+#~ "todas as páginas\n"
+#~ "da hierarquia. Selecione a caixa ou insira um novo nome de página e "
+#~ "clique em Reparentar.\n"
+#~ "Um pai simples é geralmente suficiente."
+
+#, fuzzy
+#~ msgid "View"
+#~ msgstr "visualizar"
+
+#, fuzzy
+#~ msgid "Comment"
+#~ msgstr "comentários"
+
+#, fuzzy
+#~ msgid "A Comment"
+#~ msgstr "comentários"
+
+#, fuzzy
+#~ msgid "A Wiki"
+#~ msgstr "adicionar uma Página ZWiki"
+
+#, fuzzy
+#~ msgid "Table of Contents"
+#~ msgstr "Conteudos"
+
+#, fuzzy
+#~ msgid "Subscriptions"
+#~ msgstr "Envio de inscrição"
+
+#, fuzzy
+#~ msgid "Change Wiki Page"
+#~ msgstr "adicionar uma Página ZWiki"
+
+#, fuzzy
+#~ msgid "Wiki User"
+#~ msgstr "Inscritos no wiki"
+
+#, fuzzy
+#~ msgid "A Wiki Page"
+#~ msgstr "adicionar uma Página ZWiki"
+
+#, fuzzy
+#~ msgid "Wiki Page"
+#~ msgstr "adicionar uma Página ZWiki"
+
+#, fuzzy
+#~ msgid "A Wiki Page Comment"
+#~ msgstr "adicionar uma Página ZWiki"
+
+#, fuzzy
+#~ msgid "Wiki Page Comment"
+#~ msgstr "Conteúdos"
+
+#, fuzzy
+#~ msgid "View a Wiki Page"
+#~ msgstr "adicionar uma Página ZWiki"
+
+#, fuzzy
+#~ msgid "View Wiki Page"
+#~ msgstr "adicionar uma Página ZWiki"
+
+#, fuzzy
+#~ msgid "Edit Wiki Page"
+#~ msgstr "adicionar uma Página ZWiki"
+
+#, fuzzy
+#~ msgid "Delete Wiki Page"
+#~ msgstr "adicionar uma Página ZWiki"
+
+#, fuzzy
+#~ msgid "Reparent Wiki Page"
+#~ msgstr "adicionar uma Página ZWiki"
+
+#~ msgid "page in parent wiki"
+#~ msgstr "página no wiki pai"
+
+#~ msgid "File Uploads"
+#~ msgstr "Arquivos Carregados"
+
+#~ msgid "uploads_desc"
+#~ msgstr "Esta página lista todas as cargas neste Wiki"
+
+#, fuzzy
+#~ msgid "save"
+#~ msgstr "salvar"
+
+#~ msgid "view"
+#~ msgstr "visualizar"
+
+#~ msgid "no_files_uploaded"
+#~ msgstr "Nenhum arquivo foi carregado"
+
+#~ msgid "box_wiki_navigation"
+#~ msgstr "Navegação no wiki"
+
+#~ msgid "enter comments here and click add; or, click edit"
+#~ msgstr "insira comentários aqui e clique adicionar; ou, clique editar"
+
+#, fuzzy
+#~ msgid "Details & comments"
+#~ msgstr "Detalhes e comentários"
+
+#~ msgid "hits"
+#~ msgstr "acessos"
+
+#~ msgid ""
+#~ "no catalog or the catalog search gave an error, a brute-force search was "
+#~ "used"
+#~ msgstr ""
+#~ "nenhum catálogo ou deu um erro no catálogo de buscas, uma busca na força-"
+#~ "bruta foi usada"
+
+#~ msgid "Contents"
+#~ msgstr "Conteudos"
+
+#~ msgid "Diffs for"
+#~ msgstr "Comparações para"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "nome"
+
+#~ msgid "page rating"
+#~ msgstr "avaliação da página"
+
+#~ msgid "rating_score"
+#~ msgstr ""
+#~ "${score} de\n"
+#~ "  ${nb_votes} votos"
+
+#~ msgid "click to rate"
+#~ msgstr "clique para avaliar"
+
+#~ msgid "voting as"
+#~ msgstr "votando como"
+
+#, fuzzy
+#~ msgid "Here are the pages which link to"
+#~ msgstr "Aqui estão as páginas que apontam para"
+
+#, fuzzy
+#~ msgid "box_canreparent"
+#~ msgstr "reordenar"
+
+#~ msgid "Other parent"
+#~ msgstr "Outro pai"
+
+#~ msgid "You may also click the full, simple, minimal links if provided."
+#~ msgstr ""
+#~ "Você pode tambem clicar nos links total, simples, mínimo se estiverem "
+#~ "disponíveis."
+
+#~ msgid "for subscribing"
+#~ msgstr "para inscrição"
+
+#~ msgid "width"
+#~ msgstr "largura"
+
+#~ msgid "height"
+#~ msgstr "altura"
+
+#~ msgid "textarea dimensions; width will be 100% if supported"
+#~ msgstr "dimensões da área de texto; se suportada, a largura deve ser 100%"
+
+#~ msgid "Your local time is"
+#~ msgstr "Seu tempo local é"
+
+#~ msgid "Show logo ?"
+#~ msgstr "Mostrar o logo ?"
+
+#~ msgid "No"
+#~ msgstr "Não"
+
+#~ msgid "Yes"
+#~ msgstr "Sim"
+
+#~ msgid "Show page hierarchy ?"
+#~ msgstr "Mostrar a hierarquia de páginas ?"
+
+#~ msgid "This wiki keeps a page hierarchy, which you can use or ignore."
+#~ msgstr ""
+#~ "Este wiki mantém uma hierarquia de páginas, que você pode usar ou ignorar."
+
+#~ msgid "Show search field ?"
+#~ msgstr "Mostrar campo de busca ?"
+
+#~ msgid "except in minimal mode"
+#~ msgstr "exceto no modo mínimo"
+
+#~ msgid "Show AnnoyingQuote ?"
+#~ msgstr "Mostrar CitaçõesIrritantes ?"
+
+#~ msgid "in full mode"
+#~ msgstr "em modo total"
+
+#~ msgid "Show page management form ?"
+#~ msgstr "Mostrar a página de gerenciamento?"
+
+#~ msgid "You must also configure a username or be logged in."
+#~ msgstr "Você deve configurar um nome de usuário ou logar-se."
+
+#~ msgid "no subscribers"
+#~ msgstr "nenhum incrito"
+
+#~ msgid "parent_name_replace"
+#~ msgstr "novo pai, nome ou substituição"
+
+#~ msgid ""
+#~ "enter a new parent, new name, replacement page (if any) or subtopic name"
+#~ msgstr ""
+#~ "insira um novo pai, novo nome, substitua a página (se tiver) ou o nome do "
+#~ "subtópico"
+
+#~ msgid "box_zwiki_showhierarchy"
+#~ msgstr ""
+#~ "Você pode também configurar o(s) <em>pai(s)</em> desta página, para "
+#~ "localizá-la na\n"
+#~ "    hierarquia de conteúdos. Selecione as caixar ou insira um novo nome "
+#~ "da página e clique \n"
+#~ "    Reordenar. Um pai simples geralmente é suficiente."
+
+#~ msgid ""
+#~ "move this page to the recycle bin, and relink to the name you have entered"
+#~ msgstr ""
+#~ "mova esta página para a lixeira, e reaponte para o nome que você quer "
+#~ "inserir"
+
+#, fuzzy
+#~ msgid "create a new subtopic of this page"
+#~ msgstr "criar um novo subtópico desta página"
+
+#~ msgid "cancel"
+#~ msgstr "cancelar"
+
+#~ msgid "Show subtopics on this page & below ?"
+#~ msgstr "Mostrar subtópicos nesta página e abaixo?"
+
+#~ msgid "default"
+#~ msgstr "padrão"
+
+#~ msgid "never"
+#~ msgstr "nunca"
+
+#, fuzzy
+#~ msgid "always show subtopics on this page"
+#~ msgstr "sempre mostrar subtópicos nesta página"
+
+#~ msgid "always"
+#~ msgstr "sempre"
+
+#~ msgid "pagetype"
+#~ msgstr "Tipo da página"

Added: zope-zwiki/branches/upstream/current/i18n/ro.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/ro.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/ro.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1307 @@
+# Romanian translation for zwiki
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the zwiki package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Romanian <ro at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"100 > 19) || ((n % 100 == 0) && (n != 0))) ? 2: 1))\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr ""
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr ""
+
+#: src/ZWiki/Diff.py:174
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr ""
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr ""
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr ""
+
+#: src/ZWiki/Editing.py:830
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+msgid "exceeded max_identified_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr ""
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr ""
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr ""
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr ""
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr ""
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr ""
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr ""
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr ""
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr ""
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr ""
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr ""
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr ""
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr ""
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr ""
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr ""
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr ""
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr ""
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr ""
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr ""
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr ""
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr ""
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr ""
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr ""
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr ""
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr ""
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr ""
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr ""
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr ""
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr ""
+
+#: src/ZWiki/Views.py:490
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:809
+msgid "show last edit"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr ""
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr ""
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+msgid "Revert this change and all successive changes"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+msgid "plone"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+msgid "show all features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+msgid "show basic features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+msgid "simple"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+msgid "subtopic"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+msgid "for this page"
+msgstr ""
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+msgid "title"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+msgid "Issue browser"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+msgid "Issue tracker"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+msgid "age"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+msgid "Here are the wiki's issue pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+msgid "search options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+msgid "Severities:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+msgid "Enter a search term, click the numbers to the right,"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+msgid "Name"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+msgid "filter issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+msgid "Optional subject"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+msgid "Optional comment"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+msgid "Add ZWiki"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+msgid "Id:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+msgid "Title:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+msgid "Add wiki"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+msgid "recent"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+msgid "Email address:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+msgid "(allows mail subscription)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+msgid "Page&nbsp;name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+msgid "Add wiki page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+msgid "Topic"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+msgid "Comments"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+msgid "Views"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+msgid "Created"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+msgid "Subtopics"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+msgid "Here are it's subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+msgid "Related pages"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+msgid "Parents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+msgid "Backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+msgid "No other pages link to this one."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr ""
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+msgid "Edit history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+msgid "Edit:"
+msgstr ""
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+msgid "Manage"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+msgid "Revert this and later edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+msgid "Time:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+msgid "Note:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "preview this edit"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr ""
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+msgid "label_preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+msgid "parent,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+msgid "replacement,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+msgid "page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "reparent"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "make this page a subtopic of the page you have entered"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+msgid "Recent changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+msgid "Search this wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+msgid "all edits"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr ""
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr ""
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr ""
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+msgid "subscribe_desc_comments"
+msgstr ""
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+msgid "subscribe_desc_edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr ""
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr ""
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr ""
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+msgid "User options"
+msgstr ""

Added: zope-zwiki/branches/upstream/current/i18n/ru.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/ru.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/ru.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1852 @@
+# translation of zwiki-ru.po to Russian
+# Denis Mishunoff <spliter at is.lg.ua>, 2004-2005.
+# Michael Krishtopa (theo at ua.fm), 2005
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki-ru\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-06-14 11:27+0000\n"
+"Last-Translator: Valery Sharapov <lumbermill at yandex.ru>\n"
+"Language-Team: Russian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-code: ru\n"
+"Language-name: Russian\n"
+"Preferred-encodings: latin1 utf-8\n"
+"Domain: zwiki\n"
+"X-Generator: KBabel 1.3.1\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr "Вы не авторизованы для обновления всех страниц."
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr "(папка -> Управление свойствами)"
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "Вы не авторизованы для переименования этой Zwiki страницы."
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "Вы не авторизованы для переименования этой Zwiki страницы."
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr ""
+"Вы не авторизованы для изменения или переназначения ссылок подтем на "
+"этойстранице Zwiki."
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr "Вы не авторизованы для изменения типа этой Zwiki страницы."
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr "Вы не авторизованы для редактирования этой Zwiki страницы."
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr "Вы не авторизованы для удаления этой Zwiki страницы."
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+"Эта страница была переименована в <%s>. Вы можете удалить эту, если она "
+"большене нужна.\n"
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr "Вы не авторизованы для закачивания сюда файлов."
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr "Вы не авторизованы для добавления ссылки на эту Zwiki страницу."
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr "совпадение с banned_links"
+
+#: src/ZWiki/Editing.py:830
+#, fuzzy
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr "Есть проблема: %s. За помощью, пожалуйста свяжитесь с администратором."
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr "превышено max_anonymous_links"
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+#, fuzzy
+msgid "exceeded max_identified_links"
+msgstr "превышено max_anonymous_links"
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr "анонимный пользователь"
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr "какие страницы ссылаются на эту?"
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr "Вы находитесь тут"
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr "года"
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr "год"
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr "месяц"
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr "месяцев"
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr "недель"
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr "неделя"
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr "день"
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr "дней"
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr "часов"
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr "час"
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr "минута"
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr "минут"
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr "секунда"
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr "секунд"
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr "Страница залочена"
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+"\n"
+"            На этой странице - замОк WebDav. Скорее всего, кто-то "
+"редактирует её\n"
+"            внешним редактором. Вам надо подождать, пока они закончат, и "
+"затем\n"
+"            попытаться снова. Если Вы лишь внесли некоторые изменения, Вы,\n"
+"            скорее всего, захотите сохранить и скопировать копию Вашей "
+"версии\n"
+"            текста, для справки.\n"
+"            "
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr "Для отмены внесенных изменений и повторной попытки, нажмите 'Ok'."
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr "Конфликт редактирования"
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr "Кто-то другой сохранил эту страницу во время Вашего редактирования"
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr "Для разрешения конфликта, сделайте следующее"
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr "Нажмите кнопку Назад в своем браузере"
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr "Скопируйте Ваши текущие изменения"
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr "Нажмите кнопку Обновить в своем браузере"
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr ""
+"Вставьте скопированную ранее информацию, содержащюю последние изменения"
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr "Нажмите кнопку Изменить снова"
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr "или"
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr "Для отмены внесенных изменений и что бы начать заново, нажмите 'Ok'"
+
+#: src/ZWiki/Views.py:490
+#, fuzzy
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+"\n"
+"        0    показать эти назначения кючей\n"
+"\n"
+"        функции Wiki:\n"
+"        f    показать главную страницу\n"
+"        c    показать содержание Wiki\n"
+"        r    показать последние изменения Wiki\n"
+"             показать страницу обсуждения\n"
+"        t    показать текущую задачу\n"
+"        i    показать индекс Wiki\n"
+"        o    показать опции Wiki (настройки)\n"
+"        h    показать страницу помощи\n"
+"        s    перейти к полю поиска\n"
+"        \n"
+"        функции страницы:\n"
+"        v    просмотреть страницу\n"
+"        +    смотреть страницы в полном режиме\n"
+"        =    смотреть страницы в нормальном режиме\n"
+"        -    смотреть страницы в минимальном режиме\n"
+"        m    отправить подписку\n"
+"        b    показать обратные ссылки (ссылки на эту страницу)\n"
+"        d    показать изменения (история редактирования страницы)\n"
+"        y    показать полную историю (в ZMI)\n"
+"        e    редактировать эту страницу\n"
+"        x    редактировать внешним редактором\n"
+"             распечатать эту страницу (и подтемы)\n"
+"        q    просмотреть код страницы (быстрый просмотр)\n"
+"             очистить и регенерировать кэш этой страницы\n"
+"             перейти к подтемам\n"
+"             перейти к комментариям (сообщениям)\n"
+"             перейти к домашней странице автора, если возможно\n"
+"        n    следующая страница\n"
+"        p    предыдущая страница\n"
+"        u    вверх на родительскую страницу\n"
+"        \n"
+"        на форме редактирования:\n"
+"        s    сохранить изменения\n"
+"        \n"
+"        при просмотре различий:\n"
+"        n    следующее редактирование\n"
+"        p    предыдущее редактирование\n"
+"        "
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr "последний раз редактировал %(interval)s назад"
+
+#: src/ZWiki/ZWikiPage.py:809
+#, fuzzy
+msgid "show last edit"
+msgstr "показать последнее редактирование %(lastlog)s"
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr "%(editor)s"
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr "Добавление Кэш Наброска Zwiki не нужно"
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr "комментарии"
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr "Нужен \"=\" после \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr "Нужно значение для ключа \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr "Создать новый рисунок \"%(filename)s\""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr "Изменить рисунок %(filename)s"
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr "Нужно \"%(wanted)s\" после \"%(key)s\", а не \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr "ответить"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr "полная история"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr "<< предыдущее редактирование"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr "следующее редактирование >>"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+msgid "Revert this change and all successive changes"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+#, fuzzy
+msgid "plone"
+msgstr "Заметка для истории страницы (необязательно)"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+msgid "show all features"
+msgstr "показать все особенности"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr "полный"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+msgid "show basic features"
+msgstr "показать основные особенности"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+msgid "simple"
+msgstr "простой"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr "показать только отличительные особенности"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr "минимальный"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+#, fuzzy
+msgid "subtopic"
+msgstr "является подтемой:"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+#, fuzzy
+msgid "for this page"
+msgstr "создать эту wiki страницу"
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+#, fuzzy
+msgid "title"
+msgstr "Заголовок"
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr "Фильтровать задачи"
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+#, fuzzy
+msgid "Issue browser"
+msgstr "текущая задача"
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+#, fuzzy
+msgid "Issue tracker"
+msgstr "текущая задача"
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "Вы не авторизованы для редактирования этой Zwiki страницы."
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr "категория"
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr "строгость"
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr "статус"
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+msgid "age"
+msgstr "возраст"
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr "модифицирован"
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr "Добавить новую задачу:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr "Имя:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr "Категория:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr "Строгость:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr "Статус:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+msgid "Here are the wiki's issue pages."
+msgstr "Это страницы задач wiki."
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr "Детали:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr "добавить задачу"
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr "Расширенный"
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr "текущая задача"
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+msgid "search options"
+msgstr "опции поиска"
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr "Имя содержит любое из:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr "Текст страницы содержит любое из:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr "Категории:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+msgid "Severities:"
+msgstr "Строгость:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr "Статус:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+#, fuzzy
+msgid "Enter a search term, click the numbers to the right,"
+msgstr "Введите ключевое слово, или нажмите числа справа, или"
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr "Подана на рассмотрение"
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+msgid "Name"
+msgstr "Имя"
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr "Категория"
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+msgid "filter issues"
+msgstr "фильтровать задачи"
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr "Строгость"
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr "Статус"
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+#, fuzzy
+msgid "Optional subject"
+msgstr "Возможная заметка"
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+#, fuzzy
+msgid "Optional comment"
+msgstr "Возможная заметка"
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "Добавить страницу ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+#, fuzzy
+msgid "Id:"
+msgstr "Идентификатор (ID)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+#, fuzzy
+msgid "Title:"
+msgstr "Заголовок"
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "Добавить страницу ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr "В последний раз страница изменялась"
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr "Недавно измененные страницы с описаниями"
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr "Показать описания?"
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr "Обновить"
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr "Страница"
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr "Отредактировано&nbsp;"
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr "Время"
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr "Отмеченные страницы (NEW) созданы за последнюю неделю"
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr "Элементы поиска"
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr ""
+"Введите слово или фразу и нажмите 'Enter' для начала поиска по всей wiki."
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr "Это то же самое, что использовать поле поиска справа."
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr ""
+"Советы: отдельное слово лучше работает на соответствие названиям страниц."
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+"Могут поддерживаться нечуствительность к регистру и специальные символы, в "
+"зависимости от конфигурации Вашего каталога."
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr "Оставьте пустым, что бы получить все страницы."
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr "Поиск"
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr "Названия страниц, Соответствующие запросу"
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr "Текст, соответствующий запросу"
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+msgid "recent"
+msgstr "недавние"
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+#, fuzzy
+msgid "Set your preferences for this wiki:"
+msgstr "Ниже установите настройки Вашего сайта."
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+#, fuzzy
+msgid "User name:"
+msgstr "Имя пользователя"
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+#, fuzzy
+msgid "(identifies your edits)"
+msgstr "идентифицирует Ваши редактирования"
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+#, fuzzy
+msgid "Email address:"
+msgstr "Email адрес"
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+#, fuzzy
+msgid "(allows mail subscription)"
+msgstr "Подписка по почте"
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+#, fuzzy
+msgid "Your time zone:"
+msgstr "Часовой пояс"
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr "(локализует большинство часовых поясов)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+#, fuzzy
+msgid "Edit form height:"
+msgstr "Форма редактирования"
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr "Сохранить опции"
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr "все"
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr "Забыть опции"
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr "Добавить страницу ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+#, fuzzy
+msgid "Page&nbsp;name:"
+msgstr "Название страницы"
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "Добавить страницу ZWiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+#, fuzzy
+msgid "Topic"
+msgstr "является подтемой:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+#, fuzzy
+msgid "Comments"
+msgstr "Добавить"
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+#, fuzzy
+msgid "Views"
+msgstr "Просмотр"
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+#, fuzzy
+msgid "Created"
+msgstr "создать"
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+#, fuzzy
+msgid "Subtopics"
+msgstr "является подтемой:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+#, fuzzy
+msgid "Here are it's subtopics."
+msgstr "Это страницы задач wiki."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+msgid "Related pages"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+#, fuzzy
+msgid "Parents"
+msgstr "Переназначить"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr "тема верхнего уровня."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr "является подтемой:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+#, fuzzy
+msgid "Backlinks"
+msgstr "обратные ссылки"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr "Страницы, которые ссылаются на неё:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+#, fuzzy
+msgid "No other pages link to this one."
+msgstr "какие страницы ссылаются на эту?"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr "Переназначить"
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+#, fuzzy
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+"С одним из шаблонов стиля этой wiki возникли проблемы. Возможно есть объект "
+"с ID шаблона стиля, который не является Page Template или DTML методом, или "
+"шаблона может отсутствовать."
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr "тема"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr ""
+"тема помогает сделать более понятными поток комментариев и Последние "
+"Изменения"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr "ответить"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+"для добавления комментария (and cc any subscribers) введите тут текст и "
+"нажмите 'Добавить'"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr "${nb} подписчиков"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr "1 подписчик"
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr "Добавить"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr "Содержание Wiki"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr "Единственные потомки"
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+#, fuzzy
+msgid "Edit history"
+msgstr "полная история"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+#, fuzzy
+msgid "Edit:"
+msgstr "редактировать"
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+#, fuzzy
+msgid "Manage"
+msgstr "Изменить"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+msgid "Revert this and later edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+#, fuzzy
+msgid "Return to page"
+msgstr "вернуться на страницу"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+#, fuzzy
+msgid "Time:"
+msgstr "Время"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+#, fuzzy
+msgid "Note:"
+msgstr "Имя:"
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr "переключить режимы код/WYSIWYG"
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr "Заметка про изменения. Необязательно."
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr "заметка делает Последние Изменения более информативными"
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr "Загрузите файл или изображение"
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr "загрузить файл и связать его с этой страницей?"
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr "Для помощи при редактировании смотрите"
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr "Страница помощи"
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr "Правила форматирования текста"
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+#, fuzzy
+msgid "preview this edit"
+msgstr "<< предыдущее редактирование"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+#, fuzzy
+msgid "Preview"
+msgstr "Просмотр"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr "Отменить"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr "отменить это редактирование и вернуться на страницу"
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr "создать"
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr "создать эту wiki страницу"
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+#, fuzzy
+msgid "label_preview"
+msgstr "(Обязательно)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr "Название страницы"
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr ""
+"название этой wiki страницы (изменение этого может происходить медленно!)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr "тип"
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr "выберите стиль форматирования и отображения для этой страницы"
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr "(внешнее редактирование)"
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr "главная"
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr "показать последние изменения wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr "изменения"
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr "показать страницу обсуждения"
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr "обсуждение"
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr "показать текущую задачу"
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr "задачи"
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr "показать содержание wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr "содержание"
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr "показать индекс wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr "индекс"
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr "показать страницу загрузки"
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr "закачки"
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr "показать страницу помощи"
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr "помощь"
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr "показать опции wiki"
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr "опции"
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr "обратные ссылки"
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr "настроить email родписку на эту страницу или сайт"
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr "подписаться"
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr "показать историю изменений этой страницы"
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr "показать главную страницу"
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr "различия"
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr "редактировать"
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr "Редактировать во внешнем редакторе"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr "на главную страницу"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr "искать на всех страницах"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+#, fuzzy
+msgid "parent,"
+msgstr "Переназначить"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+#, fuzzy
+msgid "name,"
+msgstr "имя"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+#, fuzzy
+msgid "replacement,"
+msgstr "переназначить"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+#, fuzzy
+msgid "page"
+msgstr "возраст"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+#, fuzzy
+msgid "reparent"
+msgstr "Переназначить"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+#, fuzzy
+msgid "make this page a subtopic of the page you have entered"
+msgstr "переназначить эту страницу странице, которую Вы ввели"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+"переименовать эту страницу в название, которое Вы ввели, обновив все ссылки"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename"
+msgstr "переименовать"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr "удалить!"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+#, fuzzy
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr "переназначить эту страницу странице, которую Вы ввели"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+#, fuzzy
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+"переименовать эту страницу в название, которое Вы ввели, обновив все ссылки"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create"
+msgstr "создать"
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+#, fuzzy
+msgid "Recent changes"
+msgstr "показать последние изменения wiki"
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+#, fuzzy
+msgid "Search this wiki"
+msgstr "создать эту wiki страницу"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+#, fuzzy
+msgid "all edits"
+msgstr "редактировать"
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr ""
+"Сейчас Вы подписаны<br />\n"
+" на всю wiki."
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr ""
+"Сейчас Вы не подписаны<br />\n"
+"                  на всю wiki."
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr "Подписка по почте"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr "Отписаться от всей wiki"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr "Подписаться на всю wiki"
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr "Вы подписаны на следующие страницы"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr "Подписчики страницы"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr "Подписчики Wiki"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+#, fuzzy
+msgid "subscribe_desc_comments"
+msgstr ""
+"Вы можете подписаться на эту страницу или wiki вцелом.\n"
+" Подписчики получают копию комментариев по почте\n"
+" (но не общие редактирования, до тех пор, пока это не будет активировано "
+"администратором).\n"
+" Или вернитесь на"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+#, fuzzy
+msgid "subscribe_desc_edits"
+msgstr ""
+"Вы можете подписаться на эту страницу или wiki вцелом.\n"
+" Подписчики получают копию комментариев по почте\n"
+" (но не общие редактирования, до тех пор, пока это не будет активировано "
+"администратором).\n"
+" Или вернитесь на"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr "Ваш email адрес"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr "Изменить"
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr "Для того, что бы подписаться, исправьте Ваш email адрес"
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr ""
+"Сейчас Вы подписаны<br />\n"
+" на эту страницу."
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr ""
+"Сейчас Вы не подписаны<br />\n"
+" на эту страницу."
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr " Отписаться от этой страницы "
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr " Подписаться на эту страницу "
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+#, fuzzy
+msgid "User options"
+msgstr "опции поиска"
+
+#~ msgid "your edit contained a banned link pattern"
+#~ msgstr "ваша правка содержала шаблон запрещенной ссылки"
+
+#~ msgid "adding of external links by anonymous authors is restricted"
+#~ msgstr "добавление внешних ссылок анонимными авторами ограничено"
+
+#~ msgid "Add a ZWiki web"
+#~ msgstr "Добавить веб ZWiki"
+
+#~ msgid "Type"
+#~ msgstr "Тип"
+
+#~ msgid "Create wiki"
+#~ msgstr "Создать wiki"
+
+#~ msgid "and enter"
+#~ msgstr "и 'Enter'"
+
+#~ msgid ""
+#~ "You may create a new ZWiki Page object using the form below. You may also "
+#~ "choose to upload an existing html file from your local computer by "
+#~ "clicking the <i>Browse</i> button."
+#~ msgstr ""
+#~ "Вы можете создать новый объект Zwiki Page используя форму ниже. Вы так же "
+#~ "можете закачать существующий html файл со своего локального компьютера, "
+#~ "нажав кнопку <i>Browse</i>."
+
+#~ msgid "File"
+#~ msgstr "Файл"
+
+#~ msgid "Add"
+#~ msgstr "Добавить"
+
+#~ msgid "Add and Edit"
+#~ msgstr "Добавить и редактировать"
+
+#, fuzzy
+#~ msgid "log_note"
+#~ msgstr "Заметка для истории страницы (необязательно)"
+
+#~ msgid "Backlinks for"
+#~ msgstr "Обратные ссылки для"
+
+#~ msgid "singleton_desc"
+#~ msgstr ""
+#~ "Единственные потомки - страницы, которые не имеют ссылок на другие "
+#~ "страницы."
+
+#~ msgid "History for"
+#~ msgstr "История для"
+
+#~ msgid "return to page"
+#~ msgstr "вернуться на страницу"
+
+#~ msgid "help_shortname"
+#~ msgstr ""
+#~ "Внимание: Переименование страницы в большой wiki может быть медленным. "
+#~ "Остальные страницы будут обновлены\n"
+#~ "при возможности."
+
+#~ msgid "label_body_text"
+#~ msgstr "Текст"
+
+#~ msgid "help_wikibody"
+#~ msgstr ""
+#~ "На Wiki странице Вы используете [квадратные скобки] для создания ссылок. "
+#~ "Когда Вы сохраняете страницу,\n"
+#~ "содержимое квадратных скобок будет содержать маленькую ссылку в виде "
+#~ "<code>?</code> после себя, которую\n"
+#~ "Вы нажимаете для создания новой страницы с этим именем (введенное в "
+#~ "квадратные скобки)."
+
+#~ msgid "help_wikiwords"
+#~ msgstr ""
+#~ "Эта Wiki так же поддерживает WikiWords, в качестве механизма ссылок."
+
+#~ msgid "label_note"
+#~ msgstr "Заметка для истории страницы (необязательно)"
+
+#~ msgid "help_wikinote"
+#~ msgstr "Короткое описание внесенных изменений."
+
+#~ msgid "label_upload_contents_optional"
+#~ msgstr "Загрузить файл или изображение (необязательно)"
+
+#~ msgid "help_wikiupload"
+#~ msgstr "Прикрепляет файл или изображение к этой wiki странице."
+
+#~ msgid "label_format"
+#~ msgstr "Формат страницы"
+
+#~ msgid "help_format"
+#~ msgstr ""
+#~ "Если Вы неуверены какой формат использовать, выберите Plain\n"
+#~ "Text и набирайте документ как обычно."
+
+#~ msgid "Save"
+#~ msgstr "Сохранить"
+
+#~ msgid "heading_edit_wiki_page"
+#~ msgstr ""
+#~ "Редактировать\n"
+#~ "        ${itemtype} \n"
+#~ "\n"
+#~ "        \"${pagename}\""
+
+#~ msgid "description_edit_wiki_page"
+#~ msgstr "Wiki страница позволяет Вам создавать сложно соединенные страницы."
+
+#~ msgid "legend_wiki_page_details"
+#~ msgstr "Детали Wiki страницы"
+
+#~ msgid "label_pagename"
+#~ msgstr "Название страницы"
+
+#~ msgid "Required"
+#~ msgstr "Обязательно"
+
+#~ msgid "label_required"
+#~ msgstr "(Обязательно)"
+
+#~ msgid "heading_wiki_recent_changes"
+#~ msgstr "Последние элементы"
+
+#~ msgid "heading_wiki_search_wiki"
+#~ msgstr "Искать в этой wiki"
+
+#~ msgid "Unsubscribe from this page"
+#~ msgstr "Отписаться от этой страницы"
+
+#~ msgid "Subscribe to this page"
+#~ msgstr "Подписаться на эту страницу"
+
+#~ msgid "heading_wiki_user_options"
+#~ msgstr "Опции пользователя"
+
+#, fuzzy
+#~ msgid "add a comment"
+#~ msgstr "Добавить"
+
+#~ msgid "heading_wiki_filter_issues"
+#~ msgstr "Фильтровать задачи"
+
+#, fuzzy
+#~ msgid "heading_wiki_issue_browser"
+#~ msgstr "Текущая задача"
+
+#~ msgid "heading_wiki_issue_tracker"
+#~ msgstr "Текущая задача"
+
+#, fuzzy
+#~ msgid "property change"
+#~ msgstr "показать последние изменения wiki"
+
+#~ msgid "backlinks_reparent_help"
+#~ msgstr ""
+#~ "Вы можете поменять родителя(лей) этой страницы, что бы включить ее в "
+#~ "глобальную \n"
+#~ "иерархию страницы. Отметьте боксы или введите имя новой страницы и "
+#~ "нажмите 'Переназначить'.\n"
+#~ "Одного родителя, как правило, достаточно."
+
+#, fuzzy
+#~ msgid "backlinks_reparent_help2"
+#~ msgstr ""
+#~ "Вы можете поменять родителя(лей) этой страницы, что бы включить ее в "
+#~ "глобальную \n"
+#~ "иерархию страницы. Отметьте боксы или введите имя новой страницы и "
+#~ "нажмите 'Переназначить'.\n"
+#~ "Одного родителя, как правило, достаточно."
+
+#, fuzzy
+#~ msgid "View"
+#~ msgstr "Просмотр"
+
+#, fuzzy
+#~ msgid "Comment"
+#~ msgstr "Добавить"
+
+#, fuzzy
+#~ msgid "A Comment"
+#~ msgstr "Добавить"
+
+#, fuzzy
+#~ msgid "Table of Contents"
+#~ msgstr "Содержание"
+
+#, fuzzy
+#~ msgid "A Wiki"
+#~ msgstr "Добавить страницу ZWiki"
+
+#, fuzzy
+#~ msgid "Subscriptions"
+#~ msgstr "Подписка по почте"
+
+#, fuzzy
+#~ msgid "Change Wiki Page"
+#~ msgstr "Добавить страницу ZWiki"
+
+#, fuzzy
+#~ msgid "Wiki User"
+#~ msgstr "Подписчики Wiki"
+
+#, fuzzy
+#~ msgid "A Wiki Page"
+#~ msgstr "Добавить страницу ZWiki"
+
+#, fuzzy
+#~ msgid "Wiki Page"
+#~ msgstr "Добавить страницу ZWiki"
+
+#, fuzzy
+#~ msgid "A Wiki Page Comment"
+#~ msgstr "Добавить страницу ZWiki"
+
+#, fuzzy
+#~ msgid "Wiki Page Comment"
+#~ msgstr "Содержание Wiki"
+
+#, fuzzy
+#~ msgid "View a Wiki Page"
+#~ msgstr "Добавить страницу ZWiki"
+
+#, fuzzy
+#~ msgid "View Wiki Page"
+#~ msgstr "Добавить страницу ZWiki"
+
+#, fuzzy
+#~ msgid "Edit Wiki Page"
+#~ msgstr "Добавить страницу ZWiki"
+
+#, fuzzy
+#~ msgid "Delete Wiki Page"
+#~ msgstr "Добавить страницу ZWiki"
+
+#, fuzzy
+#~ msgid "Reparent Wiki Page"
+#~ msgstr "Добавить страницу ZWiki"
+
+#~ msgid "page in parent wiki"
+#~ msgstr "страница в родительской wiki"
+
+#~ msgid "File Uploads"
+#~ msgstr "Загрузки файлов"
+
+#~ msgid "uploads_desc"
+#~ msgstr "Эта страница содержит все загрузки в эту wiki."
+
+#~ msgid "save"
+#~ msgstr "Сохранить"
+
+#~ msgid "view"
+#~ msgstr "Просмотр"
+
+#~ msgid "no_files_uploaded"
+#~ msgstr "Ни одного загруженного файла."
+
+#~ msgid "box_wiki_navigation"
+#~ msgstr "Навигация Wiki"
+
+#~ msgid "enter comments here and click add; or, click edit"
+#~ msgstr ""
+#~ "Введите тут комментарий и нажмите 'Добавить' или нажмите 'Редактировать'"
+
+#~ msgid "Details & comments"
+#~ msgstr "Детали и комментарии"
+
+#~ msgid "hits"
+#~ msgstr "кликов"
+
+#~ msgid ""
+#~ "no catalog or the catalog search gave an error, a brute-force search was "
+#~ "used"
+#~ msgstr ""
+#~ "нет каталога или поиск по каталогу выдал ошибку. Был использован "
+#~ "принудительный поиск"
+
+#~ msgid "Contents"
+#~ msgstr "Содержание"
+
+#~ msgid "Diffs for"
+#~ msgstr "Различия для"
+
+#~ msgid "name"
+#~ msgstr "имя"
+
+#~ msgid "page rating"
+#~ msgstr "рейтинг страницы"
+
+#~ msgid "rating_score"
+#~ msgstr "${score} от ${nb_votes} голосов"
+
+#~ msgid "click to rate"
+#~ msgstr "нажмите для участия в рейтинге"
+
+#~ msgid "voting as"
+#~ msgstr "голосовать как"
+
+#~ msgid "Here are the pages which link to"
+#~ msgstr "Страницы, которые ссылаются на"
+
+#, fuzzy
+#~ msgid "box_canreparent"
+#~ msgstr "переназначить"
+
+#~ msgid "Other parent"
+#~ msgstr "Другой родитель"
+
+#~ msgid "You may also click the full, simple, minimal links if provided."
+#~ msgstr ""
+#~ "Вы так же можете выбрать полный, нормальный или минимальный режим, если "
+#~ "предложено."
+
+#~ msgid "for subscribing"
+#~ msgstr "для подписи"
+
+#~ msgid "width"
+#~ msgstr "ширина"
+
+#~ msgid "height"
+#~ msgstr "высота"
+
+#~ msgid "textarea dimensions; width will be 100% if supported"
+#~ msgstr "размерность текстового поля; если поддерживается, ширина будет 100%"
+
+#~ msgid "Your local time is"
+#~ msgstr "Ваше местное время:"
+
+#~ msgid "Show logo ?"
+#~ msgstr "Показать логотип?"
+
+#~ msgid "No"
+#~ msgstr "Нет"
+
+#~ msgid "Yes"
+#~ msgstr "Да"
+
+#~ msgid "Show page hierarchy ?"
+#~ msgstr "Показать иерархию страницы?"
+
+#~ msgid "This wiki keeps a page hierarchy, which you can use or ignore."
+#~ msgstr ""
+#~ "Эта wiki содержит иерархию страницы, которую Вы можете использовать или "
+#~ "проигнорировать."
+
+#~ msgid "Show search field ?"
+#~ msgstr "Показывать поле поиска?"
+
+#~ msgid "except in minimal mode"
+#~ msgstr "за исключением минимального режима"
+
+#~ msgid "Show AnnoyingQuote ?"
+#~ msgstr "Показывать цитаты?"
+
+#~ msgid "in full mode"
+#~ msgstr "в полном режиме"
+
+#~ msgid "Show page management form ?"
+#~ msgstr "Показать форму управления страницей?"
+
+#~ msgid "You must also configure a username or be logged in."
+#~ msgstr ""
+#~ "Вам так же необходимо настроить имя пользователя или быть залогиненным."
+
+#~ msgid "no subscribers"
+#~ msgstr "подписчиков нет"
+
+#~ msgid "parent_name_replace"
+#~ msgstr "новый родитель, название или перемещение"
+
+#~ msgid ""
+#~ "enter a new parent, new name, replacement page (if any) or subtopic name"
+#~ msgstr ""
+#~ "введите нового родителя, новое название, страницу перемещения (если это "
+#~ "имеет место) или название подтемы"
+
+#~ msgid "box_zwiki_showhierarchy"
+#~ msgstr ""
+#~ "Вы так же можете установить <em>родителя(лей)</em> этой страницы для "
+#~ "расположения её\n"
+#~ "в иерархии контента. Отметьте ячейки или введите новое название страницы "
+#~ "и нажмите\n"
+#~ "'Переназначить'. Одного родителя, обычно, достаточно."
+
+#~ msgid "cancel"
+#~ msgstr "отменить"
+
+#~ msgid ""
+#~ "move this page to the recycle bin, and relink to the name you have entered"
+#~ msgstr ""
+#~ "переместить эту страницу в мусорную корзину и поменять ссылку на имя, "
+#~ "которое Вы ввели"
+
+#~ msgid "create a new subtopic of this page"
+#~ msgstr "создать новую подтему этой страницы"

Added: zope-zwiki/branches/upstream/current/i18n/sv.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/sv.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/sv.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1427 @@
+# Swedish translation for zwiki
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the zwiki package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-03-15 21:18+0000\n"
+"Last-Translator: Simon Michael <simon at joyful.com>\n"
+"Language-Team: Swedish <sv at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr "Du är inte auktoriserad att uppgradera alla sidorna."
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr "(map -> Hantera alternativ)"
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "Du har inte tillåtelse att byta namn den här ZWiki sidan."
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "Du har inte tillåtelse att byta namn den här ZWiki sidan."
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+
+#: src/ZWiki/Editing.py:327
+#, fuzzy
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr ""
+"Du har inte tillträde till omdirigera eller ändra underrubrikslänkar på den "
+"här ZWiki sidan."
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr "Du har inte tillträde att ändra en här Zwiki sidans typ."
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr "Du har inte tillåtelse att ändra den här ZWiki sidan."
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr "Du har inte tillåtelse att tabort den här ZWiki sidan."
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+"Den här sidan hade byttnamn till %s. Du kan tabort den här om du inte "
+"behöver den.\n"
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr "Du har inte tillåtelse att ladda upp filer här."
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr "Du har inte tillträda att lägga till länkar på den här ZWiki sidan."
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr ""
+
+#: src/ZWiki/Editing.py:830
+#, fuzzy
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr "Något är fel: %s. Kontakta sidans administratör för hjälp."
+
+#: src/ZWiki/Editing.py:841
+#, fuzzy
+msgid "exceeded max_anonymous_links"
+msgstr "utökad max_anonymous_links"
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+#, fuzzy
+msgid "exceeded max_identified_links"
+msgstr "utökad max_anonymous_links"
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+#, fuzzy
+msgid "anonymous"
+msgstr "anonym"
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+#, fuzzy
+msgid "which pages link to this one ?"
+msgstr "vilken sidolänk till den här?"
+
+#: src/ZWiki/OutlineSupport.py:851
+#, fuzzy
+msgid "You are here"
+msgstr "Du är här"
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr ""
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr ""
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr ""
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr ""
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr ""
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr ""
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr ""
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr "dagar"
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr "timmar"
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr "timme"
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr "minut"
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr "minuter"
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr "sekund"
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr "sekunder"
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr "Sidan är låst"
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr ""
+
+#: src/ZWiki/Views.py:393
+#, fuzzy
+msgid "Edit conflict"
+msgstr "Ändrings Conflict"
+
+#: src/ZWiki/Views.py:413
+#, fuzzy
+msgid "Someone else has saved this page while you were editing"
+msgstr "Någon annan har sparat den här sidan medan du höll på att ändra"
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr "För att lösa konflikten, gör så här"
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr "Clicka på din webbläsares bakåt knapp"
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr "Kopiera dina senaste ändringar till klippbordet"
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr "Klicka på din webbläsares uppdateringsknapp"
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr "Klista in dina ändringar igen, var aktsam för de senase ändringarna"
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr "Click på ändra knappen igen"
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr "eller"
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr "För att kastabort dina ändringar och börja om, klicka OK"
+
+#: src/ZWiki/Views.py:490
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr "skape den här sidan"
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr "förra ändingen skädde %(interval)s sedan"
+
+#: src/ZWiki/ZWikiPage.py:809
+msgid "show last edit"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr ""
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr ""
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr "svara"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+msgid "Revert this change and all successive changes"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+msgid "plone"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+msgid "show all features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+msgid "show basic features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+#, fuzzy
+msgid "simple"
+msgstr "Fil"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+#, fuzzy
+msgid "subtopic"
+msgstr "Ämne"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+#, fuzzy
+msgid "for this page"
+msgstr "skape den här sidan"
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+#, fuzzy
+msgid "title"
+msgstr "Fil"
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+msgid "Issue browser"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+msgid "Issue tracker"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "Du har inte tillåtelse att ändra den här ZWiki sidan."
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+msgid "age"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+msgid "Here are the wiki's issue pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+msgid "search options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+msgid "Severities:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+msgid "Enter a search term, click the numbers to the right,"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+msgid "Name"
+msgstr "Namn"
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr "Kategori"
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+msgid "filter issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr "Status"
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+msgid "Optional subject"
+msgstr "Alternativt änme"
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+msgid "Optional comment"
+msgstr "Alternativ Kommentar"
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "Lägg till Wiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+msgid "Id:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+#, fuzzy
+msgid "Title:"
+msgstr "Fil"
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "Lägg till Wiki"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr "Sök"
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+msgid "recent"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr "Ställ in inställningarna för den här wiki:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr "Användarnamn:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+msgid "Email address:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+msgid "(allows mail subscription)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr "Glömbort inställningarna"
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+msgid "Page&nbsp;name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "Lägg till Wiki-sida"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+msgid "Topic"
+msgstr "Ämne"
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr "Senase uppdateringen"
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+msgid "Comments"
+msgstr "Kommentarer"
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+msgid "Views"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+msgid "Created"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+msgid "Subtopics"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+msgid "Here are it's subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+#, fuzzy
+msgid "Related pages"
+msgstr "skape den här sidan"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+#, fuzzy
+msgid "Parents"
+msgstr "paranteser"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+msgid "Backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+msgid "No other pages link to this one."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr ""
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+msgid "Edit history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+#, fuzzy
+msgid "Edit:"
+msgstr "Redigera"
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+msgid "Manage"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+msgid "Revert this and later edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+msgid "Time:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+msgid "Note:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "preview this edit"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr ""
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+msgid "label_preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr "ny"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+msgid "parent,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+msgid "replacement,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+msgid "page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+#, fuzzy
+msgid "reparent"
+msgstr "paranteser"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "make this page a subtopic of the page you have entered"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+#, fuzzy
+msgid "rename"
+msgstr "Användarnamn:"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+msgid "Recent changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+msgid "Search this wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+msgid "all edits"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr ""
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr ""
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr ""
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+msgid "subscribe_desc_comments"
+msgstr ""
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+msgid "subscribe_desc_edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr ""
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr ""
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr ""
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+#, fuzzy
+msgid "User options"
+msgstr "Glömbort inställningarna"
+
+#, fuzzy
+#~ msgid "your edit contained a banned link pattern"
+#~ msgstr "din ändring innehåller ett förbjudet länkmönster"
+
+#, fuzzy
+#~ msgid "adding of external links by anonymous authors is restricted"
+#~ msgstr ""
+#~ "begränsad möjlighet för anonyma författare att lägga till externa länkar"
+
+#~ msgid "Add"
+#~ msgstr "Lägg till"
+
+#~ msgid "Add and Edit"
+#~ msgstr "Lägg till och ändra"
+
+#, fuzzy
+#~ msgid "add a comment"
+#~ msgstr "En kommentar"
+
+#~ msgid "Comment"
+#~ msgstr "Kommentar"
+
+#, fuzzy
+#~ msgid "Menu for Wiki Page related actions."
+#~ msgstr "Menu för Wiki sidans funktioner"
+
+#~ msgid "Table of Contents"
+#~ msgstr "Innehållsförteckning"
+
+#~ msgid "A Wiki"
+#~ msgstr "En Wiki"
+
+#~ msgid "Wiki"
+#~ msgstr "Wiki"
+
+#~ msgid "Subscriptions"
+#~ msgstr "Prenumerationer"
+
+#~ msgid "Change Wiki Page"
+#~ msgstr "Ändra Wiki-sida"
+
+#~ msgid "Wiki User"
+#~ msgstr "Wiki-användare"
+
+#~ msgid "Wiki visitors, which can only view and comment on wikis."
+#~ msgstr "Wiki-besökare som bara kan visa och kommentera på wikis."
+
+#~ msgid "A Wiki Page"
+#~ msgstr "En Wiki-sida"
+
+#~ msgid "Wiki Page"
+#~ msgstr "Wiki-sida"
+
+#~ msgid "A Wiki Page Comment"
+#~ msgstr "En Wiki-sidekommentar"
+
+#~ msgid "Wiki Page Comment"
+#~ msgstr "Wiki-sidekommentar"
+
+#~ msgid "Wiki Editor"
+#~ msgstr "Wiki Redigerare"
+
+#, fuzzy
+#~ msgid "The Wiki Editor can create and edit wikis."
+#~ msgstr "Wiki editorn kan skapa och ändra wikis."
+
+#~ msgid "Wiki Administrator"
+#~ msgstr "Wiki-administratör"
+
+#, fuzzy
+#~ msgid "The Wiki Admin can fully manage wiki pages."
+#~ msgstr "Wiki Admin kan fulständingt hantera wiki sidor"
+
+#~ msgid "View a Wiki Page"
+#~ msgstr "Visa en Wiki-sida"
+
+#~ msgid "View Wiki Page"
+#~ msgstr "Visa Wiki-sida"
+
+#~ msgid "Comment on Wiki Page"
+#~ msgstr "Kommentera på Wiki-sida"
+
+#~ msgid "Make a comment on Wiki Page"
+#~ msgstr "Gör en kommentar på Wiki-sida"
+
+#~ msgid "Edit Wiki Page"
+#~ msgstr "Redigera Wiki-sida"
+
+#~ msgid "Delete Wiki Page"
+#~ msgstr "Ta bort Wiki-sida"

Added: zope-zwiki/branches/upstream/current/i18n/th.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/th.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/th.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1313 @@
+# Thai translation for zwiki
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the zwiki package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-03-16 02:32+0000\n"
+"Last-Translator: Bunyawat Singchai <bunyawat.s at gmail.com>\n"
+"Language-Team: Thai <th at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr "คุณไม่มีสิทธิในการปรับปรุงทุกหน้า"
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr "(แฟ้ม -> จัดการคุณสมบัติ)"
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "คุณไม่มีสิทธิในการลบ ZWiki หน้านี้"
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+#, fuzzy
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "คุณไม่มีสิทธิในการลบ ZWiki หน้านี้"
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+"ขอโทษด้วย wiki นี้ไม่อนุญาติให้ผู้ใช้ที่ไมระบุตนเองทำการแก้ไข  โปรดสร้างรหัสผู้ใช้งานในตัวเลือกก่อน"
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr "คุณไม่มีสิทธิในการเปลี่ยนตัวเชื่อมสู่เนื้อหาย่อยบน ZWiki หน้านี้"
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr "คุณไม่มีสิทธิในการเปลี่ยนประเภทของ ZWiki หน้านี้"
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr "คุณไม่มีสิทธิในการเปลี่ยนแปลงเนื้อหาของ ZWiki หน้านี้"
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr "คุณไม่มีสิทธิในการลบ ZWiki หน้านี้"
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr "หน้านี้ถูกเปลี่ยนชื่อเป็น %s คุณสามารถลบมันทิ้งได้ถ้าคุณไม่ต้องการมันแล้ว\n"
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr "คุณไม่มีสิทธิในการนำไฟล์ขึ้นสู่ระบบที่นี้"
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr "คุณไม่มีสิทธิในการเพิ่มตัวเชื่อมโยงบน ZWiki หน้านี้"
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr "banned_links match"
+
+#: src/ZWiki/Editing.py:830
+#, fuzzy
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr "มีปัญหาเกิดขึ้น: %s. โปรดติดต่อผู้ดูแลระบบเพิ่อขอความช่วยเหลือ"
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+msgid "exceeded max_identified_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr "ผู้ใช้ที่ไม่ระบุตัวตน"
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr "หน้าไหนที่ต้องการเชื่อมโยงที่จุดนี้"
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr "คุณอยู่ที่นี้"
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr ""
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr ""
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr ""
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr ""
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr ""
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr ""
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr ""
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr ""
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr ""
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr ""
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr ""
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr ""
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr ""
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr ""
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr ""
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr ""
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr "การแก้ไขขัดแย้งกัน"
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr "มีผู้ใช้ท่านอื่นได้บัณทึกข้อมูลหน้าที่คุณกำลังแก้ไขอยู่นี้"
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr ""
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr ""
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr ""
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr ""
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr ""
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr ""
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr ""
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr ""
+
+#: src/ZWiki/Views.py:490
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:809
+msgid "show last edit"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr ""
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr ""
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+msgid "Revert this change and all successive changes"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+msgid "plone"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+msgid "show all features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+msgid "show basic features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+msgid "simple"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+msgid "subtopic"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+msgid "for this page"
+msgstr ""
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+msgid "title"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+msgid "Issue browser"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+msgid "Issue tracker"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "คุณไม่มีสิทธิในการเปลี่ยนแปลงเนื้อหาของ ZWiki หน้านี้"
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+msgid "age"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+msgid "Here are the wiki's issue pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+msgid "search options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+msgid "Severities:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+msgid "Enter a search term, click the numbers to the right,"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+msgid "Name"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+msgid "filter issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+msgid "Optional subject"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+msgid "Optional comment"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+msgid "Add ZWiki"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+msgid "Id:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+msgid "Title:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+msgid "Add wiki"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+msgid "recent"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+msgid "Email address:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+msgid "(allows mail subscription)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+msgid "Page&nbsp;name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+msgid "Add wiki page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+msgid "Topic"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+msgid "Comments"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+msgid "Views"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+msgid "Created"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+msgid "Subtopics"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+msgid "Here are it's subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+msgid "Related pages"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+msgid "Parents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+msgid "Backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+msgid "No other pages link to this one."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr ""
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+msgid "Edit history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+msgid "Edit:"
+msgstr ""
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+msgid "Manage"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+msgid "Revert this and later edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+msgid "Time:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+msgid "Note:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "preview this edit"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr ""
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+msgid "label_preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+msgid "parent,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+msgid "replacement,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+msgid "page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "reparent"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "make this page a subtopic of the page you have entered"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+msgid "Recent changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+msgid "Search this wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+msgid "all edits"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr ""
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr ""
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr ""
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+msgid "subscribe_desc_comments"
+msgstr ""
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+msgid "subscribe_desc_edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr ""
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr ""
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr ""
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+msgid "User options"
+msgstr ""
+
+#~ msgid "adding of external links by anonymous authors is restricted"
+#~ msgstr "การเพิ่มตัวเชื่อมโยงไปยังภายนอกโดยผู้ใช้ที่ไม่ระบุตัวตน ไม่สามารถกระทำได้"

Added: zope-zwiki/branches/upstream/current/i18n/tr.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/tr.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/tr.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1509 @@
+# Turkish translation for zwiki
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the zwiki package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: zwiki\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-03-15 21:18+0000\n"
+"Last-Translator: Simon Michael <simon at joyful.com>\n"
+"Language-Team: Turkish <tr at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+#, fuzzy
+msgid "You are not authorized to upgrade all pages."
+msgstr "Tüm sayfaları yükseltmek için yetkin yok."
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr "(dosya ->özellikleri yönet)"
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "Bu ZWiki sayfasını yeniden adlandırmak için yetkin yok."
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "Bu ZWiki sayfasını yeniden adlandırmak için yetkin yok."
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr "bu ZWiki sayfasının tipini değiştirmen için yetkin yok."
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr "Bu ZWiki sayfasını düzenlemek için yetkin yok."
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr "Bu ZWiki sayfasını silmek için yetkin yok."
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+"bu sayfa %s olarak yeniden isimlendirilmiştir. Eğer ihtiyacın yoksa bunu "
+"silebilirsin.↵\n"
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr "Buraya dosya yüklemek için yetkin yok."
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr "Bu ZWiki sayfasına link ekleme yetkin yok."
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+#, fuzzy
+msgid "banned_links match"
+msgstr "yasaklanmış_bağlantılar uyuşuyor"
+
+#: src/ZWiki/Editing.py:830
+#, fuzzy
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr "Bir problem var:%s. Lütfen yardım için site yöneticisine başvurun."
+
+#: src/ZWiki/Editing.py:841
+#, fuzzy
+msgid "exceeded max_anonymous_links"
+msgstr "max_anonymous_links aşıldı"
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+#, fuzzy
+msgid "exceeded max_identified_links"
+msgstr "max_anonymous_links aşıldı"
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr "anonim"
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+#, fuzzy
+msgid "which pages link to this one ?"
+msgstr "Bu sayfaya hangi sayfalar bağlanıyor??"
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr "Şu anda burdasın"
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr "yıllar"
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr "yıl"
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr "ay"
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr "aylar"
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr "haftalar"
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr "hafta"
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr "gün"
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr "günler"
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr "saatler"
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr "saat"
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr "dakika"
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr "dakikalar"
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr "saniye"
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr "saniyeler"
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr "Sayfa kilitlenmiÅŸtir"
+
+#: src/ZWiki/Views.py:357
+#, fuzzy
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+"\n"
+"            Bu sayfa webDAV kilidine sahip. Muhtemelen birisi tarafından "
+"harici bir editörle düzenleniyor. Onlar bitirene kadar beklemeniz gerekecek "
+"ve daha sonra tekrar deneyin.\n"
+"Eğer bazı değişiklikler yaptıysanız referans için metninizin sürümünü "
+"yedeklemek ve kopyalamak isteyebilirsiniz.\n"
+"            "
+
+#: src/ZWiki/Views.py:364
+#, fuzzy
+msgid "To discard your changes and try again, click OK."
+msgstr "Değişiklikleri silip tekrar denemek için tamam tuşuna basınız."
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr "Uyuşmazlığı düzenle"
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr "Birileri bu sayfayı siz düzenlerken kaydetmiş"
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr "Uyuşmazlığı çözmek için, bunu yapın"
+
+#: src/ZWiki/Views.py:415
+#, fuzzy
+msgid "Click your browser's back button"
+msgstr "Browserın geri tuşuna tıklayınız"
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr "Geçmiş düzenlemeleri panoya kopyala"
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr "browserın yenileme tuşuna basınız"
+
+#: src/ZWiki/Views.py:418
+#, fuzzy
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr "Düzenlemeleri tekrar yapıştır, son değişiklikler hakkında dikkatli ol"
+
+#: src/ZWiki/Views.py:419
+#, fuzzy
+msgid "Click the Change button again"
+msgstr "Değiştir tuşuna tekrar tıklayın"
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr "veya"
+
+#: src/ZWiki/Views.py:421
+#, fuzzy
+msgid "To discard your changes and start again, click OK"
+msgstr ""
+"Yaptığın değişiklikleri iptal edip tekrar başlamak için Taman tuşuna basınız"
+
+#: src/ZWiki/Views.py:490
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr "bu sayfayı yarat"
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr "son düzenleme %(interval) önce"
+
+#: src/ZWiki/ZWikiPage.py:809
+msgid "show last edit"
+msgstr "son düzenlemeyi göster"
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr ""
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr ""
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr "yorumlar"
+
+#: src/ZWiki/pagetypes/moin.py:1990
+#, fuzzy
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr "\"%(token)s\" izleyebilmek için \"=\" gerekmektedir"
+
+#: src/ZWiki/pagetypes/moin.py:1999
+#, fuzzy
+msgid "Expected a value for key \"%(token)s\""
+msgstr "\"%(token)s\" anahtarı için bir değer gir"
+
+#: src/ZWiki/pagetypes/moin.py:302
+#, fuzzy
+msgid "Create new drawing \"%(filename)s\""
+msgstr "Yeni çizi yarat \"%(filename)s\""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr "yeni dosya ekle \"%(filename)s\""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr "\"%(token)s\" öncesinde bir tamsayı \"%(key)s\" beklenmektedir"
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+#, fuzzy
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr "\"%(key)s\" sonrasında bir tamsayı \"%(arg)s\" beklenmektedir"
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr "\"%(key)s\" sonrasında bir renk değeri \"%(arg)s\" beklenmektedir"
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr "cevapla"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr "tam geçmiş"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr "sonraki düzenleme"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+msgid "Revert this change and all successive changes"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+msgid "plone"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+#, fuzzy
+msgid "show all features"
+msgstr "tüm sayfaları ara"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+#, fuzzy
+msgid "show basic features"
+msgstr "son düzenlemeyi göster"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+msgid "simple"
+msgstr "basit"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+#, fuzzy
+msgid "subtopic"
+msgstr "altkonu"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+msgid "for this page"
+msgstr "bu sayfa için"
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+msgid "title"
+msgstr "başlık"
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+msgid "Issue browser"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+msgid "Issue tracker"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "Bu ZWiki sayfasını düzenlemek için yetkin yok."
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr "kategori"
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr "durum"
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+msgid "age"
+msgstr "yaÅŸ"
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr "deÄŸiÅŸtirildi"
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr "Ä°sim:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr "Kategori:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr "Durum:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+msgid "Here are the wiki's issue pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr "Ayrıntılar:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+msgid "search options"
+msgstr "arama seçenekleri"
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr "Kategoriler:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+msgid "Severities:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr "Durumlar:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+msgid "Enter a search term, click the numbers to the right,"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr "tarafından önerildi."
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+msgid "Name"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+#, fuzzy
+msgid "Category"
+msgstr "Kategori"
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+msgid "filter issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr "Durum"
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+msgid "Optional subject"
+msgstr "Seçimli konu"
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+msgid "Optional comment"
+msgstr "Seçimli yorum"
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "Wiki Ekle"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+msgid "Id:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+#, fuzzy
+msgid "Title:"
+msgstr "Başlık"
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "Wiki Ekle"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+#, fuzzy
+msgid "Show summaries ?"
+msgstr "Özetleri göster?"
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr "Yenile"
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr "Sayfa"
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr "Zaman"
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr "YENÄ°"
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+#, fuzzy
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr ""
+"Tüm Wikide aramak için bir kelime veya söz öbeği girin ve enter tuşuna basın."
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+#, fuzzy
+msgid "Tips: A single word works best for matching page names."
+msgstr ""
+"İpucu: Sayfa isimlerinin eşleştirilmesi için tek kelime kullanmak en "
+"iyisidir."
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+#, fuzzy
+msgid "Leave it blank to list all pages."
+msgstr "Tüm sayfaları listelemek için boş bırakınız."
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr "Ara"
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+#, fuzzy
+msgid "Page names matching"
+msgstr "Sayfa isimleri uyumlu"
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+#, fuzzy
+msgid "Text matching"
+msgstr "Metin uyumlu"
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+msgid "recent"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr "Bu Wiki için tercihlerinizi belirleyin:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr "Kullanıcı adı:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr "(Düzenlemelerinizi tanımlar)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+#, fuzzy
+msgid "Email address:"
+msgstr "Elektronik posta:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+#, fuzzy
+msgid "(allows mail subscription)"
+msgstr "(posta aboneliÄŸine izin verir)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+#, fuzzy
+msgid "Your time zone:"
+msgstr "Zaman diliminiz:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+#, fuzzy
+msgid "Edit form height:"
+msgstr "Form yüksekliğini düzenle:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+#, fuzzy
+msgid "(adjusts form size)"
+msgstr "(form boyutlarını ayarla)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+#, fuzzy
+msgid "Save options"
+msgstr "Seçenekleri kaydet"
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr "tüm"
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr "Seçenekleri unut"
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr "ZWiki sayfası ekle"
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+#, fuzzy
+msgid "Page&nbsp;name:"
+msgstr "Sayfa ismi"
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "Wiki sayfası ekle"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+msgid "Topic"
+msgstr "Konu"
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr "Son güncelleme"
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+msgid "Comments"
+msgstr "Yorumlar"
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+msgid "Views"
+msgstr "Görünüş"
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+msgid "Created"
+msgstr "OluÅŸturuldu"
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr "tarafından"
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+msgid "Subtopics"
+msgstr "Altkonular"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr "Bu sayfa altkonuya sahip deÄŸil."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+#, fuzzy
+msgid "Here are it's subtopics."
+msgstr "Bu sayfa altkonuya sahip deÄŸil."
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+#, fuzzy
+msgid "Related pages"
+msgstr "bu sayfayı yarat"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+#, fuzzy
+msgid "Parents"
+msgstr "Ebeveyn"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+msgid "Backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+msgid "No other pages link to this one."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr "konu"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr "cevaplanıyor"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr ""
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+#, fuzzy
+msgid "Edit history"
+msgstr "tam geçmiş"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+#, fuzzy
+msgid "Edit:"
+msgstr "Düzenle"
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+#, fuzzy
+msgid "Manage"
+msgstr "DeÄŸiÅŸtir"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+msgid "Revert this and later edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr "Sayfaya dön"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+#, fuzzy
+msgid "Time:"
+msgstr "Zaman"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+#, fuzzy
+msgid "Note:"
+msgstr "Ä°sim:"
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr "Dosya yada resim yükle"
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr "bu sayfaya dosya ve bağlantı ekle?"
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr "Yardım sayfası"
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr "Metin Biçimlendirme Kuralları"
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "preview this edit"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr "Önizleme"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr "Ä°ptal"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr "OluÅŸtur"
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr "Bu wiki sayfasını oluştur"
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+msgid "label_preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr "Sayfa ismi"
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr "deÄŸiÅŸiklikler"
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr "tartışma sayfasını göster"
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr "tartışma"
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr "wiki içeriğini göster"
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr "içindekiler"
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr "wiki dizinini göster"
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr "dizin"
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr "yükleme sayfasını göster"
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr "yüklemeler"
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr "yardım sayfasını göster"
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr "yardım"
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr "wiki seçeneklerini göster"
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr "seçenekler"
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr "ön sayfayı göster"
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr "düzenle"
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr "harici editör kullanrak düzenle"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr "anasayfaya git"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr "tüm sayfaları ara"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr "yeni"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+msgid "parent,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr "isim,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+msgid "replacement,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+#, fuzzy
+msgid "page"
+msgstr "yaÅŸ"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+#, fuzzy
+msgid "reparent"
+msgstr "Ebeveyn"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "make this page a subtopic of the page you have entered"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+#, fuzzy
+msgid "rename"
+msgstr "isim,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+#, fuzzy
+msgid "create"
+msgstr "OluÅŸtur"
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+msgid "Recent changes"
+msgstr "Son deÄŸiÅŸiklikler"
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+msgid "Search this wiki"
+msgstr "Bu wikiyi ara"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+#, fuzzy
+msgid "all edits"
+msgstr "düzenle"
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr ""
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr ""
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr ""
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+msgid "subscribe_desc_comments"
+msgstr ""
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+msgid "subscribe_desc_edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr "E-posta adresiniz"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr "DeÄŸiÅŸtir"
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr ""
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr ""
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr ""
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+#, fuzzy
+msgid "User options"
+msgstr "arama seçenekleri"
+
+#~ msgid "your edit contained a banned link pattern"
+#~ msgstr "Düzenlemeniz yasaklanmış bağlantı kalıbı içeriyor"
+
+#, fuzzy
+#~ msgid "adding of external links by anonymous authors is restricted"
+#~ msgstr ""
+#~ "Anonim yazarlar tarafından harici bağlantıların eklenmesi kısıtlanmıştır"
+
+#~ msgid "Add a ZWiki web"
+#~ msgstr "ZWiki web'i ekle"
+
+#~ msgid "Type"
+#~ msgstr "Tip"
+
+#~ msgid "Create wiki"
+#~ msgstr "Wiki oluÅŸtur"
+
+#~ msgid "and enter"
+#~ msgstr "ve gir"
+
+#, fuzzy
+#~ msgid ""
+#~ "You may create a new ZWiki Page object using the form below. You may also "
+#~ "choose to upload an existing html file from your local computer by "
+#~ "clicking the <i>Browse</i> button."
+#~ msgstr ""
+#~ "Aşağıdaki formu kullanarak yeni bir ZWiki sayfa nesnesi yapabilirsin. "
+#~ "Ayrıca bilgisayarındaki yüklü bir sayfayı <i>göster</i> tuşuna tıklayarak "
+#~ "yükleyebilirsiniz."
+
+#~ msgid "File"
+#~ msgstr "Dosya"
+
+#~ msgid "Add"
+#~ msgstr "Ekle"
+
+#~ msgid "Add and Edit"
+#~ msgstr "Ekle ve Düzenle"
+
+#~ msgid "return to page"
+#~ msgstr "sayfaya dön"
+
+#~ msgid "Save"
+#~ msgstr "Kaydet"
+
+#, fuzzy
+#~ msgid "add a comment"
+#~ msgstr "yorumlar"
+
+#, fuzzy
+#~ msgid "property change"
+#~ msgstr "Son deÄŸiÅŸiklikler"
+
+#, fuzzy
+#~ msgid "View"
+#~ msgstr "Görünüm"
+
+#~ msgid "Comment"
+#~ msgstr "Yorum"
+
+#~ msgid "A Comment"
+#~ msgstr "Yorum"
+
+#~ msgid "Table of Contents"
+#~ msgstr "İçindekiler"
+
+#~ msgid "A Wiki"
+#~ msgstr "Wiki"
+
+#~ msgid "Wiki"
+#~ msgstr "Wiki"
+
+#~ msgid "TOC"
+#~ msgstr "TOC"
+
+#~ msgid "Subscriptions"
+#~ msgstr "Abonelikler"
+
+#~ msgid "Change Wiki Page"
+#~ msgstr "Wiki Sayfasını Değiştir"
+
+#~ msgid "Wiki User"
+#~ msgstr "Wiki Kullanıcısı"
+
+#~ msgid "Wiki visitors, which can only view and comment on wikis."
+#~ msgstr ""
+#~ "Wiki ziyaretçileri, sadece izler ve Wiki hakkında yorum yapabilirler"
+
+#~ msgid "A Wiki Page"
+#~ msgstr "Bir wiki sayfası"
+
+#~ msgid "Wiki Page"
+#~ msgstr "wiki sayfası"
+
+#~ msgid "A Wiki Page Comment"
+#~ msgstr "bir wiki sayfası yorumu"
+
+#~ msgid "Wiki Page Comment"
+#~ msgstr "wiki sayfası yorumu"
+
+#~ msgid "Wiki Editor"
+#~ msgstr "Wiki Editörü"
+
+#~ msgid "The Wiki Editor can create and edit wikis."
+#~ msgstr "Wiki Editörü Wikileri yaratabilir ve düzenleyebilir."
+
+#~ msgid "Wiki Administrator"
+#~ msgstr "Wiki yöneticisi"
+
+#~ msgid "The Wiki Admin can fully manage wiki pages."
+#~ msgstr "Wiki yöneticisi Wiki sayfalranı istediği gibi yönetir"
+
+#~ msgid "View a Wiki Page"
+#~ msgstr "Wiki sayfasını izle"
+
+#~ msgid "View Wiki Page"
+#~ msgstr "Wiki sayfası görüntüle"
+
+#~ msgid "Make a comment on Wiki Page"
+#~ msgstr "Wiki sayfaları hakkında yorum yap"
+
+#~ msgid "Edit Wiki Page"
+#~ msgstr "Wiki sayfasını düzenle"
+
+#~ msgid "Delete Wiki Page"
+#~ msgstr "Wiki sayfasını sil"
+
+#~ msgid "File Uploads"
+#~ msgstr "Dosya Yüklemeleri"
+
+#~ msgid "save"
+#~ msgstr "kaydet"
+
+#~ msgid "view"
+#~ msgstr "görünüm"

Added: zope-zwiki/branches/upstream/current/i18n/zh_CN.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/zh_CN.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/zh_CN.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1678 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: ZWiki-0-45-0\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-03-21 16:22+0000\n"
+"Last-Translator: feilfly <feilfly at gmail.com>\n"
+"Language-Team: <zwiki at zwiki.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: zope/app/translation_files/extract.py\n"
+"Language-code: zh-cn\n"
+"Language-name: 简体中文\n"
+"Preferred-encodings: utf-8\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr "您没有权力升级所有页面。"
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr "(目录 -> 管理性质)"
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "您没有权力删除此页。"
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+#, fuzzy
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "您没有权力删除此页。"
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+#, fuzzy
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr "对不起,该wiki不能匿名发表,请先填写用户名。"
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr "您没有权力在这页更动父页或子主题连结。"
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr "您没有权力变更页面型态。"
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr "您没有权力修改此页。"
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr "您没有权力删除此页。"
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr "这页已被改名为 %s。如果此页不需要,您可以删除。\n"
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr "您没有权力在这里上传档案。"
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr "您没有权力在此页增加连接。"
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr "发现被拒绝的连结"
+
+#: src/ZWiki/Editing.py:830
+#, fuzzy
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr "发生一个问题: %s。请联系管理者,协助处理这问题。"
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr ""
+"您所编辑的发生一个问题:它包含一个被阻挡的连结(网址)样式。请连络网站管理"
+"者,以取得适当协助。"
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+#, fuzzy
+msgid "exceeded max_identified_links"
+msgstr ""
+"您所编辑的发生一个问题:它包含一个被阻挡的连结(网址)样式。请连络网站管理"
+"者,以取得适当协助。"
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr "访客"
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr "那个页面连结到这一页?"
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr "您现在位置"
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr "å¹´"
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr "å¹´"
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr "月"
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr "月"
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr "周"
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr "周"
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr "天"
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr "天"
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr "小时"
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr "小时"
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr "分"
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr "分"
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr "秒"
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr "秒"
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr "页面被锁"
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+"\n"
+"            此页已被 webDAV 锁住。某人或许正在用外部编辑器\n"
+"            修改这一页。您必须等到他们完成修改工作,之后再\n"
+"            试试看。如果您已经修改一些内容,您或许得备份下\n"
+"            来,以文字的方式拷贝,好做为重新修改的参考。\n"
+"            "
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr "放弃您变更的内容,并且再试一次,点选确认按钮(OK)。"
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr "修改冲突"
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr "当您修改时,已经有人存入新的页面"
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr "要解决冲突问题,请按以下步骤"
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr "点选您浏览器的上ㄧ页按钮(Back)"
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr "复制您最近修改的内容到剪贴簿"
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr "点选您浏览器更新页面按钮(Refresh)"
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr "贴上您所修改的内容,在最新变更的内容里头"
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr "再按一次变更按钮(Change)"
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr "或"
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr "放弃所有您变更的内容,并重新再读一次,点选确认按钮(OK)"
+
+#: src/ZWiki/Views.py:490
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+"\n"
+"        快速键在 mozilla 相关浏览器以 alt-<按键> 方式使用\n"
+"        IE 使用者:必须加按 enter 键\n"
+"        Mac 使用者:command-<按键>\n"
+"        Opera 使用者:shift-escape-<按键>\n"
+"        如果这些都不管用,回到前一页然后再试试看。\n"
+"\n"
+"        0    显示快速键的配置\n"
+"\n"
+"        wiki 功能:\n"
+"        f    显示首页\n"
+"        c    显示 Wiki 的所有内容 (contents)\n"
+"        r    显示 Wiki 最近的变更\n"
+"             显示讨论页面\n"
+"        t    显示事例追踪功能\n"
+"        i    显示 Wiki 的索引\n"
+"        o    显示 Wiki 的选项 (偏好设定)\n"
+"        h    显示辅助页面\n"
+"        s    跳到搜寻字段\n"
+"        \n"
+"        页面功能:\n"
+"        +    (plone/cmf 网站外关切换设定)使用 Zwiki plone/cmf 外观\n"
+"        -    (plone/cmf 网站外关切换设定)使用 Zwiki 标准外观\n"
+"        v    检视页面\n"
+"        m    邮件订阅\n"
+"        b    显示回溯连结(连结到此页面)\n"
+"        d    显示不同比较(页面修改历史)\n"
+"        y    显示完整历史(在 ZMI 中)\n"
+"        e    修改这一页面\n"
+"        x    用外部编辑器修改\n"
+"             打印这一页面(以及子主题)\n"
+"        q    检视页面的源码(快速检视)\n"
+"             清除并且重新产生这一页面的快取\n"
+"             跳到子主题\n"
+"             跳到留言(讯息)\n"
+"             如果可能的话,会跳到这一页面作者的首页\n"
+"        n    下一页面\n"
+"        p    上一页面\n"
+"        u    上到父层页面\n"
+"        \n"
+"        在修改表单:\n"
+"        s    储存变更\n"
+"        p    预览\n"
+"        \n"
+"        当显示版本比较:\n"
+"        n    下一修改\n"
+"        p    前一修改\n"
+"        "
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr "未知的类型"
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr "建立页面"
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr "%(interval)s 前修改"
+
+#: src/ZWiki/ZWikiPage.py:809
+msgid "show last edit"
+msgstr "显示最新修改"
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr "作者 %(editor)s"
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr "不需要新增 Zwiki 大纲快取"
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+"Zwiki 大纲快取因为实作的关系,汇出现在 ZMI 新增选单\n"
+"        里头,但不是用来直接新增。\n"
+"        如果需要,Zwiki 会为你建立。\n"
+"        "
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr "留言"
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr "预期在 \"%(token)s\" 之后是 \"=\""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr "预期键值 \"%(token)s\" 要有对应数据"
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr "建立新图片 \"%(filename)s\""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr "上传新附件 \"%(filename)s\""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr "修改图片 \"%(filename)s\""
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr "期待在 \"%(key)s\" 之后的 \"%(wanted)s\" 能够取得 \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr "期待在 \"%(token)s\" 之前的 \"%(key)s\" 为整数值"
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr "期待在 \"%(key)s\" 之后的 \"%(arg)s\" 为整数值"
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr "期待在 \"%(key)s\" 之后的 \"%(args)s\" 为色彩指定值"
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr "回复"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr "完整历史"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr "<< 上一版"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr "下一版 >>"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+#, fuzzy
+msgid "Revert this change and all successive changes"
+msgstr "回溯到这个版本及相关变更"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+#, fuzzy
+msgid "plone"
+msgstr "历史注记:"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+#, fuzzy
+msgid "show all features"
+msgstr "搜寻所有页面"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+#, fuzzy
+msgid "show basic features"
+msgstr "显示最新修改"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+#, fuzzy
+msgid "simple"
+msgstr "档案"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+#, fuzzy
+msgid "subtopic"
+msgstr "子页面"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+#, fuzzy
+msgid "for this page"
+msgstr "建立页面"
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+#, fuzzy
+msgid "title"
+msgstr "标题"
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr "过滤事例"
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+msgid "Issue browser"
+msgstr "事例浏览"
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+msgid "Issue tracker"
+msgstr "事例追踪"
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "您没有权力修改此页。"
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+#, fuzzy
+msgid "category"
+msgstr "分类"
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+#, fuzzy
+msgid "severity"
+msgstr "程度"
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+#, fuzzy
+msgid "status"
+msgstr "状态"
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+#, fuzzy
+msgid "age"
+msgstr "页面"
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+#, fuzzy
+msgid "modified"
+msgstr "变更"
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+#, fuzzy
+msgid "Add a new issue:"
+msgstr "新增一则事例:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+#, fuzzy
+msgid "Name:"
+msgstr "名称,"
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+#, fuzzy
+msgid "Category:"
+msgstr "分类:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+#, fuzzy
+msgid "Severity:"
+msgstr "程度:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+#, fuzzy
+msgid "Status:"
+msgstr "状态:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+#, fuzzy
+msgid "Here are the wiki's issue pages."
+msgstr "建立这快纪页面"
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+#, fuzzy
+msgid "Details:"
+msgstr "细节:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+#, fuzzy
+msgid "add issue"
+msgstr "事例"
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+#, fuzzy
+msgid "More advanced"
+msgstr "更多进阶的"
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+#, fuzzy
+msgid "issue tracker"
+msgstr "事例追踪"
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+#, fuzzy
+msgid "search options"
+msgstr "搜索选项"
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+#, fuzzy
+msgid "Name contains any of:"
+msgstr "页面名称包含任意的:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+#, fuzzy
+msgid "Page text contains any of:"
+msgstr "页面文字包含任意的:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+#, fuzzy
+msgid "Categories:"
+msgstr "分类:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+#, fuzzy
+msgid "Severities:"
+msgstr "程度:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+#, fuzzy
+msgid "Statuses:"
+msgstr "状态:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+#, fuzzy
+msgid "Enter a search term, click the numbers to the right,"
+msgstr "输入搜寻的字词, 或点选右边的数字, 或"
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+#, fuzzy
+msgid "Submitted by"
+msgstr "提出者"
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+#, fuzzy
+msgid "Name"
+msgstr "名称,"
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+#, fuzzy
+msgid "Category"
+msgstr "分类"
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+#, fuzzy
+msgid "filter issues"
+msgstr "过滤事例"
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+#, fuzzy
+msgid "Severity"
+msgstr "程度"
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+#, fuzzy
+msgid "Status"
+msgstr "状态"
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+#, fuzzy
+msgid "Optional subject"
+msgstr "变更注记(选项)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+#, fuzzy
+msgid "Optional comment"
+msgstr "可选注释(选项)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "新增快纪"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+#, fuzzy
+msgid "Id:"
+msgstr "名称"
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+#, fuzzy
+msgid "Title:"
+msgstr "标题"
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "新增快纪"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr "最近更动的页面"
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr "最近变更的页面, 包含概略的摘要"
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr "显示摘要?"
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr "æ›´æ–°"
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr "页面"
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr "修改者"
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr "时间"
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr "æ–°çš„"
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr "页面注记(新的)表示是在最近一周内所建立的"
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr "过滤事例"
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr "输入一个字或一段话,并且点选 输入 开始搜寻整个wiki。"
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr "这和在右上角搜寻字段的作用是一样的。"
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr "技巧:使用单独的字,对于按页面名称搜寻来说最好。"
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr "大小写无关与万用字元,依您的目录索引设定而定,也许会被支持。"
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr "如果让它空白的话,可列出所有页面。"
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr "搜寻"
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr "页面名称相符"
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr "文字相符"
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr "透过(非编目方式)搜寻得到文字相符"
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+#, fuzzy
+msgid "recent"
+msgstr "变更父层"
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr "设定在这个站台个人相关偏好。"
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr "使用者名称:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr "(您编辑文章时的名称)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+msgid "Email address:"
+msgstr "电子邮件:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+msgid "(allows mail subscription)"
+msgstr "(得以订阅邮件)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr "您所在时区:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr "(选择接近的时间)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr "修改字段高度:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr "(调整表格大小)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr "储存设定"
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+#, fuzzy
+msgid "all"
+msgstr "全部"
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr "预设设定"
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr "新增快纪页面"
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+#, fuzzy
+msgid "Page&nbsp;name:"
+msgstr "页面名称"
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "新增快纪页面"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+msgid "Topic"
+msgstr "主题"
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr "最近更新"
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+msgid "Comments"
+msgstr "留言"
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+msgid "Views"
+msgstr "检视"
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+msgid "Created"
+msgstr "建立"
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+#, fuzzy
+msgid "#"
+msgstr "#"
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr "作者"
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr "<dtml-var lasteditinterval> 之前</dtml-var>"
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr "在"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+msgid "Subtopics"
+msgstr "子页面"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr "这页没有任何子页面。"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+#, fuzzy
+msgid "Here are it's subtopics."
+msgstr "这是它的子页面:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+#, fuzzy
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr "您可以透过点选 ^ 按钮,变更子页面顺序。"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+#, fuzzy
+msgid "Related pages"
+msgstr "建立页面"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+msgid "Parents"
+msgstr "父层"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr "是最顶层主题。"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr "子主题上层为:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+msgid "Backlinks"
+msgstr "回溯"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr "底下是相关连结到的页面:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+msgid "No other pages link to this one."
+msgstr "没有任何其它页面连到这一页。"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr "变更父层"
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+"这 Wiki 的风格(skin)样板有些问题。也许有页面或其它非 ZPT / 非 DTML 方法的对"
+"象有相同 ID,隐藏在样板里头。也或许是样板在档案系统中遗漏了(安装 Zwiki 不完"
+"全造成的)。"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr "标题"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr "个标题可以协助厘清相关讨论串以及了解最近变更"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr "回复"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+"想写留言(并且给所有订阅者邮件复本)请在这里输入文字然后点选 新增(add)按钮"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr "${nb} 订阅者"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr "1 位订阅者"
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr "新增留言"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr "快纪内容"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr "独立页面"
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr "未经许可"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+#, fuzzy
+msgid "Edit history"
+msgstr "完整历史"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+#, fuzzy
+msgid "Edit:"
+msgstr "修改"
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+#, fuzzy
+msgid "Manage"
+msgstr "变更"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+#, fuzzy
+msgid "Revert this and later edits"
+msgstr "回溯到这个版本及相关变更"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr "回到页面"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+#, fuzzy
+msgid "Time:"
+msgstr "时间"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+#, fuzzy
+msgid "Note:"
+msgstr "名称,"
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr "切换 源码/所见即所得 模式"
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr "变更注记(选项)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr "写个注记对浏览变更(RecentChanges)很有帮助"
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr "上传档案或图档"
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr "在这页上传档案并连结它?"
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr "相关编辑说明,请参考"
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr "辅助页面"
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr "文字格式规则"
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "preview this edit"
+msgstr "预览这份编辑文件"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr "预览"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr "取消"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr "取消这页的编辑,回到原先页面"
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr "建立"
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr "建立这快纪页面"
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+msgid "label_preview"
+msgstr "【预览】"
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr "页面名称"
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr "这页快纪的名称(进行变更也许很慢!)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr "型态"
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr "选择这页的格式与表现方式"
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr "(外部编辑器修改)"
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr "首页"
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr "显示快纪最近变更"
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr "变更"
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr "显示讨论页面"
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr "讨论"
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr "显示事例追踪"
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr "事例"
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr "显示快纪内容"
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr "内容"
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr "显示快纪索引"
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr "索引"
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr "显示上传页面"
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr "上传档案"
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr "跳到辅助页面"
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr "辅助"
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr "显示快纪选项"
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr "选项"
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr "回溯连结"
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr "设定邮件订阅在这一页面或是整个站台"
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr "订阅"
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr "显示这一页的变更历史"
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr "显示首页"
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr "比较"
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr "修改"
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr "使用外部编辑器修改"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr "跳到首页"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr "搜寻所有页面"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr "æ–°çš„"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+msgid "parent,"
+msgstr "父层,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr "名称,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+msgid "replacement,"
+msgstr "取代,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+msgid "page"
+msgstr "页面"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr "输入一页面名称并点选右边按钮(光标停驻出现相关讯息)"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "reparent"
+msgstr "变更父层"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "make this page a subtopic of the page you have entered"
+msgstr "变更这个页面成为你进入页面之下的子主题页面"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr "变更这页面名称为您已输入的,更新所有连结"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename"
+msgstr "变更名称"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr "删除!"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr "删除这个页面,如果存在你所输入的页面名称,将会转址进入"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr "建立你输入名称的页面,并会成为这个页面的子主题"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create"
+msgstr "建立"
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+msgid "Recent changes"
+msgstr "最近变更"
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+msgid "Search this wiki"
+msgstr "搜寻这快纪页面"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+msgid "all edits"
+msgstr "全部修改"
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr "您现在已经订阅整个快纪。"
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr "您现在没有订阅整个快纪。"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr "邮件订阅"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr "取消订阅整个快纪。"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr "订阅整个快纪。"
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr "您已经订阅的页面"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr "页面订阅者"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr "Wiki订阅者"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+msgid "subscribe_desc_comments"
+msgstr ""
+"您可以订阅这一页面或是整个快纪。\n"
+"     订阅者会透过电子邮件收到相关留言\n"
+"     或者回到"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+msgid "subscribe_desc_edits"
+msgstr ""
+"您可以订阅这一页面或是整个快纪。\n"
+"     订阅者会透过电子邮件收到相关修改\n"
+"     或者回到"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr "您的电子邮件"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr "变更"
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr "如果要订阅,请设定您的电子邮件信箱。"
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr "您目前订阅这一页面。"
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr "您目前没有订阅这一页面。"
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr " 取消订阅这个快纪页面 "
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr " 订阅这个页面 "
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+#, fuzzy
+msgid "User options"
+msgstr "搜索选项"
+
+#~ msgid "your edit contained a banned link pattern"
+#~ msgstr "您所编辑的内容,含有一个被拒绝出现的连结"
+
+#~ msgid "adding of external links by anonymous authors is restricted"
+#~ msgstr ""
+#~ "您所编辑的发生一个问题:这个网站不允许匿名使用者能够新增对外连结网址。请连"
+#~ "络网站管理者,以取得适当协助。"
+
+#~ msgid "Add a ZWiki web"
+#~ msgstr "新增一快纪网站"
+
+#~ msgid "Type"
+#~ msgstr "型态"
+
+#~ msgid "Create wiki"
+#~ msgstr "建立快纪"
+
+#~ msgid "and enter"
+#~ msgstr "并输入"
+
+#~ msgid ""
+#~ "You may create a new ZWiki Page object using the form below. You may also "
+#~ "choose to upload an existing html file from your local computer by "
+#~ "clicking the <i>Browse</i> button."
+#~ msgstr ""
+#~ "您可以用下面的表单建立新的ZWiki页面。您也可以点选 <i>浏览</i> 按钮\n"
+#~ "上传您计算机中已经存在的 HTML 档案。"
+
+#~ msgid "Add"
+#~ msgstr "新增"
+
+#~ msgid "Add and Edit"
+#~ msgstr "新增并编辑"
+
+#~ msgid "Backlinks for"
+#~ msgstr "回溯连结"
+
+#~ msgid "singleton_desc"
+#~ msgstr "单独存在页面是没有和其它页面相连的页面."
+
+#~ msgid "History for"
+#~ msgstr "变更历程"
+
+#~ msgid "return to page"
+#~ msgstr "回到页面"
+
+#~ msgid "help_shortname"
+#~ msgstr ""
+#~ "注意: 在一个有很多内容的Wiki页面,变更名称将会非常慢。因为其它页面有可能都"
+#~ "需要更新。"
+
+#~ msgid "label_body_text"
+#~ msgstr "主体内容"
+
+#~ msgid "help_wikibody"
+#~ msgstr ""
+#~ "在Wiki页面中,您可用 [方括号] 建立连接。当您储存页面时,方括号里头的\n"
+#~ "            名称将会跟随小小的 <code>?</code> 连接。当您点选时,则依\n"
+#~ "            该名称建立一新页面。"
+
+#~ msgid "help_wikiwords"
+#~ msgstr ""
+#~ "在Wiki页面中,您可用 [方括号] 建立连接。当您储存页面时,方括号里头的\n"
+#~ "            名称将会跟随小小的 <code>?</code> 连接。当您点选时,则依\n"
+#~ "            该名称建立一新页面。"
+
+#~ msgid "label_note"
+#~ msgstr "页面历史的注释说明(选择性项目)"
+
+#~ msgid "help_wikinote"
+#~ msgstr "简短描述您的变更."
+
+#~ msgid "label_upload_contents_optional"
+#~ msgstr "上传档案或是图档(选择性项目)"
+
+#~ msgid "help_wikiupload"
+#~ msgstr "在此页添加附档或是图档。"
+
+#~ msgid "label_format"
+#~ msgstr "页面格式"
+
+#~ msgid "help_format"
+#~ msgstr ""
+#~ "如果您不确定要使用何种格式,就选 Plain Text\n"
+#~ "             ,并且按照一般方式输入您的文件。"
+
+#~ msgid "Save"
+#~ msgstr "储存"
+
+#~ msgid "heading_edit_wiki_page"
+#~ msgstr ""
+#~ "修改\n"
+#~ "        ${itemtype} \n"
+#~ "\n"
+#~ "        \"${pagename}\""
+
+#~ msgid "description_edit_wiki_page"
+#~ msgstr "快纪页面可让您建立许多相互关连的页面。"
+
+#~ msgid "legend_wiki_page_details"
+#~ msgstr "快纪页面细项"
+
+#~ msgid "label_pagename"
+#~ msgstr "页面名称"
+
+#~ msgid "Required"
+#~ msgstr "å¿…é¡»"
+
+#~ msgid "label_required"
+#~ msgstr "(å¿…é¡»)"
+
+#~ msgid "heading_wiki_recent_changes"
+#~ msgstr "最近变更"
+
+#~ msgid "heading_wiki_search_wiki"
+#~ msgstr "搜寻快纪"
+
+#~ msgid "Unsubscribe from this page"
+#~ msgstr "取消订阅这个页面"
+
+#~ msgid "Subscribe to this page"
+#~ msgstr "订阅这个页面"
+
+#~ msgid "heading_wiki_user_options"
+#~ msgstr "使用者选项"
+
+#~ msgid "add a comment"
+#~ msgstr "添加注释"
+
+#~ msgid "heading_wiki_filter_issues"
+#~ msgstr "过滤事例"
+
+#~ msgid "heading_wiki_issue_browser"
+#~ msgstr "事例追踪"
+
+#~ msgid "heading_wiki_issue_tracker"
+#~ msgstr "事例追踪"
+
+#~ msgid "property change"
+#~ msgstr "性质变更"
+
+#~ msgid "backlinks_reparent_help"
+#~ msgstr ""
+#~ "您可变更这页往上的连结,安排在所有页面阶层里头。\\n\n"
+#~ "做好检查或输入一页面名称,并且按下“变更父页面”。\\n\n"
+#~ "通常只要一个父页面就够了。"
+
+#~ msgid "backlinks_reparent_help2"
+#~ msgstr ""
+#~ "您可变更这页的父层,安排在所有页面阶层里头。\\n\n"
+#~ "做好检查或输入一页面名称,并且按下“变更父页面”。\\n\n"
+#~ "通常只要一个父页面就够了。"
+
+#~ msgid "View"
+#~ msgstr "检视"
+
+#~ msgid "Comment"
+#~ msgstr "留言"
+
+#~ msgid "A Comment"
+#~ msgstr "一则留言"
+
+#~ msgid "Menu for Wiki Page related actions."
+#~ msgstr "快纪相关操作选单."
+
+#~ msgid "A Wiki"
+#~ msgstr "一则快纪"
+
+#~ msgid "Wiki"
+#~ msgstr "快纪"
+
+#~ msgid "Table of Contents"
+#~ msgstr "内容目录"
+
+#~ msgid "TOC"
+#~ msgstr "目录"
+
+#~ msgid "Subscriptions"
+#~ msgstr "订阅"
+
+#~ msgid "Change Wiki Page"
+#~ msgstr "变更快纪页面"
+
+#~ msgid "Wiki User"
+#~ msgstr "快纪使用者"
+
+#~ msgid "Wiki visitors, which can only view and comment on wikis."
+#~ msgstr "快纪访客,在快纪上只能浏览和留言。"
+
+#~ msgid "A Wiki Page"
+#~ msgstr "一则快纪页面"
+
+#~ msgid "Wiki Page"
+#~ msgstr "快纪页面"
+
+#~ msgid "A Wiki Page Comment"
+#~ msgstr "一则快纪页面留言"
+
+#~ msgid "Wiki Page Comment"
+#~ msgstr "快纪页面留言"
+
+#~ msgid "Wiki Editor"
+#~ msgstr "快纪编辑器"
+
+#~ msgid "The Wiki Editor can create and edit wikis."
+#~ msgstr "快纪编辑器可以建立以及编辑快纪。"
+
+#~ msgid "Wiki Administrator"
+#~ msgstr "快纪管理者"
+
+#~ msgid "The Wiki Admin can fully manage wiki pages."
+#~ msgstr "快纪管理者可以完全掌控快纪页面。"
+
+#~ msgid "View a Wiki Page"
+#~ msgstr "检视一则快纪页面"
+
+#~ msgid "View Wiki Page"
+#~ msgstr "检视快纪页面"
+
+#~ msgid "Comment on Wiki Page"
+#~ msgstr "在快纪页面留言"
+
+#~ msgid "Make a comment on Wiki Page"
+#~ msgstr "写一则留言在快纪页面"
+
+#~ msgid "Edit Wiki Page"
+#~ msgstr "编辑快纪页面"
+
+#~ msgid "Delete Wiki Page"
+#~ msgstr "删除快纪页面"
+
+#~ msgid "Reparent a Wiki Page"
+#~ msgstr "变更一快纪页面的父层"
+
+#~ msgid "Reparent Wiki Page"
+#~ msgstr "变更快纪页面父层"
+
+#~ msgid "Minimal Wiki Page Container implementation "
+#~ msgstr "最小快纪页面容器实作 "

Added: zope-zwiki/branches/upstream/current/i18n/zh_TW.po
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/zh_TW.po	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/zh_TW.po	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1675 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: ZWiki-0-45-0\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: 2006-01-20 18:11+0000\n"
+"Last-Translator: Simon Michael <simon at joyful.com>\n"
+"Language-Team: <zwiki at zwiki.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: zope/app/translation_files/extract.py\n"
+"Language-code: zh-tw\n"
+"Language-name: 正體中文\n"
+"Preferred-encodings: utf-8\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr "您沒有權力升級所有頁面。"
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr "(目錄 -> 管理性質)"
+
+#: src/ZWiki/Diff.py:174
+#, fuzzy
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr "您沒有權力刪除此頁。"
+
+#: src/ZWiki/Diff.py:180 src/ZWiki/plugins/tracker/tracker.py:332
+#, fuzzy
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr "您沒有權力刪除此頁。"
+
+#: src/ZWiki/Editing.py:156 src/ZWiki/Editing.py:294 src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435 src/ZWiki/plugins/tracker/tracker.py:321
+msgid ""
+"Sorry, this wiki doesn't allow anonymous edits. Please configure a username "
+"in options first."
+msgstr ""
+
+#: src/ZWiki/Editing.py:327
+msgid ""
+"You are not authorized to reparent or change subtopics links on this ZWiki "
+"Page."
+msgstr "您沒有權力在這頁更動父頁或子主題連結。"
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr "您沒有權力變更頁面型態。"
+
+#: src/ZWiki/Editing.py:383 src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr "您沒有權力修改此頁。"
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr "您沒有權力刪除此頁。"
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr "這頁已被改名為 %s。如果此頁不需要,您可以刪除。\n"
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr "您沒有權力在這裡上傳檔案。"
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr "您沒有權力在此頁增加連接。"
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr "發現被拒絕的連結"
+
+#: src/ZWiki/Editing.py:830
+#, fuzzy
+msgid ""
+"your edit contained a banned link pattern. Please contact the site "
+"administrator for help."
+msgstr "發生一個問題: %s。請聯繫管理者,協助處理這問題。"
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr ""
+"您所編輯的發生一個問題:它包含一個被阻擋的連結(網址)樣式。請連絡網站管理"
+"者,以取得適當協助。"
+
+#: src/ZWiki/Editing.py:842
+msgid ""
+"adding of external links by unidentified users is restricted. Please back up "
+"and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+#, fuzzy
+msgid "exceeded max_identified_links"
+msgstr ""
+"您所編輯的發生一個問題:它包含一個被阻擋的連結(網址)樣式。請連絡網站管理"
+"者,以取得適當協助。"
+
+#: src/ZWiki/Editing.py:854
+msgid ""
+"adding of external links is restricted, even for identified users. Please "
+"back up and remove some of the http urls you added, or contact the site "
+"administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506 src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr "訪客"
+
+#: src/ZWiki/OutlineSupport.py:843 src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr "那個頁面連結到這一頁?"
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr "您現在位置"
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr "å¹´"
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr "å¹´"
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr "月"
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr "月"
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr "週"
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr "週"
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr "天"
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr "天"
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr "小時"
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr "小時"
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr "分"
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr "分"
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr "秒"
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr "秒"
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr "頁面被鎖"
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+"\n"
+"            此頁已被 webDAV 鎖住。某人或許正在用外部編輯器\n"
+"            修改這一頁。您必須等到他們完成修改工作,之後再\n"
+"            試試看。如果您已經修改一些內容,您或許得備份下\n"
+"            來,以文字的方式拷貝,好做為重新修改的參考。\n"
+"            "
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr "放棄您變更的內容,並且再試一次,點選確認按鈕(OK)。"
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr "修改衝突"
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr "當您修改時,已經有人存入新的頁面"
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr "要解決衝突問題,請按以下步驟"
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr "點選您瀏覽器的上ㄧ頁按鈕(Back)"
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr "複製您最近修改的內容到剪貼簿"
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr "點選您瀏覽器更新頁面按鈕(Refresh)"
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr "貼上您所修改的內容,在最新變更的內容裡頭"
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr "再按一次變更按鈕(Change)"
+
+#: src/ZWiki/Views.py:420 src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr "或"
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr "放棄所有您變更的內容,並重新再讀一次,點選確認按鈕(OK)"
+
+#: src/ZWiki/Views.py:490
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing "
+"alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them "
+"out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's "
+"plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's "
+"standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+"\n"
+"        快速鍵在 mozilla 相關瀏覽器以 alt-<按鍵> 方式使用\n"
+"        IE 使用者:必須加按 enter 鍵\n"
+"        Mac 使用者:command-<按鍵>\n"
+"        Opera 使用者:shift-escape-<按鍵>\n"
+"        如果這些都不管用,回到前一頁然後再試試看。\n"
+"\n"
+"        0    顯示快速鍵的配置\n"
+"\n"
+"        wiki 功能:\n"
+"        f    顯示首頁\n"
+"        c    顯示 Wiki 的所有內容 (contents)\n"
+"        r    顯示 Wiki 最近的變更\n"
+"             顯示討論頁面\n"
+"        t    顯示事例追蹤功能\n"
+"        i    顯示 Wiki 的索引\n"
+"        o    顯示 Wiki 的選項 (偏好設定)\n"
+"        h    顯示輔助頁面\n"
+"        s    跳到搜尋欄位\n"
+"        \n"
+"        頁面功能:\n"
+"        +    (plone/cmf 網站外關切換設定)使用 Zwiki plone/cmf 外觀\n"
+"        -    (plone/cmf 網站外關切換設定)使用 Zwiki 標準外觀\n"
+"        v    檢視頁面\n"
+"        m    郵件訂閱\n"
+"        b    顯示回溯連結(連結到此頁面)\n"
+"        d    顯示不同比較(頁面修改歷史)\n"
+"        y    顯示完整歷史(在 ZMI 中)\n"
+"        e    修改這一頁面\n"
+"        x    用外部編輯器修改\n"
+"             列印這一頁面(以及子主題)\n"
+"        q    檢視頁面的源碼(快速檢視)\n"
+"             清除並且重新產生這一頁面的快取\n"
+"             跳到子主題\n"
+"             跳到留言(訊息)\n"
+"             如果可能的話,會跳到這一頁面作者的首頁\n"
+"        n    下一頁面\n"
+"        p    上一頁面\n"
+"        u    上到父層頁面\n"
+"        \n"
+"        在修改表單:\n"
+"        s    儲存變更\n"
+"        p    預覽\n"
+"        \n"
+"        當顯示版本比較:\n"
+"        n    下一修改\n"
+"        p    前一修改\n"
+"        "
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr "建立頁面"
+
+#: src/ZWiki/ZWikiPage.py:798 src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr "%(interval)s 前修改"
+
+#: src/ZWiki/ZWikiPage.py:809
+msgid "show last edit"
+msgstr "顯示最新修改"
+
+#: src/ZWiki/ZWikiPage.py:826 src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr "作者 %(editor)s"
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr "不需要新增 Zwiki 大綱快取"
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+"Zwiki 大綱快取因為實作的關係,匯出現在 ZMI 新增選單\n"
+"        裡頭,但不是用來直接新增。\n"
+"        如果需要,Zwiki 會為你建立。\n"
+"        "
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr "留言"
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr "預期在 \"%(token)s\" 之後是 \"=\""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr "預期鍵值 \"%(token)s\" 要有對應資料"
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr "建立新圖片 \"%(filename)s\""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr "上傳新附件 \"%(filename)s\""
+
+#: src/ZWiki/pagetypes/moin.py:335 src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr "修改圖片 \"%(filename)s\""
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr "期待在 \"%(key)s\" 之後的 \"%(wanted)s\" 能夠取得 \"%(token)s\""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr "期待在 \"%(token)s\" 之前的 \"%(key)s\" 為整數值"
+
+#: src/ZWiki/pagetypes/moin.py:745 src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr "期待在 \"%(key)s\" 之後的 \"%(arg)s\" 為整數值"
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr "期待在 \"%(key)s\" 之後的 \"%(args)s\" 為色彩指定值"
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr "回覆"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr "完整歷史"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr "<< 上一版"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr "下一版 >>"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+#, fuzzy
+msgid "Revert this change and all successive changes"
+msgstr "回溯到這個版本及相關變更"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+#, fuzzy
+msgid "plone"
+msgstr "歷史註記:"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+#, fuzzy
+msgid "show all features"
+msgstr "搜尋所有頁面"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+#, fuzzy
+msgid "show basic features"
+msgstr "顯示最新修改"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+#, fuzzy
+msgid "simple"
+msgstr "檔案"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+#, fuzzy
+msgid "subtopic"
+msgstr "子頁面"
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+#, fuzzy
+msgid "for this page"
+msgstr "建立頁面"
+
+#. Default: "reparent"
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+#, fuzzy
+msgid "title"
+msgstr "標題"
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr "過濾事例"
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+msgid "Issue browser"
+msgstr "事例瀏覽"
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+msgid "Issue tracker"
+msgstr "事例追蹤"
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+#, fuzzy
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr "您沒有權力修改此頁。"
+
+#: src/ZWiki/skins/dtmlmessages.pt:10 src/ZWiki/skins/dtmlmessages.pt:32
+#, fuzzy
+msgid "category"
+msgstr "分類"
+
+#: src/ZWiki/skins/dtmlmessages.pt:11 src/ZWiki/skins/dtmlmessages.pt:33
+#, fuzzy
+msgid "severity"
+msgstr "程度"
+
+#: src/ZWiki/skins/dtmlmessages.pt:12 src/ZWiki/skins/dtmlmessages.pt:34
+#, fuzzy
+msgid "status"
+msgstr "狀態"
+
+#: src/ZWiki/skins/dtmlmessages.pt:13 src/ZWiki/skins/dtmlmessages.pt:35
+#, fuzzy
+msgid "age"
+msgstr "頁面"
+
+#: src/ZWiki/skins/dtmlmessages.pt:14 src/ZWiki/skins/dtmlmessages.pt:36
+#, fuzzy
+msgid "modified"
+msgstr "變更"
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+#, fuzzy
+msgid "Add a new issue:"
+msgstr "新增一則事例:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+#, fuzzy
+msgid "Name:"
+msgstr "名稱,"
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+#, fuzzy
+msgid "Category:"
+msgstr "分類:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+#, fuzzy
+msgid "Severity:"
+msgstr "程度:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+#, fuzzy
+msgid "Status:"
+msgstr "狀態:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+#, fuzzy
+msgid "Here are the wiki's issue pages."
+msgstr "建立這快紀頁面"
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+#, fuzzy
+msgid "Details:"
+msgstr "細節:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+#, fuzzy
+msgid "add issue"
+msgstr "事例"
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+#, fuzzy
+msgid "More advanced"
+msgstr "更多進階的"
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+#, fuzzy
+msgid "issue tracker"
+msgstr "事例追蹤"
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+#, fuzzy
+msgid "search options"
+msgstr "儲存設定"
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+#, fuzzy
+msgid "Name contains any of:"
+msgstr "頁面名稱包含任意的:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+#, fuzzy
+msgid "Page text contains any of:"
+msgstr "頁面文字包含任意的:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+#, fuzzy
+msgid "Categories:"
+msgstr "分類:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+#, fuzzy
+msgid "Severities:"
+msgstr "程度:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+#, fuzzy
+msgid "Statuses:"
+msgstr "狀態:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+#, fuzzy
+msgid "Enter a search term, click the numbers to the right,"
+msgstr "輸入搜尋的字詞, 或點選右邊的數字, 或"
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+#, fuzzy
+msgid "Submitted by"
+msgstr "提出者"
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+#, fuzzy
+msgid "Name"
+msgstr "名稱,"
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+#, fuzzy
+msgid "Category"
+msgstr "分類"
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+#, fuzzy
+msgid "filter issues"
+msgstr "過濾事例"
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+#, fuzzy
+msgid "Severity"
+msgstr "程度"
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+#, fuzzy
+msgid "Status"
+msgstr "狀態"
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+#, fuzzy
+msgid "Optional subject"
+msgstr "變更註記(選項)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+#, fuzzy
+msgid "Optional comment"
+msgstr "變更註記(選項)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:44 src/ZWiki/skins/dtmlmessages.pt:45
+#, fuzzy
+msgid "Add ZWiki"
+msgstr "新增快紀"
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+#, fuzzy
+msgid "Id:"
+msgstr "名稱"
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+#, fuzzy
+msgid "Title:"
+msgstr "標題"
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+#, fuzzy
+msgid "Add wiki"
+msgstr "新增快紀"
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr "最近更動的頁面"
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr "最近變更的頁面, 包含概略的摘要"
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr "顯示摘要?"
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr "æ›´æ–°"
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr "頁面"
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr "修改者"
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr "時間"
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr "æ–°çš„"
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr "頁面註記(新的)表示是在最近一週內所建立的"
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+#, fuzzy
+msgid "search issues"
+msgstr "過濾事例"
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr "輸入一個字或一段話,並且點選 輸入 開始搜尋整個wiki。"
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr "這和在右上角搜尋欄位的作用是一樣的。"
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr "技巧:使用單獨的字,對於按頁面名稱搜尋來說最好。"
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid ""
+"Case-insensitivity and wildcards may be supported depending on your catalog "
+"configuration."
+msgstr "大小寫無關與萬用字元,依您的目錄索引設定而定,也許會被支援。"
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr "如果讓它空白的話,可列出所有頁面。"
+
+#: src/ZWiki/skins/dtmlmessages.pt:65 src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr "搜尋"
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr "頁面名稱相符"
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr "文字相符"
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr "透過(非編目方式)搜尋得到文字相符"
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+#, fuzzy
+msgid "recent"
+msgstr "變更父層"
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr "設定在這個站台個人相關偏好。"
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr "使用者名稱:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr "(您編輯文章時的名稱)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+msgid "Email address:"
+msgstr "電子郵件:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+msgid "(allows mail subscription)"
+msgstr "(得以訂閱郵件)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr "您所在時區:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr "(選擇接近的時間)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr "修改欄位高度:"
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr "(調整表格大小)"
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr "儲存設定"
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+#, fuzzy
+msgid "all"
+msgstr "全部"
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr "預設設定"
+
+#: src/ZWiki/skins/dtmlmessages.pt:81 src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr "新增快紀頁面"
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+#, fuzzy
+msgid "Page&nbsp;name:"
+msgstr "頁面名稱"
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+#, fuzzy
+msgid "Add wiki page"
+msgstr "新增快紀頁面"
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+msgid "Topic"
+msgstr "主題"
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr "最近更新"
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+msgid "Comments"
+msgstr "留言"
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+msgid "Views"
+msgstr "檢視"
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+msgid "Created"
+msgstr "建立"
+
+#: src/ZWiki/skins/dtmlmessages.pt:9 src/ZWiki/skins/dtmlmessages.pt:31
+#, fuzzy
+msgid "#"
+msgstr "#"
+
+#: src/ZWiki/skins/dtmlmessages.pt:90 src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr "作者"
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr "<dtml-var lasteditinterval> 之前</dtml-var>"
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr "在"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+msgid "Subtopics"
+msgstr "子頁面"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr "這頁沒有任何子頁面。"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+#, fuzzy
+msgid "Here are it's subtopics."
+msgstr "這是它的子頁面:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+#, fuzzy
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr "您可以透過點選 ^ 按鈕,變更子頁面順序。"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+#, fuzzy
+msgid "Related pages"
+msgstr "建立頁面"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+msgid "Parents"
+msgstr "父層"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr "是最頂層主題。"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr "子主題上層為:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+msgid "Backlinks"
+msgstr "回溯"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr "底下是相關連結到的頁面:"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+msgid "No other pages link to this one."
+msgstr "沒有任何其他頁面連到這一頁。"
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid ""
+"You can set this page's parent(s) to place it within the overall page "
+"hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid ""
+"Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid ""
+"You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr "變更父層"
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+msgid ""
+"There was a problem locating one of this wiki's skin templates. There may be "
+"a page or other non-page-template/non-dtml-method object with the same ID, "
+"obscuring the template. Or the template may be missing on the filesystem (an "
+"incomplete Zwiki installation)."
+msgstr ""
+"這 Wiki 的風格(skin)樣板有些問題。也許有頁面或其他非 ZPT / 非 DTML 方法的物"
+"件有相同 ID,隱藏在樣板裡頭。也或許是樣板在檔案系統中遺漏了(安裝 Zwiki 不完"
+"全造成的)。"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr "標題"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr "個標題可以協助釐清相關討論串以及瞭解最近變更"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr "回覆"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+"想寫留言(並且給所有訂閱者郵件複本)請在這裡輸入文字然後點選 新增(add)按鈕"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr "${nb} 訂閱者"
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr "1 位訂閱者"
+
+#. Default: "add a comment"
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+msgid "add-comment"
+msgstr "新增留言"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr "快紀內容"
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr "獨立頁面"
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+#, fuzzy
+msgid "Edit history"
+msgstr "完整歷史"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+#, fuzzy
+msgid "Edit:"
+msgstr "修改"
+
+#. Default: "<<"
+#: src/ZWiki/skins/zwiki/diffform.pt:34 src/ZWiki/skins/zwiki/diffform.pt:38
+msgid " << "
+msgstr ""
+
+#. Default: ">>"
+#: src/ZWiki/skins/zwiki/diffform.pt:52 src/ZWiki/skins/zwiki/diffform.pt:56
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+#, fuzzy
+msgid "Manage"
+msgstr "變更"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+#, fuzzy
+msgid "Revert this and later edits"
+msgstr "回溯到這個版本及相關變更"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr "回到頁面"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+#, fuzzy
+msgid "Time:"
+msgstr "時間"
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+#, fuzzy
+msgid "Note:"
+msgstr "名稱,"
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr "切換 源碼/所見即所得 模式"
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr "變更註記(選項)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr "寫個註記對瀏覽變更(RecentChanges)很有幫助"
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr "上傳檔案或圖檔"
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr "在這頁上傳檔案並連結它?"
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr "相關編輯說明,請參考"
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr "輔助頁面"
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr "文字格式規則"
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "preview this edit"
+msgstr "預覽這份編輯文件"
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr "預覽"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr "取消"
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr "取消這頁的編輯,回到原先頁面"
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr "建立"
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr "建立這快紀頁面"
+
+#. Default: "PREVIEW"
+#: src/ZWiki/skins/zwiki/editform.pt:203 src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205 src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207 src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217 src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219 src/ZWiki/skins/zwiki/editform.pt:220
+msgid "label_preview"
+msgstr "【預覽】"
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr "頁面名稱"
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr "這頁快紀的名稱(進行變更也許很慢!)"
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr "åž‹æ…‹"
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr "選擇這頁的格式與表現方式"
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr "(外部編輯器修改)"
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr "首頁"
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr "顯示快紀最近變更"
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr "變更"
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr "顯示討論頁面"
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr "討論"
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr "顯示事例追蹤"
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr "事例"
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr "顯示快紀內容"
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr "內容"
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr "顯示快紀索引"
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr "索引"
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr "顯示上傳頁面"
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr "上傳檔案"
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr "跳到輔助頁面"
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr "輔助"
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr "顯示快紀選項"
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr "選項"
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr "回溯連結"
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr "設定郵件訂閱在這一頁面或是整個站台"
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr "訂閱"
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr "顯示這一頁的變更歷史"
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr "顯示首頁"
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr "比較"
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr "修改"
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr "使用外部編輯器修改"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr "跳到首頁"
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr "搜尋所有頁面"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr "æ–°çš„"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+msgid "parent,"
+msgstr "父層,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr "名稱,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+msgid "replacement,"
+msgstr "取代,"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+msgid "page"
+msgstr "頁面"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr "輸入一頁面名稱並點選右邊按鈕(游標停駐出現相關訊息)"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "reparent"
+msgstr "變更父層"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "make this page a subtopic of the page you have entered"
+msgstr "變更這個頁面成為你進入頁面之下的子主題頁面"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr "變更這頁面名稱為您已輸入的,更新所有連結"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename"
+msgstr "變更名稱"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr "刪除!"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid ""
+"delete this page, and redirect links to the page you have entered, if any"
+msgstr "刪除這個頁面,如果存在你所輸入的頁面名稱,將會轉址進入"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr "建立你輸入名稱的頁面,並會成為這個頁面的子主題"
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create"
+msgstr "建立"
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+msgid "Recent changes"
+msgstr "最近變更"
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+msgid "Search this wiki"
+msgstr "搜尋這快紀頁面"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+msgid "all edits"
+msgstr "全部修改"
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+msgid "subscribed_wiki_ok"
+msgstr "您現在已經訂閱整個快紀。"
+
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+msgid "subscribed_wiki_no"
+msgstr "您現在沒有訂閱整個快紀。"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr "郵件訂閱"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr "取消訂閱整個快紀。"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr "訂閱整個快紀。"
+
+#. Default: "You are subscribed to these other pages"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+msgid "other_page_subscribed"
+msgstr "您已經訂閱的頁面"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr "頁面訂閱者"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr "Wiki訂閱者"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+msgid "subscribe_desc_comments"
+msgstr ""
+"您可以訂閱這一頁面或是整個快紀。\n"
+"     訂閱者會透過電子郵件收到相關留言\n"
+"     或者回到"
+
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+msgid "subscribe_desc_edits"
+msgstr ""
+"您可以訂閱這一頁面或是整個快紀。\n"
+"     訂閱者會透過電子郵件收到相關修改\n"
+"     或者回到"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr "您的電子郵件"
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr "變更"
+
+#. Default: "To subscribe, please configure your email address."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+msgid "subscribe_no_email"
+msgstr "如果要訂閱,請設定您的電子郵件信箱。"
+
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+msgid "subscribed_page_ok"
+msgstr "您目前訂閱這一頁面。"
+
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+msgid "subscribed_page_no"
+msgstr "您目前沒有訂閱這一頁面。"
+
+#. Default: "Unsubscribe from this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+msgid " Unsubscribe from this page "
+msgstr " 取消訂閱這個快紀頁面 "
+
+#. Default: "Subscribe to this page"
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+msgid " Subscribe to this page "
+msgstr " 訂閱這個頁面 "
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+#, fuzzy
+msgid "User options"
+msgstr "儲存設定"
+
+#~ msgid "your edit contained a banned link pattern"
+#~ msgstr "您所編輯的內容,含有一個被拒絕出現的連結"
+
+#~ msgid "adding of external links by anonymous authors is restricted"
+#~ msgstr ""
+#~ "您所編輯的發生一個問題:這個網站不允許匿名使用者能夠新增對外連結網址。請連"
+#~ "絡網站管理者,以取得適當協助。"
+
+#~ msgid "Add a ZWiki web"
+#~ msgstr "新增一快紀網站"
+
+#~ msgid "Type"
+#~ msgstr "åž‹æ…‹"
+
+#~ msgid "Create wiki"
+#~ msgstr "建立快紀"
+
+#~ msgid "and enter"
+#~ msgstr "並輸入"
+
+#~ msgid ""
+#~ "You may create a new ZWiki Page object using the form below. You may also "
+#~ "choose to upload an existing html file from your local computer by "
+#~ "clicking the <i>Browse</i> button."
+#~ msgstr ""
+#~ "您可以用下面的表單建立新的ZWiki頁面。您也可以點選 <i>瀏覽</i> 按鈕\n"
+#~ "上傳您電腦中已經存在的 HTML 檔案。"
+
+#~ msgid "Add"
+#~ msgstr "新增"
+
+#~ msgid "Add and Edit"
+#~ msgstr "新增並編輯"
+
+#~ msgid "Backlinks for"
+#~ msgstr "回溯連結"
+
+#~ msgid "singleton_desc"
+#~ msgstr "單獨存在頁面是沒有和其他頁面相連的頁面."
+
+#~ msgid "History for"
+#~ msgstr "變更歷程"
+
+#~ msgid "return to page"
+#~ msgstr "回到頁面"
+
+#~ msgid "help_shortname"
+#~ msgstr ""
+#~ "注意: 在一個有很多內容的Wiki頁面,變更名稱將會非常慢。因為其他頁面有可能都"
+#~ "需要更新。"
+
+#~ msgid "label_body_text"
+#~ msgstr "主體內容"
+
+#~ msgid "help_wikibody"
+#~ msgstr ""
+#~ "在Wiki頁面中,您可用 [方括號] 建立連接。當您儲存頁面時,方括號裡頭的\n"
+#~ "            名稱將會跟隨小小的 <code>?</code> 連接。當您點選時,則依\n"
+#~ "            該名稱建立一新頁面。"
+
+#~ msgid "help_wikiwords"
+#~ msgstr ""
+#~ "在Wiki頁面中,您可用 [方括號] 建立連接。當您儲存頁面時,方括號裡頭的\n"
+#~ "            名稱將會跟隨小小的 <code>?</code> 連接。當您點選時,則依\n"
+#~ "            該名稱建立一新頁面。"
+
+#~ msgid "label_note"
+#~ msgstr "頁面歷史的註釋說明(選擇性項目)"
+
+#~ msgid "help_wikinote"
+#~ msgstr "簡短描述您的變更."
+
+#~ msgid "label_upload_contents_optional"
+#~ msgstr "上傳檔案或是圖檔(選擇性項目)"
+
+#~ msgid "help_wikiupload"
+#~ msgstr "在此頁添加附檔或是圖檔。"
+
+#~ msgid "label_format"
+#~ msgstr "頁面格式"
+
+#~ msgid "help_format"
+#~ msgstr ""
+#~ "如果您不確定要使用何種格式,就選 Plain Text\n"
+#~ "             ,並且按照一般方式輸入您的文件。"
+
+#~ msgid "Save"
+#~ msgstr "儲存"
+
+#~ msgid "heading_edit_wiki_page"
+#~ msgstr ""
+#~ "修改\n"
+#~ "        ${itemtype} \n"
+#~ "\n"
+#~ "        \"${pagename}\""
+
+#~ msgid "description_edit_wiki_page"
+#~ msgstr "快紀頁面可讓您建立許多相互關連的頁面。"
+
+#~ msgid "legend_wiki_page_details"
+#~ msgstr "快紀頁面細項"
+
+#~ msgid "label_pagename"
+#~ msgstr "頁面名稱"
+
+#~ msgid "Required"
+#~ msgstr "å¿…é ˆ"
+
+#~ msgid "label_required"
+#~ msgstr "(å¿…é ˆ)"
+
+#~ msgid "heading_wiki_recent_changes"
+#~ msgstr "最近變更"
+
+#~ msgid "heading_wiki_search_wiki"
+#~ msgstr "搜尋快紀"
+
+#~ msgid "Unsubscribe from this page"
+#~ msgstr "取消訂閱這個頁面"
+
+#~ msgid "Subscribe to this page"
+#~ msgstr "訂閱這個頁面"
+
+#~ msgid "heading_wiki_user_options"
+#~ msgstr "使用者選項"
+
+#~ msgid "heading_wiki_filter_issues"
+#~ msgstr "過濾事例"
+
+#~ msgid "heading_wiki_issue_browser"
+#~ msgstr "事例追蹤"
+
+#~ msgid "heading_wiki_issue_tracker"
+#~ msgstr "事例追蹤"
+
+#~ msgid "property change"
+#~ msgstr "性質變更"
+
+#~ msgid "backlinks_reparent_help"
+#~ msgstr ""
+#~ "您可變更這頁往上的連結,安排在所有頁面階層裡頭。\\n\n"
+#~ "做好檢查或輸入一頁面名稱,並且按下『變更父頁面』。\\n\n"
+#~ "通常只要一個父頁面就夠了。"
+
+#~ msgid "backlinks_reparent_help2"
+#~ msgstr ""
+#~ "您可變更這頁的父層,安排在所有頁面階層裡頭。\\n\n"
+#~ "做好檢查或輸入一頁面名稱,並且按下『變更父頁面』。\\n\n"
+#~ "通常只要一個父頁面就夠了。"
+
+#~ msgid "View"
+#~ msgstr "檢視"
+
+#~ msgid "Comment"
+#~ msgstr "留言"
+
+#~ msgid "A Comment"
+#~ msgstr "一則留言"
+
+#~ msgid "Menu for Wiki Page related actions."
+#~ msgstr "快紀相關操作選單."
+
+#~ msgid "A Wiki"
+#~ msgstr "一則快紀"
+
+#~ msgid "Wiki"
+#~ msgstr "å¿«ç´€"
+
+#~ msgid "Table of Contents"
+#~ msgstr "內容目錄"
+
+#~ msgid "TOC"
+#~ msgstr "目錄"
+
+#~ msgid "Subscriptions"
+#~ msgstr "訂閱"
+
+#~ msgid "Change Wiki Page"
+#~ msgstr "變更快紀頁面"
+
+#~ msgid "Wiki User"
+#~ msgstr "快紀使用者"
+
+#~ msgid "Wiki visitors, which can only view and comment on wikis."
+#~ msgstr "快紀訪客,在快紀上只能瀏覽和留言。"
+
+#~ msgid "A Wiki Page"
+#~ msgstr "一則快紀頁面"
+
+#~ msgid "Wiki Page"
+#~ msgstr "快紀頁面"
+
+#~ msgid "A Wiki Page Comment"
+#~ msgstr "一則快紀頁面留言"
+
+#~ msgid "Wiki Page Comment"
+#~ msgstr "快紀頁面留言"
+
+#~ msgid "Wiki Editor"
+#~ msgstr "快紀編輯器"
+
+#~ msgid "The Wiki Editor can create and edit wikis."
+#~ msgstr "快紀編輯器可以建立以及編輯快紀。"
+
+#~ msgid "Wiki Administrator"
+#~ msgstr "快紀管理者"
+
+#~ msgid "The Wiki Admin can fully manage wiki pages."
+#~ msgstr "快紀管理者可以完全掌控快紀頁面。"
+
+#~ msgid "View a Wiki Page"
+#~ msgstr "檢視一則快紀頁面"
+
+#~ msgid "View Wiki Page"
+#~ msgstr "檢視快紀頁面"
+
+#~ msgid "Comment on Wiki Page"
+#~ msgstr "在快紀頁面留言"
+
+#~ msgid "Make a comment on Wiki Page"
+#~ msgstr "寫一則留言在快紀頁面"
+
+#~ msgid "Edit Wiki Page"
+#~ msgstr "編輯快紀頁面"
+
+#~ msgid "Delete Wiki Page"
+#~ msgstr "刪除快紀頁面"
+
+#~ msgid "Reparent a Wiki Page"
+#~ msgstr "變更一快紀頁面的父層"
+
+#~ msgid "Reparent Wiki Page"
+#~ msgstr "變更快紀頁面父層"
+
+#~ msgid "Minimal Wiki Page Container implementation "
+#~ msgstr "最小快紀頁面容器實作 "

Added: zope-zwiki/branches/upstream/current/i18n/zwiki-manual.pot
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/zwiki-manual.pot	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/zwiki-manual.pot	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,12 @@
+# manual additions to zwiki.pot
+# this 12-line header is ignored
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+

Added: zope-zwiki/branches/upstream/current/i18n/zwiki-plone.pot
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/zwiki-plone.pot	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/zwiki-plone.pot	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,58 @@
+# Zwiki messages which must be in the plone domain - actions
+msgid ""
+msgstr ""
+"Project-Id-Version: ZWiki-0-31-0\n"
+"POT-Creation-Date: Fri Jun 11 09:11:35 2004\n"
+"PO-Revision-Date: 2004-06-12 00:13-0700\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: <zwiki at zwiki.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: zope/app/translation_files/extract.py\n"
+"Language-code: xx\n"
+"Language-name: X\n"
+"Preferred-encodings: utf-8 latin1\n"
+"Domain: plone\n"
+
+# CMF/Plone Wiki Page actions
+# some overlap with CMF/Plone and standard zwiki skin translations here
+# Plone po files will take precedence I think
+msgid "View"
+msgstr ""
+
+msgid "Edit"
+msgstr ""
+
+msgid "History"
+msgstr ""
+
+msgid "Backlinks"
+msgstr ""
+
+msgid "Subscribe"
+msgstr ""
+
+msgid "Wiki contents"
+msgstr ""
+
+msgid "Wiki changes"
+msgstr ""
+
+msgid "Issue tracker"
+msgstr ""
+
+msgid "Filter issues"
+msgstr ""
+
+msgid "Search this wiki"
+msgstr ""
+
+msgid "Wiki options"
+msgstr ""
+
+msgid "Recent changes"
+msgstr ""
+
+msgid "Wiki search"
+msgstr ""
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/i18n/zwiki.pot
===================================================================
--- zope-zwiki/branches/upstream/current/i18n/zwiki.pot	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/i18n/zwiki.pot	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,1308 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: ZWiki-0-56-0\n"
+"POT-Creation-Date: Sat Sep  2 18:10:16 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: <zwiki at zwiki.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: zope/app/locales/extract.py\n"
+"Language-code: xx\n"
+"Language-name: X\n"
+"Preferred-encodings: utf-8 latin1\n"
+"Domain: zwiki\n"
+
+#: src/ZWiki/Admin.py:62
+msgid "You are not authorized to upgrade all pages."
+msgstr ""
+
+#: src/ZWiki/Admin.py:63
+msgid "(folder -> Manage properties)"
+msgstr ""
+
+#: src/ZWiki/Diff.py:174
+msgid "You are not authorized to reparent this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Diff.py:180
+#: src/ZWiki/plugins/tracker/tracker.py:332
+msgid "You are not authorized to rename this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:156
+#: src/ZWiki/Editing.py:294
+#: src/ZWiki/Views.py:332
+#: src/ZWiki/Views.py:435
+#: src/ZWiki/plugins/tracker/tracker.py:321
+msgid "Sorry, this wiki doesn't allow anonymous edits. Please configure a username in options first."
+msgstr ""
+
+#: src/ZWiki/Editing.py:327
+msgid "You are not authorized to reparent or change subtopics links on this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:349
+msgid "You are not authorized to change this ZWiki Page's type."
+msgstr ""
+
+#: src/ZWiki/Editing.py:383
+#: src/ZWiki/Editing.py:410
+#: src/ZWiki/plugins/tracker/tracker.py:340
+#: src/ZWiki/plugins/tracker/tracker.py:347
+#: src/ZWiki/plugins/tracker/tracker.py:354
+msgid "You are not authorized to edit this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:413
+msgid "You are not authorized to delete this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:563
+msgid ""
+"This page was renamed to %s. You can delete this one if no longer needed.\n"
+msgstr ""
+
+#: src/ZWiki/Editing.py:659
+msgid "You are not authorized to upload files here."
+msgstr ""
+
+#: src/ZWiki/Editing.py:663
+msgid "You are not authorized to add a link on this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/Editing.py:822
+msgid "There was a problem: %s"
+msgstr ""
+
+#: src/ZWiki/Editing.py:829
+msgid "banned_links match"
+msgstr ""
+
+#: src/ZWiki/Editing.py:830
+msgid "your edit contained a banned link pattern. Please contact the site administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:841
+msgid "exceeded max_anonymous_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:842
+msgid "adding of external links by unidentified users is restricted. Please back up and remove some of the http urls you added, or contact the site administrator for help."
+msgstr ""
+
+#: src/ZWiki/Editing.py:853
+msgid "exceeded max_identified_links"
+msgstr ""
+
+#: src/ZWiki/Editing.py:854
+msgid "adding of external links is restricted, even for identified users. Please back up and remove some of the http urls you added, or contact the site administrator for help."
+msgstr ""
+
+#: src/ZWiki/Mail.py:506
+#: src/ZWiki/skins/dtmlmessages.pt:58
+msgid "anonymous"
+msgstr ""
+
+#: src/ZWiki/OutlineSupport.py:843
+#: src/ZWiki/skins/zwiki/links.pt:56
+msgid "which pages link to this one ?"
+msgstr ""
+
+#: src/ZWiki/OutlineSupport.py:851
+msgid "You are here"
+msgstr ""
+
+#: src/ZWiki/Utils.py:465
+msgid "years"
+msgstr ""
+
+#: src/ZWiki/Utils.py:465
+msgid "year"
+msgstr ""
+
+#: src/ZWiki/Utils.py:467
+msgid "month"
+msgstr ""
+
+#: src/ZWiki/Utils.py:467
+msgid "months"
+msgstr ""
+
+#: src/ZWiki/Utils.py:469
+msgid "weeks"
+msgstr ""
+
+#: src/ZWiki/Utils.py:469
+msgid "week"
+msgstr ""
+
+#: src/ZWiki/Utils.py:471
+msgid "day"
+msgstr ""
+
+#: src/ZWiki/Utils.py:471
+msgid "days"
+msgstr ""
+
+#: src/ZWiki/Utils.py:473
+msgid "hours"
+msgstr ""
+
+#: src/ZWiki/Utils.py:473
+msgid "hour"
+msgstr ""
+
+#: src/ZWiki/Utils.py:475
+msgid "minute"
+msgstr ""
+
+#: src/ZWiki/Utils.py:475
+msgid "minutes"
+msgstr ""
+
+#: src/ZWiki/Utils.py:477
+msgid "second"
+msgstr ""
+
+#: src/ZWiki/Utils.py:477
+msgid "seconds"
+msgstr ""
+
+#: src/ZWiki/Views.py:346
+msgid "Page is locked"
+msgstr ""
+
+#: src/ZWiki/Views.py:357
+msgid ""
+"\n"
+"            This page has a webDAV lock. Someone is probably editing it\n"
+"            with an external editor.  You'll need to wait until they've\n"
+"            finished and then try again.  If you've just made some changes,\n"
+"            you may want to back up and copy your version of the text for\n"
+"            reference.\n"
+"            "
+msgstr ""
+
+#: src/ZWiki/Views.py:364
+msgid "To discard your changes and try again, click OK."
+msgstr ""
+
+#: src/ZWiki/Views.py:393
+msgid "Edit conflict"
+msgstr ""
+
+#: src/ZWiki/Views.py:413
+msgid "Someone else has saved this page while you were editing"
+msgstr ""
+
+#: src/ZWiki/Views.py:414
+msgid "To resolve the conflict, do this"
+msgstr ""
+
+#: src/ZWiki/Views.py:415
+msgid "Click your browser's back button"
+msgstr ""
+
+#: src/ZWiki/Views.py:416
+msgid "Copy your recent edits to the clipboard"
+msgstr ""
+
+#: src/ZWiki/Views.py:417
+msgid "Click your browser's refresh button"
+msgstr ""
+
+#: src/ZWiki/Views.py:418
+msgid "Paste in your edits again, being mindful of the latest changes"
+msgstr ""
+
+#: src/ZWiki/Views.py:419
+msgid "Click the Change button again"
+msgstr ""
+
+#: src/ZWiki/Views.py:420
+#: src/ZWiki/skins/zwiki/editform.pt:163
+msgid "or"
+msgstr ""
+
+#: src/ZWiki/Views.py:421
+msgid "To discard your changes and start again, click OK"
+msgstr ""
+
+#: src/ZWiki/Views.py:490
+msgid ""
+"\n"
+"        Access keys can be accessed in mozilla-based browsers by pressing alt-<key>\n"
+"        IE users: must also press enter\n"
+"        Mac users: command-<key>\n"
+"        Opera users: shift-escape-<key>\n"
+"        These won't work here, back up to the previous page to try them out.\n"
+"\n"
+"        0    show these access key assignments\n"
+"\n"
+"        wiki functions:\n"
+"        f    show front page\n"
+"        c    show wiki contents\n"
+"        r    show wiki recent changes\n"
+"             show discussion page\n"
+"        t    show issue tracker\n"
+"        i    show wiki index\n"
+"        o    show wiki options (preferences)\n"
+"        h    show help page\n"
+"        s    go to search field\n"
+"        \n"
+"        page functions:\n"
+"        +    (in a plone/cmf site with skin switching set up) use zwiki's plone/cmf skin\n"
+"        -    (in a plone/cmf site with skin switching set up) use zwiki's standard skin\n"
+"        v    view page\n"
+"        m    mail subscription\n"
+"        b    show backlinks (links to this page)\n"
+"        d    show diffs (page edit history)\n"
+"        y    show full history (in ZMI)\n"
+"        e    edit this page                       \n"
+"        x    edit with an external editor\n"
+"             print this page (and subtopics)\n"
+"        q    view page source (quick-view)\n"
+"             wipe and regenerate this page's render cache\n"
+"             go to subtopics\n"
+"             go to comments (messages)\n"
+"             go to page author's home page, if possible\n"
+"        n    next page\n"
+"        p    previous page\n"
+"        u    up to parent page\n"
+"        \n"
+"        in edit form:\n"
+"        s    save changes\n"
+"        p    preview\n"
+"        \n"
+"        when viewing diffs:\n"
+"        n    next edit\n"
+"        p    previous edit\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/Wikis.py:49
+msgid "Unknown wiki type"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:675
+msgid "create this page"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:798
+#: src/ZWiki/ZWikiPage.py:814
+#: src/ZWiki/ZWikiPage.py:817
+msgid "last edited %(interval)s ago"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:809
+msgid "show last edit"
+msgstr ""
+
+#: src/ZWiki/ZWikiPage.py:826
+#: src/ZWiki/ZWikiPage.py:828
+msgid "by %(editor)s"
+msgstr ""
+
+#: src/ZWiki/__init__.py:34
+msgid "No need to add a Zwiki Outline Cache"
+msgstr ""
+
+#: src/ZWiki/__init__.py:35
+msgid ""
+"Zwiki Outline Cache appears in the ZMI Add menu\n"
+"        for implementation reasons, but should not be added directly.\n"
+"        Zwiki will create it for you as needed.\n"
+"        "
+msgstr ""
+
+#: src/ZWiki/pagetypes/common.py:253
+msgid "comments"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1990
+msgid "Expected \"=\" to follow \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:1999
+msgid "Expected a value for key \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:302
+msgid "Create new drawing \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:304
+msgid "Upload new attachment \"%(filename)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:335
+#: src/ZWiki/pagetypes/moin.py:345
+msgid "Edit drawing %(filename)s"
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:730
+msgid "Expected \"%(wanted)s\" after \"%(key)s\", got \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:736
+msgid "Expected an integer \"%(key)s\" before \"%(token)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:745
+#: src/ZWiki/pagetypes/moin.py:754
+msgid "Expected an integer \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/moin.py:774
+msgid "Expected a color value \"%(arg)s\" after \"%(key)s\""
+msgstr ""
+
+#: src/ZWiki/pagetypes/rst.py:85
+msgid "reply"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:127
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:127
+msgid "full history"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:129
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:131
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:129
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:131
+msgid "<< previous edit"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:133
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:135
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:133
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:135
+msgid "next edit >>"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/diffform.pt:137
+#: src/ZWiki/plugins/mathaction/wikis/mathaction/old-diffform.pt:137
+msgid "Revert this change and all successive changes"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:169
+msgid "show plone skin"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:172
+msgid "plone"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:173
+msgid "show all features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:179
+msgid "full"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:180
+msgid "show basic features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:186
+msgid "simple"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:187
+msgid "show only essential features"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:193
+msgid "minimal"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:507
+msgid "subtopic"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:512
+msgid "for this page"
+msgstr ""
+
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:520
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:525
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:530
+#: src/ZWiki/plugins/latexwiki/wikis/latexwiki/wikipage.pt:535
+#. Default: "reparent"
+msgid "title"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/filterissues.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:30
+msgid "Filter issues"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuebrowser.pt:12
+msgid "Issue browser"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/issuetracker.pt:12
+msgid "Issue tracker"
+msgstr ""
+
+#: src/ZWiki/plugins/tracker/tracker.py:361
+msgid "You are not authorized to comment on this ZWiki Page."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:10
+#: src/ZWiki/skins/dtmlmessages.pt:32
+msgid "category"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:11
+#: src/ZWiki/skins/dtmlmessages.pt:33
+msgid "severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:12
+#: src/ZWiki/skins/dtmlmessages.pt:34
+msgid "status"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:13
+#: src/ZWiki/skins/dtmlmessages.pt:35
+msgid "age"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:14
+#: src/ZWiki/skins/dtmlmessages.pt:36
+msgid "modified"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:15
+msgid "Add a new issue:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:16
+msgid "Name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:17
+msgid "Category:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:18
+msgid "Severity:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:19
+msgid "Status:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:2
+msgid "Here are the wiki's issue pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:20
+msgid "Details:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:21
+msgid "add issue"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:22
+msgid "More advanced"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:23
+msgid "issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:24
+msgid "search options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:25
+msgid "Name contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:26
+msgid "Page text contains any of:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:27
+msgid "Categories:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:28
+msgid "Severities:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:29
+msgid "Statuses:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:3
+msgid "Enter a search term, click the numbers to the right,"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:37
+msgid "Submitted by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:38
+msgid "Name"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:39
+msgid "Category"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:4
+msgid "filter issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:40
+msgid "Severity"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:41
+msgid "Status"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:42
+msgid "Optional subject"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:43
+msgid "Optional comment"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:44
+#: src/ZWiki/skins/dtmlmessages.pt:45
+msgid "Add ZWiki"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:46
+msgid "Id:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:47
+msgid "Title:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:48
+msgid "Template:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:49
+msgid "Add wiki"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:5
+msgid "browse open issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:50
+msgid "Pages changed in the last"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:51
+msgid "Recently changed pages, with summaries"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:52
+msgid "Show summaries ?"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:53
+msgid "Refresh"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:54
+msgid "Page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:55
+msgid "Edited&nbsp;by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:56
+msgid "Time"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:57
+msgid "NEW"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:59
+msgid "Pages marked (NEW) have been created within the last week"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:6
+msgid "search issues"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:60
+msgid "Enter a word or phrase and hit enter to search the entire wiki."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:61
+msgid "This is the same as using the search field at top right."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:62
+msgid "Tips: A single word works best for matching page names."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:63
+msgid "Case-insensitivity and wildcards may be supported depending on your catalog configuration."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:64
+msgid "Leave it blank to list all pages."
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:65
+#: src/ZWiki/skins/dtmlmessages.pt:66
+msgid "Search"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:67
+msgid "Page names matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:68
+msgid "Text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:69
+msgid "Thorough (non-catalog) search for text matching"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:7
+msgid "recent"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:70
+msgid "Set your preferences for this wiki:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:71
+msgid "User name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:72
+msgid "(identifies your edits)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:73
+msgid "Email address:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:74
+msgid "(allows mail subscription)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:75
+msgid "Your time zone:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:76
+msgid "(localizes most times)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:77
+msgid "Edit form height:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:78
+msgid "(adjusts form size)"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:79
+msgid "Save options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:8
+msgid "all"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:80
+msgid "Forget options"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:81
+#: src/ZWiki/skins/dtmlmessages.pt:82
+msgid "Add ZWiki Page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:83
+msgid "Page&nbsp;name:"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:84
+msgid "Add wiki page"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:85
+msgid "Topic"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:86
+msgid "Last updated"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:87
+msgid "Comments"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:88
+msgid "Views"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:89
+msgid "Created"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:9
+#: src/ZWiki/skins/dtmlmessages.pt:31
+msgid "#"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:90
+#: src/ZWiki/skins/dtmlmessages.pt:92
+msgid "by"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:91
+msgid "<dtml-var lasteditinterval> ago</dtml-var>"
+msgstr ""
+
+#: src/ZWiki/skins/dtmlmessages.pt:93
+msgid "on"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:108
+msgid "Subtopics"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:111
+msgid "This page has no subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:114
+msgid "Here are it's subtopics."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:117
+msgid "You can reorder them by clicking the ^ buttons."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:20
+msgid "Related pages"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:26
+msgid "Parents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:31
+msgid "is a top-level topic."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:32
+msgid "is a subtopic of:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:55
+msgid "Backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:56
+msgid "Here are the pages which link to it:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:57
+msgid "No other pages link to this one."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:82
+msgid "You can set this page's parent(s) to place it within the overall page hierarchy."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:85
+msgid "Check one or more checkboxes or enter a page name here, and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:88
+msgid "Enter a page name here and click the button."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:91
+msgid "You can type just the first few letters, case and punctuation are ignored."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/backlinks.pt:98
+msgid "Reparent"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:12
+msgid "Bad template"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/badtemplate.pt:13
+msgid "There was a problem locating one of this wiki's skin templates. There may be a page or other non-page-template/non-dtml-method object with the same ID, obscuring the template. Or the template may be missing on the filesystem (an incomplete Zwiki installation)."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:21
+msgid "subject"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:22
+msgid "a subject helps clarify threads and RecentChanges"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:29
+msgid "replying"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:36
+msgid "to comment (and cc any subscribers) enter text here and click add"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:56
+msgid "${nb} subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:58
+msgid "1 subscriber"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/commentform.pt:64
+#. Default: "add a comment"
+msgid "add-comment"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:12
+msgid "Wiki contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/contentspage.pt:16
+msgid "Singletons"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/denied.pt:12
+msgid "Not permitted"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:24
+msgid "Edit history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:32
+msgid "Edit:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:34
+#: src/ZWiki/skins/zwiki/diffform.pt:38
+#. Default: "<<"
+msgid " << "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:52
+#: src/ZWiki/skins/zwiki/diffform.pt:56
+#. Default: ">>"
+msgid " >> "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:61
+msgid "Manage"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:65
+msgid "Revert this and later edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:74
+msgid "Return to page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:85
+msgid "Time:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/diffform.pt:90
+msgid "Note:"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:121
+msgid "toggle source/WYSIWYG mode"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:132
+msgid "Optional change note"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:133
+msgid "a note makes RecentChanges more useful"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:146
+msgid "Upload a file or image"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:147
+msgid "upload a file and link it on this page ?"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:157
+msgid "For editing help, see"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:159
+msgid "HelpPage"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:166
+msgid "TextFormattingRules"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:170
+#: src/ZWiki/skins/zwiki/editform.pt:170
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "preview this edit"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:178
+msgid "Preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "Cancel"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:183
+msgid "cancel this edit and return to the page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:191
+msgid "Create"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:192
+msgid "create this wiki page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:203
+#: src/ZWiki/skins/zwiki/editform.pt:204
+#: src/ZWiki/skins/zwiki/editform.pt:205
+#: src/ZWiki/skins/zwiki/editform.pt:206
+#: src/ZWiki/skins/zwiki/editform.pt:207
+#: src/ZWiki/skins/zwiki/editform.pt:216
+#: src/ZWiki/skins/zwiki/editform.pt:217
+#: src/ZWiki/skins/zwiki/editform.pt:218
+#: src/ZWiki/skins/zwiki/editform.pt:219
+#: src/ZWiki/skins/zwiki/editform.pt:220
+#. Default: "PREVIEW"
+msgid "label_preview"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:60
+msgid "Page name"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:61
+msgid "the name of this wiki page (changing this may be slow!)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:71
+msgid "type"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/editform.pt:72
+msgid "select the formatting and rendering style for this page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:102
+msgid "(external edit)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:12
+msgid "home"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:13
+msgid "show wiki recent changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:17
+msgid "changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:18
+msgid "show discussion page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:22
+msgid "discussion"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:23
+msgid "show issue tracker"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:27
+msgid "issues"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:28
+msgid "show wiki contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:32
+msgid "contents"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:33
+msgid "show wiki index"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:37
+msgid "index"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:38
+msgid "show upload page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:42
+msgid "uploads"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:43
+msgid "show help page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:48
+msgid "help"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:49
+msgid "show wiki options"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:53
+msgid "options"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:62
+msgid "backlinks"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:63
+msgid "configure email subscription to this page or site"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:73
+msgid "subscribe"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:74
+msgid "show this page's change history"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:8
+msgid "show front page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:80
+msgid "diff"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:89
+msgid "edit"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/links.pt:90
+msgid "edit using external editor"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:22
+msgid "go to home page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pageheader.pt:53
+msgid "search all pages"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:25
+msgid "new"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:26
+msgid "parent,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:29
+msgid "name,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:32
+msgid "replacement,"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:35
+msgid "page"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:40
+msgid "enter a page name and click buttons to the right (mouse over for help)"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "reparent"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:45
+msgid "make this page a subtopic of the page you have entered"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename this page to the name you have entered, updating all links"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:50
+msgid "rename"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete!"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:55
+msgid "delete this page, and redirect links to the page you have entered, if any"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create a page with the name you have entered, as a subtopic of this one"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/pagemanagementform.pt:60
+msgid "create"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/recentchanges.pt:12
+msgid "Recent changes"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/searchwiki.pt:12
+msgid "Search this wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:102
+#: src/ZWiki/skins/zwiki/subscribeform.pt:136
+msgid "all edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:113
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to the whole wiki."
+msgid "subscribed_wiki_ok"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:117
+#. Default: "You are currently not subscribed<br /> to the whole wiki."
+msgid "subscribed_wiki_no"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:12
+msgid "Mail subscription"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:121
+msgid "Unsubscribe from whole wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:128
+msgid "Subscribe to whole wiki"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:146
+#. Default: "You are subscribed to these other pages"
+msgid "other_page_subscribed"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:164
+msgid "Page subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:173
+msgid "Wiki subscribers"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:38
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of comments via email.\n"
+#.  "              Or return to"
+msgid "subscribe_desc_comments"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:43
+#. Default: ""
+#.  "You can subscribe to this page or to the whole wiki.\n"
+#.  "              Subscribers receive a copy of all edits via email.\n"
+#.  "              Or return to"
+msgid "subscribe_desc_edits"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:53
+msgid "Email will go to the address you have configured in site preferences."
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:58
+msgid "Your email address"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:62
+msgid "Change"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:69
+#. Default: "To subscribe, please configure your email address."
+msgid "subscribe_no_email"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:79
+#. Default: ""
+#.  "You are currently subscribed<br />\n"
+#.  "                  to this page."
+msgid "subscribed_page_ok"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:83
+#. Default: ""
+#.  "You are currently not subscribed<br />\n"
+#.  "                  to this page."
+msgid "subscribed_page_no"
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:87
+#. Default: "Unsubscribe from this page"
+msgid " Unsubscribe from this page "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/subscribeform.pt:94
+#. Default: "Subscribe to this page"
+msgid " Subscribe to this page "
+msgstr ""
+
+#: src/ZWiki/skins/zwiki/useroptions.pt:12
+msgid "User options"
+msgstr ""
+
+

Added: zope-zwiki/branches/upstream/current/list_authors.hs
===================================================================
--- zope-zwiki/branches/upstream/current/list_authors.hs	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/list_authors.hs	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,102 @@
+-- Copyright (C) 2004 David Roundy
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2, or (at your option)
+-- any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software Foundation,
+-- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+module Main (main) where
+
+import DarcsUtils ( formatPath )
+import DarcsRepo ( read_repo )
+import PatchInfo ( pi_author )
+
+import Data.List ( sort, group )
+import System ( getProgName, getArgs )
+import Monad ( liftM )
+
+intro :: Bool -> IO String
+intro do_stats = do
+  prog_name <- getProgName
+  return $
+    "This is a list of ALL contributors to this repo, sorted according to the\n"++
+    "number of patches they have contributed.  This list is automatically\n"++
+    "created from the darcs repository, so if there are problems with it,\n"++
+    "changes should be made to list_authors.hs.\n"++
+    "\n" ++
+    (if do_stats
+     then ""
+     else ("Run " ++ formatPath (prog_name ++ " stats") ++
+           " for more detailed information.\n" ++ "\n"))
+
+main :: IO ()
+main = do darcs_history <- read_repo "."
+          use_statistics <- elem "stats" `liftM` getArgs
+          intro use_statistics >>= putStr
+          mapM_ putStrLn $ sort_authors use_statistics $ map (pi_author.fst)
+                         $ concat darcs_history
+
+-- contributors who only provided an email address, one for which we know the name
+-- note that having an entry in this table counts as two addresses... so if there 
+-- another address used besides this entry, you should remove it from the table,
+-- add a constant (above) and modify canonize_authors (below)
+-- XXX check this & clean up
+authors_sans_name :: [ (String, String) ]
+authors_sans_name =
+  [ 
+    ("encolpe.degoute at ingeniweb.com"   , "Encolpe Degoute"),
+    ("simon at joyful.com"                , "Simon Michael"),
+    ("bob+zwiki at mcelrath.org"          , "Bob McElrath"),
+    ("lele at seldati.it"                 , "Lele Gaifax"),
+    ("nachtigall at web.de"               , "Jens Nachtigall"),
+    ("frank at laurijssens.nl"            , "Frank Laurijssens"),
+    ("foenyx at online.fr"                , "Nicolas Laurent"),
+    ("stefan.rank at oefai.at"            , "Stefan Rank"),
+    ("tcchou at tcchou.org"               , "T. C. Chou"),
+    ("stefan.rank at ofai.at"             , "Stefan Rank"),
+    ("bill.page1 at sympatico.ca"         , "Bill Page"),
+    ("riley at uic.com"                   , "John Riley"),
+    ("jbb at contradix.com"               , "Jordan Baker"),
+    ("alvaro at antalia.com"              , "Alvaro Cantero"),
+--    ("klippe at pf.pl"                    , ""),
+--    ("huron at sopinspace.com"            , ""),
+--    ("an.ma at web.de"                    , ""),
+    ("","")
+  ]
+
+canonize_author :: String -> String
+canonize_author s
+    | s `contains` "simon at blue"        = "Simon Michael <simon at joyful.com>"
+    | s `contains` "simon at dynabook.joyful.com"        = "Simon Michael <simon at joyful.com>"
+    | s `contains` "sendencolpe.degoute" = "Encolpe Degoute <encolpe.degoute at ingeniweb.com>"
+canonize_author s =
+  if (not.null) eaLst 
+      then (uncurry add_name_to_mail) $ head eaLst
+      else s
+  where eaLst = [ ea | ea <- authors_sans_name, fst ea == s ]
+
+sort_authors :: Bool -> [String] -> [String]
+sort_authors use_stats as = reverse $ map shownames $ sort $
+                            map (\s -> (length s,head s)) $
+                            group $ sort $ map canonize_author as
+        where shownames (n, a) = if use_stats
+                                 then show n ++ "\t" ++ a
+                                 else a
+
+contains :: String -> String -> Bool
+a `contains` b | length a < length b = False
+               | take (length b) a == b = True
+               | otherwise = tail a `contains` b
+
+add_name_to_mail :: String -> String -> String
+add_name_to_mail m n = n ++ " <" ++ m ++ ">"
+

Added: zope-zwiki/branches/upstream/current/pagetypes/__init__.py
===================================================================
--- zope-zwiki/branches/upstream/current/pagetypes/__init__.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/pagetypes/__init__.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,179 @@
+# PAGE TYPES
+"""
+A zwiki page holds a page type object (in its page_type attribute) to
+which it delegates certain methods, so that formatting and other behaviour
+can be changed by replacing this page type object with another (the State
+pattern). Page type objects hold no state aside from their class, so when
+calling them we usually pass in the page as first argument.
+XXX cf ram cache manager code to check for persistence issue ?
+
+To define a new page type, add a module in this package or in a separate
+zope product which subclasses any of the *PageType classes, and call
+registerPageType. Quick start:
+
+- copy one of the existing modules (files) in this package; give your page
+  type a suitable class name, _id and _name; register it at the end.
+  Or: put your module in a separate zope product and call registerPageType
+  in your __init__.py.
+
+- restart zope or refresh zwiki; your page type should appear in the editform
+
+- tweak your page type until it does what you want. You can see a list of
+  overrideable page-type-specific methods in common.PageTypeBase.
+  Don't forget to modify your supports* methods as appropriate.
+
+"""
+
+from Products.ZWiki.Utils import BLATHER, formattedTraceback
+
+# global page type registry
+#XXX print "__init__.py: setting PAGETYPES to []"
+PAGETYPES = []
+
+# ids-to-names mapping used by legacy skin templates
+PAGE_TYPES = {}
+
+# legacy page types to auto-upgrade
+PAGE_TYPE_UPGRADES = {
+    # early zwiki
+    'Structured Text'              :'stx',
+    'structuredtext_dtml'          :'stx',
+    'HTML'                         :'html',
+    'html_dtml'                    :'html',
+    'Classic Wiki'                 :'wwml',
+    'Plain Text'                   :'plaintext',
+    # pre-0.9.10
+    'stxprelinkdtml'               :'stx',
+    'structuredtextdtml'           :'stx',
+    'dtmlstructuredtext'           :'stx',
+    'structuredtext'               :'stx',
+    'structuredtextonly'           :'stx',
+    'classicwiki'                  :'wwml',
+    'htmldtml'                     :'html',
+    'plainhtmldtml'                :'html',
+    'plainhtml'                    :'html',
+    # pre-0.17
+    'stxprelinkdtmlhtml'           :'stx',
+    'issuedtml'                    :'stx',
+    # pre-0.19
+    'stxdtmllinkhtml'              :'stx',
+    'dtmlstxlinkhtml'              :'stx',
+    'stxprelinkhtml'               :'stx',
+    'stxlinkhtml'                  :'stx',
+    'stxlink'                      :'stx',
+    'wwmllink'                     :'wwml',
+    'wwmlprelink'                  :'wwml',
+    'prelinkdtmlhtml'              :'html',
+    'dtmllinkhtml'                 :'html',
+    'prelinkhtml'                  :'html',
+    'linkhtml'                     :'html',
+    'textlink'                     :'plaintext',
+    # pre-0.20
+    'stxprelinkfitissue'           :'stx',
+    'stxprelinkfitissuehtml'       :'stx',
+    'stxprelinkdtmlfitissuehtml'   :'stx',
+    'rstprelinkfitissue'           :'rst',
+    'wwmlprelinkfitissue'          :'wwml',
+    # pre-0.22
+    'msgstxprelinkfitissuehtml'    :'stx',
+    # nb pre-.22 'html' pages will not be auto-upgraded
+    #'html'                         :'html',
+    # pre-0.32
+    'msgstxprelinkdtmlfitissuehtml':'stx',
+    'msgrstprelinkfitissue'        :'rst',
+    'msgwwmlprelinkfitissue'       :'wwml',
+    'dtmlhtml'                     :'html',
+    }
+
+def registerPageType(t,prepend=0):
+    """
+    Add a page type class to Zwiki's global registry, optionally at the front.
+
+    >>> from Products.ZWiki.pagetypes import registerPageType
+    >>> registerPageType(MyPageTypeClass)
+
+    """
+    if prepend: pos = 0
+    else: pos = len(PAGETYPES)
+    PAGETYPES.insert(pos,t)
+    PAGE_TYPES[t._id] = t._name
+    BLATHER('loaded page type: %s (%s)'%(t._id,t._name))
+
+def registerPageTypeUpgrade(old,new):
+    """
+    Add a page type transition to ZWiki's list of auto-upgrades.
+
+    >>> from Products.ZWiki.pagetypes import registerPageTypeUpgrade
+    >>> registerPageTypeUpgrade('oldpagetypeid','newpagetypeid')
+
+    """
+    PAGE_TYPE_UPGRADES[old] = new
+
+# import pagetype modules/packages in this directory, each will register itself
+import os, re
+modules = [re.sub('.py$','',f) for f in os.listdir(__path__[0])
+           if os.path.isdir(os.path.join(__path__[0], f))
+           or (f.endswith('.py')
+               and not f.endswith('_tests.py')
+               and not f == '__init__.py'
+               )
+           ]
+# enforce the order of at least the first few page types in the editform
+# can be overridden with the 'allowed_page_types' folder property
+firstmods = ['rst','stx','html','plaintext']
+firstmods.reverse()
+for mod in firstmods:
+    try:
+        modules.remove(mod)
+        modules.insert(0, mod)
+    except ValueError:
+        pass
+# and import
+for m in modules:
+    if m.startswith('_'):
+        BLATHER('%s page type disabled with _ prefix, skipping\n' % m[1:])
+    else:
+        try:
+            __import__('Products.ZWiki.pagetypes.%s' % m)
+        except:
+            BLATHER('could not load %s page type, skipping (traceback follows)\n%s' % (
+                m, formattedTraceback()))
+
+# backwards compatibility - old zwiki page objects expect these to be here
+
+# but if a page type has been disabled with a _ prefix, just ignore
+# XXX can't really disable yet, these get imported somewhere else (except wwml)
+#def tryImport(module, fromlist):
+#    try: __import__(module,globals(),locals(),fromlist)
+#    except ImportError: pass
+
+try:
+    import html
+    ZwikiHtmlPageType = html.PageTypeHtml
+except ImportError:
+    pass
+try:
+    import moin
+    ZwikiMoinPageType = moin.PageTypeMoin
+except ImportError:
+    pass
+try:
+    import plaintext
+    ZwikiPlaintextPageType = plaintext.PageTypePlaintext
+except ImportError:
+    pass
+try:
+    import rst
+    ZwikiRstPageType = rst.PageTypeRst
+except ImportError:
+    pass
+try:
+    import stx
+    ZwikiStxPageType = stx.PageTypeStx
+except ImportError:
+    pass
+try:
+    import wwml
+    ZwikiWwmlPageType = wwml.PageTypeWwml
+except ImportError:
+    pass

Added: zope-zwiki/branches/upstream/current/pagetypes/common.py
===================================================================
--- zope-zwiki/branches/upstream/current/pagetypes/common.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/pagetypes/common.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,260 @@
+import string, re, urllib
+from string import split,join,find,lower,rfind,atoi,strip,lstrip
+from urllib import quote, unquote
+
+from Products.ZWiki.Utils import BLATHER, html_quote, html_unquote, formattedTraceback, \
+     ZOPEVERSION
+#XXX avoid import loop
+#from Products.ZWiki.plugins.purplenumbers import add_purple_numbers_to
+from Products.ZWiki.Regexps import dtmlorsgmlexpr, footnoteexpr
+from Products.ZWiki.I18n import _
+
+# XXX temporary hack, used for placing subtopics in the page. Supposed to
+# be secret, invisible, and never encountered by users. Ha!
+MIDSECTIONMARKER = 'ZWIKIMIDSECTION'
+
+# XXX trying to make these public for editform
+from AccessControl import ModuleSecurityInfo
+modulesecurity = ModuleSecurityInfo()
+modulesecurity.declarePublic('yes')
+modulesecurity.declarePublic('no')
+def yes(self):
+    """public"""
+    return 1
+def no(self):
+    """public"""
+    return 0
+modulesecurity.apply(globals())
+
+
+class PageTypeBase:
+    """
+    I encapsulate wiki page behaviour which varies according to page type.
+
+    I'm an abstract class providing a number of methods which are
+    page-type-specific, with default implementations. Override me and
+    define _id and _name to make a usable page type object. See
+    __init__.py for more.
+    """
+
+    _id = None
+    _name = None
+    supportsStx = no
+    supportsRst = no
+    supportsWwml = no
+    supportsWikiLinks = no
+    supportsHtml = no
+    supportsDtml = no
+    supportsEpoz = no
+
+    def id(self): return self._id
+    def name(self): return self._name
+    __call__ = id
+
+    def __repr__(self):
+        return "<%s '%s (%s)' at 0x%s>" % (self.__class__.__name__,
+                                           self.id(),
+                                           self.name(),
+                                           hex(id(self))[2:])
+
+    def format(self,text):
+        """
+        Apply the text formatting rules of this page type, if any.
+
+        Eg for the stx page type, apply the structured text rules.
+        """
+        return text
+
+    def preRender(self,page,text=None):
+        """
+        Do all the pre-rendering we can for page, or for a piece of text.
+        """
+        return self.format(text or page.read())
+
+    def render(self, page, REQUEST={}, RESPONSE=None, **kw):
+        """
+        Do any final (view-time) rendering for page.
+        """
+        return page.preRendered()
+
+    def renderText(self, page, text, **kw):
+        """
+        Render some source text as if it were in page, as far as possible.
+
+        This is a helper for edit preview. Some source text is hard to
+        render without being situated in a page object (DTML, permissions
+        etc). We make a dummy page similar to the real page, set the text
+        and render it.  This is a bit heavy-handed, but it gives a pretty
+        accurate preview. We disable a few things which are unnecessary or
+        problematic.
+        """
+        # make a new page object, like in create
+        p = page.__class__(__name__=page.getId())
+        p.title = page.pageName()
+        p = p.__of__(page.aq_parent)
+        p.setPageType(self.id())
+        p.setText(text)
+        return p.render(
+            page,
+            kw.get('REQUEST',{}),
+            kw.get('RESPONSE',None),
+            bare=1,
+            show_subtopics=0,
+            show_issueproperties=0)
+    
+    def preRenderMessages(self,page):
+        t = ''
+        for m in page.messages(): t += self.preRenderMessage(page,m)
+        if t: t = self.discussionSeparator(page) + t
+        return t
+
+    def preRenderMessage(self,page,msg):
+        t = msg.get_payload()
+        t = self.protectEmailAddresses(page,t)
+        t = self.renderCitationsIn(page,t)
+        t = self.addCommentHeadingTo(page,t,msg)
+        return t
+
+    def protectEmailAddresses(self,page,text):
+        return re.sub(r'(?<!mailto:)\b(?!msg\d{14}-\d{4})(?<!msg\d{14}-)(\w[\w\-\+\.]*)@([\w\-\.]+)\.([\w\-\.]+)\b([^>]*<|$)', 
+            lambda m: '<span class="nospam1">&#' + str(ord(m.groups()[0][0])) 
+                + m.groups()[0][1:] 
+                + '<!-- foobar --></span>&#64;<span class="nospam2">' 
+                + m.groups()[1][0:-1] + '&#' + str(ord(m.groups()[1][-1])) 
+                + ';&#46;' + m.groups()[2] + '</span>' + m.groups()[3], text)
+
+    def renderCitationsIn(self,page,text):
+        return text
+
+    def addCommentHeadingTo(self,page,text,msg):
+        return self.makeCommentHeading(page,
+                                       msg.get('subject'),
+                                       msg.get('from'),
+                                       msg.get('date'),
+                                       msg.get('message-id'),
+                                       msg.get('in-reply-to')
+                                       ) + text
+
+    def makeCommentHeading(self, page,
+                           subject, username, time, 
+                           message_id=None,in_reply_to=None):
+        heading = '\n\n'
+        heading += '%s --' % (subject or '...')
+        if username: heading = heading + '%s, ' % (username)
+        heading += time or ''
+        heading += '\n\n'
+        return heading
+
+    def discussionSeparator(self,page):
+        return '\n------------------------------------------------------------\n'
+
+#    def addPurpleNumbersTo(self,page,t):
+#        return add_purple_numbers_to(t,page)
+
+    def inlineImage(self, page, id, path):
+        return '\n\nimage: %s/%s\n' % (page.pageUrl(),path)
+
+    def linkFile(self, page, id, path):
+        return '\n\nfile: %s/%s\n' % (page.pageUrl(),path)
+
+    def split(self):
+        """
+        Move this page's top-level sections to sub-pages.
+        """
+        return 
+
+    def merge(self):
+        """
+        Merge sub-pages as sections of this page.
+
+        This merges all offspring, not just immediate children.
+        """
+        return 
+
+class PageTypeBaseHtml(PageTypeBase):
+    """
+    I am an abstract base class for zwiki page types which support HTML.
+
+    Override me and define _id and _name to make a usable page type
+    object. See __init__.py for more.
+    """
+    
+    supportsHtml = yes
+
+    def renderCitationsIn(self, page, t):
+        """
+        Apply HTML blockquote formatting to lines beginning with > in text.
+        """
+        inblock = 0
+        blocklines = []
+        blockend=0
+        lines = string.split(t, '\n')
+        t = ""
+        for i in range(len(lines)):
+            m = re.match(r'^>\s?(.*)$', lines[i])
+            if m:
+                if not inblock:
+                    t += string.join(lines[blockend:i],'\n')
+                    t += '<blockquote type="cite">\n'
+                inblock = 1
+                blocklines.append(m.group(1))
+            elif inblock:
+                inblock = 0
+                blockend=i
+                t += self.renderCitationsIn(page,string.join(blocklines, '\n'))
+                t += '</blockquote>\n'
+                blocklines = []
+        if inblock:
+            m = re.match(r'^>\s?(.*)$', lines[i])
+            lines[i] = m.group(1)+'</blockquote>\n'
+        t += string.join(lines[blockend:], '\n')
+        return t 
+
+    def makeCommentHeading(self, page,
+                           subject, username, time, 
+                           message_id=None,in_reply_to=None):
+        heading = '\n\n'
+        if message_id:
+            # use the message id for linking, but strip the <>
+            # and leave it unquoted, browsers can handle it
+            heading += '<a class="visualNoPrint" name="msg%s"></a>\n' % \
+                       re.sub(r'^<(.*)>$',r'\1',message_id)
+        if page.inCMF():
+            heading += \
+              '<img src="discussionitem_icon.gif" style="border:none; margin:0" />'
+        heading += '<b>%s</b> --' % (subject or '...') #more robust
+        if username: heading = heading + '%s, ' % (username)
+        if message_id:
+            heading += ' <a href="%s#msg%s">%s</a>' % \
+                       (page.pageUrl(),
+                        re.sub(r'^<(.*)>$',r'\1',message_id),
+                        html_quote(time or ''))
+            inreplytobit = '&in_reply_to='+quote(message_id)
+        else:
+            heading += html_quote(time or '')
+            inreplytobit = ''
+        #heading += ( (' <a href="%s?subject=%s%s#bottom">' 
+        #             % (page.pageUrl(),quote(subject or ''),inreplytobit)) +
+        #             + _("reply") + '</a>' )
+        
+        heading += ' <a class="visualNoPrint" href="%s?subject=%s%s#bottom">reply</a>'\
+                   % (page.pageUrl(),quote(subject or ''),inreplytobit)
+
+                     
+        heading += '<br />\n'
+        return heading
+
+    def discussionSeparator(self,page):
+        # we want to customize the heading style in the stylesheet..
+        # but also have it look ok by default in plone, which has it's own..
+        # without preventing it being overridden - perhaps b outside the span
+        # will work
+        return '\n\n<a name="comments"><br /><b><span class="commentsheader">%(comments)s:</span></b></a>\n\n' % \
+               { "comments":_("comments") }
+            
+    def inlineImage(self, page, id, path):
+        return '\n\n<img src="%s" />\n' % path
+
+    def linkFile(self, page, id, path):
+        return '\n\n<a href="%s">%s</a>\n' % (path,id)
+

Added: zope-zwiki/branches/upstream/current/pagetypes/common_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/pagetypes/common_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/pagetypes/common_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,27 @@
+from Products.ZWiki.testsupport import *
+ZopeTestCase.installProduct('ZWiki')
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    return suite
+
+class Tests(ZwikiTestCase):
+
+    def test_renderCitationsIn(self):
+        p = self.page
+        pagetype = p.lookupPageType('stx')()
+        test = lambda x,y:self.assertEqual(pagetype.renderCitationsIn(p,x),y)
+        # no citations
+        test('a','a')
+        # single level of citation
+        test('> a\n','<blockquote type="cite">\na</blockquote>\n')
+        # no terminating newline
+        test('> a','<blockquote type="cite">\na</blockquote>\n')
+        # double citation followed by single
+        test('>> a\n> b\n',
+             '<blockquote type="cite">\n<blockquote type="cite">\na</blockquote>\nb</blockquote>\n')
+        # double with no following single
+        test('>> a\n',
+             '<blockquote type="cite">\n<blockquote type="cite">\na</blockquote>\n</blockquote>\n')
+

Added: zope-zwiki/branches/upstream/current/pagetypes/html.py
===================================================================
--- zope-zwiki/branches/upstream/current/pagetypes/html.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/pagetypes/html.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,32 @@
+from common import *
+from Products.ZWiki.I18n import _
+from Products.ZWiki.pagetypes import registerPageType
+
+class PageTypeHtml(PageTypeBaseHtml):
+    _id = 'html'
+    _name = 'HTML'
+    supportsHtml = yes
+    supportsDtml = yes
+    supportsEpoz = yes
+
+    def preRender(self, page, text=None):
+        t = text or (page.read()+'\n'+MIDSECTIONMARKER)
+        t = page.applyWikiLinkLineEscapesIn(t)
+        t = page.markLinksIn(t)
+        t = self.protectEmailAddresses(page,t)
+        return t
+
+    def render(self, page, REQUEST={}, RESPONSE=None, **kw):
+        if page.dtmlAllowed() and page.hasDynamicContent():
+            t = page.evaluatePreRenderedAsDtml(page,REQUEST,RESPONSE,**kw)
+        else:
+            t = page.preRendered()
+        t = page.renderMarkedLinksIn(t)
+        t = page.renderMidsectionIn(t,**kw)
+        t = page.addSkinTo(t,**kw)
+        return t
+
+registerPageType(PageTypeHtml)
+
+# backwards compatibility - need this here for old zodb objects
+ZwikiHtmlPageType = PageTypeHtml

Added: zope-zwiki/branches/upstream/current/pagetypes/html_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/pagetypes/html_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/pagetypes/html_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,19 @@
+from Products.ZWiki.testsupport import *
+#ZopeTestCase.installProduct('ZCatalog')
+ZopeTestCase.installProduct('ZWiki')
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    return suite
+
+class Tests(ZwikiTestCase):
+
+    def test_html_page_type(self):
+        self.p.edit(text='! PageOne PageTwo\n',type='html')
+        self.assertEquals(self.p.render(bare=1),' PageOne PageTwo\n\n\n')
+        self.p.edit(text='PageOne\n',type='html')
+        self.assertEquals(
+            self.p.render(bare=1),
+            'PageOne<a class="new visualNoPrint" href="http://nohost/test_folder_1_/wiki/TestPage/createform?page=PageOne" title="create this page">?</a>\n\n\n')
+

Added: zope-zwiki/branches/upstream/current/pagetypes/moin.py
===================================================================
--- zope-zwiki/branches/upstream/current/pagetypes/moin.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/pagetypes/moin.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,2050 @@
+# -*- coding: iso-8859-1 -*-
+"""
+A MoinMoin page type for Zwiki, supporting most of MoinMoin 1.3b2's markup.
+This can make migration between Moin and Zwiki easier.
+Thanks to Canonical for providing a bounty for this feature.
+
+Copyrights:
+
+MoinMoin Wiki Markup Parser and "text/html+css" Formatter,
+copyright: 2000-2004 by Jürgen Hermann <jh at web.de>
+license: GNU GPL, see COPYING for details.
+
+Modified by Simon Michael for Zwiki moin markup support.
+Copyright 2004-2005 Simon Michael for the Zwiki community 
+
+This is all in one file for convenience of the plugin handling code.  It
+is moin 1.3b2's parsers/wiki.py and formatter/text_html.py with wiki
+linking and troublesome bits (macros) hacked out, Moin prefix added to a
+few classes, plus the usual Zwiki page type class.
+"""
+
+import os, re, string
+from common import *
+from Products.ZWiki.I18n import _
+from Products.ZWiki.pagetypes import registerPageType
+
+class PageTypeMoin(PageTypeBase):
+    _id = 'moin'
+    _name = 'MoinMoin'
+    supportsMoin = yes
+    supportsWikiLinks = yes
+
+    def preRender(self, page, text=None):
+        t = text or (page.document()+'\n'+MIDSECTIONMARKER+\
+                     self.preRenderMessages(page))
+        t = page.applyWikiLinkLineEscapesIn(t)
+        t = self.format(t)
+        t = page.markLinksIn(t)
+        t = self.protectEmailAddresses(page,t)
+        return t
+
+    def render(self, page, REQUEST={}, RESPONSE=None, **kw):
+        t = page.preRendered()
+        t = page.renderMarkedLinksIn(t)
+        if page.hasFitTests(): t = page.runFitTestsIn(t)
+        if page.isIssue() and kw.get('show_issueproperties',1):
+            t = page.addIssueFormTo(t)
+        t = page.renderMidsectionIn(t,**kw)
+        t = page.addSkinTo(t,**kw)
+        return t
+
+    def format(self,t):
+        # moin assumes utf-8 everwhere, like zwiki (except where we can't,
+        # see moin_support)
+        return render_moin_markup(unicode(t,'utf-8')).encode('utf-8')
+
+
+######################################################################
+# modified moin 1.3b2 parsing/formatting code
+
+# character encoding issues
+#
+# - moin hard-codes utf-8 everywhere like zwiki, but we need the system's
+# actual configured encoding to encode string.uppercase etc. below 
+# (cf http://zwiki.org/963)
+#
+# - similar to Regexps.py don't rely on python 2.3's getpreferredencoding, 
+# which gives wrong answer (?)
+# and work around a python bug with some locales (http://zwiki.org/392).
+# 
+# - XXX problems remain with some locales, see http://zwiki.org/809
+
+import locale
+try:
+    encoding = locale.getlocale()[1] or 'utf-8'
+except ValueError:
+    encoding = 'utf-8'
+
+
+class MoinConfig:
+    pass
+
+class MoinRequest:
+    output = u''
+    form = None
+    getText = None
+    cfg = MoinConfig()
+    _page_headings = {}
+    def write(self, text): self.output += text
+    def __unicode__(self): return self.output
+    def getPragma(self,a,b): return b
+
+class MoinParser:
+    """
+        Object that turns Wiki markup into HTML.
+
+        All formatting commands can be parsed one line at a time, though
+        some state is carried over between lines.
+
+        Methods named like _*_repl() are responsible to handle the named regex
+        patterns defined in print_html().
+    """
+
+    # allow caching
+    caching = 1
+
+    # some common strings
+    PARENT_PREFIX = '' #wikiutil.PARENT_PREFIX
+    attachment_schemas = ["attachment", "inline", "drawing"]
+    punct_pattern = re.escape(u'''"\'}]|:,.)?!''')
+    #url_pattern = (u'http|https|ftp|nntp|news|mailto|telnet|wiki|file|' +
+    url_pattern = (u'http|https|ftp|nntp|news|mailto|telnet|file')
+            #u'|'.join(attachment_schemas) + 
+            #(config.url_schemas and u'|' + u'|'.join(config.url_schemas) or ''))
+
+    # some common rules
+    word_rule = ur'(?:(?<![%(l)s])|^)%(parent)s(?:%(subpages)s(?:[%(u)s][%(l)s]+){2,})+(?![%(u)s%(l)s]+)' % {
+        'u': unicode(string.uppercase,encoding),
+        'l': unicode(string.lowercase,encoding),
+        'subpages':'', #config.allow_subpages and (wikiutil.CHILD_PREFIX + '?') or '',
+        'parent':'', #config.allow_subpages and (ur'(?:%s)?' % re.escape(PARENT_PREFIX)) or '',
+    }
+    url_rule = ur'%(url_guard)s(%(url)s)\:([^\s\<%(punct)s]|([%(punct)s][^\s\<%(punct)s]))+' % {
+        'url_guard': u'(^|(?<!\w))',
+        'url': url_pattern,
+        'punct': punct_pattern,
+    }
+
+    ol_rule = ur"^\s+(?:[0-9]+|[aAiI])\.(?:#\d+)?\s"
+    dl_rule = ur"^\s+.*?::\s"
+
+    # the big, fat, ugly one ;)
+    formatting_rules = ur"""(?:(?P<emph_ibb>'''''(?=[^']+'''))
+(?P<emph_ibi>'''''(?=[^']+''))
+(?P<emph_ib_or_bi>'{5}(?=[^']))
+(?P<emph>'{2,3})
+(?P<u>__)
+(?P<sup>\^.*?\^)
+(?P<sub>,,[^,]{1,40},,)
+(?P<tt>\{\{\{.*?\}\}\})
+(?P<processor>(\{\{\{(#!.*|\s*$)))
+(?P<pre>(\{\{\{ ?|\}\}\}))
+(?P<small>(\~- ?|-\~))
+(?P<big>(\~\+ ?|\+\~))
+(?P<rule>-{4,})
+(?P<comment>^\#\#.*$)
+(?P<macro>\[\[(%%(macronames)s)(?:\(.*?\))?\]\]))
+(?P<ol>%(ol_rule)s)
+(?P<dl>%(dl_rule)s)
+(?P<li>^\s+\*?)
+(?P<tableZ>\|\| $)
+(?P<table>(?:\|\|)+(?:<[^>]*?>)?(?!\|? $))
+(?P<heading>^\s*(?P<hmarker>=+)\s.*\s(?P=hmarker) $)
+(?P<word>%(word_rule)s)
+(?P<url_bracket>\[((%(url)s)\:|#|\:)[^\s\]]+(\s[^\]]+)?\])
+(?P<url>%(url_rule)s)
+(?P<email>[-\w._+]+\@[\w-]+(\.[\w-]+)+)
+(?P<ent>[<>&])"""  % {
+        'url': url_pattern,
+        'punct': punct_pattern,
+        'ol_rule': ol_rule,
+        'dl_rule': dl_rule,
+        'url_rule': url_rule,
+        'word_rule': word_rule,
+        'smiley': u'|'.join(map(re.escape, []))} #config.smileys.keys()))}
+#(?P<smiley>(?<=\s)(%(smiley)s)(?=\s))
+#(?P<smileyA>^(%(smiley)s)(?=\s))
+#(?P<interwiki>[A-Z][a-zA-Z]+\:[^\s'\"\:\<\|]([^\s%(punct)s]|([%(punct)s][^\s%(punct)s]))+)
+
+    no_new_p_before = ["heading", "rule", "table", "tableZ", "tr", "td",
+                       "ul", "ol", "dl", "dt", "dd", "li"]
+
+    def __init__(self, raw, request, **kw):
+        self.raw = raw
+        self.request = request
+        self.form = request.form
+        self._ = request.getText
+        self.cfg = request.cfg
+
+        self.macro = None
+
+        self.is_em = 0
+        self.is_b = 0
+        self.is_u = 0
+        self.lineno = 0
+        self.in_li = 0
+        self.in_dd = 0
+        self.in_pre = 0
+        self.in_table = 0
+        self.is_big = False
+        self.is_small = False
+        self.inhibit_p = 0 # if set, do not auto-create a <p>aragraph
+        self.titles = request._page_headings
+
+        # holds the nesting level (in chars) of open lists
+        self.list_indents = []
+        self.list_types = []
+        
+        #self.formatting_rules = self.formatting_rules % {'macronames': u'|'.join(wikimacro.getNames(self.cfg))}
+
+    def _close_item(self, result):
+        #result.append("<!-- close item begin -->\n")
+        if self.in_table:
+            result.append(self.formatter.table(0))
+            self.in_table = 0
+        if self.in_li:
+            self.in_li = 0
+            if self.formatter.in_p:
+                result.append(self.formatter.paragraph(0))
+            result.append(self.formatter.listitem(0))
+        if self.in_dd:
+            self.in_dd = 0
+            if self.formatter.in_p:
+                result.append(self.formatter.paragraph(0))
+            result.append(self.formatter.definition_desc(0))
+        #result.append("<!-- close item end -->\n")
+
+
+    def interwiki(self, url_and_text, **kw):
+        # TODO: maybe support [wiki:Page http://wherever/image.png] ?
+        if len(url_and_text) == 1:
+            url = url_and_text[0]
+            text = None
+        else:
+            url, text = url_and_text
+
+        url = url[5:] # remove "wiki:"
+        if text is None:
+            tag, tail = wikiutil.split_wiki(url)
+            if tag:
+                text = tail
+            else:
+                text = url
+                url = ""
+        elif 0: #config.allow_subpages and url[0] == wikiutil.CHILD_PREFIX:
+            # fancy link to subpage [wiki:/SubPage text]
+            return self._word_repl(url, text)
+        elif 0: #Page(self.request, url).exists():
+            # fancy link to local page [wiki:LocalPage text]
+            return self._word_repl(url, text)
+
+        wikitag, wikiurl, wikitail, wikitag_bad = wikiutil.resolve_wiki(self.request, url)
+        href = wikiutil.join_wiki(wikiurl, wikitail)
+
+        # check for image URL, and possibly return IMG tag
+        if not kw.get('pretty_url', 0) and wikiutil.isPicture(wikitail):
+            return self.formatter.image(src=href)
+
+        # link to self?
+        if wikitag is None:
+            return self._word_repl(wikitail)
+              
+        return (self.formatter.interwikilink(1, wikitag, wikitail) + 
+                self.formatter.text(text) +
+                self.formatter.interwikilink(0))
+
+    def attachment(self, url_and_text, **kw):
+        """ This gets called on attachment URLs.
+        """
+        import urllib
+        _ = self._
+        if len(url_and_text) == 1:
+            url = url_and_text[0]
+            text = None
+        else:
+            url, text = url_and_text
+
+        inline = url[0] == 'i'
+        drawing = url[0] == 'd'
+        url = url.split(":", 1)[1]
+        url = urllib.unquote(url)
+        text = text or url
+
+        pagename = self.formatter.page.page_name
+        parts = url.split('/')
+        if len(parts) > 1:
+            # get attachment from other page
+            pagename = '/'.join(parts[:-1])
+            url = parts[-1]
+
+        import urllib
+        from MoinMoin.action import AttachFile
+        fname = wikiutil.taintfilename(url)
+        if drawing:
+            drawing = fname
+            fname = fname + ".png"
+            url = url + ".png"
+            # fallback for old gif drawings (1.1 -> 1.2)
+            fpath = os.path.join(AttachFile.getAttachDir(self.request, pagename), fname)
+            if not os.path.exists(fpath):
+                gfname = fname[:-4] + ".gif"
+                gurl = url[:-4] + ".gif"
+                gfpath = os.path.join(AttachFile.getAttachDir(self.request, pagename), gfname)
+                if os.path.exists(gfpath):
+                    fname, url, fpath = gfname, gurl, gfpath
+        else:
+            fpath = os.path.join(AttachFile.getAttachDir(self.request, pagename), fname)
+
+        # check whether attachment exists, possibly point to upload form
+        if not os.path.exists(fpath):
+            if drawing:
+                linktext = _('Create new drawing "%(filename)s"')
+            else:
+                linktext = _('Upload new attachment "%(filename)s"')
+            return wikiutil.link_tag(self.request,
+                '%s?action=AttachFile&amp;rename=%s%s' % (
+                    wikiutil.quoteWikinameURL(pagename),
+                    urllib.quote_plus(fname.encode(config.charset)),
+                    drawing and ('&amp;drawing=%s' % urllib.quote(drawing.encode(config.charset))) or ''),
+                linktext % {'filename': fname})
+
+        # check for image URL, and possibly return IMG tag
+        # (images are always inlined, just like for other URLs)
+        if not kw.get('pretty_url', 0) and wikiutil.isPicture(url):
+            if drawing:
+                # check for map file
+                mappath = os.path.join(AttachFile.getAttachDir(self.request, pagename), drawing + '.map')
+                edit_link = '%s?action=AttachFile&amp;rename=%s&amp;drawing=%s' % (wikiutil.quoteWikinameURL(pagename), urllib.quote_plus(fname.encode(config.charset)), urllib.quote(drawing.encode(config.charset)))
+                if os.path.exists(mappath):
+                    # we have a image map. inline it and add a map ref
+                    # to the img tag
+                    try:
+                        map = open(mappath,'r').read()
+                    except IOError:
+                        pass
+                    except OSError:
+                        pass
+                    else:
+                        mapid = 'ImageMapOf'+drawing
+                        # replace MAPNAME
+                        map = map.replace('%MAPNAME%', mapid)
+                        # add alt and title tags to areas
+                        map = re.sub('href\s*=\s*"((?!%TWIKIDRAW%).+?)"',r'href="\1" alt="\1" title="\1"',map)
+                        # add in edit links plus alt and title attributes
+                        map = map.replace('%TWIKIDRAW%"', edit_link + '" alt="' + _('Edit drawing %(filename)s') % {'filename': fname} + '" title="' + _('Edit drawing %(filename)s') % {'filename': fname} + '"')
+                        # unxml, because 4.01 concrete will not validate />
+                        map = map.replace('/>','>')
+                        return map + self.formatter.image(alt=drawing,
+                                src=AttachFile.getAttachUrl(pagename, url, self.request, addts=1), usemap='#'+mapid, html_class="drawing")
+                else:
+                    return wikiutil.link_tag(self.request,
+                        edit_link,
+                        self.formatter.image(alt=url,
+                            src=AttachFile.getAttachUrl(pagename, url, self.request, addts=1), html_class="drawing"),
+                        attrs='title="%s"' % (_('Edit drawing %(filename)s') % {'filename': fname}))
+            else:
+                return self.formatter.image(alt=url,
+                    src=AttachFile.getAttachUrl(pagename, url, self.request, addts=1))
+
+        # try to inline the attachment (parser know what they
+        # can handle)
+        base, ext = os.path.splitext(url)
+        if inline:
+            Parser = wikiutil.getParserForExtension(self.cfg, ext)
+            if Parser is not None:
+                colorizer = MoinParser(open(fpath, 'r').read(), self.request)
+                colorizer.format(self.formatter)
+
+        url = AttachFile.getAttachUrl(pagename, url, self.request)
+
+        if kw.get('pretty_url', 0) and wikiutil.isPicture(url):
+            return self.formatter.image(src=url)
+        else:
+            return (self.formatter.url(1, url) +
+                    self.formatter.text(text) +
+                    self.formatter.url(0))
+
+    def _u_repl(self, word):
+        """Handle underline."""
+        self.is_u = not self.is_u
+        return self.formatter.underline(self.is_u)
+
+    def _small_repl(self, word):
+        """Handle small."""
+        if word.strip() == '~-' and self.is_small: return word
+        if word.strip() == '-~' and not self.is_small: return word
+        self.is_small = not self.is_small
+        return self.formatter.small(self.is_small)
+
+    def _big_repl(self, word):
+        """Handle big."""
+        if word.strip() == '~+' and self.is_big: return word
+        if word.strip() == '+~' and not self.is_big: return word
+        self.is_big = not self.is_big
+        return self.formatter.big(self.is_big)
+
+    def _emph_repl(self, word):
+        """Handle emphasis, i.e. '' and '''."""
+        ##print "#", self.is_b, self.is_em, "#"
+        if len(word) == 3:
+            self.is_b = not self.is_b
+            if self.is_em and self.is_b: self.is_b = 2
+            return self.formatter.strong(self.is_b)
+        else:
+            self.is_em = not self.is_em
+            if self.is_em and self.is_b: self.is_em = 2
+            return self.formatter.emphasis(self.is_em)
+
+    def _emph_ibb_repl(self, word):
+        """Handle mixed emphasis, i.e. ''''' followed by '''."""
+        self.is_b = not self.is_b
+        self.is_em = not self.is_em
+        if self.is_em and self.is_b: self.is_b = 2
+        return self.formatter.emphasis(self.is_em) + self.formatter.strong(self.is_b)
+
+    def _emph_ibi_repl(self, word):
+        """Handle mixed emphasis, i.e. ''''' followed by ''."""
+        self.is_b = not self.is_b
+        self.is_em = not self.is_em
+        if self.is_em and self.is_b: self.is_em = 2
+        return self.formatter.strong(self.is_b) + self.formatter.emphasis(self.is_em)
+
+    def _emph_ib_or_bi_repl(self, word):
+        """Handle mixed emphasis, exactly five '''''."""
+        ##print "*", self.is_b, self.is_em, "*"
+        b_before_em = self.is_b > self.is_em > 0
+        self.is_b = not self.is_b
+        self.is_em = not self.is_em
+        if b_before_em:
+            return self.formatter.strong(self.is_b) + self.formatter.emphasis(self.is_em)
+        else:
+            return self.formatter.emphasis(self.is_em) + self.formatter.strong(self.is_b)
+
+
+    def _sup_repl(self, word):
+        """Handle superscript."""
+        return self.formatter.sup(1) + \
+            self.formatter.text(word[1:-1]) + \
+            self.formatter.sup(0)
+
+
+    def _sub_repl(self, word):
+        """Handle subscript."""
+        return self.formatter.sub(1) + \
+            self.formatter.text(word[2:-2]) + \
+            self.formatter.sub(0)
+
+
+    def _rule_repl(self, word):
+        """Handle sequences of dashes."""
+        self.inhibit_p = 1
+        result = self._undent()
+        if len(word) <= 4:
+            result = result + self.formatter.rule()
+        else:
+            result = result + self.formatter.rule(min(len(word), 10) - 2)
+        return result
+
+
+    def _word_repl(self, word, text=None):
+        """Handle WikiNames."""
+
+        # check for parent links
+        # !!! should use wikiutil.AbsPageName here, but setting `text`
+        # correctly prevents us from doing this for now
+        if 0: #config.allow_subpages and word.startswith(self.PARENT_PREFIX):
+            if not text: text = word
+            word = '/'.join(filter(None, self.formatter.page.page_name.split('/')[:-1] + [word[3:]]))
+
+        if not text:
+            # if a simple, self-referencing link, emit it as plain text
+            if word == self.formatter.page.page_name:
+                return self.formatter.text(word)
+            text = word
+        if 0: #config.allow_subpages and word.startswith(wikiutil.CHILD_PREFIX):
+            word = self.formatter.page.page_name + word
+        return (#self.formatter.pagelink(1, word) +
+                self.formatter.text(text))# +
+                #self.formatter.pagelink(0))
+
+    def _notword_repl(self, word):
+        """Handle !NotWikiNames."""
+        return self.formatter.text(word[1:])
+
+
+    def _interwiki_repl(self, word):
+        """Handle InterWiki links."""
+        return self.interwiki(["wiki:" + word])
+
+
+    def _url_repl(self, word):
+        """Handle literal URLs including inline images."""
+        scheme = word.split(":", 1)[0]
+
+        #if scheme == "wiki": return self.interwiki([word])
+        if scheme in self.attachment_schemas:
+            return self.attachment([word])
+
+        if wikiutil.isPicture(word):
+            return self.formatter.image(src=word)
+        else:
+            return (self.formatter.url(1, word, type='www') +
+                    self.formatter.text(word) +
+                    self.formatter.url(0))
+
+
+    def _wikiname_bracket_repl(self, word):
+        """Handle special-char wikinames."""
+        wikiname = word[2:-2]
+        if wikiname:
+            return self._word_repl(wikiname)
+        else:
+            return word
+
+
+    def _url_bracket_repl(self, word):
+        """Handle bracketed URLs."""
+
+        # Local extended link?
+        if word[1] == ':':
+            words = word[2:-1].split(':', 1)
+            if len(words) == 1: words = words * 2
+            return self._word_repl(words[0], words[1])
+
+        # Traditional split on space
+        words = word[1:-1].split(None, 1)
+        if len(words) == 1: words = words * 2
+
+        if words[0][0] == '#':
+            # anchor link
+            return (self.formatter.url(1, words[0]) +
+                    self.formatter.text(words[1]) +
+                    self.formatter.url(0))
+
+        scheme = words[0].split(":", 1)[0]
+        #if scheme == "wiki": return self.interwiki(words, pretty_url=1)
+        if scheme in self.attachment_schemas:
+            return self.attachment(words, pretty_url=1)
+
+        if wikiutil.isPicture(words[1]) and re.match(self.url_rule, words[1]):
+            return (self.formatter.url(1, words[0], 'external', unescaped=1) +
+                    self.formatter.image(title=words[0], alt=words[0], src=words[1]) +
+                    self.formatter.url(0))
+        else:
+            return (self.formatter.url(1, words[0], 'external',
+                                       type='www', unescaped=1) +
+                    self.formatter.text(words[1]) +
+                    self.formatter.url(0))
+
+
+    def _email_repl(self, word):
+        """Handle email addresses (without a leading mailto:)."""
+        return (self.formatter.url(1, "mailto:" + word, type='mailto') +
+                self.formatter.text(word) +
+                self.formatter.url(0))
+
+
+    def _ent_repl(self, word):
+        """Handle SGML entities."""
+        return self.formatter.text(word)
+        #return {'&': '&amp;',
+        #        '<': '&lt;',
+        #        '>': '&gt;'}[word]
+
+
+    def _ent_numeric_repl(self, word):
+        """Handle numeric SGML entities."""
+        return self.formatter.rawHTML(word)
+
+
+    def _li_repl(self, match):
+        """Handle bullet lists."""
+        result = []
+        indented_only = (match == (" " * len(match)))
+        if indented_only and self.in_li: return ''
+            
+        self._close_item(result)
+        #self.inhibit_p = 1
+        self.in_li = 1
+        css_class = ''
+        if self.line_was_empty and not self.first_list_item:
+            css_class = 'gap'
+        if indented_only:
+            result.append(self.formatter.listitem(1, css_class=css_class,
+                                             style="list-style-type:none"))
+        else:
+            result.append(self.formatter.listitem(1, css_class=css_class))
+        result.append(self.formatter.paragraph(1))
+        return ''.join(result)
+
+
+    def _ol_repl(self, match):
+        """Handle numbered lists."""
+        return self._li_repl(match)
+
+
+    def _dl_repl(self, match):
+        """Handle definition lists."""
+        result = []
+        self._close_item(result)
+        #self.inhibit_p = 1
+        self.in_dd = 1
+        result.extend([
+            self.formatter.definition_term(1),
+            self.formatter.text(match[:-3]),
+            self.formatter.definition_term(0),
+            self.formatter.definition_desc(1),
+            self.formatter.paragraph(1)
+        ])
+        return ''.join(result)
+
+
+    def _indent_level(self):
+        """Return current char-wise indent level."""
+        return len(self.list_indents) and self.list_indents[-1]
+
+
+    def _indent_to(self, new_level, list_type, numtype, numstart):
+        """Close and open lists."""
+        open = []   # don't make one out of these two statements!
+        close = []
+
+
+        if self._indent_level() != new_level and self.in_table:
+            close.append(self.formatter.table(0))
+            self.in_table = 0
+        #    #self._close_item(close)
+        #else:
+        #    if not self.line_was_empty:
+        #        self.inhibit_p = 1
+    
+        # Close lists while char-wise indent is greater than the current one
+        while ((self._indent_level() > new_level) or
+               ( new_level and
+                (self._indent_level() == new_level) and
+                (self.list_types[-1]) != list_type)):
+            self._close_item(close)
+            if self.list_types[-1] == 'ol':
+                tag = self.formatter.number_list(0)
+            elif self.list_types[-1] == 'dl':
+                tag = self.formatter.definition_list(0)
+            else:
+                tag = self.formatter.bullet_list(0)
+            close.append(tag)
+
+            del(self.list_indents[-1])
+            del(self.list_types[-1])
+            
+            #if new_level:
+            #    self.inhibit_p = 1
+            #else:
+            #    self.inhibit_p = 0
+
+            if self.list_types: # we are still in a list
+                if self.list_types[-1] == 'dl':
+                    self.in_dd = 1
+                else:
+                    self.in_li = 1
+                
+        # Open new list, if necessary
+        if self._indent_level() < new_level:
+                    
+            self.list_indents.append(new_level)
+            self.list_types.append(list_type)
+
+            if self.formatter.in_p:
+                close.append(self.formatter.paragraph(0))
+            
+            if list_type == 'ol':
+                tag = self.formatter.number_list(1, numtype, numstart)
+            elif list_type == 'dl':
+                tag = self.formatter.definition_list(1)
+            else:
+                tag = self.formatter.bullet_list(1)
+            open.append(tag)
+            
+            self.first_list_item = 1
+            self.inhibit_p = 1
+            self.in_li = 0
+            self.in_dd = 0
+        # If list level changes, close an open table
+        if self.in_table and (open or close):
+            close[0:0] = [self.formatter.table(0)]
+            self.in_table = 0
+
+        self.inhibit_p = bool(self.list_types)
+
+        return ''.join(close) + ''.join(open)
+
+
+    def _undent(self):
+        """Close all open lists."""
+        result = []
+        #result.append("<!-- _undent start -->\n")
+        self._close_item(result)
+        for type in self.list_types:
+            if type == 'ol':
+                result.append(self.formatter.number_list(0))
+            elif type == 'dl':
+                result.append(self.formatter.definition_list(0))
+            else:
+                result.append(self.formatter.bullet_list(0))
+        #result.append("<!-- _undent end -->\n")
+        self.list_indents = []
+        self.list_types = []
+        return ''.join(result)
+
+
+    def _tt_repl(self, word):
+        """Handle inline code."""
+        return self.formatter.code(1) + \
+            self.formatter.text(word[3:-3]) + \
+            self.formatter.code(0)
+
+
+    def _tt_bt_repl(self, word):
+        """Handle backticked inline code."""
+        if len(word) == 2: return ""
+        return self.formatter.code(1) + \
+            self.formatter.text(word[1:-1]) + \
+            self.formatter.code(0)
+
+
+    def _getTableAttrs(self, attrdef):
+        # skip "|" and initial "<"
+        while attrdef and attrdef[0] == "|":
+            attrdef = attrdef[1:]
+        if not attrdef or attrdef[0] != "<":
+            return {}, ''
+        attrdef = attrdef[1:]
+
+        # extension for special table markup
+        def table_extension(key, parser, attrs, wiki_parser=self):
+            _ = wiki_parser._
+            msg = ''
+            if key[0] in "0123456789":
+                token = parser.get_token()
+                if token != '%':
+                    wanted = '%'
+                    msg = _('Expected "%(wanted)s" after "%(key)s", got "%(token)s"') % {
+                        'wanted': wanted, 'key': key, 'token': token}
+                else:
+                    try:
+                        dummy = int(key)
+                    except ValueError:
+                        msg = _('Expected an integer "%(key)s" before "%(token)s"') % {
+                            'key': key, 'token': token}
+                    else:
+                        attrs['width'] = '"%s%%"' % key
+            elif key == '-':
+                arg = parser.get_token()
+                try:
+                    dummy = int(arg)
+                except ValueError:
+                    msg = _('Expected an integer "%(arg)s" after "%(key)s"') % {
+                        'arg': arg, 'key': key}
+                else:
+                    attrs['colspan'] = '"%s"' % arg
+            elif key == '|':
+                arg = parser.get_token()
+                try:
+                    dummy = int(arg)
+                except ValueError:
+                    msg = _('Expected an integer "%(arg)s" after "%(key)s"') % {
+                        'arg': arg, 'key': key}
+                else:
+                    attrs['rowspan'] = '"%s"' % arg
+            elif key == '(':
+                attrs['align'] = '"left"'
+            elif key == ':':
+                attrs['align'] = '"center"'
+            elif key == ')':
+                attrs['align'] = '"right"'
+            elif key == '^':
+                attrs['valign'] = '"top"'
+            elif key == 'v':
+                attrs['valign'] = '"bottom"'
+            elif key == '#':
+                arg = parser.get_token()
+                try:
+                    if len(arg) != 6: raise ValueError
+                    dummy = int(arg, 16)
+                except ValueError:
+                    msg = _('Expected a color value "%(arg)s" after "%(key)s"') % {
+                        'arg': arg, 'key': key}
+                else:
+                    attrs['bgcolor'] = '"#%s"' % arg
+            else:
+                msg = None
+            #print "key: %s\nattrs: %s" % (key, str(attrs))
+            return msg
+
+        # scan attributes
+        attr, msg = wikiutil.parseAttributes(self.request, attrdef, '>', table_extension)
+        if msg: msg = '<strong class="highlight">%s</strong>' % msg
+        #print attr
+        return attr, msg
+
+    def _tableZ_repl(self, word):
+        """Handle table row end."""
+        if self.in_table:
+            result = ''
+            if self.formatter.in_p and not self.in_li:
+                result = self.formatter.paragraph(0)
+            result += self.formatter.table_cell(0) + self.formatter.table_row(0)
+            return result
+        else:
+            return word
+
+    def _table_repl(self, word):
+        """Handle table cell separator."""
+        if self.in_table:
+            # check for attributes
+            attrs, attrerr = self._getTableAttrs(word)
+
+            # start the table row?
+            if self.table_rowstart:
+                self.table_rowstart = 0
+                leader = self.formatter.table_row(1, attrs)
+            else:
+                if self.formatter.in_p and not self.in_li:
+                    leader = self.formatter.paragraph(0)
+                else: leader = ''
+                leader += self.formatter.table_cell(0)
+
+            # check for adjacent cell markers
+            if word.count("|") > 2:
+                if not attrs.has_key('align'):
+                    attrs['align'] = '"center"'
+                if not attrs.has_key('colspan'):
+                    attrs['colspan'] = '"%d"' % (word.count("|")/2)
+
+            # return the complete cell markup           
+            return leader + self.formatter.table_cell(1, attrs) + attrerr
+        else:
+            return word
+
+
+    def _heading_repl(self, word):
+        """Handle section headings."""
+        import sha
+
+        self.inhibit_p = 1
+        icons = ''
+
+        h = word.strip()
+        level = 1
+        while h[level:level+1] == '=':
+            level = level+1
+        depth = min(5,level)
+
+        # this is needed for Included pages
+        # TODO but it might still result in unpredictable results
+        # when included the same page multiple times
+        title_text = h[level:-level].strip()
+        pntt = self.formatter.page.page_name + title_text
+        self.titles.setdefault(pntt, 0)
+        self.titles[pntt] += 1
+
+        unique_id = ''
+        if self.titles[pntt] > 1:
+            unique_id = '-%d' % self.titles[pntt]
+
+        result = self.formatter.heading(1, depth, id="head-"+sha.new(pntt.encode('utf-8')).hexdigest()+unique_id) #config.charset
+                                     
+        return (result + self.formatter.text(title_text) +
+                self.formatter.heading(0, depth))
+    
+    def _processor_repl(self, word):
+        """Handle processed code displays."""
+        if word[:3] == '{{{': word = word[3:]
+
+        self.processor = None
+        self.processor_name = None
+        self.processor_is_parser = 0
+        s_word = word.strip()
+        if s_word == '#!':
+            # empty bang paths lead to a normal code display
+            # can be used to escape real, non-empty bang paths
+            word = ''
+            self.in_pre = 3
+            return  self.formatter.preformatted(1)
+        elif 0: #s_word[:2] == '#!':
+            # first try to find a processor for this (will go away in 1.4)
+            processor_name = s_word[2:].split()[0]
+            self.processor = wikiutil.importPlugin("processor", 
+                                                   processor_name, 
+                                                   "process", 
+                                                   self.request.cfg.data_dir)
+            # now look for a parser with that name
+            if self.processor is None:
+                self.processor = wikiutil.importPlugin("parser",
+                                                       processor_name,
+                                                       "Parser",
+                                                       self.request.cfg.data_dir)
+                if self.processor:
+                    self.processor_is_parser = 1
+
+        if self.processor:
+            self.processor_name = processor_name
+            self.in_pre = 2
+            self.colorize_lines = [word]
+            return ''
+        elif s_word:
+            self.in_pre = 3
+            return self.formatter.preformatted(1) + \
+                   self.formatter.text(s_word + ' (-)')
+        else:
+            self.in_pre = 1
+            return ''
+
+    def _pre_repl(self, word):
+        """Handle code displays."""
+        word = word.strip()
+        if word == '{{{' and not self.in_pre:
+            self.in_pre = 3
+            self.inhibit_p = 1
+            return self.formatter.preformatted(self.in_pre)
+        elif word == '}}}' and self.in_pre:
+            self.in_pre = 0
+            self.inhibit_p = 0
+            return self.formatter.preformatted(self.in_pre)
+        return word
+
+
+    def _smiley_repl(self, word):
+        """Handle smileys."""
+        return self.formatter.smiley(word)
+
+    _smileyA_repl = _smiley_repl
+
+
+    def _comment_repl(self, word):
+        return ''
+
+
+    def _macro_repl(self, word):
+        """Handle macros ([[macroname]])."""
+        macro_name = word[2:-2]
+        #self.inhibit_p = 1 # fixes UserPreferences, but makes new trouble!
+
+        # check for arguments
+        args = None
+        if macro_name.count("("):
+            macro_name, args = macro_name.split('(', 1)
+            args = args[:-1]
+
+        # create macro instance
+        if self.macro is None:
+            self.macro = wikimacro.Macro(self)
+
+        # call the macro
+        return self.formatter.macro(self.macro, macro_name, args)
+
+    def scan(self, scan_re, line):
+        """ scans the line for wiki syntax and replaces the
+            found regular expressions
+        """
+        result = []
+        lastpos = 0
+        match = scan_re.search(line)
+        while match and lastpos < len(line):
+            # add the match we found
+            if lastpos<match.start():
+                if not (self.inhibit_p or self.in_pre or
+                        self.formatter.in_p):
+                    result.append(self.formatter.paragraph(1))
+                result.append(self.formatter.text(line[lastpos:match.start()]))
+            result.append(self.replace(match))
+
+            # search for the next one
+            lastpos = match.end() + (match.end() == lastpos)
+            match = scan_re.search(line, lastpos)
+
+
+        if not (self.inhibit_p or self.in_pre or
+                self.formatter.in_p) and lastpos<len(line):
+            result.append(self.formatter.paragraph(1))
+        result.append(self.formatter.text(line[lastpos:]))
+        return u''.join(result)
+
+    def replace(self, match):
+        #hit = filter(lambda g: g[1], match.groupdict().items())
+        for type, hit in match.groupdict().items():
+            if hit is not None and type != "hmarker":
+                ##print "###", cgi.escape(`type`), cgi.escape(`hit`), "###"
+                if self.in_pre and type not in ['pre', 'ent']:
+                    return hit
+                else:
+                    p = ''
+                    if not (self.inhibit_p or self.formatter.in_p
+                            or self.in_pre
+                            or (type in self.no_new_p_before)):
+                        p = self.formatter.paragraph(1)
+                    return p + getattr(self, '_' + type + '_repl')(hit) 
+        else:
+            import pprint
+            raise Exception("Can't handle match " + `match`
+                + "\n" + pprint.pformat(match.groupdict())
+                + "\n" + pprint.pformat(match.groups()) )
+
+        return ""
+
+
+    def format(self, formatter):
+        """ For each line, scan through looking for magic
+            strings, outputting verbatim any intervening text.
+        """
+        self.formatter = formatter
+        #self.hilite_re = self.formatter.page.hilite_re
+
+        # prepare regex patterns
+        rules = self.formatting_rules.replace('\n', '|')
+        if 1: #self.cfg.allow_extended_names:
+            rules = rules + ur'|(?P<wikiname_bracket>\[".*?"\])'
+        if 1: #self.cfg.bang_meta:
+            rules = ur'(?P<notword>!%(word_rule)s)|%(rules)s' % {
+                'word_rule': self.word_rule,
+                'rules': rules,
+            }
+        if 1: #self.cfg.backtick_meta:
+           rules = rules + ur'|(?P<tt_bt>`.*?`)'
+        if 1: #self.cfg.allow_numeric_entities:
+            rules = ur'(?P<ent_numeric>&#\d{1,5};)|' + rules
+
+        scan_re = re.compile(rules, re.UNICODE)
+        number_re = re.compile(self.ol_rule, re.UNICODE)
+        term_re = re.compile(self.dl_rule, re.UNICODE)
+        indent_re = re.compile("^\s*", re.UNICODE)
+        eol_re = re.compile(r'\r?\n', re.UNICODE)
+
+        # get text and replace TABs
+        rawtext = self.raw.expandtabs()
+
+        # go through the lines
+        self.lineno = 0
+        self.lines = eol_re.split(rawtext)
+        self.line_is_empty = 0
+
+        for line in self.lines:
+            self.lineno = self.lineno + 1
+            self.table_rowstart = 1
+            self.line_was_empty = self.line_is_empty
+            self.line_is_empty = 0
+            self.first_list_item = 0
+            self.inhibit_p = 0
+
+            if self.in_pre:
+                # still looking for processing instructions
+                if self.in_pre == 1:
+                    self.processor = None
+                    self.processor_is_parser = 0
+                    processor_name = ''
+                    if 0: #(line.strip()[:2] == "#!"):
+                        processor_name = line.strip()[2:].split()[0]
+                        self.processor = wikiutil.importPlugin("processor",
+                                                               processor_name,
+                                                               "process",
+                                                               self.request.cfg.data_dir)
+                        # now look for a parser with that name
+                        if self.processor is None:
+                            self.processor = wikiutil.importPlugin("parser",
+                                                                   processor_name,
+                                                                   "Parser",
+                                                                   self.request.cfg.data_dir)
+                            if self.processor:
+                                self.processor_is_parser = 1
+                    if self.processor:
+                        self.in_pre = 2
+                        self.colorize_lines = [line]
+                        self.processor_name = processor_name
+                        continue
+                    else:
+                        self.request.write(self.formatter.preformatted(1))
+                        self.in_pre = 3
+                if self.in_pre == 2:
+                    # processing mode
+                    endpos = line.find("}}}")
+                    if endpos == -1:
+                        self.colorize_lines.append(line)
+                        continue
+                    if line[:endpos]:
+                        self.colorize_lines.append(line[:endpos])
+                    self.request.write(
+                        self.formatter.processor(self.processor_name, self.colorize_lines, self.processor_is_parser))
+                    del self.colorize_lines
+                    self.in_pre = 0
+                    self.processor = None
+
+                    # send rest of line through regex machinery
+                    line = line[endpos+3:]                    
+            else:
+                line = line + " " # we don't have \n as whitespace any more
+                # paragraph break on empty lines
+                if not line.strip():
+                    #self.request.write("<!-- empty line start -->\n")
+                    if self.in_table:
+                        self.request.write(self.formatter.table(0))
+                        self.in_table = 0
+                    if (self.formatter.in_p and not self.list_types):
+                        self.request.write(self.formatter.paragraph(0))
+                    self.line_is_empty = 1
+                    #self.request.write("<!-- empty line end -->\n")
+                    continue
+
+                # check indent level
+                indent = indent_re.match(line)
+                indlen = len(indent.group(0))
+                indtype = "ul"
+                numtype = None
+                numstart = None
+                if indlen:
+                    match = number_re.match(line)
+                    if match:
+                        numtype, numstart = match.group(0).strip().split('.')
+                        numtype = numtype[0]
+
+                        if numstart and numstart[0] == "#":
+                            numstart = int(numstart[1:])
+                        else:
+                            numstart = None
+
+                        indtype = "ol"
+                    else:
+                        match = term_re.match(line)
+                        if match:
+                            indtype = "dl"
+
+                # output proper indentation tags
+                #self.request.write("<!-- inhibit_p==%d -->\n" % self.inhibit_p)
+                #self.request.write("<!-- #%d calling _indent_to -->\n" % self.lineno)
+                self.request.write(self._indent_to(indlen, indtype, numtype, numstart))
+                #self.request.write("<!-- #%d after calling _indent_to -->\n" % self.lineno)
+                #self.request.write("<!-- inhibit_p==%d -->\n" % self.inhibit_p)
+
+                # start or end table mode
+                if (not self.in_table and line[indlen:indlen+2] == "||"
+                    and line[-3:] == "|| " and len(line)>=5+indlen):
+                    if self.list_types and not self.in_li:
+                        self.request.write(self.formatter.listitem
+                                           (1, style="list-style-type:none"))
+                        self.request.write(self.formatter.paragraph(1))
+                        self.in_li = 1
+                    if self.formatter.in_p and not self.in_li:
+                        self.request.write(self.formatter.paragraph(0))
+                    attrs, attrerr = self._getTableAttrs(line[indlen+2:])
+                    self.request.write(self.formatter.table(1, attrs) + attrerr)
+                    self.in_table = True # self.lineno
+                elif self.in_table and not(line[:2]=="##" or # intra-table comments should not break a table 
+                    line[indlen:indlen+2] == "||" and line[-3:] == "|| " and
+                    len(line)>=5+indlen):
+                    self.request.write(self.formatter.table(0))
+                    self.in_table = 0
+            # convert line from wiki markup to HTML and print it
+            formatted_line = self.scan(scan_re, line)
+            
+            #self.request.write("<!-- %s\n     start -->\n" % line)
+            self.request.write(formatted_line)
+            #self.request.write("<!-- end -->\n")
+
+            if self.in_pre:
+                self.request.write(self.formatter.linebreak())
+
+        # close code displays, paragraphs, tables and open lists
+        if self.is_b: self.request.write(self.formatter.strong(0))
+        if self.is_em: self.request.write(self.formatter.emphasis(0))
+        if self.is_u: self.request.write(self.formatter.underline(0))
+        
+        self.request.write(self._undent())
+        if self.in_pre: self.request.write(self.formatter.preformatted(0))
+        if self.formatter.in_p: self.request.write(self.formatter.paragraph(0))
+        if self.in_table: self.request.write(self.formatter.table(0))
+
+
+
+class MoinFormatterBase:
+    """ This defines the output interface used all over the rest of the code.
+
+        Note that no other means should be used to generate _content_ output,
+        while navigational elements (HTML page header/footer) and the like
+        can be printed directly without violating output abstraction.
+    """
+
+    hardspace = ' '
+
+    def __init__(self, request, **kw):
+        self.request = request
+        self._ = request.getText
+
+        self._store_pagelinks = kw.get('store_pagelinks', 0)
+        self._terse = kw.get('terse', 0)
+        self.pagelinks = []
+        self.in_p = 0
+        self.in_pre = 0
+        self._highlight_re = None
+        self._base_depth = 0
+
+    def set_highlight_re(self, hi_re=None):
+        if type(hi_re) in [types.StringType, types.UnicodeType]:
+            try:
+                self._highlight_re = re.compile(hi_re, re.U + re.IGNORECASE)
+            except re.error:
+                hi_re = re.escape(hi_re)
+                self._highlight_re = re.compile(hi_re, re.U + re.IGNORECASE)
+        else:
+            self._highlight_re = hi_re
+
+    def lang(self, on, lang_name):
+        return ""
+
+    def setPage(self, page):
+        self.page = page
+
+    def sysmsg(self, on, **kw):
+        """ Emit a system message (embed it into the page).
+
+            Normally used to indicate disabled options, or invalid markup.
+        """
+        return ""
+
+    # Document Level #####################################################
+    
+    def startDocument(self, pagename):
+        return ""
+
+    def endDocument(self):
+        return ""
+
+    def startContent(self, content_id="content", **kwargs):
+        return ""
+
+    def endContent(self):
+        return ""
+
+    def startContent(self, cid, extra=''):
+        return ""
+
+    def endContent(self):
+        return ""
+
+    # Links ##############################################################
+    
+    def pagelink(self, on, pagename='', **kw):
+        if kw.get('generated', 0) or not on: return
+        if self._store_pagelinks and pagename not in self.pagelinks:
+            self.pagelinks.append(pagename)
+
+    def interwikilink(self, on, interwiki='', pagename='', **kw):
+        return ''
+            
+
+    def url(self, on, url=None, css=None, **kw):
+        raise NotImplementedError
+
+    def anchordef(self, name):
+        return ""
+
+    def anchorlink(self, on, name='', id=None):
+        return ""
+
+    def image(self, **kw):
+        """ Take HTML <IMG> tag attributes in `attr`.
+
+            Attribute names have to be lowercase!
+        """
+        attrstr = u''
+        for attr, value in kw.items():
+            if attr=='html_class':
+                attr='class'
+            attrstr = attrstr + u' %s="%s"' % (attr, wikiutil.escape(value))
+        return u'<img%s>' % attrstr
+
+    # Text and Text Attributes ########################################### 
+    
+    def text(self, text):
+        if not self._highlight_re:
+            return self._text(text)
+            
+        result = []
+        lastpos = 0
+        match = self._highlight_re.search(text)
+        while match and lastpos < len(text):
+            # add the match we found
+            result.append(self._text(text[lastpos:match.start()]))
+            result.append(self.highlight(1))
+            result.append(self._text(match.group(0)))
+            result.append(self.highlight(0))
+
+            # search for the next one
+            lastpos = match.end() + (match.end() == lastpos)
+            match = self._highlight_re.search(text, lastpos)
+
+        result.append(self._text(text[lastpos:]))
+        return ''.join(result)
+
+    def _text(self, text):
+        raise NotImplementedError
+
+    def strong(self, on):
+        raise NotImplementedError
+
+    def emphasis(self, on):
+        raise NotImplementedError
+
+    def underline(self, on):
+        raise NotImplementedError
+
+    def highlight(self, on):
+        raise NotImplementedError
+
+    def sup(self, on):
+        raise NotImplementedError
+
+    def sub(self, on):
+        raise NotImplementedError
+
+    def code(self, on):
+        raise NotImplementedError
+
+    def preformatted(self, on):
+        self.in_pre = on != 0
+
+    def small(self, on):
+        raise NotImplementedError
+
+    def big(self, on):
+        raise NotImplementedError
+
+    # special markup for syntax highlighting #############################
+
+    def code_area(self, on, code_id, **kwargs):
+        raise NotImplementedError
+
+    def code_line(self, on):
+        raise NotImplementedError
+
+    def code_token(self, on, tok_type):
+        raise NotImplementedError
+
+    # special markup for syntax highlighting #############################
+
+    def code_area(self, on, code_id, **kwargs):
+        raise NotImplementedError
+
+    def code_line(self, on):
+        raise NotImplementedError
+
+    def code_token(self, tok_text, tok_type):
+        raise NotImplementedError
+
+    # Paragraphs, Lines, Rules ###########################################
+
+    def linebreak(self, preformatted=1):
+        raise NotImplementedError
+
+    def paragraph(self, on):
+        self.in_p = on != 0
+
+    def rule(self, size=0):
+        raise NotImplementedError
+
+    def icon(self, type):
+        return type
+
+    # Lists ##############################################################
+
+    def number_list(self, on, type=None, start=None):
+        raise NotImplementedError
+
+    def bullet_list(self, on):
+        raise NotImplementedError
+
+    def listitem(self, on, **kw):
+        raise NotImplementedError
+
+    def definition_list(self, on):
+        raise NotImplementedError
+
+    def definition_term(self, on, compact=0):
+        raise NotImplementedError
+
+    def definition_desc(self, on):
+        raise NotImplementedError
+
+    def heading(self, on, depth, **kw):
+        raise NotImplementedError
+
+    # Tables #############################################################
+    
+    def table(self, on, attrs={}):
+        raise NotImplementedError
+
+    def table_row(self, on, attrs={}):
+        raise NotImplementedError
+
+    def table_cell(self, on, attrs={}):
+        raise NotImplementedError
+
+    # Dynamic stuff / Plugins ############################################
+    
+    def macro(self, macro_obj, name, args):
+        # call the macro
+        return macro_obj.execute(name, args)    
+
+    def _split_hashbang(self, line):
+        if line[:2]=='#!':
+            name, args = line[2:].split(' ', 1)
+            return args
+        return None
+
+    def processor(self, processor_name, lines, is_parser = 0):
+        """ processor_name MUST be valid!
+            writes out the result instead of returning it!
+        """
+        if not is_parser:
+            processor = wikiutil.importPlugin("processor",
+                                              processor_name, "process",
+                                              self.request.cfg.data_dir)
+            processor(self.request, self, lines)
+        else:
+            parser = wikiutil.importPlugin("parser",
+                                           processor_name, "Parser",
+                                           self.request.cfg.data_dir)
+            args = self._split_hashbang(lines[0])
+            if args is not None:
+                lines = lines[1:]
+            p = parser('\n'.join(lines), self.request, format_args = args)
+            p.format(self)
+            del p
+        return ''
+
+    def dynamic_content(self, parser, callback, arg_list = [], arg_dict = {},
+                        returns_content = 1):
+        content = parser[callback](*arg_list, **arg_dict)
+        if returns_content:
+            return content
+        else:
+            return ''
+
+    # Other ##############################################################
+    
+    def rawHTML(self, markup):
+        """ This allows emitting pre-formatted HTML markup, and should be
+            used wisely (i.e. very seldom).
+
+            Using this event while generating content results in unwanted
+            effects, like loss of markup or insertion of CDATA sections
+            when output goes to XML formats.
+        """
+        return markup
+
+    def escapedText(self, on):
+        """ This allows emitting text as-is, anything special will
+            be escaped (at least in HTML, some text output format
+            would possibly do nothing here)
+        """
+        return ""
+
+
+
+class MoinFormatter(MoinFormatterBase):
+    """
+        Send HTML data.
+    """
+
+    hardspace = '&nbsp;'
+
+    def __init__(self, request, **kw):
+        apply(MoinFormatterBase.__init__, (self, request), kw)
+        self._in_li = 0
+        self._in_code = 0
+        self._in_code_area = 0
+        self._in_code_line = 0
+        self._code_area_num = 0
+        self._code_area_state = ['', 0, -1, -1, 0]
+        self._show_section_numbers = None
+        self._content_ids = []
+        self.pagelink_preclosed = False
+        self._is_included = kw.get('is_included',False)
+        self.request = request
+        self.cfg = request.cfg
+
+        if not hasattr(request, '_fmt_hd_counters'):
+            request._fmt_hd_counters = []
+
+    def _langAttr(self):
+        result = ''
+        #lang = self.request.current_lang
+        #if lang != self.cfg.default_lang:
+        #    result = ' lang="%s" dir="%s"' % (lang, i18n.getDirection(lang))
+
+        return result
+
+    def startContent(self, content_id='content', **kwargs):
+        if content_id!='content':
+            aid = 'top_%s' % (content_id,)
+        else:
+            aid = 'top'
+        self._content_ids.append(content_id)
+        return '<div id="%s"%s>\n%s\n' % (content_id, self._langAttr(),
+                                          self.anchordef(aid))
+
+    def endContent(self):
+        try:
+            cid = self._content_ids.pop()
+        except:
+            cid = 'content'
+        if cid!='content':
+            aid = 'bottom_%s' % (cid,)
+        else:
+            aid = 'bottom'
+        return '%s\n</div>\n' % self.anchordef(aid)
+
+    def lang(self, on, lang_name):
+        """ Insert text with specific lang and direction.
+        
+            Enclose within span tag if lang_name is different from
+            the current lang    
+        """
+        
+        if lang_name != self.request.current_lang:
+            dir = i18n.getDirection(lang_name)
+            return ['<span lang="%(lang_name)s" dir="%(dir)s">' % {
+                'lang_name': lang_name, 'dir': dir},
+                    '</span>'] [not on]
+        
+        return ''            
+                
+    def sysmsg(self, on, **kw):
+        return ['\n<div class="message">', '</div>\n'][not on]
+
+    
+    # Links ##############################################################
+    
+    def pagelink(self, on, pagename='', **kw):
+        """ Link to a page.
+
+            See wikiutil.link_tag() for possible keyword parameters.
+        """
+        apply(MoinFormatterBase.pagelink, (self, on, pagename), kw)
+        page = Page(self.request, pagename, formatter=self);
+        
+        if self.request.user.show_nonexist_qm and on and not page.exists():
+            self.pagelink_preclosed = True
+            return (page.link_to(self.request, on=1, **kw) +
+                    self.text("?") +
+                    page.link_to(self.request, on=0, **kw))
+        elif not on and self.pagelink_preclosed:
+            self.pagelink_preclosed = False
+            return ""
+        else:
+            return page.link_to(self.request, on=on, **kw)
+
+    def interwikilink(self, on, interwiki='', pagename='', **kw):
+        if not on: return '</a>'
+        
+        wikitag, wikiurl, wikitail, wikitag_bad = wikiutil.resolve_wiki(self.request, '%s:%s' % (interwiki, pagename))
+        wikiurl = wikiutil.mapURL(self.request, wikiurl)
+        href = wikiutil.join_wiki(wikiurl, wikitail)
+
+        # return InterWiki hyperlink
+        if wikitag_bad:
+            html_class = 'badinterwiki'
+        else:
+            html_class = 'interwiki'
+
+        icon = ''
+        if self.request.user.show_fancy_links:
+            icon = self.request.theme.make_icon('interwiki', {'wikitag': wikitag}) 
+        return (self.url(1, href, title=wikitag, unescaped=1,
+                        pretty_url=kw.get('pretty_url', 0), css = html_class) +
+                icon)
+
+    def url(self, on, url=None, css=None, **kw):
+        """
+            Keyword params:
+                title - title attribute
+                ... some more (!!! TODO) 
+        """
+        #url = wikiutil.mapURL(self.request, url)
+        pretty = kw.get('pretty_url', 0)
+        title = kw.get('title', None)
+
+        #if not pretty and wikiutil.isPicture(url):
+        #    # XXX
+        #    return '<img src="%s" alt="%s">' % (url,url)
+
+        # create link
+        if not on:
+            return '</a>'
+        str = '<a'
+        if css: str = '%s class="%s"' % (str, css)
+        if title: str = '%s title="%s"' % (str, title)
+        str = '%s href="%s">' % (str, wikiutil.escape(url, 1))
+
+        type = kw.get('type', '')
+
+        if type=='www':
+            str = '%s%s ' % (str, self.icon("www"))
+        elif type=='mailto':
+            str = '%s%s ' % (str, self.icon('mailto'))
+
+        return str
+
+    def anchordef(self, id):
+        return '<a id="%s"></a>' % (id, )
+
+    def anchorlink(self, on, name='', id = None):
+        extra = ''
+        if id:
+            extra = ' id="%s"' % id
+        return ['<a href="#%s"%s>' % (name, extra), '</a>'][not on]
+
+    # Text and Text Attributes ###########################################
+    
+    def _text(self, text):
+        if self._in_code:
+            return wikiutil.escape(text).replace(' ', self.hardspace)
+        return wikiutil.escape(text)
+
+    def strong(self, on):
+        return ['<strong>', '</strong>'][not on]
+
+    def emphasis(self, on):
+        return ['<em>', '</em>'][not on]
+
+    def underline(self, on):
+        return ['<u>', '</u>'][not on]
+
+    def highlight(self, on):
+        return ['<strong class="highlight">', '</strong>'][not on]
+
+    def sup(self, on):
+        return ['<sup>', '</sup>'][not on]
+
+    def sub(self, on):
+        return ['<sub>', '</sub>'][not on]
+
+    def code(self, on):
+        self._in_code = on
+        return ['<tt>', '</tt>'][not on]
+
+    def preformatted(self, on):
+        MoinFormatterBase.preformatted(self, on)
+        return ['<pre>', '</pre>'][not on]
+
+    def small(self, on):
+        return ['<small>', '</small>'][not on]
+                                                                                
+    def big(self, on):
+        return ['<big>', '</big>'][not on]
+
+    def code_area(self, on, code_id, code_type='code', show=0, start=-1, step=-1):
+        res = ''
+        ci = self.request.makeUniqueID('CA-%s_%03d' % (code_id, self._code_area_num))
+        if on:
+            self._in_code_area = 1
+            self._in_code_line = 0
+            self._code_area_state = [ci, show, start, step, start]
+            if self._code_area_num == 0 and self._code_area_state[1] >= 0:
+                res += """<script language='JavaScript'>
+function isnumbered(obj){
+  return obj.childNodes.length && obj.firstChild.childNodes.length && obj.firstChild.firstChild.className == 'LineNumber';
+}
+function nformat(num,chrs,add){
+  var nlen = Math.max(0,chrs-(''+num).length), res = '';
+  while (nlen>0) { res += ' '; nlen-- }
+  return res+num+add;
+}
+function addnumber(did,nstart,nstep){
+  var c = document.getElementById(did), l = c.firstChild, n = 1;
+  if (!isnumbered(c))
+    if (typeof nstart == 'undefined') nstart = 1;
+    if (typeof nstep  == 'undefined') nstep = 1;
+    n = nstart;
+    while (l != null){
+      if (l.tagName == 'SPAN'){
+        var s = document.createElement('SPAN');
+        s.className = 'LineNumber'
+        s.appendChild(document.createTextNode(nformat(n,4,' ')));
+        n += nstep;
+        if (l.childNodes.length)
+          l.insertBefore(s, l.firstChild)
+        else
+          l.appendChild(s)
+      }
+      l = l.nextSibling;
+    }
+  return false;
+}
+function remnumber(did){
+  var c = document.getElementById(did), l = c.firstChild;
+  if (isnumbered(c))
+    while (l != null){
+      if (l.tagName == 'SPAN' && l.firstChild.className == 'LineNumber') l.removeChild(l.firstChild);
+      l = l.nextSibling;
+    }
+  return false;
+}
+function togglenumber(did,nstart,nstep){
+  var c = document.getElementById(did);
+  if (isnumbered(c)) {
+    remnumber(did);
+  } else {
+    addnumber(did,nstart,nstep);
+  }
+  return false;
+}
+</script>
+"""
+            res += '<div class="codearea">'
+            if self._code_area_state[1] >= 0:
+                res += '<script>document.write(\'<a href="#" onClick="return togglenumber(\\\'%s\\\',%d,%d);" class="codenumbers">1,2,3</a>\')</script>' % (self._code_area_state[0], self._code_area_state[2], self._code_area_state[3])
+            res += '<pre id="%s" class="codearea">' % (self._code_area_state[0], )
+        else:
+            res = ''
+            if self._in_code_line:
+                res += self.code_line(0)
+            res += '</pre>'
+            if self._code_area_state[1] >= 0:
+                res += '<script>document.write(\'<a href="#" onClick="return togglenumber(\\\'%s\\\',%d,%d);" class="codenumbers">1,2,3</a>\')</script>' % (self._code_area_state[0], self._code_area_state[2], self._code_area_state[3])
+            res += '</div>'
+            self._in_code_area = 0
+            self._code_area_num += 1
+        return res
+
+    def code_line(self, on):
+        res = ''
+        if not on or (on and self._in_code_line):
+            res += '</span>\n'
+        if on:
+            res += '<span class="line">'
+            if self._code_area_state[1] > 0:
+                res += '<span class="LineNumber">%4d </span>' % (self._code_area_state[4], )
+                self._code_area_state[4] += self._code_area_state[3]
+        self._in_code_line = on != 0
+        return res
+
+    def code_token(self, on, tok_type):
+        return ['<span class="%s">' % tok_type, '</span>'][not on]
+
+    # Paragraphs, Lines, Rules ###########################################
+    
+    def linebreak(self, preformatted=1):
+        if self._in_code_area:
+            preformatted = 1
+        return ['\n', '<br>\n'][not preformatted]
+
+    def paragraph(self, on):
+        #if self._terse:
+        #    return ''
+        MoinFormatterBase.paragraph(self, on)
+        if self._in_li:
+            self._in_li = self._in_li + 1
+        result = ['<p%s>' % self._langAttr(), '\n</p>'][not on]
+        return '%s\n' % result
+    
+    def rule(self, size=0):
+        if size:
+            return '<hr size="%d">\n' % (size,)
+        else:
+            return '<hr>\n'
+
+    def icon(self, type):
+        return '' #self.request.theme.make_icon(type)
+
+    def smiley(self, text):
+        w, h, b, img = config.smileys[text.strip()]
+        href = img
+        if not href.startswith('/'):
+            href = self.request.theme.img_url(img)
+        return self.image(src=href, alt=text, width=str(w), height=str(h))
+
+    # Lists ##############################################################
+
+    def number_list(self, on, type=None, start=None):
+        if on:
+            attrs = ''
+            if type: attrs += ' type="%s"' % (type,)
+            if start is not None: attrs += ' start="%d"' % (start,)
+            result = '<ol%s%s>' % (self._langAttr(), attrs)
+        else:    
+            result = '</ol>\n'
+        return '%s\n' % result
+    
+    def bullet_list(self, on):
+        result = ['<ul%s>' % self._langAttr(), '</ul>\n'][not on]
+        return '%s\n' % result
+
+    def listitem(self, on, **kw):
+        """ List item inherit its lang from the list. """
+        self._in_li = on != 0
+        if on:
+            css_class = kw.get('css_class', None)
+            attrs = ''
+            if css_class: attrs += ' class="%s"' % (css_class,)
+            style = kw.get('style', None)
+            if style:  attrs += ' style="%s"' % style
+            result = '<li%s>' % (attrs,)
+        else:
+            result = '</li>'
+        return '%s\n' % result
+
+    def definition_list(self, on):
+        result = ['<dl>', '</dl>'][not on]
+        return '%s\n' % result
+
+    def definition_term(self, on):
+        return ['<dt%s>' % (self._langAttr()), '</dt>'][not on]
+
+    def definition_desc(self, on):
+        return ['<dd%s>\n' % self._langAttr(), '</dd>\n'][not on]
+
+    def heading(self, on, depth, id = None, **kw):
+        # remember depth of first heading, and adapt counting depth accordingly
+        if not self._base_depth:
+            self._base_depth = depth
+
+        count_depth = max(depth - (self._base_depth - 1), 1)
+
+        # check numbering, possibly changing the default
+        if self._show_section_numbers is None:
+            self._show_section_numbers = 0 #self.cfg.show_section_numbers
+            numbering = self.request.getPragma('section-numbers', '').lower()
+            if numbering in ['0', 'off']:
+                self._show_section_numbers = 0
+            elif numbering in ['1', 'on']:
+                self._show_section_numbers = 1
+            elif numbering in ['2', '3', '4', '5', '6']:
+                # explicit base level for section number display
+                self._show_section_numbers = int(numbering)
+
+        heading_depth = depth + 1
+
+        # closing tag
+        if not on:
+            return '</h%d>' % heading_depth
+
+
+        # create section number
+        number = ''
+        if self._show_section_numbers:
+            # count headings on all levels
+            self.request._fmt_hd_counters = self.request._fmt_hd_counters[:count_depth]
+            while len(self.request._fmt_hd_counters) < count_depth:
+                self.request._fmt_hd_counters.append(0)
+            self.request._fmt_hd_counters[-1] = self.request._fmt_hd_counters[-1] + 1
+            number = '.'.join(map(str, self.request._fmt_hd_counters[self._show_section_numbers-1:]))
+            if number: number += ". "
+
+        id_text = ''
+        if id:
+          id_text = ' id="%s"' % id
+
+        result = '<h%d%s>' % (heading_depth, id_text)
+        if 0: #self.request.user.show_topbottom:
+            # TODO change top/bottom refs to content-specific top/bottom refs?
+            result = ("%s%s%s%s%s%s%s%s" %
+                      (result,
+                       kw.get('icons',''),
+                       self.url(1, "#bottom", unescaped=1),
+                       self.icon('bottom'),
+                       self.url(0),
+                       self.url(1, "#top", unescaped=1),
+                       self.icon('top'),
+                       self.url(0)))
+        return "%s%s%s" % (result, kw.get('icons',''), number)
+
+    
+    # Tables #############################################################
+
+    # TODO: find better solution for bgcolor, align, valign (deprecated in html4)
+    # do not remove current code before making working compliant code
+
+    _allowed_table_attrs = {
+        'table': ['class', 'width', 'bgcolor'],
+        'row': ['class', 'width', 'align', 'valign', 'bgcolor'],
+        '': ['colspan', 'rowspan', 'class', 'width', 'align', 'valign', 'bgcolor'],
+    }
+
+    def _checkTableAttr(self, attrs, prefix):
+        if not attrs: return ''
+
+        result = ''
+        for key, val in attrs.items():
+            if prefix and key[:len(prefix)] != prefix: continue
+            key = key[len(prefix):]
+            if key not in self._allowed_table_attrs[prefix]: continue
+            result = '%s %s=%s' % (result, key, val)
+        return result
+
+    def table(self, on, attrs={}):
+        if on:
+            # Enclose table inside a div to get correct alignment
+            # when using language macros
+            attrs = attrs and attrs.copy() or {}
+            result = '\n<div%(lang)s>\n<table%(tableAttr)s>' % {
+                'lang': self._langAttr(),
+                'tableAttr': self._checkTableAttr(attrs, 'table')
+            }
+        else:
+            result = '</table>\n</div>'
+        return '%s\n' % result
+    
+    def table_row(self, on, attrs={}):
+        if on:
+            result = '<tr%s>' % self._checkTableAttr(attrs, 'row')
+        else:
+            result = '</tr>'
+        return '%s\n' % result
+
+    def table_cell(self, on, attrs={}):
+        # ensure table cells have a class so we can style them separate
+        # from skin layout tables
+        if not attrs.get('class',''): attrs['class'] = 'content'
+        if on:
+            result = '<td%s>' % self._checkTableAttr(attrs, '')
+        else:
+            result = '</td>'
+        return '%s\n' % result
+
+    def escapedText(self, text):
+        return wikiutil.escape(text)
+
+
+def escape(s, quote=0):
+    """ Escape possible html tags
+    
+    Replace special characters '&', '<' and '>' by SGML entities.
+    (taken from cgi.escape so we don't have to include that, even if we
+    don't use cgi at all)
+
+    FIXME: should return string or unicode?
+    
+    @param s: string to escape
+    @param quote: bool, should transform '\"' to '&quot;'
+    @rtype: string
+    @return: escaped version of string
+    """
+    if not isinstance(s, (str, unicode)):
+        s = str(s)
+
+    # Must first replace &
+    s = s.replace("&", "&amp;")
+
+    # Then other...
+    s = s.replace("<", "&lt;")
+    s = s.replace(">", "&gt;")
+    if quote:
+        s = s.replace('"', "&quot;")
+    return s
+    
+def parseAttributes(request, attrstring, endtoken=None, extension=None):
+    """
+    Parse a list of attributes and return a dict plus a possible
+    error message.
+    If extension is passed, it has to be a callable that returns
+    None when it was not interested into the token, '' when all was OK
+    and it did eat the token, and any other string to return an error
+    message.
+    
+    @param request: the request object
+    @param attrstring: string containing the attributes to be parsed
+    @param endtoken: token terminating parsing
+    @param extension: extension function -
+                      gets called with the current token, the parser and the dict
+    @rtype: dict, msg
+    @return: a dict plus a possible error message
+    """
+    import shlex, StringIO
+
+    _ = request.getText
+
+    parser = shlex.shlex(StringIO.StringIO(attrstring))
+    parser.commenters = ''
+    msg = None
+    attrs = {}
+
+    while not msg:
+        try:
+            key = parser.get_token()
+        except ValueError, err:
+            msg = str(err)
+            break
+        if not key: break
+        if endtoken and key == endtoken: break
+
+        # call extension function with the current token, the parser, and the dict
+        if extension:
+            msg = extension(key, parser, attrs)
+            if msg == '': continue
+            if msg: break
+
+        try:
+            eq = parser.get_token()
+        except ValueError, err:
+            msg = str(err)
+            break
+        if eq != "=":
+            msg = _('Expected "=" to follow "%(token)s"') % {'token': key}
+            break
+
+        try:
+            val = parser.get_token()
+        except ValueError, err:
+            msg = str(err)
+            break
+        if not val:
+            msg = _('Expected a value for key "%(token)s"') % {'token': key}
+            break
+
+        key = escape(key) # make sure nobody cheats
+
+        # safely escape and quote value
+        if val[0] in ["'", '"']:
+            val = escape(val)
+        else:
+            val = '"%s"' % escape(val, 1)
+
+        attrs[key.lower()] = val
+
+    return attrs, msg or ''
+
+def isPicture(url):
+    """
+    Is this a picture's url?
+    
+    @param url: the url in question
+    @rtype: bool
+    @return: true if url points to a picture
+    """
+    extpos = url.rfind(".")
+    return extpos > 0 and url[extpos:].lower() in ['.gif', '.jpg', '.jpeg', '.png']
+
+
+
+class MoinWikiUtil: pass
+wikiutil = MoinWikiUtil()
+wikiutil.escape = escape
+wikiutil.parseAttributes = parseAttributes
+wikiutil.isPicture = isPicture
+
+class MoinPage:
+    page_name = ''
+
+def render_moin_markup(text):
+    req = MoinRequest()
+    formatter = MoinFormatter(req)
+    formatter.setPage(MoinPage())
+    MoinParser(text,req).format(formatter)
+    return unicode(req)
+
+#print render_moin_markup("'''strong'''")
+
+######################################################################
+
+registerPageType(PageTypeMoin)
+
+# backwards compatibility - need this here for old zodb objects
+ZwikiMoinPageType = PageTypeMoin

Added: zope-zwiki/branches/upstream/current/pagetypes/moin_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/pagetypes/moin_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/pagetypes/moin_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,18 @@
+from Products.ZWiki.testsupport import *
+#ZopeTestCase.installProduct('ZCatalog')
+ZopeTestCase.installProduct('ZWiki')
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    return suite
+
+class Tests(ZwikiTestCase):
+
+    def test_moin_page_type(self):
+        self.p.edit(text='! PageOne PageTwo\n',type='moin')
+        self.assertEquals(
+            self.p.render(bare=1),
+            '<ul>\n<li style="list-style-type:none">\n<p>\nPageOne<a class="new visualNoPrint" href="http://nohost/test_folder_1_/wiki/TestPage/createform?page=PageOne" title="create this page">?</a> PageTwo<a class="new visualNoPrint" href="http://nohost/test_folder_1_/wiki/TestPage/createform?page=PageTwo" title="create this page">?</a> \n</p>\n</li>\n</ul>\n\n<p>\n\n \n</p>\n'
+            )
+

Added: zope-zwiki/branches/upstream/current/pagetypes/plaintext.py
===================================================================
--- zope-zwiki/branches/upstream/current/pagetypes/plaintext.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/pagetypes/plaintext.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,28 @@
+from common import *
+from Products.ZWiki.I18n import _
+from Products.ZWiki.pagetypes import registerPageType
+
+class PageTypePlaintext(PageTypeBase):
+    _id = 'plaintext'
+    _name = 'Plain text'
+
+    def format(self,t):
+        return "<pre>\n%s\n</pre>\n" % html_quote(t)
+
+    def preRender(self, page, text=None):
+        t = text or page.read()
+        t = self.format(t)
+        if not text: t += '\n'+MIDSECTIONMARKER
+        t = self.protectEmailAddresses(page,t)
+        return t
+
+    def render(self, page, REQUEST={}, RESPONSE=None, **kw):
+        t = page.preRendered()
+        t = page.renderMidsectionIn(t,**kw)
+        t = page.addSkinTo(t,**kw)
+        return t
+
+registerPageType(PageTypePlaintext)
+
+# backwards compatibility - need this here for old zodb objects
+ZwikiPlaintextPageType = PageTypePlaintext

Added: zope-zwiki/branches/upstream/current/pagetypes/plaintext_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/pagetypes/plaintext_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/pagetypes/plaintext_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,18 @@
+from Products.ZWiki.testsupport import *
+#ZopeTestCase.installProduct('ZCatalog')
+ZopeTestCase.installProduct('ZWiki')
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    return suite
+
+class Tests(ZwikiTestCase):
+
+    def test_PageTypePlaintext(self):
+        self.p.folder().allowed_page_types = ['plaintext']
+        self.p.edit(text='! PageOne PageTwo\n',type='plaintext')
+        self.assertEquals(self.p.render(bare=1),
+                          '<pre>\n! PageOne PageTwo\n\n</pre>\n\n\n')
+        del self.p.folder().allowed_page_types
+

Added: zope-zwiki/branches/upstream/current/pagetypes/rst.py
===================================================================
--- zope-zwiki/branches/upstream/current/pagetypes/rst.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/pagetypes/rst.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,170 @@
+from docutils.utils import new_document
+from docutils.frontend import OptionParser
+from docutils.parsers.rst import Parser
+from docutils.nodes import section
+
+from common import *
+from Products.ZWiki.I18n import _
+from Products.ZWiki.pagetypes import registerPageType
+
+# RST verbosity (MORE <- 0 debug, 1 info, 2 warning, 3 error, 4 severe -> LESS) :
+RST_REPORT_LEVEL = 4
+# top-level RST heading will render as this HTML heading:
+RST_INITIAL_HEADER_LEVEL = 2
+
+try:
+    import reStructuredText # import this one first
+except ImportError:
+    reStructuredText = None
+    BLATHER('could not import reStructuredText, will not be available')
+
+class PageTypeRst(PageTypeBase):
+    """
+    See also method docstrings in PageTypeBase.
+    """
+    _id = 'rst'
+    _name = 'reStructured Text'
+    supportsRst = yes
+    supportsDtml = yes
+    supportsWikiLinks = yes
+
+    def format(self, t):
+        if reStructuredText:
+            return reStructuredText.HTML(
+                t,
+                report_level=RST_REPORT_LEVEL,
+                initial_header_level=RST_INITIAL_HEADER_LEVEL-1
+                )
+        else:
+            return "<pre>Error: could not import reStructuredText</pre>\n"+t
+
+    def preRender(self, page, text=None):
+        t = text or (page.document()+'\n'+MIDSECTIONMARKER+ \
+                     self.preRenderMessages(page))
+        t = page.applyWikiLinkLineEscapesIn(t)
+        t = self.format(t)
+        t = page.markLinksIn(t,urls=0)
+        t = self.protectEmailAddresses(page,t)
+        return t
+
+    def render(self, page, REQUEST={}, RESPONSE=None, **kw):
+        if page.dtmlAllowed():
+            t = page.evaluatePreRenderedAsDtml(page,REQUEST,RESPONSE,**kw)
+        else:
+            t = page.preRendered()
+        t = page.renderMarkedLinksIn(t)
+        if page.hasFitTests(): t = page.runFitTestsIn(t)
+        if page.isIssue() and kw.get('show_issueproperties',1):
+            t = page.addIssueFormTo(t)
+        t = page.renderMidsectionIn(t,**kw)
+        t = page.addSkinTo(t,**kw)
+        return t
+
+    def makeCommentHeading(self, page,
+                           subject, username, time, 
+                           message_id=None,in_reply_to=None):
+        """
+        Generate restructured text markup for a comment heading in a RST page.
+
+        Our traditional comment layout - body immediately following
+        heading with no blank line between - is possible in RST only if we
+        had the comment body to play with, or by the solution used here:
+        setting the class of the heading and first paragraph and using CSS
+        to remove the margins.
+
+        XXX NB this doesn't support complete styling as subsequent
+        paragraphs don't have the class.  Things need to change so that
+        comments are rendered from a template and can be fully customized
+        using HTML+CSS, not the text markup rules.
+        """
+        heading = '\n\n.. class:: commentheading\n\n'
+        heading += '**%s** --' % (subject or '...')
+        if username: heading = heading + '%s, ' % (username)
+        heading += time
+        heading += ' `%s <%s?subject=%s%s#bottom>`_' % (
+            _("reply"),
+            page.pageUrl(),
+            quote(subject or ''),
+            ((message_id and '&in_reply_to='+quote(message_id))
+             or '')
+            )
+        heading += '\n\n.. class:: commentbody\n\n'
+        return heading
+
+    def discussionSeparator(self,page):
+        return ''
+
+    def inlineImage(self, page, id, path):
+        return '\n\n.. image:: %s\n' % path
+   
+    def linkFile(self, page, id, path):
+        return '\n\n!`%s`__\n\n__ %s\n' % (id, path)
+
+    # split and merge.. these are trickier than they seemed at first
+    
+    def split(self, page):
+        """
+        Move this page's top-level sections to sub-pages.
+
+        Calls docutils to parse the text properly.
+        Do we need to adjust heading styles ?
+        """
+        d = new_document(
+            page.pageName(),
+            OptionParser(components=(Parser,)).get_default_values())
+        Parser().parse(page.text(), d)
+        sections = [s for s in d.traverse() if isinstance(s,section)]
+        # assume title is first element and body is the rest
+        # create a sub-page for each section
+        for s in sections:
+            page.create(
+                page=s[0].astext(),
+                text=s.child_text_separator.join([p.astext() for p in s[1:]]))
+        # leave just the preamble on the parent page
+        page.edit(
+            text=d.child_text_separator.join(
+                [p.astext() for p in d[:d.first_child_matching_class(section)]]))
+        
+        if getattr(page,'REQUEST',None):
+            page.REQUEST.RESPONSE.redirect(page.pageUrl())
+
+    # XXX unfinished
+    def merge(self, page):
+        """
+        Merge sub-pages as sections of this page.
+
+        This merges all offspring, not just immediate children.
+        """
+        #get a rst parse tree of the current page
+        d = new_document(
+            page.pageName(),
+            OptionParser(components=(Parser,)).get_default_values())
+        Parser().parse(page.text(), d)
+        #walk the offspring, adding as elements to the tree and deleting
+        def walk(p):
+            d2 = new_document(
+                p.pageName(),
+                OptionParser(components=(Parser,)).get_default_values())
+            Parser().parse(p.text(), d2)
+            d += d2.traverse()
+            for c in page.childrenNesting():
+                c = p.pageWithName(c)
+                walk(c)
+                c.delete()
+        walk(page)
+        #convert the tree back to source text and update this page
+        page.edit(text=d.astext())
+
+        #or: walk the offspring, adding as text to this page with
+        #appropriate headings, and deleting
+        #need to adjust headings ?
+        #for p in page.offspringNesting():
+        #    pass
+
+        if getattr(page,'REQUEST',None):
+            page.REQUEST.RESPONSE.redirect(page.pageUrl())
+
+registerPageType(PageTypeRst)
+
+# backwards compatibility - need this here for old zodb objects
+ZwikiRstPageType = PageTypeRst

Added: zope-zwiki/branches/upstream/current/pagetypes/rst_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/pagetypes/rst_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/pagetypes/rst_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,35 @@
+from Products.ZWiki.testsupport import *
+#ZopeTestCase.installProduct('ZCatalog')
+ZopeTestCase.installProduct('ZWiki')
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    return suite
+
+class Tests(ZwikiTestCase):
+
+    def test_PageTypeRst(self):
+        self.p.edit(text='! PageOne PageTwo\n',type='rst')
+        self.assertEquals(
+            self.p.render(bare=1),
+            '<blockquote>\nPageOne PageTwo</blockquote>\n<p>\n</p>\n')
+
+    def test_dtml_in_rst(self):
+        p = self.p
+        
+        # disabled by default ?
+        p.edit(text='<dtml-var "1+1">',type='rst')
+        self.assert_(p.hasDynamicContent())
+        self.assert_(not p.dtmlAllowed())
+        self.assertEquals(
+            p.render(bare=1),
+            '<p>&lt;dtml-var &quot;1+1&quot;&gt;\n\n</p>\n')
+
+        # can be enabled ?
+        p.allow_dtml = 1
+        self.assert_(p.dtmlAllowed())
+        # XXX need both of these right here, why ?
+        p.clearCache(); p.cook()
+        self.assertEquals(p.render(bare=1), '2')
+

Added: zope-zwiki/branches/upstream/current/pagetypes/stx.py
===================================================================
--- zope-zwiki/branches/upstream/current/pagetypes/stx.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/pagetypes/stx.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,400 @@
+from common import *
+from Products.ZWiki.I18n import _
+from Products.ZWiki.pagetypes import registerPageType
+
+from Globals import MessageDialog
+import StructuredText
+from StructuredText.DocumentWithImages import DocumentWithImages
+try: from StructuredText.DocumentClass import StructuredTextTable
+except ImportError: pass #older zope, won't need it
+
+class PageTypeStx(PageTypeBaseHtml):
+    _id = 'stx'
+    _name = 'Structured Text'
+    supportsStx = yes
+    supportsWikiLinks = yes
+    supportsHtml = yes
+    supportsDtml = yes
+
+    def format(self,t):
+        """
+        Render some Structured Text as HTML, and apply some fixups.
+        """
+        t = str(t)        
+        if ZOPEVERSION < (2,4):
+            # final single-line paragraph becomes a heading if there are
+            # trailing blank lines - strip them
+            t = re.sub(r'(?m)\n[\n\s]*$', r'\n', t)
+        # an initial single word plus period becomes a numeric bullet -
+        # prepend a temporary marker to prevent
+        # XXX use locale/wikichars from Regexps.py instead of A-z
+        # XXX not working ?
+        t = re.sub(r'(?m)^([ \t]*)([A-z]\w*\.)',
+                      r'\1<!--NOSTX-->\2',
+                      t)
+        # :: quoting fails if there is whitespace after the :: - remove it
+        t = re.sub(r'(?m)::[ \t]+$', r'::', t)
+        # suppress stx footnote handling so we can do it our way later
+        t = re.sub(footnoteexpr,r'<a name="ref\1">![\1]</a>',t)
+        t = re.sub(r'(?m)\[',r'[<!--NOSTX-->',t)
+        # let STX loose on it.. 
+        try:
+            if ZOPEVERSION < (2,4):
+                t = str(StructuredText.HTML(t,level=2))
+            else:
+                # with a few more tweaks for STX NG
+                # XXX slow!!
+                t = StructuredText.HTMLWithImages(
+                    ZwikiDocumentWithImages(StructuredText.Basic(t)),
+                    level=2)
+        except:
+            #BLATHER('Structured Text rendering failed on page %s: %s' \
+            #     % (page.id(),formattedTraceback()))
+            BLATHER('Structured Text rendering failed: %s' \
+                 % (formattedTraceback()))
+            return '<pre>Structured Text rendering failed:\n%s</pre>' \
+                   % (formattedTraceback())
+        # clean up
+        t = re.sub(r'(<|&lt;)!--NOSTX--(>|&gt;)', r'', t)
+        # strip html & body added by some zope versions
+        t = re.sub(
+            r'(?sm)^<html.*<body.*?>\n(.*)</body>\n</html>\n',r'\1',t)
+        return t
+
+    def preRender(self, page, text=None):
+        """
+        Do as much up-front rendering work as possible and save it.
+        
+        For the STX page type, this means: format mbox-style messages,
+        apply text formatting, format any purple numbers, and identify
+        wiki links.
+        
+        This normally works on page's source, but can be also invoked on
+        arbitrary text.
+        """
+        t = text or (page.document()+'\n\n'+MIDSECTIONMARKER+ \
+                     self.preRenderMessages(page))
+        t = page.applyWikiLinkLineEscapesIn(t)
+        t = self.format(t)
+        t = page.markLinksIn(t)
+        t = self.protectEmailAddresses(page,t)
+        return t
+
+    def render(self, page, REQUEST={}, RESPONSE=None, **kw):
+        """
+        In the final render stage, done each at page view, we evaluate
+        DTML (if allowed), render the wiki links, execute any fit test
+        tables, add an issue properties form if this is an issue page,
+        add a subtopics listing if enabled, and add the wiki page skin.
+        """
+        if page.dtmlAllowed():
+            t = page.evaluatePreRenderedAsDtml(page,REQUEST,RESPONSE,**kw)
+        else:
+            t = page.preRendered()
+        t = page.renderMarkedLinksIn(t)
+        if page.hasFitTests(): t = page.runFitTestsIn(t)
+        if page.isIssue() and kw.get('show_issueproperties',1):
+            t = page.addIssueFormTo(t)
+        t = page.renderMidsectionIn(t,**kw)
+        t = page.addSkinTo(t,**kw)
+        return t
+
+
+# structured text customizations
+class ZwikiDocumentWithImages(DocumentWithImages):
+
+    # 1. leave dtml alone (ignore '' within SGML tags)
+    def doc_sgml(self,s,expr=re.compile(dtmlorsgmlexpr).search):
+        r = expr(s)
+        if r:
+            start,end = r.span()
+            text = s[start:end]
+            return (StructuredText.DocumentClass.StructuredTextSGML(text),
+                    start,
+                    end)
+    # we need SGML/DTML expressions to be first priority
+    # doesn't look like ZopeIssue:432 will change
+    # so we must hard-code STX element types and priorities here..
+    # should mimic STXNG behaviour as closely as possible here
+    text_types = [
+        'doc_sgml',    
+        'doc_literal',
+        'doc_img',
+        'doc_inner_link',
+        'doc_named_link',
+        'doc_href1',
+        'doc_href2',
+        'doc_strong',
+        'doc_emphasize',
+        'doc_underline',
+        'doc_sgml',
+        'doc_xref',
+        ]
+
+    # 2. allow + at table corners; makes emacs picture-mode editing easier
+    # also, catch STX table errors; invalid tables can break STX
+    def doc_table(self, paragraph,
+                  expr = re.compile(r'\s*[+|][-+]+[+|]').match):
+        try:
+            text    = paragraph.getColorizableTexts()[0]
+            m       = expr(text)
+
+            subs = paragraph.getSubparagraphs()
+
+            if not (m):
+                return None
+            rows = []
+
+            spans   = []
+            ROWS    = []
+            COLS    = []
+            indexes = []
+            ignore  = []
+
+            TDdivider   = re.compile(r'[-+]+').match
+            THdivider   = re.compile(r'[=+]+').match
+            col         = re.compile(r'\|').search
+            innertable  = re.compile(r'(?![-=])[+|]([-+]+|[=+]+)[+|](?![-=])').search
+
+            text = strip(text)
+            rows = split(text,'\n')
+            foo  = ""
+
+            for row in range(len(rows)):
+                rows[row] = strip(rows[row])
+
+            # have indexes store if a row is a divider
+            # or a cell part
+            for index in range(len(rows)):
+                tmpstr = rows[index][1:len(rows[index])-1]
+                if TDdivider(tmpstr):
+                    indexes.append("TDdivider")
+                elif THdivider(tmpstr):
+                    indexes.append("THdivider")
+                else:
+                    indexes.append("cell")
+
+            for index in range(len(indexes)):
+                if indexes[index] is "TDdivider" or indexes[index] is "THdivider":
+                    ignore = [] # reset ignore
+                    #continue    # skip dividers
+
+                tmp     = strip(rows[index])    # clean the row up
+                tmp     = tmp[1:len(tmp)-1]     # remove leading + trailing |
+                offset  = 0
+
+                # find the start and end of inner
+                # tables. ignore everything between
+                if innertable(tmp):
+                    tmpstr = strip(tmp)
+                    while innertable(tmpstr):
+                        start,end   = innertable(tmpstr).span()
+                        if not (start,end-1) in ignore:
+                            ignore.append((start,end-1))
+                        tmpstr = " " + tmpstr[end:]
+
+                # find the location of column dividers
+                # NOTE: |'s in inner tables do not count
+                #   as column dividers
+                if col(tmp):
+                    while col(tmp):
+                        bar         = 1   # true if start is not in ignore
+                        start,end   = col(tmp).span()
+
+                        if not start+offset in spans:
+                            for s,e in ignore:
+                                if start+offset >= s or start+offset <= e:
+                                    bar = None
+                                    break
+                            if bar:   # start is clean
+                                spans.append(start+offset)
+                        if not bar:
+                            foo = foo + tmp[:end]
+                            tmp = tmp[end:]
+                            offset = offset + end
+                        else:
+                            COLS.append((foo + tmp[0:start],start+offset))
+                            foo = ""
+                            tmp = " " + tmp[end:]
+                            offset = offset + start
+                if not offset+len(tmp) in spans:
+                    spans.append(offset+len(tmp))
+                COLS.append((foo + tmp,offset+len(tmp)))
+                foo = ""
+                ROWS.append(COLS)
+                COLS = []
+
+            spans.sort()
+            ROWS = ROWS[1:len(ROWS)]
+
+            # find each column span
+            cols    = []
+            tmp     = []
+
+            for row in ROWS:
+                for c in row:
+                    tmp.append(c[1])
+                cols.append(tmp)
+                tmp = []
+
+            cur = 1
+            tmp = []
+            C   = []
+            for col in cols:
+                for span in spans:
+                    if not span in col:
+                        cur = cur + 1
+                    else:
+                        tmp.append(cur)
+                        cur = 1
+                C.append(tmp)
+                tmp = []
+
+            for index in range(len(C)):
+                for i in range(len(C[index])):
+                    ROWS[index][i] = (ROWS[index][i][0],C[index][i])
+            rows = ROWS
+
+            # label things as either TableData or
+            # Table header
+            TD  = []
+            TH  = []
+            all = []
+            for index in range(len(indexes)):
+                if indexes[index] is "TDdivider":
+                    TD.append(index)
+                    all.append(index)
+                if indexes[index] is "THdivider":
+                    TH.append(index)
+                    all.append(index)
+            TD = TD[1:]
+            dividers = all[1:]
+            #print "TD  => ", TD
+            #print "TH  => ", TH
+            #print "all => ", all, "\n"
+
+            for div in dividers:
+                if div in TD:
+                    index = all.index(div)
+                    for rowindex in range(all[index-1],all[index]):                    
+                        for i in range(len(rows[rowindex])):
+                            rows[rowindex][i] = (rows[rowindex][i][0],
+                                                 rows[rowindex][i][1],
+                                                 "td")
+                else:
+                    index = all.index(div)
+                    for rowindex in range(all[index-1],all[index]):
+                        for i in range(len(rows[rowindex])):
+                            rows[rowindex][i] = (rows[rowindex][i][0],
+                                                 rows[rowindex][i][1],
+                                                 "th")
+
+            # now munge the multi-line cells together
+            # as paragraphs
+            ROWS    = []
+            COLS    = []
+            for row in rows:
+                for index in range(len(row)):
+                    if not COLS:
+                        COLS = range(len(row))
+                        for i in range(len(COLS)):
+                            COLS[i] = ["",1,""]
+                    if TDdivider(row[index][0]) or THdivider(row[index][0]):
+                        ROWS.append(COLS)
+                        COLS = []
+                    else:
+                        COLS[index][0] = COLS[index][0] + (row[index][0]) + "\n"
+                        COLS[index][1] = row[index][1]
+                        COLS[index][2] = row[index][2]
+
+            # now that each cell has been munged together,
+            # determine the cell's alignment.
+            # Default is to center. Also determine the cell's
+            # vertical alignment, top, middle, bottom. Default is
+            # to middle
+            rows = []
+            cols = []
+            for row in ROWS:
+                for index in range(len(row)):
+                    topindent       = 0
+                    bottomindent    = 0
+                    leftindent      = 0
+                    rightindent     = 0
+                    left            = []
+                    right           = []                                    
+                    text            = row[index][0]
+                    text            = split(text,'\n')
+                    text            = text[:len(text)-1]
+                    align           = ""
+                    valign          = ""
+                    for t in text:
+                        t = strip(t)
+                        if not t:
+                            topindent = topindent + 1
+                        else:
+                            break
+                    text.reverse()
+                    for t in text:
+                        t = strip(t)
+                        if not t:
+                            bottomindent = bottomindent + 1
+                        else:
+                            break
+                    text.reverse()
+                    tmp   = join(text[topindent:len(text)-bottomindent],"\n")
+                    pars  = re.compile("\n\s*\n").split(tmp)
+                    for par in pars:
+                        if index > 0:
+                            par = par[1:]
+                        par = split(par, ' ')
+                        for p in par:
+                            if not p:
+                                leftindent = leftindent+1
+                            else:
+                                break
+                        left.append(leftindent)
+                        leftindent = 0
+                        par.reverse()
+                        for p in par:
+                            if not p:
+                                rightindent = rightindent + 1
+                            else:
+                                break
+                        right.append(rightindent)
+                        rightindent = 0
+                    left.sort()
+                    right.sort()
+
+                    if topindent == bottomindent:
+                        valign="middle"
+                    elif topindent < 1:
+                        valign="top"
+                    elif bottomindent < 1:
+                        valign="bottom"
+                    else:
+                        valign="middle"
+
+                    if left[0] < 1:
+                        align = "left"
+                    elif right[0] < 1:
+                        align = "right"
+                    elif left[0] > 1 and right[0] > 1:
+                        align="center"
+                    else:
+                        align="left"
+
+                    cols.append((row[index][0],row[index][1],align,valign,row[index][2]))
+                rows.append(cols)
+                cols = []
+            return StructuredTextTable(rows,text,subs,indent=paragraph.indent)
+
+        # XXX bad, but we just don't want to hear about STX table breakage
+        except:
+            return StructuredTextTable([],'',subs,indent=paragraph.indent)
+            
+ZwikiDocumentWithImages = ZwikiDocumentWithImages()
+    
+registerPageType(PageTypeStx)
+
+# backwards compatibility - need this here for old zodb objects
+ZwikiStxPageType = PageTypeStx

Added: zope-zwiki/branches/upstream/current/pagetypes/stx_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/pagetypes/stx_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/pagetypes/stx_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,16 @@
+from Products.ZWiki.testsupport import *
+#ZopeTestCase.installProduct('ZCatalog')
+ZopeTestCase.installProduct('ZWiki')
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    return suite
+
+class Tests(ZwikiTestCase):
+
+    def test_PageTypeStx(self):
+        self.p.edit(text='! PageOne PageTwo\n',type='stx')
+        self.assertEquals(self.p.render(bare=1),
+                          '<p> PageOne PageTwo</p>\n<p>\n</p>\n')
+

Added: zope-zwiki/branches/upstream/current/pagetypes/wwml.py
===================================================================
--- zope-zwiki/branches/upstream/current/pagetypes/wwml.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/pagetypes/wwml.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,384 @@
+# WikiWikiWeb-style markup
+# contributed by Tres Seaver <tseaver at palladion.com>
+
+from common import *
+from Products.ZWiki.I18n import _
+from Products.ZWiki.pagetypes import registerPageType
+
+class PageTypeWwml(PageTypeBase):
+    _id = 'wwml'
+    _name = 'WikiWikiWeb'
+    supportsWwml = yes
+    supportsWikiLinks = yes
+
+    def format(self,t):
+        return translate_WWML(html_quote(t))
+
+    def preRender(self, page, text=None):
+        t = text or (page.document()+'\n'+MIDSECTIONMARKER+\
+                     self.preRenderMessages(page))
+        t = page.applyWikiLinkLineEscapesIn(t)
+        t = self.format(t)
+        t = page.markLinksIn(t)
+        t = self.protectEmailAddresses(page,t)
+        return t
+
+    def render(self, page, REQUEST={}, RESPONSE=None, **kw):
+        t = page.preRendered()
+        t = page.renderMarkedLinksIn(t)
+        if page.hasFitTests(): t = page.runFitTestsIn(t)
+        if page.isIssue() and kw.get('show_issueproperties',1):
+            t = page.addIssueFormTo(t)
+        t = page.renderMidsectionIn(t,**kw)
+        t = page.addSkinTo(t,**kw)
+        return t
+
+
+class WWMLTranslator :
+    """
+    |FSM/translator for texts marked up using WikiWikiMarkupLanguage, as
+    | defined at http://www.c2.org/cgi/wiki?TextFormattingRules:
+    |
+    |Paragraphs 
+    |
+    |    Don't Indent paragraphs 
+    |
+    |    Words wrap and fill as needed 
+    |
+    |    Use blank lines as separators 
+    |
+    |    Four or more minus signs make a horizontal rule 
+    |
+    |Lists 
+    |
+    |    tab-* for first level 
+    |
+    |        tab-tab-* for second level, etc. 
+    |
+    |    Use * for bullet lists, 1. for numbered lists (mix at will) 
+    |
+    |    tab-Term:-tab Definition for definition lists 
+    |
+    |    One line for each item 
+    |
+    |    Other leading whitespace signals preformatted text, changes font. 
+    |
+    |Fonts 
+    |
+    |    Indent with one or more spaces to use a monospace font: 
+    |
+    | This is in monospace # note it is off the margin
+    |
+    |This is not # it is on the left margin there
+    |
+    |Indented Paragraphs (Quotes) 
+    |
+    |    tab-space-:-tab -- often used (with emphasis) for quotations.
+    |        (See SimulatingQuoteBlocks) 
+    |
+    |Emphasis 
+    |
+    |    Use doubled single-quotes ('') for emphasis (usually italics) 
+    |
+    |    Use tripled single-quotes (''') for strong emphasis (usually bold) 
+    |
+    |    Use five single-quotes ('), or triples within doubles, for some other
+    |    kind of emphasis (BoldItalicInWiki), but be careful about the bugs in
+    |    the Wiki emphasis logic... 
+    |
+    |    At most one per line. But as many as you need in a paragraph; just use
+    |    multiple lines without intervening blank lines. 
+    |
+    |    Don't cross line boundaries 
+    |
+    |References 
+    |
+    |    JoinCapitalizedWords to make local references 
+    |
+    |    [1], [2], [3], [4] refer to remote references. Click EditLinks on the
+    |    edit form to enter URLs 
+    |
+    |    Or precede URLs with "http:", "ftp:" or "mailto:" to create links
+    |    automatically as in: http://c2.com/ 
+    |
+    |    URLs ending with .gif are inlined if inserted as a remote reference 
+    |
+    |    ISBN 0-13-748310-4 links to a bookseller. (The pattern is:
+    |    "ISBN", optional colon, space, ten digits with optional hypens,
+    |    the whole thing optionally in square brackets. The last digit can be
+    |    an "X".) We are an AmazonAssociate. 
+    |
+    |        I S B N: 0123456789 becomes ISBN 0123456789 
+    |        [I S B N 0123456789] becomes ISBN 0123456789 
+    |        [I S B N: 123-456-789-X] becomes ISBN 123-456-789-X 
+    """
+    #
+    #   Patterns used to parse markup.
+    #
+    blankLine     = re.compile( '^$' )
+    anyGroup      = "(.*)"
+    notTick       = "([^']*)"
+    minimalMunch  = "(.*?)"
+    strong        = re.compile( "'''%s'''" % minimalMunch )
+    emphasis      = re.compile( "''%s''" % minimalMunch ) 
+    forceBreak    = re.compile( r"\\\\" ) 
+    hrule         = re.compile( '^----[-]*%s' % anyGroup )
+    leadingSpaces = re.compile( '^( *)' )
+    spaceChunks   = re.compile( ' {1,8}' )
+
+    nTabs         = "([ \t]*)"
+    tabList       = re.compile( '^%s%s' % ( nTabs, anyGroup ) )
+
+    blockPrefix   = r'^(=)'
+    tableFormat   = r'^\|(.*)\|'
+    rowDivider    = r'\|'
+    bulletPrefix  = r'^(\*)'
+    digitPrefix   = r'^([0-9][0-9]*[\.]?)'
+    dictPrefix    = "^([A-Za-z '-]*):"
+    itemSuffix    = r"[ \t]+" + anyGroup
+
+    blockItem     = re.compile( blockPrefix + itemSuffix )
+    tableRow      = re.compile( tableFormat )
+    tableDef      = re.compile( rowDivider )
+    bulletItem    = re.compile( bulletPrefix + itemSuffix )
+    digitItem     = re.compile( digitPrefix  + itemSuffix )
+    dictItem      = re.compile( dictPrefix   + itemSuffix )
+
+    codePrefix    = r'^([ \t]+)(?=[^*=|0] )'
+    codeLine      = re.compile( codePrefix )
+
+    httpPrefix    = '(http:)'
+    ftpPrefix     = '(ftp:)'
+    mailtoPrefix  = '(mailto:)'
+    urlSuffix     = '([^ ]+)'
+
+    httpURL       = re.compile( httpPrefix   + urlSuffix )
+    ftpURL        = re.compile( ftpPrefix    + urlSuffix )
+    mailtoURL     = re.compile( mailtoPrefix + urlSuffix )
+    imageURL      = re.compile(
+                    r'((?:http|ftp)://(?:.*?)\.(?:JPG|GIF|PNG|jpg|jpeg|gif|png))' 
+                          )
+
+#    def __init__( self, other ) :
+    def __init__( self ) :
+        """
+        """
+#        self.other              = other
+        self.listStack          = []
+        self.translatedLines    = []
+        self.topList            = self.translatedLines
+        self.topCode            = ''
+
+    def nestingLevel( self ) :
+        """
+        How deep is the nesting stack?
+        """
+        return len( self.listStack )
+
+    def pushList( self, code ) :
+        """
+        Start a new nested line list (e.g., for <UL>/<OL>/<DL>/<PRE>).
+        """
+        parentList   = self.topList
+        self.topList = []
+        self.topCode = code
+        self.listStack.append( ( code, self.topList, parentList ) )
+
+
+    def popList( self ) :
+        """
+        Finish current nested line list.
+        """
+        # First, pop the topmost record, and restore invariant (topList
+        #  points to the list member of topmost).
+        oldLevel                    = self.nestingLevel()
+        if not oldLevel : return
+
+        code, lines, self.topList   = self.listStack.pop()
+        newLevel                    = self.nestingLevel()
+        self.topCode = newLevel and self.listStack[ newLevel - 1 ][ 0 ] or ''
+
+        # Next, insert popped record's lines as nested structure.
+        if code == 'PRE' :
+            indent = ''
+        else :
+            indent = '  '
+        if code:
+            self.topList.append( '%s<%s>' % ( indent, code ) )
+        for line in lines :
+            self.topList.append( '%s%s%s' % ( indent, indent, line ) )
+        if code:
+            self.topList.append( '%s</%s>' % ( indent, code ) )
+    
+
+    def replaceEmphasis( self, matchObj ) :
+        """
+        Replace ''foo'' with <EM>foo</EM>.
+        """
+        return '<EM>%s</EM>' % matchObj.group(1)
+                               
+
+
+    def replaceStrong( self, matchObj ) :
+        """
+        Replace '''foo''' with <STRONG>foo</STRONG>.
+        """
+        return '<STRONG>%s</STRONG>' % matchObj.group(1)
+
+    def embedImage( self, matchObj ):
+        return '<IMG SRC="%s">' % matchObj.group(1)
+
+    def replaceInlineURL( self, matchObj ):
+        """
+        Replace http://www.foo.com with
+             <A HREF="http://www.foo.com">http://www.foo.com</A>
+             (likewise ftp: and mailto: URL's).
+        """
+
+        return '<A HREF="%s%s">%s%s</A>' % ( matchObj.group( 1 )
+                                           , matchObj.group( 2 )
+                                           , matchObj.group( 1 )
+                                           , matchObj.group( 2 )
+                                           )
+
+
+    def appendCodeLine( self, line ) :
+        """
+        """
+        while self.nestingLevel() > 1 :
+            self.popList()
+
+        if self.topCode != 'PRE' :
+            self.popList()
+            self.pushList( 'PRE' )
+
+        self.topList.append( line )
+
+    def mungeLine( self, line ) :
+        """
+        """
+        #   Munge "simple" markup.
+        line        = self.blankLine.sub( '<P>', line )
+        line        = self.strong.sub( self.replaceStrong, line )
+        line        = self.emphasis.sub( self.replaceEmphasis, line )
+        line        = self.imageURL.sub( self.embedImage, line )
+        # SKWM let the main routines take care of this later
+        #line        = self.httpURL.sub( self.replaceInlineURL, line )
+        #line        = self.ftpURL.sub( self.replaceInlineURL, line )
+        #line        = self.mailtoURL.sub( self.replaceInlineURL, line )
+        line        = self.hrule.sub( '<HR>', line )
+        line        = self.forceBreak.sub( '<BR />', line )
+        line        = self.blankLine.sub( '<P>', line )
+        return line
+
+    def parseLine( self, line ) :
+        #   Break off leading tabs and count.
+        tabMatch    = self.tabList.match( line )
+        numTabs     = len( tabMatch.group( 1 ) )
+        line        = tabMatch.group( 2 )
+
+        #   Store line and compute new state.
+        self.newState( numTabs, line )
+
+    def replaceTableItems( self, matchObj ) :
+        """
+        """
+        row = self.tableDef.sub("</TD><TD>", matchObj.group( 1 ))
+        # return "<TR align=center><TD>%s</TD></TR>" % row
+        return "<TR valign=top><TD>%s</TD></TR>" % row
+
+    def insertBlockItem( self, matchObj ) :
+        """
+        """
+        return "%s<BR />" % matchObj.group( 2 )
+
+    def replaceListItem( self, matchObj ) :
+        """
+        """
+        return "<LI> %s" % matchObj.group( 2 )
+
+    def replaceDictItem( self, matchObj ) :
+        """
+        """
+        return "<DT>%s<DD>%s" % ( matchObj.group( 1 ), matchObj.group( 2 ) )
+
+    def lexListLine( self, line ) :
+
+        line, nsub  = self.tableRow.subn( self.replaceTableItems, line )
+        if nsub :
+            return 'TABLE', self.mungeLine( line )
+
+        line, nsub  = self.blockItem.subn( self.insertBlockItem, line )
+        if nsub :
+            return 'BLOCKQUOTE', self.mungeLine( line )
+
+        line, nsub  = self.bulletItem.subn( self.replaceListItem, line )
+        if nsub :
+            return 'UL', self.mungeLine( line )
+
+        line, nsub  = self.digitItem.subn( self.replaceListItem, line )
+        if nsub :
+            return 'OL', self.mungeLine( line )
+
+        line, nsub  = self.dictItem.subn( self.replaceDictItem, line )
+        if nsub :
+            return 'DL', self.mungeLine( line )
+        
+        return '', self.mungeLine( line )
+
+    def newState( self, numTabs, line ) :
+        """
+        Decode new state (i.e., adjust the nesting stack), based on
+        current state and inputs.
+        """
+        level = self.nestingLevel()
+
+        if self.topCode == 'PRE' :
+            self.popList()
+
+        if numTabs :
+            newCode, line = self.lexListLine( line )
+        else :
+            newCode = ''
+            line    = self.mungeLine( line )
+
+        if level < numTabs :
+            difference = numTabs - level
+            for i in range(difference):
+                self.pushList( newCode )
+        elif level > numTabs :
+            self.popList()
+        
+        if newCode != self.topCode :
+            self.popList()
+            if newCode :
+                self.pushList( newCode )
+
+        self.topList.append( line )
+
+
+    def translate( self, lines ) :
+        """
+        """
+        for line in lines :
+            # PM: Turn leading spaces into tabs ... someone smarter than
+            # me can figure out how to do this with a single regexp ...
+            splitted = self.leadingSpaces.split(line)
+            if len(splitted) == 3:
+                line = self.spaceChunks.sub("\t", splitted[1]) + splitted[2]
+            if self.codeLine.match( line ) :
+                self.appendCodeLine( line )
+            else :
+                self.parseLine( line )
+        return self.translatedLines
+    
+    __call__ = translate
+
+def translate_WWML(text) :
+    return string.join(WWMLTranslator()(str(text).split('\n')),'\n')
+
+
+registerPageType(PageTypeWwml)
+
+# backwards compatibility - need this here for old zodb objects
+ZwikiWwmlPageType = PageTypeWwml

Added: zope-zwiki/branches/upstream/current/pagetypes/wwml_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/pagetypes/wwml_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/pagetypes/wwml_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,127 @@
+from Products.ZWiki.testsupport import *
+ZopeTestCase.installProduct('ZWiki')
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    return suite
+
+class Tests(ZwikiTestCase):
+
+    def afterSetUp(self):
+        afterSetUp(self)
+        self.p.edit(type='wwml')
+
+    def test_PageTypeWwml(self):
+        self.p.edit(text = """
+This is the first paragraph.  There should be a paragraph marker before it,
+and it should wrap nicely around.
+
+---------
+That should have produced a horizontal rule.
+
+The last word should be ''emphasized''.
+
+The last word should be '''strong'''
+
+Can we do both ''emph'' and '''strong''' on the same line?
+
+How about two times:  ''emph1'' followed by ''emph2''?
+
+	* one bullet, with a WikiName
+	* second bullet, with an UnknownWikiName
+		1. nested digit
+		2. nested digit
+
+	1. Top-level numbered list
+	2. Top-level numbered list
+		* nested bullet
+		* nested bullet
+	3. See if we keep the numbering here!
+
+	Term: a definition
+	''Marked-up Term'': another definition, but with ''markup''
+	: a definition without a term
+
+  This should be monospaced,
+    and indented manually
+
+and now this is another normal paragraph.
+
+  Here is some more pre-formatted text.
+	* followed by a bullet
+
+Let's see if AutomaticURLLinking works yet:
+	* http://www.palladion.com
+	* ftp://www.neosoft.com/pub/users/t/tseaver
+	* mailto:tseaver at palladion.com
+
+And [these words] should be linked, too.
+""")
+        self.assertEquals(
+            self.p.render(bare=1),
+            """\
+<P>
+This is the first paragraph.  There should be a paragraph marker before it,
+and it should wrap nicely around.
+<P>
+<HR>
+That should have produced a horizontal rule.
+<P>
+The last word should be <EM>emphasized</EM>.
+<P>
+The last word should be <STRONG>strong</STRONG>
+<P>
+Can we do both <EM>emph</EM> and <STRONG>strong</STRONG> on the same line?
+<P>
+How about two times:  <EM>emph1</EM> followed by <EM>emph2</EM>?
+<P>
+  <UL>
+    <LI> one bullet, with a WikiName<a class="new visualNoPrint" href="http://nohost/test_folder_1_/wiki/TestPage/createform?page=WikiName" title="create this page">?</a>
+    <LI> second bullet, with an UnknownWikiName<a class="new visualNoPrint" href="http://nohost/test_folder_1_/wiki/TestPage/createform?page=UnknownWikiName" title="create this page">?</a>
+      <OL>
+        <LI> nested digit
+        <LI> nested digit
+      </OL>
+  </UL>
+<P>
+  <OL>
+    <LI> Top-level numbered list
+    <LI> Top-level numbered list
+      <UL>
+        <LI> nested bullet
+        <LI> nested bullet
+      </UL>
+    <LI> See if we keep the numbering here!
+  </OL>
+<P>
+  <DL>
+    <DT>Term<DD>a definition
+    <DT><EM>Marked-up Term</EM><DD>another definition, but with <EM>markup</EM>
+  </DL>
+<PRE>
+	: a definition without a term
+</PRE>
+<P>
+    This should be monospaced,
+    and indented manually
+<P>
+and now this is another normal paragraph.
+<P>
+    Here is some more pre-formatted text.
+  <UL>
+    <LI> followed by a bullet
+  </UL>
+<P>
+Let's see if AutomaticURLLinking<a class="new visualNoPrint" href="http://nohost/test_folder_1_/wiki/TestPage/createform?page=AutomaticURLLinking" title="create this page">?</a> works yet:
+  <UL>
+    <LI> <a href="http://www.palladion.com">http://www.palladion.com</a>
+    <LI> <a href="ftp://www.neosoft.com/pub/users/t/tseaver">ftp://www.neosoft.com/pub/users/t/tseaver</a>
+    <LI> <a href="mailto:tseaver at palladion.com">mailto:tseaver at palladion.com</a>
+  </UL>
+<P>
+And [these words]<a class="new visualNoPrint" href="http://nohost/test_folder_1_/wiki/TestPage/createform?page=these%20words" title="create this page">?</a> should be linked, too.
+<P>
+
+""")
+

Added: zope-zwiki/branches/upstream/current/plugins/README
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/README	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/README	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1 @@
+You can plug in new plugins - mixin classes for ZWikiPage - here. See __init__.py.

Added: zope-zwiki/branches/upstream/current/plugins/__init__.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/__init__.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/__init__.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,91 @@
+"""
+The plugins package, containing plugins providing non-core functionality.
+
+A Zwiki plugin is a module or package that extends Zwiki's functionality,
+usually by providing a mixin for ZWikiPage, thereby adding extra features
+to all wiki pages at startup.  A true plugin can (a) be removed without
+any ill effects aside from disabling the feature it provides, and (b) be
+provided by a separate product.
+
+Page types are another kind of plugin, residing in their own pagetypes
+package. It seems helpful to keep them separate for the moment.
+
+Non-core features which used to be in the main ZWiki package are
+gradually being moved here and pluginised. Some of them still have
+hard-coded dependencies in other parts of the code, such as:
+
+- dependencies in the Admin upgrade methods - resolved ?
+- edit calls purple numbers when setting text
+- some page types call purple numbers during rendering
+- issue tracker access key and link in wikipage template
+- tracker action in CMFInit fti
+- tracker hotkey in showAccessKeys
+- issue linking and link colouring in renderLink
+- isIssue arg support in pages
+- issue creation in mailin
+- show_issueproperties=0 in pagetypes/common renderText
+- issue properties form rendering in page types
+
+"""
+
+from Products.ZWiki.Utils import BLATHER, formattedTraceback
+
+# a kludge to subclass a runtime list of classes, since we can't modify
+# __bases__ of an extension class. ZWikiPage subclasses each of these
+# slots. We could also subclass a class whose __bases__ we can modify,
+# see http://zwiki.org/1034Pluginization
+class Null: pass
+PLUGINS = [
+    Null,
+    Null,
+    Null,
+    Null,
+    Null,
+    Null,
+    Null,
+    Null,
+    Null,
+    Null,
+    Null,
+    Null,
+    Null,
+    Null,
+    Null,
+    Null,
+    ]
+
+def registerPlugin(c):
+    """
+    Add a class to Zwiki's global plugin registry.
+
+    >>> from Products.ZWiki.plugins import registerPlugin
+    >>> registerPlugin(MyMixinClass)
+
+    """
+    name = '%s.%s' % (c.__module__,c.__name__)
+    for i in range(len(PLUGINS)):
+        if PLUGINS[i] == Null:
+            PLUGINS[i] = c
+            BLATHER('loaded plugin: %s' % name)
+            return
+    BLATHER('could not register %s plugin, need more plugin slots!' % name)
+
+# load plugins
+# import all modules and packages in this directory, each will register itself
+import os, re
+modules = [re.sub('.py$','',f) for f in os.listdir(__path__[0])
+           if os.path.isdir(os.path.join(__path__[0], f))
+           or (f.endswith('.py')
+               and not f.endswith('_tests.py')
+               and not f == '__init__.py'
+               )
+           ]
+for m in modules:
+    if m.startswith('_'):
+        BLATHER('%s plugin disabled with _ prefix, skipping\n' % m[1:])
+    else:
+        try:
+            __import__('Products.ZWiki.plugins.%s' % m)
+        except:
+            BLATHER('could not load %s plugin, skipping (traceback follows)\n%s' % (
+                m, formattedTraceback()))

Added: zope-zwiki/branches/upstream/current/plugins/fit.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/fit.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/fit.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,109 @@
+# fit (framework for interactive testing) support
+
+import sys, os, string, re
+
+from AccessControl import getSecurityManager, ClassSecurityInfo
+from Globals import InitializeClass
+from OFS.DTMLDocument import DTMLDocument
+
+from Products.ZWiki import Permissions
+from Products.ZWiki.plugins import registerPlugin
+from Products.ZWiki.Defaults import registerPageMetaData
+from Products.ZWiki.Utils import Popen3, formattedTraceback, BLATHER
+from Products.ZWiki.Views import addErrorTo
+
+# from testsupport.py:
+def pdir(path): return os.path.split(path)[0]
+ZWIKIDIR = pdir(os.path.abspath(__file__))
+
+def hasFitTests(self):
+    """
+    Does this page have any tables containing fit tests ?
+
+    Should match python fit's regexp.
+    """
+    return re.search(r'([Ff]ixtures|\bfit)\.\w',self.read()
+                     ) is not None
+
+# fit may not be installed, but we need to provide a stub class 
+# for the moment IIRC
+try:
+    from fit.Parse import Parse
+    from fit.Parse import ParseException
+    from fit.Fixture import Fixture
+    class PluginFit:
+        """
+        Mix-in class for fit support
+        """
+        security = ClassSecurityInfo()
+
+        def _runFitInternallyOn(self,text):
+            try:
+                fitTables = Parse(text)
+            except ParseException:
+                return text
+
+            # reset class-variable counts
+            # not working
+            Fixture.rights = 0
+            Fixture.wrongs = 0
+            Fixture.ignores = 0
+            Fixture.exceptions = 0
+            Fixture.summary = {}
+
+            # find fit in ZWiki product directory as well as PYTHONPATH
+            oldpath = sys.path
+            sys.path.insert(0,ZWIKIDIR)
+
+            Fixture().doTables(fitTables)
+
+            sys.path = oldpath
+            return str(fitTables)
+
+        def _runFitExternallyOn(self,text):
+            oldpath = sys.path
+            sys.path.insert(0,ZWIKIDIR)
+            p = Popen3(
+                '''PYTHONPATH=%s python -c \
+                     "import fit.FileRunner; \
+                      fit.FileRunner.FileRunner(('','-','-')).run()"''' % \
+                  string.join(sys.path,':'),
+                input=text)
+            sys.path = oldpath
+            return p.out
+
+        #def _runFitOnClassFit(self,text):
+        #    """
+        #    Run fit on tables with class="fit".
+        #    """
+        #    # jiggery-pokery
+        #    t = text
+        #    t = re.sub(r'(?im)<table class="fit"',r'<_fittable',t)
+        #    t = re.sub(r'(?im)<table',r'<_ordinarytable',t)
+        #    t = re.sub(r'(?im)<_fittable',r'<table class="fit"',t)
+        #    t = self._runFitInternallyOn(t)
+        #    t = re.sub(r'(?im)<_ordinarytable',r'<table',t)
+        #    return t
+
+        def runFitTestsIn(self,text):
+            """
+            Run fit on tables in text.
+
+            Modified fit to test only certain tables (though it parses all).
+            """
+            return self._runFitInternallyOn(text)
+
+        security.declareProtected(Permissions.View, 'hasFitTests')
+        def hasFitTests(self): return hasFitTests(self)
+
+
+except ImportError:
+    BLATHER('did not find fit in the PYTHONPATH, skipping')
+    class PluginFit:
+        security = ClassSecurityInfo()
+        security.declareProtected(Permissions.View, 'hasFitTests')
+        def hasFitTests(self): return hasFitTests(self)
+        def runFitTestsIn(self,text): return text
+
+InitializeClass(PluginFit)
+registerPlugin(PluginFit)

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/ChangeLog
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/ChangeLog	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/ChangeLog	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,150 @@
+Zwiki 0.56:
+* latexwiki is now shipped with Zwiki as one of the standard plugins.
+  Changes will be noted only in ZWiki/CHANGES.txt from now on, probably.
+* create the working directory if needed, avoiding an IO error
+* fix defaultLatexTemplate string definition, avoiding a latex error
+* disable broken widentop adjustment in align for now, avoiding a PIL error
+* make align slightly more robust
+
+latexwiki-sm 0.53:
+* Pared down to just the stxlatex page type; old LatexWiki pages should
+  get rendered as stxlatex, not break
+* Simplified file structure like other pagetypes/plugins
+* Updated to work with current Zwiki; tested with 0.52, should work back
+  to 0.46 or possibly 0.34
+* Does not do friendly zwiki version checking at startup
+* Does not install default latexwiki wiki automatically
+* Docs cleanups
+* ...in progress
+
+LatexWiki 0.42:
+* Fix align() due to change in behavior of Image::paste
+* New wikipage.pt after ZWiki eliminated wikipage_macros
+* FCNTL -> fcntl (python 2.4 support)
+* New alignment array should get the alignment correct for any latex_font_size
+  in 10-64 px.
+
+LatexWiki 0.38 (not released):
+* rename escapeEmailAddresses to protectEmailAddresses (grrr)
+* fix publish error on latexwiki.css under some circumstances
+* fix hang-on-startup due to either os.access or os.popen('which ...')
+* Allow runCommand to pass input to child, use it for itex
+* Improve rendering to allow wider range of font heights
+* Use new utility dvipng, vastly improving performance
+* Run dvips in secure mode
+* Use 72.27 points per inch for dvipng, 72 for ghostscript
+
+LatexWiki 0.35:
+* Move to non-blocking I/O on our sockets (prevents a hang when a page
+  contains many equations)
+* In Extensions/Install.py look in both SOFTWARE_HOME and INSTANCE_HOME for
+  the zwiki directory for our site template.  (Fix for Zope 2.7 / Plone 2.0)
+* latexwiki.css: Check for any ZWikiPage in the folder for including
+  /stylesheet, and do not include it if we are in plone (portal_factory
+  exists)
+* Fix itex detection.  (mine is in /usr/local/bin and that is not in the
+  default python path)
+* Fix $$ ... $$ block mode
+* Place latex in the img alt attribute.
+* Move runCommand and log into util.py so they can be used by reduce/axiom.
+
+LatexWiki 0.32:
+* move imageDoesNotExist outside of enclosing function (fix for python 2.1?)
+* Use 'dvips -o' (some dvips don't create .ps by default -- then what is it
+  doing?!?!  Making souffle?!?!?!)
+* Use full path for LocalFS images/
+* Better escaping of equations to appear in img alt=
+* Support $$eqn$$ display mode for equations
+* check for itex and enable existing code if it is found.  itex 0.8 can be
+  found here: http://golem.ph.utexas.edu/~distler/blog/archives/000355.html
+* add latexwiki.css.dtml which imports the default ZWiki stylesheet, and
+  appropriate wikipage.pt changes.
+* Created Extensions/Install.py for the CMF Quick Installer 
+* Modified latexwiki.css to only include FrontPage/stylesheet if there is a
+  FrontPage, and small tweaks to make latexwiki.css work with Plone.
+* Rework to support new ZWiki 0.32 pagetypes layout
+* Added diffform.pt so it includes latexwiki.css (will have to add others)
+
+LatexWiki 0.29:
+* Change version 0.25 -> 0.29 (to be same as ZWiki 0.29) after complaints, and
+  even I screwed up the download link.
+
+LatexWiki 0.25:
+* variable font size via the folder properties "latex_font_size", 
+  "latex_align_fudge", "latex_res_fudge".  Further refinements will probably
+  be necessary.
+* Fixed dot-chopping code so $\cdot \cdot$ doesn't generate an error.
+  (Thanks to Kyle Cranmer)
+* New Page Type:  ZwikiHtmlLatexPageType (HTML + LaTeX) should be able to feed
+  this straight into itex2MML
+* Fixed parsing of LaTeX so that $\begin{array} a \\ b \end{array}$ works
+* Fixed escaping so that $\$$ works
+* Be more careful using os.chdir().  We can tell LocalFS to use the relative
+  directory "LatexWiki" now.  Zope sees its CLIENT_HOME by default.
+* Modify ZWiki to be able to import the necessary elements of a LatexWiki site
+* LatexWiki template site (ZWiki/content/latexwiki,
+  LatexWiki/Extensions/setup_latexwiki.py)
+* User font selection and font size adjustment in UserOptions (and
+  stylesheet.css)
+
+LatexWiki 0.24:
+* Make ourselves appear first (and therefore default) in the list of possible
+  document types when creating a new document.
+* Added <span class="latexwiki"> to pages and a ploneCustom.css for plone
+  that will get text the right size and equations aligned.
+* Fixed links with equations not getting marked up.  (look for STX behavior
+  differences here)  Equation color does not match link color.
+
+LatexWiki 0.23:
+* Changed to pslatex/dvipdf rather than pdflatex so that postscript specials
+  work (axodraw/feynman diagrams in particular for me)
+* Fixed latexWrapper importing App::ImageFile rather than PIL::ImageFile
+
+LatexWiki 0.22:
+* Update for ZWiki 0.26 (should work with 0.25 too)
+* When latex gives us a blank page, bail properly. (try $\latex$)
+* See the new UPGRADE file.
+
+LatexWiki 0.21:
+* \( \) syntax for in-line equations works now.  
+* Fixed some issues with \[\]
+* Fixed equation numbering to not mark up O(1), and typo \3->\2
+* Prevent us from marking up escaped latex when it appears twice.
+* Fixed python bug with buffer sizes.  When there were a large number of
+  images on a page, ghostscript would hang writing to stderr (bbox run) and
+  python seems to ignore the buffer size argument to popen3.  Changed to a
+  poll/read loop.
+
+LatexWiki 0.20:
+* Added stylesheet.css
+* Updated INSTALL.txt to reflect ZWiki 0.23 install procedure, and stylesheet
+  use instead of standard_zwiki_header.
+* Found VERSION.txt, and updated it.
+* Updated __init__.py to be compatible with ZWiki 0.23 (thanks to Drew).
+* Prevent us from trying to render 0x0 pngs (which causes an error the first
+  time it happens).  Now we render a 1x1 transparent png.
+* Change the Ghostscript resolution 130 -> 126.  The characters look better,
+  the 'Y' doesn't have tits on the top, and lower case letters are larger (!)
+  and line up with the text better.
+* Fix the \[ \] in-line LaTeX mode. (is a block mode)
+* Fix equation numbers when they appear at the end of a file.
+
+10/3/2003 Release
+* Add equation numbers with internal hyperlinks.
+* Fixed rendering of images multiple times when the same equation appears more than once.
+* Fixed block equations to not have extra space after the equation.
+* Used PIL and 'gs -sDEVICE=bbox' to modify png's so that they line up with
+  the surrounding text.
+* Removed extra space after block images
+* Fixed bad indenting of lists that contained block equations
+* Fixed escaping: latex can be preceeded by a '!' to prevent it from being
+  rendered as LaTeX.
+* Use alpha channel PNG's, so that equations look right no matter what
+  background your page has.
+* Fix the replacement of dollar signs '$' when the same in-line equation
+  occurs twice.  Escaped in-line equations now have the dollar signs converted
+  to HTML entities &#36;
+* Commented out code that adds the original latex for a block equation in an
+  html comment <!-- \begin{equation}... etc --> so that LatexWiki doesn't
+  destroy existing comments.  We still mark up equations inside HTML comments
+

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/Extensions/Install.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/Extensions/Install.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/Extensions/Install.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,111 @@
+##############################################################################
+#
+# Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE
+# 
+##############################################################################
+"""
+CMF ZWiki Installation script
+
+This file is a CMF installation script for LatexWiki.  It's meant to be used
+as an External Method. Compatible with the CMF quick installer, or to use
+manually, add an external method to the root of the CMF or Plone Site that
+you want LatexWiki registered in with the configuration:
+
+ id:            cmf_install_latexwiki
+ title:         
+ module name:   LatexWiki.Install
+ function name: install
+
+Then call this method in the context of the CMF/Plone site, by visiting
+http://SITEURL/cmf_install_latexwiki . The install function will execute and
+give information about the steps it took.
+"""
+
+import string, os, sys
+from Products.LatexWiki.util import workingDir
+from cStringIO import StringIO
+from OFS.DTMLMethod import DTMLMethod
+from OFS.Image import Image, File
+from OFS.ObjectManager import customImporters
+from ZODB.PersistentMapping import PersistentMapping
+from Products.CMFCore.TypesTool import ContentFactoryMetadata
+from Products.CMFCore.DirectoryView import addDirectoryViews
+from Products.CMFCore.utils import getToolByName
+from Products.ZWiki.CMFInit import wiki_globals, factory_type_information
+from Products.ZWiki.ZWikiPage import ZWikiPage
+from Products.ZWiki.ZWikiWeb import _addDTMLMethod
+from Products.ZWiki.Defaults import PAGE_PORTALTYPE#,ALLOWED_PAGE_TYPES_IN_PLONE
+
+
+def install(self):
+    """
+    Create images directory and add some necessary properties to the folder.
+    """
+    out = StringIO()
+    out.write('Adding properties to folder\n')
+    if not self.hasProperty('allow_dtml'):
+        self.manage_addProperty('allow_dtml', 'true', 'boolean') 
+    if not self.hasProperty('latex_font_size'):
+        self.manage_addProperty('latex_font_size', 18, 'int')
+    if not self.hasProperty('latex_align_fudge'):
+        self.manage_addProperty('latex_align_fudge', 0.0, 'float')
+    if not self.hasProperty('latex_res_fudge'):
+        self.manage_addProperty('latex_res_fudge', 1.00, 'float') 
+    if(not os.access(workingDir, os.F_OK)): 
+        os.mkdir(workingDir)
+        out.write('LatexWiki image directory %s created'%(workingDir)) 
+    id = 'images'
+    # Transition to this once we are storing images in the ZODB ob =
+    # BTreeFolder2(id) 
+    ob = None 
+    try: 
+        from Products.LocalFS.LocalFS import LocalFS 
+        ob = LocalFS(id, '', workingDir, None, None) 
+    except ImportError: # no localfs
+        out.write('Error: LocalFS not installed.  LatexWiki requires LocalFS.')
+# FileSystemSite does not automatically refresh when the contents of the
+# filesystem chages.  I'm not sure if it's possible to enable that...
+#        try:
+#            from Products.FileSystemSite.DirectoryView import DirectoryView
+#            ob = DirectoryView(id, workingDir)
+#        except ImportError:
+#            zLOG.LOG('LatexWiki',zLOG.DEBUG,'FileSystemSite not installed either')
+    # FIXME: try Ape too
+    if ob != None:
+        self._setObject(id, ob, set_owner=1)
+    else:
+        out.write('ERROR: Failed to find a suitable filesystem product')
+
+    filename = 'latexwiki.css.dtml'
+    dir = sys.modules['__builtin__'].SOFTWARE_HOME + os.sep \
+          + 'Products/ZWiki/content/latexwiki'
+    if(not os.access(dir, os.F_OK)):
+        dir = sys.modules['__builtin__'].INSTANCE_HOME + os.sep \
+              + 'Products/ZWiki/content/latexwiki'
+    text = open(dir + os.sep + filename).read()
+    _addDTMLMethod(self, 'latexwiki.css', title='', file=text)
+    filename = 'blank.gif.gif'
+    text = open(dir + os.sep + filename).read()
+    self._setObject('blank.gif', Image('blank.gif', '', text))
+    filename = 'pngbehavior.htc.zexp'
+    connection = self.getPhysicalRoot()._p_jar
+    self._setObject('pngbehavior.htc', connection.importFile(dir + os.sep + filename, 
+        customImporters=customImporters))
+    id = 'ploneCustom.css'
+    if hasattr(self,id):
+        ploneCustom = self._getOb(id)
+        self._setObject(id, File(id, '', '@import url("latexwiki.css");'))
+    else:
+        text = ploneCustom.text() 
+        if(not re.match(r'@import url\("latexwiki.css"\);', text)):
+            text = text + '\n at import url("latexwiki.css");';
+        ploneCustom.write(text)
+    return out.getvalue()
+

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/Extensions/__init__.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/Extensions/__init__.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/Extensions/__init__.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1 @@
+# this is here so that setup_latexwiki is recognized as a module.

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/Extensions/setup_latexwiki.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/Extensions/setup_latexwiki.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/Extensions/setup_latexwiki.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,44 @@
+# setup script for a new LatexWiki site.
+
+import os, zLOG
+from Products.LatexWiki.util import workingDir
+# for equations-in-ZODB
+#from Products.BTreeFolder2.BTreeFolder2 import BTreeFolder2
+
+def setup_latexwiki(self): 
+    """ Add required attributes to new LatexWiki site, and then remove this method 
+    """ 
+
+    self.manage_addProperty('allow_dtml', 'true', 'boolean') 
+    self.manage_addProperty('latex_font_size', 18, 'int')
+    self.manage_addProperty('latex_align_fudge', 0.0, 'float')
+    self.manage_addProperty('latex_res_fudge', 0.97, 'float') 
+    if(not os.access(workingDir, os.F_OK)): 
+        os.mkdir(workingDir)
+        zLOG.LOG('LatexWiki',zLOG.DEBUG, 'LatexWiki image directory %s created'%(workingDir)) 
+    id = 'images'
+    # Transition to this once we are storing images in the ZODB ob =
+    # BTreeFolder2(id) 
+    ob = None 
+    try: 
+        from Products.LocalFS.LocalFS import LocalFS 
+        ob = LocalFS(id, '', workingDir, None, None) 
+    except ImportError: # no localfs
+        zLOG.LOG('LatexWiki',zLOG.ERROR,'LocalFS not installed')
+# FileSystemSite does not automatically refresh when the contents of the
+# filesystem chages.  I'm not sure if it's possible to enable that...
+#        try:
+#            from Products.FileSystemSite.DirectoryView import DirectoryView
+#            ob = DirectoryView(id, workingDir)
+#        except ImportError:
+#            zLOG.LOG('LatexWiki',zLOG.DEBUG,'FileSystemSite not installed either')
+    # FIXME: try Ape too
+    if ob != None:
+        self._setObject(id, ob, set_owner=1)
+    else:
+        zLOG.LOG('LatexWiki', zLOG.ERROR, 
+            'Failed to find a suitable filesystem product')
+    self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1'])
+    self._delObject('setup_latexwiki')
+
+

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/LICENSE.txt
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/LICENSE.txt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/LICENSE.txt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,19 @@
+LatexWiki - a patch to ZWiki for rendering embedded LaTeX code
+Copyright (C) 2001 Open Software Services <info at OpenSoftwareServices.com>
+Copyright (C) 2003,2004,2005 Bob McElrath <bob+latexwiki at mcelrath.org>
+Copyright (C) 2006 Simon Michael and Zwiki contributors <http://zwiki.org>
+All rights reserved, all disclaimers apply, etc.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/NOTES.txt
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/NOTES.txt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/NOTES.txt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,345 @@
+TODO:
+    test colors ${\red x}$
+    test axodraw
+    test does LatexTemplate get added with plain text pagetype? (no)
+    "thinness" of new images is due to use of alpha channel  (e.g. alpha is 16%
+    and color is 16% results in a pixel that is 2.56%)
+        Derive "white" from image
+        Can dvipng handle alpha for me?
+    Alpha: fix normalization of color, leaves two angles.  Easy to derive right
+    color for a given alpha (fix norm of color at max).
+
+Paper sizes:
+    1. run gs in bbox mode to get sizes
+    2. Define custom paper sizes (create a .ps file for gs to include)
+        a. /usr/share/gs-esp/7.07/lib/gs_statd.ps for examples
+        b. use /margin and similar operators to get rid of margin
+        c. set imagingbbox to be same as paper size
+            ImagableArea?  -- in ppd files
+    3. gs -I switch to specify include file with my papersizes
+
+    bboxes don't change with paper size (but need letter or a4 to get
+    bboxes)
+    See: http://raph.levien.com/Devices.htm
+        for an example of how to set HW resolution using /.HWMargins and
+        /PageSize in stcolor.ps
+    See also /usr/share/gs-esp/7.07/lib/align.ps
+    gs -gXxY forces png's to be XxY in size (doesn't work)
+    Add to latex preamble: (moves text to UL)
+        \oddsidemargin -86pt
+        \headheight 0pt
+        \topmargin -96pt
+    dvipng is the answer.
+        does not handle axodraw, though claims to handle ps specials (?)
+        can use in --follow mode before latex finishes.
+        use png16 instead
+        identify equations and non-equations.  Use gs on non-equations.
+
+latex pagetype:
+    /usr/share/tex4ht/xhmlatex <file>
+    with a config file:
+        default font cmss-10 should be 'serif' or 'cmr10'
+        encoding should be utf-8
+
+    latexml:
+
+dvips resolutions:
+#        err, stdout, stderr = runCommand('dvips -D %f -R -mode pcscreen -o %s %s'%(res, psfileName, dvifileName))
+        #err, stdout, stderr = runCommand('dvips -o %s %s'%(psfileName, dvifileName))
+        # Select metafont mode
+        # -mode pcscreen            (118 dpi)
+        # -mode pcprevw             (118 dpi)
+        # -mode pixpt               (one pixel per point) (72.27 dpi)
+        # -mode mactrue             (72 dpi)
+        # -mode ncd                 (95 dpi)
+        # -mode macmag              (86 dpi)
+        # -mode ibmvga              (110 dpi)
+        # -mode declarge            (100 dpi)
+        # -mode decsmall            (82 dpi)
+        # -O -1in,-1in              (move offset to 0,0)
+
+TODO:
+  Resolution differences on navi/moya may be due to different paper sizes in
+  dvips.  Also try dvips -D and specify resolution (affects font selection)
+  rather than paper size.
+  Also add -R (secure mode -- see man page)
+  Chop off more of the dot horizontally?  1.5 is 1px too much at 16px charheight
+
+    use cmr10 font.
+    with centerline = dotendy (and pixel fudge), and res_fudge=1,
+        14 perfect
+        16 perfect
+        18 1px high
+        20 perfect
+
+    x: 28px high
+    cdot: 8px high
+    centerline is 2px from bottom of cdot  (1/4 factor then?)
+        12
+        14 perfect
+        16 
+        18 1px high (x-height 10.1666666)
+        20
+    1/8 factor:
+        12
+        14
+        16 
+        18 perfect (x-height 8.6666666)
+        20
+    3/8 factor:
+        12 perfect (x-height 7.25)
+        14 perfect (x-height 6.75)
+        16 1px low (x-height 7.50)
+        18 perfect (x-height 9.1666666)
+        20 perfect (x-height 9.3666666)
+    5/16 factor:
+        12  perfect (x-height 7.375)
+        14  perfect (x-height 6.625)
+        15  perfect (x-height 7.383333) (lower case smaller than cmr10)
+        16  perfect (x-height 7.25)
+        17  perfect (x-height 9.016666)
+        18  perfect (x-height 9.416666)
+        19  perfect (x-height 9.250000)
+        20  perfect (x-height 9.116666) (cmr10 good)
+        21  perfect (x-height 9.15)
+        22  perfect (x-height 11.41666)
+        23  1px low (x-height 11.78333)
+        24  1px high(x-height 12.79166)
+        25  1px low (x-height 12.14166)
+        26  perfect (x-height 12.125)
+        27  perfect (x-height 12.391667) (cmr10 tits)
+        28  1px high(x-height 12.658333)
+    --- new        centerline, dotcenter, dotpixmiss, newheight, res
+        12 generates blank image for $xj$
+        13 1px low   2.687500,  0.312500,   0.000000, 6.625000,   78
+      * 14 perfect   2.687500,  0.312500,   0.000000, 6.625000,   84
+        15 perfect   3.308333,  0.625000,  -0.066667, 7.383333,   90
+            cmr tits, lower case letters different size
+        16 perfect   3.375000,  0.625000,   0.000000, 7.250000,   96
+        17 perfect   4.508333,  0.625000,   0.133333, 9.016667,   102
+            cmr lower case top too wide
+      * 18 perfect   4.708333,  0.625000,   0.333333, 9.416667,   108
+            cmr upper case top too wide
+        19 perfect   4.375000,  0.625000,   0.000000, 9.250000,   114
+      * 20 perfect   4.441667,  0.625000,   0.066667, 9.116667,   120
+        21 perfect   4.575000,  0.625000,   0.200000, 9.150000,   126
+            cmr upper case top too wide, png upper case has tits on top
+        22 perfect   5.708333,  0.625000,   0.333333, 11.416667,  132
+            cmr lower case top too wide, png lower case has tits
+        23 1px low   4.108333,  0.625000,  -0.266667, 11.783333,  138
+        24 1px high  6.395833,  0.937500,   0.333333, 12.791667,  144
+            cmr top too wide, png roman has tits
+      * 25 1px low   4.929167,  0.937500,  -0.133333, 12.141667,  150
+        26 perfect   6.062500,  0.937500,   0.000000, 12.125000,  156
+            cmr lower case top too wide, lc roman has tits
+        27 perfect   6.195833,  0.937500,   0.133333, 12.391667,  162
+      * 28 1px high  6.329167,  0.937500,   0.266667, 12.658333,  168
+        29 1px low   5.995833,  0.937500,  -0.066667, 14.008333,  174
+            cmr upper case has tits, png lc has tits
+        30 1px low   6.129167,  0.937500,   0.066667, 13.741667,  180
+            cmr upper case top too wide, 
+            0.97    png uc has tits
+        31 perfect   7.195833,  0.937500,   0.133333, 14.391667,  186
+            cmr top too wide, png lc has tits
+      * 32 perfect   7.395833,  0.937500,   0.333333, 14.791667,  192
+
+        15 perfect   3.308333,  0.625000,  -0.066667, 7.383333,   111
+            cmr tops of letters fuzzy
+        15 perfect   2.308333,  0.625000,  -0.066667, 7.383333,   108
+            cmr tits, lower case letters different size
+        15 1px low   1.687500,  0.312500,   0.000000, 8.625000,   104
+            cmr tits, lower case letters different size
+        15 1px low   2.108333,  0.625000,  -0.266667, 7.783333,   102
+
+
+
+Startup time is 
+    0.123u 0.016s 0:00.18 72.2%     0+0k 0+0io 0pf+0w
+
+Time to get bbox for sample pdf generated by:
+    http://mcelrath.org/Notes/Littlest%20Higgs%20Phenomenology
+    time sudo -u zope gs -dSAFER -dDOINTERPOLATE -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dNOPAUSE -dBATCH -r130 -sDEVICE=bbox -sOutputFile=bob-%03d.png *.pdf
+    0.427u 0.031s 0:00.52 86.5%     0+0k 0+0io 0pf+0w
+    0.427u 0.023s 0:00.50 88.0%     0+0k 0+0io 0pf+0w
+    0.423u 0.029s 0:00.49 89.7%     0+0k 0+0io 0pf+0w
+    0.415u 0.036s 0:00.46 95.6%     0+0k 0+0io 0pf+0w
+    0.422u 0.027s 0:00.49 89.7%     0+0k 0+0io 0pf+0w
+Time to ghostscript the same thing:
+    time sudo -u zope gs -dSAFER -dDOINTERPOLATE -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dNOPAUSE -dBATCH -r130 -sDEVICE=pnggray -sOutputFile=bob-%03d.png *.pdf
+    2.456u 0.042s 0:02.52 98.8%     0+0k 0+0io 0pf+0w
+    2.517u 0.036s 0:02.57 98.8%     0+0k 0+0io 0pf+0w
+    2.478u 0.040s 0:02.55 98.4%     0+0k 0+0io 0pf+0w
+    2.478u 0.039s 0:02.53 98.8%     0+0k 0+0io 0pf+0w
+    2.461u 0.037s 0:02.53 98.4%     0+0k 0+0io 0pf+0w
+time sudo -u zope convert -scale 1075x1520 *.pdf bobconvert-%03d.png 
+    37.981u 0.439s 0:38.47 99.8%    0+0k 0+0io 0pf+0w
+    eek!
+time sudo -u zope mogrify -crop 204x13+204+692 bob-001.png bobnew-001.png
+    0.296u 0.039s 0:00.38 84.2%     0+0k 0+0io 0pf+0w
+
+time sudo -u zope mogrify -crop 0x0+2+2 bob-002.png
+    0.731u 0.045s 0:00.82 93.9%     0+0k 0+0io 0pf+0w
+    0.731u 0.040s 0:00.81 95.0%     0+0k 0+0io 0pf+0w
+    0.756u 0.040s 0:00.84 94.0%     0+0k 0+0io 0pf+0w
+    0.746u 0.039s 0:00.81 95.0%     0+0k 0+0io 0pf+0w
+    0.734u 0.041s 0:00.81 95.0%     0+0k 0+0io 0pf+0w
+
+time gs -dSAFER -dDOINTERPOLATE -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dNOPAUSE -r125 -sDEVICE=pnggray -sOutputFile=test-%03d.png test.pdf < gsscript
+    5.665u 0.237s 0:06.60 89.2%  0+0k 0+0io 0pf+0w
+    5.698u 0.225s 0:06.76 87.4%  0+0k 0+0io 0pf+0w
+    5.696u 0.273s 0:06.92 86.1%  0+0k 0+0io 0pf+0w
+time source gsscript2
+    6.012u 0.317s 0:08.04 78.6%     0+0k 0+0io 0pf+0w
+    5.961u 0.312s 0:06.99 89.6%     0+0k 0+0io 0pf+0w
+    5.955u 0.311s 0:06.96 89.9%     0+0k 0+0io 0pf+0w
+
+
+
+Latex runs in (almost) constant time no matter how many pages are in the file.
+latex with existing LatexTemplate takes 0.2s.  
+    Removing all included packages takes 0.06-0.07s.  
+dvips -E takes 0.04-0.05s (indep of latex template).
+gs -sDEVICE=bbox takes 0.145s.
+eqn2img gives this command to ghostscript:
+      fprintf(gs, "%i neg %i neg translate\n", xoffset, yoffset);
+    can I get it to print the bbox without restarting?
+    Bounding Box printed in postscript by default is not tight.
+latex + dvips -E + gs bbox + gs + custom code = 0.25s + custom / eqn.
+pdflatex + gs
+(bbox) selectdevice
+(test.pdf) run
+1 showpage      (runs a particular page)
+
+
+Alignment:
+    on hawk: 
+        lowercase letters are exactly 8 pixels high (a,e, not y) 
+            Helvetica (Adobe) 14pt
+        Top of upper case letters to bottom of 'y' is 16px.
+    on draal:
+        lowercase letters are 9px, upper case plus 'y' is 15px.
+        (recopy TODO* from hawk)
+    Perhaps make all things less than 16px to 16px.  Can measure latex height
+    with a little latex:
+        \cdot Wj
+    Make this 16px scalable (match browser with latex)
+    anything else gets expanded by 2.
+
+    || or \left|\right| is getting second bar (first?) chopped sometimes.
+
+    1px too much is removed in 'e'.
+
+Documentation:
+    Fix README: -imagemagick +pil
+    Note about standard_header CSS template.
+    Change resolutions?
+
+1/22/2004
+    Rendering comments:
+        Stx is inserting <p>...</p> around every line.  When the whole page is
+        rendered it does not handle the page and comments separately.  Comment
+        headings should not be treated as Stx, and message bodies should only
+        be treated as Stx if the PageType class calls for it.
+
+1/31/2004
+    More timing tests.  I've switched to pslatex so I can use axodraw (requires
+    postscript specials so doesn't work with pdflatex)  dvips can spit out an
+    eps with a tight bbox for each page, which could speed things up significantly.
+    Timing tests on draal (600MHz alpha 21164), 512MB RAM)
+        pslatex/dvipdf: (looks crappy)
+            6.255u 0.469s 0:08.25 81.3%     0+0k 0+0io 0pf+0w
+        pslatex/dvips:  (looks best)
+            5.503u 0.385s 0:07.06 83.2%     0+0k 0+0io 0pf+0w
+        pdflatex:       (looks better)
+            5.696u 0.359s 0:07.12 84.8%     0+0k 0+0io 0pf+0w
+    appears to be only 10pt and 12pt available in latex
+    -dAlignToPixels=1
+        affects neither ps or pdf mode.
+
+2/2/2004
+    code='$\mathrm{Y}$' topsize=7.866667, bottomsize=4.133333, centerline = 7.866667, ne
+    wheight=15.733333, widentop=0.000000, widenbottom=0.000000, chopx=2.000000
+    code='$\mathrm{j}$' topsize=6.866667, bottomsize=7.133333, centerline = 6.866667, ne
+    wheight=14.266667, widentop=0.266667, widenbottom=0.000000, chopx=2.000000
+
+    code='$m$' topsize=3.866667, bottomsize=4.133333, centerline = 3.866667, newheight=8
+    .266667, widentop=0.266667, widenbottom=0.000000, chopx=2.000000
+    code='$G$' topsize=7.866667, bottomsize=4.133333, centerline = 7.866667, newheight=1
+    5.733333, widentop=0.000000, widenbottom=0.000000, chopx=2.000000
+
+
+    16px    centerline + 0.0666666
+    17px    centerline + 0.1333333
+    18px    centerline + 0
+
+2/3/2004
+    gs does not produce pnggray files that are the correct resolution for an 8.5x11 page.
+    scale factor is 1.063 (DPI larger than requested)
+    Is it only imaging a sub-region of the page?
+    produces the proper resolution:
+        gs-gnu 7.05 daneel 
+        /usr/local/bin/gs 8.11 on moya
+        gs-aladdin 7.04 on moya
+        gs-gnu 7.07 on moya
+        gs-esp 7.07 on moya
+
+    Size/Align/Res combinations that look good:
+        18  0     0.97  Times New Roman
+        17  0     1.03  
+        16  0.5   0.97  
+
+StructuredTextLatex changes:
+    remove ZWikiPage.applyWikiLinkLineEscapesIn (not needed)
+    remove ZWikiPage.protectLine
+    remove ZWikiPage.links (not used)           (note dtml-accessable but not used)
+    remove ZWikiPage.canonicalLinks (not used)  (note dtml-accessable but not used)
+    wikilink() called from DTML should really call ZWikiPage.renderLink
+
+6/4/2004:
+    How to do mathml with tex4ht:
+        1) include:
+            \usepackage[xhtml,mathml,no-DOCTYPE]{tex4ht}
+           in document preamble
+        2) latex $1.tex
+           tex4ht -f/$1.tex -i/usr/share/texmf/tex4ht/ht-fonts/ -cunihtf
+           t4ht -f/$1.tex
+        3) 
+            import sys
+            from xml.dom.ext.reader import Sax2
+            from xml.dom.ext import Print
+
+            reader = Sax2.Reader()
+            document = reader.fromStream(sys.stdin)
+            for math in document.getElementsByTagName('math'):
+                #... math is the MathML, in order it appeared in the document.
+
+        Can use one run of latex if we only look at the last N pages of the dvi
+        file:
+            dvips -p 228
+
+    times on navi:
+    dvips -e 0 may help with characters moving about...
+    latex (w/tex4ht usepackage)                                 0.94s
+           w/o tex4ht usepackage)                               0.25s
+    dvicopy -page-start 228 -max-pages=1 blah.dvi blah2.dvi     0.001s
+    dvips -E blah2.dvi blah2.ps                                 0.06s
+    gs ... (creates a full-page png :()                         0.2s
+        gs creating all images at once: (average of 229p)       0.0947s
+    convert blah2.ps blah2.png                                  0.136s
+
+    The altimg tag may be parsable by XSLT into an img tag.
+    Konqueror is pickier about XML than Mozilla -- use it to check
+MathML rendering errors:
+    mi { margin: -0.15em; } does not get applied to mi's in super/subscript.
+    spacing if <mi>sin</mi> sin is inconsistent -- i-n has more space than s-i.
+6/24/2004:
+    Plone interaction:
+        got plone quick installer working
+
+        Plone uses a <base href="http://localhost/Plone"> tag which gives the
+        WRONG page for the one you're looking at, and makes <a name> links
+        fail.
+
+        restore ALLOWED_PAGE_TYPES_IN_PLONE?  need to remove wwml for plone...
+
+        Plone skin w/header is CMFPlone/skins/plone_templates/header.pt

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/README.txt
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/README.txt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/README.txt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,100 @@
+This is the latexwiki plugin for Zwiki, based on the earlier LatexWiki
+product and patch, that allows you to include LaTeX markup in Zwiki
+pages.  LaTeX is a document typesetting system based on TeX;
+information is available at the LaTeX project homepage
+(http://www.latex-project.org).
+
+The plugin adds a new zwiki page type, "Structured Text + LaTeX"
+(stxlatex), which renders Structured Text
+(http://www.zope.org/Documentation/Articles/STX) and inline LaTeX,
+replacing the latter with appropriate images.  
+
+See LICENSE.txt for copyright and license information.
+
+
+Requirements
+============
+
+This Zwiki+latexwiki version has been tested with 
+
+   * Zope 2.9.x (http://www.zope.org)
+   
+   * Python 2.4.x
+
+   * LocalFS 1.7-andreas (http://www.easyleading.org/Downloads)
+
+   * Ghostscript 7.0.x (http://www.ghostscript.com) with support for the
+     PNG output device
+
+   * A working LaTeX installation including latex and dvips (we use
+     teTex (http://www.tug.org/teTeX) )
+
+   * The Python Imaging Library (http://www.pythonware.com/products/pil)
+
+   * The dvipng (http://sourceforge.net/projects/dvipng) utility (optional --
+     but a big speed improvement (actually, I got an error without it))
+
+For those running large distributions such as Red Hat Linux, many of
+the necessary tools (Ghostscript, LaTeX) are probably already
+installed. For those running FreeBSD, you will find the necessary
+items in the ports tree.  In debian-based systems try::
+
+  apt-get install tetex-base tetex-bin tetex-extra gs zope2.9 python-imaging dvipng
+
+
+Installing LatexWiki standalone
+-------------------------------
+
+  1. Make sure that you have the required components installed (see
+     above) and just install Zwiki as usual. LocalFS will probably
+     need to be installed manually.  (Just untar it into the Zope
+     Products directory.)
+
+  2. If you do not already have a Wiki, create one by going to the Zope
+     management interface and selecting ZWiki from the pulldown in the
+     upper right.  For "Type", select "latexwiki".
+     **WARNING: disabled, for now just make a basic wiki.**
+     
+
+Installing LatexWiki in Plone 
+-----------------------------
+
+**WARNING: CMF/Plone support code needs review & updating**
+
+See also http://zwiki.org/PloneAndCMF .
+
+  1. If needed, create a 'Plone Site' from the dropdown in the ZMI.
+
+  2. Install Zwiki in your plone site using Plone's add/remove products.
+
+  3. If needed, create a Wiki Page.  You may have to press
+     shift-reload in your browser when viewing this new page in order
+     to get the new latexwiki stylesheets that get installed in step
+     2.
+
+I recommend removing one of the two sidebars in Plone.  LatexWiki
+requires a somewhat large font to make latex readable, which looks bad
+when put into Plone's narrow document window between two sidebars.  To
+do this:
+
+  1. Go to your plone folder in the ZMI
+
+  2. Click the "Properties" tab
+
+  3. Delete the lines in either the "right_slots" or "left_slots" properties.
+
+
+Other notes
+-----------
+
+ * You may get better results if you add the properties
+   'latex_font_size' (int), 'latex_align_fudge' (float),
+   'latex_res_fudge' (float), and 'allow_dtml' (boolean) to your wiki
+   folder(s) (and set them to.. ?).  It may be useful to create a new
+   wiki using the latexwiki template for comparison.
+
+ * If you are using Ape or something else (FileSystemSite?) to allow access to
+   the images/ directory, this will still work but the site template will try
+   to create a LocalFS images directory.  Just delete it and replace it with
+   Ape, or whatever.  Appropriate patches to Extensions/setup_latexwiki.py
+   would be appreciated.

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/ReplaceInlineLatex.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/ReplaceInlineLatex.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/ReplaceInlineLatex.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,134 @@
+"""
+Replace Latex math mode/\\begin{}\\end{} blocks with html img tag
+after rendering
+
+$Id: ReplaceInlineLatex.py,v 1.11 2001/09/07 14:21:16 rsbowman Exp $
+
+TODO:
+    use \\ref{shit} to make reference to equations.  Convert \\ref{shit} to the
+    appropriate (number): add negative match to latexPattern for \\ref, do a
+        s/// after generating an equation with a \\label.
+    Separate vertical alignment characters & into a new
+        \\end{equation}\\begin{equation} and then render the separate images in
+        a table to acheive vertical alignment.
+
+"""
+
+import re, os
+from DocumentTemplate.html_quote import html_quote
+from util import fileNameFor, imagesPath, workingDir, getPngSize, runCommand, log
+from string import strip, join, replace
+
+# This will fail on nested blocks \begin{array} \begin{array}...\end{array} \end{array} 
+# It is necessary for this to be all one regex (unfortunately) so that we do
+# not pick up equations inside \begin{latex}...\end{latex}, rather only the
+# outer delimiters.
+latexPattern = r'(?<!\\)(?:\\\\)*(!?\$\$(?:[^\$\\]|\\[^\$\\]|\\\$|\\\\)*?\$\$|!?\$(?:[^\$\\]|\\[^\$\\]|\\\$|\\\\)*?\$|!?\\\((?:[^\\]|\\[^\)]|\\\\)*?\\\)|!?(?:\\begin{ *([^}]+?) *}.*?\\end{ *\2 *}|\\\[(?:[^\\]|\\[^\]]|\\\\)*?\\\]))'
+
+latexRemoveDelim = r'^(?:(\$\$|\$(?!\$))|\\\(|\\begin{[^}]*}|\\\[)(.*)(?:\\\]|\\end{[^}]*}|\\\)|\1)$'
+
+errorMessage = """\n<hr/><font size="-1" color="red">
+Some or all expressions may not have rendered properly,
+because Latex returned the following error:<br/><pre>%s</pre></font>"""
+
+reConsts = re.MULTILINE+re.DOTALL
+def findLatexCode(text,
+                  findLatex=re.compile(latexPattern,
+                                        reConsts).findall,
+                  ):
+    codeList = map(lambda x: x[0], findLatex(text))
+    return codeList
+
+def replaceInlineLatex(body, charheightpx, alignfudge, resfudge, latexTemplate=None):
+    from latexWrapper import renderNonexistingImages
+
+    renumbered   = re.compile(r'[ \t]*\\begin{ *(math|equation|eqnarray) *}')
+    reunnumbered = re.compile(r'[ \t]*(\\begin{ *((math|equation|eqnarray)\*|table|tabular|displaymath|array|latex) *}|\\\[)')
+    body = strip(body)
+    latexCodeList = findLatexCode(body)
+    newlatexCodeList = []
+    eqnum = 0
+    for code in latexCodeList:
+        if code[0]=='!': 
+# We need to identify if we're inside a '' block or an example:: block here.
+            newcode = re.compile('^!', re.MULTILINE).sub('', code)
+            # change the dollar sign so that the replace below does not hit
+            # this code again (in the case of the same code appearing twice,
+            # once escaped, once not)
+            #newcode = re.compile('\$', re.MULTILINE).sub('&#36;', newcode, 2)
+            # prevent stx from mangling asterisks
+            #newcode = re.compile('\*', re.MULTILINE).sub('&#42;', newcode) 
+            # and this will hide \(\), \[\], \begin...\end, including any
+            # equations that may be hiding inside a \begin{latex}..\end{latex}
+            newcode = re.compile(r'\\\[', re.MULTILINE).sub('\\![', newcode)
+            #newcode = re.compile(r'\\', re.MULTILINE).sub('&#92;', newcode)
+            body = replace(body, code, newcode, 1)
+            continue
+        else:
+            newlatexCodeList.append(code)
+        oldcode = code
+        renummatch = renumbered.match(code)
+        if renummatch:
+            eqnum = eqnum + 1
+            code = renumbered.sub('\\\\begin{\\1*}\n\\label{eq%d}' %(eqnum), code, 1)
+            kind = renummatch.group(1)
+            code = re.compile('\\\\end{ *%s *}' %(kind)).sub('\\\\end{%s*}' %(kind), code, 1)
+            code = renumbered.sub('\\\\begin{\\1*}\n\\label{eq%d}' %(eqnum), code, 1)
+# FIXME we really shouldn't do this...it will recreate block equations with different numbers.
+            newlatexCodeList[newlatexCodeList.index(oldcode)] = code
+# FIXME This will also replace any escaped code :(
+            body = replace(body, oldcode, code, 1)
+    errors = renderNonexistingImages(newlatexCodeList, charheightpx, alignfudge, resfudge,
+                                     latexTemplate=latexTemplate)
+    
+    if not errors:
+        for code in newlatexCodeList:
+            labelmatch = re.compile('\\\\label{eq(\\d+)}').search(code, 1)
+            commentedcode = re.compile('^', re.MULTILINE).sub('!', html_quote(code))
+# "--" inside a comment screws up browsers.  But in LaTeX math mode "--" and "- -" are equivalent.
+            commentedcode = re.compile('--', re.MULTILINE).sub('- -', commentedcode)
+            if labelmatch:
+                eqnum = labelmatch.group(1)
+                imageTag = '<a name="eq%s">' %(eqnum)                                 \
+                    + '<table width="100%"><tr><td align="center" width="95%">'       \
+                    + getImageFor(code, charheightpx)                                 \
+                    + '</td><td align="right">(%s)</td></tr></table></a>' %(eqnum)
+            elif reunnumbered.match(code):
+                imageTag = '<a name="unnumbered">'                                    \
+                    + '<table width="100%"><tr><td align="center" width="95%">'       \
+                    + getImageFor(code, charheightpx)                                 \
+                    + '</td><td width="5%" align="right">&nbsp;</td></tr></table></a>'
+            else:
+                imageTag = getImageFor(code, charheightpx)
+            body = replace(body, code, imageTag, 1)
+
+# We try to match the > and < (or ^/$) from the preceeding and trailing tags,
+# so as not to catch the alt="..." from a latex equation
+# FIXME this is slow.  Use something like perl's m/\G/g to iterate over (n)
+        for i in range(1,int(eqnum)+1):
+            body = re.compile(r'((?:>|^)(?:[^<]*\s|))\( *(?:[Ee][Qq]\.)?\s*(%d) *\)([^>]*(?:<|$))' %(i)).sub(r'\1<a href="#eq\2">(\2)</a>\3', body)
+
+    else:
+        body = "<pre>" + body + "</pre>" + errorMessage %(errors)
+
+    # Handle escaping of latex
+    body = re.compile(r'(?<!\\)((?:\\\\)*)\\\$', re.MULTILINE).sub(r'\1$', body)
+    body = re.compile(r'\\\\', re.MULTILINE).sub(r'\\', body)
+    return body
+
+def getImageFor(latexCode, charheightpx):    
+    preamble, postamble = '', ''
+    width, height = '', '' 
+    imageFile = fileNameFor(latexCode, charheightpx, '.png')
+    imageUrl = imagesPath + imageFile
+    width, height = getPngSize(os.path.join(workingDir, imageFile))
+    src = html_quote(re.match(latexRemoveDelim, latexCode, re.MULTILINE|re.DOTALL).group(2))
+    src = re.sub(r'\n\n+', '\n', src) # FIXME collapse blank lines or they will
+    # be interpreted as stx paragraphs -- this is an stx bug since they are
+    # inside a tag.
+    return '%s<img alt="%s" class="equation" src="%s" width="%s" height="%s"/>%s' %(preamble,
+                                                            src,
+                                                            imageUrl,
+                                                            width,
+                                                            height,
+                                                            postamble)

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/ReplaceInlineLatex_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/ReplaceInlineLatex_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/ReplaceInlineLatex_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,28 @@
+import os, os.path
+
+from Products.ZWiki.testsupport import *
+ZopeTestCase.installProduct('ZWiki')
+
+from ReplaceInlineLatex import replaceInlineLatex
+
+IMAGEDIR = os.path.join(INSTANCE_HOME,"var","LatexWiki")
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    return suite
+
+class Tests(ZwikiTestCase):
+    # XXX this is a functional test, we can't run it reliably in unit tests
+    # eg it breaks depending on what user runs tests
+    def Xtest_generate_image_from_latex(self):
+        # image is 19 high on my system.. assume it's alright for now
+        #m = re.match(r'<img alt="a" class="equation" src="images/([^"]*)" width="10" height="8">',
+        m = re.match(r'<img alt="a" class="equation" src="images/([^"]+)" width="10" height="',
+                     replaceInlineLatex('$a$', 17, 0.0, 1.03))
+        # image tag generated ?
+        self.assert_(m)
+        # latexwiki image dir writable ?
+        self.assert_(os.access(IMAGEDIR, os.W_OK))
+        # image file exists ? XXX could have been created by a previous run
+        self.assert_(os.access(os.path.join(IMAGEDIR,m.group(1)), os.R_OK)) 

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/__init__.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/__init__.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/__init__.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,19 @@
+"""
+LatexWiki - LaTeX-supporting page types for ZWiki.
+
+Sean Bowman, Joe Koberg, Bob McElrath, Simon Michael, ...
+
+This is a minimal version, updated for Zwiki 0.52 or thereabouts.
+See ChangeLog for more notes.
+"""
+
+# install the new Zwiki page type
+import stxlatex
+
+# backwards compatibility for old zodb objects
+ZwikiLatexPageType     = stxlatex.PageTypeStxLatex
+ZwikiHtmlLatexPageType = stxlatex.PageTypeStxLatex
+ZwikiItexPageType      = stxlatex.PageTypeStxLatex
+
+# install the default latex wiki
+# not yet

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/latexWrapper.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/latexWrapper.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/latexWrapper.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,312 @@
+### ###
+###
+
+import os, sys, re, zLOG, string, math
+from util import fileNameFor, imageExtension, unique, workingDir, runCommand, log, findinpath
+from PIL import Image, ImageFile, ImageChops, PngImagePlugin
+from cgi import escape
+
+class LatexSyntaxError(Exception): pass
+class LatexRenderError(Exception): pass
+class GhostscriptError(Exception): pass
+class AlignError(Exception): pass
+
+# find our external programs
+dvipngpath = findinpath('dvipng')
+gspath     = findinpath('gs')
+latexpath  = findinpath('latex')
+dvipspath  = findinpath('dvips')
+
+charsizept = 10
+# dvipng and tex use 72.27 points per inch, internally and thus generate the
+# best-looking images.  Postscript uses 72 points per inch.  So if we have to
+# use ghostscript and go through a postscript conversion, there is a resolution
+# mismatch which puts nibs on the tops of letters for many choices of
+# charheightpx.
+if dvipngpath is not None:
+    ptperinch = 72.27
+else:
+    ptperinch = 72
+# Adjust the centerline by this many pixels, key is character height in px
+# This list was determined experimentally.  If anyone has a better algorithm
+# to align images, please contact me.
+centerfudge = dict({ # positive to move up, negative to move down
+    10:0,  11:+1, 12:0,  13:0,  14:0,  15:+2, 16:0, 17:0,  18:0,  19:0,  20:0,
+    21:0,  22:0,  23:+2, 24:0,  25:0,  26:0,  27:0, 28:0,  29:0,  30:0,  31:+1,
+    32:0,  33:+1, 34:0,  35:0,  36:0,  37:0,  38:0, 39:+1, 40:0,  41:+1, 42:-1,
+    43:0,  44:0,  45:0,  46:0,  47:+1, 48:0,  49:0, 50:0,  51:0,  52:-1, 53:0,
+    54:-1, 55:+1, 56:-1, 57:+1, 58:+3, 59:-1, 60:0, 61:-1, 62:-1, 63:+1, 64:-1 
+    })
+
+latexInlinePattern = r'^(\$(?!\$)|\\\()$'
+
+# This is only used if your wiki does not have a node LatexTemplate.
+defaultLatexTemplate = r"""
+\documentclass[%dpt,notitlepage]{article}
+\usepackage{amsmath}
+\usepackage{amsfonts}
+\usepackage[all]{xy}
+\newenvironment{latex}{}{}
+\oddsidemargin -86pt
+\headheight 0pt
+\topmargin -96pt
+\nofiles
+\begin{document}
+\pagestyle{empty}
+%%s
+\end{document}
+"""  % (charsizept)
+
+def imageDoesNotExist(code, charheightpx):
+    return not os.path.exists(os.path.join(workingDir, 
+        fileNameFor(code, charheightpx, imageExtension)))
+
+def renderNonexistingImages(latexCodeList, charheightpx, alignfudge, resfudge, **kw):
+    """ take a list of strings of latex code, render the
+    images that don't already exist.
+    """
+    latexTemplate = (kw.get('latexTemplate', defaultLatexTemplate) or
+                     defaultLatexTemplate)
+    m = re.search(r'\\documentclass\[[^\]]*?(\d+)pt[^\]]*?\]', \
+        latexTemplate)
+    if m:
+        charsizept = int(m.group(1))
+    else:
+        charsizept = 10
+    res = charheightpx*ptperinch/charsizept*resfudge
+    errors = ""
+    codeToRender = filter(lambda x: imageDoesNotExist(x, charheightpx), unique(latexCodeList))
+    if (not codeToRender): return
+    unifiedCode = re.sub(r'^(\$|\\\()', r'\1|~ ', codeToRender[0])
+    for code in codeToRender[1:len(codeToRender)]:
+        unifiedCode = unifiedCode + '\n\\newpage\n' + re.sub(r'^(\$|\\\()', r'\1|~ ', code)
+    try:
+       runLatex(unifiedCode, res, charheightpx, latexTemplate)
+    except LatexSyntaxError, data:
+       errors = str(data)
+       log(errors, 'LatexSyntaxError')
+       # FIXME translate latex line number to source line number
+       return escape(errors)
+
+    fName = fileNameFor(unifiedCode, charheightpx)
+    dviPng(fName, res)
+    for code, i in map(None, codeToRender, range(0, len(codeToRender))):
+        newFileName = fileNameFor(code, charheightpx, imageExtension)
+        imname = '%s-%03d.png'%(fName,i+1)
+        if re.match(r'^(?:\$|\\\()', code): # FIXME make dvipng do the alpha properly
+            im = Image.open(os.path.join(workingDir, imname))
+            try:
+                im = align(im, charheightpx, alignfudge) # returns an RGBA image
+            except (AlignError, ValueError), data:
+                raise LatexRenderError(str(data) + '\nThe code was:\n' + \
+                    code+ '\nin the file %s'%(os.path.join(workingDir, imname)))
+            if im.mode != 'RGBA':
+                alpha = ImageChops.invert(im.convert('L'))
+                im = im.putalpha(alpha)
+            im.save(os.path.join(workingDir, newFileName), "PNG")
+        else:
+            os.rename(os.path.join(workingDir, imname), os.path.join(workingDir, newFileName))
+    os.system('cd %s; rm -f *.log *.aux *.tex *.pdf *.dvi *.ps %s-???.png'%(workingDir, fName))
+    return escape(errors)
+
+def runLatex(code, res, charheightpx, latexTemplate):
+    def ensureWorkingDirectory(path):
+        """Ensure this directory exists and is writable."""
+        if not os.access(path,os.F_OK): os.mkdir(path)
+        if not os.access(path,os.W_OK): os.system('chmod u+rwx %s' % path)
+
+    texfileName = fileNameFor(code, charheightpx, '.tex')
+    dvifileName = fileNameFor(code, charheightpx, '.dvi')
+    psfileName = fileNameFor(code, charheightpx, '.ps')
+    cmdLine = '%s %s' %(latexpath, texfileName)
+
+    ensureWorkingDirectory(workingDir)
+    file = open(os.path.join(workingDir, texfileName), 'w')
+    file.write(latexTemplate %(code,))
+    file.close()
+
+    err, stdout, stderr = runCommand(cmdLine)
+    
+    if err:
+        out = stderr + '\n' + stdout
+        err = re.search('!.*\?', out, re.MULTILINE+re.DOTALL)
+        if err:
+            out = err.group(0)
+# FIXME translate latex line numbers to source line numbers
+        raise LatexSyntaxError(out)
+
+def dviPng(fName, res):
+    input, output = fName+'.dvi', fName+'-%03d.png'
+    gspngfname = fName+'-gs-%03d.png'
+    psfname = fName+'-gs'; i=1
+    # '--truecolor -bg Transparent' generates RGB images with transparent pixel
+    # (not alpha channel) but it's close...
+    if dvipngpath is not None:
+        cmdLine = '%s --truecolor -bg Transparent -picky -D %f -Ttight -o %s %s'%\
+            (dvipngpath, res, output, input)
+        err, stdout, stderr = runCommand(cmdLine)
+        ppredo = []
+        if not err: return
+        # dvipng -picky will give the following message on pages it cannot render
+        # (usually due to the use of postscript specials).  For that we fall
+        # through to ghostscript
+        matcher = re.finditer(r'\[(\d+) not rendered\]', stdout)
+        for m in matcher:
+            if ppredo: ppredo += ','
+            ppredo.append(m.group(1))
+        ppopt = '-pp ' + string.join(ppredo,',')
+    else:
+        ppopt = ''
+    cmdLine = '%s %s -R -D %f -o %s %s'%(dvipspath, ppopt, res, psfname+'.ps', input)
+    err, stdout, stderr = runCommand(cmdLine)
+    if err:
+        log('%s\n%s\n%s\n'%(err, stdout, stderr), 'DVIPSError')
+        raise DVIPSError(stderr+'\n'+stdout)
+    if not ppopt:
+        ppredo = range(1,len(re.findall(r'\[\d+\]', stderr))+1)
+    err = runGhostscript(psfname, res, 'pngalpha')
+    center(psfname, res)
+    for page in ppredo:
+        oldfname = os.path.join(workingDir, gspngfname%i)
+        newfname = os.path.join(workingDir, output%int(page))
+        os.rename(oldfname, newfname)
+        i += 1
+
+def runGhostscript(fName, res, device):
+    input, output = fName+'.ps', fName+'-%03d.png'
+    cmdLine = '%s -dDOINTERPOLATE -dTextAlphaBits=4 '%gspath + \
+              '-dGraphicsAlphaBits=4 -r%f -sDEVICE=%s ' + \
+              '-dBATCH -dNOPAUSE -dQUIT -sOutputFile=%s %s '
+    cmdLine = cmdLine %(res, device, output, input)
+    err, stdout, stderr = runCommand(cmdLine)
+    if err:
+        log('%s\n%s\n%s\n'%(err, stdout, stderr), 'GhostscriptError')
+        raise GhostscriptError(stderr+'\n'+stdout)
+    return stderr # when using bbox, BoundingBox is on stderr
+
+# assumes png's already created
+def center(fName, res):
+    bboxes = re.split('\n', runGhostscript(fName, res, 'bbox'))
+    pngfname = fName+'-%03d.png'
+    for i in range(0, len(bboxes)/2):
+        file = pngfname%(i+1)
+        start_x, start_y, end_x, end_y = map(float, 
+            re.match(r'%%HiResBoundingBox: ([0-9\.]+) ([0-9\.]+) ([0-9\.]+) ([0-9\.]+)', 
+                bboxes[2*i+1]).groups())
+        xsize = int(round(((end_x - start_x) * res)/ptperinch))
+        ysize = int(round(((end_y - start_y) * res)/ptperinch))
+        if (xsize <= 0): xsize = 1
+        if (ysize <= 0): ysize = 1
+        start_x = int(round(start_x*res/ptperinch))
+        start_y = int(round(start_y*res/ptperinch))
+        im = Image.open(os.path.join(workingDir, file))
+        cropdim = (start_x, im.size[1]-start_y-ysize, start_x+xsize, im.size[1]-start_y)
+        cropdim = map(int, map(round, cropdim))
+        im = im.crop(cropdim)
+        im2 = Image.new('RGBA', im.size, (255,255,255))
+        im2.paste(im, (0, 0))
+        if im.mode != 'RGBA':
+            alpha = ImageChops.invert(im2.convert('L'))  # Image should already have an alpha
+            im3 = Image.new('RGBA', im.size, (0,0,0))
+            im3.putalpha(alpha)
+            im2 = im3
+        im2.save(os.path.join(workingDir, file), "PNG")
+
+def align(im, charheightpx=0, alignfudge=0):
+    dotstartx = -1; dotendx = -1; dotstarty = -1; dotendy = -1
+    widentop = 0; widenbottom = 0; letterstartx = -1; chopx = 0
+    if im.mode == 'P':
+        white = 0
+    elif im.mode == 'RGB':
+        white = (255,255,255)
+    elif im.mode == 'RGBA':
+        white = (254,254,254,0) # as output by ghostscript pngalpha device
+    elif im.mode == 'L':
+        white = 255 # FIXME I think
+    for x in range(0,im.size[0]):  # Try to find the leading dot
+        if(dotendy < 0) :
+            for y in range(0, im.size[1]):
+                if(dotstarty >= 0 and dotendy < 0): 
+                    if(im.getpixel((x,y)) == white):
+                        dotendy = y
+                        break
+                if(dotstarty < 0 and im.getpixel((x,y)) != white):
+                    dotstartx = x
+                    dotstarty = y
+            else:
+                if dotstarty >= 0 and dotendy < 0:
+                    dotendy = im.size[1]
+        elif(dotendx < 0):
+            maybedotendx = x
+            for y in range(dotstarty, dotendy):
+                if(im.getpixel((x,y)) != white):
+                    maybedotendx = -1
+            if maybedotendx > 0:
+                dotendx = x
+        else:
+            for y in range(0,im.size[1]):
+                if(im.getpixel((x,y)) != white):
+                    letterstartx = x
+                    break
+            if letterstartx>0: break
+    else: # failed to find letterstartx
+        log('dotstartx=%d, dotendx=%d, dotstarty=%d, dotendy=%d, letterstartx=%d\n'
+            %(dotstartx, dotendx, dotstarty, dotendy, letterstartx))
+        log('Unable to find dot. (size=%dx%d)\n'%(im.size[0],im.size[1]), 'renderNonExistingImages')
+        raise AlignError('Image appears to be blank or not have an alignment dot.')
+    centerline = (dotendy-dotstarty)/2.0    # increase centerline to move char up WRT text
+    dotcenter = (dotendy-dotstarty)*7.0/144.0
+    centerline += dotcenter
+    if centerfudge.has_key(charheightpx):
+        centerline += centerfudge[charheightpx]/2.0
+    # if dot is not pixel-aligned, take that into account
+    # sum pixels above and below (dotendy-dotstarty)/2
+    dottophalf = 0
+    dotlinesize = dotendx-dotstartx
+    dottoplines = 0
+    for y in range(dotstarty, int(math.ceil(dotstarty+(dotendy-1-dotstarty)/2.0))):
+        dottoplines += 1
+        for x in range(dotstartx, dotendx):
+            dottophalf += cabs(im.getpixel((x,y)))
+        break
+    else:
+        dottophalf = 1 # dot was 1px high
+    dotbottomhalf = 0
+    for y in range(dotendy-1, dotstarty+(dotendy-1-dotstarty)/2,-1):
+        for x in range(dotstartx, dotendx):
+            dotbottomhalf += cabs(im.getpixel((x,y)))
+        break
+    else:
+        dotbottomhalf = 1 # dot was 1px high
+    if(dottophalf != 0.0 and dotbottomhalf != 0):
+        dotpixmiss = float(dottophalf-dotbottomhalf)/(dottophalf+dotbottomhalf)
+    else:
+        dotpixmiss = 0.0
+    centerline += dotpixmiss 
+    centerline += alignfudge # user parameter -- FIXME remove?
+    bottomsize = im.size[1]-centerline               # pixels below midline
+    topsize = centerline                             # pixels above midline
+    if(topsize > bottomsize):
+        newheight = 2*topsize
+        widenbottom = topsize - topsize
+    else: 
+        newheight = 2*bottomsize
+        widentop = bottomsize - topsize
+    chopx = letterstartx-1
+    newheight= int(newheight)
+    widentop = 0 #int(widentop) #SKWM broken
+    im2 = Image.new('RGBA', (im.size[0]-chopx,newheight), (255,255,255))
+    im2.paste(im,(-chopx,widentop,im.size[0]-chopx,im.size[1]-widentop))
+    return im2
+
+def cabs(A):
+    sq = 0.0
+    if type(A) == type(()):
+        for i in range(0,3):
+            sq += A[i]*A[i]
+        if len(A) == 4:
+            return math.sqrt(sq)*(A[3]/255.0)
+        else:
+            return math.sqrt(sq)
+    else:
+        return A

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/stxlatex.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/stxlatex.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/stxlatex.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,49 @@
+import re
+from types import *
+from urllib import quote,unquote
+
+from Products.ZWiki.Utils import BLATHER, formattedTraceback, html_quote
+from Products.ZWiki.pagetypes import registerPageType, registerPageTypeUpgrade
+from Products.ZWiki.pagetypes.common import *
+from Products.ZWiki.pagetypes.stx import PageTypeStx
+from Products.ZWiki.I18n import _
+
+from util import defaultcharsizepx, workingDir, runCommand, findinpath
+from ReplaceInlineLatex import replaceInlineLatex
+
+
+class PageTypeStxLatex(PageTypeStx):
+    """
+    A page type like the Structured Text page type, with LaTeX support added.
+    """
+    _id = 'stxlatex'
+    _name = 'Structured Text + LaTeX'
+    supportsLaTeX = yes
+    supportsPlone = yes
+
+    def preRender(self, page, text=None):
+        t = text or (page.document()+'\n'+MIDSECTIONMARKER+\
+                     self.preRenderMessages(page))
+        t = page.applyWikiLinkLineEscapesIn(t)
+        # Be more generous in STX for links...so they can contain equations
+        t = re.sub(r'(^| )(?ms)"([^"]*)":(http://[-:A-Za-z0-9_,./\?=@#~&%()]*?)([.!?,;](?= )|(?= )|$)',\
+            r'\1<a href="\3">\2</a>\4',t)
+        # render latex
+        # FIXME and the same for WikiLinks (harder)
+        latexTemplate = None
+        latexTemplatePage = getattr(page.folder(),
+                                    'LatexTemplate', None)
+        if latexTemplatePage:
+            latexTemplate = latexTemplatePage.text()
+        t = replaceInlineLatex(t, getattr(page.folder(),'latex_font_size',defaultcharsizepx), \
+                                  getattr(page.folder(),'latex_align_fudge',0), 
+                                  getattr(page.folder(),'latex_res_fudge',1.03), latexTemplate)
+        # render stx
+        t = self.format(t)
+        t = page.markLinksIn(t)
+        t = self.protectEmailAddresses(page,t)
+        # add a CSS class to the whole thing
+        t = '<div class="latexwiki">\n' + t + '\n</div>\n'
+        return t
+
+registerPageType(PageTypeStxLatex)

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/util.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/util.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/util.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,134 @@
+
+import os, sys, re, zLOG, popen2, select, fcntl, string
+from struct import pack, unpack
+
+## path to use as src prefix in img tag
+imagesPath = 'images/'
+# Actual location of images
+workingDir = sys.modules['__builtin__'].CLIENT_HOME + '/LatexWiki'
+# Default character size, if the user doesn't specify 
+defaultcharsizepx = 18
+
+imageExtension = '.png'
+
+def fileNameFor(latexCode, size, extension=''):
+    return '%s-%spx%s' %(abs(hash(latexCode)), size, extension)
+
+def getPngSize(fname,
+               magicBytes=pack('!BBBBBBBB', 137, 80, 78, 71, 13, 10, 26, 10)):
+    f = file(fname, 'r')
+    buf = f.read(24)
+    f.close()
+    assert buf[:8] == magicBytes, 'in getPngSize, file not a PNG!'
+    return tuple(map(int, unpack('!LL', buf[16:24])))
+
+def log(message,summary='',severity=0):
+        zLOG.LOG('LatexWikiDebugLog',severity,summary,message)
+
+# Make our file descriptors nonblocking so that reading doesn't hang.
+def makeNonBlocking(f):
+    fl = fcntl.fcntl(f.fileno(), fcntl.F_GETFL)
+    fcntl.fcntl(f.fileno(), fcntl.F_SETFL, fl | os.O_NONBLOCK)
+    
+def runCommand(cmdLine, input=None):
+    program = popen2.Popen3('cd %s; '%(workingDir) + cmdLine, 1)
+    if input:
+        program.tochild.write(input)
+    program.tochild.close()
+    makeNonBlocking(program.fromchild)
+    makeNonBlocking(program.childerr)
+    stderr = []
+    stdout = []
+    erreof = False
+    outeof = False
+    while(not (erreof and outeof)):
+        readme, writme, xme = select.select([program.fromchild, program.childerr], [], [])
+        for output in readme:
+            if(output == program.fromchild):
+                text = program.fromchild.read()
+                if(text == ''): outeof = True
+                else: stdout.append(text)
+            elif(output == program.childerr):
+                text = program.childerr.read()
+                if(text == ''): erreof = True
+                else: stderr.append(text)
+    status = program.wait()
+    error = os.WEXITSTATUS(status) or not os.WIFEXITED(status)
+    return error, string.join(stdout, ''), string.join(stderr, '')
+
+def findinpath(exe):
+    paths = [exe]
+    paths.extend( \
+      map(lambda x: os.path.join(x,exe), re.split(':', os.getenv('PATH'))))
+    for path in paths:
+        if os.access(path, os.X_OK): break
+        path = None
+    return path
+
+def unique(s):
+     """Return a list of the elements in s, but without duplicates.
+
+     For example, unique([1,2,3,1,2,3]) is some permutation of [1,2,3],
+     unique("abcabc") some permutation of ["a", "b", "c"], and
+     unique(([1, 2], [2, 3], [1, 2])) some permutation of
+     [[2, 3], [1, 2]].
+
+     For best speed, all sequence elements should be hashable.  Then
+     unique() will usually work in linear time.
+
+     If not possible, the sequence elements should enjoy a total
+     ordering, and if list(s).sort() doesn't raise TypeError it's
+     assumed that they do enjoy a total ordering.  Then unique() will
+     usually work in O(N*log2(N)) time.
+
+     If that's not possible either, the sequence elements must support
+     equality-testing.  Then unique() will usually work in quadratic
+     time.
+     """
+
+     n = len(s)
+     if n == 0:
+         return []
+
+     # Try using a dict first, as that's the fastest and will usually
+     # work.  If it doesn't work, it will usually fail quickly, so it
+     # usually doesn't cost much to *try* it.  It requires that all the
+     # sequence elements be hashable, and support equality comparison.
+     u = {}
+     try:
+         for x in s:
+             u[x] = 1
+     except TypeError:
+         del u  # move on to the next method
+     else:
+         return u.keys()
+
+     # We can't hash all the elements.  Second fastest is to sort,
+     # which brings the equal elements together; then duplicates are
+     # easy to weed out in a single pass.
+     # NOTE:  Python's list.sort() was designed to be efficient in the
+     # presence of many duplicate elements.  This isn't true of all
+     # sort functions in all languages or libraries, so this approach
+     # is more effective in Python than it may be elsewhere.
+     try:
+         t = list(s)
+         t.sort()
+     except TypeError:
+         del t  # move on to the next method
+     else:
+         assert n > 0
+         last = t[0]
+         lasti = i = 1
+         while i < n:
+             if t[i] != last:
+                 t[lasti] = last = t[i]
+                 lasti += 1
+             i += 1
+         return t[:lasti]
+
+     # Brute force is all that's left.
+     u = []
+     for x in s:
+         if x not in u:
+             u.append(x)
+     return u

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/FrontPage.stxlatex
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/FrontPage.stxlatex	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/FrontPage.stxlatex	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,74 @@
+**Welcome!** 
+
+This is the front page of the LatexWiki wiki template.  
+Here are the HelpPage, RecentChanges, UserOptions and
+<a href="FrontPage/map">contents</a>.  
+
+You'll find additional Zwiki documentation at ZWiki:ZwikiDocs, including
+ZWiki:ReleaseNotes, ZWiki:KnownIssues and the ZWiki:ZwikiTracker.
+ZWiki:GeneralDiscussion and the #zope IRC channel are good places to get
+help.
+
+"Edit":FrontPage/editform this page and replace it with something
+appropriate. 
+Other things you may want to configure (or not):
+
+- **LaTeX fonts** <br/>
+LaTeX font size is configured in the 'properties' panel for this page's
+folder.  'latex_font_size' specifies the size in pixels of the LaTeX fonts,
+'latex_align_fudge' adjusts LaTeX equations up and down with respect to the
+surrounding text, and 'latex_res_fudge' adjusts the ghostscript resolution to
+improve LaTeX font appearance.  Combinations which work well are (18, 0, 0.97),
+(17, 0, 1.03), and (16, 0.5, 0.97).  Browser fonts can be adjusted on a per-user
+basis in UserOptions.
+
+- **Permissions** <br/>
+To view this wiki, users need 'View' and 'Access content information'
+permissions on the folder. To create new pages they need 'Add ZWiki Page'
+permission; to upload files, 'Add Documents, Images, and
+Files'. Permissions to add comments, edit, reparent etc. all begin with
+'Zwiki: ' and appear at the end of the permissions list.
+
+- **Mail out (subscription)** <br/>
+Set up a zope !MailHost object and add a 'mail_from' folder string property
+containing a valid From address.  A "subscribe" link will appear in the
+page footer. You may want to add the ZWiki:MailHostFix to make Bcc work.
+
+- **Mail in** <br/>
+You'll need to set up a special mail alias, a zope helper method, a
+default discussion page and 'mail_to'/'mail_replyto' folder
+properties. Users will be able to reply to comments by mail.
+See ZWiki:WikiMail.
+
+- **External (client-side) editing** <br/> 
+Install the ZWiki:ExternalEditor zope product and make sure users have the
+'Use external editor' permission (and the WebDAV lock/unlock permissions
+if you are using locking locking). EE's pencil icon will appear in the
+page footer.  Users will probably be able to edit pages with their
+preferred editor after installing EE's client helper app.
+
+- **A bug tracker** <br/>
+An issue tracking database integrated with the wiki. 
+See ZWiki:HowToInstallAZwikiTracker
+
+- **A more featureful front page** <br/>
+Eg showing latest comments from other pages.
+See ZWiki:FrontPage source for ideas
+
+- **Security** <br/>
+ If you allow untrusted users to edit your wiki, you should be aware of
+ the <a
+ href="http://www.zope.org/Members/jim/ZopeSecurity/ServerSideTrojan"
+ >server-side trojan issue</a>.  Unless carefully configured Zwiki may
+ allow users to create content (eg DTML or javascript) which will be
+ executed when viewed by others. For example, DTML code could delete other
+ zope objects to which it has access (restricted to the lowest of the page
+ owner and the page viewer's privileges).  Tips: make the wiki folder's
+ owner a low-privileged user, set the standard_page_type folder property
+ to a non-DTML page type, remove or disable editing on any DTML-enabled
+ pages, deny 'Zwiki: Change page types' permission.  Decide for yourself
+ whether these steps are necessary, or keeping backups will suffice, or <a
+ href="http://c2.com/cgi/wiki?YouArentGonnaNeedIt">YAGNI</a> applies.
+
+Enjoy your wiki!
+

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/HelpPage.stxlatex
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/HelpPage.stxlatex	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/HelpPage.stxlatex	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,179 @@
+This help page corresponds to Zwiki version 0.26.0.
+<dtml-var "'(This site is running '"><dtml-var zwiki_version><dtml-var "').'">
+Links beginning with "!ZWiki:..." lead to additional documentation on
+zwiki.org.
+
+"What's going on here ?":#whatisthis <br />
+"User interface":#ui <br />
+"Navigation":#navigation <br />
+"Subscription":#email <br />
+"Editing":#editing <br />
+"Formatting rules in a nutshell":#rules <br />
+"Finding out more":#more <br />
+
+<a name="whatisthis">What's going on here ?
+
+  This site is a wiki - a kind of collaborative website. (*wiki wiki* means quick.)
+  This site is running the Zwiki software - see ZWiki:WhatIsZwiki for more about that.
+
+  Wikis try to put as little as possible in the
+  way of people sharing useful content - often text, but also pictures and files.
+  Wikis are usually wide open and assume a cooperating community,
+  which in practice tends to work well.
+  Anyone can edit, add comments, and make new pages on the spot.
+  Like any medium, there are best practices which you'll discover in due course.
+
+  Intuitive naming and text formatting rules are used to simplify the process of
+  writing and linking pages.
+  The idea is to keep the text that people edit simple, so it's readable
+  as is, and, most importantly, editable by anyone, without sacrificing
+  attractive presentation.
+
+  Zwiki sites can also send out and receive comments and edits by email, 
+  effectively acting as a mail list where you can subscribe to topics of interest. 
+  If enabled, you'll see a "subscribe" link on each page.
+
+  For some basic definitions, try the ZWiki:ZwikiGlossary.
+
+<a name="ui">User interface
+
+  Zwiki's UI is quite customizable; the default interface with all permissions granted is described here.
+  (Currently, the major zwiki skins are "default":http://zwiki.org , 
+  "plone":http://plone.zwiki.org , and "commonplace":http://commonplacebook.org .)
+
+  If you see "full", "simple", "minimal" links, you can click them
+  to adjust the level of detail on screen.   Tip: if you can't
+  see one of the features described here, try clicking "full".
+  
+  You can set your user name, time zone and UI preferences in UserOptions ("preferences").
+
+<a name="navigation">Navigation
+
+  Each page in a wiki has a unique name, most often a WikiName - 
+  two or more capitalized words joined together
+  (Zwiki also allows trailing digits). 
+  When a page name appears in wiki text, it forms a link to that page.
+  If the page does not yet exist, a ? creation link will appear.
+
+  Pages may also have a [Free-form name],
+  which can be (almost) any word or phrase. 
+  Links which look like two wikinames joined by a colon lead to another site
+  (ZWiki:RemoteWikiLinks).
+
+  Zwiki additionally arranges pages in a hierarchy. You'll see this when browsing in full
+  mode.
+
+  - To return to the front page, click the site logo
+
+  - To see the page hierarchy, click "contents"
+
+  - To see an alphabetic index, click "index"
+
+  - To see recent activity in the wiki, click "changes"
+
+  - To see which pages link to this one, click the page title
+
+  - To see the recent edits to this page, click the "last edited by" link
+
+  - To jump to a known or semi-known page, enter the first part of it's name after the
+  last / in your browser's address field. Capitalization and spacing don't matter.
+
+  - To search the names and text of all pages, type in the search field and press enter
+
+  With a modern browser, you can use convenient quick-access keys 
+  (keyboard shortcuts) to navigate - see ZWiki:QuickReference.
+
+  See also ZWiki:HowToFindThings.
+
+<a name="email">Subscription
+
+  If you see a "subscribe" link, you can subscribe to this page or
+  the whole wiki to receive comments by mail, as follows: 
+
+  1. Click "subscribe"
+
+  2. if needed, enter your email address and click "Change"
+
+  3. click the button to toggle your page or wiki subscription status
+    (green means you are subscribed).
+
+  If configured by the site admin, subscribers may also send comments by mail.
+  Just reply to a comment, or send mail to the wiki's mail-in address.
+  Your mail will go to the page named in brackets in the subject
+  (or to a default page).
+
+<a name="editing"> Editing
+
+  You have full editing rights to any page, unless restricted by the site
+  admin. Note your comments may be received by many subscribers. To avoid
+  this, please use SandBox for testing.
+
+  - Add a comment using the form at the bottom of the page
+
+  - Click "edit" to change the page's text.
+    You may also be able to rename the page, upload a file, or choose other options here.
+  
+  - Create a new page by writing it's name on an existing page
+    (free-form names must be enclosed in brackets), 
+    then clicking the question mark which will appear beside it.
+
+  - In full mode, visit the backlinks screen to reparent the page
+    (place it in the hierarchy)
+
+  - After you have configured a user name, in full mode you may also use the 
+    page management form at the bottom of the screen to reparent, rename and delete pages. 
+
+
+<a name="rules"> 
+<table align="center" style="background-color:#eeeeff;border=thin black solid;padding=10;" width="75%" border=1><tr><td>
+
+Formatting rules in a nutshell
+
+   When you save a page, Zwiki normally applies standard ZWiki:TextFormattingRules - 
+   most often ZWiki:StructuredText, which is described here;
+   wiki linking rules; and some additional formatting for comments.
+
+   1. non-blank lines are run together to form a paragraph; 
+      paragraphs are separated by blank lines<br />
+
+   2. a one-line "paragraph" followed by a more-indented paragraph makes a
+      heading. Tip: you need only indent the first line.<br />
+
+   3. a paragraph beginning with - or a number followed by a space makes a bullet
+      or numbered list item; a more-indented list item starts a sub-list<br />
+
+   4. short text enclosed in 
+      &#42;...&#42; , 
+      &#42;&#42;...&#42;&#42; , 
+      &#95;...&#95; or 
+      &#39;...&#39; is *italic*, **bold**, _underlined_ or 'monospaced' respectively<br />
+
+   5. WikiName's, [Free-form name]s enclosed in brackets, ZWiki:RemoteWikiLinks , 
+      http://bare/urls , and "Structured Text links":http://zwiki.org/StructuredText are
+      made into hyperlinks
+
+   6. HTML tags may be added if necessary; on sites which permit it,
+      DTML (server-side code) may also be used <br />
+
+   7. short text enclosed in single quotes is quoted, ie
+      displayed in monospace font and protected from some of the above formatting. 
+      For reliable quoting of a body of text, indent it after a paragraph 
+      ending with a double colon ::
+
+       Like this (edit this page to see source).
+       This is the surest way to prevent WikiLinks, <HTML tags> and &dtml-tags;
+        and preserve
+         fixed-width formatting.
+
+   8. don't bother trying to learn all the text formatting rules and 
+      their interactions. Mimic the text around you;
+      when it does something unexpected, tweak it until it looks right; 
+      go to the docs or ask for help when you get really stuck or curious.
+
+</td></tr></table>
+
+<a name="more"> Finding out more
+
+  More about Zwiki: start at http://zwiki.org .
+
+  More about wiki in general: WikiWikiWeb:FrontPage , WikiWikiWeb:EvolutionOfaWikizen

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/LaTeX.stxlatex
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/LaTeX.stxlatex	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/LaTeX.stxlatex	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,85 @@
+LaTeX ... is the world standard for writing technical documents.  Authors in
+science and engineering are probably already familiar with it (or should be).
+If you've wrestled with and cursed at "equation editors", you will love LaTeX.
+
+What is most relevant for this site is *math*.  Citations are also under
+development (but this will be physics specific initially, for me), see my TODO.
+The following is borrowed from Winston Chang's "Latex cheat
+sheet":http://www.stdout.org/~winston/latex/.
+
+Math mode:
+
+  To use math mode in-line with text, surround the equation with &#36;, like
+  this !$x^2$ to make: $ x^2 $, or !\( x^2 \).  <br/>
+  To make a block equation use !\begin{equation} ...  \end{equation} like this:
+  \begin{equation}
+    x^2
+  \end{equation}
+  To make a block equation that is not numbered, use !\begin{equation*} ...
+  \end{equation*} or !\[ ... \] like this:
+  \begin{equation*}
+    x^2
+  \end{equation*}
+
+Basic constructs:
+
+\begin{tabular}{@{}l@{\hspace{1em}}l@{\hspace{2em}}l@{\hspace{1em}}l@{}}
+\verb!^{x}!             &  Superscript$^{x}$ &
+\verb!_{x}!             &  Subscript$_{x}$ \\
+\verb!\frac{x}{y}!      &  $\frac{x}{y}$ &
+\verb!\sum_{k=1}^n!     &  $\sum_{k=1}^n$ \\
+\verb!\sqrt[n]{x}!      &  $\sqrt[n]{x}$ &  \\
+\end{tabular}
+
+Math-mode symbols (this is a subset):
+
+\begin{tabular}{@{}l@{\hspace{1em}}l@{\hspace{2em}}l@{\hspace{1em}}l@{\hspace{2em}}l@{\hspace{1em}}l@{}}
+$\leq$          &  \verb!\leq!  &
+$\geq$          &  \verb!\geq!  &
+$\neq$          &  \verb!\neq!  \\
+$\cdot$         &  \verb!\cdot!  &
+$\times$        &  \verb!\times!  &
+$\div$          &  \verb!\div!  \\
+$\ast$          &  \verb!\ast!  &
+$\circ$         &  \verb!\circ!  &
+$\cdots$        &  \verb!\cdots!  \\
+$\alpha$        &  \verb!\alpha!  &
+$\beta$         &  \verb!\beta!  &
+$\gamma$        &  \verb!\gamma!  \\
+$\delta$        &  \verb!\delta!  &
+$\epsilon$      &  \verb!\epsilon!  &
+$\varepsilon$   &  \verb!\varepsilon!  \\
+$\zeta$         &  \verb!\zeta!  &
+$\eta$          &  \verb!\eta!  &
+$\theta$        &  \verb!\theta!  \\
+$\vartheta$     &  \verb!\vartheta!  &
+$\iota$         &  \verb!\iota!  &
+$\kappa$        &  \verb!\kappa!  \\
+$\lambda$       &  \verb!\lambda!  &
+$\mu$           &  \verb!\mu!  &
+$\nu$           &  \verb!\nu!  \\
+$\xi$           &  \verb!\xi!  &
+$\pi$           &  \verb!\pi!  &
+$\rho$          &  \verb!\rho!  \\
+$\sigma$        &  \verb!\sigma!  &
+$\tau$          &  \verb!\tau!  &
+$\upsilon$      &  \verb!\upsilon!  \\
+$\phi$          &  \verb!\phi!  &
+$\chi$          &  \verb!\chi!  &
+$\psi$          &  \verb!\psi!  \\
+$\omega$        &  \verb!\omega!  &
+$\Gamma$        &  \verb!\Gamma!  &
+$\Delta$        &  \verb!\Delta!  \\
+$\Theta$        &  \verb!\Theta!  &
+$\Lambda$       &  \verb!\Lambda!  &
+$\Xi$           &  \verb!\Xi!  \\
+$\Pi$           &  \verb!\Pi!  &
+$\Sigma$        &  \verb!\Sigma!  &
+$\Upsilon$      &  \verb!\Upsilon!  \\
+$\Phi$          &  \verb!\Phi!  &
+$\Psi$          &  \verb!\Psi!  &
+$\Omega$        &  \verb!\Omega!  \\
+\end{tabular}
+
+Any other LaTeX environments work as well including array, tabular (the above
+is tabular), and will be presented in HTML as an un-numbered block.

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/LatexTemplate.txt
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/LatexTemplate.txt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/LatexTemplate.txt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,17 @@
+%% This file is used as a python printf() string.  As such, the document we are
+%% trying to render is placed at the location of the percent-s below, and any
+%% comments in this file must be preceeded by TWO percent signs.
+
+\documentclass[10pt,notitlepage]{article}
+\usepackage{amsmath}
+\usepackage{amsfonts}
+\usepackage[all]{xy}
+\newenvironment{latex}{}{}
+\oddsidemargin -86pt
+\headheight 0pt
+\topmargin -96pt
+\nofiles
+\begin{document}
+\pagestyle{empty}
+%s
+\end{document}

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/UserOptions.stxlatex
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/UserOptions.stxlatex	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/UserOptions.stxlatex	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,305 @@
+<p>
+  Set your site preferences below. You may also click the full, simple, minimal 
+  links if provided.
+</p>
+
+<dtml-comment>with REQUEST needed in plone/cmf for some reason I can't fathom
+</dtml-comment>
+<dtml-with REQUEST>
+<dtml-let 
+ RESPONSE="REQUEST.RESPONSE"
+ cookielist="[
+   'zwiki_username',
+   'email',
+   'zwiki_height',
+   'zwiki_width',
+   'zwiki_timezone',
+   'zwiki_showlogo',
+   'zwiki_showsearch',
+   'zwiki_showhierarchy',
+   'zwiki_showpagemgmt',
+   'zwiki_displaymode',
+   'latexwiki_font',
+   'latexwiki_fontadjust',
+   ]
+   #multi-skin setup, see ZwikiSkins
+   #'skin',
+   #'zwiki_theme',
+   #]
+   ">
+<dtml-if setcookies>
+<dtml-let e="(ZopeTime() + 365).rfc822()">
+<dtml-in cookielist prefix=x>
+<dtml-if "_.has_key(x_sequence_item)">
+<dtml-call "RESPONSE.setCookie(x_sequence_item, REQUEST.get(x_sequence_item), 
+                               path='/', expires=e)">
+<dtml-comment>use path=wiki_url() if you want per-wiki cookies</dtml-comment>
+</dtml-if>
+</dtml-in>
+</dtml-let>
+<dtml-call "RESPONSE.redirect(REQUEST.get('redirectURL',pageUrl()))">
+<dtml-elif clearcookies>
+<dtml-in "cookielist+['zwiki_bookmarks','zwiki_showquote']" prefix=x>
+<dtml-call "RESPONSE.expireCookie(x_sequence_item,path='/')">
+</dtml-in>
+<dtml-comment>reload page to get a REQUEST with the new cookie values
+</dtml-comment>
+<dtml-call "RESPONSE.redirect(REQUEST.get('redirectURL',pageUrl()))">
+</dtml-if>
+</dtml-let>
+<form action="&dtml-URL;" METHOD="POST" ENCTYPE="multipart/form-data"
+style="border:none;">
+
+<p>
+User name: <input type="text" name="zwiki_username" size=20
+maxlength=20 tabindex=3 value="<dtml-var zwiki_username missing>">
+(identifies your edits)
+
+<p>
+Email address: <input type="text" name="email" size=20 maxlength=40 tabindex=4
+value="<dtml-var email missing>"> 
+(for subscribing)
+
+<p>
+Editform
+width: <input type="text" name="zwiki_width" size=3 maxlength=3 tabindex=1
+value="<dtml-var zwiki_width missing=60>"> 
+height: <input type="text" name="zwiki_height" size=3 maxlength=3 tabindex=2
+value="<dtml-var zwiki_height missing=20>">
+(textarea dimensions; width will be 100% if supported)
+
+<p>
+Time zone: 
+<dtml-let 
+now=ZopeTime
+timezones="(
+'GMT-1100',
+'GMT-1030',
+'GMT-1000',
+'GMT-0930',
+'GMT-0900',
+'GMT-0830',
+'GMT-0800',
+'GMT-0730',
+'GMT-0700',
+'GMT-0630',
+'GMT-0600',
+'GMT-0530',
+'GMT-0500',
+'GMT-0430',
+'GMT-0400',
+'GMT-0330',
+'GMT-0300',
+'GMT-0230',
+'GMT-0200',
+'GMT-0130',
+'GMT-0100',
+'GMT',
+'GMT+0100',
+'GMT+0130',
+'GMT+0200',
+'GMT+0230',
+'GMT+0300',
+'GMT+0330',
+'GMT+0400',
+'GMT+0430',
+'GMT+0500',
+'GMT+0530',
+'GMT+0600',
+'GMT+0630',
+'GMT+0700',
+'GMT+0730',
+'GMT+0800',
+'GMT+0830',
+'GMT+0900',
+'GMT+0930',
+'GMT+1000',
+'GMT+1030',
+'GMT+1100',
+'GMT+1130',
+'GMT+1200',
+'GMT+1230',
+'GMT+1300',
+)"
+userzone="REQUEST.get('zwiki_timezone',None)"
+userzone="((userzone in timezones) and userzone) or 'GMT'"
+>
+Your local time is 
+<select name="zwiki_timezone" tabindex=5>
+<dtml-in timezones prefix=x>
+<option value="&dtml-x_sequence_item;"
+<dtml-if "userzone == x_sequence_item">selected</dtml-if>
+>
+<dtml-comment>cf IssueNo0595
+<dtml-try><dtml-var "now.toZone(x_sequence_item).ISO()"><dtml-except></dtml-try> 
+</dtml-comment>
+<dtml-var "now.toZone(x_sequence_item).ISO()">
+ (&dtml-x_sequence_item;)
+</dtml-in>
+</select>
+(localizes most times)
+</dtml-let>
+
+<dtml-comment>
+<p>
+Bookmarks: 
+<input type="text" name="zwiki_bookmarks" size=60 maxlength=1000 tabindex=6
+value="<dtml-var zwiki_bookmarks html_quote 
+missing="">">
+<br />
+(appear in footer; konqueror users, separate your bookmarks with , not space)
+</dtml-comment>
+
+<p>
+Show logo ? 
+<select name="zwiki_showlogo" tabindex=10>
+  <option value="">No</option>
+  <option value="1" 
+  <dtml-if "REQUEST.get('zwiki_showlogo',1)">selected</dtml-if>
+  >Yes</option>
+</select>
+
+<p>
+Show page hierarchy ?
+<select name="zwiki_showhierarchy" tabindex=7>
+  <option value="">No</option>
+  <option value="1" 
+  <dtml-if zwiki_showhierarchy>selected</dtml-if>
+  >Yes</option>
+</select>
+(This wiki keeps a page hierarchy, which you can use or ignore.)
+
+<p>
+Show search field ? (except in minimal mode)
+<select name="zwiki_showsearch" tabindex=8>
+  <option value="">No</option>
+  <option value="1" 
+  <dtml-if "REQUEST.get('zwiki_showsearch',1)">selected</dtml-if>
+  >Yes</option>
+</select>
+
+<dtml-comment>
+<p>
+Show AnnoyingQuote ? (in full mode)
+<select name="zwiki_showquote" tabindex=9>
+  <option value="">No</option>
+  <option value="1" 
+  <dtml-if "REQUEST.get('zwiki_showquote',1)">selected</dtml-if>
+  >Yes</option>
+</select>
+</dtml-comment>
+
+<p>
+Show page management form ? (in full mode)
+<select name="zwiki_showpagemgmt" tabindex=10>
+  <option value="">No</option>
+  <option value="1" 
+  <dtml-if "REQUEST.get('zwiki_showpagemgmt',1)">selected</dtml-if>
+  >Yes</option>
+</select>
+(You must also configure a username or be logged in.)
+
+<dtml-let fontadj="_.int(REQUEST.get('latexwiki_fontadjust',0))" 
+          fontsize="latex_font_size">
+Font: <input type="text" name="latexwiki_font" size=30
+value="<dtml-var latexwiki_font missing="serif">">
+(site administrator has chosen a !LaTeX font-size of 
+<dtml-var expr="latex_font_size">px)<br/>
+Font size adjustment: <input type="text" name="latexwiki_fontadjust" 
+                             value="<dtml-var latexwiki_fontadjust missing=0>" size=2>px
+<table border=1>
+<tr><th></th><th>Upper Case</th><th>Lower Case</th></tr>
+<tr>
+<td> Are browser roman and italic letters the same height?  </td>
+<td> <div style="font-family:<dtml-var latexwiki_font missing="serif">; 
+                 font-size:<dtml-var expr="fontsize+fontadj">px;">
+X<i>X</i>
+</div> </td>
+<td> <div style="font-family:<dtml-var latexwiki_font missing="serif">; 
+                 font-size:<dtml-var expr="fontsize+fontadj">px;">
+x<i>x</i>
+</div> </td>
+</tr><tr>
+<td> Are Roman browser and !LaTeX letters the same height, and similar looking? </td>
+<td> <div style="font-family:<dtml-var latexwiki_font missing="serif">; 
+                 font-size:<dtml-var expr="fontsize+fontadj">px;">
+X$\rm X$
+</div> </td>
+<td> <div style="font-family:<dtml-var latexwiki_font missing="serif">; 
+                 font-size:<dtml-var expr="fontsize+fontadj">px;">
+x$\rm x$
+</div> </td>
+</tr> <tr>
+<td> Are Roman browser and !LaTeX letters the same height, and similar looking? </td>
+<td> <div style="font-family:<dtml-var latexwiki_font missing="serif">; 
+                 font-size:<dtml-var expr="fontsize+fontadj">px;">
+<i>X</i>$X$
+</div> </td>
+<td> <div style="font-family:<dtml-var latexwiki_font missing="serif">; 
+                 font-size:<dtml-var expr="fontsize+fontadj">px;">
+<i>x</i>$x$
+</div> </td>
+</tr>
+</tr> <tr>
+<td> Are !LaTeX superscript/subscript fonts readable? </td>
+<td> $\scriptstyle X$$\scriptstyle Z$ </td>
+<td> $\scriptstyle x$$\scriptstyle z$ </td>
+</tr> <tr>
+<td> Are !LaTeX superscript-superscript/subscript-subscript fonts readable? </td>
+<td> $\scriptscriptstyle X$$\scriptscriptstyle Z$ </td>
+<td> $\scriptscriptstyle x$$\scriptscriptstyle z$ </td>
+</tr>
+</table>
+</dtml-let>
+
+<dtml-comment>see http://zwiki.org/ZwikiSkins
+<p>
+Use which zwiki skin ?
+<select name="skin" tabindex=11>
+<dtml-let skins="[
+  'default',
+  'commonplace',
+  'wikipagex',
+  ]">
+<dtml-in skins prefix=x>
+<option value="&dtml-x_sequence_item;"
+<dtml-if "REQUEST.get('skin','default') == x_sequence_item">selected</dtml-if>
+>
+&dtml-x_sequence_item;
+</dtml-in>
+</dtml-let>
+</select>
+(Skins other than default may have problems. Commonplace is slow on this site.)
+
+<p>
+Use which theme with the commonplace skin ?
+<select name="zwiki_theme" tabindex=12>
+<dtml-let themes="[
+  'arcadian.css',
+  'default.css',
+  'earthy.css',
+  'sensible.css',
+  'tide.css',
+  'zettai.css',
+  ]">
+<dtml-in themes prefix=x>
+<option value="&dtml-x_sequence_item;"
+<dtml-if "REQUEST.get('zwiki_theme','default.css') == x_sequence_item">selected</dtml-if>
+>
+&dtml-x_sequence_item;
+</dtml-in>
+</dtml-let>
+</select>
+</dtml-comment>
+
+<div align="right"> 
+<b><input type="submit" name="setcookies" value="Save options" tabindex=13
+style="font-weight:bold"></b>
+<input type="submit" name="clearcookies" value="Forget options"
+tabindex=14> 
+</div>
+<input type="hidden" name="zwiki_displaymode" 
+value="<dtml-var zwiki_displaymode missing=simple>">
+
+</form>
+</dtml-with>

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/WikiWikiWeb.stxlatex
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/WikiWikiWeb.stxlatex	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/WikiWikiWeb.stxlatex	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,7 @@
+The WikiWikiWeb is the original and still one of the largest and most
+active wikis. It contains a wealth of information about wiki and many
+other things.
+
+WikiWikiWeb:FrontPage
+
+RemoteWikiURL: http://c2.com/cgi/wiki? 

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/ZWiki.stxlatex
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/ZWiki.stxlatex	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/ZWiki.stxlatex	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,9 @@
+Zwiki is the software which drives this wiki site.  
+It has been developed by "Joyful Systems":http://joyful.com and
+"contributors":http://zwiki.org/ZWikiContributors around the world, and is
+available under the GPL. For more information, see http://zwiki.org .
+
+Zwiki is inspired by the original WikiWikiWeb and powered by the
+"Zope":http://zope.org web application server. 
+
+RemoteWikiURL: http://zwiki.org/

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/blank.gif.gif
===================================================================
(Binary files differ)


Property changes on: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/blank.gif.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/diffform.pt
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/diffform.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/diffform.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,154 @@
+<?xml version="1.0"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN"
+"http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US"
+      xmlns:math="http://www.w3.org/1998/Math/MathML"
+      xmlns:xlink="http://www.w3.org/1999/xlink"
+      i18n:domain="zwiki"
+      tal:define="
+      title   string:${container/title} ${here/title_or_id} diffs;
+      macros  python:here.wikipage_macros(request).macros;
+      displaymode python: here.displayMode();
+      minimal     python: displaymode=='minimal';
+      simple      python: displaymode=='simple';
+      full        python: displaymode=='full';
+      hierarchy   python: request.get('zwiki_showhierarchy',0);
+      linearhdr   python: 1 #displaymode=='full';
+      revA options/revA; 
+      difftext options/difftext;
+      ">
+<head>
+  <link rel="stylesheet" type="text/css" href="latexwiki.css" />
+  <meta http-equiv="Content-Type" content="application/xhtml+xml;charset=utf-8" />
+  <meta name="robots" content="noindex,nofollow" />
+  <title tal:content="string:${container/title} ${here/title_or_id}" />
+</head>
+<body bgcolor="#ffffff">
+
+<div metal:use-macro="macros/linkpanel"></div>
+
+<div id="pageheading">
+  <form method="GET" 
+        tal:define="
+        methodname string:searchwiki;
+        pagename string:SearchPage; 
+        page python:here.pageWithName(pagename);
+        pagehasdtml python:page and page.dtmlAllowed() and page.hasDynamicContent();
+        url python:(pagehasdtml and page.id()) or (here.defaultPageId()+'/'+methodname);
+        "
+        tal:attributes="action python:here.wiki_url()+'/'+url;"
+        action="">
+
+    <!-- page heading in full & simple mode -->
+    <table tal:condition="not: minimal"
+           width="100%" border="0" cellspacing="0" class=""
+           tal:attributes="class python: nothing #not minimal and 'shade1' or nothing">
+      <tr>
+
+        <!-- ...logo -->
+        <td id="logo" width="1%" valign="top"
+            tal:attributes="id python: full and 'logo_full' or 'logo_simple'">
+          <span metal:use-macro="macros/logolink"></span>
+        </td>
+        <!-- ...page name + maybe parent context -->
+        <td id="pagenameand_linear" align="left" width="59%"
+            tal:condition="python: hierarchy and linearhdr">
+          <span metal:use-macro="macros/pagenameand_linear"></span>
+        </td>
+        <td id="pagenameand" align="left" width="59%"
+            tal:condition="python: hierarchy and not linearhdr">
+          <span metal:use-macro="macros/pagenameand"></span>
+        </td>
+        <td width="20%"><h1 tal:content="string: Changes in revision ${revA}"></h1>
+        </td>
+        <td id="pagenameonly" align="left" width="59%"
+            tal:condition="not: hierarchy">
+          <span metal:use-macro="macros/pagename"></span>
+        </td>
+      </tr>
+    </table>
+
+    <!-- page heading in minimal mode -->
+    <!-- twk: use table for minimal so logo and pagename are aligned consistently 
+         in simple & minimal -->
+    <table width="100%" border="0" cellspacing="0" tal:condition="minimal">
+      <tr>
+
+        <!-- ...logo -->
+        <td id="logo_minimal" width="1%" valign="middle">
+          <span metal:use-macro="macros/logolink"></span>
+        </td>
+
+        <!-- ...page name + maybe parent context -->
+        <td id="pagenameand_linear" align="left" width="79%"
+            tal:condition="python: hierarchy and linearhdr">
+          <span metal:use-macro="macros/pagenameand_linear"></span>
+        </td>
+        <td id="pagenameand" align="left" width="79%"
+            tal:condition="python: hierarchy and not linearhdr">
+          <span metal:use-macro="macros/pagenameand"></span>
+        </td>
+        <td id="pagenameonly" align="left" width="79%"
+            tal:condition="not: hierarchy">
+          <span metal:use-macro="macros/pagename"></span>
+        </td>
+
+        <!-- ...edit links + search box -->
+        <!-- twk: put otherlinks here rather than in a table above this -->
+        <td id="searchbox" width="20%" align="right" nowrap="nowrap"
+            tal:define="showsearch python:request.get('zwiki_showsearch',1)">
+          <span metal:use-macro="macros/displaymodes"></span>
+          <span metal:use-macro="macros/editlinks"></span>
+          <div tal:condition="python:1">
+            <input id="searchinput" class="formfield" tal:condition="showsearch"
+                   name="expr" type="text" size="20" maxlength="100" value="" 
+                   title="search all pages" accesskey="s" style="width: 95%" /> 
+            <!-- XXX hack: width 95% keeps moz from chopping off right end 
+                 with 1px borders -->
+          </div>
+        </td>
+
+      </tr>
+    </table>
+
+  </form>
+</div>
+<!-- end of header -->
+
+<div id="formcontent">
+
+<table border="0" width="100%">
+<tr>
+<td align="left" valign="top">
+<b>Log note: </b><em tal:content="python:here.lastlog(revA-1)">log note..</em>
+</td>
+<td align="right" valign="top" nowrap="nowrap">
+<form method="GET" action="" tal:attributes="action here/page_url">
+<input type="submit" name="manage_change_history_page:method" i18n:attributes="value"
+ value="full history" tal:condition="python:user.has_permission('View History',here)" />
+<input tal:condition="python:revA < 19" type="submit" name="prevDiff:method" 
+ value="&lt;&lt; previous edit" i18n:attributes="value" accesskey="p" />
+<input tal:condition="python:not (revA < 19)" disabled="1" type="submit" name="prevDiff:method" 
+ value="&lt;&lt; previous edit" i18n:attributes="value" accesskey="p" />
+<input tal:condition="python:revA > 1" type="submit" name="nextDiff:method" 
+ value="next edit &gt;&gt;"  i18n:attributes="value" accesskey="n" />
+<input tal:condition="python:not(revA > 1)" disabled="1" type="submit" name="nextDiff:method" 
+ value="next edit &gt;&gt;"  i18n:attributes="value" accesskey="n" />
+<input tal:condition="python:user.has_permission('Zwiki: Edit pages', here)" 
+    type="submit" name="revert:method" value="Revert this change and all successive changes" 
+    i18n:attributes="value" accesskey="v" />
+<input type="submit" name="return" value="Return to page" />
+<input type="hidden" name="currentRevision" tal:attributes="value revA" />
+</form>
+</td>
+</tr>
+</table>
+
+<pre tal:content="structure difftext">
+diff..
+</pre>
+
+</div>
+
+</body>
+</html>

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/index_html.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/index_html.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/index_html.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,2 @@
+<dtml-call "RESPONSE.redirect(_['URL1'] + '/FrontPage')">
+

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/latexwiki.css.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/latexwiki.css.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/latexwiki.css.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,315 @@
+<dtml-let fontadj="_.int(REQUEST.get('latexwiki_fontadjust',0))" 
+          fontsize="latex_font_size">
+<dtml-comment>
+This check is essentially acting as Plone detection
+</dtml-comment>
+<dtml-if "_.len(objectValues('ZWiki Page')) > 0 and not _.hasattr(this(), 'portal_factory')">
+ at import url("<dtml-var expr="objectValues('ZWiki Page')[0].id()">/stylesheet");
+<dtml-else>
+</dtml-if>
+img.equation { 
+    behavior: url("pngbehavior.htc"); /* IE PNG Transparancy fix */
+    vertical-align: middle; 
+    border: 0px;
+}
+.latexwiki { 
+  font-family: <dtml-var latexwiki_font missing="serif">;
+    font-size: <dtml-var expr="fontsize+fontadj">px;
+}
+.latexwiki * {
+  font-family: <dtml-var latexwiki_font missing="serif">;
+  /* Don't change size of child elements so they're relative to font-size for .latexwiki */
+}
+.latexwiki input,
+.latexwiki select {
+  font-family: sans-serif;
+}
+.latexwiki code,
+.latexwiki pre {
+  font-family: monospace;
+}
+
+/**************************** MathML stuff below *****************************/
+
+math ci { color: #FF0000; font-style: italic;}
+
+math, math[mode="inline"] {
+  display: inline;
+  font-family: <dtml-var latexwiki_font missing="serif">;
+  font-style: normal;
+}
+
+math[mode="display"] {
+  display: block;
+  text-align: center;
+  font-family: <dtml-var latexwiki_font missing="serif">;
+  font-style: normal;
+}
+
+</dtml-let>
+
+ at media screen {  /* hide from old browsers */
+
+
+/* Rules dealing with the various values of the "mathvariant" attribute: */
+
+math *.[mathvariant="normal"] {
+  font-family: "Nimbus Roman No9 L", "Times New Roman", Courier, Garamond, serif;
+  font-weight: normal;
+  font-style: normal;
+}
+
+math *.[mathvariant="bold"] {
+  font-family: "Nimbus Roman No9 L", "Times New Roman", Courier, Garamond, serif;
+  font-weight: bold;
+  font-style: normal;
+}
+
+math *.[mathvariant="italic"] {
+  font-family: "Nimbus Roman No9 L", "Times New Roman", Courier, Garamond, serif;
+  font-weight: normal;
+  font-style: italic;
+}
+
+math *.[mathvariant="bold-italic"] {
+  font-family: "Nimbus Roman No9 L", "Times New Roman", Courier, Garamond, serif;
+  font-weight: bold;
+  font-style: italic;
+}
+
+math *.[mathvariant="double-struck"] {
+  font-family: msbm;
+  font-weight: normal;
+  font-style: normal;
+}
+
+math *.[mathvariant="script"] {
+  font-family: eusb;
+  font-weight: normal;
+  font-style: normal;
+}
+
+math *.[mathvariant="bold-script"] {
+  font-family: eusb;
+  font-weight: bold;
+  font-style: normal;
+}
+
+math *.[mathvariant="fraktur"] {
+  font-family: eufm;
+  font-weight: normal;
+  font-style: normal;
+}
+
+math *.[mathvariant="bold-fraktur"] {
+  font-family: eufm;
+  font-weight: bold;
+  font-style: italic;
+}
+
+math *.[mathvariant="sans-serif"] {
+  font-family: "Nimbus Sans L", Arial, "Lucida Sans Unicode", Verdana, sans-serif;
+  font-weight: normal;
+  font-style: normal;
+}
+
+math *.[mathvariant="bold-sans-serif"] {
+  font-family: "Nimbus Sans L", Arial, "Lucida Sans Unicode", Verdana, sans-serif;
+  font-weight: bold;
+  font-style: normal;
+}
+
+math *.[mathvariant="sans-serif-italic"] {
+  font-family: "Nimbus Sans L", Arial, "Lucida Sans Unicode", Verdana, sans-serif;
+  font-weight: normal;
+  font-style: italic;
+}
+
+math *.[mathvariant="sans-serif-bold-italic"] {
+  font-family: "Nimbus Sans L", Arial, "Lucida Sans Unicode", Verdana, sans-serif;
+  font-weight: bold;
+  font-style: italic;
+}
+
+math *.[mathvariant="monospace"] {
+  font-family: monospace
+}
+
+
+/* Rules dealing with "mathsize" attribute */
+
+math *.[mathsize="small"] {
+  font-size: 80%
+}
+
+math *.[mathsize="normal"] {
+/*  font-size: 100%  - which is unnecessary */
+}
+
+math *.[mathsize="big"] {
+  font-size:  125%
+}
+
+/*Set size values for the "base" children of script and limit schema to 
+  distinguish them from the script or limit children:
+*/
+
+msub>*:first-child[mathsize="big"],
+msup>*:first-child[mathsize="big"],
+msubsup>*:first-child[mathsize="big"],
+munder>*:first-child[mathsize="big"],
+mover>*:first-child[mathsize="big"],
+munderover>*:first-child[mathsize="big"],
+mmultiscripts>*:first-child[mathsize="big"],
+mroot>*:first-child[mathsize="big"] {
+  font-size: 125%
+}
+
+msub>*:first-child[mathsize="small"],
+msup>*:first-child[mathsize="small"],
+msubsup>*:first-child[mathsize="small"],
+munder>*:first-child[mathsize="small"],
+mover>*:first-child[mathsize="small"],
+munderover>*:first-child[mathsize="small"],
+mmultiscripts>*:first-child[mathsize="small"],
+mroot>*:first-child[mathsize="small"] {
+  font-size: 80%
+}
+
+msub>*:first-child,
+msup>*:first-child,
+msubsup>*:first-child,
+munder>*:first-child,
+mover>*:first-child,
+munderover>*:first-child,
+mmultiscripts>*:first-child,
+mroot>*:first-child {
+  font-size: 100%
+}
+
+/*Set size values for the other children of script and limit schema (the 
+  script and limit children) - include scriptlevel increment attribute?
+*/
+
+msub>*[mathsize="big"],
+msup>*[mathsize="big"],
+msubsup>*[mathsize="big"],
+munder>*[mathsize="big"],
+mover>*[mathsize="big"],
+munderover>*[mathsize="big"],
+mmultiscripts>*[mathsize="big"],
+math[display="inline"] mfrac>*[mathsize="big"],
+math *[scriptlevel="+1"][mathsize="big"] {
+  font-size: 89%  /* (.71 times 1.25) */
+}
+
+msub>* [mathsize="small"],
+msup>*[mathsize="small"],
+msubsup>*[mathsize="small"],
+munder>*[mathsize="small"],
+mover>*[mathsize="small"],
+munderover>*[mathsize="small"],
+mmultiscripts>*[mathsize="small"],
+math[display="inline"] mfrac>*[mathsize="small"],
+math *[scriptlevel="+1"][mathsize="small"] {
+  font-size: 57% /* (.71 times .80) */
+}
+
+msub>*,
+msup>*,
+msubsup>*,
+munder>*,
+mover>*,
+munderover>*,
+mmultiscripts>*,
+math[display="inline"] mfrac>*,
+math *[scriptlevel="+1"] {
+  font-size: 71%
+}
+
+mroot>*[mathsize="big"] {
+  font-size: 62%  /* (.50 times 1.25) */
+}
+
+mroot>*[mathsize="small"] {
+  font-size: 40% /* (.50 times .80) */
+}
+
+mroot>* {
+  font-size: 50%
+}
+
+/* Set size values for other scriptlevel increment attributes  */
+
+math *[scriptlevel="+2"][mathsize="big"] {
+  font-size: 63%  /* (.71 times .71 times 1.25) */
+}
+
+math *[scriptlevel="+2"][mathsize="small"] {
+  font-size: 36% /* (.71 times .71 times .71) */
+}
+
+math *[scriptlevel="+2"] {
+  font-size: 50%   /* .71 times .71 */
+}
+
+math *.[mathcolor="green"] {
+  color: green
+}
+
+math *.[mathcolor="black"] {
+  color: black
+}
+
+math *.[mathcolor="red"] {
+  color: red
+}
+
+math *.[mathcolor="blue"] {
+  color: blue
+}
+
+math *.[mathcolor="olive"] {
+   color: olive
+}
+
+math *.[mathcolor="purple"] {
+   color: purple
+}
+
+math *.[mathcolor="teal"] {
+   color: teal
+}
+
+math *.[mathcolor="aqua"] {
+   color: aqua
+}
+
+math *.[mathcolor="gray"] {
+   color: gray
+}
+
+math *.[mathbackground="blue"] {
+   background-color: blue
+}
+
+math *.[mathbackground="green"] {
+   background-color: green
+}
+
+math *.[mathbackground="white"] {
+   background-color: white
+}
+
+math *.[mathbackground="yellow"] {
+   background-color: yellow
+}
+
+math *.[mathbackground="aqua"] {
+   background-color: aqua
+}
+
+} /* Close "@media screen" scope */
+
+ at media aural {  
+}

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/pngbehavior.htc.zexp
===================================================================
(Binary files differ)


Property changes on: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/pngbehavior.htc.zexp
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/setup_latexwiki.zexp
===================================================================
(Binary files differ)


Property changes on: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/setup_latexwiki.zexp
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/site_logo.png
===================================================================
(Binary files differ)


Property changes on: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/site_logo.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/standard_error_message.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/standard_error_message.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/standard_error_message.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,52 @@
+<dtml-if "error_type=='NotFound'">
+<dtml-comment>
+A custom error handler. This handles NotFound errors (only) by
+redirecting to a similarly-named existing page if possible, 
+otherwise offering create/search buttons.
+Works with either the skin-based searchwiki form or a SearchPage page.
+Assumes at least one zwiki page exists.
+</dtml-comment>
+<dtml-let 
+ here="objectValues(spec='ZWiki Page')[0]"
+ here="here.defaultPage()"
+ pagename="'SearchPage'"
+ skinname="'searchwiki'"
+ searchpage="here.pageWithName(pagename)"
+ searchpagehasdtml="searchpage and searchpage.dtmlAllowed() and searchpage.hasDynamicContent()"
+ searchurl="(searchpagehasdtml and searchpage.pageUrl()) or here.pageUrl()+'/'+skinname"
+ path="URL[_.len(SERVER_URL):]"
+ searchexpr="_.string.split(path,'/')[-1]"
+ targetpage="here.pageWithFuzzyName(searchexpr,url_quoted=1,
+                                    allow_partial=1,ignore_case=1) or
+             here.pageWithId(searchexpr,ignore_case=1)"
+ targeturl="(targetpage and targetpage.page_url()) or None"
+ >
+<dtml-if targeturl>
+<dtml-call "RESPONSE.redirect(targeturl,lock=1)">
+<dtml-else>
+<html>
+  <head><meta name="robots" content="noindex,nofollow"></head>
+  <body>
+    <p>
+      I could not find any likely page matching 
+      "<b><dtml-var "here.urlunquote(searchexpr)"></b>"
+    </p>
+    <p>
+      Click here to 
+      <form action="<dtml-var "here.page_url()">/editform"
+            method="GET" enctype="multipart/form-data">
+        <input type="hidden" name="page" value="&dtml-searchexpr;">
+        <input type="submit" value="create this page">
+      </form>
+      <form action="&dtml-searchurl;"
+            method="GET" enctype="multipart/form-data">
+        <input type="hidden" name="expr" value="&dtml-searchexpr;">
+        <input type="submit" value="search for it">
+      </form>
+      or visit the <a href="&dtml-URL1;">front page</a>.
+    </p>
+  </body>
+</html>
+</dtml-if>
+</dtml-let>
+</dtml-if>

Added: zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/wikipage.pt
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/wikipage.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/latexwiki/wikis/latexwiki/wikipage.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,549 @@
+<?xml version="1.0"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN"
+"http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US"
+      xmlns:math="http://www.w3.org/1998/Math/MathML"
+      xmlns:xlink="http://www.w3.org/1999/xlink"
+      i18n:domain="zwiki"
+      tal:define="
+                  displaymode   python: here.displayMode();
+                  minimalmode   python: displaymode=='minimal';
+                  simplemode    python: displaymode=='simple';
+                  fullmode      python: displaymode=='full';
+                  ">
+  <head metal:define-macro="head">
+
+    <meta http-equiv="Content-Type" content="application/xhtml+xml;charset=utf-8" />
+<!--
+    <meta http-equiv="Content-Type" content="" 
+          tal:define="
+            charset python:'utf-8';
+            dummy   python:request.RESPONSE.setHeader(
+                      'Content-Type','text/html;; charset='+charset);"
+          tal:attributes="content string:text/html;;charset=${charset}" />
+-->
+
+    <span metal:define-slot="searchtags" 
+          tal:omit-tag="" 
+          tal:define="indexdelay python:24">
+      <span tal:condition="python:here.lastEditIntervalInHours() >= indexdelay"
+            tal:omit-tag="">
+        <meta metal:define-slot="keywords" name="keywords" content=""
+              tal:attributes="content here/spacedPageName;" />
+        <meta metal:define-slot="description" name="description" content=""
+              tal:attributes="content here/summary;" />
+      </span>
+      <meta tal:condition="python:here.lastEditIntervalInHours() < indexdelay"
+            name="robots" content="noindex" />
+    </span>
+
+    <span metal:define-slot="extra" tal:omit-tag="" />
+
+    <link rel="stylesheet" type="text/css" href="latexwiki.css" />
+<!--
+    <link rel="stylesheet" type="text/css" href="" 
+          tal:attributes="href string:${here/defaultPageUrl}/stylesheet" />
+-->
+
+    <title metal:define-slot="title"
+           tal:content="string:${container/title} ${here/pageName}" >
+      page title
+    </title>
+
+  </head>
+
+  <body>
+
+    <div tal:condition="here/site_header|nothing" tal:replace="site_header" />
+
+
+    <!--  access keys and main links bar -->
+    <div metal:define-macro="linkpanel" tal:omit-tag=""
+         tal:define="
+                     displaymode   python: here.displayMode();
+                     minimalmode   python: displaymode=='minimal';
+                     simplemode    python: displaymode=='simple';
+                     fullmode      python: displaymode=='full'
+                     # had to define these again here for macro callers;
+                     ">
+
+      <!-- always-available quick access keys -->
+      <span metal:define-macro="accesskeys" tal:omit-tag="">
+        <a tal:attributes="href string:${here/pageUrl}/src" accesskey="q"></a>
+        <a tal:condition="nothing" tal:attributes="href string:${here/pageUrl}/clearCache" accesskey="w"></a>
+        <a tal:attributes="href here/homeUrl" accesskey="f"></a>
+        <a tal:attributes="href here/contentsUrl" accesskey="c"></a>
+        <a tal:attributes="href here/changesUrl" accesskey="r"></a>
+        <a tal:attributes="href here/discussionUrl" accesskey="" tal:condition="here/discussionUrl"></a>
+        <a tal:attributes="href here/trackerUrl" accesskey="t" tal:condition="here/hasIssues"></a>
+        <a tal:attributes="href here/indexUrl" accesskey="i" tal:condition="here/indexUrl"></a>
+        <a tal:attributes="href here/uploadsUrl" accesskey="" tal:condition="python:0 #here/uploadsUrl"></a>
+        <a tal:attributes="href here/preferencesUrl" accesskey="o"></a>
+        <a tal:attributes="href here/helpUrl" accesskey="h" tal:condition="here/helpUrl"></a>
+        <a tal:attributes="href python:here.pageUrl()+'/setskin?skin=plone'" accesskey="+" tal:condition="here/inCMF"></a>
+        <a tal:attributes="href python:here.pageUrl()+'/setskin?skin=full'" accesskey="+" tal:condition="not:here/inCMF"></a>
+        <a tal:attributes="href python:here.pageUrl()+'/setskin?skin=full'" accesskey="="></a>
+        <a tal:attributes="href python:here.pageUrl()+'/setskin?skin=simple'" accesskey="_"></a>
+        <a tal:attributes="href python:here.pageUrl()+'/setskin?skin=minimal'" accesskey="-"></a>
+        <a tal:attributes="href here/pageUrl" accesskey="v"></a>
+        <a tal:attributes="href string:${here/pageUrl}/subscribeform" accesskey="m"></a>
+        <a tal:attributes="href string:${here/pageUrl}/backlinks" accesskey="b"></a>
+        <a tal:attributes="href string:${here/pageUrl}/diff" accesskey="d"></a>
+        <a tal:attributes="href string:${here/pageUrl}/manage_change_history_page" accesskey="y"></a>
+        <a tal:attributes="href string:${here/pageUrl}/editform" accesskey="e"></a>
+        <a tal:attributes="href python:here.wikiUrl() + '/externalEdit_/' +
+                           modules['Products.PythonScripts.standard'].url_quote(here.id()) +
+                           '?borrow_lock=1'" accesskey="x"></a>
+        <a tal:condition="nothing" tal:attributes="href string:${here/pageUrl}/print" accesskey=""></a>
+        <a tal:attributes="href string:#subtopics" accesskey=""></a>
+        <a tal:attributes="href python:here.nextPageUrl() or here.firstPageUrl()" accesskey="n"></a>
+        <a tal:attributes="href python:here.previousPageUrl() or here.lastPageUrl()" accesskey="p"></a>
+        <a tal:attributes="href here/upUrl" accesskey="u"></a>
+        <a tal:attributes="href string:${here/pageUrl}/showAccessKeys" accesskey="0"></a>
+      </span>
+
+      <!-- main links bar -->
+      <div tal:condition="not: minimalmode" class="linkpanel">
+        <table class="shade1" width="100%" border="0" cellspacing="0"
+               tal:attributes="class python: not minimalmode and 'shade1' or nothing">
+          <tr>
+            <td class="wikilinks" align="left">
+
+              <!-- wiki navigation links -->
+              <span metal:define-macro="wikilinks" tal:omit-tag="">
+                <a href="" tal:attributes="href here/homeUrl" 
+                   accesskey="f"
+                   title="show front page"
+                   i18n:attributes="title">
+                <span i18n:translate="">home</span></a>
+                <a href="" tal:attributes="href here/contentsUrl" 
+                   accesskey="c"
+                   title="show wiki contents"
+                   i18n:attributes="title">
+                <span i18n:translate="">contents</span></a>
+                <a href="" tal:attributes="href here/changesUrl" 
+                   accesskey="r"
+                   title="show wiki recent changes"
+                   i18n:attributes="title">
+                <span i18n:translate="">changes</span></a>
+                <a href="" tal:attributes="href here/discussionUrl" 
+                   tal:condition="here/discussionUrl"
+                   title="show discussion page"
+                   i18n:attributes="title">
+                <span i18n:translate="">discussion</span></a>
+                <a href="" tal:attributes="href here/trackerUrl" 
+                   tal:condition="here/hasIssues"
+                   title="show issue tracker"
+                   i18n:attributes="title">
+                <span i18n:translate="">issues</span></a>
+                <a tal:attributes="href here/indexUrl" accesskey="i" 
+                   tal:condition="here/indexUrl"
+                   title="show wiki index"
+                   i18n:attributes="title">
+                <span i18n:translate="">index</span></a>
+                <a href="" tal:attributes="href here/uploadsUrl" 
+                   tal:condition="here/uploadsUrl"
+                   title="show upload page"
+                   i18n:attributes="title">
+                <span i18n:translate="">uploads</span></a>
+                <a tal:attributes="href here/preferencesUrl" 
+                   accesskey="o"
+                   title="show wiki options"
+                   i18n:attributes="title">
+                <span i18n:translate="">options</span></a>
+                <a tal:attributes="href here/helpUrl" 
+                   accesskey="h" 
+                   tal:condition="here/helpUrl"
+                   title="show help page"
+                   i18n:attributes="title">
+                <span i18n:translate="">help</span></a>
+                &nbsp;&nbsp;
+              </span>
+
+            </td>
+            <td class="otherlinks" align="right">
+
+              <!-- display mode links -->
+              <span metal:define-macro="displaymodes">
+                <span tal:condition="here/inCMF">
+                <a accesskey="+" href="" 
+                   title="show plone skin" i18n:attributes="title"
+                   tal:attributes="href python:here.pageUrl()+'/setskin';"
+                  ><span i18n:translate="">plone</span></a
+                >/</span><a accesskey="=" href="" 
+                   title="show all features" i18n:attributes="title"
+                   tal:attributes="
+                     href python:here.pageUrl()+'/setskin?skin=full';
+                     style python:(fullmode and 'font-weight:bold') or nothing;
+                     "
+                  ><span i18n:translate="">full</span></a
+                >/<a accesskey="_" href=""
+                   title="show basic features" i18n:attributes="title"
+                   tal:attributes="
+                     href python:here.pageUrl()+'/setskin?skin=simple';
+                     style python:(simplemode and 'font-weight:bold') or nothing;
+                     "
+                  ><span i18n:translate="">simple</span></a
+                >/<a accesskey="-" href="" 
+                   title="show only essential features" i18n:attributes="title"
+                   tal:attributes="
+                     href python:here.pageUrl()+'/setskin?skin=minimal';
+                     style python:(minimalmode and 'font-weight:bold') or nothing;
+                     "
+                  ><span i18n:translate="">minimal</span></a>
+              </span> 
+
+              <!-- page action links -->
+              <span metal:define-macro="pagelinks">
+                <a tal:condition="python:here.isMailoutEnabled()"
+                   tal:attributes="href python:here.page_url() + '/subscribeform'"
+                   href="page_url/subscribeform" 
+                   accesskey="m"
+                   title="configure email subscription to this page or site" 
+                   i18n:attributes="title"
+                   >
+                  <span tal:condition="python:0 
+                              #here.allSubscriptionsFor(request.get('email',''))
+                              #show subscription status - too expensive " >(un)</span >
+                  <span i18n:translate="">subscribe</span></a>
+                <a tal:condition="python:0 #user.has_permission('Zwiki: Edit pages',here)"
+                   tal:attributes="href python:here.pageUrl() + '/backlinks';"
+                   href="" 
+                   title="which pages link to this one ?" 
+                   i18n:attributes="title"
+                   accesskey="b"
+                   ><span i18n:translate="">backlinks</span></a>
+                <a tal:condition="python:0 #user.has_permission('Zwiki: Edit pages',here)"
+                   tal:attributes="href python:here.pageUrl() + '/diff';"
+                   href="" 
+                   title="show this page's change history" 
+                   i18n:attributes="title"
+                   accesskey="d"
+                   ><span i18n:translate="">diff</span></a>
+                <a tal:condition="python:user.has_permission('Zwiki: Edit pages',here)"
+                   tal:attributes="
+                    href python:here.page_url() + '/editform';
+                    title python: here.translateHelper('edit-page') + ' (' + here.linkTitle() + ')'"
+                   href="page_url/editform" 
+                   title="edit this page (last edited n days ago by so-and-so)"
+                   accesskey="e"
+                   >
+                <span i18n:translate="">edit</span></a>
+                <a tal:condition="python:
+                    user.has_permission('Zwiki: Edit pages',here) and
+                    hasattr(root.misc_,'ExternalEditor') and
+                    user.has_permission('Use external editor',here)"
+                   tal:attributes="href python:
+                    here.wiki_url() + '/externalEdit_/' +
+                    modules['Products.PythonScripts.standard'].url_quote(here.id()) +
+                    '?borrow_lock=1'"
+                   href="wiki_url/externalEdit_/id" 
+                   title="edit using external editor" 
+                   i18n:attributes="title"
+                   accesskey="x"
+                   ><img src="/misc_/ExternalEditor/edit_icon" hspace="2" align="middle" 
+                   border="0" alt="(external edit)" i18n:attributes="alt" /></a>
+              </span>
+
+            </td>
+          </tr>
+        </table>
+      </div> 
+    </div> 
+
+
+    <!-- hierarchy navigation bar -->
+    <div metal:define-macro="navpanel" tal:omit-tag="">
+      <div class="navpanel" tal:condition="fullmode">
+        <table class="shade1" width="100%" border="0" cellspacing="0">
+          <tr valign="top">
+            <td align="left" width="33%">
+              <a tal:condition="here/previousPage" tal:attributes="href here/previousPageUrl"
+                 access_key='P' tal:content="python:'&lt;&lt;'+here.previousPage()">
+                << PreviousPage
+              </a>
+            </td>
+            <td align="center" width="33%">
+              <a tal:condition="here/primaryParentName" 
+                 tal:attributes="href here/upUrl"
+                 access_key='U' 
+                 tal:content="python:'^^'+(here.primaryParentName() or 'wiki contents')">
+                ^^ParentPage
+              </a>
+            </td>
+            <td align="right" width="33%">
+              <a tal:condition="here/nextPage" tal:attributes="href here/nextPageUrl"
+                 access_key='N' tal:content="python:here.nextPage()+'&gt;&gt;'">
+                >>NextPage
+              </a>
+            </td>
+          </tr>
+        </table>
+      </div>
+    </div>
+
+
+    <!-- page heading, full/simple and minimal versions -->
+    <div class="pageheading">
+      <form method="GET" 
+            tal:define="
+                        methodname string:searchwiki;
+                        pagename string:SearchPage; 
+                        page python:here.pageWithName(pagename);
+                        pagehasdtml python:page and page.dtmlAllowed() and page.hasDynamicContent();
+                        url python:(pagehasdtml and page.id()) or (here.defaultPageId()+'/'+methodname);
+                        displaymode   python: here.displayMode();
+                        minimalmode   python: displaymode=='minimal';
+                        simplemode    python: displaymode=='simple';
+                        fullmode      python: displaymode=='full';
+                        "
+            tal:attributes="action python:here.wiki_url()+'/'+url;"
+            action="">
+
+        <!-- page heading in full & simple mode -->
+        <table tal:condition="not: minimalmode" width="100%" border="0" cellspacing="0">
+          <tr>
+            <td id="logo" width="1%" valign="top"
+                tal:attributes="class python: fullmode and 'logo_full' or 'logo_simple'">
+              <span metal:define-macro="logolink" tal:omit-tag="">
+                <!-- logo -->
+                <a tal:condition="python:request.get('zwiki_showlogo',1)"
+                   tal:attributes="href here/wiki_url"
+                   href="wiki_url" 
+                   title="go to home page" 
+                   i18n:attributes="title"
+                   accesskey="f">
+                  <img src="/misc_/ZWiki/ZWikiPage_icon.gif" height="48" width="48" 
+                       border="0" alt="home" i18n:attributes="alt"
+                       tal:replace="structure here/site_logo|default" /></a>
+              </span>
+            </td>
+            <td class="pagenameand" align="left" width="79%">
+              <span metal:define-macro="pagenameand" tal:omit-tag="">
+                <ul tal:replace="structure 
+                                 python:here.context(request,enlarge_current=1)">
+                  <li>context<ul><li><big><big><big>page name</big></big></big></li></ul></li>
+                </ul>
+              </span>
+            </td>
+            <td class="searchbox" width="20%" align="right"
+                tal:define="showsearch python:request.get('zwiki_showsearch',1)">
+              <input id="searchinput" class="formfield" tal:condition="showsearch"
+                     name="expr" type="text" size="20" maxlength="100" value="" 
+                     title="search all pages" accesskey="s" i18n:attributes="title" /><br 
+                     tal:condition="showsearch" />
+              <span class="lasteditor" 
+                    tal:content="structure python:here.linkTitle(prettyprint=1)">
+                last edited n days ago by by so-and-so
+              </span>
+            </td>
+          </tr>
+        </table>
+
+        <!-- page heading in minimal mode -->
+        <table tal:condition="minimalmode" width="100%" border="0" cellspacing="0">
+          <tr>
+            <td class="logo_minimal" width="1%" valign="middle">
+              <span metal:use-macro="template/macros/logolink" />
+            </td>
+            <td class="pagenameonly" align="left" width="79%">
+              <span metal:define-macro="pagenameonly">
+                <a tal:attributes="
+                                   href python:here.page_url() + '/backlinks';
+                                   title python:'show backlinks for this page ('+here.linkTitle()+')'"
+                   tal:content="here/formattedPageName"
+                   href="page_url/backlinks" 
+                   title="show backlinks for this page (last edited n days ago by so-and-so)" 
+                   accesskey="b"
+                   >page name</a>
+              </span>
+            </td>
+            <td class="searchbox" width="20%" align="right" nowrap=""
+                tal:define="showsearch python:request.get('zwiki_showsearch',1)">
+              <span metal:use-macro="template/macros/displaymodes" />
+              <span metal:use-macro="template/macros/pagelinks" />
+              <br />
+              <input id="searchinput" class="formfield" tal:condition="showsearch"
+                     name="expr" type="text" size="20" maxlength="100" value="" 
+                     title="search all pages" accesskey="s" style="width: 95%" /><br 
+                     tal:condition="showsearch" />
+              <span class="lasteditor" 
+                    tal:content="structure python:here.linkTitle(prettyprint=1)+' '" />
+              <!-- XXX hacks: 
+                   width 95% keeps moz from chopping off right end 
+                   with 1px borders; trailing space to prevent text chop -->
+            </td>
+          </tr>
+        </table>
+        
+      </form>
+    </div>
+
+
+    <!-- rating form -->
+    <div align="right">  
+      <span tal:condition="python:user.has_permission('Zwiki: Rate pages',here)" 
+            tal:replace="structure here/ratingform">
+        rating form
+      </span>
+    </div>
+
+
+    <!-- page content -->
+    <div class="content">
+
+      <div tal:replace="structure options/body">
+        page body, subtopics, comments
+      </div>
+
+      <a name="bottom"></a>
+      <br />
+
+      <!-- comment form -->
+      <div tal:condition="python:user.has_permission('Zwiki: Add comments',here)">
+        <br />
+        <br />
+        <div metal:define-macro="commentform">
+          <form method="post" enctype="multipart/form-data"
+                class="commentform" style="margin-top:0;margin-bottom:0"
+                tal:attributes="action here/pageUrl">
+            <input name="timeStamp" type="hidden" value="editTimestamp"
+                   tal:attributes="value here/editTimestamp" />
+            <input name="page" type="hidden" value="id" 
+                   tal:attributes="value here/id" />
+            <table width="100%" border="0" cellspacing="0" cellpadding="0" bgcolor="">
+              <!-- subject row -->
+              <tr>
+                <td align="left" valign="middle" nowrap="nowrap" colspan="2"
+                    tal:attributes="bgcolor python:nothing# not minimalmode and '#dddddd') or '';">
+                  <small>
+                    <span i18n:translate="">subject</span>: 
+                    <input type="text" name="subject_heading" value="" 
+                           size="40" maxlength="100" style="font-weight:bold;" 
+                           class="formfield" 
+                           title="a subject helps clarify threads and RecentChanges" 
+                           i18n:attributes="title" 
+                           tal:attributes="value request/subject|nothing" />
+                    <span tal:condition="request/in_reply_to|nothing">
+                      (<span i18n:translate="">replying</span>)
+                    </span>
+                  </small>
+                </td>
+              </tr>
+              <!-- comment row -->
+              <tr>
+                <td align="center" valign="bottom" bgcolor="" colspan="2">
+                  <textarea wrap="virtual" name="text" rows="3" cols="60" 
+                            style="width:100%;"  class="formfield"
+                            title="to comment (and cc any subscribers) enter text here and click add"
+                            i18n:attributes="title"
+                  ></textarea>
+                </td>
+              </tr>
+              <!-- add row -->
+              <tr>
+                <td align="left" valign="middle">
+                  &nbsp;
+                </td>
+                <td align="right" valign="top" nowrap="nowrap"> 
+                  <input type="hidden" name="in_reply_to"
+                         tal:attributes="value request/in_reply_to|nothing" />
+                  <input type="hidden" name="use_heading" value="1" />
+                  <span tal:condition="python:here.isMailoutEnabled()" >
+                    <small>(
+                    <span tal:define="nbsubscriber 
+                                      python:here.subscriberCount() + here.wikiSubscriberCount()">
+                      <span tal:condition="python:nbsubscriber>1" i18n:translate="">
+                        <span tal:content="python:str(nbsubscriber)" i18n:name="nb" /> subscribers
+                      </span>
+                      <span tal:condition="python:nbsubscriber==1" i18n:translate="">
+                        1 subscriber
+                      </span>
+                    </span>
+                    )</small>
+                  </span>
+                  <input type="submit" name="comment:method" value="add a comment" 
+                         i18n:attributes="value add-comment"
+                         style="font-weight:bold" /></td>
+              </tr>
+            </table>
+          </form>
+        </div>
+      </div>
+
+    </div>
+
+
+    <!-- page management form -->
+    <div tal:condition="python:
+           fullmode and
+           (user.has_permission('Zwiki: Add pages',here) or
+           user.has_permission('Zwiki: Rename pages',here) or
+           user.has_permission('Zwiki: Reparent pages',here) or
+           user.has_permission('Zwiki: Delete pages',here))
+           #and here.userIsIdentified()
+           ">
+      <br />
+      <div metal:define-macro="pagemanagementform" tal:omit-tag="">
+        <form method="post" action="" enctype="multipart/form-data"
+              tal:attributes="action here/page_url" 
+              style="margin-top:0;margin-bottom:0">
+          <table border="0" cellspacing="0" cellpadding="1" align="center"
+                 class="shade1" width="100%" style="font-size:90%;"
+                 >
+            <tr>
+              <td align="left" valign="top">
+                <!-- help text -->
+                <span i18n:translate="">new</span> 
+                <span i18n:translate=""
+                      tal:condition="python:user.has_permission('Zwiki: Reparent pages',here)" 
+                      >parent, </span>
+                <span i18n:translate=""
+                      tal:condition="python:user.has_permission('Zwiki: Rename pages',here)" 
+                      >name, </span>
+                <span i18n:translate=""
+                      tal:condition="python:user.has_permission('Zwiki: Delete pages',here)" 
+                      >replacement, </span>
+                <span i18n:translate=""
+                      tal:condition="python:user.has_permission('Zwiki: Add pages',container)"
+                      >subtopic</span
+                      ><span tal:condition="not:here/inCMF" tal:omit-tag="">:</span>
+                <span tal:condition="here/inCMF" tal:omit-tag="" comment="cmf/plone layout hint"
+                      ><span i18n:translate="">for this page</span>:<br />
+                </span>
+                <!-- multi-purpose input field and buttons -->
+                <input name="pagename" type="text" size="25" maxlength="100" value="" 
+                       class="formfield"
+                       title="enter a page name and click buttons to the right (mouse over for help)"
+                       i18n:attributes="title"
+                /><span style="white-space:nowrap;"
+                ><input type="submit" name="reparent:method" value="reparent" 
+                        style="font-weight:normal;"
+                        title="make this page a subtopic of the page you have entered"
+                        i18n:attributes="value title"
+                        tal:condition="python:user.has_permission('Zwiki: Reparent pages',here)" 
+                /><input type="submit" name="rename:method" value="rename" 
+                         style="font-weight:normal" 
+                         title="rename this page to the name you have entered, updating all links"
+                         i18n:attributes="value title"
+                         tal:condition="python:user.has_permission('Zwiki: Rename pages',here)" 
+                /><input type="submit" name="delete:method" value="delete!" 
+                         style="font-weight:normal"
+                         title="delete this page, and redirect links to the page you have entered, if any"
+                         i18n:attributes="value title"
+                         tal:condition="python:user.has_permission('Zwiki: Delete pages',here)" 
+                /><input type="submit" name="createform:method" value="create" 
+                         style="font-weight:normal"
+                         title="create a page with the name you have entered, as a subtopic of this one"
+                         i18n:attributes="value title"
+                         tal:condition="python:user.has_permission('Zwiki: Add pages',container)" 
+                /></span>
+              </td>
+            </tr>
+          </table>
+        </form>
+      </div>
+    </div>
+    
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/ChangeLog
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/ChangeLog	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/ChangeLog	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,127 @@
+Zwiki 0.56:
+* added to Zwiki repo as plugins/mathaction
+  mathaction is now shipped with Zwiki, as one of the standard plugins.
+  I'll note the main changes I've made from the original; see the darcs
+  history for full detail. After this, changes will be noted only in
+  ZWiki/CHANGES.txt, probably.
+* move page types to pagetypes.py
+* some page type renaming & relabelling for consistency
+* remove VERSION.txt
+* move stxlatex experiments to a subdirectory 
+
+mathaction-sm 0.55:
+* Simplified file structure like other pagetypes/plugins
+* Commented out all but the math and pamphlet page types
+* Updated to work with current Zwiki; tested with 0.55
+* Does not do zwiki version checking at startup
+* Does not install default latexwiki wiki automatically
+
+LatexWiki 0.33:
+* Move to non-blocking I/O on our sockets (prevents a hang when a page
+  contains many equations)
+* In Extensions/Install.py look in both SOFTWARE_HOME and INSTANCE_HOME for
+  the zwiki directory for our site template.  (Fix for Zope 2.7 / Plone 2.0)
+* latexwiki.css: Check for any ZWikiPage in the folder for including
+  /stylesheet, and do not include it if we are in plone (portal_factory
+  exists)
+
+LatexWiki 0.32:
+* move imageDoesNotExist outside of enclosing function (fix for python 2.1?)
+* Use 'dvips -o' (some dvips don't create .ps by default -- then what is it
+  doing?!?!  Making souffle?!?!?!)
+* Use full path for LocalFS images/
+* Better escaping of equations to appear in img alt=
+* Support $$eqn$$ display mode for equations
+* check for itex and enable existing code if it is found.  itex 0.8 can be
+  found here: http://golem.ph.utexas.edu/~distler/blog/archives/000355.html
+* add latexwiki.css.dtml which imports the default ZWiki stylesheet, and
+  appropriate wikipage.pt changes.
+* Created Extensions/Install.py for the CMF Quick Installer 
+* Modified latexwiki.css to only include FrontPage/stylesheet if there is a
+  FrontPage, and small tweaks to make latexwiki.css work with Plone.
+* Rework to support new ZWiki 0.32 pagetypes layout
+* Added diffform.pt so it includes latexwiki.css (will have to add others)
+
+LatexWiki 0.29:
+* Change version 0.25 -> 0.29 (to be same as ZWiki 0.29) after complaints, and
+  even I screwed up the download link.
+
+LatexWiki 0.25:
+* variable font size via the folder properties "latex_font_size", 
+  "latex_align_fudge", "latex_res_fudge".  Further refinements will probably
+  be necessary.
+* Fixed dot-chopping code so $\cdot \cdot$ doesn't generate an error.
+  (Thanks to Kyle Cranmer)
+* New Page Type:  ZwikiHtmlLatexPageType (HTML + LaTeX) should be able to feed
+  this straight into itex2MML
+* Fixed parsing of LaTeX so that $\begin{array} a \\ b \end{array}$ works
+* Fixed escaping so that $\$$ works
+* Be more careful using os.chdir().  We can tell LocalFS to use the relative
+  directory "LatexWiki" now.  Zope sees its CLIENT_HOME by default.
+* Modify ZWiki to be able to import the necessary elements of a LatexWiki site
+* LatexWiki template site (ZWiki/content/latexwiki,
+  LatexWiki/Extensions/setup_latexwiki.py)
+* User font selection and font size adjustment in UserOptions (and
+  stylesheet.css)
+
+LatexWiki 0.24:
+* Make ourselves appear first (and therefore default) in the list of possible
+  document types when creating a new document.
+* Added <span class="latexwiki"> to pages and a ploneCustom.css for plone
+  that will get text the right size and equations aligned.
+* Fixed links with equations not getting marked up.  (look for STX behavior
+  differences here)  Equation color does not match link color.
+
+LatexWiki 0.23:
+* Changed to pslatex/dvipdf rather than pdflatex so that postscript specials
+  work (axodraw/feynman diagrams in particular for me)
+* Fixed latexWrapper importing App::ImageFile rather than PIL::ImageFile
+
+LatexWiki 0.22:
+* Update for ZWiki 0.26 (should work with 0.25 too)
+* When latex gives us a blank page, bail properly. (try $\latex$)
+* See the new UPGRADE file.
+
+LatexWiki 0.21:
+* \( \) syntax for in-line equations works now.  
+* Fixed some issues with \[\]
+* Fixed equation numbering to not mark up O(1), and typo \3->\2
+* Prevent us from marking up escaped latex when it appears twice.
+* Fixed python bug with buffer sizes.  When there were a large number of
+  images on a page, ghostscript would hang writing to stderr (bbox run) and
+  python seems to ignore the buffer size argument to popen3.  Changed to a
+  poll/read loop.
+
+LatexWiki 0.20:
+* Added stylesheet.css
+* Updated INSTALL.txt to reflect ZWiki 0.23 install procedure, and stylesheet
+  use instead of standard_zwiki_header.
+* Found VERSION.txt, and updated it.
+* Updated __init__.py to be compatible with ZWiki 0.23 (thanks to Drew).
+* Prevent us from trying to render 0x0 pngs (which causes an error the first
+  time it happens).  Now we render a 1x1 transparent png.
+* Change the Ghostscript resolution 130 -> 126.  The characters look better,
+  the 'Y' doesn't have tits on the top, and lower case letters are larger (!)
+  and line up with the text better.
+* Fix the \[ \] in-line LaTeX mode. (is a block mode)
+* Fix equation numbers when they appear at the end of a file.
+
+10/3/2003 Release
+* Add equation numbers with internal hyperlinks.
+* Fixed rendering of images multiple times when the same equation appears more than once.
+* Fixed block equations to not have extra space after the equation.
+* Used PIL and 'gs -sDEVICE=bbox' to modify png's so that they line up with
+  the surrounding text.
+* Removed extra space after block images
+* Fixed bad indenting of lists that contained block equations
+* Fixed escaping: latex can be preceeded by a '!' to prevent it from being
+  rendered as LaTeX.
+* Use alpha channel PNG's, so that equations look right no matter what
+  background your page has.
+* Fix the replacement of dollar signs '$' when the same in-line equation
+  occurs twice.  Escaped in-line equations now have the dollar signs converted
+  to HTML entities &#36;
+* Commented out code that adds the original latex for a block equation in an
+  html comment <!-- \begin{equation}... etc --> so that LatexWiki doesn't
+  destroy existing comments.  We still mark up equations inside HTML comments
+

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/Extensions/Install.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/Extensions/Install.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/Extensions/Install.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,117 @@
+##############################################################################
+#
+# Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE
+# 
+##############################################################################
+"""
+CMF ZWiki Installation script
+
+This file is a CMF installation script for LatexWiki.  It's meant to be used
+as an External Method. Compatible with the CMF quick installer, or to use
+manually, add an external method to the root of the CMF or Plone Site that
+you want LatexWiki registered in with the configuration:
+
+ id:            cmf_install_latexwiki
+ title:         
+ module name:   LatexWiki.Install
+ function name: install
+
+Then call this method in the context of the CMF/Plone site, by visiting
+http://SITEURL/cmf_install_latexwiki . The install function will execute and
+give information about the steps it took.
+"""
+
+import string, os, sys
+from Products.LatexWiki.util import workingDir
+from cStringIO import StringIO
+from OFS.DTMLMethod import DTMLMethod
+from OFS.Image import Image, File
+from OFS.ObjectManager import customImporters
+from ZODB.PersistentMapping import PersistentMapping
+from Products.CMFCore.TypesTool import ContentFactoryMetadata
+from Products.CMFCore.DirectoryView import addDirectoryViews
+from Products.CMFCore.utils import getToolByName
+from Products.ZWiki.CMFInit import wiki_globals, factory_type_information
+from Products.ZWiki.ZWikiPage import ZWikiPage
+from Products.ZWiki.ZWikiWeb import _addDTMLMethod
+from Products.ZWiki.Defaults import PAGE_PORTALTYPE#,ALLOWED_PAGE_TYPES_IN_PLONE
+
+
+def install(self):
+    """
+    Create images directory and add some necessary properties to the folder.
+    """
+    out = StringIO()
+    out.write('Adding properties to folder\n')
+    if not self.hasProperty('allow_dtml'):
+        self.manage_addProperty('allow_dtml', 'true', 'boolean') 
+    if not self.hasProperty('latex_font_size'):
+        self.manage_addProperty('latex_font_size', 18, 'int')
+    if not self.hasProperty('latex_align_fudge'):
+        self.manage_addProperty('latex_align_fudge', 0.0, 'float')
+    if not self.hasProperty('latex_res_fudge'):
+        self.manage_addProperty('latex_res_fudge', 0.97, 'float') 
+    if(not os.access(workingDir, os.F_OK)): 
+        os.mkdir(workingDir)
+        out.write('LatexWiki image directory %s created'%(workingDir)) 
+    id = 'images'
+    # Transition to this once we are storing images in the ZODB ob =
+    # BTreeFolder2(id) 
+    ob = None 
+    try: 
+        from Products.LocalFS.LocalFS import LocalFS 
+        ob = LocalFS(id, '', workingDir, None, None) 
+    except ImportError: # no localfs
+        out.write('Error: LocalFS not installed.  LatexWiki requires LocalFS.')
+# FileSystemSite does not automatically refresh when the contents of the
+# filesystem chages.  I'm not sure if it's possible to enable that...
+#        try:
+#            from Products.FileSystemSite.DirectoryView import DirectoryView
+#            ob = DirectoryView(id, workingDir)
+#        except ImportError:
+#            zLOG.LOG('LatexWiki',zLOG.DEBUG,'FileSystemSite not installed either')
+    # FIXME: try Ape too
+    if ob != None:
+        self._setObject(id, ob, set_owner=1)
+    else:
+        out.write('ERROR: Failed to find a suitable filesystem product')
+
+    filename = 'latexwiki.css.dtml'
+    dir = sys.modules['__builtin__'].SOFTWARE_HOME + os.sep \
+          + 'Products/ZWiki/content/latexwiki'
+    if(not os.access(dir, os.F_OK)):
+        dir = sys.modules['__builtin__'].INSTANCE_HOME + os.sep \
+              + 'Products/ZWiki/content/latexwiki'
+    text = open(dir + os.sep + filename).read()
+    _addDTMLMethod(self, 'latexwiki.css', title='', file=text)
+    filename = 'blank.gif.gif'
+    text = open(dir + os.sep + filename).read()
+    self._setObject('blank.gif', Image('blank.gif', '', text))
+    filename = 'pngbehavior.htc.zexp'
+    connection = self.getPhysicalRoot()._p_jar
+    self._setObject('pngbehavior.htc', connection.importFile(dir + os.sep + filename, 
+        customImporters=customImporters))
+    id = 'ploneCustom.css'
+    if hasattr(self,id):
+        ploneCustom = self._getOb(id)
+        self._setObject(id, File(id, '', '@import url("latexwiki.css");'))
+    else:
+        text = ploneCustom.text() 
+        if(not re.match(r'@import url\("latexwiki.css"\);', text)):
+            text = text + '\n at import url("latexwiki.css");';
+        ploneCustom.write(text)
+    return out.getvalue()
+
+# TODO:
+#   Copy ploneCustom.css and/or latexwiki.css.dtml
+# If ploneCustom.css exists, add a line:
+# @import url(http://localhost/Plone/latexwiki.css);
+# Else create ploneCustom.css with only this line.
+# Import latexwiki.css.dtml

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/Extensions/__init__.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/Extensions/__init__.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/Extensions/__init__.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1 @@
+# this is here so that setup_latexwiki is recognized as a module.

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/Extensions/setup_latexwiki.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/Extensions/setup_latexwiki.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/Extensions/setup_latexwiki.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,45 @@
+# setup script for a new LatexWiki site.
+
+import os, zLOG
+from Products.ZWiki.plugins.mathaction.util import workingDir
+# for equations-in-ZODB
+#from Products.BTreeFolder2.BTreeFolder2 import BTreeFolder2
+
+def setup_latexwiki(self): 
+    """ Add required attributes to new LatexWiki site, and then remove this method 
+    """ 
+    if not hasattr(self,'allow_dtml'):
+        self.manage_addProperty('allow_dtml', 'true', 'boolean') 
+    if not hasattr(self,'latex_font_size'):
+        self.manage_addProperty('latex_font_size', 18, 'int')
+    if not hasattr(self,'latex_align_fudge'):
+        self.manage_addProperty('latex_align_fudge', 0.0, 'float')
+    if not hasattr(self,'latex_res_fudge'):
+        self.manage_addProperty('latex_res_fudge', 0.97, 'float') 
+    if(not os.access(workingDir, os.F_OK)): 
+        os.mkdir(workingDir)
+        zLOG.LOG('LatexWiki',zLOG.DEBUG, 'LatexWiki image directory %s created'%(workingDir)) 
+    id = 'images'
+    if not hasattr(self,'images'):
+        ob = None 
+        try: 
+            from Products.LocalFS.LocalFS import LocalFS 
+            ob = LocalFS(id, '', workingDir, None, None) 
+        except ImportError: # no localfs
+            zLOG.LOG('LatexWiki',zLOG.ERROR,'LocalFS not installed')
+    # FileSystemSite does not automatically refresh when the contents of the
+    # filesystem chages.  I'm not sure if it's possible to enable that...
+    #        try:
+    #            from Products.FileSystemSite.DirectoryView import DirectoryView
+    #            ob = DirectoryView(id, workingDir)
+    #        except ImportError:
+    #            zLOG.LOG('LatexWiki',zLOG.DEBUG,'FileSystemSite not installed either')
+        if ob != None:
+            self._setObject(id, ob, set_owner=1)
+        else:
+            zLOG.LOG('LatexWiki', zLOG.ERROR, 
+                'Failed to find a suitable filesystem product')
+    self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1'])
+    #self._delObject('setup_latexwiki')
+
+

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/Extensions/tangle.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/Extensions/tangle.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/Extensions/tangle.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,58 @@
+import os, sys, popen2, select, fcntl, string, zLOG
+from cStringIO import StringIO
+class NowebError(Exception): pass
+
+def tangle(self, REQUEST, RESPONSE):
+
+  """notangle output
+  """
+
+  def n2rn(s):
+    return s.replace('\n', '\r\n')
+
+  # Make our file descriptors nonblocking so that reading doesn't hang.
+  def makeNonBlocking(f):
+    fl = fcntl.fcntl(f.fileno(), fcntl.F_GETFL)
+    fcntl.fcntl(f.fileno(), fcntl.F_SETFL, fl | os.O_NONBLOCK)
+
+  def runCommand(cmdLine,stdin):
+    program = popen2.Popen3(cmdLine, 1)
+    program.tochild.write(stdin)
+    program.tochild.close()
+    makeNonBlocking(program.fromchild)
+    makeNonBlocking(program.childerr)
+    stderr = []
+    stdout = []
+    erreof = False
+    outeof = False
+    while(not (erreof and outeof)):
+        readme, writme, xme = select.select([program.fromchild, program.childerr], [], [])
+        for output in readme:
+            if(output == program.fromchild):
+                text = program.fromchild.read()
+                if(text == ''): outeof = True
+                else: stdout.append(text)
+            elif(output == program.childerr):
+                text = program.childerr.read()
+                if(text == ''): erreof = True
+                else: stderr.append(text)
+    status = program.wait()
+    error = os.WEXITSTATUS(status) or not os.WIFEXITED(status)
+    return error, string.join(stdout, ''), string.join(stderr, '')
+
+  def log(message,summary='',severity=0):
+        zLOG.LOG('LatexWikiDebugLog',severity,summary,message)
+
+  def runTangle(stdin,chunk):
+    cmdLine = "/usr/bin/notangle -R'%s' -"%chunk
+    err, stdout, stderr = runCommand(cmdLine,stdin)
+    if err:
+        log('%s\n%s\n%s\n%s\n'%(cmdLine, err, stdout, stderr), 'NowebError')
+        raise NowebError(stderr+'\n'+stdout)
+    return stdout
+
+  RESPONSE.setHeader('Content-Type', 'text/plain')
+  # RESPONSE.setHeader('Content-Disposition', 'attachment; filename="%s"' % self.getId())
+  return n2rn(runTangle(self.document(),REQUEST.chunk))
+
+

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/INSTALL.txt
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/INSTALL.txt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/INSTALL.txt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,65 @@
+Installing LatexWiki (Standalone)
+
+  1. Make sure that you have the required components installed. 
+     This product requires:
+
+     * "Zope":http://www.zope.org 2.6 or later
+     
+     * Python 2.2 or later
+
+     * the "ZWiki Zope product":http://www.zwiki.org 0.32 or later
+
+     * the "LocalFS":http://www.easyleading.org/Downloads/ Zope product
+
+     * Ghostscript 6.0.5 or later with PDF and PNG support
+
+     * A working LaTeX installation including latex and dvips
+
+     * The "Python Imaging Library":http://www.pythonware.com/products/pil/
+
+     In debian you can::
+
+       apt-get install tetex-base tetex-bin tetex-extra gs zope python2.2-imaging
+
+     ZWiki and LocalFS must be installed manually.  (Just untar them into the Products
+     directory, similar to step 2)
+
+  2. Unpack the LatexWiki distribution into your Zope installation's
+     Products directory (usually /usr/lib/zope/lib/python/Products) with a
+     command such as::
+
+       tar -zxvf LatexWiki-0.32.tar.gz
+
+  3. If you do not already have a Wiki, create one by going to the Zope
+     management interface and selecting ZWiki from the pulldown in the
+     upper right.  For "Type", select "latexwiki".
+
+Installing LatexWiki in Plone (See also: "PloneAndCMF":http://zwiki.org/Chapter13PloneAndCMF)
+
+  1. Do steps 1 and 2 above.
+
+  2. Install the CMF Quick Installer (included with Plone 2.0)
+  
+  3. Create a 'Plone Site' from the dropdown in the ZMI.
+
+  4. Add a 'CMF Quick Installer' tool to your new plone site.
+
+  5. Click on this new plone_cmfquickinstaller node in the ZMI.  You should see
+      both ZWiki and LatexWiki.  Install both.  
+      
+  6. Create a ZWiki Page.  You will have to press shift-reload in your browser
+     when viewing this new page in order to get the new latexwiki stylesheets
+     that get installed in step 5.
+
+I recommend removing one of the two sidebars in Plone.  LatexWiki requires a
+somewhat large font to make latex readable, which looks bad when put into
+Plone's narrow document window between two sidebars.  
+
+    To do this: 
+
+        1. Go to your plone folder in the ZMI
+
+        2. Click the "Properties" tab
+
+        3. Delete the lines in either the "right_slots" or "left_slots"
+           properties.

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/LICENSE.txt
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/LICENSE.txt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/LICENSE.txt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,16 @@
+LatexWiki - a patch to ZWiki for rendering embedded LaTeX code
+Copyright (C) 2001 Open Software Services <info at OpenSoftwareServices.com>
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/Notes
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/Notes	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/Notes	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,190 @@
+Startup time is 
+    0.123u 0.016s 0:00.18 72.2%     0+0k 0+0io 0pf+0w
+
+Time to get bbox for sample pdf generated by:
+    http://mcelrath.org/Notes/Littlest%20Higgs%20Phenomenology
+    time sudo -u zope gs -dSAFER -dDOINTERPOLATE -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dNOPAUSE -dBATCH -r130 -sDEVICE=bbox -sOutputFile=bob-%03d.png *.pdf
+    0.427u 0.031s 0:00.52 86.5%     0+0k 0+0io 0pf+0w
+    0.427u 0.023s 0:00.50 88.0%     0+0k 0+0io 0pf+0w
+    0.423u 0.029s 0:00.49 89.7%     0+0k 0+0io 0pf+0w
+    0.415u 0.036s 0:00.46 95.6%     0+0k 0+0io 0pf+0w
+    0.422u 0.027s 0:00.49 89.7%     0+0k 0+0io 0pf+0w
+Time to ghostscript the same thing:
+    time sudo -u zope gs -dSAFER -dDOINTERPOLATE -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dNOPAUSE -dBATCH -r130 -sDEVICE=pnggray -sOutputFile=bob-%03d.png *.pdf
+    2.456u 0.042s 0:02.52 98.8%     0+0k 0+0io 0pf+0w
+    2.517u 0.036s 0:02.57 98.8%     0+0k 0+0io 0pf+0w
+    2.478u 0.040s 0:02.55 98.4%     0+0k 0+0io 0pf+0w
+    2.478u 0.039s 0:02.53 98.8%     0+0k 0+0io 0pf+0w
+    2.461u 0.037s 0:02.53 98.4%     0+0k 0+0io 0pf+0w
+time sudo -u zope convert -scale 1075x1520 *.pdf bobconvert-%03d.png 
+    37.981u 0.439s 0:38.47 99.8%    0+0k 0+0io 0pf+0w
+    eek!
+time sudo -u zope mogrify -crop 204x13+204+692 bob-001.png bobnew-001.png
+    0.296u 0.039s 0:00.38 84.2%     0+0k 0+0io 0pf+0w
+
+time sudo -u zope mogrify -crop 0x0+2+2 bob-002.png
+    0.731u 0.045s 0:00.82 93.9%     0+0k 0+0io 0pf+0w
+    0.731u 0.040s 0:00.81 95.0%     0+0k 0+0io 0pf+0w
+    0.756u 0.040s 0:00.84 94.0%     0+0k 0+0io 0pf+0w
+    0.746u 0.039s 0:00.81 95.0%     0+0k 0+0io 0pf+0w
+    0.734u 0.041s 0:00.81 95.0%     0+0k 0+0io 0pf+0w
+
+time gs -dSAFER -dDOINTERPOLATE -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dNOPAUSE -r125 -sDEVICE=pnggray -sOutputFile=test-%03d.png test.pdf < gsscript
+    5.665u 0.237s 0:06.60 89.2%  0+0k 0+0io 0pf+0w
+    5.698u 0.225s 0:06.76 87.4%  0+0k 0+0io 0pf+0w
+    5.696u 0.273s 0:06.92 86.1%  0+0k 0+0io 0pf+0w
+time source gsscript2
+    6.012u 0.317s 0:08.04 78.6%     0+0k 0+0io 0pf+0w
+    5.961u 0.312s 0:06.99 89.6%     0+0k 0+0io 0pf+0w
+    5.955u 0.311s 0:06.96 89.9%     0+0k 0+0io 0pf+0w
+
+
+
+Latex runs in (almost) constant time no matter how many pages are in the file.
+latex with existing LatexTemplate takes 0.2s.  
+    Removing all included packages takes 0.06-0.07s.  
+dvips -E takes 0.04-0.05s (indep of latex template).
+gs -sDEVICE=bbox takes 0.145s.
+eqn2img gives this command to ghostscript:
+      fprintf(gs, "%i neg %i neg translate\n", xoffset, yoffset);
+    can I get it to print the bbox without restarting?
+    Bounding Box printed in postscript by default is not tight.
+latex + dvips -E + gs bbox + gs + custom code = 0.25s + custom / eqn.
+pdflatex + gs
+(bbox) selectdevice
+(test.pdf) run
+1 showpage      (runs a particular page)
+
+
+Alignment:
+    on hawk: 
+        lowercase letters are exactly 8 pixels high (a,e, not y) 
+            Helvetica (Adobe) 14pt
+        Top of upper case letters to bottom of 'y' is 16px.
+    on draal:
+        lowercase letters are 9px, upper case plus 'y' is 15px.
+        (recopy TODO* from hawk)
+    Perhaps make all things less than 16px to 16px.  Can measure latex height
+    with a little latex:
+        \cdot Wj
+    Make this 16px scalable (match browser with latex)
+    anything else gets expanded by 2.
+
+    || or \left|\right| is getting second bar (first?) chopped sometimes.
+
+    1px too much is removed in 'e'.
+
+Documentation:
+    Fix README: -imagemagick +pil
+    Note about standard_header CSS template.
+    Change resolutions?
+
+1/22/2004
+    Rendering comments:
+        Stx is inserting <p>...</p> around every line.  When the whole page is
+        rendered it does not handle the page and comments separately.  Comment
+        headings should not be treated as Stx, and message bodies should only
+        be treated as Stx if the PageType class calls for it.
+
+1/31/2004
+    More timing tests.  I've switched to pslatex so I can use axodraw (requires
+    postscript specials so doesn't work with pdflatex)  dvips can spit out an
+    eps with a tight bbox for each page, which could speed things up significantly.
+    Timing tests on draal (600MHz alpha 21164), 512MB RAM)
+        pslatex/dvipdf: (looks crappy)
+            6.255u 0.469s 0:08.25 81.3%     0+0k 0+0io 0pf+0w
+        pslatex/dvips:  (looks best)
+            5.503u 0.385s 0:07.06 83.2%     0+0k 0+0io 0pf+0w
+        pdflatex:       (looks better)
+            5.696u 0.359s 0:07.12 84.8%     0+0k 0+0io 0pf+0w
+    appears to be only 10pt and 12pt available in latex
+    -dAlignToPixels=1
+        affects neither ps or pdf mode.
+
+2/2/2004
+    code='$\mathrm{Y}$' topsize=7.866667, bottomsize=4.133333, centerline = 7.866667, ne
+    wheight=15.733333, widentop=0.000000, widenbottom=0.000000, chopx=2.000000
+    code='$\mathrm{j}$' topsize=6.866667, bottomsize=7.133333, centerline = 6.866667, ne
+    wheight=14.266667, widentop=0.266667, widenbottom=0.000000, chopx=2.000000
+
+    code='$m$' topsize=3.866667, bottomsize=4.133333, centerline = 3.866667, newheight=8
+    .266667, widentop=0.266667, widenbottom=0.000000, chopx=2.000000
+    code='$G$' topsize=7.866667, bottomsize=4.133333, centerline = 7.866667, newheight=1
+    5.733333, widentop=0.000000, widenbottom=0.000000, chopx=2.000000
+
+
+    16px    centerline + 0.0666666
+    17px    centerline + 0.1333333
+    18px    centerline + 0
+
+2/3/2004
+    gs does not produce pnggray files that are the correct resolution for an 8.5x11 page.
+    scale factor is 1.063 (DPI larger than requested)
+    Is it only imaging a sub-region of the page?
+    produces the proper resolution:
+        gs-gnu 7.05 daneel 
+        /usr/local/bin/gs 8.11 on moya
+        gs-aladdin 7.04 on moya
+        gs-gnu 7.07 on moya
+        gs-esp 7.07 on moya
+
+    Size/Align/Res combinations that look good:
+        18  0     0.97  Times New Roman
+        17  0     1.03  
+        16  0.5   0.97  
+
+StructuredTextLatex changes:
+    remove ZWikiPage.applyWikiLinkLineEscapesIn (not needed)
+    remove ZWikiPage.protectLine
+    remove ZWikiPage.links (not used)           (note dtml-accessable but not used)
+    remove ZWikiPage.canonicalLinks (not used)  (note dtml-accessable but not used)
+    wikilink() called from DTML should really call ZWikiPage.renderLink
+
+6/4/2004:
+    How to do mathml with tex4ht:
+        1) include:
+            \usepackage[xhtml,mathml,no-DOCTYPE]{tex4ht}
+           in document preamble
+        2) latex $1.tex
+           tex4ht -f/$1.tex -i/usr/share/texmf/tex4ht/ht-fonts/ -cunihtf
+           t4ht -f/$1.tex
+        3) 
+            import sys
+            from xml.dom.ext.reader import Sax2
+            from xml.dom.ext import Print
+
+            reader = Sax2.Reader()
+            document = reader.fromStream(sys.stdin)
+            for math in document.getElementsByTagName('math'):
+                #... math is the MathML, in order it appeared in the document.
+
+        Can use one run of latex if we only look at the last N pages of the dvi
+        file:
+            dvips -p 228
+
+    times on navi:
+    dvips -e 0 may help with characters moving about...
+    latex (w/tex4ht usepackage)                                 0.94s
+           w/o tex4ht usepackage)                               0.25s
+    dvicopy -page-start 228 -max-pages=1 blah.dvi blah2.dvi     0.001s
+    dvips -E blah2.dvi blah2.ps                                 0.06s
+    gs ... (creates a full-page png :()                         0.2s
+        gs creating all images at once: (average of 229p)       0.0947s
+    convert blah2.ps blah2.png                                  0.136s
+
+    The altimg tag may be parsable by XSLT into an img tag.
+    Konqueror is pickier about XML than Mozilla -- use it to check
+MathML rendering errors:
+    mi { margin: -0.15em; } does not get applied to mi's in super/subscript.
+    spacing if <mi>sin</mi> sin is inconsistent -- i-n has more space than s-i.
+6/24/2004:
+    Plone interaction:
+        got plone quick installer working
+
+        Plone uses a <base href="http://localhost/Plone"> tag which gives the
+        WRONG page for the one you're looking at, and makes <a name> links
+        fail.
+
+        restore ALLOWED_PAGE_TYPES_IN_PLONE?  need to remove wwml for plone...
+
+        Plone skin w/header is CMFPlone/skins/plone_templates/header.pt

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/README.txt
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/README.txt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/README.txt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,52 @@
+LatexWiki readme
+
+ This zope product is a patch to "ZWiki":http://zwiki.org that allows
+ you to include LaTeX markup in wiki pages.  LaTeX is a document
+ typesetting system based on !TeX; information is available at the
+ "Latex project homepage":http://www.latex-project.org/.  LatexWiki
+ adds a new !ZWikiPage type called "stxlatex" which renders
+ "Structured Text":http://www.zope.org/Documentation/Articles/STX
+ with inline LaTeX and replaces the markup with an image.
+
+ This product requires 
+
+   * "Zope 2.6":http://www.zope.org/ or later
+   
+   * Python 2.2 or later
+
+   * the "ZWiki 0.32":http://www.zwiki.org/ Zope product
+
+   * the "LocalFS":http://www.zope.org/Members/jfarr/Products/LocalFS
+     Zope product 
+
+   * "Ghostscript 6.0.5":http://www.ghostscript.com/ or later with the
+     following options compiled in (which is the case in most
+     installations of Ghostscript)
+
+     * PNG output device support
+
+   * A working LaTeX installation including latex and dvips (we use
+     "teTex":http://www.tug.org/teTeX/)
+
+   * The "Python Imaging Library":http://www.pythonware.com/products/pil/
+
+ For those running large distributions such as Red Hat Linux, many of
+ the necessary tools (Ghostscript, LaTeX) are probably already installed. For
+ those running FreeBSD, you will find the necessary items in the ports tree.
+ Your mileage may vary. 
+
+ Information on installing LatexWiki is in the INSTALL.txt file.
+
+ This product has been tested on FreeBSD 4.2 and Zope 2.4.1.  It has also been
+ tested on Zope 2.6.1 and ZWiki 0.14 under Debian.
+
+ (c) 2001 Open Software Services <info at OpenSoftwareServices.com>
+ portions (c) 2003 Bob McElrath <bob+latexwiki at mcelrath.org>
+ This product is available under the GPL - see LICENSE.txt
+ All rights reserved, all disclaimers apply, etc.
+
+NEW NOTES:
+
+pamphlet pages:
+- install dvipng
+- install http://daly.axiom-developer.org/axiom.sty as /usr/local/share/texmf/tex/latex/axiom.sty and run mktexlsr

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineAxiom.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineAxiom.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineAxiom.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,140 @@
+
+"""
+ReplaceInlineAxiom.py v. 0.2.3
+  Replace Axiom command \\begin{axiom} \\end{axiom} blocks with LaTeX
+"""
+
+import re
+from string import join,replace
+
+n=1
+
+def replaceInlineAxiom(body):
+    from axiomWrapper import renderAxiom
+    errorMessage = """\n<hr/><font size="-1" color="red">
+    Some or all expressions may not have rendered properly,
+    because Axiom returned the following error:<br/><pre>%s</pre></font>"""
+
+    reConsts = re.MULTILINE+re.DOTALL
+    axiomInPattern = re.compile(
+        r'[ \t]*(?<!!)\\begin *{axiom}\s*(.*?)\s*\\end *{axiom}|' #0
+        r'(?<!!)\\spadcommand{(.*?)}|'                            #1
+        r'[ \t]*(?<!!)(\\begin *{spad}\s*.*?\s*\\end *{spad})|'   #2
+        r'[ \t]*(?<!!)(\\begin *{aldor}\s*.*?\s*\\end *{aldor})|' #3
+        r'[ \t]*(?<!!)(\\begin *{boot}\s*.*?\s*\\end *{boot})|'   #4
+        r'[ \t]*(?<!!)(\\begin *{lisp}\s*.*?\s*\\end *{lisp})',   #5
+        reConsts)
+    axiomOutPattern = re.compile(
+        r'\s*\n\$\$(.*?)\s*\n\$\$|'      #1
+        r'\s*(Type: [^\n]*)|'            #2
+        r'\s*Loading ([^ ]*?)\.(?=\s)|'  #3
+        r'\s*Loading ([^ ]*?) for (package|domain|category)\s+(.*?)\s|' # 4,5,6
+        r'\s*((?:.(?!\s*Type:)(?!\s*\n\$\$)(?!\s*Loading)(?!\s*Compiling))*.)', #7
+        reConsts)
+    requires = dict({'package':[],'domain':[],'category':[]})
+
+    def htmlMarkup(code):
+        newcode = code
+#       newcode = re.compile(r'\n',reConsts).sub(r' \n',newcode)
+        newcode = re.compile(r'\n\s*\n+',reConsts).sub(r'\n',newcode)
+        return re.sub(r'([&<>\$\*_\'\\])',
+#                     r'([&<>\$\*\\_])',
+               lambda x: { '&':'&amp;',
+                           '<':'&lt;',
+                           '>':'&gt;',
+                           '$':'&#36;',
+                           '*':'&#42;',
+                           '#':'&#35;',
+                           '\\':'&#92;',
+                           '[':'![',
+                           '\'':'&apos;',
+                           '_':'&#95;'
+                         }[x.group(1)],newcode)
+
+    def fixLoadingInTex(N):
+        if N.group(4): # Load WikiNames
+            requires[N.group(5)].append('['+N.group(6)+']')
+            return '' # We list them later
+        else:
+            return N.group(1) or N.group(2) or N.group(3) or N.group(7)
+
+    def fixEmbedded(x):
+        return axiomOutPattern.sub(fixLoadingInTex,x)
+
+    def linebreak(x):
+        # XXX can't build texbreaker yet
+        return x 
+        #from texbreaker import texbreak, cvar # Robert Sutor's C program
+        #texbreak(replace(x,'\n',' '))
+        #return cvar.bufout
+    
+    def translateOutput(N):  
+        global n
+        if N.group(1): # Equation
+            return '\\begin{equation}%s\\end{equation}\n'% \
+                linebreak(re.sub(r'\\leqno\(.*?\)',r'',fixEmbedded(N.group(1))))
+        if N.group(2): # Type
+            return '<div align="right">%s</div>\n'%N.group(2)
+        if N.group(3): # Autoload messages
+            return '' # Ignore them
+        if N.group(4): # Load WikiNames
+            requires[N.group(5)].append({'category':'[Cat]:',
+                                         'domain':'[Dom]:',
+                                         'package':'[Pac]:'}[N.group(5)]+
+                                        N.group(6))
+            return '' # We list them later
+        if N.group(7):
+            if re.match(r'^\s*Compiling',N.group(7)): # compiler output
+                n=n+1
+                return '<div id="axiomtext"><div id="axiomlabel" title="Expand +/- Collapse folded text" align="right" onClick="expandcontent(this, this.nextSibling.id)" style="cursor:hand; cursor:pointer"><span class="showstate"></span>axiom</div><pre id="sc%d" class="switchcontent">%s</pre></div>\n'%(n,htmlMarkup(N.group(7)))
+            else: # command
+                return '<div id="axiomcode"><pre><div id="axiomlabel" align="right">axiom</div>%s</pre></div>\n'%htmlMarkup(N.group(7))
+        return 'Pattern Error'
+
+    def formatOutput(x):
+        global n
+        requires['package'] = []
+        requires['domain'] = []
+        requires['category'] = []
+        if   re.match(r'^\s*<spad>\n(.*?)</spad>\n(.*)$',x,reConsts):
+            m = re.match(r'^\s*<spad>\n(.*?)</spad>\n(.*)$',x,reConsts)
+            n=n+1
+            newCode = '''<div id="axiomcode"><pre><div id="axiomlabel" align="right">spad</div>%s</pre></div>
+<div id="axiomtext"><div id="axiomlabel" title="Expand +/- Collapse folded text"align="right" onClick="expandcontent(this, this.nextSibling.id)" style="cursor:hand; cursor:pointer"><span class="showstate"></span>spad</div><div id="sc%d" class="switchcontent"><pre>%s</pre></div></div>
+'''%(htmlMarkup(m.group(1)),n,htmlMarkup(m.group(2)))
+        elif re.match(r'^\s*<boot>\n(.*?)</boot>\n(.*)$',x,reConsts):
+            m = re.match(r'^\s*<boot>\n(.*?)</boot>\n(.*)$',x,reConsts)
+            n=n+1
+            newCode = '''<div id="axiomcode"><pre><div id="axiomlabel" align="right">boot</div>%s</pre></div>
+<div id="axiomtext"><div id="axiomlabel" title="Expand +/- Collapse folded text"align="right" onClick="expandcontent(this, this.nextSibling.id)" style="cursor:hand; cursor:pointer"><span class="showstate"></span>boot</div><div id="sc%d" class="switchcontent"><pre>%s</pre></div></div>
+'''%(htmlMarkup(m.group(1)),n,htmlMarkup(m.group(2)))
+        elif re.match(r'^\s*<lisp>\n(.*?)</lisp>\n(.*)$',x,reConsts):
+            m = re.match(r'^\s*<lisp>\n(.*?)</lisp>\n(.*)$',x,reConsts)
+            n=n+1
+            newCode = '''<div id="axiomcode"><pre><div id="axiomlabel" align="right">lisp</div>%s</pre></div>
+<div id="axiomtext"><div id="axiomlabel" title="Expand +/- Collapse folded text" align="right" onClick="expandcontent(this, this.nextSibling.id)" style="cursor:hand; cursor:pointer"><span class="showstate"></span>lisp</div><div id="sc%d" class="switchcontent"><pre>%s</pre></div></div>
+'''%(htmlMarkup(m.group(1)),n,htmlMarkup(m.group(2)))
+        elif re.match(r'^\s*<aldor>\n(.*?)</aldor>\n(.*)$',x,reConsts):
+            m = re.match(r'^\s*<aldor>\n(.*?)</aldor>\n(.*)$',x,reConsts)
+            n=n+1
+            newCode = '''<div id="axiomcode"><pre><div id="axiomlabel" align="right">aldor</div>%s</pre></div>
+<div id="axiomtext"><div id="axiomlabel" title="Expand +/- Collapse folded text" align="right" onClick="expandcontent(this, this.nextSibling.id)" style="cursor:hand; cursor:pointer"><span class="showstate"></span>aldor</div><div id="sc%d" class="switchcontent"><pre>%s</pre></div></div>
+'''%(htmlMarkup(m.group(1)),n,htmlMarkup(m.group(2)))
+        else:
+            newCode = axiomOutPattern.sub(translateOutput,x)
+ 
+        for module,names in requires.iteritems():
+          if names:
+              names.sort()
+              newCode = newCode + '\n<div><small>%s: %s</small></div>'%(module,join(names))
+        return newCode
+
+    axiomCodeIn = map(lambda x: x[0] or x[1] or x[2] or x[3] or x[4] or x[5],
+        axiomInPattern.findall(body))
+    (axiomCodeOut,errors) = renderAxiom(axiomCodeIn)
+    if not errors:
+        newCodeList = map(formatOutput,axiomCodeOut)
+        body = axiomInPattern.sub(lambda x:len(newCodeList) and newCodeList.pop(0) or '<font color="red">Axiom output parse error!</font>\n',body)
+    else:
+        body = "<pre>" + body + "</pre>" + errorMessage %(errors)
+    return body

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineHTML.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineHTML.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineHTML.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,31 @@
+
+"""
+ReplaceInlineHTML.py v. 0.2.4
+  Replace various LaTeX commands with HTML
+"""
+
+import re
+
+def replaceInlineHTML(body):
+    reConsts = re.MULTILINE+re.DOTALL
+    HTMLOutPattern = re.compile(
+       r'\{\\tt\s+(.*?)\}|'     #1
+        '\{\\bf\s+(.*?)\}|'     #2
+        '\\section\{(.*?)\}|'   #3
+        '\\subsection\{.*?\}|'  #4
+        '\{\\it\s+(.*?)\}',     #5
+    reConsts)
+    def translateOutput(N):  
+        if N.group(1): # \tt
+            return '<code>%s</code>'%N.group(1)
+        if N.group(2): # \bf
+            return  '<b>%s</b>'%N.group(2)
+        if N.group(3): # \section
+            return  '<h2>%s</h2>'%N.group(3)
+        if N.group(4): # \subsection
+            return  '<h3>%s</h3>'%N.group(4)
+        if N.group(5): # \it
+            return '<i>%s</i>'%N.group(5)
+        return ''
+
+    return HTMLOutPattern.sub(translateOutput,body)
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineLatex.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineLatex.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineLatex.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,172 @@
+"""
+Replace Latex math mode/\\begin{}\\end{} blocks with html img tag
+after rendering
+
+$Id: ReplaceInlineLatex.py,v 1.11 2001/09/07 14:21:16 rsbowman Exp $
+
+TODO:
+    test a table/array
+    use \\ref{shit} to make reference to equations.  Convert \\ref{shit} to the
+    appropriate (number): add negative match to latexPattern for \\ref, do a
+        s/// after generating an equation with a \\label.
+    Separate vertical alignment characters & into a new
+        \\end{equation}\\begin{equation} and then render the separate images in
+        a table to acheive vertical alignment.
+
+"""
+
+import re, os
+#from collections import deque
+from DocumentTemplate.html_quote import html_quote
+from util import fileNameFor, imagesPath, workingDir, getPngSize
+from string import strip, join, replace
+from latexWrapper import runCommand, log
+from ReplaceInlineAxiom import replaceInlineAxiom
+from ReplaceInlineReduce import replaceInlineReduce
+from ReplaceInlineMaxima import replaceInlineMaxima
+from ReplaceInlineHTML import replaceInlineHTML
+
+# This will fail on nested blocks \begin{array} \begin{array}...\end{array} \end{array} 
+# It is necessary for this to be all one regex (unfortunately) so that we do
+# not pick up equations inside \begin{latex}...\end{latex}, rather only the
+# outer delimiters.
+#latexPattern = r'(?<!\\)(?:\\\\)*(!?\$(?:[^\$\\]|\\[^\$\\]|\\\$|\\\\)*?\$|!?\\\((?:[^\\]|\\[^\)]|\\\\)*?\\\)|!?(?:\\begin{ *([^}]+?) *}.*?\\end{ *\2 *}|\\\[(?:[^\\]|\\[^\]]|\\\\)*?\\\]))'
+#latexPattern = r'(?<!\\)(?:\\\\)*(!?\$(?:[^\$\\]|\\[^\$\\]|\\\$|\\\\)*?\$|!?\\\((?:[^\\]|\\[^\)]|\\\\)*?\\\)|!?(?:[ \t]*\\begin{ *([^}]+?) *}.*?\\end{ *\2 *}[ \t]*\n?|\\\[(?:[^\\]|\\[^\]]|\\\\)*?\\\]))'
+#   r'!?(?<!\$)\$(?:[^\$\\\n ]|\\.)*?\$(?!\$)|'
+latexPattern = re.compile(
+  r'(?<!\\)(?:\\\\)*(!?\$\$(?:[^\$\\]|\\.)*?\$\$|'
+  r'!?\$(?:[^\$\\\n]|\\.)*?\$|'
+  r'!?\\\((?:[^\\]|\\[^\)]|\\\\)*?\\\)|'
+  r'!?(?:\\begin{ *([^}]+?) *}.*?\\end{ *\2 *}|'
+  r'\\\[(?:[^\\]|\\[^\]]|\\\\)*?\\\]))',
+  re.DOTALL)
+
+#latexRemoveDelim = r'^(?:(\$\$|\$(?!\$))|\\\(|\\begin{[^}]*}|\\\[)(.*?)(?:\\\]|\\end{[^}]*}|\\\)|\1)$'
+
+errorMessage = """\n<hr/><font size="-1" color="red">
+Some or all expressions may not have rendered properly,
+because Latex returned the following error:<br/><pre>%s</pre></font>"""
+
+def findLatexCode(text):
+    codeList = map(lambda x: x[0], latexPattern.findall(text))
+    return codeList
+
+def replaceInlineLatex(body, charheightpx, alignfudge, resfudge, latexTemplate=None):
+    from latexWrapper import renderNonexistingImages
+    global savePre
+    savePre=[]
+    reConsts = re.DOTALL+re.MULTILINE
+
+    def hidePre(x):
+        global savePre
+        savePre.append(x.group(0))
+        return '<pre></pre>'
+
+    def restorePre(x):
+        global savePre
+        first,savePre = savePre[0],savePre[1:]
+        return first
+
+    renumbered   = re.compile(r'[ \t]*\\begin{ *(math|equation|eqnarray) *}')
+    reunnumbered = re.compile(r'[ \t]*(\\begin{ *((math|equation|eqnarray)\*|table|tabular|displaymath|array|latex) *}|\$\$)')
+#    renumbered   = re.compile(r'\\begin{ *(math|equation|eqnarray) *}')
+#    reunnumbered = re.compile(r'[ \t]*(\\begin{ *((math|equation|eqnarray)\*|table|tabular|displaymath|array|latex) *}|\\\[)')
+    body = replaceInlineHTML(body) # do extended LaTeX to HTML conversions
+    body = replaceInlineAxiom(body) # execute Axiom commands
+    body = replaceInlineMaxima(body) # execute Maxima commands
+    body = replaceInlineReduce(body) # execute Reduce commands
+    # body = re.sub(r'<pre(?: .*?)?>.*?</pre>',hidePre,body,reConsts)
+    latexCodeList = findLatexCode(body) # find the rest of the LaTeX
+    newlatexCodeList = []
+    eqnum = 0
+    for code in latexCodeList:
+        if code[0]=='!': 
+# We need to identify if we're inside a '' block or an example:: block here.
+            newcode = re.compile('^!', re.MULTILINE).sub('', code)
+            # change the dollar sign so that the replace below does not hit
+            # this code again (in the case of the same code appearing twice,
+            # once escaped, once not)
+            #newcode = re.compile('\$', re.MULTILINE).sub('&#36;', newcode, 2)
+            # prevent stx from mangling asterisks
+            #newcode = re.compile('\*', re.MULTILINE).sub('&#42;', newcode) 
+            # and this will hide \(\), \[\], \begin...\end, including any
+            # equations that may be hiding inside a \begin{latex}..\end{latex}
+            newcode = re.compile(r'\\\[', re.MULTILINE).sub('\\![', newcode)
+            #newcode = re.compile(r'\\', re.MULTILINE).sub('&#92;', newcode)
+            body = replace(body, code, newcode, 1)
+            continue
+        else:
+            newlatexCodeList.append(code)
+        oldcode = code
+        renummatch = renumbered.match(code)
+        if renummatch:
+            eqnum = eqnum + 1
+            code = renumbered.sub('\\\\begin{\\1*}\n\\label{eq%d}' %(eqnum), code, 1)
+            kind = renummatch.group(1)
+            code = re.compile('\\\\end{ *%s *}' %(kind)).sub('\\\\end{%s*}' %(kind), code, 1)
+            code = renumbered.sub('\\\\begin{\\1*}\n\\label{eq%d}' %(eqnum), code, 1)
+# FIXME we really shouldn't do this...it will recreate block equations with different numbers.
+            newlatexCodeList[newlatexCodeList.index(oldcode)] = code
+# FIXME This will also replace any escaped code :(
+            body = replace(body, oldcode, code, 1)
+    errors = renderNonexistingImages(newlatexCodeList, charheightpx, alignfudge, resfudge,
+                                     latexTemplate=latexTemplate)
+    
+    if not errors:
+        for code in newlatexCodeList:
+            labelmatch = re.compile('\\\\label{eq(\\d+)}').search(code, 1)
+            commentedcode = re.compile('^', re.MULTILINE).sub('!', html_quote(code))
+# "--" inside a comment screws up browsers.  But in LaTeX math mode "--" and "- -" are equivalent.
+            commentedcode = re.compile('--', re.MULTILINE).sub('- -', commentedcode)
+            if labelmatch:
+                eqnum = labelmatch.group(1)
+                imageTag = '<a name="eq%s">' %(eqnum)                           \
+                    + '<table width="95%"><tr><td align="center" width="95%">'                  \
+                    + getImageFor(code, charheightpx)                                         \
+                    + '</td><td width="5%%" align="right">(%s)</td></tr></table></a>' %(eqnum)
+
+#                    + '\n<!--\n' + commentedcode + '\n-->\n'                 \
+            elif reunnumbered.match(code):
+                imageTag = '<a name="unnumbered">'\
+                    + '<table width="95%"><tr><td align="center" width="95%">'             \
+                    + getImageFor(code, charheightpx)                                         \
+                    + '</td><td width="5%" align="right">&nbsp;</td></tr></table></a>'
+#                    + '\n<!--\n' + commentedcode + '\n-->\n'                 \
+            else:
+                imageTag = getImageFor(code, charheightpx)
+            body = replace(body, code, imageTag, 1)
+
+# We try to match the > and < (or ^/$) from the preceeding and trailing tags,
+# so as not to catch the alt="..." from a latex equation
+# FIXME this is slow.  Use something like perl's m/\G/g to iterate over (n)
+        for i in range(1,int(eqnum)+1):
+            body = re.compile(r'((?:>|^)(?:[^<]*\s|))\( *(?:[Ee][Qq]\.)?\s*(%d) *\)([^>]*(?:<|$))' %(i)).sub(r'\1<a href="#eq\2">(\2)</a>\3', body)
+
+    else:
+        body = '<pre>' + body + '</pre>' + errorMessage %(errors)
+
+    # Handle escaping of latex
+    body = re.compile(r'(?<!\\)((?:\\\\)*)\\\$', re.MULTILINE).sub(r'\1$', body)
+    body = re.compile(r'\\\\', re.MULTILINE).sub(r'\\', body)
+    # body = re.sub(r'<pre></pre>',restorePre,body,reConsts)
+    return body
+
+def getImageFor(latexCode, charheightpx):    
+    preamble, postamble = '', ''
+    width, height = '', '' 
+    imageFile = fileNameFor(latexCode, charheightpx, '.png')
+    imageUrl = imagesPath + imageFile
+    width, height = getPngSize(os.path.join(workingDir, imageFile))
+    #src = html_quote(re.match(latexRemoveDelim, latexCode, re.MULTILINE|re.DOTALL). group(2))
+    src = 'LatexWiki Image'
+    return '%s<img alt="%s" class="equation" src="%s" width="%s" height="%s"/>%s' %(preamble,
+                                                            src,
+                                                            imageUrl,
+                                                            width,
+                                                            height,
+                                                            postamble)
+    #return '%s<img class="equation" src="%s" width="%s" height="%s"/>%s' %(preamble,
+    #                                                        imageUrl,
+    #                                                        width,
+    #                                                        height,
+    #                                                        postamble)

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineMaxima.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineMaxima.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineMaxima.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,77 @@
+
+"""
+ReplaceInlineMaxima.py v. 0.2.3
+  Replace Axiom command \\begin{maxima} \\end{maxima} blocks with LaTeX
+"""
+
+import re
+from string import join,replace
+
+n=1
+
+def replaceInlineMaxima(body):
+    from maximaWrapper import renderMaxima
+    errorMessage = """\n<hr/><font size="-1" color="red">
+    Some or all expressions may not have rendered properly,
+    because Maxima returned the following error:<br/><pre>%s</pre></font>"""
+
+    reConsts = re.MULTILINE+re.DOTALL
+    maximaInPattern = re.compile(
+        r'[ \t]*(?<!!)\\begin *{maxima}\s*(.*?)\s*\\end *{maxima}', #0
+        reConsts)
+    maximaOutPattern = re.compile(
+        #r'<latex>.*?black\}(.*?)</latex>'              #1 LaTeX
+        r'<latex>\\mbox{\\tt\\red\(\\mathrm{\\%(i\d+)}\) \\black}(.*?)</latex>|'   #1 #2 Input
+        r'<latex>\\mbox{\\tt\\red\(\\mathrm{\\%(o\d+)}\) \\black}(.*?)</latex>|'   #3 #4 Output
+        r'stdin:((?:.(?!<latex>))*.)',  #5 Other stuff
+        reConsts)
+
+    def htmlMarkup(code):
+        newcode = code
+        newcode = re.compile(r'\n\s*\n+',reConsts).sub(r'\n',newcode)
+        return re.sub(r'([&<>\$\*_\'\\\"])',
+               lambda x: { '&':'&amp;',
+                           '<':'&lt;',
+                           '>':'&gt;',
+                           '$':'&#36;',
+                           '*':'&#42;',
+                           '#':'&#35;',
+                           '\\':'&#92;',
+                           '[':'![',
+                           '\'':'&apos;',
+                           '"':'&quot;',
+                           '_':'&#95;'
+                         }[x.group(1)],newcode)
+
+    def linebreak(x):
+        from texbreaker import texbreak, cvar # Robert Sutor's C program
+        texbreak(replace(x,'\n',' '))
+        return cvar.bufout
+    
+    def translateOutput(N):  
+        global n
+
+        if N.group(1):
+            return '<div id="maximainput"><div id="maximalabel" align="right">maxima</div><table width="100%%"><tr><td id="label" width="10%%">(%%%s)</td><td id="equationi">\\begin{equation*}\n%s\n\\end{equation*}\n</td></tr></table></div>\n'%\
+              (N.group(1),N.group(2).strip())
+        if N.group(3):
+            return '<div id="maximaoutput"><table width="100%%"><tr><td id="label" width="10%%">(%%%s)</td><td id="equation">\\begin{equation}\n%s\n\\end{equation}\n</td></tr></table></div>'%\
+              (N.group(3),N.group(4).strip())
+        if N.group(5):
+            return '<div id="maximacode"><pre><div id="maximalabel" align="right">maxima</div>%s</pre></div>\n'%htmlMarkup(N.group(5))
+        return 'Pattern Error'
+
+    def formatOutput(x):
+        global n
+        newCode = maximaOutPattern.sub(translateOutput,x)
+        return newCode
+
+    maximaCodeIn = maximaInPattern.findall(body)
+    (maximaCodeOut,errors) = renderMaxima(maximaCodeIn)
+    if not errors:
+        newCodeList = map(formatOutput,maximaCodeOut)
+        #newCodeList = maximaCodeOut
+        body = maximaInPattern.sub(lambda x:len(newCodeList) and newCodeList.pop(0) or '<font color="red">Maxima output parse error!</font>\n',body)
+    else:
+        body = "<pre>" + body + "</pre>" + errorMessage %(errors)
+    return body

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineReduce.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineReduce.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/ReplaceInlineReduce.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,65 @@
+
+"""
+ReplaceInlineReduce.py v. 0.2.3
+  Replace REDICE command \\begin{reduce} \\end{reduce} blocks with LaTeX
+"""
+
+import re
+from string import join
+
+def replaceInlineReduce(body):
+    from reduceWrapper import renderReduce
+    errorMessage = """\n<hr/><font size="-1" color="red">
+    Some or all expressions may not have rendered properly,
+    because REDUCE returned the following error:<br/><pre>%s</pre></font>"""
+
+    reConsts = re.MULTILINE+re.DOTALL
+    reduceInPattern = re.compile(
+      r'[ \t]*(?<!!)\\begin{reduce}\s*(.*?)\s*\\end{reduce}|'
+      r'(?<!!)\\reduce{(.*?)}',reConsts)
+    reduceOutPattern = re.compile(
+      r'\s*\\begin{displaymath}(.*?)\s*\\end{displaymath}\s*|' #1
+      r'\s*\$\$(.*?)\s*\$\$\s*|'   #2
+      r'\s*<math>(.*?)</math>|' #3
+      r'\s*((?:.(?!\s*<math>)(?!\s*\$\$)(?!\s*\\begin{displaymath}))*.)',
+        reConsts)
+
+    def htmlMarkup(code):
+        newcode = re.compile(r'^\s+',reConsts).sub(r'',code)
+        newcode = re.compile(r'\n\s*\n+',reConsts).sub(r'\n',newcode)
+        return re.sub(r'([&<>\$\*\\_])',
+               lambda x: { '&':'&amp;',
+                           '<':'&lt;',
+                           '>':'&gt;',
+                           '$':'&#36;',
+                            '*':'&#42;',
+                           '\\':'&#92;',
+                           '_':'&#95;' }[x.group(1)],newcode)
+
+    def translateOutput(N):  
+        if N.group(1): # \begin{displaymath}
+            return '\\begin{equation}%s\\end{equation}\n'% N.group(1)
+        if N.group(2): # $$
+            return '$$%s\n$$\n'% N.group(2)
+        if N.group(3): # <math>ML just pass it thru
+            return '<math xmlns="http://www.w3.org/1998/Math/MathML">%s</math>\n'% N.group(3)
+        if N.group(4): # Command
+	    r = htmlMarkup(N.group(4))
+	    if r:
+               return '''<table id="reducecode" width="100%%"><tr>
+	         <td><pre>%s</pre></td><td id="reducelabel" valign="top" align="right">reduce</td>
+		 </tr></table>\n'''%r
+        return ''
+ 
+    def formatOutput(x):
+        newCode = reduceOutPattern.sub(translateOutput,x)
+        return newCode
+
+    reduceCodeIn = map(lambda x: x[0] or x[1],reduceInPattern.findall(body))
+    (reduceCodeOut,errors) = renderReduce(reduceCodeIn)
+    if not errors:
+        newCodeList = map(formatOutput,reduceCodeOut)
+        body = reduceInPattern.sub(lambda x:len(newCodeList) and newCodeList.pop(0) or 'Reduce output parse error!\n',body)
+    else:
+        body = "<pre>" + body + "</pre>" + errorMessage %(errors)
+    return body

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/ReplacePamphlet.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/ReplacePamphlet.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/ReplacePamphlet.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,90 @@
+"""
+Replace pamphlet contents with embedded PDF
+
+$Id: ReplacePamphlet.py,v 0.2 2005/11/12 Bill Page $
+
+TODO:
+	1) Provide a wiki folder property to override the path so that pamphlet,
+	   dvi, and pdf files can be mapped to specific directories. Currently
+	   defaults to 'imagesPath' for Zope/LatexWiki compatibility. But Apache
+	   proxy or additional Zope external files systems would allow them to
+	   be anywhere.
+	2) Write pamphlet file to source code archive and do a check-in
+	   Archive check-in controlled/disabled by a wiki folder property.
+"""
+
+import re, os, string
+from util import imagesPath, workingDir
+
+errorMessage = """\n<hr/><font size="-1" color="red">
+Some or all expressions may not have rendered properly,
+because Latex returned the following error:<br/><pre>%s</pre></font>"""
+reConsts = re.MULTILINE+re.DOTALL
+
+def replacePamphlet(page,body):
+    from pamphletWrapper import renderPDF
+
+    # Keep the comments after the end of the document
+    doc = re.match(r'^(\\.*?\\end{document})(.*)$',body,reConsts)
+    if doc:
+
+# workingDir + fPath  = fDir
+#                     + pageName = fName   (physical location)
+# imagesPath + fPath  + pageName = fUrl    (logical location)
+
+# Note: only works with http://wiki.axiom-developer.org/... now
+# Need to fix this (somehow!) so that it works with url proxy aliases
+
+      fPath = "/".join(page.wiki_base_url().split('/')[3:])
+      fDir = os.path.join(workingDir,fPath)
+      try:
+        os.makedirs(fDir)
+      except:
+        pass
+      pageName = page.title_or_id()
+      fName = os.path.join(fDir,pageName)
+      try:
+        file = open(fName+'.pamphlet', 'w')
+        file.write(doc.group(1))
+        file.close()
+      except:
+        print "Can't save pamphlet file"
+        raise
+      pdf=re.match(r'.*\\usepackage\[.*(dvips|dvipdfm).*?\]{hyperref}',doc.group(1),reConsts)
+      if pdf:
+        pdfMethod=pdf.group(1)
+      else:
+        pdfMethod=''
+      errors = renderPDF(fDir,pageName,pdfMethod)
+      fUrl = os.path.join('/',imagesPath,fPath,pageName)
+      return ('''
+<table cellpadding=0 cellspacing=0 width="100%%">
+<tr style="background-color:lightgrey">
+<td align="left" width="50%%"><b>Download:</b>
+<a href="%s.pdf">pdf</a>
+<a href="%s.dvi">dvi</a>
+<a href="%s.ps">ps</a>
+<a href="%s.pamphlet">src</a>
+<a href="%s.tex">tex</a>
+<a href="%s.log">log</a></td>
+</td>
+<td align="right" width="50%%"><form action="%s/tangle" method="get">
+<input type="submit" name="submit" value="tangle"/>
+<select name="chunk" >%s</select></form></td>
+</tr></table><br />
+<div style="text-align:center;width:100%%"><img src="%s1.png" /></div>
+''' %(fUrl,fUrl,fUrl,fUrl,fUrl,fUrl,
+      page.page_url(), 
+      '<option>*</option>\n'+''.join(['<option>%s</option>\n'%(m.group(1))
+          for m in re.finditer(r'<<(.*?)>>=',doc.group(1))
+          if m.group(1)<>'*']),  # we want * as default option
+      fUrl)+
+        ((errors and """\n<hr/><font size="-1" color="red">
+Some or all of this page may not have rendered properly,
+because of the following error:<br/><pre>%s</pre></font>
+""" %(errors)) or ''),
+        doc.group(2))
+    else:
+      # just comments
+      return ('',body)
+

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/UPGRADE
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/UPGRADE	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/UPGRADE	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,28 @@
+LatexWiki 0.25:
+ * You will have to add the properties 'latex_font_size' (int),
+   'latex_align_fudge' (float), 'latex_res_fudge' (float), and 'allow_dtml'
+   (boolean) to your wiki folder(s).  It may be useful to create a latexwiki
+   from the template (see INSTALL.txt, step 3) for comparison.
+
+ * If you are using Ape or something else (FileSystemSite?) to allow access to
+   the images/ directory, this will still work but the site template will try
+   to create a LocalFS images directory.  Just delete it and replace it with
+   Ape, or whatever.  Appropriate patches to Extensions/setup_latexwiki.py
+   would be appreciated.
+
+LatexWiki 0.22:
+
+ * remove editform,  RecentChanges, SearchPage, UserOptions, IssueTracker, and
+   FilterIssues if you have them.
+
+ * You may have to modify files which make reference to any of the above pages.
+   They are all now methods that can be called like:
+        <a href="&dtml-wiki_page_url;/recentchanges">Recent Changes</a>
+
+ * If you have just added the stylesheet for the first time (see INSTALL.txt),
+   you may need to add:
+       <link rel="stylesheet" href="stylesheet">
+   to your standard_wiki_header.  (Newer wikis do not have the standard_wiki_header)
+
+ * DO NOT DOWNGRADE.  ZWiki 0.25 changes page types fundamentally, and your
+   wiki will be broken if you downgrade to an older version of ZWiki.

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/__init__.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/__init__.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/__init__.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,22 @@
+"""
+mathaction plugin for Zwiki, providing mathematical tools, based on
+the MathAction product.
+
+Sean Bowman, Joe Koberg, Bob McElrath, Bill Page, Simon Michael
+
+See ChangeLog for more notes.
+"""
+
+# install the mathaction page types
+import pagetypes
+
+# backwards compatibility for old page objects
+ZwikiMathPageType      = pagetypes.PageTypeStxMath
+ZwikiPamphletPageType  = pagetypes.PageTypePamphlet
+#ZwikiHtmlLatexPageType = 
+#ZwikiLatexPageType     = 
+#ZwikiItexPageType      = 
+
+# install wiki template(s)
+#...
+

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/axiom.sty
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/axiom.sty	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/axiom.sty	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,967 @@
+% axiom.sty -- LaTeX support for noweb
+% DON'T edit this file!  Use src/doc/axiom.sty.pamphlet instead.
+{\obeyspaces\AtBeginDocument{\global\let =\ }} % from texbook, p 381
+\def\nwopt at nomargintag{\let\nwmargintag=\@gobble}
+\def\nwopt at margintag{%
+  \def\nwmargintag##1{\leavevmode\llap{##1\kern\nwmarginglue\kern\codemargin}}}
+\def\nwopt at margintag{%
+  \def\nwmargintag##1{\leavevmode\kern-\codemargin\nwthemargintag{##1}\kern\codemargin}}
+\def\nwthemargintag#1{\llap{#1\kern\nwmarginglue}}
+\nwopt at margintag
+\newdimen\nwmarginglue
+\nwmarginglue=0.3in
+\def\nwtagstyle{\footnotesize\Rm}
+% make \hsize in code sufficient for 88 columns
+\setbox0=\hbox{\tt m}
+\newdimen\codehsize
+\codehsize=91\wd0 % 88 columns wasn't enough; I don't know why
+\newdimen\codemargin
+\codemargin=0pt
+\newdimen\nwdefspace
+\nwdefspace=\codehsize
+% need to use \textwidth in {\LaTeX} to handle styles with
+% non-standard margins (David Bruce).  Don't know why we sometimes
+% wanted \hsize.  27 August 1997.
+%% \advance\nwdefspace by -\hsize\relax
+\ifx\textwidth\undefined
+  \advance\nwdefspace by -\hsize\relax
+\else
+  \advance\nwdefspace by -\textwidth\relax
+\fi
+\chardef\other=12
+\def\setupcode{%
+  \chardef\\=`\\
+  \chardef\{=`\{
+  \chardef\}=`\}
+  \catcode`\$=\other
+  \catcode`\&=\other
+  \catcode`\#=\other
+  \catcode`\%=\other
+  \catcode`\~=\other
+  \catcode`\_=\other
+  \catcode`\^=\other
+  \catcode`\"=\other    % fixes problem with german.sty
+  \obeyspaces\Tt
+}
+\let\nwlbrace=\{
+\let\nwrbrace=\}
+\def\nwendquote{\relax\ifhmode\spacefactor=1000 \fi}
+{\catcode`\^^M=\active % make CR an active character
+  \gdef\newlines{\catcode`\^^M=\active % make CR an active character
+         \def^^M{\par\startline}}%
+  \gdef\eatline#1^^M{\relax}%
+}
+%%% DON'T   \gdef^^M{\par\startline}}% in case ^^M appears in a \write
+\def\startline{\noindent\hskip\parindent\ignorespaces}
+\def\nwnewline{\ifvmode\else\hfil\break\leavevmode\hbox{}\fi}
+\def\setupmodname{%
+  \catcode`\$=3
+  \catcode`\&=4
+  \catcode`\#=6
+  \catcode`\%=14
+  \catcode`\~=13
+  \catcode`\_=8
+  \catcode`\^=7
+  \catcode`\ =10
+  \catcode`\^^M=5
+  \let\{\nwlbrace
+  \let\}\nwrbrace
+  % bad news --- don't know what catcode to give "
+  \Rm}
+\def\LA{\begingroup\maybehbox\bgroup\setupmodname\It$\langle$}
+\def\RA{\/$\rangle$\egroup\endgroup}
+\def\code{\leavevmode\begingroup\setupcode\newlines}
+\def\edoc{\endgroup}
+\let\maybehbox\relax
+\newbox\equivbox
+\setbox\equivbox=\hbox{$\equiv$}
+\newbox\plusequivbox
+\setbox\plusequivbox=\hbox{$\mathord{+}\mathord{\equiv}$}
+% \moddef can't have an argument because there might be \code...\edoc
+\def\moddef{\leavevmode\kern-\codemargin\LA}
+\def\endmoddef{\RA\ifmmode\equiv\else\unhcopy\equivbox\fi
+               \nobreak\hfill\nobreak}
+\def\plusendmoddef{\RA\ifmmode\mathord{+}\mathord{\equiv}\else\unhcopy\plusequivbox\fi
+               \nobreak\hfill\nobreak}
+\def\chunklist{%
+\errhelp{I changed \chunklist to \nowebchunks.  
+I'll try to avoid such incompatible changes in the future.}%
+\errmessage{Use \string\nowebchunks\space instead of \string\chunklist}}
+\def\nowebchunks{\message{<Warning: You need noweave -x to use \string\nowebchunks>}}
+\def\nowebindex{\message{<Warning: You need noweave -index to use \string\nowebindex>}}
+% here is support for the new-style (capitalized) font-changing commands
+% thanks to Dave Love
+\ifx\documentstyle\undefined
+  \let\Rm=\rm \let\It=\it \let\Tt=\tt       % plain
+\else\ifx\selectfont\undefined
+  \let\Rm=\rm \let\It=\it \let\Tt=\tt       % LaTeX OFSS
+\else                                       % LaTeX NFSS
+  \def\Rm{\reset at font\rm}
+  \def\It{\reset at font\it}
+  \def\Tt{\reset at font\tt}
+  \def\Bf{\reset at font\bf}
+\fi\fi
+\ifx\reset at font\undefined \let\reset at font=\relax \fi
+\def\noweboptions#1{%
+  \def\@nwoptionlist{#1}%
+  \@for\@nwoption:=\@nwoptionlist\do{%
+    \@ifundefined{nwopt@\@nwoption}{%
+        \@latexerr{There is no such noweb option as '\@nwoption'}\@eha}{%
+        \csname nwopt@\@nwoption\endcsname}}}
+\codemargin=10pt
+\advance\codehsize by \codemargin       % make room for indentation of code
+\advance\nwdefspace by \codemargin      % and fix adjustment for def/use
+\def\setcodemargin#1{%
+  \advance\codehsize by -\codemargin       % make room for indentation of code
+  \advance\nwdefspace by -\codemargin   % and fix adjustment for def/use
+  \codemargin=#1
+  \advance\codehsize by \codemargin       % make room for indentation of code
+  \advance\nwdefspace by \codemargin    % and fix adjustment for
+                                        % def/use
+}
+\def\nwopt at shift{%
+  \dimen@=-0.8in
+  \if at twoside                 % Values for two-sided printing:
+     \advance\evensidemargin by \dimen@
+  \else                       % Values for one-sided printing:
+     \advance\evensidemargin by \dimen@
+     \advance\oddsidemargin by \dimen@
+  \fi
+%  \advance \marginparwidth -\dimen@
+}
+\let\nwopt at noshift\@empty
+\def\nwbegincode#1{%
+  \begingroup
+    \topsep \nwcodetopsep
+    \@beginparpenalty \@highpenalty
+    \@endparpenalty -\@highpenalty
+  \@begincode }
+\def\nwendcode{\endtrivlist \endgroup \filbreak} % keeps code on 1 page
+
+\newenvironment{webcode}{%
+  \@begincode
+}{%
+  \endtrivlist}
+\def\@begincode{%
+    \trivlist \item[]%
+    \leftskip\@totalleftmargin \advance\leftskip\codemargin
+    \rightskip\hsize \advance\rightskip -\codehsize
+    \parskip\z@ \parindent\z@ \parfillskip\@flushglue
+  \linewidth\codehsize
+    \@@par
+    \def\par{\leavevmode\null \@@par \penalty\nwcodepenalty}%
+    \obeylines
+    \@noligs   \ifx\verbatim at nolig@list\undefined\else
+                 \let\do=\nw at makeother \verbatim at nolig@list \do at noligs\`
+               \fi
+    \setupcode \frenchspacing \@vobeyspaces
+  \nowebsize \setupcode
+  \let\maybehbox\mbox }
+  \newskip\nwcodetopsep \nwcodetopsep = 3pt plus 1.2pt minus 1pt
+  \let\nowebsize=\normalsize
+  \def\nwopt at tinycode{\let\nowebsize=\tiny}
+  \def\nwopt at footnotesizecode{\let\nowebsize=\footnotesize}
+  \def\nwopt at scriptsizecode{\let\nowebsize=\scriptsize}
+  \def\nwopt at smallcode{\let\nowebsize=\small}
+  \def\nwopt at normalsizecode{\let\nowebsize=\normalsize}
+  \def\nwopt at largecode{\let\nowebsize=\large}
+  \def\nwopt at Largecode{\let\nowebsize=\Large}
+  \def\nwopt at LARGEcode{\let\nowebsize=\LARGE}
+  \def\nwopt at hugecode{\let\nowebsize=\huge}
+  \def\nwopt at Hugecode{\let\nowebsize=\Huge}
+\newcount\nwcodepenalty  \nwcodepenalty=\@highpenalty
+\def\nw at makeother#1{\catcode`#1=12 }
+\def\nwbegindocs#1{\ifvmode\noindent\fi}
+\let\nwenddocs=\relax
+\let\nwdocspar=\filbreak
+\raggedbottom
+\def\code{\leavevmode\begingroup\setupcode\@vobeyspaces\obeylines}
+\let\edoc=\endgroup
+\newdimen\@original at textwidth
+\def\ps at noweb{%
+  \@original at textwidth=\textwidth
+  \let\@mkboth\@gobbletwo
+  \def\@oddfoot{}\def\@evenfoot{}%       No feet.
+  \if at twoside         % If two-sided printing.
+    \def\@evenhead{\hbox to \@original at textwidth{%
+           \Rm \thepage\qquad{\Tt\leftmark}\hfil\today}}%        Left heading.
+    \def\@oddhead{\hbox to \@original at textwidth{%
+           \Rm \today\hfil{\Tt\leftmark}\qquad\thepage}}% Right heading.
+  \else               % If one-sided printing.
+    \def\@oddhead{\hbox to \@original at textwidth{%
+           \Rm \today\hfil{\Tt\leftmark}\qquad\thepage}}% Right heading.
+    \let\@evenhead\@oddhead
+  \fi
+  \let\chaptermark\@gobble
+  \let\sectionmark\@gobble
+  \let\subsectionmark\@gobble
+  \let\subsubsectionmark\@gobble
+  \let\paragraphmark\@gobble
+  \let\subparagraphmark\@gobble
+  \def\nwfilename{\begingroup\let\do\@makeother\dospecials
+                \catcode`\{=1 \catcode`\}=2 \nw at filename}
+  \def\nw at filename##1{\endgroup\markboth{##1}{##1}\let\nw at filename=\nw at laterfilename}%
+}
+\def\nw at laterfilename#1{\endgroup\clearpage \markboth{#1}{#1}}
+\let\nwfilename=\@gobble
+\def\nwcodecomment#1{\@@par\penalty\nwcodepenalty
+    \if at firstnwcodecomment
+      \vskip\nwcodecommentsep\penalty\nwcodepenalty\@firstnwcodecommentfalse
+    \fi%
+    \hspace{-\codemargin}{%
+        \rightskip=0pt plus1in
+        \interlinepenalty\nwcodepenalty
+        \let\\\relax\footnotesize\Rm #1\@@par\penalty\nwcodepenalty}}
+\def\@nwalsodefined#1{\nwcodecomment{\@nwlangdepdef\ \nwpageprep\ \@pagesl{#1}.}}
+\def\@nwused#1{\nwcodecomment{\@nwlangdepcud\ \nwpageprep\ \@pagesl{#1}.}}
+\def\@nwnotused#1{\nwcodecomment{\@nwlangdeprtc.}}
+\def\nwoutput#1{\nwcodecomment{\@nwlangdepcwf\ {\Tt \@stripstar#1*\stripped}.}}
+\def\@stripstar#1*#2\stripped{#1}
+\newcommand{\nwprevdefptr}[1]{%
+  \mbox{$\mathord{\triangleleft}\,\mathord{\mbox{\subpageref{#1}}}$}}
+\newcommand{\nwnextdefptr}[1]{%
+  \mbox{$\mathord{\mbox{\subpageref{#1}}}\,\mathord{\triangleright}$}}
+
+\newcommand{\@nwprevnextdefs}[2]{%
+  {\nwtagstyle
+  \ifx\relax#1\else ~~\nwprevdefptr{#1}\fi
+  \ifx\relax#2\else ~~\nwnextdefptr{#2}\fi}}
+\newcommand{\@nwusesondefline}[1]{{\nwtagstyle~~(\@pagenumsl{#1})}}
+\newcommand{\@nwstartdeflinemarkup}{\nobreak\hskip 1.5em plus 1fill\nobreak}
+\newcommand{\@nwenddeflinemarkup}{\nobreak\hskip \nwdefspace minus\nwdefspace\nobreak}
+\def\nwopt at longxref{%
+  \let\nwalsodefined\@nwalsodefined
+  \let\nwused\@nwused
+  \let\nwnotused\@nwnotused
+  \let\nwprevnextdefs\@gobbletwo
+  \let\nwusesondefline\@gobble
+  \let\nwstartdeflinemarkup\relax
+  \let\nwenddeflinemarkup\relax
+}
+\def\nwopt at shortxref{%
+  \let\nwalsodefined\@gobble
+  \let\nwused\@gobble
+  \let\nwnotused\@gobble
+  \let\nwprevnextdefs\@nwprevnextdefs
+  \let\nwusesondefline\@nwusesondefline
+  \let\nwstartdeflinemarkup\@nwstartdeflinemarkup
+  \let\nwenddeflinemarkup\@nwenddeflinemarkup
+}
+\def\nwopt at noxref{%
+  \let\nwalsodefined\@gobble
+  \let\nwused\@gobble
+  \let\nwnotused\@gobble
+  \let\nwprevnextdefs\@gobbletwo
+  \let\nwusesondefline\@gobble
+  \let\nwstartdeflinemarkup\relax
+  \let\nwenddeflinemarkup\relax
+}
+\nwopt at shortxref % to hell with backward compatibility!
+\newskip\nwcodecommentsep \nwcodecommentsep=3pt plus 1pt minus 1pt
+\newif\if at firstnwcodecomment\@firstnwcodecommenttrue
+\newcount\@nwlopage\newcount\@nwhipage  % range lo..hi-1
+\newcount\@nwlosub              % subpage of lo
+\newcount\@nwhisub              % subpage of hi
+\def\@nwfirstpage#1#2#3{% subpage page xref-tag
+  \@nwlopage=#2 \@nwlosub=#1
+  \def\@nwloxreftag{#3}%
+  \advance\@nwpagecount by \@ne
+  \@nwhipage=\@nwlopage\advance\@nwhipage by \@ne }
+\def\@nwnextpage#1#2#3{% subpage page xref-tag
+  \ifnum\@nwhipage=#2 
+    \advance\@nwhipage by \@ne 
+    \advance\@nwpagecount by \@ne
+    \@nwhisub=#1 
+    \def\@nwhixreftag{#3}\else
+  \ifnum#2<\@nwlopage \advance\@nwhipage by \m at ne
+                      \ifnum\@nwhipage=\@nwlopage
+                           \edef\@tempa{\noexpand\noexpand\noexpand\\%
+                                             {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+                                              {\@nwloxreftag}}}%
+                      \else
+                        \count@=\@nwhipage \advance\count@ by \m at ne
+                        \ifnum\count@=\@nwlopage % consecutive pages
+                            \edef\@tempa{\noexpand\noexpand\noexpand\\%
+                                             {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+                                              {\@nwloxreftag}}%
+                                          \noexpand\noexpand\noexpand\\%
+                                             {{\nwthepagenum{\number\@nwhisub}{\number\@nwhipage}}
+                                              {\@nwhixreftag}}}%
+                        \else \ifnum\@nwlopage<110 \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+                                \count@=\@nwlopage \divide\count@ by 100 \multiply\count@ by 100
+                                \ifnum\count@=\@nwlopage \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+                                  \count@=\@nwlopage \divide\count@ by 100
+                                  \@nwpagetemp=\@nwhipage \divide\@nwpagetemp by 100
+                                  \ifnum\count@=\@nwpagetemp %  lo--least 2 digits of hi
+                                    \multiply\@nwpagetemp by 100
+                                    \advance \@nwhipage by -\@nwpagetemp
+                                    \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+                                  \else \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+                                  \fi
+                                \fi
+                              \fi%
+                        \fi
+                      \fi%
+                      \edef\@tempa{\noexpand\nwix at cons\noexpand\nw at pages{\@tempa}}\@tempa\@nwfirstpage{#1}{#2}{#3}\else
+  \ifnum#2>\@nwhipage \advance\@nwhipage by \m at ne
+                      \ifnum\@nwhipage=\@nwlopage
+                           \edef\@tempa{\noexpand\noexpand\noexpand\\%
+                                             {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+                                              {\@nwloxreftag}}}%
+                      \else
+                        \count@=\@nwhipage \advance\count@ by \m at ne
+                        \ifnum\count@=\@nwlopage % consecutive pages
+                            \edef\@tempa{\noexpand\noexpand\noexpand\\%
+                                             {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+                                              {\@nwloxreftag}}%
+                                          \noexpand\noexpand\noexpand\\%
+                                             {{\nwthepagenum{\number\@nwhisub}{\number\@nwhipage}}
+                                              {\@nwhixreftag}}}%
+                        \else \ifnum\@nwlopage<110 \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+                                \count@=\@nwlopage \divide\count@ by 100 \multiply\count@ by 100
+                                \ifnum\count@=\@nwlopage \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+                                  \count@=\@nwlopage \divide\count@ by 100
+                                  \@nwpagetemp=\@nwhipage \divide\@nwpagetemp by 100
+                                  \ifnum\count@=\@nwpagetemp %  lo--least 2 digits of hi
+                                    \multiply\@nwpagetemp by 100
+                                    \advance \@nwhipage by -\@nwpagetemp
+                                    \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+                                  \else \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+                                  \fi
+                                \fi
+                              \fi%
+                        \fi
+                      \fi%
+                      \edef\@tempa{\noexpand\nwix at cons\noexpand\nw at pages{\@tempa}}\@tempa\@nwfirstpage{#1}{#2}{#3}\else
+    \@nwlosub=0 \@nwhisub=0
+  \fi\fi\fi
+  }
+\newcount\@nwpagetemp
+\newcount\@nwpagecount
+\def\@nwfirstpagel#1{% label
+  \@ifundefined{r@#1}{\@warning{Reference `#1' on page \thepage \space undefined}%
+                      \nwix at cons\nw at pages{\\{\bf ??}}}{%
+    \edef\@tempa{\noexpand\@nwfirstpage\subpagepair{#1}{#1}}\@tempa}}
+\def\@nwnextpagel#1{% label
+  \@ifundefined{r@#1}{\@warning{Reference `#1' on page \thepage \space undefined}%
+                      \nwix at cons\nw at pages{\\{\bf ??}}}{%
+    \edef\@tempa{\noexpand\@nwnextpage\subpagepair{#1}{#1}}\@tempa}}
+\def\@pagesl#1{%  list of labels
+  \gdef\nw at pages{}\@nwpagecount=0
+  \def\\##1{\@nwfirstpagel{##1}\let\\=\@nwnextpagel}#1%
+  \advance\@nwhipage by \m at ne
+  \ifnum\@nwhipage=\@nwlopage
+       \edef\@tempa{\noexpand\noexpand\noexpand\\%
+                         {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+                          {\@nwloxreftag}}}%
+  \else
+    \count@=\@nwhipage \advance\count@ by \m at ne
+    \ifnum\count@=\@nwlopage % consecutive pages
+        \edef\@tempa{\noexpand\noexpand\noexpand\\%
+                         {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+                          {\@nwloxreftag}}%
+                      \noexpand\noexpand\noexpand\\%
+                         {{\nwthepagenum{\number\@nwhisub}{\number\@nwhipage}}
+                          {\@nwhixreftag}}}%
+    \else \ifnum\@nwlopage<110 \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+            \count@=\@nwlopage \divide\count@ by 100 \multiply\count@ by 100
+            \ifnum\count@=\@nwlopage \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+              \count@=\@nwlopage \divide\count@ by 100
+              \@nwpagetemp=\@nwhipage \divide\@nwpagetemp by 100
+              \ifnum\count@=\@nwpagetemp %  lo--least 2 digits of hi
+                \multiply\@nwpagetemp by 100
+                \advance \@nwhipage by -\@nwpagetemp
+                \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+              \else \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+              \fi
+            \fi
+          \fi%
+    \fi
+  \fi%
+  \edef\@tempa{\noexpand\nwix at cons\noexpand\nw at pages{\@tempa}}\@tempa\def\\##1{\@nwhyperpagenum##1}%
+  \ifnum\@nwpagecount=1 \nwpageword \else \nwpagesword\fi~\commafy{\nw at pages}}
+\def\@nwhyperpagenum#1#2{\nwhyperreference{#2}{#1}}
+
+\def\@pagenumsl#1{%  list of labels -- doesn't include word `pages', commas, or `and'
+  \gdef\nw at pages{}\@nwpagecount=0
+  \def\\##1{\@nwfirstpagel{##1}\let\\=\@nwnextpagel}#1%
+  \advance\@nwhipage by \m at ne
+  \ifnum\@nwhipage=\@nwlopage
+       \edef\@tempa{\noexpand\noexpand\noexpand\\%
+                         {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+                          {\@nwloxreftag}}}%
+  \else
+    \count@=\@nwhipage \advance\count@ by \m at ne
+    \ifnum\count@=\@nwlopage % consecutive pages
+        \edef\@tempa{\noexpand\noexpand\noexpand\\%
+                         {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+                          {\@nwloxreftag}}%
+                      \noexpand\noexpand\noexpand\\%
+                         {{\nwthepagenum{\number\@nwhisub}{\number\@nwhipage}}
+                          {\@nwhixreftag}}}%
+    \else \ifnum\@nwlopage<110 \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+            \count@=\@nwlopage \divide\count@ by 100 \multiply\count@ by 100
+            \ifnum\count@=\@nwlopage \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+              \count@=\@nwlopage \divide\count@ by 100
+              \@nwpagetemp=\@nwhipage \divide\@nwpagetemp by 100
+              \ifnum\count@=\@nwpagetemp %  lo--least 2 digits of hi
+                \multiply\@nwpagetemp by 100
+                \advance \@nwhipage by -\@nwpagetemp
+                \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+              \else \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+              \fi
+            \fi
+          \fi%
+    \fi
+  \fi%
+  \edef\@tempa{\noexpand\nwix at cons\noexpand\nw at pages{\@tempa}}\@tempa%
+  \def\\##1{\@nwhyperpagenum##1\let\\=\@nwpagenumslrest}\nw at pages}
+\def\@nwpagenumslrest#1{~\@nwhyperpagenum#1}
+\def\subpages#1{% list of {{subpage}{page}}
+  \gdef\nw at pages{}\@nwpagecount=0
+  \def\\##1{\edef\@tempa{\noexpand\@nwfirstpage##1{}}\@tempa
+            \def\\####1{\edef\@tempa{\noexpand\@nwnextpage####1}\@tempa}}#1%
+  \advance\@nwhipage by \m at ne
+  \ifnum\@nwhipage=\@nwlopage
+       \edef\@tempa{\noexpand\noexpand\noexpand\\%
+                         {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+                          {\@nwloxreftag}}}%
+  \else
+    \count@=\@nwhipage \advance\count@ by \m at ne
+    \ifnum\count@=\@nwlopage % consecutive pages
+        \edef\@tempa{\noexpand\noexpand\noexpand\\%
+                         {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+                          {\@nwloxreftag}}%
+                      \noexpand\noexpand\noexpand\\%
+                         {{\nwthepagenum{\number\@nwhisub}{\number\@nwhipage}}
+                          {\@nwhixreftag}}}%
+    \else \ifnum\@nwlopage<110 \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+            \count@=\@nwlopage \divide\count@ by 100 \multiply\count@ by 100
+            \ifnum\count@=\@nwlopage \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+              \count@=\@nwlopage \divide\count@ by 100
+              \@nwpagetemp=\@nwhipage \divide\@nwpagetemp by 100
+              \ifnum\count@=\@nwpagetemp %  lo--least 2 digits of hi
+                \multiply\@nwpagetemp by 100
+                \advance \@nwhipage by -\@nwpagetemp
+                \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+              \else \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+              \fi
+            \fi
+          \fi%
+    \fi
+  \fi%
+  \edef\@tempa{\noexpand\nwix at cons\noexpand\nw at pages{\@tempa}}\@tempa\def\\##1{\@firstoftwo##1}%
+  \ifnum\@nwpagecount=1 \nwpageword \else \nwpagesword\fi~\commafy{\nw at pages}}
+\def\@nwaddrange{\advance\@nwhipage by \m at ne
+                 \ifnum\@nwhipage=\@nwlopage
+                      \edef\@tempa{\noexpand\noexpand\noexpand\\%
+                                        {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+                                         {\@nwloxreftag}}}%
+                 \else
+                   \count@=\@nwhipage \advance\count@ by \m at ne
+                   \ifnum\count@=\@nwlopage % consecutive pages
+                       \edef\@tempa{\noexpand\noexpand\noexpand\\%
+                                        {{\nwthepagenum{\number\@nwlosub}{\number\@nwlopage}}%
+                                         {\@nwloxreftag}}%
+                                     \noexpand\noexpand\noexpand\\%
+                                        {{\nwthepagenum{\number\@nwhisub}{\number\@nwhipage}}
+                                         {\@nwhixreftag}}}%
+                   \else \ifnum\@nwlopage<110 \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+                           \count@=\@nwlopage \divide\count@ by 100 \multiply\count@ by 100
+                           \ifnum\count@=\@nwlopage \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}\else
+                             \count@=\@nwlopage \divide\count@ by 100
+                             \@nwpagetemp=\@nwhipage \divide\@nwpagetemp by 100
+                             \ifnum\count@=\@nwpagetemp %  lo--least 2 digits of hi
+                               \multiply\@nwpagetemp by 100
+                               \advance \@nwhipage by -\@nwpagetemp
+                               \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+                             \else \edef\@tempa{\noexpand\noexpand\noexpand\\{{\number\@nwlopage--\number\@nwhipage}{}}}%
+                             \fi
+                           \fi
+                         \fi%
+                   \fi
+                 \fi%
+                 \edef\@tempa{\noexpand\nwix at cons\noexpand\nw at pages{\@tempa}}\@tempa}
+\def\nwpageword{\@nwlangdepchk}  % chunk, was page
+\def\nwpagesword{\@nwlangdepchks}  % chunk, was page
+\def\nwpageprep{\@nwlangdepin}     % in, was on
+\newcommand\nw at genericref[2]{% what to do, name of ref
+  \expandafter\nw at g@nericref\csname r@#2\endcsname#1{#2}}
+\newcommand\nw at g@nericref[3]{% control sequence, what to do, name
+  \ifx#1\relax
+    \ref{#3}% trigger the standard `undefined ref' mechanisms
+  \else
+    \expandafter#2#1.\\%
+  \fi}
+\def\nw at selectone#1#2#3\\{#1}
+\def\nw at selecttwo#1#2#3\\{#2}
+\def\nw at selectonetwo#1#2#3\\{{#1}{#2}}
+\newcommand{\subpageref}[1]{%
+  \nwhyperreference{#1}{\nw at genericref\@subpageref{#1}}}
+\def\@subpageref#1#2#3\\{%
+  \@ifundefined{2on#2}{#2}{\nwthepagenum{#1}{#2}}}
+\newcommand{\subpagepair}[1]{%  % produces {subpage}{page}
+  \@ifundefined{r@#1}%
+    {{0}{0}}%
+    {\nw at genericref\@subpagepair{#1}}}
+\def\@subpagepair#1#2#3\\{%
+  \@ifundefined{2on#2}{{0}{#2}}{{#1}{#2}}}
+\newcommand{\sublabel}[1]{%
+  \@bsphack
+  \nwblindhyperanchor{#1}%
+  \if at filesw {\let\thepage\relax
+   \def\protect{\noexpand\noexpand\noexpand}%
+   \edef\@tempa{\write\@auxout{\string
+      \newsublabel{#1}{{}{\thepage}}}}%
+   \expandafter}\@tempa
+   \if at nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
+\newcommand{\nosublabel}[1]{%
+  \@bsphack\if at filesw {\let\thepage\relax
+   \def\protect{\noexpand\noexpand\noexpand}%
+   \edef\@tempa{\write\@auxout{\string
+      \newlabel{#1}{{0}{\thepage}}}}%
+   \expandafter}\@tempa
+   \if at nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
+\newcommand\newsublabel{%
+  \nw at settrailers
+  \global\let\newsublabel\@newsublabel
+  \@newsublabel}
+\newcommand{\@newsublabel}[2]{%
+  \edef\this at page{\@cdr#2\@nil}%
+  \ifx\this at page\last at page\else
+    \sub at page=\z@
+  \fi
+  \edef\last at page{\this at page}
+  \advance\sub at page by \@ne
+  \ifnum\sub at page=\tw@
+    \global\@namedef{2on\this at page}{}%
+  \fi
+  \pendingsublabel{#1}%
+  \edef\@tempa##1{\noexpand\newlabel{##1}%
+    {{\number\sub at page}{\this at page}\nw at labeltrailers}}%
+  \pending at sublabels
+  \def\pending at sublabels{}}
+\newcommand\nw at settrailers{% -- won't work on first run
+  \@ifpackageloaded{nameref}%
+     {\gdef\nw at labeltrailers{{}{}{}}}%
+     {\gdef\nw at labeltrailers{}}}
+\renewcommand\nw at settrailers{% 
+  \@ifundefined{@secondoffive}%
+     {\gdef\nw at labeltrailers{}}%
+     {\gdef\nw at labeltrailers{{}{}{}}}}
+\newcommand{\nextchunklabel}[1]{%
+  \nwblindhyperanchor{#1}%   % looks slightly bogus --- nr
+  \@bsphack\if at filesw {\let\thepage\relax
+      \edef\@tempa{\write\@auxout{\string\pendingsublabel{#1}}}%
+      \expandafter}\@tempa
+   \if at nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
+\newcommand\pendingsublabel[1]{%
+  \def\@tempa{\noexpand\@tempa}%
+  \edef\pending at sublabels{\noexpand\@tempa{#1}\pending at sublabels}}
+\def\pending at sublabels{}
+\def\last at page{\relax}
+\newcount\sub at page
+\def\@alphasubpagenum#1#2{#2\ifnum#1=0 \else\@alph{#1}\fi}
+\def\@nosubpagenum#1#2{#2}
+\def\@numsubpagenum#1#2{#2\ifnum#1=0 \else.\@arabic{#1}\fi}
+\def\nwopt at nosubpage{\let\nwthepagenum=\@nosubpagenum\nwopt at nomargintag}
+\def\nwopt at numsubpage{\let\nwthepagenum=\@numsubpagenum}
+\def\nwopt at alphasubpage{\let\nwthepagenum=\@alphasubpagenum}
+\nwopt at alphasubpage
+\newcount\@nwalph at n
+\let\@nwalph at d\@tempcnta
+\let\@nwalph at bound\@tempcntb
+\def\@nwlongalph#1{{%
+  \@nwalph at n=#1\advance\@nwalph at n by-1
+  \@nwalph at bound=26
+  \loop\ifnum\@nwalph at n<\@nwalph at bound\else
+     \advance\@nwalph at n by -\@nwalph at bound
+     \multiply\@nwalph at bound by 26
+  \repeat
+  \loop\ifnum\@nwalph at bound>1
+    \divide\@nwalph at bound by 26
+    \@nwalph at d=\@nwalph at n\divide\@nwalph at d by \@nwalph at bound
+    % d := d * bound ; n -:= d; d := d / bound --- saves a temporary
+    \multiply\@nwalph at d by \@nwalph at bound
+    \advance\@nwalph at n by -\@nwalph at d
+    \divide\@nwalph at d by \@nwalph at bound
+    \advance\@nwalph at d by 1 \@alph{\@nwalph at d}%
+  \repeat
+}}
+\newcount\nw at chunkcount
+\nw at chunkcount=\@ne
+\newcommand{\weblabel}[1]{%
+  \@bsphack
+  \nwblindhyperanchor{#1}%
+  \if at filesw {\let\thepage\relax
+   \def\protect{\noexpand\noexpand\noexpand}%
+   \edef\@tempa{\write\@auxout{\string
+      \newsublabel{#1}{{}{\number\nw at chunkcount}}}}%
+   \expandafter}\@tempa
+   \global\advance\nw at chunkcount by \@ne
+   \if at nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
+\def\nwopt at webnumbering{%
+  \let\sublabel=\weblabel
+  \def\nwpageword{chunk}\def\nwpagesword{chunks}%
+  \def\nwpageprep{in}}
+% \nwindexdefn{printable name}{identifying label}{label of chunk}
+% \nwindexuse{printable name}{identifying label}{label of chunk}
+
+\def\nwindexdefn#1#2#3{\@auxix{\protect\nwixd}{#2}{#3}}
+\def\nwindexuse#1#2#3{\@auxix{\protect\nwixu}{#2}{#3}}
+
+\def\@auxix#1#2#3{% {marker}{id label}{subpage label}
+   \@bsphack\if at filesw {\let\nwixd\relax\let\nwixu\relax
+   \def\protect{\noexpand\noexpand\noexpand}%
+   \edef\@tempa{\write\@auxout{\string\nwixadd{#1}{#2}{#3}}}%
+   \expandafter}\@tempa
+   \if at nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
+% \nwixadd{marker}{idlabel}{subpage label}
+\def\nwixadd#1#2#3{%
+  \@ifundefined{nwixl@#2}%
+    {\global\@namedef{nwixl@#2}{#1{#3}}}%
+    {\expandafter\nwix at cons\csname nwixl@#2\endcsname{#1{#3}}}}
+\def\@nwsubscriptident#1#2{\mbox{$\mbox{#1}_{\mathrm{\subpageref{#2}}}$}}
+\def\@nwnosubscriptident#1#2{#1}
+\def\@nwhyperident#1#2{\leavevmode\nwhyperreference{#2}{#1}}
+\def\nwopt at subscriptidents{%
+  \let\nwlinkedidentq\@nwsubscriptident
+  \let\nwlinkedidentc\@nwsubscriptident
+}
+\def\nwopt at nosubscriptidents{%
+  \let\nwlinkedidentq\@nwnosubscriptident
+  \let\nwlinkedidentc\@nwnosubscriptident
+}
+\def\nwopt at hyperidents{%
+  \let\nwlinkedidentq\@nwhyperident
+  \let\nwlinkedidentc\@nwhyperident
+}
+\def\nwopt at nohyperidents{%
+  \let\nwlinkedidentq\@nwnosubscriptident
+  \let\nwlinkedidentc\@nwnosubscriptident
+}
+\def\nwopt at subscriptquotedidents{%
+  \let\nwlinkedidentq\@nwsubscriptident
+}
+\def\nwopt at nosubscriptquotedidents{%
+  \let\nwlinkedidentq\@nwnosubscriptident
+}
+\def\nwopt at hyperquotedidents{%
+  \let\nwlinkedidentq\@nwhyperident
+}
+\def\nwopt at nohyperquotedidents{%
+  \let\nwlinkedidentq\@nwnosubscriptident
+}
+\nwopt at hyperidents
+\newcount\@commacount
+\def\commafy#1{%
+  {\nwix at listcount{#1}\@commacount=\nwix at counter
+   \let\@comma at each=\\%
+   \ifcase\@commacount\let\\=\@comma at each\or\let\\=\@comma at each\or
+     \def\\{\def\\{ \@nwlangdepand\ \@comma at each}\@comma at each}\else
+     \def\\{\def\\{, %
+                   \advance\@commacount by \m at ne
+                   \ifnum\@commacount=1 \@nwlangdepand~\fi\@comma at each}\@comma at each}\fi
+   #1}}
+\def\nwix at cons#1#2{% {list}{\marker{element}}
+  {\toks0=\expandafter{#1}\def\@tempa{#2}\toks2=\expandafter{\@tempa}%
+   \xdef#1{\the\toks0 \the\toks2 }}}
+\def\nwix at uses#1{% {label}
+  \def\nwixu{\\}\let\nwixd\@gobble\@nameuse{nwixl@#1}}
+\def\nwix at defs#1{% {label}
+  \def\nwixd{\\}\let\nwixu\@gobble\@nameuse{nwixl@#1}}
+\newcount\nwix at counter
+\def\nwix at listcount#1{% {list with \\}
+  {\count@=0
+   \def\\##1{\advance\count@ by \@ne }%
+   #1\global\nwix at counter=\count@ }}
+\def\nwix at usecount#1{\nwix at listcount{\nwix at uses{#1}}}
+\def\nwix at defcount#1{\nwix at listcount{\nwix at defs{#1}}}
+\def\nwix at id@defs#1{% index pair
+  {{\Tt \@car#1\@nil}%
+  \def\\##1{~\subpageref{##1}}\nwix at defs{\@cdr#1\@nil}}}
+\def\nwidentuses#1{% list of index pairs
+  \nwcodecomment{\@nwlangdepuss\ \let\\=\nwix at id@defs\commafy{#1}.}}
+\def\nwix at totaluses#1{% list of index pairs
+  {\count@=0
+   \def\\##1{\nwix at usecount{\@cdr##1\@nil}\advance\count@ by\nwix at counter}%
+   #1\global\nwix at counter\count@ }}
+\def\nwix at id@uses#1#2{% {ident}{label}
+  \nwix at usecount{#2}\ifnum\nwix at counter>0
+    {\advance\leftskip by \codemargin
+     \nwcodecomment{{\Tt #1}, \@nwlangdepusd\ \nwpageprep\ \@pagesl{\nwix at uses{#2}}.}}%
+  \else
+    \ifnw at hideunuseddefs\else
+      {\advance\leftskip by \codemargin \nwcodecomment{{\Tt #1}, \@nwlangdepnvu.}}%
+    \fi
+  \fi}
+\def\nwidentdefs#1{% list of index pairs
+  \ifnw at hideunuseddefs\nwix at totaluses{#1}\else\nwix at listcount{#1}\fi
+  \ifnum\nwix at counter>0
+    \nwcodecomment{\@nwlangdepdfs:}%
+    {\def\\##1{\nwix at id@uses ##1}#1}%
+  \fi}
+\newif\ifnw at hideunuseddefs\nw at hideunuseddefsfalse
+\def\nwopt at hideunuseddefs{\nw at hideunuseddefstrue}
+\def\nwopt at noidentxref{%
+  \let\nwidentdefs\@gobble
+  \let\nwidentuses\@gobble}
+\def\nw at underlinedefs{% {list with \nwixd, \nwixu}
+  \let\\=\relax\def\nw at comma{, }
+  \def\nwixd##1{\\\underline{\subpageref{##1}}\let\\\nw at comma}%
+  \def\nwixu##1{\\\subpageref{##1}\let\\\nw at comma}}
+
+\def\nw at indexline#1#2{%
+   {\indent {\Tt #1}: \nw at underlinedefs\@nameuse{nwixl@#2}\par}}
+
+\newenvironment{thenowebindex}{\parindent=-10pt \parskip=\z@ 
+        \advance\leftskip by 10pt 
+        \advance\rightskip by 0pt plus1in\par\@afterindenttrue
+    \def\\##1{\nw at indexline##1}}{}
+\def\nowebindex{%
+  \@ifundefined{nwixs at i}%
+     {\@warning{The \string\nowebindex\space is empty}}%
+     {\begin{thenowebindex}\@nameuse{nwixs at i}\end{thenowebindex}}}
+\def\nowebindex at external{%
+  {\let\nwixadds at c=\@gobble
+   \def\nwixadds at i##1{\nw at indexline##1}%
+   \def\nwixaddsx##1##2{\@nameuse{nwixadds@##1}{##2}}%
+   \begin{thenowebindex}\@input{\jobname.nwi}\end{thenowebindex}}}
+\def\nwixlogsorted#1#2{% list data
+   \@bsphack\if at filesw 
+     \toks0={#2}\immediate\write\@auxout{\string\nwixadds{#1}{\the\toks0}}
+   \if at nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
+\def\nwixadds#1#2{%
+  \@ifundefined{nwixs@#1}%
+    {\global\@namedef{nwixs@#1}{\\{#2}}}%
+    {\expandafter\nwix at cons\csname nwixs@#1\endcsname{\\{#2}}}}
+\let\nwixaddsx=\@gobbletwo
+\def\nwopt at externalindex{%
+  \ifx\nwixadds\@gobbletwo % already called
+  \else
+    \let\nwixaddsx=\nwixadds \let\nwixadds=\@gobbletwo
+    \let\nowebindex=\nowebindex at external
+    \let\nowebchunks=\nowebchunks at external
+  \fi}
+\def\nowebchunks{%
+  \@ifundefined{nwixs at c}%
+     {\@warning{The are no \string\nowebchunks}}%
+     {\begin{thenowebchunks}\@nameuse{nwixs at c}\end{thenowebchunks}}}
+\def\nowebchunks at external{%
+  {\let\nwixadds at i=\@gobble
+   \def\nwixadds at c##1{\nw at onechunk##1}%
+   \def\nwixaddsx##1##2{\@nameuse{nwixadds@##1}{##2}}%
+   \begin{thenowebchunks}\@input{\jobname.nwi}\end{thenowebchunks}}}
+    \@namedef{r at nw@notdef}{{0}{(\@nwlangdepnvd)}}
+\def\nw at chunkunderlinedefs{% {list of labels with \nwixd, \nwixu}
+  \let\\=\relax\def\nw at comma{, }
+  \def\nwixd##1{\\\underline{\subpageref{##1}}\let\\\nw at comma}%
+  \def\nwixu##1{\\\subpageref{##1}\let\\\nw at comma}}
+\def\nw at onechunk#1#2#3{% {name}{label of first definition}{list with \nwixd, \nwixu}
+  \@ifundefined{r@#2}{}{%
+    \indent\LA #1~{\nwtagstyle\subpageref{#2}}\RA 
+    \if at nwlongchunks{~\nw at chunkunderlinedefs#3}\fi\par}}
+\newenvironment{thenowebchunks}{\vskip3pt
+  \parskip=\z@\parindent=-10pt \advance\leftskip by 10pt
+  \advance\rightskip by 0pt plus10pt \@afterindenttrue
+  \def\\##1{\nw at onechunk##1}}{}
+\newif\if at nwlongchunks
+\@nwlongchunksfalse
+\let\nwopt at longchunks\@nwlongchunkstrue
+\newcommand\@nw at hyper@ref{\hyperreference} % naras
+\newcommand\@nw at hyper@anc{\blindhyperanchor} % naras
+\newcommand\@nw at hyperref@ref[2]{\hyperlink{noweb.#1}{#2}}  % nr
+\newcommand\@nw at hyperref@anc[1]{\hypertarget{noweb.#1}{\relax}}  % nr
+%%\renewcommand\@nw at hyperref@ref[2]{{#2}}  % nr
+%%\renewcommand\@nw at hyperref@anc[1]{}  % nr
+\newcommand\nwhyperreference{%
+  \@ifundefined{hyperlink}
+    {\@ifundefined{hyperreference}
+       {\global\let\nwhyperreference\@gobble}
+       {\global\let\nwhyperreference\@nw at hyper@ref}}
+    {\global\let\nwhyperreference\@nw at hyperref@ref}%
+  \nwhyperreference
+}
+
+\newcommand\nwblindhyperanchor{%
+  \@ifundefined{hyperlink}
+    {\@ifundefined{hyperreference}
+       {\global\let\nwblindhyperanchor\@gobble}
+       {\global\let\nwblindhyperanchor\@nw at hyper@anc}}
+    {\global\let\nwblindhyperanchor\@nw at hyperref@anc}%
+  \nwblindhyperanchor
+}
+\newcommand\nwanchorto{%
+  \begingroup\let\do\@makeother\dospecials
+     \catcode`\{=1 \catcode`\}=2 \nw at anchorto}
+\newcommand\nw at anchorto[1]{\endgroup\def\nw at next{#1}\nw at anchortofin}
+\newcommand\nw at anchortofin[1]{#1\footnote{See URL \texttt{\nw at next}.}}
+\let\nwanchorname\@gobble
+\newif\ifhtml
+\htmlfalse
+\let\nwixident=\relax
+\def\nwbackslash{\char92}
+\def\nwlbrace{\char123}
+\def\nwrbrace{\char125}
+\def\nwopt at english{%
+  \def\@nwlangdepdef{This definition is continued}%
+  \def\@nwlangdepcud{This code is used}%
+  \def\@nwlangdeprtc{Root chunk (not used in this document)}%
+  \def\@nwlangdepcwf{This code is written to file}%
+  \def\@nwlangdepchk{chunk}%
+  \def\@nwlangdepchks{chunks}%
+  \def\@nwlangdepin{in}%
+  \def\@nwlangdepand{and}%
+  \def\@nwlangdepuss{Uses}%
+  \def\@nwlangdepusd{used}%
+  \def\@nwlangdepnvu{never used}%
+  \def\@nwlangdepdfs{Defines}%
+  \def\@nwlangdepnvd{never defined}%
+}
+\let\nwopt at american\nwopt at english
+\def\nwopt at portuges{%
+  \def\@nwlangdepdef{Defini\c{c}\~ao continuada em}%
+  % This definition is continued
+  \def\@nwlangdepcud{C\'odigo usado em}%
+  % This code is used
+  \def\@nwlangdeprtc{Fragmento de topo (sem uso no documento)}%
+  % Root chunk (not used in this document)
+  \def\@nwlangdepcwf{Este c\'odigo foi escrito no ficheiro}%
+  % This code is written to file
+  \def\@nwlangdepchk{fragmento}%
+  % chunk
+  \def\@nwlangdepchks{fragmentos}%
+  % chunks
+  \def\@nwlangdepin{no(s)}%
+  % in
+  \def\@nwlangdepand{e}%
+  % and
+  \def\@nwlangdepuss{Usa}%
+  % Uses
+  \def\@nwlangdepusd{usado}%
+  % used
+  \def\@nwlangdepnvu{nunca usado}%
+  % never used
+  \def\@nwlangdepdfs{Define}%
+  % Defines
+  \def\@nwlangdepnvd{nunca definido}%
+  % never defined
+}
+\def\nwopt at frenchb{%
+  \def\@nwlangdepdef{Cette d\'efinition suit}%
+  % This definition is continued
+  \def\@nwlangdepcud{Ce code est employ\'e}%
+  % This code is used
+  \def\@nwlangdeprtc{Morceau racine (pas employ\'e dans ce document)}%
+  % Root chunk (not used in this document)
+  \def\@nwlangdepcwf{Ce code est \'ecrit aux fichier}%
+  % This code is written to file
+  \def\@nwlangdepchk{le morceau}%
+  % chunk
+  \def\@nwlangdepchks{les morceaux}%
+  % chunks
+  \def\@nwlangdepin{dans}%
+  % in
+  \def\@nwlangdepand{et}%
+  % and
+  \def\@nwlangdepuss{Il emploie}%
+  % Uses
+  \def\@nwlangdepusd{employ\'{e}}%
+  % used
+  \def\@nwlangdepnvu{jamais employ\'{e}}%
+  % never used
+  \def\@nwlangdepdfs{Il d\'{e}fine}%
+  % Defines
+  % Cannot use the accent here: \def\@nwlangdepnvd{jamais d\'{e}fini}%
+  \def\@nwlangdepnvd{jamais defini}%
+  % never defined
+}
+\let\nwopt at french\nwopt at frenchb
+\def\nwopt at german{%
+  \def\@nwlangdepdef{Diese Definition wird fortgesetzt}%
+  % This definition is continued
+  \def\@nwlangdepcud{Dieser Code wird benutzt}%
+  % This code is used
+  \def\@nwlangdeprtc{Hauptteil (nicht in diesem Dokument benutzt)}%
+  % Root chunk (not used in this document)
+  \def\@nwlangdepcwf{Dieser Code schreibt man zum File}%
+  % This code is written to file
+  \def\@nwlangdepchk{Teil}%
+  % chunk
+  \def\@nwlangdepchks{Teils}%
+  % chunks
+  \def\@nwlangdepin{im}%
+  % in
+  \def\@nwlangdepand{und}%
+  % and
+  \def\@nwlangdepuss{Benutztt}%
+  % Uses
+  \def\@nwlangdepusd{benutzt}%
+  % used
+  \def\@nwlangdepnvu{nicht benutzt}%
+  % never used
+  \def\@nwlangdepdfs{Definiert}%
+  % Defines
+  \def\@nwlangdepnvd{nicht definiert}%
+  % never defined
+}
+\let\nwopt at ngerman\nwopt at german
+\ifx\languagename\undefined % default is English
+  \noweboptions{english}
+\else
+  \@ifundefined{nwopt@\languagename}
+     {\noweboptions{english}}
+     {\expandafter\noweboptions\expandafter{\languagename}}
+\fi
+% Final names for the system and its components were in doubt so
+% Language is used throughout the book to specify what the system is named.
+\newcommand{\Language}{AXIOM}
+
+% HyperName was used to specify the name of the browser
+\newcommand{\HyperName}{HyperDoc}
+
+% This is nothing more than inline math mode in Tex but has additional
+% meaning within the browser.
+\newcommand{\spad}[1]{${#1}$}
+
+% This is a way to say 8th, 100th, etc.
+\newcommand{\eth}[1]{{#1}-th}
+
+% spadcommands are the actual text that you type at the axiom prompt
+\newcommand{\spadcommand}[1]%
+{\begin{flushleft}{\tt #1}\end{flushleft}\vskip .1cm }
+
+% returnType is the type signature returned by the axiom interpreter
+\newcommand{\returnType}[1]%
+{\begin{flushright}{\tt #1}\end{flushright}\vskip .1cm}
+
+% The book begins with some introductory material that is not really
+% listed as a chapter. This creates a header similar to \chapter.
+\newcommand{\pseudoChapter}[1]%
+{\vskip .5in \noindent {\Huge{\bf #1}}\vskip .5in}
+
+% The book begins with some introductory material that is not really
+% listed as a section. This creates a header similar to \section.
+\newcommand{\pseudoSection}[1]%
+{\vskip .25in \noindent {\large{\bf #1}}\vskip .25in}
+
+% These are special markers within the text for Hypertex keywords
+% They have no particular meaning in the book form.
+\newcommand{\spadfun}[1]{{\it #1}}
+\newcommand{\spadgloss}[1]{{\it #1}}
+\newcommand{\spadkey}[1]{\index{#1 @\begingroup \string\tt{} #1 \endgroup}}
+
+% spadtype records the domain in the index
+\newcommand{\spadtype}[1]{{\bf #1}\index{#1 @\begingroup \string\bf{} #1 \endgroup}}
+
+% This is used to create a caption on an included image
+\newcommand{\simpleCaption}[1]{\def\thefigure{\@arabic\c at figure}\caption{#1}}
+
+% This is the name of the ``glossy'' pages in the physical book.
+\newcommand{\Gallery}{\Language{} Images}
+
+% spadofFrom records the operation in the index and the domain in the index
+\newcommand{\spadopFrom}[2]{\index{library!operations!#1 @\begingroup \string\tt{} #1 \endgroup}\index{#2}``{\tt #1}''}
+\newcommand\AXIOM{\vskip\parindent\indent{\bf AXIOM}\vskip\parindent\noindent\ignorespaces}
+\newcommand\maxima{\vskip\parindent\noindent{\bf MAXIMA}\vskip\parindent\noindent\ignorespaces}
+\newcommand\yacas{\vskip\parindent\noindent{\bf YACAS}\vskip\parindent\noindent\ignorespaces}

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/axiomWrapper.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/axiomWrapper.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/axiomWrapper.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,150 @@
+###
+###  Runs Axiom and returns a latex code block for each Axiom block
+###
+
+import os, sys, re, popen2, glob
+import zLOG
+from util import fileNameFor, workingDir
+from cgi import escape
+
+# For testing without Zope
+#workingDir = './'
+#def fileNameFor(code,num,ext):
+#    return 'axiom'+ext
+
+class AxiomSyntaxError(Exception): pass
+
+axiomTemplate = r""")set output algebra off
+)set output tex on
+)set message autoload off
+)set quit unprotected
+%s)quit
+"""
+
+outputPattern = r'(.*?)\s*\n\(\d+\) -> '
+reConsts = re.MULTILINE+re.DOTALL
+
+def log(message,summary='',severity=0):
+        zLOG.LOG('LatexWikiDebugLog',severity,summary,message)
+
+def renderAxiom(axiomCodeList):
+    def securityCheck(code):
+      newCode = re.compile(r'^[ \t]*\)sys([^\n]*)',reConsts).sub(r'-- not allowed: )sys\1\n)sys',code)
+#     newCode = re.compile(r'^[ \t]*\)lisp([^\n]*)',reConsts).sub(r'-- not allowed: )lisp\1\n)sys',newCode)
+      newCode = re.compile(r'^[ \t]*\)fin([^\n]*)',reConsts).sub(r'-- not allowed: )fin\1\n)sys',newCode)
+      newCode = re.compile(r'^[ \t]*\)spool([^\n]*)',reConsts).sub(r'-- not allowed: )spool\1\n)sys',newCode)
+      return newCode
+    
+    n = 0
+    unifiedCode = ''
+    for axiomCode in axiomCodeList:
+        newAxiomCode = securityCheck(axiomCode)
+        n = n + 1
+        if re.match(r'^\s*\)abb',newAxiomCode):
+            # Starts like spad so compile as library code
+            axiomFileName = os.path.join(workingDir,fileNameFor(newAxiomCode, 25, '.%3.3d.spad'%n))
+            unifiedCode = unifiedCode + ')set message prompt none\n'
+            unifiedCode = unifiedCode + ')sys cat %s\n'%axiomFileName
+            unifiedCode = unifiedCode + ')compile %s\n'%axiomFileName
+            unifiedCode = unifiedCode + ')set message prompt step\n'
+        elif re.match(r'^\\begin *{spad}\s*.*?\s*\\end *{spad}',newAxiomCode,
+             reConsts):
+            # spad so compile as library code
+            m = re.match(r'^\\begin *{spad}\s*(.*?)\s*\\end *{spad}',
+                newAxiomCode,reConsts)
+            newAxiomCode = m.group(1) # just the spad code
+            axiomFileName = os.path.join(workingDir,fileNameFor(newAxiomCode, 25, '%3.3d.spad'%n))
+            unifiedCode = unifiedCode + ')set message prompt none\n'
+            unifiedCode = unifiedCode + ')sys echo "<spad>";cat %s;echo "</spad>"\n'%axiomFileName
+            unifiedCode = unifiedCode + ')compile %s\n'%axiomFileName
+            unifiedCode = unifiedCode + ')set message prompt step\n'
+        elif re.match(r'^\\begin *{aldor}\s*.*?\s*\\end *{aldor}',newAxiomCode,
+             reConsts):
+            # aldor so compile as library code
+            m = re.match(r'^\\begin *{aldor} *(?:\[(.*?)\])?\s*(.*?)\s*\\end *{aldor}',
+                newAxiomCode,reConsts)
+            if m.group(1): # optional file name
+                axiomFileName = os.path.join(workingDir,m.group(1)+'.as')
+            else :
+                axiomFileName = os.path.join(workingDir,fileNameFor(newAxiomCode, 25, '%3.3d.as'%n))
+            newAxiomCode = m.group(2) # just the aldor code
+            unifiedCode = unifiedCode + ')set message prompt none\n'
+            unifiedCode = unifiedCode + ')sys echo "<aldor>";cat %s;echo "</aldor>"\n'%axiomFileName
+            unifiedCode = unifiedCode + ')compile %s\n'%axiomFileName
+            unifiedCode = unifiedCode + ')set message prompt step\n'
+        elif re.match(r'^\\begin *{boot}\s*.*?\s*\\end *{boot}',newAxiomCode, reConsts):
+            m = re.match(r'^\\begin *{boot}\s*(.*?)\s*\\end *{boot}',
+                newAxiomCode,reConsts)
+            newAxiomCode = m.group(1) # just the boot code
+            fileName = fileNameFor(newAxiomCode, 25, '%3.3d'%n)
+            axiomFileName = os.path.join(workingDir,fileName+'.boot')
+            axiomFileName2 = fileName+'.clisp'
+            unifiedCode = unifiedCode + ')set message prompt none\n'
+            unifiedCode = unifiedCode + ')sys echo "<boot>";cat %s;echo "</boot>"\n'%axiomFileName
+            unifiedCode = unifiedCode + ')lisp (boottran::boottocl "%s")\n'%axiomFileName
+            unifiedCode = unifiedCode + ')lisp (load (compile-file (truename (concat (si:getenv "AXIOM") "/../../int/interp/%s"))))\n'%axiomFileName2
+            unifiedCode = unifiedCode + ')set message prompt step\n'
+        elif re.match(r'^\\begin *{lisp}\s*.*?\s*\\end *{lisp}',newAxiomCode, reConsts):
+            m = re.match(r'^\\begin *{lisp}\s*(.*?)\s*\\end *{lisp}',
+                newAxiomCode,reConsts)
+            newAxiomCode = m.group(1) # just the lisp code
+            axiomFileName = os.path.join(workingDir,fileNameFor(newAxiomCode, 25, '%3.3d.lisp'%n))
+            unifiedCode = unifiedCode + ')set message prompt none\n'
+            unifiedCode = unifiedCode + ')sys echo "<lisp>";cat %s;echo "</lisp>"\n'%axiomFileName
+            unifiedCode = unifiedCode + ')lisp (load (compile-file "%s"))\n'%axiomFileName
+            unifiedCode = unifiedCode + ')set message prompt step\n'
+        else:
+            # otherwise it is just an input file
+            axiomFileName = os.path.join(workingDir,fileNameFor(newAxiomCode, 25, '.%3.3d.input'%n))
+            unifiedCode = unifiedCode + ')read %s\n'%axiomFileName
+        axiomFile = open(axiomFileName, 'w')
+        axiomFile.write(newAxiomCode)
+        axiomFile.close()
+    if unifiedCode:
+        try:
+            latexCode=runAxiom(unifiedCode,axiomTemplate)
+            latexCodeList = re.compile(outputPattern, reConsts).findall(latexCode)
+            return (latexCodeList,'')
+        except AxiomSyntaxError, data:
+            errors = str(data)
+            log(errors, 'AxiomSyntaxError')
+            return ([],escape(errors))
+    return ([],'')
+
+def runCommand(cmdLine):
+    program = popen2.Popen3('cd %s; '%(workingDir) + cmdLine, 1, 4096)
+    program.tochild.close()
+    stderr = ''
+    stdout = ''
+    while(not os.WIFEXITED(program.poll())):
+#       Seems Axiom doesn't properly close stderr
+#       stderr = stderr + program.childerr.read()
+        stdout = stdout + program.fromchild.read()
+    program.fromchild.close()
+    program.childerr.close()
+    status = program.poll()
+    error = os.WEXITSTATUS(status) or not os.WIFEXITED(status)
+    return error, stdout, stderr
+
+def runAxiom(axiomCode, axiomTemplate):
+    axiomFileName = os.path.join(workingDir,fileNameFor(axiomCode, 25, '.axm'))
+    # problem: http://wiki.axiom-developer.org/145PipingCommandsToSmanDoesNotWork
+    #cmdLine = '/usr/bin/axiom < %s' %(axiomFileName)
+    #cmdLine = 'export AXIOM=/usr/local/axiom/mnt/linux; export PATH=$AXIOM/bin:$PATH; export ALDORROOT=/usr/local/aldor/linux/1.0.2; export PATH=$ALDORROOT/bin:$PATH; export HOME=/var/lib/plone2/main; AXIOMsys < %s' %(axiomFileName)
+    # enough for now on debian
+    cmdLine = 'export AXIOM=/usr/lib/axiom-20050901; $AXIOM/bin/AXIOMsys < %s' %(axiomFileName)
+    file = open(axiomFileName, 'w')
+    file.write(axiomTemplate%axiomCode)
+    file.close()
+    err, stdout, stderr = runCommand(cmdLine)
+ 
+    if err:
+        out = 'Error: ' + cmdLine + '\n' + stderr + '\n' + stdout
+        raise AxiomSyntaxError(out)
+    else:
+        # Clean up the startup prompts
+        newcode = re.compile(r'^.*?(?:\(1\) -> ){5}', reConsts).sub('',stdout)
+        # Temporary fix for Axiom bug \spadcommand{radix(10**90,32)}
+        newcode = re.compile(r'#\\', reConsts).sub('',newcode)
+        return newcode
+    

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/latexWrapper.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/latexWrapper.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/latexWrapper.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,244 @@
+### ###
+###
+
+import os, sys, re, popen2, glob, zLOG, select, fcntl, string
+from util import fileNameFor, imageExtension, unique, workingDir
+from PIL import Image, ImageFile, ImageChops, PngImagePlugin
+from cgi import escape
+
+class LatexSyntaxError(Exception): pass
+class GhostscriptError(Exception): pass
+
+charsizept = 10
+ptperinch = 72.0
+
+# This is only used if your wiki does not have a node LatexTemplate.
+defaultLatexTemplate = r"""
+\documentclass[%dpt,notitlepage]{article}
+\usepackage{amsmath}
+\usepackage{amsfonts}
+\usepackage[all]{xy}
+\newenvironment{latex}{}{}
+\begin{document}
+\pagestyle{empty}
+%%s
+\end{document}
+"""  % (charsizept)
+
+def log(message,summary='',severity=0):
+        zLOG.LOG('LatexWikiDebugLog',severity,summary,message)
+
+def imageDoesNotExist(code, charheightpx):
+    return not os.path.exists(os.path.join(workingDir, 
+        fileNameFor(code, charheightpx, imageExtension)))
+
+def renderNonexistingImages(latexCodeList, charheightpx, alignfudge, resfudge, **kw):
+    """ take a list of strings of latex code, render the
+    images that don't already exist.
+    """
+    from string import join
+
+    res = int(round(charheightpx*ptperinch/charsizept*resfudge))
+    errors = ""
+    latexTemplate = (kw.get('latexTemplate', defaultLatexTemplate) or
+                     defaultLatexTemplate)
+    
+    codeToRender = filter(lambda x: imageDoesNotExist(x, charheightpx), unique(latexCodeList))
+    
+    if (not codeToRender): return
+
+#    unifiedCode = re.sub(r'^(\$|\\\()', r'\1\cdot ', codeToRender[0])
+#    for code in codeToRender[1:len(codeToRender)]:
+#        unifiedCode = unifiedCode + '\n\\newpage\n' + re.sub(r'^(\$|\\\()', r'\1\cdot ', code)
+
+    unifiedCode = codeToRender[0]
+    for code in codeToRender[1:len(codeToRender)]:
+        unifiedCode = unifiedCode + '\n\\newpage\n' + code
+
+    try:
+       runLatex(unifiedCode, charheightpx, latexTemplate)
+    except LatexSyntaxError, data:
+       errors = str(data)
+       log(errors, 'LatexSyntaxError')
+       return escape(errors)
+
+    fName = fileNameFor(unifiedCode, charheightpx)
+
+    # XXX added latexwiki's dvips step
+    dvipspath = '/usr/bin/dvips'
+    ppopt = ''
+    cmdLine = '%s %s -R -D %f -o %s %s'%(dvipspath, ppopt, res, fName+'.ps', fName+'.dvi')
+    err, stdout, stderr = runCommand(cmdLine)
+    if err:
+        log('%s\n%s\n%s\n'%(err, stdout, stderr), 'DVIPSError')
+        raise DVIPSError(stderr+'\n'+stdout)
+
+    runGhostscript(fName, res, 'pnggray')
+    bboxes = re.split('\n', runGhostscript(fName, res, 'bbox'))
+
+    for code, i in map(None, codeToRender, range(0, len(codeToRender))):
+        dotstartx = -1; dotendx = -1; dotstarty = -1; dotendy = -1; x = 0; widentop = 0; widenbottom = 0
+        letterstartx = -1; chopx = 0
+        newFileName = fileNameFor(code, charheightpx, imageExtension)
+        start_x, start_y, end_x, end_y = map(float, re.match(r'%%HiResBoundingBox: ([0-9\.]+) ([0-9\.]+) ([0-9\.]+) ([0-9\.]+)', bboxes[2*i+1]).groups())
+        xsize = ((end_x - start_x) * res)/ptperinch
+        ysize = ((end_y - start_y) * res)/ptperinch
+        if (xsize <= 0): xsize = 1
+        if (ysize <= 0): ysize = 1
+        start_x = start_x*res/ptperinch
+        start_y = start_y*res/ptperinch
+        imname = '%s-%03d.png'%(fName,i+1)
+        im = Image.open(os.path.join(workingDir, imname))
+        cropdim = (start_x, im.size[1]-start_y-ysize, start_x+xsize, im.size[1]-start_y)
+        cropdim = map(int, map(round, cropdim))
+        im = im.crop(cropdim)
+        if 1 or not re.match(r'^(?:\$|\\\()', code):
+            im2 = Image.new('RGB', im.size, (255,255,255))
+            im2.paste(im, (0,0))
+            alpha = ImageChops.invert(im2.convert('L'))
+            im3 = Image.new('RGBA', im.size, (0,0,0))
+            im3.putalpha(alpha)
+            im3.save(os.path.join(workingDir, newFileName), "PNG")
+            continue
+        for x in range(0,im.size[0]):  # Try to find the leading dot
+            if(dotendy < 0) :
+                for y in range(0, im.size[1]):
+                    if(dotstarty >= 0 and dotendy < 0): 
+                        if(im.getpixel((x,y)) == 255): 
+                            dotendy = y
+                            break
+                    if(dotstarty < 0 and im.getpixel((x,y)) != 255): 
+                        dotstartx = x
+                        dotstarty = y
+                else:
+                    dotendy = im.size[1]-1
+            elif(dotendx < 0):
+                if(charheightpx >= 12):
+                    if(im.getpixel((x,round((dotstarty+dotendy)/2.0))) == 255): 
+                        dotendx = x
+                else:
+                    dotendx = 0+dotendy-dotstartx
+            else:
+                if(charheightpx <= 12): letterstartx = dotendy-dotstarty
+                else:
+                    for y in range(0,im.size[1]):
+                        if(im.getpixel((x,y)) != 255): 
+                            letterstartx = x
+                            break
+                if(letterstartx >= 0): break
+        else:
+            log('dotstartx=%d, dotendx=%d, dotstarty=%d, dotendy=%d, letterstartx=%d\n'%(dotstartx, dotendx, dotstarty, dotendy, letterstartx))
+            log('Unable to find dot. (size=%dx%d)\n'%(im.size[0],im.size[1]), 'renderNonExistingImages')
+            errors = 'The following code:\n'+code+'\ngenerated a blank page'
+            return escape(errors)
+        #log('dotstartx=%d, dotendx=%d, dotstarty=%d, dotendy=%d, letterstartx=%d, alignfudge=%d\n'%(dotstartx, dotendx, dotstarty, dotendy, letterstartx, alignfudge))
+        #log('top dot = %d, bottom dot = %d'%(im.getpixel((dotstartx,dotstarty)), im.getpixel((dotstartx,dotendy-1))))
+        centerline = (dotendy+dotstarty)/2.0        # 1st guess, centerline is middle of dot
+#        centerline += (dotendy-dotstarty)*0.625     # centerline is 5/8 way down the dot.
+#                                                    # if dot is not pixel-aligned, take that into account
+        centerline += (im.getpixel((dotstartx,dotendy-1)) - im.getpixel((dotstartx,dotstarty)))/(255.0)
+        centerline += alignfudge
+        bottomsize = im.size[1]-centerline               # pixels below midline
+        topsize = centerline                             # pixels above midline
+        if(topsize > bottomsize):
+            newheight = 2*topsize
+            widenbottom = topsize - topsize
+        else: 
+            newheight = 2*bottomsize
+            widentop = bottomsize - topsize
+        chopx = round((dotendx-dotstartx)*1.5)           # chop off dot at 1.5 times its width
+        if(chopx > letterstartx): chopx = letterstartx   # or where the first letter starts
+        im2 = Image.new('RGB', (im.size[0]-chopx, int(round(newheight))), (255,255,255))
+        im2.paste(im, (-chopx, int(round(widentop))))
+        #log("code='%s' res=%d, topsize=%f, bottomsize=%f, centerline = %f, newheight=%f, widentop=%f, widenbottom=%f, chopx=%f\n"%(code, res, topsize, bottomsize, centerline, newheight, widentop, widenbottom, chopx))
+        alpha = ImageChops.invert(im2.convert('L'))
+        im3 = Image.new('RGBA', im2.size, (0,0,0))
+        im3.putalpha(alpha)
+        im3.save(os.path.join(workingDir, newFileName), "PNG")
+    os.system('cd %s; rm -f *.log *.aux *.tex *.pdf *.dvi *.ps %s-???.png'%(workingDir, fName))
+    return escape(errors)
+
+# Make our file descriptors nonblocking so that reading doesn't hang.
+def makeNonBlocking(f):
+    fl = fcntl.fcntl(f.fileno(), fcntl.F_GETFL)
+    fcntl.fcntl(f.fileno(), fcntl.F_SETFL, fl | os.O_NONBLOCK)
+    
+def runCommand(cmdLine):
+    program = popen2.Popen3('cd %s; '%(workingDir) + cmdLine, 1)
+    program.tochild.close()
+# old code
+#    stderr = ''
+#    stdout = ''
+#    while(not os.WIFEXITED(program.poll())):
+#        stderr = stderr + program.childerr.read()
+#        stdout = stdout + program.fromchild.read()
+#    status = program.poll()
+# new code
+    makeNonBlocking(program.fromchild)
+    makeNonBlocking(program.childerr)
+    stderr = []
+    stdout = []
+    erreof = False
+    outeof = False
+    while(not (erreof and outeof)):
+        readme, writme, xme = select.select([program.fromchild, program.childerr], [], [])
+        for output in readme:
+            if(output == program.fromchild):
+                text = program.fromchild.read()
+                if(text == ''): outeof = True
+                else: stdout.append(text)
+            elif(output == program.childerr):
+                text = program.childerr.read()
+                if(text == ''): erreof = True
+                else: stderr.append(text)
+    status = program.wait()
+    error = os.WEXITSTATUS(status) or not os.WIFEXITED(status)
+#    return error, stdout, stderr
+    return error, string.join(stdout, ''), string.join(stderr, '')
+
+def runLatex(code, charheightpx, latexTemplate):
+    texfileName = fileNameFor(code, charheightpx, '.tex')
+    dvifileName = fileNameFor(code, charheightpx, '.dvi')
+    psfileName = fileNameFor(code, charheightpx, '.ps')
+    #cmdLine = 'pdflatex --interaction errorstopmode %s' %(texfileName)
+    cmdLine = '/usr/bin/latex %s' %(texfileName)
+
+    file = open(os.path.join(workingDir, texfileName), 'w')
+    file.write(latexTemplate %(code,))
+    file.close()
+    err, stdout, stderr = runCommand(cmdLine)
+# Process Graphviz .dot files
+    again = 0
+    for f in os.listdir(workingDir):
+      if re.search(r'\.dot$',f):
+        dotfileName = os.path.join(workingDir,f)
+        err, stdout, stderr = runCommand(
+          'dot -Tps -o %s %s'%(re.sub(r'dot$','ps',dotfileName),
+          dotfileName))
+        os.remove(dotfileName)
+        again = 1
+  # repeat LaTeX command if necessary
+    if again==1:
+      err, stdout, stderr = runCommand(cmdLine)
+    if err:
+        out = stderr + '\n' + stdout
+        err = re.search('!.*\?', out, re.MULTILINE+re.DOTALL)
+        if err:
+            out = err.group(0)
+        raise LatexSyntaxError(out)
+    else:
+        err, stdout, stderr = runCommand('/usr/local/teTeX/bin/i686-pc-linux-gnu/dvips -o %s %s'%(psfileName, dvifileName))
+    
+def runGhostscript(fName, res, device):
+    input, output = fName+'.ps', fName+'-%03d.png'
+    cmdLine = 'gs -dDOINTERPOLATE -dTextAlphaBits=4 ' + \
+              '-dGraphicsAlphaBits=4 -r%d -sDEVICE=%s ' + \
+              '-dBATCH -dNOPAUSE -dQUIT -sOutputFile=%s %s '
+# -dAlignToPixels=1 (doesn't seem to do anything with gs 7.03.
+    cmdLine = cmdLine %(res, device, output, input)
+    err, stdout, stderr = runCommand(cmdLine)
+    if err:
+        log('%s\n%s\n%s\n'%(err, stdout, stderr), 'GhostscriptError')
+        raise GhostscriptError(stderr+'\n'+stdout)
+    return stderr # when using bbox, BoundingBox is on stderr
+

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/mathaction-maxima-5.9.3.lisp
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/mathaction-maxima-5.9.3.lisp	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/mathaction-maxima-5.9.3.lisp	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,158 @@
+(in-package :maxima)
+#+clisp (defvar *old-suppress-check-redefinition* 
+              custom:*suppress-check-redefinition*)
+#+clisp (setf custom:*suppress-check-redefinition* t)
+(setf *alt-display2d* 'texmacs)
+(setf *prompt-prefix* "<prompt>")
+(setf *prompt-suffix* "</prompt>")
+; (setf *general-display-prefix* "<verbatim>")
+(setf *maxima-prolog* "<maxima>")
+(setf *maxima-epilog* "</maxima>")
+#-gcl(setf *debug-io* (make-two-way-stream *standard-input* *standard-output*))
+#+(or cmu sbcl scl)
+(setf *terminal-io* (make-two-way-stream *standard-input* *standard-output*))
+
+(defun latex (x)
+  (let ((ccol 1))
+    (mapc #'myprinc
+      (if (and (listp x) (cdr x) (equal (cadr x) "Is  "))
+(tex x '("<display>") '("</display>") 'mparen 'mparen)
+        (tex x '("<latex>") '("</latex>") 'mparen 'mparen)))))
+
+(setf *alt-display2d* 'latex)
+
+;; Small changes to mactex.lisp for interfacing with TeXmacs
+;; Andrey Grozin, 2001-2005
+
+(defun main-prompt ()
+  (format () "~A(~A~D) ~A" *prompt-prefix* 
+    (tex-stripdollar $inchar) $linenum *prompt-suffix*))
+
+(declare-top
+         (special lop rop ccol $gcprint $inchar)
+         (*expr tex-lbp tex-rbp))
+(defconstant texport *standard-output*)
+
+(defun tex-stripdollar (sym)
+  (or (symbolp sym) (return-from tex-stripdollar sym))
+  (let* ((name (quote-% (print-invert-case sym)))
+      (name1 (if (memq (elt name 0) '(#\$ #\&)) (subseq name 1) name))
+      (l (length name1)))
+    (if (eql l 1) name1 (concatenate 'string "\\mathrm{" name1 "}"))))
+
+(defprop mtimes "\\*" texsym)
+
+(defun texmacs (x)
+  (let ((ccol 1))
+    (mapc #'myprinc
+        (tex x '("latex:$\\displaystyle ") '("$
+") 'mparen 'mparen))))
+
+;; In order to allow cut-and-paste from output to input,
+;; we should output \sin(x), not \sin x.
+
+(map 'list #'(lambda (f) (remprop f 'tex) (remprop f 'tex-rbp))
+  '(%sin %cos %tan %cot %sec %csc %sinh %cosh %tanh %coth %asin %acos %atan %exp %log))
+
+(remprop '$pi 'texword)
+(remprop '$gamma 'texword)
+(setf (get '$%i 'texword) "\\mathi")
+(setf (get '$%e 'texword) "\\mathe")
+
+;; Also, we should output f(x)^2, not f^2(x)
+
+(defun tex-mexpt (x l r)
+  (let((nc (eq (caar x) 'mncexpt)))     ; true if a^^b rather than a^b
+    (setq l (if (and (numberp (cadr x)) (numneedsparen (cadr x)))
+                (tex (cadr x) (cons "\\left(" l) '("\\right)") lop (caar x))
+                (tex (cadr x) l nil lop (caar x)))
+          r (if (mmminusp (setq x (nformat (caddr x))))
+                ;; the change in base-line makes parens unnecessary
+                (if nc
+                    (tex (cadr x) '("^ {-\\langle ")(cons "\\rangle }" r) 'mparen 'mparen)
+                    (tex (cadr x) '("^ {- ")(cons " }" r) 'mminus 'mparen))
+                (if nc
+                    (tex x (list "^{\\langle ")(cons "\\rangle}" r) 'mparen 'mparen)
+                    (if (and (integerp x) (< x 10))
+                        (tex x (list "^")(cons "" r) 'mparen 'mparen)
+                        (tex x (list "^{")(cons "}" r) 'mparen 'mparen)))))
+    (append l r)))
+
+;; binomial coefficients
+
+(defun tex-choose (x l r)
+  `(, at l
+    "\\binom{"
+    ,@(tex (cadr x) nil nil 'mparen 'mparen)
+    "}{"
+    ,@(tex (caddr x) nil nil 'mparen 'mparen)
+    "}"
+    , at r))
+
+;; Integrals, sums, products
+
+(defun tex-int (x l r)
+  (let ((s1 (tex (cadr x) nil nil 'mparen 'mparen)) ;;integrand delims / & d
+        (var (tex (caddr x) nil nil 'mparen rop))) ;; variable
+    (cond((= (length x) 3)
+          (append l `("\\int {" , at s1 "}{\\;\\mathd\\;" , at var "}\\big.") r))
+         (t ;; presumably length 5
+          (let ((low (tex (nth 3 x) nil nil 'mparen 'mparen))
+                ;; 1st item is 0
+                (hi (tex (nth 4 x) nil nil 'mparen 'mparen)))
+            (append l `("\\int_{" , at low "}^{" , at hi "}{" , at s1 "\\;\\mathd\\;" , at var "}\\big.") r))))))
+
+(defun tex-sum(x l r)
+  (let ((op (cond ((eq (caar x) '%sum) "\\sum_{")
+                  ((eq (caar x) '%product) "\\prod_{")
+                  ;; extend here
+                  ))
+        ;; gotta be one of those above
+        (s1 (tex (cadr x) nil nil 'mparen rop))        ;; summand
+        (index ;; "index = lowerlimit"
+         (tex `((mequal simp) ,(caddr x),(cadddr x)) nil nil 'mparen 'mparen))
+        (toplim (tex (car(cddddr x)) nil nil 'mparen 'mparen)))
+    (append l `( ,op , at index "}^{" , at toplim "}{" , at s1 "}\\big.") r)))
+
+(defun tex-lsum(x l r)
+  (let ((op (cond ((eq (caar x) '%lsum) "\\sum_{")
+                  ;; extend here
+                  ))
+        ;; gotta be one of those above 
+        (s1 (tex (cadr x) nil nil 'mparen rop))        ;; summand
+        (index ;; "index = lowerlimit"
+         (tex `((min simp) , (caddr x), (cadddr x))  nil nil 'mparen 'mparen)))
+    (append l `( ,op , at index "}}{" , at s1 "}\\big.") r)))
+
+;; This is a hack for math input of integrals, sums, products
+
+(defmfun $tmint (a b f x) ($integrate f x a b))
+
+(defmspec $tmsum (l) (setq l (cdr l))
+  (if (= (length l) 3)
+      (dosum (caddr l) (cadar l) (meval (caddar l)) (meval (cadr l)) t)
+      (wna-err '$tmsum)))
+
+(defmspec $tmlsum (l) (setq l (cdr l))
+  (or (= (length l) 2) (wna-err '$tmlsum))
+  (let ((form (cadr l))
+        (ind (cadar l))
+        (lis (meval (caddar l)))
+        (ans 0))
+       (or (symbolp ind) (merror "Second argument not a variable ~M" ind))
+       (cond (($listp lis)
+              (loop for v in (cdr lis)
+                    with lind = (cons ind nil)
+                    for w = (cons v nil)
+                    do
+                    (setq ans (add* ans  (mbinding (lind w) (meval form)))))
+                   ans)
+           (t `((%lsum) ,form ,ind ,lis)))))
+
+(defmspec $tmprod (l) (setq l (cdr l))
+  (if (= (length l) 3)
+      (dosum (caddr l) (cadar l) (meval (caddar l)) (meval (cadr l)) nil)
+      (wna-err '$tmprod)))
+
+#+clisp (setf custom:*suppress-check-redefinition*
+              *old-suppress-check-redefinition*)

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/maximaWrapper.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/maximaWrapper.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/maximaWrapper.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,78 @@
+###
+###  Runs Maxima and returns a latex code block for each Maxima block
+###
+
+import os, sys, re, popen2, glob
+import zLOG
+from util import fileNameFor, workingDir
+from cgi import escape
+
+# For testing without Zope
+#workingDir = './'
+#def fileNameFor(code,num,ext):
+#    return 'maxima'+ext
+
+class MaximaSyntaxError(Exception): pass
+
+maximaTemplate = """%s
+quit();
+"""
+
+# Throw away the prompts - we only need the <latex> .. </latex>
+outputSplit = '<prompt>.*</prompt>\nbatching #p.*\n'
+reConsts = re.MULTILINE+re.DOTALL
+
+def log(message,summary='',severity=0):
+        zLOG.LOG('LatexWikiDebugLog',severity,summary,message)
+
+def renderMaxima(maximaCodeList):
+    def securityCheck(code):
+      return code
+    
+    n = 0
+    unifiedCode = ''
+    for maximaCode in maximaCodeList:
+        newMaximaCode = securityCheck(maximaCode)
+        n = n + 1
+        maximaFileName = os.path.join(workingDir,fileNameFor(newMaximaCode, 25, '.%3.3d.max'%n))
+        unifiedCode = unifiedCode + 'batch("%s");\n'%maximaFileName
+        maximaFile = open(maximaFileName, 'w')
+        maximaFile.write(newMaximaCode)
+        maximaFile.close()
+    if unifiedCode:
+        try:
+            latexCode=runMaxima(unifiedCode,maximaTemplate)
+            latexCodeList = re.split(outputSplit,latexCode)[1:]
+            return (latexCodeList,'')
+        except MaximaSyntaxError, data:
+            errors = str(data)
+            log(errors, 'MaximaSyntaxError')
+            return ([],escape(errors))
+    return ([],'')
+
+def runCommand(cmdLine):
+    program = popen2.Popen3('cd %s; '%(workingDir) + cmdLine, 1, 4096)
+    program.tochild.close()
+    stderr = ''
+    stdout = ''
+    while(not os.WIFEXITED(program.poll())):
+        stdout = stdout + program.fromchild.read()
+    program.fromchild.close()
+    program.childerr.close()
+    status = program.poll()
+    error = os.WEXITSTATUS(status) or not os.WIFEXITED(status)
+    return error, stdout, stderr
+
+def runMaxima(maximaCode, maximaTemplate):
+    maximaFileName = os.path.join(workingDir,fileNameFor(maximaCode, 25, '.mbat'))
+    cmdLine = '/usr/bin/maxima -p /zope1/Products/ZWiki/plugins/mathaction/mathaction-maxima-5.9.3.lisp < %s' %(maximaFileName)
+    file = open(maximaFileName, 'w')
+    file.write(maximaTemplate%maximaCode)
+    file.close()
+    err, stdout, stderr = runCommand(cmdLine)
+ 
+    if err:
+        out = 'Error: ' + cmdLine + '\n' + stderr + '\n' + stdout
+        raise MaximaSyntaxError(out)
+    else:             # don't want the final prompt
+        return re.sub(r'<prompt>.*</prompt></maxima>$',r'',stdout)

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/pagetypes.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/pagetypes.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/pagetypes.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,423 @@
+import re
+from types import *
+#from urllib import quote,unquote
+
+from Products.ZWiki.Utils import BLATHER, formattedTraceback, html_quote
+from Products.ZWiki.pagetypes import registerPageType, registerPageTypeUpgrade
+from Products.ZWiki.pagetypes.common import *
+from Products.ZWiki.pagetypes.stx import PageTypeStx
+
+from util import defaultcharsizepx, workingDir
+from ReplaceInlineLatex import replaceInlineLatex
+from ReplacePamphlet import replacePamphlet
+
+# This class supports STX + HTML + LaTeX + Axiom + Reduce + Maxima for MathAction
+# Aug 1, 2005 Bill Page
+
+class PageTypeStxMath(PageTypeStx):
+    """
+    docstring
+    """
+    _id = 'stxmath'
+    _name = 'Structured Text + LaTeX + Math'
+    supportsLaTeX = yes
+    supportsPlone = yes
+
+    def preRender(self, page, text=None):
+	global savePre
+	savePre=[]
+        reConsts = re.DOTALL+re.MULTILINE
+
+        def hidePre(x):
+            global savePre
+            savePre.append(x.group(0))
+            return '<pre></pre>'
+
+        def restorePre(x):
+            global savePre
+            first,savePre = savePre[0],savePre[1:]
+            return first
+
+        latexTemplate = None
+        latexTemplatePage = getattr(page.folder(),
+                                    'LatexTemplate', None)
+        if latexTemplatePage:
+            latexTemplate = latexTemplatePage.text()
+        t = text or (page.document() + '\n' + MIDSECTIONMARKER + self.preRenderMessages(page))
+        # PROTECT all preformatted areas from LaTeX, Axiom etc.
+	savePre=[]
+	t = re.sub(r'<pre(?: .*?)?>.*?</pre>',hidePre,t,reConsts)
+        # replace latex and also axiom, reduce, maxima etc. markup
+        t = replaceInlineLatex(t, getattr(page.folder(),'latex_font_size',defaultcharsizepx), \
+                                  getattr(page.folder(),'latex_align_fudge',0), 
+                                  getattr(page.folder(),'latex_res_fudge',1.03), latexTemplate)
+        t = re.sub(r'<pre></pre>',restorePre,t,reConsts)
+        # PROTECT all preformatted areas from stx
+	savePre=[]
+	t = re.sub(r'<pre(?: .*?)?>.*?</pre>',hidePre,t,reConsts)
+        t = page.applyWikiLinkLineEscapesIn(t)
+        # Be more generous in STX for links...so they can contain equations
+        t = re.sub(r'(^| )(?ms)"([^"]*)":(http://[-:A-Za-z0-9_,./\?=@#~&%()]*?)([.!?,;](?= )|(?= )|$)',\
+            r'\1<a href="\3">\2</a>\4',t)
+        t = self.format(t)
+        t = page.markLinksIn(t)
+        t = self.protectEmailAddresses(page,t)
+        t = re.sub(r'<pre></pre>',restorePre,t,reConsts)
+        return '<div class="latexwiki">\n' + t + '\n</div>\n'
+
+    def discussionSeparator(self, page):
+        return '\n\n<a name="comments"></a>\n\n'
+
+    def makeCommentHeading(self, page,
+                           subject, username, time, 
+                           message_id=None,in_reply_to=None):
+        heading = '\n<div class="commentsheading">'
+        if message_id:
+            # use the message id for linking, but strip the <>
+            # and leave it unquoted, browsers can handle it
+            heading += '<a name="msg%s"></a>' % \
+                       re.sub(r'^<(.*)>$',r'\1',message_id)
+        if page.inCMF():
+            heading += \
+              '<img src="discussionitem_icon.gif" style="border:none; margin:0" />'
+        heading += '<b>%s</b> --' % (subject or '...') #more robust
+        if username: heading = heading + '%s, ' % (username)
+        if message_id:
+            heading += ' <a href="%s#msg%s">%s</a>' % \
+                       (page.page_url(),
+                        re.sub(r'^<(.*)>$',r'\1',message_id),
+                        html_quote(time))
+            inreplytobit = '&in_reply_to='+quote(message_id)
+        else:
+            heading += html_quote(time)
+            inreplytobit = ''
+        heading += ' <a href="%s?subject=%s%s#bottom">reply</a>'\
+                   % (page.page_url(),quote(subject or ''),inreplytobit)
+        heading += '</div>'
+        return heading
+
+registerPageType(PageTypeStxMath)
+
+
+# This class supports pamphlet (noweb) format for MathAction
+# Oct 6, 2005 Bill Page
+
+# XXX this doesn't/can't use STX and so should just use PageTypeBase
+# but it doesn't work so well and needs investigation (no skin, shows
+# midsection marker)
+#class PageTypePamphlet(PageTypeBase):
+class PageTypePamphlet(PageTypeStx):
+    """
+    docstring
+    """
+    _id = 'pamphlet'
+    _name = 'Noweb pamphlet'
+    supportsLaTeX = yes
+    supportsPlone = yes
+
+    def preRender(self, page, text=None):
+        t = text or (page.document() + '\n' + MIDSECTIONMARKER + self.preRenderMessages(page))
+        (b,t) = replacePamphlet(page,t)
+	# Render remaining out-of-band text as stx+latex (axiom version)
+        latexTemplate = None
+        latexTemplatePage = getattr(page.folder(),
+                                    'LatexTemplate', None)
+        if latexTemplatePage:
+            latexTemplate = latexTemplatePage.text()
+        t = replaceInlineLatex(t, getattr(page.folder(),'latex_font_size',defaultcharsizepx), \
+                                  getattr(page.folder(),'latex_align_fudge',0), 
+                                  getattr(page.folder(),'latex_res_fudge',1.03), latexTemplate)
+        t = page.applyWikiLinkLineEscapesIn(t)
+        # Be more generous in STX for links...so they can contain equations
+        t = re.sub(r'(^| )(?ms)"([^"]*)":(http://[-:A-Za-z0-9_,./\?=@#~&%()]*?)([.!?,;](?= )|(?= )|$)',\
+            r'\1<a href="\3">\2</a>\4',t)
+        t = self.format(t)
+        t = page.markLinksIn(t)
+        t = self.protectEmailAddresses(page,t)
+        return '<div class="latexwiki">\n' + b + t + '\n</div>\n'
+
+    def discussionSeparator(self, page):
+        return '\n\n<a name="comments"></a>\n\n'
+
+    def makeCommentHeading(self, page,
+                           subject, username, time, 
+                           message_id=None,in_reply_to=None):
+        heading = '\n<div class="commentsheading">'
+        if message_id:
+            # use the message id for linking, but strip the <>
+            # and leave it unquoted, browsers can handle it
+            heading += '<a name="msg%s"></a>' % \
+                       re.sub(r'^<(.*)>$',r'\1',message_id)
+        if page.inCMF():
+            heading += \
+              '<img src="discussionitem_icon.gif" style="border:none; margin:0" />'
+        heading += '<b>%s</b> --' % (subject or '...') #more robust
+        if username: heading = heading + '%s, ' % (username)
+        if message_id:
+            heading += ' <a href="%s#msg%s">%s</a>' % \
+                       (page.page_url(),
+                        re.sub(r'^<(.*)>$',r'\1',message_id),
+                        html_quote(time))
+            inreplytobit = '&in_reply_to='+quote(message_id)
+        else:
+            heading += html_quote(time)
+            inreplytobit = ''
+        heading += ' <a href="%s?subject=%s%s#bottom">reply</a>'\
+                   % (page.page_url(),quote(subject or ''),inreplytobit)
+        heading += '</div>'
+        return heading
+
+
+registerPageType(PageTypePamphlet)
+
+
+
+
+#import zLOG
+#import re,os,popen2
+#from Products.ZWiki.pagetypes.html import ZwikiHtmlPageType #PageTypeHtml
+
+#itexpath = '/usr/local/bin/itex2MML'
+
+#def initialize(context):
+#    """ Initialize LatexWiki """
+#
+#    # This is so that FileSystemSite can see our images directory.
+#    # warning! mkdir here creates an un-writable directory!
+#    #try:
+#    #    from Products.FileSystemSite.DirectoryView import registerDirectory
+#    #    if(not os.access(workingDir, os.F_OK)): 
+#    #        os.mkdir(workingDir)
+#    #        zLOG.LOG('LatexWiki',zLOG.DEBUG, 'LatexWiki image directory %s created'%(workingDir)) 
+#    #    mypaths = os.path.split(workingDir)
+#    #    registerDirectory(mypaths[1], mypaths[0])
+#    #except ImportError:
+#    #    pass
+
+#def runItex(t):
+#    i, o = popen2.popen2(itexpath)
+#    o.write(t)
+#    o.close()
+#    t = i.read()
+#    return t
+
+### This class supports STX + HTML + LaTeX
+#class ZwikiLatexPageType(PageTypeStx):
+#    """
+#    ZwikiLatexPageType docstring
+#    """
+#    #_id = 'msgstxprelinkdtmlfitissuehtmllatex'
+#    _id = 'stxlatex'
+#    _name = 'Structured Text + LaTeX'
+#    supportsLaTeX = yes
+#    supportsPlone = yes
+#
+#    def preRender(self, page, text=None):
+#        latexTemplate = None
+#        latexTemplatePage = getattr(page.folder(),
+#                                    'LatexTemplate', None)
+#        if latexTemplatePage:
+#            latexTemplate = latexTemplatePage.text()
+#        t = text or (page.document() + '\n' + MIDSECTIONMARKER + self.preRenderMessages(page))
+#        t = page.applyWikiLinkLineEscapesIn(t)
+#        # Be more generous in STX for links...so they can contain equations
+#        t = re.sub(r'(^| )(?ms)"([^"]*)":(http://[-:A-Za-z0-9_,./\?=@#~&%()]*?)([.!?,;](?= )|(?= )|$)',\
+#            r'\1<a href="\3">\2</a>\4',t)
+#        # FIXME and the same for WikiLink's (harder)
+#        t = replaceInlineLatex(t, getattr(page.folder(),'latex_font_size',defaultcharsizepx), \
+#                                  getattr(page.folder(),'latex_align_fudge',0), 
+#                                  getattr(page.folder(),'latex_res_fudge',1.03), latexTemplate)
+#        t = self.renderStxIn(page, t)
+#        if page.usingPurpleNumbers(): t = page.renderPurpleNumbersIn(t)
+#        t = page.markLinksIn(t)
+#        t = self.protectEmailAddresses(page,t)
+#        return '<div class="latexwiki">\n' + t + '\n</div>\n'
+#
+#    def discussionSeparator(self, page):
+#        return '\n\n<a name="comments"></a>\n\n'
+#
+#    def makeCommentHeading(self, page,
+#                           subject, username, time, 
+#                           message_id=None,in_reply_to=None):
+#        heading = '\n<div class="commentsheading">'
+#        if message_id:
+#            # use the message id for linking, but strip the <>
+#            # and leave it unquoted, browsers can handle it
+#            heading += '<a name="msg%s"></a>' % \
+#                       re.sub(r'^<(.*)>$',r'\1',message_id)
+#        if page.inCMF():
+#            heading += \
+#              '<img src="discussionitem_icon.gif" style="border:none; margin:0" />'
+#        heading += '<b>%s</b> --' % (subject or '...') #more robust
+#        if username: heading = heading + '%s, ' % (username)
+#        if message_id:
+#            heading += ' <a href="%s#msg%s">%s</a>' % \
+#                       (page.page_url(),
+#                        re.sub(r'^<(.*)>$',r'\1',message_id),
+#                        html_quote(time))
+#            inreplytobit = '&in_reply_to='+quote(message_id)
+#        else:
+#            heading += html_quote(time)
+#            inreplytobit = ''
+#        heading += ' <a href="%s?subject=%s%s#bottom">reply</a>'\
+#                   % (page.page_url(),quote(subject or ''),inreplytobit)
+#        heading += '</div>'
+#        return heading
+
+#class ZwikiHtmlLatexPageType(ZwikiHtmlPageType):
+#    """
+#    ZwikiHtmlLatexPageType docstring
+#    """
+#    _id = 'htmllatex'
+#    _name = 'HTML + LaTeX'
+#    supportsLaTeX = yes
+#    supportsHtml = yes
+#    supportsDtml = yes
+#    supportsPlone = yes
+#
+#    def preRender(self, page, text=None):
+#        latexTemplate = None
+#        latexTemplatePage = getattr(page.folder(),
+#                                    'LatexTemplate', None)
+#        if latexTemplatePage:
+#            latexTemplate = latexTemplatePage.text()
+#        t = text or (page.document() + '\n' + MIDSECTIONMARKER + self.preRenderMessages(page))
+#        t = page.applyWikiLinkLineEscapesIn(t)
+#        # Be more generous in STX for links...so they can contain equations
+#        t = re.sub(r'(^| )(?ms)"([^"]*)":(http://[-:A-Za-z0-9_,./\?=@#~&%()]*?)([.!?,;](?= )|(?= )|$)',\
+#            r'\1<a href="\3">\2</a>\4',t)
+#        t = replaceInlineLatex(t, getattr(page.folder(),'latex_font_size',defaultcharsizepx), \
+#                                  getattr(page.folder(),'latex_align_fudge',0), 
+#                                  getattr(page.folder(),'latex_res_fudge',1.03), latexTemplate)
+#        if page.usingPurpleNumbers(): t = page.renderPurpleNumbersIn(t)
+#        t = page.markLinksIn(t)
+#        t = self.protectEmailAddresses(page,t)
+#        return '<div class="latexwiki">\n' + t + '\n</div>\n'
+#
+#    def discussionSeparator(self, page):
+#        return '\n\n<a name="comments"></a>\n\n'
+#
+#    def makeCommentHeading(self, page,
+#                           subject, username, time, 
+#                           message_id=None,in_reply_to=None):
+#        heading = '\n<div class="commentsheading">'
+#        if message_id:
+#            # use the message id for linking, but strip the <>
+#            # and leave it unquoted, browsers can handle it
+#            heading += '<a name="msg%s"></a>' % \
+#                       re.sub(r'^<(.*)>$',r'\1',message_id)
+#        if page.inCMF():
+#            heading += \
+#              '<img src="discussionitem_icon.gif" style="border:none; margin:0" />'
+#        heading += '<b>%s</b> --' % (subject or '...') #more robust
+#        if username: heading = heading + '%s, ' % (username)
+#        if message_id:
+#            heading += ' <a href="%s#msg%s">%s</a>' % \
+#                       (page.page_url(),
+#                        re.sub(r'^<(.*)>$',r'\1',message_id),
+#                        html_quote(time))
+#            inreplytobit = '&in_reply_to='+quote(message_id)
+#        else:
+#            heading += html_quote(time)
+#            inreplytobit = ''
+#        heading += ' <a href="%s?subject=%s%s#bottom">reply</a>'\
+#                   % (page.page_url(),quote(subject or ''),inreplytobit)
+#        heading += '</div>'
+#        return heading
+
+#class ZwikiItexPageType(ZwikiHtmlPageType):
+#    """
+#    ZwikiItexPageType docstring
+#    """
+#    _id = 'itex'
+#    _name = 'iTeX'
+#    supportsLaTeX = yes
+#    supportsHtml = yes
+#    supportsDtml = yes
+#    supportsPlone = no # FIXME: For now...must update Plone's page templates for MathML to work.
+#
+#    def render(self, page, REQUEST={}, RESPONSE=None, **kw):
+#        if RESPONSE:
+#            RESPONSE['content-type'] = 'application/xhtml+xml'
+#        if page.dtmlAllowed() and page.hasDynamicContent():
+#            t = page.evaluatePreRenderedAsDtml(page,REQUEST,RESPONSE,**kw)
+#        else:
+#            t = page.preRendered()
+#        t = page.renderMarkedLinksIn(t)
+#        t = page.renderMidsectionIn(t)
+#        t = page.addSkinTo(t,**kw)
+#        return t
+#
+#    def preRender(self, page, text=None):
+#        latexTemplate = None
+#        latexTemplatePage = getattr(page.folder(),
+#                                    'LatexTemplate', None)
+#        if latexTemplatePage:
+#            latexTemplate = latexTemplatePage.text()
+#        t = text or (page.document() + '\n' + MIDSECTIONMARKER + self.preRenderMessages(page))
+#        t = page.applyWikiLinkLineEscapesIn(t)
+#        # Be more generous in STX for links...so they can contain equations
+#        t = re.sub(r'(^| )(?ms)"([^"]*)":(http://[-:A-Za-z0-9_,./\?=@#~&%()]*?)([.!?,;](?= )|(?= )|$)',\
+#            r'\1<a href="\3">\2</a>\4',t)
+#        # Run itex to replace any latex with MathML
+#        t = runItex(t)
+#        # Run replaceInlineLatex to replace anything that itex didn't catch.
+#        t = replaceInlineLatex(t, getattr(page.folder(),'latex_font_size',defaultcharsizepx), \
+#                                  getattr(page.folder(),'latex_align_fudge',0), 
+#                                  getattr(page.folder(),'latex_res_fudge',1.03), latexTemplate)
+#        if page.usingPurpleNumbers(): t = page.renderPurpleNumbersIn(t)
+#        t = page.markLinksIn(t)
+#        t = self.protectEmailAddresses(page,t)
+#        return '<div class="latexwiki">\n' + t + '\n</div>\n'
+#
+#    def discussionSeparator(self, page):
+#        return '\n\n<a name="comments"></a>\n\n'
+#
+#    def makeCommentHeading(self, page,
+#                           subject, username, time, 
+#                           message_id=None,in_reply_to=None):
+#        heading = '\n<div class="commentsheading">'
+#        if message_id:
+#            # use the message id for linking, but strip the <>
+#            # and leave it unquoted, browsers can handle it
+#            heading += '<a name="msg%s"></a>' % \
+#                       html_quote(re.sub(r'^<(.*)>$',r'\1',message_id))
+#        if page.inCMF():
+#            heading += \
+#              '<img src="discussionitem_icon.gif" style="border:none; margin:0" />'
+#        heading += '<b>%s</b> --' % (subject or '...') #more robust
+#        if username: heading = heading + '%s, ' % (username)
+#        if message_id:
+#            heading += ' <a href="'+html_quote('%s#msg%s' % \
+#                       (page.page_url(), \
+#                        re.sub(r'^<(.*)>$',r'\1',message_id))) \
+#                        +'">%s</a>' %(html_quote(time))
+#            inreplytobit = quote('&in_reply_to='+message_id)
+#        else:
+#            heading += html_quote(time)
+#            inreplytobit = ''
+#        heading += ' <a href=\''+'%s?subject=%s%s#bottom'\
+#                   % (page.page_url(),quote(subject or ''),inreplytobit)
+#        heading += '\'>reply</a>'
+#        heading += '</div>'
+#        return heading
+
+## We require ZWiki 0.25 or higher now
+#zwiki_min_version = 0.32
+#if ZWiki.__version__ >= zwiki_min_version:
+#    registerPageTypeUpgrade('msgstxprelinkdtmlfitissuehtmllatex', 'stxlatex')
+#    registerPageTypeUpgrade('structuredtextlatex', 'stxlatex')
+#    itexmatch = re.match(r'(/(\w+/)+itex2MML)', os.popen('which itex2MML').read())
+#    if itexmatch != None: # Found itex
+#        itexpath = itexmatch.group(1)
+#        registerPageType(ZwikiItexPageType,prepend=1)
+#    registerPageType(ZwikiHtmlLatexPageType,prepend=1)
+#    registerPageType(ZwikiLatexPageType,prepend=1)
+#    registerPageType(ZwikiMathPageType,prepend=1)
+#    registerPageType(ZwikiPamphletPageType,prepend=1)
+#else:
+#    zLOG.LOG('LatexWiki',zLOG.ERROR,'Did not find ZWiki version greater than or equal to %s?'\
+#        %(zwiki_min_version))
+#    zLOG.log('LatexWiki',zLOG.ERROR,'LatexWiki will not work with your ZWiki.')
+#    zLOG.log('LatexWiki',zLOG.ERROR,'Upgrade ZWiki or downgrade LatexWiki.')
+

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/pamphletWrapper.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/pamphletWrapper.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/pamphletWrapper.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,174 @@
+"""
+Render a pamphlet file as .pamphlet, .dvi and .pdf files
+
+$Id: pamphletWrapper.py,v 0.1 2005/10/07 Bill Page $
+
+TODO:
+	1) Preprocess \begin{axiom} ... \end{axiom} pseudo enviroments
+	   also {spad} {aldor} and {reduce} as in 'axiomWrapper.py'
+	2) Problem with dvipdf so changed to dvipdfm. Hyperref ok?
+"""
+import os, sys, re, popen2, glob, zLOG, select, fcntl, string
+from cgi import escape
+
+class LatexSyntaxError(Exception): pass
+class NowebError(Exception): pass
+class DviPdfError(Exception): pass
+class DviPngError(Exception): pass
+
+def log(message,summary='',severity=0):
+        zLOG.LOG('LatexWikiDebugLog',severity,summary,message)
+
+def renderPDF(fDir,fName,pdfMethod):
+    """ render body source as PDF.
+    """
+    os.system("cd '%s'; rm -f '%s.pdf' '%s.ps' '%s.dvi' '%s.tex'"%(fDir,fName,fName,fName,fName))
+    errors = ""
+    try:
+       runNoweb(fDir,fName)
+    except NowebError, data:
+       errors = str(data)
+       log(errors, 'NowebError')
+       return escape(errors)
+
+    try:
+       runLatex(fDir,fName)
+    except LatexSyntaxError, data:
+       errors = str(data)
+       log(errors, 'LatexSyntaxError')
+       return escape(errors)
+
+# twice for good luck (toc and labels)
+    try:
+       runLatex(fDir,fName)
+    except LatexSyntaxError, data:
+       errors = str(data)
+       log(errors, 'LatexSyntaxError')
+       return escape(errors)
+
+    try:
+       runDviPs(fDir,fName)
+    except DviPdfError, data:
+       errors = str(data)
+       log(errors, 'DviPdfError')
+       return escape(errors)
+    if (pdfMethod == 'dvipdfm'):
+       try:
+          runDviPdfm(fDir,fName)
+       except DviPdfError, data:
+          errors = str(data)
+          log(errors, 'DviPdfError')
+          return escape(errors)
+    else:
+       try:
+          runPs2Pdf(fDir,fName)
+       except DviPdfError, data:
+          errors = str(data)
+          log(errors, 'DviPdfError')
+          return escape(errors)
+
+    try:
+       runDviPng(fDir,fName)
+    except DviPngError, data:
+       errors = str(data)
+       log(errors, 'DviPngError')
+       return escape(errors)
+
+    os.system("cd '%s'; rm -f '%s.aux' '%s.toc' '%s.out'"%(fDir,fName,fName,fName))
+    return escape(errors)
+
+# Make our file descriptors nonblocking so that reading doesn't hang.
+def makeNonBlocking(f):
+    fl = fcntl.fcntl(f.fileno(), fcntl.F_GETFL)
+    fcntl.fcntl(f.fileno(), fcntl.F_SETFL, fl | os.O_NONBLOCK)
+    
+def runCommand(cmdLine):
+    program = popen2.Popen3(cmdLine, 1)
+    program.tochild.close()
+    makeNonBlocking(program.fromchild)
+    makeNonBlocking(program.childerr)
+    stderr = []
+    stdout = []
+    erreof = False
+    outeof = False
+    while(not (erreof and outeof)):
+        readme, writme, xme = select.select([program.fromchild, program.childerr], [], [])
+        for output in readme:
+            if(output == program.fromchild):
+                text = program.fromchild.read()
+                if(text == ''): outeof = True
+                else: stdout.append(text)
+            elif(output == program.childerr):
+                text = program.childerr.read()
+                if(text == ''): erreof = True
+                else: stderr.append(text)
+    status = program.wait()
+    error = os.WEXITSTATUS(status) or not os.WIFEXITED(status)
+    return error, string.join(stdout, ''), string.join(stderr, '')
+
+def runNoweb(fDir,fName):
+    cmdLine = "cd '%s'; /usr/bin/noweave -delay '%s.pamphlet' > '%s.tex'"%(fDir,fName,fName)
+    err, stdout, stderr = runCommand(cmdLine)
+    if err:
+        log('%s\n%s\n%s\n%s\n'%(cmdLine, err, stdout, stderr), 'NowebError')
+        raise NowebError("noweb: %s\n"%cmdLine+stderr+'\n'+stdout)
+    return stderr
+
+def runLatex(fDir,fName):
+    cmdLine = "cd '%s'; rm -f *.dot; /usr/bin/latex --interaction nonstopmode '%s.tex'" %(fDir,fName)
+
+    err, stdout, stderr = runCommand(cmdLine)
+# Process Graphviz .dot files
+    again = 0
+    for f in os.listdir(fDir):
+      if re.search(r'\.dot$',f):
+        dotfileName = os.path.join(fDir,f)
+        err, stdout, stderr = runCommand(
+          "dot -Tps -o '%s' '%s'"%(re.sub(r'dot$','ps',dotfileName),
+          dotfileName))
+        if err:
+            out = stderr + '\n' + stdout
+            raise LatexSyntaxError("dot: %s\n"%cmdLine+out)
+        again = 1
+  # repeat LaTeX command if necessary
+    if again == 1:
+      err, stdout, stderr = runCommand(cmdLine)
+    if err:
+        out = stderr + '\n' + stdout
+        err = re.search('!.*\?', out, re.MULTILINE+re.DOTALL)
+        if err:
+            out = err.group(0)
+            raise LatexSyntaxError("latex: %s\n"%cmdLine+out)
+    return stderr
+
+def runDviPdfm(fDir,fName):
+    cmdLine = "cd '%s'; dvipdfm '%s.dvi'"%(fDir,fName)
+    err, stdout, stderr = runCommand(cmdLine)
+    if err:
+        log('%s\n%s\n%s\n%s\n'%(cmdLine, err, stdout, stderr), 'DviPdfError')
+        raise DviPdfError("dvipdfm: %s\n"%cmdLine+stderr+'\n'+stdout)
+    return stderr
+ 
+def runDviPs(fDir,fName):
+    cmdLine = "cd '%s'; /usr/bin/dvips -z -o '%s.ps' '%s.dvi'"%(fDir,fName,fName)
+    err, stdout, stderr = runCommand(cmdLine)
+    if err:
+        log('%s\n%s\n%s\n%s\n'%(cmdLine, err, stdout, stderr), 'DviPdfError')
+        raise DviPdfError("dvips: %s\n"%cmdLine+stderr+'\n'+stdout)
+    return stderr
+
+def runPs2Pdf(fDir,fName):
+    cmdLine = "cd '%s'; ps2pdf14 '%s.ps'"%(fDir,fName)
+    err, stdout, stderr = runCommand(cmdLine)
+    if err:
+        log('%s\n%s\n%s\n%s\n'%(cmdLine, err, stdout, stderr), 'DviPdfError')
+        raise DviPdfError("ps2pdf: %s\n"%cmdLine+stderr+'\n'+stdout)
+    return stderr
+
+def runDviPng(fDir,fName):
+    cmdLine = "cd '%s'; dvipng -T tight -bg transparent -l 1 '%s.dvi'"%(fDir,fName)
+    err, stdout, stderr = runCommand(cmdLine)
+    if err:
+        log('%s\n%s\n%s\n%s\n'%(cmdLine, err, stdout, stderr), 'DviPngError')
+        raise DviPngError("dvipng: %s\n"%cmdLine+stderr+'\n'+stdout)
+    return stderr

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/reduceWrapper.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/reduceWrapper.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/reduceWrapper.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,99 @@
+###
+###  Runs REDUCE and returns a latex code block for each REDUCE block
+###
+
+import os, sys, re, popen2, glob
+import zLOG
+from util import fileNameFor, workingDir
+from cgi import escape
+
+# For testing without Zope
+#workingDir = './'
+#def fileNameFor(code,num,ext):
+#    return 'reduce'+ext
+
+class ReduceSyntaxError(Exception): pass
+
+#reduceTemplate = r"""off INT;
+#load_package rlfi;
+#on latex;
+#%s
+#bye;
+#"""
+reduceTemplate = r"""off INT;
+load_package tri;
+on texbreak;
+%s
+bye;
+"""
+
+outputPattern = r'1: (.*?)(?:\004\n\*{5} End-of-file[^\n]\s*|\s*\n(?=1: )|\s+$)'
+reConsts = re.DOTALL
+#reConsts = re.MULTILINE+re.DOTALL
+
+def log(message,summary='',severity=0):
+        zLOG.LOG('LatexWikiDebugLog',severity,summary,message)
+
+def renderReduce(reduceCodeList):
+    def securityCheck(code):
+#     newCode = re.compile(r'^[ \t]*\)sys([^\n]*)',reConsts).sub(r'-- not allowed: )sys\1\n)sys',code)
+      newCode = code
+      return newCode
+    
+    n = 0
+    unifiedCode = ''
+    for reduceCode in reduceCodeList:
+        newReduceCode = securityCheck(reduceCode)
+        n = n + 1
+        if re.match(r'^\s*\)abbrev',newReduceCode):
+            # Starts like a package so compile as library code
+            reduceFileName = os.path.join(workingDir,fileNameFor(newReduceCode, 25, '.%3.3d.red'%n))
+            unifiedCode = unifiedCode + 'compile "%s";\n'%reduceFileName
+        else:
+            # otherwise it is just an input file
+            reduceFileName = os.path.join(workingDir,fileNameFor(newReduceCode, 25, '.%3.3d.rin'%n))
+            unifiedCode = unifiedCode + 'in "%s";\n'%reduceFileName
+        reduceFile = open(reduceFileName, 'w')
+        reduceFile.write(newReduceCode)
+        reduceFile.close()
+    if unifiedCode:
+        try:
+            latexCode=runReduce(unifiedCode,reduceTemplate)
+            latexCodeList = re.compile(outputPattern, reConsts).findall(latexCode)
+            return (latexCodeList,'')
+        except ReduceSyntaxError, data:
+            errors = str(data)
+            log(errors, 'ReduceSyntaxError')
+            return ([],escape(errors))
+    return ([],'')
+
+def runCommand(cmdLine):
+    program = popen2.Popen3('cd %s; '%(workingDir) + cmdLine, 1, 4096)
+    program.tochild.close()
+    stderr = ''
+    stdout = ''
+    while(not os.WIFEXITED(program.poll())):
+#       Just in case REDUCE doesn't properly close stderr
+#       stderr = stderr + program.childerr.read()
+        stdout = stdout + program.fromchild.read()
+    program.fromchild.close()
+    program.childerr.close()
+    status = program.poll()
+    error = os.WEXITSTATUS(status) or not os.WIFEXITED(status)
+    return error, stdout, stderr
+
+def runReduce(reduceCode, reduceTemplate):
+    reduceFileName = os.path.join(workingDir,fileNameFor(reduceCode, 25, '.run'))
+    cmdLine = 'export PATH=/usr/local/bin:$PATH;reduce < %s' %(reduceFileName)
+    file = open(reduceFileName, 'w')
+    file.write(reduceTemplate%reduceCode)
+    file.close()
+    err, stdout, stderr = runCommand(cmdLine)
+ 
+    if err:
+        out = 'Error: ' + cmdLine + '\n' + stderr + '\n' + stdout
+        raise ReduceSyntaxError(out)
+    else:
+        # Clean up the startup prompts
+        newcode = re.compile(r'^(?:.*?1: ){3}', reConsts).sub('',stdout)
+        return newcode

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker.c
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker.c	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker.c	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,2007 @@
+/* Released under the Modified BSD license attached to Axiom sources.
+ * TeX Display Math Mode Line Breaking Program
+ *
+ * Author: Robert S. Sutor
+ *
+ * Date:   1991
+ *
+ * Change History:
+ *
+ * 01/19/92   RSS   Change to use \[ \] instead of $$ $$
+ *
+ * 09/01/92   RSS   Format and fix =-.
+ *
+ * Operation:
+ *
+ * This program reads standard input and writes to standard output. Display math
+ * mode starts with \[ at the beginning of a line and ends with \]. All lines
+ * not in display math mode are simply printed on standard output.  The
+ * expressions in display math mode are broken so that they fit on a page
+ * better (line breaking).
+ *
+ * The array stuff is being converted to use the array node type.
+ *
+ * Restrictions:
+ *
+ * 1.  Assume \[ and \] start in column 1 and are the only things on the lines.
+ *
+ * 2.  Comments in display math mode are not preserved.
+ *
+ * 3. This is meant to deal with output from the AXIOM computer algebra system.
+ * Unpredictable results may occur if used with hand-generated TeX code or
+ * TeX code generated by other programs.
+ */
+
+/*
+ * Include files and #defines.
+ */
+#include "useproto.h"
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define MATHBUFLEN     8*8192
+#define MAXMATHTOKEN   80
+#define MAXCHARSINLINE 60
+#define FATDELIMMULT   2
+
+#ifndef max
+#define max(a,b) (((a) > (b)) ? (a) : (b))
+#endif
+#ifndef min
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
+#define TRUE 1
+#define FALSE 0
+
+#define STRCHREQ(str,char) (str[0] == char)
+
+/*
+ * Type declarations.
+ */
+
+enum nodeTypes {
+    N_NODE,
+    N_TEXT,
+    N_ARRAY
+};
+
+typedef struct listNodeStruct {
+    struct listNodeStruct *nextListNode;
+    struct listNodeStruct *prevListNode;
+    enum nodeTypes nodeType;
+    long width;
+    long realWidth;
+    union {
+        char *text;
+        struct listNodeStruct *node;
+        struct arrayNodeStruct *array;
+    }   data;
+}   listNode;
+
+typedef struct arrayNodeStruct {
+    int cols;
+    listNode *argsNode;
+    listNode *entries;          /* linked list of nodes, each pointing to a
+                                 * row */
+}   arrayNode;
+
+
+/*
+ * Global Variables.
+ */
+
+char line[1024];
+char blanks[] = "                                                   ";
+char lastPrinted = '\0';
+int indent = 0;
+char mathBuffer[MATHBUFLEN], mathToken[MAXMATHTOKEN];
+char bufout[2*MATHBUFLEN];
+int lineLen, mathBufferLen, mathBufferPtr, mathTokenLen;
+listNode *mathList;
+int charsOut, fatDelimiter;
+int maxLineWidth = 4500;        /* 4.5  inches * 1000    */
+int maxLineSlop = 0;            /* 0.0  inches * 1000    */
+int charTable[256];
+int avgCharWidth;
+int spaceWidths[5], extraOverWidth;
+int arrayDepth = 0, arrayMaxDepth = 3;
+int charMultNum, charMultDenom;
+int sinWidth, cosWidth, tanWidth, erfWidth;
+long outLineNum = 0L;
+
+/*
+ * Function Prototypes.
+ */
+#ifndef _NO_PROTO
+void        arrayTooDeep();
+int         breakFracProd(listNode *, long, char *, char *, int);
+int         breakFunction(listNode *, long);
+int         breakList(listNode *, long);
+int         breakMathList(listNode *, long);
+int         breakNumber(listNode *, long);
+int         breakPMEB(listNode *, long);
+int         breakParen(listNode *, long);
+int         bufferMathLines();
+void        buildMathList();
+int         charWidth(char);
+void        computeNodeWidth(listNode *);
+long        computeWidth(listNode *);
+void        displaySplitMsg(char *, int);
+void        error(char *, char *);
+void        freeMathList(listNode *);
+void        getOptions(int, char **);
+void        initCharTable();
+listNode   *insertStringAfter(char *, listNode *);
+listNode   *insertStringAtBack(char *, listNode *);
+listNode   *insertStringAtFront(char *, listNode *);
+int         newLineIfNecessary(int);
+listNode   *newListNode(enum nodeTypes);
+int         nextMathToken();
+int         printChar(char);
+int         printMathList(listNode *, int);
+int         printString(char *);
+void        putcBuf(char, char []);
+void        putsBuf(char [], char []);
+void        resetCharMults();
+listNode   *string2NodeList(char *, listNode *);
+void        ttCharMults();
+#else
+void        arrayTooDeep();
+int         breakFracProd();
+int         breakFunction();
+int         breakList();
+int         breakMathList();
+int         breakNumber();
+int         breakPMEB();
+int         breakParen();
+int         bufferMathLines();
+void        buildMathList();
+int         charWidth();
+void        computeNodeWidth();
+long        computeWidth();
+void        displaySplitMsg();
+void        error();
+void        freeMathList();
+void        getOptions();
+void        initCharTable();
+listNode   *insertStringAfter();
+listNode   *insertStringAtBack();
+listNode   *insertStringAtFront();
+int         newLineIfNecessary();
+listNode   *newListNode();
+int         nextMathToken();
+int         printChar();
+int         printMathList();
+int         printString();
+void        putsBuf();
+void        putcBuf();
+void        resetCharMults();
+listNode   *string2NodeList();
+void        ttCharMults();
+#endif
+
+
+/*
+ * Function Definitions.
+ */
+
+int
+#ifndef _NO_PROTO
+texbreak(char bufinp[])
+#else
+texbreak(bufinp)
+char bufinp[];
+#endif
+{
+    initCharTable();
+    strcpy(bufout,"");
+    mathBufferLen=strlen(bufinp);
+    if (mathBufferLen > MATHBUFLEN) {
+       fprintf(stderr, "mathBuffer too small. Need: %d\n", mathBufferLen);
+       return 0;
+    };
+    mathBufferPtr = 0;
+    strcpy(mathBuffer,bufinp);
+/*  fprintf(stderr, "bufinp: %s\n", mathBuffer); */
+    fatDelimiter = 1;
+    arrayDepth = 0;
+    mathList = newListNode(N_NODE);
+    buildMathList(mathList);
+    resetCharMults();
+    computeWidth(mathList);
+/*  if (mathList->width > maxLineWidth)
+       fprintf(stderr, "Width = %ld units, Output line = %ld.\n", mathList->width, outLineNum); */
+    breakMathList(mathList, maxLineWidth);
+    charsOut = 0;
+    printMathList(mathList->data.node, TRUE);
+    freeMathList(mathList);
+    return 1;
+}
+
+/*
+ * breakFracProd:
+ *
+ * Arguments:
+ *
+ * n : the starting node at which we are to try to break
+ *
+ * lineWidth : the maximum width of a line
+ *
+ * match :  either "\\over" or "\\ "
+ *
+ * label :  either "quotient" or "product"
+ *
+ * paren :  add parentheses (TRUE or FALSE)
+ *
+ *
+ * Returns: TRUE or FALSE, depending on whether the expression was broken
+ *
+ *
+ * Function: Tries to break up a quotient t1 \over t2 or a product t1 \ t2 by
+ * splitting and parenthesizing the numerator and/or the denominator.
+ */
+
+int
+#ifndef _NO_PROTO
+breakFracProd(listNode * n, long lineWidth, char *match, char *label, int paren)
+#else
+breakFracProd(n,lineWidth,match,label,paren)
+listNode * n; 
+long lineWidth; 
+char *match; 
+char *label; 
+int paren;
+#endif
+{
+
+    listNode *rootNode, *lastNode, *t1, *t2;
+    int ok;
+    long workWidth1, workWidth2;
+
+    if (n->nodeType != N_NODE)
+        return FALSE;
+
+    rootNode = n;
+
+    ok = FALSE;
+    t1 = n = rootNode->data.node;
+    n = n->nextListNode;
+    if (n) {
+        if ((n->nodeType == N_TEXT) &&
+            (0 == strcmp(n->data.text, match))) {
+            t2 = n->nextListNode;
+            if (t2 && (NULL == t2->nextListNode))
+                ok = TRUE;
+        }
+    }
+
+    displaySplitMsg(label, ok);
+
+    if (ok) {
+
+        /* for products, determine rough widths for the two factors */
+
+        if (0 == strcmp(label, "product")) {
+            computeNodeWidth(t1);
+            computeNodeWidth(t2);
+            workWidth1 = lineWidth - charWidth(' ');
+
+            if (workWidth1 / 2 > t1->realWidth) {
+                workWidth2 = workWidth1 - t1->realWidth;
+                workWidth1 = t1->realWidth;
+            }
+            else if (workWidth1 / 2 > t2->realWidth) {
+                workWidth1 = workWidth1 - t2->realWidth;
+                workWidth2 = t2->realWidth;
+            }
+            else
+                workWidth1 = workWidth2 = workWidth1 / 2;
+
+            if (paren) {
+                if (t1->realWidth > workWidth1)
+                    workWidth1 = workWidth1 - 4 * FATDELIMMULT * charWidth('(');
+                if (t2->realWidth > workWidth2)
+                    workWidth2 = workWidth2 - 4 * FATDELIMMULT * charWidth('(');
+            }
+        }
+        else                    /* "quotient" */
+            workWidth1 = workWidth2 =
+                lineWidth - paren * 4 * FATDELIMMULT * charWidth('(');
+
+        if ((t1->nodeType == N_NODE) && (t1->realWidth > workWidth1)) {
+            t1->width = t1->realWidth;
+
+            if (breakMathList(t1, workWidth1) && paren) {
+                /* insert the \left( */
+                lastNode = insertStringAtFront("\\left(", t1);
+
+                while (lastNode->nextListNode)
+                    lastNode = lastNode->nextListNode;
+
+                /* insert the \right) */
+                insertStringAtBack("\\right)", lastNode);
+            }
+        }
+
+        if ((t2->nodeType == N_NODE) && (t2->realWidth > workWidth2)) {
+            t2->width = t2->realWidth;
+
+            if (breakMathList(t2, workWidth2) && paren) {
+                /* insert the \left( */
+                lastNode = insertStringAtFront("\\left(", t2);
+
+                while (lastNode->nextListNode)
+                    lastNode = lastNode->nextListNode;
+
+                /* insert the \right) */
+                insertStringAtBack("\\right)", lastNode);
+            }
+        }
+
+        return TRUE;
+    }
+    return FALSE;
+}
+
+
+int
+#ifndef _NO_PROTO
+breakFunction(listNode * n, long lineWidth)
+#else
+breakFunction(n,lineWidth)
+listNode * n; 
+long lineWidth;
+#endif
+{
+    listNode *rootNode, *tmpNode, *lastNode, *t1, *t2, *t3;
+    int ok = FALSE;
+    long workWidth, maxWidth = 0;
+
+    if (n->nodeType != N_NODE)
+        return FALSE;
+
+    n = n->data.node;
+
+    if (n->nodeType == N_NODE)
+        return FALSE;
+
+    if ((0 == strcmp(n->data.text, "\\sin")) ||
+        (0 == strcmp(n->data.text, "\\cos")) ||
+        (0 == strcmp(n->data.text, "\\tan")) ||
+        (0 == strcmp(n->data.text, "\\log")) ||
+        (0 == strcmp(n->data.text, "\\arctan")) ||
+        (0 == strcmp(n->data.text, "\\erf"))) {
+        computeNodeWidth(n);
+        ok = TRUE;
+    }
+
+    displaySplitMsg("function", ok);
+
+    if (ok) {
+        t2 = newListNode(N_NODE);
+        t2->data.node = n->nextListNode;
+        t2->prevListNode = n;
+        n->nextListNode = t2;
+        ok = breakMathList(t2, lineWidth - n->realWidth);
+    }
+
+    return ok;
+}
+
+/*
+ * breakList:
+ *
+ * Arguments:
+ *
+ * n : the starting node at which we are to try to break
+ *
+ * lineWidth : the maximum width of a line
+ *
+ *
+ * Returns: TRUE or FALSE, depending on whether the expression was broken
+ *
+ *
+ * Function: Tries to split an expression that is bracketed by \left[ and
+ * \right] (or \left\{ and \right\} and contains at least one comma.
+ */
+
+int
+#ifndef _NO_PROTO
+breakList(listNode * n, long lineWidth)
+#else
+breakList(n,lineWidth)
+listNode * n; 
+long lineWidth;
+#endif
+{
+    listNode *rootNode, *tmpNode, *lastNode, *t1, *t2, *t3;
+    int ok, comma;
+    long workWidth, maxWidth = 0;
+
+    if (n->nodeType != N_NODE)
+        return FALSE;
+
+    rootNode = n;
+
+    t1 = n = rootNode->data.node;
+    comma = ok = FALSE;
+
+    if ((t1->nodeType == N_TEXT) &&
+        (0 == strcmp(t1->data.text, "\\left")) &&
+        (t1->nextListNode) &&
+        (t1->nextListNode->nodeType == N_TEXT) &&
+        ((0 == strcmp(t1->nextListNode->data.text, "[")) ||
+         (0 == strcmp(t1->nextListNode->data.text, "\\{")))) {
+
+        t1 = t1->nextListNode->nextListNode;
+
+        /*
+         * Check for a special case: sometimes the whole body of the list is
+         * a node. Flatten this, if possible.
+         */
+
+        if ((t1->nodeType == N_NODE) &&
+            (t1->nextListNode->nodeType == N_TEXT) &&
+            (0 == strcmp(t1->nextListNode->data.text, "\\right"))) {
+            tmpNode = t1->prevListNode;
+            t2 = t1->nextListNode;
+            t3 = t1->data.node;
+            tmpNode->nextListNode = t3;
+            t3->prevListNode = tmpNode;
+            while (t3->nextListNode)
+                t3 = t3->nextListNode;
+            t3->nextListNode = t2;
+            t2->prevListNode = t3;
+            free(t1);
+            t1 = tmpNode->nextListNode;
+        }
+
+        while (t1->nextListNode && !ok) {
+            if ((t1->nodeType == N_TEXT) &&
+                (0 == strcmp(t1->data.text, ",")))
+                comma = TRUE;
+            else if ((t1->nodeType == N_TEXT) &&
+                     (0 == strcmp(t1->data.text, "\\right")) &&
+                     (t1->nextListNode->nodeType == N_TEXT) &&
+                     ((0 == strcmp(t1->nextListNode->data.text, "]")) ||
+                      (0 == strcmp(t1->nextListNode->data.text, "\\}"))) &&
+                     (NULL == t1->nextListNode->nextListNode)) {
+                ok = comma;
+                tmpNode = t1->nextListNode;
+            }
+            t1 = t1->nextListNode;
+        }
+    }
+
+    displaySplitMsg("list", ok);
+
+    if (ok) {
+        if (arrayDepth >= arrayMaxDepth) {
+            arrayTooDeep();
+            return FALSE;
+        }
+
+        /*
+         * Create array environment
+         */
+
+        lastNode = insertStringAtFront("\\begin{array}{@{}l}\\displaystyle", rootNode);
+        arrayDepth++;
+        insertStringAtBack("\\end{array}", tmpNode);
+
+        /*
+         * Now break at best place short of width.        Start after the
+         * environment begins and after the \left(
+         */
+
+        n = lastNode->nextListNode->nextListNode->nextListNode;
+
+        /*
+         * try to split the first expression if too big
+         */
+
+        tmpNode = n->nextListNode;
+        if (breakMathList(n, lineWidth)) {
+            workWidth = n->width;
+            n = tmpNode;
+        }
+        else
+            workWidth = n->width;
+        maxWidth = workWidth;
+
+        while (n->nextListNode) {
+            if ((n->nodeType == N_TEXT) &&
+                ((0 == strcmp(n->data.text, ",")) ||
+                 (0 == strcmp(n->data.text, "\\:"))) &&
+                (workWidth + n->nextListNode->width > lineWidth)) {
+                maxWidth = max(maxWidth, workWidth);
+                n = insertStringAfter("\\right. \\\\ \\\\ \\displaystyle \\left.", n);
+
+                /*
+                 * try to split the next expression if too big
+                 */
+
+                tmpNode = n->nextListNode;
+                if (breakMathList(n, lineWidth)) {
+                    workWidth = n->width;
+                    n = tmpNode;
+                }
+                else
+                    workWidth = n->width;
+            }
+            else {
+                workWidth += n->nextListNode->width;
+                n = n->nextListNode;
+            }
+        }
+
+        rootNode->width = rootNode->realWidth =
+            rootNode->data.node->width = rootNode->data.node->realWidth =
+            maxWidth;
+        arrayDepth--;
+
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+/*
+ * breakNumber:
+ *
+ * Arguments:
+ *
+ * rootNode : the starting node at which we are to try to break
+ *
+ * lineWidth : the maximum width of a line
+ *
+ *
+ * Returns: TRUE or FALSE, depending on whether the expression was broken
+ *
+ *
+ * Function: Tries to break an expression that contains only digits and possibly
+ * a decimal point.
+ */
+
+int
+#ifndef _NO_PROTO
+breakNumber(listNode * rootNode, long lineWidth)
+#else
+breakNumber(rootNode,lineWidth)
+listNode * rootNode; 
+long lineWidth;
+#endif
+{
+    int ok = TRUE;
+    listNode *n, *arrNode, *rowNode, *colNode;
+    long workWidth, maxWidth = 0;
+
+    if (rootNode->nodeType != N_NODE)
+        return FALSE;
+
+    n = rootNode->data.node;
+    while (n && ok) {
+        if ((n->nodeType == N_TEXT) &&
+            (n->data.text[1] == '\0') &&
+            (isdigit(n->data.text[0]) || ('.' == n->data.text[0]))) {
+            n = n->nextListNode;
+        }
+        else
+            ok = FALSE;
+    }
+
+    displaySplitMsg("number", ok);
+
+    if (ok) {
+        if (arrayDepth >= arrayMaxDepth) {
+            arrayTooDeep();
+            return FALSE;
+        }
+
+        arrayDepth++;
+        arrNode = newListNode(N_ARRAY);
+        arrNode->data.array->entries = rowNode = newListNode(N_NODE);
+        arrNode->data.array->cols = 1;
+        arrNode->data.array->argsNode = newListNode(N_NODE);
+        string2NodeList("{@{}l}", arrNode->data.array->argsNode);
+
+        n = rootNode->data.node;
+        computeWidth(n);
+        maxWidth = workWidth = n->width;
+        rowNode->data.node = colNode = newListNode(N_NODE);
+        colNode->data.node = n;
+        n = n->nextListNode;
+
+        while (n) {
+            computeWidth(n);
+
+            if (workWidth + n->width > lineWidth) {
+                maxWidth = max(maxWidth, workWidth);
+
+                /*
+                 * time to start a new row
+                 */
+
+                n->prevListNode->nextListNode = NULL;
+                n->prevListNode = NULL;
+                workWidth = n->width;
+                rowNode->nextListNode = newListNode(N_NODE);
+                rowNode = rowNode->nextListNode;
+                rowNode->data.node = colNode = newListNode(N_NODE);
+                colNode->data.node = n;
+            }
+            else
+                workWidth += (n->nextListNode) ? n->nextListNode->width :0 ;
+
+            n = n->nextListNode;
+        }
+
+        rootNode->data.node = arrNode;
+        rootNode->width = rootNode->realWidth =
+            arrNode->width = arrNode->realWidth = maxWidth;
+        arrayDepth--;
+
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+void
+#ifndef _NO_PROTO
+resetWidths(listNode * n)
+#else
+resetWidths(n)
+listNode * n;
+#endif
+{
+    if (n) {
+        n->width = -1;
+        n->realWidth = 0;
+        if (n->nodeType == N_NODE)
+            resetWidths(n->data.node);
+        resetWidths(n->nextListNode);
+    }
+}
+
+/*
+ * breakParen:
+ *
+ * Arguments:
+ *
+ * n : the starting node at which we are to try to break
+ *
+ * lineWidth : the maximum width of a line
+ *
+ *
+ * Returns: TRUE or FALSE, depending on whether the expression was broken
+ *
+ *
+ * Function: Tries to split an expression that is bracketed by left( and \right)
+ * (e.g., a factor).
+ */
+
+int
+#ifndef _NO_PROTO
+breakParen(listNode * n, long lineWidth)
+#else
+breakParen(n,lineWidth)
+listNode * n;
+long lineWidth;
+#endif
+{
+    listNode *tmpNode, *workNode;
+    int ok = FALSE;
+
+    if (n->nodeType != N_NODE)
+        goto say_msg;
+
+    tmpNode = n->data.node;
+
+    /*
+     * check for \left
+     */
+
+    if ((tmpNode == NULL) ||
+        (tmpNode->nodeType == N_NODE) ||
+        (0 != strcmp(tmpNode->data.text, "\\left")))
+        goto say_msg;
+
+    /*
+     * check for '('
+     */
+
+    tmpNode = tmpNode->nextListNode;
+
+    if ((tmpNode == NULL) ||
+        (tmpNode->nodeType == N_NODE) ||
+        ('(' != tmpNode->data.text[0]))
+        goto say_msg;
+
+    /*
+     * now move to the end
+     */
+
+    tmpNode = tmpNode->nextListNode;
+
+    if (tmpNode != NULL) {
+        while (tmpNode->nextListNode)
+            tmpNode = tmpNode->nextListNode;
+        tmpNode = tmpNode->prevListNode;
+    }
+
+    /*
+     * check for \right
+     */
+
+    if ((tmpNode == NULL) ||
+        (tmpNode->nodeType == N_NODE) ||
+        (0 != strcmp(tmpNode->data.text, "\\right")))
+        goto say_msg;
+
+    /*
+     * check for ')'
+     */
+
+    tmpNode = tmpNode->nextListNode;
+
+    if ((tmpNode == NULL) ||
+        (tmpNode->nodeType == N_NODE) ||
+        (')' != tmpNode->data.text[0]))
+        goto say_msg;
+
+    ok = TRUE;
+
+say_msg:
+    displaySplitMsg("parenthesized expression", ok);
+
+    if (ok) {
+
+        /*
+         * nest the whole inside if necessary, i.e., there is more than one
+         * term between the ( and the \right
+         */
+
+        if (tmpNode->prevListNode->prevListNode !=
+            n->data.node->nextListNode->nextListNode) {
+            workNode = newListNode(N_NODE);
+            workNode->data.node = n->data.node->nextListNode->nextListNode;
+            n->data.node->nextListNode->nextListNode = workNode;
+            tmpNode->prevListNode->prevListNode->nextListNode = NULL;
+            tmpNode->prevListNode->prevListNode = workNode;
+            workNode->prevListNode = n->data.node->nextListNode;
+            workNode->nextListNode = tmpNode->prevListNode;
+            resetWidths(workNode);
+            computeWidth(workNode);
+        }
+
+        return breakMathList(n->data.node->nextListNode->nextListNode,
+                             lineWidth - 4 * FATDELIMMULT * charWidth('('));
+    }
+
+    return FALSE;
+}
+
+/*
+ * breakPMEB:
+ *
+ * Arguments:
+ *
+ * n : the starting node at which we are to try to break
+ *
+ * lineWidth : the maximum width of a line
+ *
+ *
+ * Returns: TRUE or FALSE, depending on whether the expression was broken
+ *
+ *
+ * Function: Tries to split an expression that contains only +, -, = or \  as
+ * operators.  The split occurs after the operator.
+ */
+
+int
+#ifndef _NO_PROTO
+breakPMEB(listNode * n, long lineWidth)
+#else
+breakPMEB(n,lineWidth)
+listNode * n; 
+long lineWidth;
+#endif
+{
+    char *s;
+    listNode *rootNode, *tmpNode, *lastNode;
+    int ok, op;
+    long workWidth, maxWidth = 0;
+
+    if (n->nodeType != N_NODE)
+        return FALSE;
+
+    if (n->width <= lineWidth + maxLineSlop)    /* allow a little slop here */
+        return FALSE;
+
+    rootNode = n;
+    tmpNode = n = n->data.node;
+    ok = TRUE;
+    op = FALSE;
+
+    while (n && ok) {
+        if (n->nodeType == N_TEXT) {
+            s = n->data.text;
+            if (STRCHREQ(s, '+') || STRCHREQ(s, '-') || STRCHREQ(s, '=') ||
+                (0 == strcmp(s, "\\ ")))
+                op = TRUE;
+            else if ((0 == strcmp(s, "\\left")) ||
+                     (0 == strcmp(s, "\\right")) ||
+                     (0 == strcmp(s, "\\over")) ||
+                     STRCHREQ(s, ',')) {
+                ok = FALSE;
+                break;
+            }
+        }
+        tmpNode = n;
+        n = n->nextListNode;
+    }
+    ok = ok & op;
+
+    displaySplitMsg("(+,-,=, )-expression", ok);
+
+
+    if (ok) {
+        if (arrayDepth >= arrayMaxDepth) {
+            arrayTooDeep();
+            return FALSE;
+        }
+
+        /*
+         * Create array environment
+         */
+
+        lastNode = insertStringAtFront("\\begin{array}{@{}l}\\displaystyle", rootNode);
+        arrayDepth++;
+        insertStringAtBack("\\end{array}", tmpNode);
+
+        /*
+         * Now break at best place short of width. Start after the
+         * environment begins.
+         */
+
+        n = lastNode->nextListNode;
+
+        /*
+         * try to split the first expression if too big
+         */
+
+        tmpNode = n->nextListNode;
+        if (breakMathList(n, lineWidth)) {
+            workWidth = n->width;
+            n = tmpNode;
+        }
+        else
+            workWidth = n->width;
+        maxWidth = workWidth;
+
+        while (n->nextListNode) {
+    loop_top:
+            if ((n->nodeType == N_TEXT) &&
+              (STRCHREQ(n->data.text, '+') || STRCHREQ(n->data.text, '-') ||
+               STRCHREQ(n->data.text, '=') ||
+               (0 == strcmp(n->data.text, "\\ "))) &&
+                (workWidth > 24) &&     /* avoid - or + on their own line */
+                (workWidth + n->nextListNode->width > lineWidth)) {
+
+                if ((workWidth < lineWidth / 3) &&
+                  (breakMathList(n->nextListNode, lineWidth - workWidth))) {
+                    n->nextListNode->width = -1;
+                    n->nextListNode->realWidth = 0;
+                    computeNodeWidth(n->nextListNode);
+                    goto loop_top;
+                }
+
+                /*
+                 * \  means multiplication. Use a \cdot to make this clearer
+                 */
+
+                if (0 == strcmp(n->data.text, "\\ "))
+                    n = insertStringAfter("\\cdot \\\\ \\\\ \\displaystyle", n);
+                else
+                    n = insertStringAfter("\\\\ \\\\ \\displaystyle", n);
+                maxWidth = max(maxWidth, workWidth);
+
+                /*
+                 * try to split the next expression if too big
+                 */
+
+                tmpNode = n->nextListNode;
+                if (breakMathList(n, lineWidth)) {
+                    workWidth = n->width;
+                    n = tmpNode;
+                }
+                else
+                    workWidth = n->width;
+            }
+            else {
+                workWidth += n->nextListNode->width;
+                n = n->nextListNode;
+            }
+        }
+
+        rootNode->width = rootNode->realWidth =
+            rootNode->data.node->width = rootNode->data.node->realWidth =
+            maxWidth;
+        arrayDepth--;
+
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+/*
+ * breakMathList:
+ *
+ * Arguments:
+ *
+ * n : the starting node at which we are to try to break
+ *
+ * lineWidth : the maximum width of a line
+ *
+ *
+ * Returns: TRUE or FALSE, depending on whether the expression was broken
+ *
+ *
+ * Function: Tries various methods to break the expression up into multiple
+ * lines if the expression is too big.
+ */
+
+int
+#ifndef _NO_PROTO
+breakMathList(listNode * n, long lineWidth)
+#else
+breakMathList(n,lineWidth)
+listNode * n; 
+long lineWidth;
+#endif
+{
+    int split = FALSE;
+
+    /*
+     * Don't do anything if already short enough.
+     */
+
+    if (n->width <= lineWidth)
+        return FALSE;
+
+    /*
+     * Can't split strings, so just return.
+     */
+
+    if (n->nodeType == N_TEXT)
+        return FALSE;
+
+    blanks[indent] = ' ';
+    indent += 2;
+    blanks[indent] = '\0';
+
+    /*
+     * We know we have a node, so see what we can do.
+     */
+
+    /*
+     * Case 1: a product: t1 \  t2
+     */
+
+    if (split = breakFracProd(n, lineWidth, "\\ ", "product", FALSE))
+        goto done;
+
+    /*
+     * Case 2: a sequence of tokens separated by +, - or =
+     */
+
+    if (split = breakPMEB(n, lineWidth))
+        goto done;
+
+    /*
+     * Case 3: a fraction of terms: t1 \over t2
+     */
+
+    if (split = breakFracProd(n, lineWidth, "\\over", "quotient", TRUE))
+        goto done;
+
+    /*
+     * Case 4: a list of terms bracketed by \left[ and \right] with a comma
+     */
+
+    if (split = breakList(n, lineWidth))
+        goto done;
+
+    /*
+     * Case 5: a list of digits, possibly with one "."
+     */
+
+    if (split = breakNumber(n, lineWidth))
+        goto done;
+
+    /*
+     * Case 6: a parenthesized expression (e.g., a factor)
+     */
+
+    if (split = breakParen(n, lineWidth))
+        goto done;
+
+    /*
+     * Case 7: a function application
+     */
+
+    if (split = breakFunction(n, lineWidth))
+        goto done;
+
+done:
+    blanks[indent] = ' ';
+    indent -= 2;
+    blanks[indent] = '\0';
+
+    return split;
+}
+
+void
+#ifndef _NO_PROTO
+buildMathList(listNode * oldNode)
+#else
+buildMathList(oldNode)
+listNode * oldNode;
+#endif
+{
+    listNode *curNode, *tmpNode;
+
+    curNode = NULL;
+    while (nextMathToken()) {
+        if (mathToken[0] == '}')
+            break;
+        if (mathToken[0] == '{') {
+            tmpNode = newListNode(N_NODE);
+            buildMathList(tmpNode);
+        }
+        else {
+            tmpNode = newListNode(N_TEXT);
+            tmpNode->data.text = strdup(mathToken);
+        }
+        if (curNode == NULL) {
+            oldNode->data.node = tmpNode;
+        }
+        else {
+            tmpNode->prevListNode = curNode;
+            curNode->nextListNode = tmpNode;
+        }
+        curNode = tmpNode;
+    }
+
+    /*
+     * leave with one level of nesting, e.g., {{{x}}} --> {x}
+     */
+
+    tmpNode = oldNode->data.node;
+    while ( tmpNode && (tmpNode->nodeType == N_NODE) &&
+           (tmpNode->nextListNode == NULL) ) {
+        oldNode->data.node = tmpNode->data.node;
+        free(tmpNode);
+        tmpNode = oldNode->data.node;
+    }
+}
+
+void
+#ifndef _NO_PROTO
+computeNodeWidth(listNode * n)
+#else
+computeNodeWidth(n)
+listNode * n;
+#endif
+{
+    char *s;
+    int i;
+    listNode *tmp;
+
+    if (n->width != -1)         /* only = -1 if unprocessed */
+        return;
+
+    n->realWidth = 0;
+
+    if (n->nodeType == N_TEXT) {
+        s = n->data.text;
+        if (s[0] == '\\') {
+            if (s[2] == '\0') {
+                switch (s[1]) {
+                  case ' ':
+                    n->width = spaceWidths[0];
+                    break;
+                  case ',':
+                    n->width = spaceWidths[1];
+                    break;
+                  case '!':
+                    n->width = spaceWidths[2];
+                    break;
+                  case ':':
+                    n->width = spaceWidths[3];
+                    break;
+                  case ';':
+                    n->width = spaceWidths[4];
+                    break;
+                  default:
+                    n->width = avgCharWidth;
+                }
+                n->realWidth = n->width;
+            }
+            else if ((0 == strcmp(s, "\\displaystyle")) ||
+                     (0 == strcmp(s, "\\bf")) ||
+                     (0 == strcmp(s, "\\sf")) ||
+                     (0 == strcmp(s, "\\tt")) ||
+                     (0 == strcmp(s, "\\rm")) ||
+                     (0 == strcmp(s, "\\hbox")) ||
+                     (0 == strcmp(s, "\\mbox")) ||
+                     (0 == strcmp(s, "\\overline")) ||
+                     (0 == strcmp(s, "\\textstyle")) ||
+                     (0 == strcmp(s, "\\scriptstyle")) ||
+                     (0 == strcmp(s, "\\scriptscriptstyle"))) {
+                n->width = 0;
+            }
+            else if (0 == strcmp(s, "\\ldots"))
+                n->width = 3 * charWidth('.');
+            else if (0 == strcmp(s, "\\left")) {
+                tmp = n->nextListNode;
+                if (tmp->nodeType != N_TEXT)
+                    error("unusual token following \\left", "");
+                n->realWidth = n->width = (tmp->data.text[0] == '.')
+                    ? 0
+                    : charWidth(tmp->data.text[0]);
+                tmp->width = 0;
+                fatDelimiter = 1;
+            }
+            else if (0 == strcmp(s, "\\over")) {
+
+                /*
+                 * have already added in width of numerator
+                 */
+                computeNodeWidth(n->nextListNode);
+                n->realWidth = extraOverWidth + max(n->prevListNode->width, n->nextListNode->width);
+                n->width = n->realWidth - n->prevListNode->width;
+                n->nextListNode->width = 0;
+                fatDelimiter = FATDELIMMULT;
+            }
+            else if (0 == strcmp(s, "\\right")) {
+                tmp = n->nextListNode;
+                if (tmp->nodeType != N_TEXT)
+                    error("unusual token following \\right", "");
+                n->realWidth = n->width = fatDelimiter *
+                    ((tmp->data.text[0] == '.') ? 0 : charWidth(tmp->data.text[0]));
+                tmp->width = 0;
+                fatDelimiter = 1;
+            }
+            else if (0 == strcmp(s, "\\root")) {
+                computeNodeWidth(n->nextListNode);      /* which root */
+                n->nextListNode->nextListNode->width = 0;       /* \of */
+                tmp = n->nextListNode->nextListNode->nextListNode;
+                computeNodeWidth(tmp);  /* root of    */
+                n->realWidth = n->width = tmp->width + (avgCharWidth / 2) +
+                    max(avgCharWidth, n->nextListNode->width);
+                n->nextListNode->width = 0;
+                tmp->width = 0;
+            }
+            else if (0 == strcmp(s, "\\sqrt")) {
+                computeNodeWidth(n->nextListNode);
+                n->realWidth = n->width =
+                    avgCharWidth + (avgCharWidth / 2) + n->nextListNode->width;
+                n->nextListNode->width = 0;
+            }
+            else if (0 == strcmp(s, "\\zag")) {
+                computeNodeWidth(n->nextListNode);
+                computeNodeWidth(n->nextListNode->nextListNode);
+                n->realWidth = n->width = avgCharWidth + max(n->nextListNode->width,
+                                      n->nextListNode->nextListNode->width);
+                n->nextListNode->width = 0;
+                n->nextListNode->nextListNode->width = 0;
+                fatDelimiter = FATDELIMMULT;
+            }
+            else if ((0 == strcmp(s, "\\alpha")) ||
+                     (0 == strcmp(s, "\\beta")) ||
+                     (0 == strcmp(s, "\\pi"))) {
+                n->realWidth = n->width = avgCharWidth;
+            }
+            else if (0 == strcmp(s, "\\sin"))
+                /* should use table lookup here */
+                n->realWidth = n->width = sinWidth;
+            else if (0 == strcmp(s, "\\cos"))
+                n->realWidth = n->width = cosWidth;
+            else if (0 == strcmp(s, "\\tan"))
+                n->realWidth = n->width = tanWidth;
+            else if (0 == strcmp(s, "\\erf"))
+                n->realWidth = n->width = erfWidth;
+
+            /*
+             * otherwise just compute length of token after \
+             */
+            else {
+                n->width = 0;
+                for (i = 1; i < strlen(s); i++)
+                    n->width += charWidth(s[i]);
+                n->realWidth = n->width;
+            }
+        }
+        else if (s[1] == '\0')
+            switch (s[0]) {
+              case '^':
+              case '_':
+                tmp = n->nextListNode;
+                computeNodeWidth(tmp);
+                n->width = n->width = tmp->width;
+                tmp->width = 0;
+                break;
+              default:
+                n->realWidth = n->width = charWidth(s[0]);
+            }
+        else {
+            n->width = 0;
+            for (i = 0; i < strlen(s); i++)
+                n->width += charWidth(s[i]);
+            n->realWidth = n->width;
+        }
+    }
+    else {
+        n->realWidth = n->width = computeWidth(n->data.node);
+    }
+}
+
+long
+#ifndef _NO_PROTO
+computeWidth(listNode * n)
+#else
+computeWidth(n)
+listNode * n;
+#endif
+{
+    long w = 0;
+
+    while (n != NULL) {
+        if (n->width == -1) {
+            computeNodeWidth(n);
+            w += n->width;
+        }
+        n = n->nextListNode;
+    }
+    return w;
+}
+
+/*
+ * displaySplitMsg:
+ *
+ * Arguments:
+ *
+ * s : a string describing the kind of expression we are trying to split.
+ *
+ * ok : whether we can split it (TRUE or FALSE)
+ *
+ *
+ * Returns: nothing
+ *
+ *
+ * Function: Displays a message on stderr about whether a particular method of
+ * line breaking will be successful.
+ */
+
+void
+#ifndef _NO_PROTO
+displaySplitMsg(char *s, int ok)
+#else
+displaySplitMsg(s,ok)
+char *s; 
+int ok;
+#endif
+{
+/*  fprintf(stderr, "%sCan split %s: %s\n", blanks, s, ok ? "TRUE" : "FALSE"); */
+}
+
+void
+arrayTooDeep()
+{
+    fprintf(stderr, "%s->Array nesting too deep!\n", blanks);
+}
+
+void
+#ifndef _NO_PROTO
+error(char *msg, char *insert)
+#else
+error(msg,insert)
+char *msg;
+char *insert;
+#endif
+{
+    fputs("Error (texbreak): ", stderr);
+    fputs(msg, stderr);
+    fputs(insert, stderr);
+    fputc('\n', stderr);
+
+    fputs("% Error (texbreak): ", stdout);
+    fputs(msg, stdout);
+    fputs(insert, stdout);
+    fputc('\n', stdout);
+    exit(1);
+}
+
+void
+#ifndef _NO_PROTO
+freeMathList(listNode * n)
+#else
+freeMathList(n)
+listNode * n;
+#endif
+{
+    listNode *tmpNode;
+
+    while (n != NULL) {
+        if (n->nodeType == N_NODE)
+            freeMathList(n->data.node);
+        else if (n->nodeType == N_TEXT)
+            free(n->data.text);
+        else {
+            freeMathList(n->data.array->argsNode);
+            freeMathList(n->data.array->entries);
+            free(n->data.array);
+        }
+        tmpNode = n->nextListNode;
+        free(n);
+        n = tmpNode;
+    }
+}
+
+listNode *
+#ifndef _NO_PROTO
+insertStringAfter(char *s, listNode * n)
+#else
+insertStringAfter(s,n)
+char *s; 
+listNode * n;
+#endif
+{
+
+    /*
+     * returns node after inserted string
+     */
+    listNode *workNode, *lastNode;
+
+    workNode = newListNode(N_NODE);
+    lastNode = string2NodeList(s, workNode);
+
+    n->nextListNode->prevListNode = lastNode;
+    lastNode->nextListNode = n->nextListNode;
+    n->nextListNode = workNode->data.node;
+    workNode->data.node->prevListNode = n;
+
+    free(workNode);
+    return lastNode->nextListNode;
+}
+
+listNode *
+#ifndef _NO_PROTO
+insertStringAtBack(char *s, listNode * n)
+#else
+insertStringAtBack(s,n)
+char *s; 
+listNode * n;
+#endif
+{
+
+    /*
+     * Breaks s up into a list of tokens and appends them onto the end of n.
+     * n must be non-NULL.
+     */
+
+    listNode *workNode, *lastNode;
+
+    workNode = newListNode(N_NODE);
+    lastNode = string2NodeList(s, workNode);
+    n->nextListNode = workNode->data.node;
+    workNode->data.node->prevListNode = n;
+    free(workNode);
+
+    return lastNode;
+}
+
+listNode *
+#ifndef _NO_PROTO
+insertStringAtFront(char *s, listNode * n)
+#else
+insertStringAtFront(s,n)
+char *s; 
+listNode * n;
+#endif
+{
+
+    /*
+     * Breaks s up into a list of tokens and appends them onto the front of
+     * n. n must be a node.
+     */
+
+    listNode *workNode, *lastNode;
+
+    workNode = newListNode(N_NODE);
+    lastNode = string2NodeList(s, workNode);
+    lastNode->nextListNode = n->data.node;
+    n->data.node->prevListNode = lastNode;
+    n->data.node = workNode->data.node;
+    free(workNode);
+
+    return lastNode;
+}
+
+int
+#ifndef _NO_PROTO
+newLineIfNecessary(int lastWasNewLine)
+#else
+newLineIfNecessary(lastWasNewLine)
+int lastWasNewLine;
+#endif
+{
+    if (!lastWasNewLine || (charsOut > 0)) {
+        putcBuf('\n', bufout);
+        outLineNum++;
+        charsOut = 0;
+    }
+    return TRUE;
+}
+
+listNode *
+#ifndef _NO_PROTO
+newListNode(enum nodeTypes nt)
+#else
+newListNode(nt)
+enum nodeTypes nt;
+#endif
+{
+    listNode *n;
+
+    n = (listNode *) malloc(sizeof(listNode));
+    n->nextListNode = n->prevListNode = NULL;
+    n->nodeType = nt;
+    n->width = -1;
+    n->realWidth = -1;
+    if (nt == N_NODE)
+        n->data.node = NULL;
+    else if (nt == N_TEXT)
+        n->data.text = NULL;
+    else {
+        n->data.array = (arrayNode *) malloc(sizeof(arrayNode));
+        n->data.array->argsNode = NULL;
+        n->data.array->entries = NULL;
+        n->data.array->cols = 0;
+    }
+    return n;
+}
+
+int
+nextMathToken()
+{
+
+
+    /*
+     * Sets mathToken. Returns 1 if ok, 0 if no more tokens.
+     */
+
+    char curChar, errChar[2];
+
+    errChar[1] = '\0';
+    mathToken[0] = '\0';
+    mathTokenLen = 0;
+
+    /*
+     * Kill any blanks.
+     */
+
+    while ((mathBufferPtr < mathBufferLen) && (mathBuffer[mathBufferPtr] == ' '))
+        mathBufferPtr++;
+
+    /*
+     * If at end, exit saying so.
+     */
+
+    if (mathBufferPtr >= mathBufferLen)
+        return 0;
+
+    mathToken[mathTokenLen++] = curChar = mathBuffer[mathBufferPtr++];
+
+    if (curChar == '\\') {
+        curChar = mathBuffer[mathBufferPtr++];
+        switch (curChar) {
+          case '\0':            /* at end of buffer */
+            mathToken[mathTokenLen++] = ' ';
+            goto done;
+          case '\\':
+          case ' ':
+          case '!':
+          case '#':
+          case '$':
+          case '%':
+          case '&':
+          case ',':
+          case ':':
+          case ';':
+          case '^':
+          case '_':
+          case '{':
+          case '}':
+            mathToken[mathTokenLen++] = curChar;
+            goto done;
+        }
+        if (isalpha(curChar) || (curChar == '@')) {
+            mathToken[mathTokenLen++] = curChar;
+            while ((curChar = mathBuffer[mathBufferPtr]) &&
+                   (isalpha(curChar) || (curChar == '@'))) {
+                mathToken[mathTokenLen++] = curChar;
+                mathBufferPtr++;
+            }
+        }
+        else {
+            errChar[0] = curChar;
+            errChar[1] = '\0';
+            error("strange character following \\: ", errChar);
+        }
+    }
+    else if (isdigit(curChar))  /* digits are individual tokens */
+        ;
+    else if (isalpha(curChar)) {
+        while ((curChar = mathBuffer[mathBufferPtr]) &&
+               (isalpha(curChar))) {
+            mathToken[mathTokenLen++] = curChar;
+            mathBufferPtr++;
+        }
+    }
+    else if (curChar == '"') {  /* handle strings */
+        while ((curChar = mathBuffer[mathBufferPtr]) &&
+               (curChar != '"')) {
+            mathToken[mathTokenLen++] = curChar;
+            mathBufferPtr++;
+        }
+        mathToken[mathTokenLen++] = '"';
+        mathBufferPtr++;
+    }
+
+done:
+    mathToken[mathTokenLen--] = '\0';
+
+    /*
+     * Some translations.
+     */
+    if (0 == strcmp(mathToken, "\\sp")) {
+        mathToken[0] = '^';
+        mathToken[1] = '\0';
+        mathTokenLen = 1;
+    }
+    else if (0 == strcmp(mathToken, "\\sb")) {
+        mathToken[0] = '_';
+        mathToken[1] = '\0';
+        mathTokenLen = 1;
+    }
+
+    return 1;
+}
+
+int
+#ifndef _NO_PROTO
+printChar(char c)
+#else
+printChar(c)
+char c;
+#endif
+{
+    if ((charsOut > MAXCHARSINLINE) &&
+        isdigit(lastPrinted) && isdigit(c)) {
+        putcBuf('\n', bufout);
+        outLineNum++;
+        charsOut = 0;
+    }
+
+    putcBuf(c, bufout);
+    lastPrinted = c;
+    charsOut++;
+
+    /*
+     * break lines after following characters
+     */
+
+    if ((charsOut > MAXCHARSINLINE) && strchr("+- ,_^", c)) {
+        putc('\n', stdout);
+        outLineNum++;
+        charsOut = 0;
+        lastPrinted = '\0';
+        return TRUE;
+    }
+    return FALSE;
+}
+
+int
+#ifndef _NO_PROTO
+printMathList(listNode * n, int lastWasNewLine)
+#else
+printMathList(n,lastWasNewLine)
+listNode * n; 
+int lastWasNewLine;
+#endif
+{
+    listNode *tmpNode, *rowNode, *colNode;
+    int begin, group, r, c;
+
+    while (n != NULL) {
+        if (n->nodeType == N_NODE) {
+            lastWasNewLine = printChar('{');
+            lastWasNewLine = printMathList(n->data.node, lastWasNewLine);
+            lastWasNewLine = printChar('}');
+        }
+        else if (n->nodeType == N_ARRAY) {
+            lastWasNewLine = newLineIfNecessary(lastWasNewLine);
+            lastWasNewLine = printString("\\begin{array}");
+            lastWasNewLine = printMathList(n->data.array->argsNode, lastWasNewLine);
+            lastWasNewLine = printString("\\displaystyle");
+            lastWasNewLine = newLineIfNecessary(lastWasNewLine);
+
+            rowNode = n->data.array->entries;   /* node pointing to first row */
+            while (rowNode) {
+                colNode = rowNode->data.node;
+                while (colNode) {
+                    if (colNode->prevListNode) {        /* if not first column */
+                        lastWasNewLine = printString(" & ");
+                        lastWasNewLine = newLineIfNecessary(lastWasNewLine);
+                    }
+                    lastWasNewLine = printMathList(colNode->data.node, lastWasNewLine);
+                    colNode = colNode->nextListNode;
+                }
+                if (rowNode->nextListNode)      /* if not last row */
+                    lastWasNewLine = printString(" \\\\");
+
+                lastWasNewLine = newLineIfNecessary(lastWasNewLine);
+                rowNode = rowNode->nextListNode;
+            }
+
+            lastWasNewLine = printString("\\end{array}");
+            lastWasNewLine = newLineIfNecessary(lastWasNewLine);
+        }
+        else if (n->nodeType == N_TEXT) {
+
+            /*
+             * handle keywords that might appear in math mode
+             */
+
+            if ((0 == strcmp(n->data.text, "by")) ||
+                (0 == strcmp(n->data.text, "if")) ||
+                (0 == strcmp(n->data.text, "then")) ||
+                (0 == strcmp(n->data.text, "else"))) {
+                lastWasNewLine = printString(" \\hbox{ ");
+                lastWasNewLine = printString(n->data.text);
+                lastWasNewLine = printString(" } ");
+            }
+
+            /*
+             * handle things that should be in a special font
+             */
+
+            else if ((0 == strcmp(n->data.text, "true")) ||
+                     (0 == strcmp(n->data.text, "false")) ||
+                     (0 == strcmp(n->data.text, "table")) ||
+                     (0 == strcmp(n->data.text, "Aleph"))
+                ) {
+                lastWasNewLine = printString(" \\mbox{\\rm ");
+                lastWasNewLine = printString(n->data.text);
+                lastWasNewLine = printString("} ");
+            }
+
+            /*
+             * handle things that should always be on their own line
+             */
+
+            else if ((0 == strcmp(n->data.text, "\\\\")) ||
+                     (0 == strcmp(n->data.text, "\\displaystyle"))) {
+                lastWasNewLine = newLineIfNecessary(lastWasNewLine);
+                lastWasNewLine = printString(n->data.text);
+                lastWasNewLine = newLineIfNecessary(lastWasNewLine);
+            }
+
+            /*
+             * handle phrases that should be on their own line.
+             */
+
+            else if ((0 == strcmp(n->data.text, "\\begin")) ||
+                     (0 == strcmp(n->data.text, "\\end"))) {
+                lastWasNewLine = newLineIfNecessary(lastWasNewLine);
+                lastWasNewLine = printString(n->data.text);
+                begin = (n->data.text[1] == 'b') ? TRUE : FALSE;
+
+                n = n->nextListNode;    /* had better be a node */
+                tmpNode = n->data.node;
+                lastWasNewLine = printChar('{');
+                lastWasNewLine = printMathList(tmpNode, lastWasNewLine);
+                lastWasNewLine = printChar('}');
+
+                if (begin) {
+
+                    /*
+                     * if array, print the argument.
+                     */
+
+                    if (0 == strcmp(tmpNode->data.text, "array")) {
+                        n = n->nextListNode;    /* had better be a node */
+                        lastWasNewLine = printChar('{');
+                        lastWasNewLine = printMathList(n->data.node, lastWasNewLine);
+                        lastWasNewLine = printChar('}');
+                    }
+                }
+                lastWasNewLine = newLineIfNecessary(FALSE);
+            }
+
+            /*
+             * handle everything else, paying attention as to whether we
+             * should include a trailing blank.
+             */
+
+            else {
+                group = 0;
+                /* guess whether next word is part of a type */
+                if ((strlen(n->data.text) > 2) &&
+                    ('A' <= n->data.text[0]) &&
+                    ('Z' >= n->data.text[0])) {
+                    group = 1;
+                    lastWasNewLine = printString("\\hbox{\\axiomType{");
+                }
+                lastWasNewLine = printString(n->data.text);
+                if (group) {
+                    lastWasNewLine = printString("}\\ }");
+                    group = 0;
+                }
+                tmpNode = n->nextListNode;
+                if ((n->data.text[0] == '_') ||
+                    (n->data.text[0] == '^') ||
+                    (n->data.text[0] == '.') ||
+                    (n->data.text[0] == '(') ||
+                    (0 == strcmp(n->data.text, "\\left")) ||
+                    (0 == strcmp(n->data.text, "\\right")) ||
+                    (0 == strcmp(n->data.text, "\\%")));
+                else if (tmpNode && (tmpNode->nodeType == N_TEXT)) {
+                    if (((isdigit(n->data.text[0])) &&
+                         (isdigit(tmpNode->data.text[0]))) ||
+                        ((isdigit(n->data.text[0])) &&
+                         (',' == tmpNode->data.text[0])) ||
+                        (tmpNode->data.text[0] == '\'') ||
+                        (tmpNode->data.text[0] == '_') ||
+                        (tmpNode->data.text[0] == '^') ||
+                        (tmpNode->data.text[0] == '.') ||
+                        (tmpNode->data.text[0] == ')'));
+                    else
+                        lastWasNewLine = printChar(' ');
+                }
+            }
+        }
+        n = n->nextListNode;
+    }
+    return lastWasNewLine;
+}
+
+int
+#ifndef _NO_PROTO
+printString(char *s)
+#else
+printString(s)
+char *s;
+#endif
+{
+    if (s[0]) {
+        if (!s[1])
+            return printChar(s[0]);
+        else {
+            putsBuf(s,bufout);
+            charsOut += strlen(s);
+        }
+    }
+    return FALSE;
+}
+
+void
+#ifndef _NO_PROTO
+putsBuf(char s[], char buf[])
+#else
+putsBuf(s,buf)
+char s[], buf[]
+#endif
+{
+  strcat(buf,s);
+}
+
+void
+#ifndef _NO_PROTO
+putcBuf(char c,char buf[])
+#else
+putcBuf(c,buf)
+char c, buf[]
+#endif
+{
+  char s[2];
+
+  s[0] = c;
+  s[1] = '\0';
+  strcat(buf,s);
+}
+
+listNode *
+#ifndef _NO_PROTO
+string2NodeList(char *s, listNode * n)
+#else
+string2NodeList(s,n)
+char *s;
+listNode * n;
+#endif
+{
+
+    /*
+     * First argument is string to be broken up, second is a node. Return
+     * value is last item in list.
+     */
+
+    mathBufferPtr = 0;
+    strcpy(mathBuffer, s);
+    mathBufferLen = strlen(s);
+    buildMathList(n);
+    n = n->data.node;
+    while (n->nextListNode) {
+
+        /*
+         * set width to 0: other funs will have to set for real
+         */
+        n->width = 0;
+        n = n->nextListNode;
+    }
+    n->width = 0;
+    return n;
+}
+
+void
+resetCharMults()
+{
+
+    /*
+     * this is a ratio by which the standard \mit should be multiplied to get
+     * other fonts, roughly
+     */
+
+    charMultNum = charMultDenom = 1;
+}
+
+void
+ttCharMults()
+{
+
+    /*
+     * this is a ratio by which the standard \mit should be multiplied to get
+     * the \tt font, roughly
+     */
+
+    charMultNum = 11;
+    charMultDenom = 10;
+}
+
+int
+#ifndef _NO_PROTO
+charWidth(char c)
+#else
+charWidth(c)
+char c;
+#endif
+{
+    return (charMultNum * charTable[c]) / charMultDenom;
+}
+
+void
+#ifndef _NO_PROTO
+#else
+#endif
+initCharTable()
+{
+    int i;
+
+    avgCharWidth = 95;          /* where 1000 = 1 inch */
+
+    spaceWidths[0] = 51;        /* \  */
+    spaceWidths[1] = 25;        /* \, */
+    spaceWidths[2] = -25;       /* \! */
+    spaceWidths[3] = 37;        /* \: */
+    spaceWidths[4] = 42;        /* \; */
+
+    extraOverWidth = 33;        /* extra space in fraction bar */
+
+    sinWidth = 186;             /* width of \sin */
+    cosWidth = 203;
+    tanWidth = 219;
+    erfWidth = 185;
+
+    for (i = 0; i < 256; i++)
+        charTable[i] = avgCharWidth;
+
+    charTable['!'] = 42;
+    charTable['"'] = 76;
+    charTable['%'] = 126;
+    charTable['('] = 59;
+    charTable[')'] = 59;
+    charTable['+'] = 185;
+    charTable[','] = 42;
+    charTable['-'] = 185;
+    charTable['.'] = 42;
+    charTable['/'] = 76;
+    charTable['0'] = 76;
+    charTable['1'] = 76;
+    charTable['2'] = 76;
+    charTable['3'] = 76;
+    charTable['4'] = 76;
+    charTable['5'] = 76;
+    charTable['6'] = 76;
+    charTable['7'] = 76;
+    charTable['8'] = 76;
+    charTable['9'] = 76;
+    charTable[':'] = 42;
+    charTable[';'] = 42;
+    charTable['<'] = 202;
+    charTable['='] = 202;
+    charTable['>'] = 202;
+    charTable['A'] = 114;
+    charTable['B'] = 123;
+    charTable['C'] = 119;
+    charTable['D'] = 130;
+    charTable['E'] = 121;
+    charTable['F'] = 119;
+    charTable['G'] = 119;
+    charTable['H'] = 138;
+    charTable['I'] = 79;
+    charTable['J'] = 99;
+    charTable['K'] = 140;
+    charTable['L'] = 103;
+    charTable['M'] = 164;
+    charTable['N'] = 138;
+    charTable['O'] = 120;
+    charTable['P'] = 118;
+    charTable['Q'] = 120;
+    charTable['R'] = 116;
+    charTable['S'] = 102;
+    charTable['T'] = 110;
+    charTable['U'] = 120;
+    charTable['V'] = 122;
+    charTable['W'] = 164;
+    charTable['X'] = 137;
+    charTable['Y'] = 122;
+    charTable['Z'] = 114;
+    charTable['['] = 42;
+    charTable[']'] = 42;
+    charTable['a'] = 80;
+    charTable['b'] = 65;
+    charTable['c'] = 66;
+    charTable['d'] = 79;
+    charTable['e'] = 71;
+    charTable['f'] = 91;
+    charTable['g'] = 78;
+    charTable['h'] = 87;
+    charTable['i'] = 52;
+    charTable['j'] = 71;
+    charTable['k'] = 84;
+    charTable['l'] = 48;
+    charTable['m'] = 133;
+    charTable['n'] = 91;
+    charTable['o'] = 73;
+    charTable['p'] = 76;
+    charTable['q'] = 73;
+    charTable['r'] = 73;
+    charTable['s'] = 71;
+    charTable['t'] = 55;
+    charTable['u'] = 87;
+    charTable['v'] = 79;
+    charTable['w'] = 113;
+    charTable['x'] = 87;
+    charTable['y'] = 80;
+    charTable['z'] = 77;
+    charTable['{'] = 76;
+    charTable['|'] = 42;
+    charTable['}'] = 76;
+}

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker.i
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker.i	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker.i	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,5 @@
+/* File : texbreaker.i */
+%module texbreaker
+
+extern int    texbreak(char buf[]);
+extern char   bufout[16*8192];

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker.mak
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker.mak	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker.mak	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,3 @@
+swig -python texbreaker.i
+gcc -fpic -c texbreaker.c texbreaker_wrap.c -I/usr/include/python2.3
+ld -shared texbreaker.o texbreaker_wrap.o -o _texbreaker.so
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,36 @@
+# This file was created automatically by SWIG.
+# Don't modify this file, modify the SWIG interface instead.
+# This file is compatible with both classic and new-style classes.
+
+import _texbreaker
+
+def _swig_setattr(self,class_type,name,value):
+    if (name == "this"):
+        if isinstance(value, class_type):
+            self.__dict__[name] = value.this
+            if hasattr(value,"thisown"): self.__dict__["thisown"] = value.thisown
+            del value.thisown
+            return
+    method = class_type.__swig_setmethods__.get(name,None)
+    if method: return method(self,value)
+    self.__dict__[name] = value
+
+def _swig_getattr(self,class_type,name):
+    method = class_type.__swig_getmethods__.get(name,None)
+    if method: return method(self)
+    raise AttributeError,name
+
+import types
+try:
+    _object = types.ObjectType
+    _newclass = 1
+except AttributeError:
+    class _object : pass
+    _newclass = 0
+del types
+
+
+
+texbreak = _texbreaker.texbreak
+cvar = _texbreaker.cvar
+

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker_wrap.c
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker_wrap.c	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/texbreaker_wrap.c	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,787 @@
+/* ----------------------------------------------------------------------------
+ * This file was automatically generated by SWIG (http://www.swig.org).
+ * Version 1.3.21
+ * 
+ * This file is not intended to be easily readable and contains a number of 
+ * coding conventions designed to improve portability and efficiency. Do not make
+ * changes to this file unless you know what you are doing--modify the SWIG 
+ * interface file instead. 
+ * ----------------------------------------------------------------------------- */
+
+#define SWIGPYTHON
+
+#include "Python.h"
+
+/*************************************************************** -*- c -*-
+ * python/precommon.swg
+ *
+ * Rename all exported symbols from common.swg, to avoid symbol
+ * clashes if multiple interpreters are included
+ *
+ ************************************************************************/
+
+#define SWIG_TypeRegister    SWIG_Python_TypeRegister
+#define SWIG_TypeCheck       SWIG_Python_TypeCheck
+#define SWIG_TypeCast        SWIG_Python_TypeCast
+#define SWIG_TypeDynamicCast SWIG_Python_TypeDynamicCast
+#define SWIG_TypeName        SWIG_Python_TypeName
+#define SWIG_TypeQuery       SWIG_Python_TypeQuery
+#define SWIG_TypeClientData  SWIG_Python_TypeClientData
+#define SWIG_PackData        SWIG_Python_PackData 
+#define SWIG_UnpackData      SWIG_Python_UnpackData 
+
+
+/***********************************************************************
+ * common.swg
+ *
+ *     This file contains generic SWIG runtime support for pointer
+ *     type checking as well as a few commonly used macros to control
+ *     external linkage.
+ *
+ * Author : David Beazley (beazley at cs.uchicago.edu)
+ *
+ * Copyright (c) 1999-2000, The University of Chicago
+ * 
+ * This file may be freely redistributed without license or fee provided
+ * this copyright message remains intact.
+ ************************************************************************/
+
+#include <string.h>
+
+#if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#  if defined(_MSC_VER) || defined(__GNUC__)
+#    if defined(STATIC_LINKED)
+#      define SWIGEXPORT(a) a
+#      define SWIGIMPORT(a) extern a
+#    else
+#      define SWIGEXPORT(a) __declspec(dllexport) a
+#      define SWIGIMPORT(a) extern a
+#    endif
+#  else
+#    if defined(__BORLANDC__)
+#      define SWIGEXPORT(a) a _export
+#      define SWIGIMPORT(a) a _export
+#    else
+#      define SWIGEXPORT(a) a
+#      define SWIGIMPORT(a) a
+#    endif
+#  endif
+#else
+#  define SWIGEXPORT(a) a
+#  define SWIGIMPORT(a) a
+#endif
+
+#ifdef SWIG_GLOBAL
+#  define SWIGRUNTIME(a) SWIGEXPORT(a)
+#else
+#  define SWIGRUNTIME(a) static a
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void *(*swig_converter_func)(void *);
+typedef struct swig_type_info *(*swig_dycast_func)(void **);
+
+typedef struct swig_type_info {
+  const char             *name;
+  swig_converter_func     converter;
+  const char             *str;
+  void                   *clientdata;
+  swig_dycast_func        dcast;
+  struct swig_type_info  *next;
+  struct swig_type_info  *prev;
+} swig_type_info;
+
+#ifdef SWIG_NOINCLUDE
+
+SWIGIMPORT(swig_type_info *) SWIG_TypeRegister(swig_type_info *);
+SWIGIMPORT(swig_type_info *) SWIG_TypeCheck(char *c, swig_type_info *);
+SWIGIMPORT(void *)           SWIG_TypeCast(swig_type_info *, void *);
+SWIGIMPORT(swig_type_info *) SWIG_TypeDynamicCast(swig_type_info *, void **);
+SWIGIMPORT(const char *)     SWIG_TypeName(const swig_type_info *);
+SWIGIMPORT(swig_type_info *) SWIG_TypeQuery(const char *);
+SWIGIMPORT(void)             SWIG_TypeClientData(swig_type_info *, void *);
+SWIGIMPORT(char *)           SWIG_PackData(char *, void *, int);
+SWIGIMPORT(char *)           SWIG_UnpackData(char *, void *, int);
+
+#else
+
+static swig_type_info *swig_type_list = 0;
+
+/* Register a type mapping with the type-checking */
+SWIGRUNTIME(swig_type_info *)
+SWIG_TypeRegister(swig_type_info *ti) {
+  swig_type_info *tc, *head, *ret, *next;
+  /* Check to see if this type has already been registered */
+  tc = swig_type_list;
+  while (tc) {
+    if (strcmp(tc->name, ti->name) == 0) {
+      /* Already exists in the table.  Just add additional types to the list */
+      if (tc->clientdata) ti->clientdata = tc->clientdata;
+      head = tc;
+      next = tc->next;
+      goto l1;
+    }
+    tc = tc->prev;
+  }
+  head = ti;
+  next = 0;
+
+  /* Place in list */
+  ti->prev = swig_type_list;
+  swig_type_list = ti;
+
+  /* Build linked lists */
+  l1:
+  ret = head;
+  tc = ti + 1;
+  /* Patch up the rest of the links */
+  while (tc->name) {
+    head->next = tc;
+    tc->prev = head;
+    head = tc;
+    tc++;
+  }
+  if (next) next->prev = head;
+  head->next = next;
+  return ret;
+}
+
+/* Check the typename */
+SWIGRUNTIME(swig_type_info *) 
+SWIG_TypeCheck(char *c, swig_type_info *ty) {
+  swig_type_info *s;
+  if (!ty) return 0;        /* Void pointer */
+  s = ty->next;             /* First element always just a name */
+  do {
+    if (strcmp(s->name,c) == 0) {
+      if (s == ty->next) return s;
+      /* Move s to the top of the linked list */
+      s->prev->next = s->next;
+      if (s->next) {
+        s->next->prev = s->prev;
+      }
+      /* Insert s as second element in the list */
+      s->next = ty->next;
+      if (ty->next) ty->next->prev = s;
+      ty->next = s;
+      s->prev = ty;
+      return s;
+    }
+    s = s->next;
+  } while (s && (s != ty->next));
+  return 0;
+}
+
+/* Cast a pointer up an inheritance hierarchy */
+SWIGRUNTIME(void *) 
+SWIG_TypeCast(swig_type_info *ty, void *ptr) {
+  if ((!ty) || (!ty->converter)) return ptr;
+  return (*ty->converter)(ptr);
+}
+
+/* Dynamic pointer casting. Down an inheritance hierarchy */
+SWIGRUNTIME(swig_type_info *) 
+SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) {
+  swig_type_info *lastty = ty;
+  if (!ty || !ty->dcast) return ty;
+  while (ty && (ty->dcast)) {
+    ty = (*ty->dcast)(ptr);
+    if (ty) lastty = ty;
+  }
+  return lastty;
+}
+
+/* Return the name associated with this type */
+SWIGRUNTIME(const char *)
+SWIG_TypeName(const swig_type_info *ty) {
+  return ty->name;
+}
+
+/* Search for a swig_type_info structure */
+SWIGRUNTIME(swig_type_info *)
+SWIG_TypeQuery(const char *name) {
+  swig_type_info *ty = swig_type_list;
+  while (ty) {
+    if (ty->str && (strcmp(name,ty->str) == 0)) return ty;
+    if (ty->name && (strcmp(name,ty->name) == 0)) return ty;
+    ty = ty->prev;
+  }
+  return 0;
+}
+
+/* Set the clientdata field for a type */
+SWIGRUNTIME(void)
+SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
+  swig_type_info *tc, *equiv;
+  if (ti->clientdata == clientdata) return;
+  ti->clientdata = clientdata;
+  equiv = ti->next;
+  while (equiv) {
+    if (!equiv->converter) {
+      tc = swig_type_list;
+      while (tc) {
+        if ((strcmp(tc->name, equiv->name) == 0))
+          SWIG_TypeClientData(tc,clientdata);
+        tc = tc->prev;
+      }
+    }
+    equiv = equiv->next;
+  }
+}
+
+/* Pack binary data into a string */
+SWIGRUNTIME(char *)
+SWIG_PackData(char *c, void *ptr, int sz) {
+  static char hex[17] = "0123456789abcdef";
+  int i;
+  unsigned char *u = (unsigned char *) ptr;
+  register unsigned char uu;
+  for (i = 0; i < sz; i++,u++) {
+    uu = *u;
+    *(c++) = hex[(uu & 0xf0) >> 4];
+    *(c++) = hex[uu & 0xf];
+  }
+  return c;
+}
+
+/* Unpack binary data from a string */
+SWIGRUNTIME(char *)
+SWIG_UnpackData(char *c, void *ptr, int sz) {
+  register unsigned char uu = 0;
+  register int d;
+  unsigned char *u = (unsigned char *) ptr;
+  int i;
+  for (i = 0; i < sz; i++, u++) {
+    d = *(c++);
+    if ((d >= '0') && (d <= '9'))
+      uu = ((d - '0') << 4);
+    else if ((d >= 'a') && (d <= 'f'))
+      uu = ((d - ('a'-10)) << 4);
+    d = *(c++);
+    if ((d >= '0') && (d <= '9'))
+      uu |= (d - '0');
+    else if ((d >= 'a') && (d <= 'f'))
+      uu |= (d - ('a'-10));
+    *u = uu;
+  }
+  return c;
+}
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+/***********************************************************************
+ * python.swg
+ *
+ *     This file contains the runtime support for Python modules
+ *     and includes code for managing global variables and pointer
+ *     type checking.
+ *
+ * Author : David Beazley (beazley at cs.uchicago.edu)
+ ************************************************************************/
+
+#include "Python.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define SWIG_PY_INT     1
+#define SWIG_PY_FLOAT   2
+#define SWIG_PY_STRING  3
+#define SWIG_PY_POINTER 4
+#define SWIG_PY_BINARY  5
+
+/* Flags for pointer conversion */
+
+#define SWIG_POINTER_EXCEPTION     0x1
+#define SWIG_POINTER_DISOWN        0x2
+
+/* Exception handling in wrappers */
+#define SWIG_fail   goto fail
+
+/* Constant information structure */
+typedef struct swig_const_info {
+    int type;
+    char *name;
+    long lvalue;
+    double dvalue;
+    void   *pvalue;
+    swig_type_info **ptype;
+} swig_const_info;
+
+/* Common SWIG API */
+#define SWIG_ConvertPtr(obj, pp, type, flags) \
+  SWIG_Python_ConvertPtr(obj, pp, type, flags)
+#define SWIG_NewPointerObj(p, type, flags) \
+  SWIG_Python_NewPointerObj(p, type, flags)
+#define SWIG_MustGetPtr(p, type, argnum, flags) \
+  SWIG_Python_MustGetPtr(p, type, argnum, flags)
+
+/* Python-specific SWIG API */
+#define SWIG_newvarlink() \
+  SWIG_Python_newvarlink()
+#define SWIG_addvarlink(p, name, get_attr, set_attr) \
+  SWIG_Python_addvarlink(p, name, get_attr, set_attr)
+#define SWIG_ConvertPacked(obj, ptr, sz, ty, flags) \
+  SWIG_Python_ConvertPacked(obj, ptr, sz, ty, flags)
+#define SWIG_NewPackedObj(ptr, sz, type) \
+  SWIG_Python_NewPackedObj(ptr, sz, type)
+#define SWIG_InstallConstants(d, constants) \
+  SWIG_Python_InstallConstants(d, constants)
+
+#ifdef SWIG_NOINCLUDE
+
+SWIGIMPORT(int)               SWIG_Python_ConvertPtr(PyObject *, void **, swig_type_info *, int);
+SWIGIMPORT(PyObject *)        SWIG_Python_NewPointerObj(void *, swig_type_info *,int own);
+SWIGIMPORT(void *)            SWIG_Python_MustGetPtr(PyObject *, swig_type_info *, int, int);
+SWIGIMPORT(PyObject *)        SWIG_Python_newvarlink(void);
+SWIGIMPORT(void)              SWIG_Python_addvarlink(PyObject *, char *, PyObject *(*)(void), int (*)(PyObject *));
+SWIGIMPORT(int)               SWIG_Python_ConvertPacked(PyObject *, void *, int sz, swig_type_info *, int);
+SWIGIMPORT(PyObject *)        SWIG_Python_NewPackedObj(void *, int sz, swig_type_info *);
+SWIGIMPORT(void)              SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]);
+
+#else
+
+/* -----------------------------------------------------------------------------
+ * global variable support code.
+ * ----------------------------------------------------------------------------- */
+
+typedef struct swig_globalvar {   
+  char       *name;                  /* Name of global variable */
+  PyObject *(*get_attr)(void);       /* Return the current value */
+  int       (*set_attr)(PyObject *); /* Set the value */
+  struct swig_globalvar *next;
+} swig_globalvar;
+
+typedef struct swig_varlinkobject {
+  PyObject_HEAD
+  swig_globalvar *vars;
+} swig_varlinkobject;
+
+static PyObject *
+swig_varlink_repr(swig_varlinkobject *v) {
+  v = v;
+  return PyString_FromString("<Global variables>");
+}
+
+static int
+swig_varlink_print(swig_varlinkobject *v, FILE *fp, int flags) {
+  swig_globalvar  *var;
+  flags = flags;
+  fprintf(fp,"Global variables { ");
+  for (var = v->vars; var; var=var->next) {
+    fprintf(fp,"%s", var->name);
+    if (var->next) fprintf(fp,", ");
+  }
+  fprintf(fp," }\n");
+  return 0;
+}
+
+static PyObject *
+swig_varlink_getattr(swig_varlinkobject *v, char *n) {
+  swig_globalvar *var = v->vars;
+  while (var) {
+    if (strcmp(var->name,n) == 0) {
+      return (*var->get_attr)();
+    }
+    var = var->next;
+  }
+  PyErr_SetString(PyExc_NameError,"Unknown C global variable");
+  return NULL;
+}
+
+static int
+swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) {
+  swig_globalvar *var = v->vars;
+  while (var) {
+    if (strcmp(var->name,n) == 0) {
+      return (*var->set_attr)(p);
+    }
+    var = var->next;
+  }
+  PyErr_SetString(PyExc_NameError,"Unknown C global variable");
+  return 1;
+}
+
+statichere PyTypeObject varlinktype = {
+  PyObject_HEAD_INIT(0)              
+  0,
+  (char *)"swigvarlink",              /* Type name    */
+  sizeof(swig_varlinkobject),         /* Basic size   */
+  0,                                  /* Itemsize     */
+  0,                                  /* Deallocator  */ 
+  (printfunc) swig_varlink_print,     /* Print        */
+  (getattrfunc) swig_varlink_getattr, /* get attr     */
+  (setattrfunc) swig_varlink_setattr, /* Set attr     */
+  0,                                  /* tp_compare   */
+  (reprfunc) swig_varlink_repr,       /* tp_repr      */    
+  0,                                  /* tp_as_number */
+  0,                                  /* tp_as_mapping*/
+  0,                                  /* tp_hash      */
+};
+
+/* Create a variable linking object for use later */
+SWIGRUNTIME(PyObject *)
+SWIG_Python_newvarlink(void) {
+  swig_varlinkobject *result = 0;
+  result = PyMem_NEW(swig_varlinkobject,1);
+  varlinktype.ob_type = &PyType_Type;    /* Patch varlinktype into a PyType */
+  result->ob_type = &varlinktype;
+  result->vars = 0;
+  result->ob_refcnt = 0;
+  Py_XINCREF((PyObject *) result);
+  return ((PyObject*) result);
+}
+
+SWIGRUNTIME(void)
+SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) {
+  swig_varlinkobject *v;
+  swig_globalvar *gv;
+  v= (swig_varlinkobject *) p;
+  gv = (swig_globalvar *) malloc(sizeof(swig_globalvar));
+  gv->name = (char *) malloc(strlen(name)+1);
+  strcpy(gv->name,name);
+  gv->get_attr = get_attr;
+  gv->set_attr = set_attr;
+  gv->next = v->vars;
+  v->vars = gv;
+}
+
+/* Convert a pointer value */
+SWIGRUNTIME(int)
+SWIG_Python_ConvertPtr(PyObject *obj, void **ptr, swig_type_info *ty, int flags) {
+  swig_type_info *tc;
+  char  *c = 0;
+  static PyObject *SWIG_this = 0;
+  int    newref = 0;
+  PyObject  *pyobj = 0;
+
+  if (!obj) return 0;
+  if (obj == Py_None) {
+    *ptr = 0;
+    return 0;
+  }
+#ifdef SWIG_COBJECT_TYPES
+  if (!(PyCObject_Check(obj))) {
+    if (!SWIG_this)
+      SWIG_this = PyString_FromString("this");
+    pyobj = obj;
+    obj = PyObject_GetAttr(obj,SWIG_this);
+    newref = 1;
+    if (!obj) goto type_error;
+    if (!PyCObject_Check(obj)) {
+      Py_DECREF(obj);
+      goto type_error;
+    }
+  }  
+  *ptr = PyCObject_AsVoidPtr(obj);
+  c = (char *) PyCObject_GetDesc(obj);
+  if (newref) Py_DECREF(obj);
+  goto cobject;
+#else
+  if (!(PyString_Check(obj))) {
+    if (!SWIG_this)
+      SWIG_this = PyString_FromString("this");
+    pyobj = obj;
+    obj = PyObject_GetAttr(obj,SWIG_this);
+    newref = 1;
+    if (!obj) goto type_error;
+    if (!PyString_Check(obj)) {
+      Py_DECREF(obj);
+      goto type_error;
+    }
+  } 
+  c = PyString_AsString(obj);
+  /* Pointer values must start with leading underscore */
+  if (*c != '_') {
+    *ptr = (void *) 0;
+    if (strcmp(c,"NULL") == 0) {
+      if (newref) { Py_DECREF(obj); }
+      return 0;
+    } else {
+      if (newref) { Py_DECREF(obj); }
+      goto type_error;
+    }
+  }
+  c++;
+  c = SWIG_UnpackData(c,ptr,sizeof(void *));
+  if (newref) { Py_DECREF(obj); }
+#endif
+
+#ifdef SWIG_COBJECT_TYPES
+cobject:
+#endif
+
+  if (ty) {
+    tc = SWIG_TypeCheck(c,ty);
+    if (!tc) goto type_error;
+    *ptr = SWIG_TypeCast(tc,(void*) *ptr);
+  }
+
+  if ((pyobj) && (flags & SWIG_POINTER_DISOWN)) {
+    PyObject *zero = PyInt_FromLong(0);
+    PyObject_SetAttrString(pyobj,(char*)"thisown",zero);
+    Py_DECREF(zero);
+  }
+  return 0;
+
+type_error:
+  if (flags & SWIG_POINTER_EXCEPTION) {
+    if (ty && c) {
+      char *temp = (char *) malloc(64+strlen(ty->name)+strlen(c));
+      sprintf(temp,"Type error. Got %s, expected %s", c, ty->name);
+      PyErr_SetString(PyExc_TypeError, temp);
+      free((char *) temp);
+    } else {
+      PyErr_SetString(PyExc_TypeError,"Expected a pointer");
+    }
+  }
+  return -1;
+}
+
+/* Convert a pointer value, signal an exception on a type mismatch */
+SWIGRUNTIME(void *)
+SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int argnum, int flags) {
+  void *result;
+  SWIG_Python_ConvertPtr(obj, &result, ty, flags | SWIG_POINTER_EXCEPTION);
+  return result;
+}
+
+/* Convert a packed value value */
+SWIGRUNTIME(int)
+SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, int sz, swig_type_info *ty, int flags) {
+  swig_type_info *tc;
+  char  *c = 0;
+
+  if ((!obj) || (!PyString_Check(obj))) goto type_error;
+  c = PyString_AsString(obj);
+  /* Pointer values must start with leading underscore */
+  if (*c != '_') goto type_error;
+  c++;
+  c = SWIG_UnpackData(c,ptr,sz);
+  if (ty) {
+    tc = SWIG_TypeCheck(c,ty);
+    if (!tc) goto type_error;
+  }
+  return 0;
+
+type_error:
+
+  if (flags) {
+    if (ty && c) {
+      char *temp = (char *) malloc(64+strlen(ty->name)+strlen(c));
+      sprintf(temp,"Type error. Got %s, expected %s", c, ty->name);
+      PyErr_SetString(PyExc_TypeError, temp);
+      free((char *) temp);
+    } else {
+      PyErr_SetString(PyExc_TypeError,"Expected a pointer");
+    }
+  }
+  return -1;
+}
+
+/* Create a new pointer object */
+SWIGRUNTIME(PyObject *)
+SWIG_Python_NewPointerObj(void *ptr, swig_type_info *type, int own) {
+  PyObject *robj;
+  if (!ptr) {
+    Py_INCREF(Py_None);
+    return Py_None;
+  }
+#ifdef SWIG_COBJECT_TYPES
+  robj = PyCObject_FromVoidPtrAndDesc((void *) ptr, (char *) type->name, NULL);
+#else
+  {
+    char result[1024];
+    char *r = result;
+    *(r++) = '_';
+    r = SWIG_PackData(r,&ptr,sizeof(void *));
+    strcpy(r,type->name);
+    robj = PyString_FromString(result);
+  }
+#endif
+  if (!robj || (robj == Py_None)) return robj;
+  if (type->clientdata) {
+    PyObject *inst;
+    PyObject *args = Py_BuildValue((char*)"(O)", robj);
+    Py_DECREF(robj);
+    inst = PyObject_CallObject((PyObject *) type->clientdata, args);
+    Py_DECREF(args);
+    if (inst) {
+      if (own) {
+        PyObject *n = PyInt_FromLong(1);
+        PyObject_SetAttrString(inst,(char*)"thisown",n);
+        Py_DECREF(n);
+      }
+      robj = inst;
+    }
+  }
+  return robj;
+}
+
+SWIGRUNTIME(PyObject *)
+SWIG_Python_NewPackedObj(void *ptr, int sz, swig_type_info *type) {
+  char result[1024];
+  char *r = result;
+  if ((2*sz + 1 + strlen(type->name)) > 1000) return 0;
+  *(r++) = '_';
+  r = SWIG_PackData(r,ptr,sz);
+  strcpy(r,type->name);
+  return PyString_FromString(result);
+}
+
+/* Install Constants */
+SWIGRUNTIME(void)
+SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) {
+  int i;
+  PyObject *obj;
+  for (i = 0; constants[i].type; i++) {
+    switch(constants[i].type) {
+    case SWIG_PY_INT:
+      obj = PyInt_FromLong(constants[i].lvalue);
+      break;
+    case SWIG_PY_FLOAT:
+      obj = PyFloat_FromDouble(constants[i].dvalue);
+      break;
+    case SWIG_PY_STRING:
+      obj = PyString_FromString((char *) constants[i].pvalue);
+      break;
+    case SWIG_PY_POINTER:
+      obj = SWIG_NewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0);
+      break;
+    case SWIG_PY_BINARY:
+      obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype));
+      break;
+    default:
+      obj = 0;
+      break;
+    }
+    if (obj) {
+      PyDict_SetItemString(d,constants[i].name,obj);
+      Py_DECREF(obj);
+    }
+  }
+}
+
+#endif
+
+/* Contract support */
+
+#define SWIG_contract_assert(expr, msg) if (!(expr)) { PyErr_SetString(PyExc_RuntimeError, (char *) msg ); goto fail; } else
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/* -------- TYPES TABLE (BEGIN) -------- */
+
+#define  SWIGTYPE_p_char swig_types[0] 
+static swig_type_info *swig_types[2];
+
+/* -------- TYPES TABLE (END) -------- */
+
+
+/*-----------------------------------------------
+              @(target):= _texbreaker.so
+  ------------------------------------------------*/
+#define SWIG_init    init_texbreaker
+
+#define SWIG_name    "_texbreaker"
+extern int texbreak(char []);
+extern char bufout[16*8192];
+#ifdef __cplusplus
+extern "C" {
+#endif
+static PyObject *_wrap_texbreak(PyObject *self, PyObject *args) {
+    PyObject *resultobj;
+    char *arg1 ;
+    int result;
+    
+    if(!PyArg_ParseTuple(args,(char *)"s:texbreak",&arg1)) goto fail;
+    result = (int)texbreak(arg1);
+    
+    resultobj = PyInt_FromLong((long)result);
+    return resultobj;
+    fail:
+    return NULL;
+}
+
+
+static int _wrap_bufout_set(PyObject *_val) {
+    {
+        char *temp = (char *) PyString_AsString(_val);
+        if (PyErr_Occurred()) {
+            PyErr_SetString(PyExc_TypeError, "C variable 'bufout (char *)'");
+            return 1;
+        }
+        strncpy(bufout,temp,16*8192);
+    }
+    return 0;
+}
+
+
+static PyObject *_wrap_bufout_get() {
+    PyObject *pyobj;
+    
+    pyobj = PyString_FromString(bufout);
+    return pyobj;
+}
+
+
+static PyMethodDef SwigMethods[] = {
+	 { (char *)"texbreak", _wrap_texbreak, METH_VARARGS },
+	 { NULL, NULL }
+};
+
+
+/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */
+
+static swig_type_info _swigt__p_char[] = {{"_p_char", 0, "char *", 0},{"_p_char"},{0}};
+
+static swig_type_info *swig_types_initial[] = {
+_swigt__p_char, 
+0
+};
+
+
+/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */
+
+static swig_const_info swig_const_table[] = {
+{0}};
+
+#ifdef __cplusplus
+}
+#endif
+
+#ifdef __cplusplus
+extern "C"
+#endif
+SWIGEXPORT(void) SWIG_init(void) {
+    static PyObject *SWIG_globals = 0; 
+    static int       typeinit = 0;
+    PyObject *m, *d;
+    int       i;
+    if (!SWIG_globals) SWIG_globals = SWIG_newvarlink();
+    m = Py_InitModule((char *) SWIG_name, SwigMethods);
+    d = PyModule_GetDict(m);
+    
+    if (!typeinit) {
+        for (i = 0; swig_types_initial[i]; i++) {
+            swig_types[i] = SWIG_TypeRegister(swig_types_initial[i]);
+        }
+        typeinit = 1;
+    }
+    SWIG_InstallConstants(d,swig_const_table);
+    
+    PyDict_SetItemString(d,(char*)"cvar", SWIG_globals);
+    SWIG_addvarlink(SWIG_globals,(char*)"bufout",_wrap_bufout_get, _wrap_bufout_set);
+}
+

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/useproto.h
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/useproto.h	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/useproto.h	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,43 @@
+
+/* released under the Modified BSD License */
+
+#ifndef _USEPROTO_H_
+#define _USEPROTO_H_ 1
+
+#if defined(SGIplatform)||defined(LINUXplatform)||defined(HPplatform) ||defined(RIOSplatform) ||defined(RIOS4platform) || defined(SUN4OS5platform)
+#ifdef _NO_PROTO
+#undef _NO_PROTO
+#endif
+#ifndef NeedFunctionPrototypes
+#define NeedFunctionPrototypes 1
+#endif
+#endif /*SGIplatform ... */
+
+
+#if defined(ALPHAplatform)
+#ifdef __STDC__
+
+#ifdef _NO_PROTO
+#undef _NO_PROTO
+#endif
+#ifndef NeedFunctionPrototypes
+#define NeedFunctionPrototypes 1
+#endif
+
+#else 
+
+#define _NO_PROTO
+#undef NeedFunctionPrototypes
+
+#endif
+#endif /* ALPHA */
+
+
+
+#ifdef SUNplatform
+#define _NO_PROTO
+#define const   
+#endif
+
+#endif /* _USEPROTO_H_ */
+ 

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/util.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/util.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/util.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,91 @@
+
+import sys
+from struct import pack, unpack
+
+## path to use as src prefix in img tag
+imagesPath = 'images/'
+# Actual location of images
+workingDir = sys.modules['__builtin__'].CLIENT_HOME + '/LatexWiki'
+# Default character size, if the user doesn't specify 
+defaultcharsizepx = 18
+
+imageExtension = '.png'
+
+def fileNameFor(latexCode, size, extension=''):
+    return '%s-%spx%s' %(abs(hash(latexCode)), size, extension)
+
+def getPngSize(fname,
+               magicBytes=pack('!BBBBBBBB', 137, 80, 78, 71, 13, 10, 26, 10)):
+    f = file(fname, 'r')
+    buf = f.read(24)
+    f.close()
+    assert buf[:8] == magicBytes, 'in getPngSize, file not a PNG!'
+    return tuple(map(int, unpack('!LL', buf[16:24])))
+
+def unique(s):
+     """Return a list of the elements in s, but without duplicates.
+
+     For example, unique([1,2,3,1,2,3]) is some permutation of [1,2,3],
+     unique("abcabc") some permutation of ["a", "b", "c"], and
+     unique(([1, 2], [2, 3], [1, 2])) some permutation of
+     [[2, 3], [1, 2]].
+
+     For best speed, all sequence elements should be hashable.  Then
+     unique() will usually work in linear time.
+
+     If not possible, the sequence elements should enjoy a total
+     ordering, and if list(s).sort() doesn't raise TypeError it's
+     assumed that they do enjoy a total ordering.  Then unique() will
+     usually work in O(N*log2(N)) time.
+
+     If that's not possible either, the sequence elements must support
+     equality-testing.  Then unique() will usually work in quadratic
+     time.
+     """
+
+     n = len(s)
+     if n == 0:
+         return []
+
+     # Try using a dict first, as that's the fastest and will usually
+     # work.  If it doesn't work, it will usually fail quickly, so it
+     # usually doesn't cost much to *try* it.  It requires that all the
+     # sequence elements be hashable, and support equality comparison.
+     u = {}
+     try:
+         for x in s:
+             u[x] = 1
+     except TypeError:
+         del u  # move on to the next method
+     else:
+         return u.keys()
+
+     # We can't hash all the elements.  Second fastest is to sort,
+     # which brings the equal elements together; then duplicates are
+     # easy to weed out in a single pass.
+     # NOTE:  Python's list.sort() was designed to be efficient in the
+     # presence of many duplicate elements.  This isn't true of all
+     # sort functions in all languages or libraries, so this approach
+     # is more effective in Python than it may be elsewhere.
+     try:
+         t = list(s)
+         t.sort()
+     except TypeError:
+         del t  # move on to the next method
+     else:
+         assert n > 0
+         last = t[0]
+         lasti = i = 1
+         while i < n:
+             if t[i] != last:
+                 t[lasti] = last = t[i]
+                 lasti += 1
+             i += 1
+         return t[:lasti]
+
+     # Brute force is all that's left.
+     u = []
+     for x in s:
+         if x not in u:
+             u.append(x)
+     return u

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/FrontPage.stxlatex
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/FrontPage.stxlatex	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/FrontPage.stxlatex	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,74 @@
+**Welcome!** 
+
+This is the front page of the LatexWiki wiki template.  
+Here are the HelpPage, RecentChanges, UserOptions and
+<a href="FrontPage/map">contents</a>.  
+
+You'll find additional Zwiki documentation at ZWiki:ZwikiDocs, including
+ZWiki:ReleaseNotes, ZWiki:KnownIssues and the ZWiki:ZwikiTracker.
+ZWiki:GeneralDiscussion and the #zope IRC channel are good places to get
+help.
+
+"Edit":FrontPage/editform this page and replace it with something
+appropriate. 
+Other things you may want to configure (or not):
+
+- **LaTeX fonts** <br/>
+LaTeX font size is configured in the 'properties' panel for this page's
+folder.  'latex_font_size' specifies the size in pixels of the LaTeX fonts,
+'latex_align_fudge' adjusts LaTeX equations up and down with respect to the
+surrounding text, and 'latex_res_fudge' adjusts the ghostscript resolution to
+improve LaTeX font appearance.  Combinations which work well are (18, 0, 0.97),
+(17, 0, 1.03), and (16, 0.5, 0.97).  Browser fonts can be adjusted on a per-user
+basis in UserOptions.
+
+- **Permissions** <br/>
+To view this wiki, users need 'View' and 'Access content information'
+permissions on the folder. To create new pages they need 'Add ZWiki Page'
+permission; to upload files, 'Add Documents, Images, and
+Files'. Permissions to add comments, edit, reparent etc. all begin with
+'Zwiki: ' and appear at the end of the permissions list.
+
+- **Mail out (subscription)** <br/>
+Set up a zope !MailHost object and add a 'mail_from' folder string property
+containing a valid From address.  A "subscribe" link will appear in the
+page footer. You may want to add the ZWiki:MailHostFix to make Bcc work.
+
+- **Mail in** <br/>
+You'll need to set up a special mail alias, a zope helper method, a
+default discussion page and 'mail_to'/'mail_replyto' folder
+properties. Users will be able to reply to comments by mail.
+See ZWiki:WikiMail.
+
+- **External (client-side) editing** <br/> 
+Install the ZWiki:ExternalEditor zope product and make sure users have the
+'Use external editor' permission (and the WebDAV lock/unlock permissions
+if you are using locking locking). EE's pencil icon will appear in the
+page footer.  Users will probably be able to edit pages with their
+preferred editor after installing EE's client helper app.
+
+- **A bug tracker** <br/>
+An issue tracking database integrated with the wiki. 
+See ZWiki:HowToInstallAZwikiTracker
+
+- **A more featureful front page** <br/>
+Eg showing latest comments from other pages.
+See ZWiki:FrontPage source for ideas
+
+- **Security** <br/>
+ If you allow untrusted users to edit your wiki, you should be aware of
+ the <a
+ href="http://www.zope.org/Members/jim/ZopeSecurity/ServerSideTrojan"
+ >server-side trojan issue</a>.  Unless carefully configured Zwiki may
+ allow users to create content (eg DTML or javascript) which will be
+ executed when viewed by others. For example, DTML code could delete other
+ zope objects to which it has access (restricted to the lowest of the page
+ owner and the page viewer's privileges).  Tips: make the wiki folder's
+ owner a low-privileged user, set the standard_page_type folder property
+ to a non-DTML page type, remove or disable editing on any DTML-enabled
+ pages, deny 'Zwiki: Change page types' permission.  Decide for yourself
+ whether these steps are necessary, or keeping backups will suffice, or <a
+ href="http://c2.com/cgi/wiki?YouArentGonnaNeedIt">YAGNI</a> applies.
+
+Enjoy your wiki!
+

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/HelpPage.stxlatex
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/HelpPage.stxlatex	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/HelpPage.stxlatex	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,179 @@
+This help page corresponds to Zwiki version 0.26.0.
+<dtml-var "'(This site is running '"><dtml-var zwiki_version><dtml-var "').'">
+Links beginning with "!ZWiki:..." lead to additional documentation on
+zwiki.org.
+
+"What's going on here ?":#whatisthis <br />
+"User interface":#ui <br />
+"Navigation":#navigation <br />
+"Subscription":#email <br />
+"Editing":#editing <br />
+"Formatting rules in a nutshell":#rules <br />
+"Finding out more":#more <br />
+
+<a name="whatisthis">What's going on here ?
+
+  This site is a wiki - a kind of collaborative website. (*wiki wiki* means quick.)
+  This site is running the Zwiki software - see ZWiki:WhatIsZwiki for more about that.
+
+  Wikis try to put as little as possible in the
+  way of people sharing useful content - often text, but also pictures and files.
+  Wikis are usually wide open and assume a cooperating community,
+  which in practice tends to work well.
+  Anyone can edit, add comments, and make new pages on the spot.
+  Like any medium, there are best practices which you'll discover in due course.
+
+  Intuitive naming and text formatting rules are used to simplify the process of
+  writing and linking pages.
+  The idea is to keep the text that people edit simple, so it's readable
+  as is, and, most importantly, editable by anyone, without sacrificing
+  attractive presentation.
+
+  Zwiki sites can also send out and receive comments and edits by email, 
+  effectively acting as a mail list where you can subscribe to topics of interest. 
+  If enabled, you'll see a "subscribe" link on each page.
+
+  For some basic definitions, try the ZWiki:ZwikiGlossary.
+
+<a name="ui">User interface
+
+  Zwiki's UI is quite customizable; the default interface with all permissions granted is described here.
+  (Currently, the major zwiki skins are "default":http://zwiki.org , 
+  "plone":http://plone.zwiki.org , and "commonplace":http://commonplacebook.org .)
+
+  If you see "full", "simple", "minimal" links, you can click them
+  to adjust the level of detail on screen.   Tip: if you can't
+  see one of the features described here, try clicking "full".
+  
+  You can set your user name, time zone and UI preferences in UserOptions ("preferences").
+
+<a name="navigation">Navigation
+
+  Each page in a wiki has a unique name, most often a WikiName - 
+  two or more capitalized words joined together
+  (Zwiki also allows trailing digits). 
+  When a page name appears in wiki text, it forms a link to that page.
+  If the page does not yet exist, a ? creation link will appear.
+
+  Pages may also have a [Free-form name],
+  which can be (almost) any word or phrase. 
+  Links which look like two wikinames joined by a colon lead to another site
+  (ZWiki:RemoteWikiLinks).
+
+  Zwiki additionally arranges pages in a hierarchy. You'll see this when browsing in full
+  mode.
+
+  - To return to the front page, click the site logo
+
+  - To see the page hierarchy, click "contents"
+
+  - To see an alphabetic index, click "index"
+
+  - To see recent activity in the wiki, click "changes"
+
+  - To see which pages link to this one, click the page title
+
+  - To see the recent edits to this page, click the "last edited by" link
+
+  - To jump to a known or semi-known page, enter the first part of it's name after the
+  last / in your browser's address field. Capitalization and spacing don't matter.
+
+  - To search the names and text of all pages, type in the search field and press enter
+
+  With a modern browser, you can use convenient quick-access keys 
+  (keyboard shortcuts) to navigate - see ZWiki:QuickReference.
+
+  See also ZWiki:HowToFindThings.
+
+<a name="email">Subscription
+
+  If you see a "subscribe" link, you can subscribe to this page or
+  the whole wiki to receive comments by mail, as follows: 
+
+  1. Click "subscribe"
+
+  2. if needed, enter your email address and click "Change"
+
+  3. click the button to toggle your page or wiki subscription status
+    (green means you are subscribed).
+
+  If configured by the site admin, subscribers may also send comments by mail.
+  Just reply to a comment, or send mail to the wiki's mail-in address.
+  Your mail will go to the page named in brackets in the subject
+  (or to a default page).
+
+<a name="editing"> Editing
+
+  You have full editing rights to any page, unless restricted by the site
+  admin. Note your comments may be received by many subscribers. To avoid
+  this, please use SandBox for testing.
+
+  - Add a comment using the form at the bottom of the page
+
+  - Click "edit" to change the page's text.
+    You may also be able to rename the page, upload a file, or choose other options here.
+  
+  - Create a new page by writing it's name on an existing page
+    (free-form names must be enclosed in brackets), 
+    then clicking the question mark which will appear beside it.
+
+  - In full mode, visit the backlinks screen to reparent the page
+    (place it in the hierarchy)
+
+  - After you have configured a user name, in full mode you may also use the 
+    page management form at the bottom of the screen to reparent, rename and delete pages. 
+
+
+<a name="rules"> 
+<table align="center" style="background-color:#eeeeff;border=thin black solid;padding=10;" width="75%" border=1><tr><td>
+
+Formatting rules in a nutshell
+
+   When you save a page, Zwiki normally applies standard ZWiki:TextFormattingRules - 
+   most often ZWiki:StructuredText, which is described here;
+   wiki linking rules; and some additional formatting for comments.
+
+   1. non-blank lines are run together to form a paragraph; 
+      paragraphs are separated by blank lines<br />
+
+   2. a one-line "paragraph" followed by a more-indented paragraph makes a
+      heading. Tip: you need only indent the first line.<br />
+
+   3. a paragraph beginning with - or a number followed by a space makes a bullet
+      or numbered list item; a more-indented list item starts a sub-list<br />
+
+   4. short text enclosed in 
+      &#42;...&#42; , 
+      &#42;&#42;...&#42;&#42; , 
+      &#95;...&#95; or 
+      &#39;...&#39; is *italic*, **bold**, _underlined_ or 'monospaced' respectively<br />
+
+   5. WikiName's, [Free-form name]s enclosed in brackets, ZWiki:RemoteWikiLinks , 
+      http://bare/urls , and "Structured Text links":http://zwiki.org/StructuredText are
+      made into hyperlinks
+
+   6. HTML tags may be added if necessary; on sites which permit it,
+      DTML (server-side code) may also be used <br />
+
+   7. short text enclosed in single quotes is quoted, ie
+      displayed in monospace font and protected from some of the above formatting. 
+      For reliable quoting of a body of text, indent it after a paragraph 
+      ending with a double colon ::
+
+       Like this (edit this page to see source).
+       This is the surest way to prevent WikiLinks, <HTML tags> and &dtml-tags;
+        and preserve
+         fixed-width formatting.
+
+   8. don't bother trying to learn all the text formatting rules and 
+      their interactions. Mimic the text around you;
+      when it does something unexpected, tweak it until it looks right; 
+      go to the docs or ask for help when you get really stuck or curious.
+
+</td></tr></table>
+
+<a name="more"> Finding out more
+
+  More about Zwiki: start at http://zwiki.org .
+
+  More about wiki in general: WikiWikiWeb:FrontPage , WikiWikiWeb:EvolutionOfaWikizen

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/LaTeX.stxlatex
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/LaTeX.stxlatex	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/LaTeX.stxlatex	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,85 @@
+LaTeX ... is the world standard for writing technical documents.  Authors in
+science and engineering are probably already familiar with it (or should be).
+If you've wrestled with and cursed at "equation editors", you will love LaTeX.
+
+What is most relevant for this site is *math*.  Citations are also under
+development (but this will be physics specific initially, for me), see my TODO.
+The following is borrowed from Winston Chang's "Latex cheat
+sheet":http://www.stdout.org/~winston/latex/.
+
+Math mode:
+
+  To use math mode in-line with text, surround the equation with &#36;, like
+  this !$x^2$ to make: $ x^2 $, or !\( x^2 \).  <br/>
+  To make a block equation use !\begin{equation} ...  \end{equation} like this:
+  \begin{equation}
+    x^2
+  \end{equation}
+  To make a block equation that is not numbered, use !\begin{equation*} ...
+  \end{equation*} or !\[ ... \] like this:
+  \begin{equation*}
+    x^2
+  \end{equation*}
+
+Basic constructs:
+
+\begin{tabular}{@{}l@{\hspace{1em}}l@{\hspace{2em}}l@{\hspace{1em}}l@{}}
+\verb!^{x}!             &  Superscript$^{x}$ &
+\verb!_{x}!             &  Subscript$_{x}$ \\
+\verb!\frac{x}{y}!      &  $\frac{x}{y}$ &
+\verb!\sum_{k=1}^n!     &  $\sum_{k=1}^n$ \\
+\verb!\sqrt[n]{x}!      &  $\sqrt[n]{x}$ &  \\
+\end{tabular}
+
+Math-mode symbols (this is a subset):
+
+\begin{tabular}{@{}l@{\hspace{1em}}l@{\hspace{2em}}l@{\hspace{1em}}l@{\hspace{2em}}l@{\hspace{1em}}l@{}}
+$\leq$          &  \verb!\leq!  &
+$\geq$          &  \verb!\geq!  &
+$\neq$          &  \verb!\neq!  \\
+$\cdot$         &  \verb!\cdot!  &
+$\times$        &  \verb!\times!  &
+$\div$          &  \verb!\div!  \\
+$\ast$          &  \verb!\ast!  &
+$\circ$         &  \verb!\circ!  &
+$\cdots$        &  \verb!\cdots!  \\
+$\alpha$        &  \verb!\alpha!  &
+$\beta$         &  \verb!\beta!  &
+$\gamma$        &  \verb!\gamma!  \\
+$\delta$        &  \verb!\delta!  &
+$\epsilon$      &  \verb!\epsilon!  &
+$\varepsilon$   &  \verb!\varepsilon!  \\
+$\zeta$         &  \verb!\zeta!  &
+$\eta$          &  \verb!\eta!  &
+$\theta$        &  \verb!\theta!  \\
+$\vartheta$     &  \verb!\vartheta!  &
+$\iota$         &  \verb!\iota!  &
+$\kappa$        &  \verb!\kappa!  \\
+$\lambda$       &  \verb!\lambda!  &
+$\mu$           &  \verb!\mu!  &
+$\nu$           &  \verb!\nu!  \\
+$\xi$           &  \verb!\xi!  &
+$\pi$           &  \verb!\pi!  &
+$\rho$          &  \verb!\rho!  \\
+$\sigma$        &  \verb!\sigma!  &
+$\tau$          &  \verb!\tau!  &
+$\upsilon$      &  \verb!\upsilon!  \\
+$\phi$          &  \verb!\phi!  &
+$\chi$          &  \verb!\chi!  &
+$\psi$          &  \verb!\psi!  \\
+$\omega$        &  \verb!\omega!  &
+$\Gamma$        &  \verb!\Gamma!  &
+$\Delta$        &  \verb!\Delta!  \\
+$\Theta$        &  \verb!\Theta!  &
+$\Lambda$       &  \verb!\Lambda!  &
+$\Xi$           &  \verb!\Xi!  \\
+$\Pi$           &  \verb!\Pi!  &
+$\Sigma$        &  \verb!\Sigma!  &
+$\Upsilon$      &  \verb!\Upsilon!  \\
+$\Phi$          &  \verb!\Phi!  &
+$\Psi$          &  \verb!\Psi!  &
+$\Omega$        &  \verb!\Omega!  \\
+\end{tabular}
+
+Any other LaTeX environments work as well including array, tabular (the above
+is tabular), and will be presented in HTML as an un-numbered block.

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/LatexTemplate.txt
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/LatexTemplate.txt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/LatexTemplate.txt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,13 @@
+%% This file is used as a python printf() string.  As such, the document we are
+%% trying to render is placed at the location of the percent-s below, and any
+%% comments in this file must be preceeded by TWO percent signs.
+
+\documentclass[10pt,notitlepage]{article}
+\usepackage{amsmath}
+\usepackage{amsfonts}
+\usepackage[all]{xy}
+\newenvironment{latex}{}{}
+\begin{document}
+\pagestyle{empty}
+%s
+\end{document}

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/UserOptions.stxlatex
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/UserOptions.stxlatex	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/UserOptions.stxlatex	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,305 @@
+<p>
+  Set your site preferences below. You may also click the full, simple, minimal 
+  links if provided.
+</p>
+
+<dtml-comment>with REQUEST needed in plone/cmf for some reason I can't fathom
+</dtml-comment>
+<dtml-with REQUEST>
+<dtml-let 
+ RESPONSE="REQUEST.RESPONSE"
+ cookielist="[
+   'zwiki_username',
+   'email',
+   'zwiki_height',
+   'zwiki_width',
+   'zwiki_timezone',
+   'zwiki_showlogo',
+   'zwiki_showsearch',
+   'zwiki_showhierarchy',
+   'zwiki_showpagemgmt',
+   'zwiki_displaymode',
+   'latexwiki_font',
+   'latexwiki_fontadjust',
+   ]
+   #multi-skin setup, see ZwikiSkins
+   #'skin',
+   #'zwiki_theme',
+   #]
+   ">
+<dtml-if setcookies>
+<dtml-let e="(ZopeTime() + 365).rfc822()">
+<dtml-in cookielist prefix=x>
+<dtml-if "_.has_key(x_sequence_item)">
+<dtml-call "RESPONSE.setCookie(x_sequence_item, REQUEST.get(x_sequence_item), 
+                               path='/', expires=e)">
+<dtml-comment>use path=wiki_url() if you want per-wiki cookies</dtml-comment>
+</dtml-if>
+</dtml-in>
+</dtml-let>
+<dtml-call "RESPONSE.redirect(REQUEST.get('redirectURL',pageUrl()))">
+<dtml-elif clearcookies>
+<dtml-in "cookielist+['zwiki_bookmarks','zwiki_showquote']" prefix=x>
+<dtml-call "RESPONSE.expireCookie(x_sequence_item,path='/')">
+</dtml-in>
+<dtml-comment>reload page to get a REQUEST with the new cookie values
+</dtml-comment>
+<dtml-call "RESPONSE.redirect(REQUEST.get('redirectURL',pageUrl()))">
+</dtml-if>
+</dtml-let>
+<form action="&dtml-URL;" METHOD="POST" ENCTYPE="multipart/form-data"
+style="border:none;">
+
+<p>
+User name: <input type="text" name="zwiki_username" size=20
+maxlength=20 tabindex=3 value="<dtml-var zwiki_username missing>">
+(identifies your edits)
+
+<p>
+Email address: <input type="text" name="email" size=20 maxlength=40 tabindex=4
+value="<dtml-var email missing>"> 
+(for subscribing)
+
+<p>
+Editform
+width: <input type="text" name="zwiki_width" size=3 maxlength=3 tabindex=1
+value="<dtml-var zwiki_width missing=60>"> 
+height: <input type="text" name="zwiki_height" size=3 maxlength=3 tabindex=2
+value="<dtml-var zwiki_height missing=20>">
+(textarea dimensions; width will be 100% if supported)
+
+<p>
+Time zone: 
+<dtml-let 
+now=ZopeTime
+timezones="(
+'GMT-1100',
+'GMT-1030',
+'GMT-1000',
+'GMT-0930',
+'GMT-0900',
+'GMT-0830',
+'GMT-0800',
+'GMT-0730',
+'GMT-0700',
+'GMT-0630',
+'GMT-0600',
+'GMT-0530',
+'GMT-0500',
+'GMT-0430',
+'GMT-0400',
+'GMT-0330',
+'GMT-0300',
+'GMT-0230',
+'GMT-0200',
+'GMT-0130',
+'GMT-0100',
+'GMT',
+'GMT+0100',
+'GMT+0130',
+'GMT+0200',
+'GMT+0230',
+'GMT+0300',
+'GMT+0330',
+'GMT+0400',
+'GMT+0430',
+'GMT+0500',
+'GMT+0530',
+'GMT+0600',
+'GMT+0630',
+'GMT+0700',
+'GMT+0730',
+'GMT+0800',
+'GMT+0830',
+'GMT+0900',
+'GMT+0930',
+'GMT+1000',
+'GMT+1030',
+'GMT+1100',
+'GMT+1130',
+'GMT+1200',
+'GMT+1230',
+'GMT+1300',
+)"
+userzone="REQUEST.get('zwiki_timezone',None)"
+userzone="((userzone in timezones) and userzone) or 'GMT'"
+>
+Your local time is 
+<select name="zwiki_timezone" tabindex=5>
+<dtml-in timezones prefix=x>
+<option value="&dtml-x_sequence_item;"
+<dtml-if "userzone == x_sequence_item">selected</dtml-if>
+>
+<dtml-comment>cf IssueNo0595
+<dtml-try><dtml-var "now.toZone(x_sequence_item).ISO()"><dtml-except></dtml-try> 
+</dtml-comment>
+<dtml-var "now.toZone(x_sequence_item).ISO()">
+ (&dtml-x_sequence_item;)
+</dtml-in>
+</select>
+(localizes most times)
+</dtml-let>
+
+<dtml-comment>
+<p>
+Bookmarks: 
+<input type="text" name="zwiki_bookmarks" size=60 maxlength=1000 tabindex=6
+value="<dtml-var zwiki_bookmarks html_quote 
+missing="">">
+<br />
+(appear in footer; konqueror users, separate your bookmarks with , not space)
+</dtml-comment>
+
+<p>
+Show logo ? 
+<select name="zwiki_showlogo" tabindex=10>
+  <option value="">No</option>
+  <option value="1" 
+  <dtml-if "REQUEST.get('zwiki_showlogo',1)">selected</dtml-if>
+  >Yes</option>
+</select>
+
+<p>
+Show page hierarchy ?
+<select name="zwiki_showhierarchy" tabindex=7>
+  <option value="">No</option>
+  <option value="1" 
+  <dtml-if zwiki_showhierarchy>selected</dtml-if>
+  >Yes</option>
+</select>
+(This wiki keeps a page hierarchy, which you can use or ignore.)
+
+<p>
+Show search field ? (except in minimal mode)
+<select name="zwiki_showsearch" tabindex=8>
+  <option value="">No</option>
+  <option value="1" 
+  <dtml-if "REQUEST.get('zwiki_showsearch',1)">selected</dtml-if>
+  >Yes</option>
+</select>
+
+<dtml-comment>
+<p>
+Show AnnoyingQuote ? (in full mode)
+<select name="zwiki_showquote" tabindex=9>
+  <option value="">No</option>
+  <option value="1" 
+  <dtml-if "REQUEST.get('zwiki_showquote',1)">selected</dtml-if>
+  >Yes</option>
+</select>
+</dtml-comment>
+
+<p>
+Show page management form ? (in full mode)
+<select name="zwiki_showpagemgmt" tabindex=10>
+  <option value="">No</option>
+  <option value="1" 
+  <dtml-if "REQUEST.get('zwiki_showpagemgmt',1)">selected</dtml-if>
+  >Yes</option>
+</select>
+(You must also configure a username or be logged in.)
+
+<dtml-let fontadj="_.int(REQUEST.get('latexwiki_fontadjust',0))" 
+          fontsize="latex_font_size">
+Font: <input type="text" name="latexwiki_font" size=30
+value="<dtml-var latexwiki_font missing="serif">">
+(site administrator has chosen a !LaTeX font-size of 
+<dtml-var expr="latex_font_size">px)<br/>
+Font size adjustment: <input type="text" name="latexwiki_fontadjust" 
+                             value="<dtml-var latexwiki_fontadjust missing=0>" size=2>px
+<table border=1>
+<tr><th></th><th>Upper Case</th><th>Lower Case</th></tr>
+<tr>
+<td> Are browser roman and italic letters the same height?  </td>
+<td> <div style="font-family:<dtml-var latexwiki_font missing="serif">; 
+                 font-size:<dtml-var expr="fontsize+fontadj">px;">
+X<i>X</i>
+</div> </td>
+<td> <div style="font-family:<dtml-var latexwiki_font missing="serif">; 
+                 font-size:<dtml-var expr="fontsize+fontadj">px;">
+x<i>x</i>
+</div> </td>
+</tr><tr>
+<td> Are Roman browser and !LaTeX letters the same height, and similar looking? </td>
+<td> <div style="font-family:<dtml-var latexwiki_font missing="serif">; 
+                 font-size:<dtml-var expr="fontsize+fontadj">px;">
+X$\rm X$
+</div> </td>
+<td> <div style="font-family:<dtml-var latexwiki_font missing="serif">; 
+                 font-size:<dtml-var expr="fontsize+fontadj">px;">
+x$\rm x$
+</div> </td>
+</tr> <tr>
+<td> Are Roman browser and !LaTeX letters the same height, and similar looking? </td>
+<td> <div style="font-family:<dtml-var latexwiki_font missing="serif">; 
+                 font-size:<dtml-var expr="fontsize+fontadj">px;">
+<i>X</i>$X$
+</div> </td>
+<td> <div style="font-family:<dtml-var latexwiki_font missing="serif">; 
+                 font-size:<dtml-var expr="fontsize+fontadj">px;">
+<i>x</i>$x$
+</div> </td>
+</tr>
+</tr> <tr>
+<td> Are !LaTeX superscript/subscript fonts readable? </td>
+<td> $\scriptstyle X$$\scriptstyle Z$ </td>
+<td> $\scriptstyle x$$\scriptstyle z$ </td>
+</tr> <tr>
+<td> Are !LaTeX superscript-superscript/subscript-subscript fonts readable? </td>
+<td> $\scriptscriptstyle X$$\scriptscriptstyle Z$ </td>
+<td> $\scriptscriptstyle x$$\scriptscriptstyle z$ </td>
+</tr>
+</table>
+</dtml-let>
+
+<dtml-comment>see http://zwiki.org/ZwikiSkins
+<p>
+Use which zwiki skin ?
+<select name="skin" tabindex=11>
+<dtml-let skins="[
+  'default',
+  'commonplace',
+  'wikipagex',
+  ]">
+<dtml-in skins prefix=x>
+<option value="&dtml-x_sequence_item;"
+<dtml-if "REQUEST.get('skin','default') == x_sequence_item">selected</dtml-if>
+>
+&dtml-x_sequence_item;
+</dtml-in>
+</dtml-let>
+</select>
+(Skins other than default may have problems. Commonplace is slow on this site.)
+
+<p>
+Use which theme with the commonplace skin ?
+<select name="zwiki_theme" tabindex=12>
+<dtml-let themes="[
+  'arcadian.css',
+  'default.css',
+  'earthy.css',
+  'sensible.css',
+  'tide.css',
+  'zettai.css',
+  ]">
+<dtml-in themes prefix=x>
+<option value="&dtml-x_sequence_item;"
+<dtml-if "REQUEST.get('zwiki_theme','default.css') == x_sequence_item">selected</dtml-if>
+>
+&dtml-x_sequence_item;
+</dtml-in>
+</dtml-let>
+</select>
+</dtml-comment>
+
+<div align="right"> 
+<b><input type="submit" name="setcookies" value="Save options" tabindex=13
+style="font-weight:bold"></b>
+<input type="submit" name="clearcookies" value="Forget options"
+tabindex=14> 
+</div>
+<input type="hidden" name="zwiki_displaymode" 
+value="<dtml-var zwiki_displaymode missing=simple>">
+
+</form>
+</dtml-with>

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/WikiWikiWeb.stxlatex
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/WikiWikiWeb.stxlatex	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/WikiWikiWeb.stxlatex	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,7 @@
+The WikiWikiWeb is the original and still one of the largest and most
+active wikis. It contains a wealth of information about wiki and many
+other things.
+
+WikiWikiWeb:FrontPage
+
+RemoteWikiURL: http://c2.com/cgi/wiki? 

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/ZWiki.stxlatex
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/ZWiki.stxlatex	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/ZWiki.stxlatex	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,9 @@
+Zwiki is the software which drives this wiki site.  
+It has been developed by "Joyful Systems":http://joyful.com and
+"contributors":http://zwiki.org/ZWikiContributors around the world, and is
+available under the GPL. For more information, see http://zwiki.org .
+
+Zwiki is inspired by the original WikiWikiWeb and powered by the
+"Zope":http://zope.org web application server. 
+
+RemoteWikiURL: http://zwiki.org/

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/blank.gif.gif
===================================================================
(Binary files differ)


Property changes on: zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/blank.gif.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/index_html.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/index_html.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/index_html.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,2 @@
+<dtml-call "RESPONSE.redirect(_['URL1'] + '/FrontPage')">
+

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/latexwiki.css.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/latexwiki.css.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/latexwiki.css.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,357 @@
+<dtml-let fontadj="_.int(REQUEST.get('latexwiki_fontadjust',0))+2" 
+          fontsize="latex_font_size">
+<dtml-comment>
+We're in trouble if someone sets up a ZWiki site without a FrontPage
+this check is essentially acting as Plone detection
+</dtml-comment>
+<dtml-if "_.hasattr(this(), 'FrontPage' )">
+ at import url("FrontPage/stylesheet");
+<dtml-else>
+</dtml-if>
+img.equation { 
+    behavior: url("pngbehavior.htc"); /* IE PNG Transparancy fix */
+    vertical-align: middle; 
+    border: 0px;
+}
+.latexwiki { 
+  font-family: <dtml-var latexwiki_font missing="serif">;
+    font-size: <dtml-var expr="fontsize+fontadj">px;
+}
+.latexwiki * {
+  font-family: <dtml-var latexwiki_font missing="serif">;
+  /* Don't change size of child elements so they're relative to font-size for .latexwiki */
+}
+.latexwiki input,
+.latexwiki select {
+  font-family: sans-serif;
+}
+.latexwiki code,
+.latexwiki pre {
+  font-family: monospace;
+    font-size: 85%;
+}
+/* #axiomlabel { position:absolute; right:5em; font-size:85%; } */
+/* #axiomlabel { 
+    position:relative; 
+    right:-0.8em; 
+    top:-1.1em; 
+    font-size:85%; 
+    color: #446644;
+    font-family: monospace;
+} */
+#axiomlabel {
+    position:relative; 
+    right:-0.8em; 
+    font-size:85%; 
+    color: #446644;
+    font-family: monospace;
+}
+/* #axiomcode { white-space:pre; background-color: lightgreen; font-family: monospace; font-size:85% } */
+#axiomcode {                         
+    background-color: lightgreen; 
+    font-family: monospace; 
+    font-size:85% 
+}   
+/* #axiomcode pre { background-color: lightgreen; font-family: monospace; font-size:85% } */
+#axiomcode pre {
+    background-color: lightgreen; 
+    font-family: monospace; 
+    font-size:85%;
+    padding-top: 0.15em;
+}
+/* #reducelabel { position:absolute; right:5em; font-size:85%; } */
+#reducelabel { 
+    position:relative; 
+    right:-0.8em; 
+    top:-1.1em; 
+    font-size:85%; 
+    color: #446644;
+    font-family: monospace;
+}
+#reducecode { white-space:pre; background-color: lightpink; font-family: monospace; font-size:85% }
+#reducecode pre { background-color: lightpink; font-family: monospace; font-size:85% }
+
+/**************************** MathML stuff below *****************************/
+
+math ci { color: #FF0000; font-style: italic;}
+
+math, math[mode="inline"] {
+  display: inline;
+  font-family: <dtml-var latexwiki_font missing="serif">;
+  font-style: normal;
+}
+
+math[mode="display"] {
+  display: block;
+  text-align: center;
+  font-family: <dtml-var latexwiki_font missing="serif">;
+  font-style: normal;
+}
+
+</dtml-let>
+
+ at media screen {  /* hide from old browsers */
+
+
+/* Rules dealing with the various values of the "mathvariant" attribute: */
+
+math *.[mathvariant="normal"] {
+  font-family: "Nimbus Roman No9 L", "Times New Roman", Courier, Garamond, serif;
+  font-weight: normal;
+  font-style: normal;
+}
+
+math *.[mathvariant="bold"] {
+  font-family: "Nimbus Roman No9 L", "Times New Roman", Courier, Garamond, serif;
+  font-weight: bold;
+  font-style: normal;
+}
+
+math *.[mathvariant="italic"] {
+  font-family: "Nimbus Roman No9 L", "Times New Roman", Courier, Garamond, serif;
+  font-weight: normal;
+  font-style: italic;
+}
+
+math *.[mathvariant="bold-italic"] {
+  font-family: "Nimbus Roman No9 L", "Times New Roman", Courier, Garamond, serif;
+  font-weight: bold;
+  font-style: italic;
+}
+
+math *.[mathvariant="double-struck"] {
+  font-family: msbm;
+  font-weight: normal;
+  font-style: normal;
+}
+
+math *.[mathvariant="script"] {
+  font-family: eusb;
+  font-weight: normal;
+  font-style: normal;
+}
+
+math *.[mathvariant="bold-script"] {
+  font-family: eusb;
+  font-weight: bold;
+  font-style: normal;
+}
+
+math *.[mathvariant="fraktur"] {
+  font-family: eufm;
+  font-weight: normal;
+  font-style: normal;
+}
+
+math *.[mathvariant="bold-fraktur"] {
+  font-family: eufm;
+  font-weight: bold;
+  font-style: italic;
+}
+
+math *.[mathvariant="sans-serif"] {
+  font-family: "Nimbus Sans L", Arial, "Lucida Sans Unicode", Verdana, sans-serif;
+  font-weight: normal;
+  font-style: normal;
+}
+
+math *.[mathvariant="bold-sans-serif"] {
+  font-family: "Nimbus Sans L", Arial, "Lucida Sans Unicode", Verdana, sans-serif;
+  font-weight: bold;
+  font-style: normal;
+}
+
+math *.[mathvariant="sans-serif-italic"] {
+  font-family: "Nimbus Sans L", Arial, "Lucida Sans Unicode", Verdana, sans-serif;
+  font-weight: normal;
+  font-style: italic;
+}
+
+math *.[mathvariant="sans-serif-bold-italic"] {
+  font-family: "Nimbus Sans L", Arial, "Lucida Sans Unicode", Verdana, sans-serif;
+  font-weight: bold;
+  font-style: italic;
+}
+
+math *.[mathvariant="monospace"] {
+  font-family: monospace
+}
+
+
+/* Rules dealing with "mathsize" attribute */
+
+math *.[mathsize="small"] {
+  font-size: 80%
+}
+
+math *.[mathsize="normal"] {
+/*  font-size: 100%  - which is unnecessary */
+}
+
+math *.[mathsize="big"] {
+  font-size:  125%
+}
+
+/*Set size values for the "base" children of script and limit schema to 
+  distinguish them from the script or limit children:
+*/
+
+msub>*:first-child[mathsize="big"],
+msup>*:first-child[mathsize="big"],
+msubsup>*:first-child[mathsize="big"],
+munder>*:first-child[mathsize="big"],
+mover>*:first-child[mathsize="big"],
+munderover>*:first-child[mathsize="big"],
+mmultiscripts>*:first-child[mathsize="big"],
+mroot>*:first-child[mathsize="big"] {
+  font-size: 125%
+}
+
+msub>*:first-child[mathsize="small"],
+msup>*:first-child[mathsize="small"],
+msubsup>*:first-child[mathsize="small"],
+munder>*:first-child[mathsize="small"],
+mover>*:first-child[mathsize="small"],
+munderover>*:first-child[mathsize="small"],
+mmultiscripts>*:first-child[mathsize="small"],
+mroot>*:first-child[mathsize="small"] {
+  font-size: 80%
+}
+
+msub>*:first-child,
+msup>*:first-child,
+msubsup>*:first-child,
+munder>*:first-child,
+mover>*:first-child,
+munderover>*:first-child,
+mmultiscripts>*:first-child,
+mroot>*:first-child {
+  font-size: 100%
+}
+
+/*Set size values for the other children of script and limit schema (the 
+  script and limit children) - include scriptlevel increment attribute?
+*/
+
+msub>*[mathsize="big"],
+msup>*[mathsize="big"],
+msubsup>*[mathsize="big"],
+munder>*[mathsize="big"],
+mover>*[mathsize="big"],
+munderover>*[mathsize="big"],
+mmultiscripts>*[mathsize="big"],
+math[display="inline"] mfrac>*[mathsize="big"],
+math *[scriptlevel="+1"][mathsize="big"] {
+  font-size: 89%  /* (.71 times 1.25) */
+}
+
+msub>* [mathsize="small"],
+msup>*[mathsize="small"],
+msubsup>*[mathsize="small"],
+munder>*[mathsize="small"],
+mover>*[mathsize="small"],
+munderover>*[mathsize="small"],
+mmultiscripts>*[mathsize="small"],
+math[display="inline"] mfrac>*[mathsize="small"],
+math *[scriptlevel="+1"][mathsize="small"] {
+  font-size: 57% /* (.71 times .80) */
+}
+
+msub>*,
+msup>*,
+msubsup>*,
+munder>*,
+mover>*,
+munderover>*,
+mmultiscripts>*,
+math[display="inline"] mfrac>*,
+math *[scriptlevel="+1"] {
+  font-size: 71%
+}
+
+mroot>*[mathsize="big"] {
+  font-size: 62%  /* (.50 times 1.25) */
+}
+
+mroot>*[mathsize="small"] {
+  font-size: 40% /* (.50 times .80) */
+}
+
+mroot>* {
+  font-size: 50%
+}
+
+/* Set size values for other scriptlevel increment attributes  */
+
+math *[scriptlevel="+2"][mathsize="big"] {
+  font-size: 63%  /* (.71 times .71 times 1.25) */
+}
+
+math *[scriptlevel="+2"][mathsize="small"] {
+  font-size: 36% /* (.71 times .71 times .71) */
+}
+
+math *[scriptlevel="+2"] {
+  font-size: 50%   /* .71 times .71 */
+}
+
+math *.[mathcolor="green"] {
+  color: green
+}
+
+math *.[mathcolor="black"] {
+  color: black
+}
+
+math *.[mathcolor="red"] {
+  color: red
+}
+
+math *.[mathcolor="blue"] {
+  color: blue
+}
+
+math *.[mathcolor="olive"] {
+   color: olive
+}
+
+math *.[mathcolor="purple"] {
+   color: purple
+}
+
+math *.[mathcolor="teal"] {
+   color: teal
+}
+
+math *.[mathcolor="aqua"] {
+   color: aqua
+}
+
+math *.[mathcolor="gray"] {
+   color: gray
+}
+
+math *.[mathbackground="blue"] {
+   background-color: blue
+}
+
+math *.[mathbackground="green"] {
+   background-color: green
+}
+
+math *.[mathbackground="white"] {
+   background-color: white
+}
+
+math *.[mathbackground="yellow"] {
+   background-color: yellow
+}
+
+math *.[mathbackground="aqua"] {
+   background-color: aqua
+}
+
+} /* Close "@media screen" scope */
+
+ at media aural {  
+}

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/pngbehavior.htc.zexp
===================================================================
(Binary files differ)


Property changes on: zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/pngbehavior.htc.zexp
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/setup_latexwiki.zexp
===================================================================
(Binary files differ)


Property changes on: zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/setup_latexwiki.zexp
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/site_logo.png
===================================================================
(Binary files differ)


Property changes on: zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/site_logo.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/standard_error_message.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/standard_error_message.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/mathaction/wikis/mathaction/standard_error_message.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,52 @@
+<dtml-if "error_type=='NotFound'">
+<dtml-comment>
+A custom error handler. This handles NotFound errors (only) by
+redirecting to a similarly-named existing page if possible, 
+otherwise offering create/search buttons.
+Works with either the skin-based searchwiki form or a SearchPage page.
+Assumes at least one zwiki page exists.
+</dtml-comment>
+<dtml-let 
+ here="objectValues(spec='ZWiki Page')[0]"
+ here="here.defaultPage()"
+ pagename="'SearchPage'"
+ skinname="'searchwiki'"
+ searchpage="here.pageWithName(pagename)"
+ searchpagehasdtml="searchpage and searchpage.dtmlAllowed() and searchpage.hasDynamicContent()"
+ searchurl="(searchpagehasdtml and searchpage.pageUrl()) or here.pageUrl()+'/'+skinname"
+ path="URL[_.len(SERVER_URL):]"
+ searchexpr="_.string.split(path,'/')[-1]"
+ targetpage="here.pageWithFuzzyName(searchexpr,url_quoted=1,
+                                    allow_partial=1,ignore_case=1) or
+             here.pageWithId(searchexpr,ignore_case=1)"
+ targeturl="(targetpage and targetpage.page_url()) or None"
+ >
+<dtml-if targeturl>
+<dtml-call "RESPONSE.redirect(targeturl,lock=1)">
+<dtml-else>
+<html>
+  <head><meta name="robots" content="noindex,nofollow"></head>
+  <body>
+    <p>
+      I could not find any likely page matching 
+      "<b><dtml-var "here.urlunquote(searchexpr)"></b>"
+    </p>
+    <p>
+      Click here to 
+      <form action="<dtml-var "here.page_url()">/editform"
+            method="GET" enctype="multipart/form-data">
+        <input type="hidden" name="page" value="&dtml-searchexpr;">
+        <input type="submit" value="create this page">
+      </form>
+      <form action="&dtml-searchurl;"
+            method="GET" enctype="multipart/form-data">
+        <input type="hidden" name="expr" value="&dtml-searchexpr;">
+        <input type="submit" value="search for it">
+      </form>
+      or visit the <a href="&dtml-URL1;">front page</a>.
+    </p>
+  </body>
+</html>
+</dtml-if>
+</dtml-let>
+</dtml-if>

Added: zope-zwiki/branches/upstream/current/plugins/rating/__init__.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/rating/__init__.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/rating/__init__.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1 @@
+import rating

Added: zope-zwiki/branches/upstream/current/plugins/rating/rating.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/rating/rating.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/rating/rating.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,190 @@
+# page rating support mixin
+
+import string, re
+#from types import *
+#from urllib import quote, unquote
+
+from AccessControl import ClassSecurityInfo
+from Globals import InitializeClass
+
+from Products.ZWiki.plugins import registerPlugin
+from Products.ZWiki.Defaults import registerPageMetaData
+from Products.ZWiki import Permissions
+from Products.ZWiki.Utils import BLATHER
+from Products.ZWiki.Views import loadPageTemplate, TEMPLATES
+
+TEMPLATES['ratingform'] = loadPageTemplate('ratingform','plugins/rating')
+
+RATING_METADATA = [
+    'voteCount',
+    'rating',
+    ]
+for a in RATING_METADATA: registerPageMetaData(a)
+
+
+class PluginRating:
+    """
+    I am a mixin that manages a numeric rating based on user votes.
+
+    Votes are stored as a dictionary keyed by username/ip address.
+    A user can change their vote by re-voting, or cancel their vote.
+
+    In theory at least, votes are strings.  The rating method interprets
+    votes as numbers and returns the average.
+    """
+    security = ClassSecurityInfo()
+
+    _votes = None # not {}, it would be shared
+
+    security.declarePrivate('votes')
+    def votes(self):
+        """Private accessor."""
+        self = getattr(self,'aq_base',self)
+        return self._votes or {}
+
+    security.declarePrivate('setVotes')
+    def setVotes(self,votes):
+        """Private accessor."""
+        self = getattr(self,'aq_base',self)
+        self._votes = votes
+        
+    security.declarePrivate('resetVotes')
+    def resetVotes(self):
+        """Private accessor."""
+        self.setVotes({})
+
+    security.declarePublic('numericVotes') # XXX better name ?
+    def numericVotes(self):
+        """Get just the numeric votes without the usernames."""
+        return self.votes().values()
+
+    # api methods
+    
+    security.declareProtected(Permissions.Rate, 'vote')
+    def vote(self,vote=None,REQUEST=None):
+        """
+        Record a user's vote for this page (or unrecord it).
+
+        To help build robust image-button forms, if vote is None, also
+        look for form values named like vote0, vote1.. voteN and use N.
+        """
+        username = self.usernameFrom(REQUEST)
+        if username:
+            votes = self.votes()
+            if vote == None:
+                # look for a form input named voteN and get N
+                # depending on browser, there will also be
+                # voteN.x and voteN.y, or only these
+                if REQUEST:
+                    votefields = [k for k in REQUEST.form.keys()
+                                  if k.startswith('vote')]
+                    if votefields:
+                        vote = votefields[0][4:]
+                        vote = re.sub(r'\.[xy]$','',vote)
+            if vote == None:
+                try:
+                    del votes[username]
+                    BLATHER("%s: removed %s's vote" % (self.pageName(),username))
+                except KeyError: pass
+            else:
+                votes[username] = vote
+                BLATHER("%s: recorded %s vote for %s" % (self.pageName(),vote,username))
+            self.setVotes(votes)
+            self.index_object() # XXX only need update votes fields
+            if REQUEST:
+                REQUEST.RESPONSE.redirect(
+                    # redirect to the page they came on.. might be some
+                    # other page, eg a list of rated pages. Is this robust ?
+                    #REQUEST.URL1
+                    REQUEST.HTTP_REFERER
+                    )
+
+    security.declareProtected(Permissions.Rate, 'unvote')
+    def unvote(self,REQUEST=None):
+        """
+        Unrecord a user's vote for this page.
+        """
+        return self.vote(None,REQUEST)
+
+    security.declareProtected(Permissions.View, 'voteCount')
+    def voteCount(self):
+        """
+        How many users have voted on this page since last reset ?
+        """
+        return len(self.votes())
+
+    security.declareProtected(Permissions.View, 'hasVotes')
+    def hasVotes(self): return self.voteCount() > 0
+        
+    security.declareProtected(Permissions.View, 'myVote')
+    def myVote(self,REQUEST=None):
+        """
+        What is the current user's recorded vote for this page ? 
+
+        Returns a string or None.
+        """
+        return self.votes().get(self.usernameFrom(REQUEST),None)
+
+    security.declareProtected(Permissions.View, 'myVotes')
+    def myVotes(self,REQUEST=None):
+        """
+        What votes have I recorded throughout the wiki ?
+
+        Returns a dictionary of page name:vote string pairs.
+        """
+        REQUEST = REQUEST or self.REQUEST
+        username = self.usernameFrom(REQUEST)
+        d = {}
+        d.update(
+            [(p.pageName(), p.votes().get(username,None))
+             for p in self.pageObjects()
+             if username in p.votes().keys()])
+        return d
+
+    # XXX
+    security.declareProtected(Permissions.View, 'myvotes')
+    def myvotes(self):
+        """
+        A temporary web view for the above. 
+        """
+        votes = self.myVotes()
+        return '<pre>%s</pre>' % (
+            ''.join(['%2s %s\n' % (votes[p], self.renderLinkToPage(p))
+                    for p in votes.keys()]))
+        
+    security.declareProtected(Permissions.View, 'rating')
+    def rating(self):
+        """
+        Return this page's overall rating, an integer.
+
+        Interprets the recorded votes as numbers, as far as possible, and
+        returns their average.  But if there have been no votes, returns a
+        default rating of 1. This is so we can represent negative ratings
+        with a standard simple five-star graphic. (New pages have 1 star,
+        no stars means a bad page.)
+        """
+        if self.hasVotes():
+            return float(sum(map(int,self.votes().values())))/self.voteCount()
+        else:
+            return 1
+
+    # UI methods
+
+    security.declareProtected(Permissions.View, 'ratingStyle')
+    def ratingStyle(self,rating=''):
+        """
+        Return the CSS rating class for this page, or for the specified rating.
+        """
+        if rating == '' or rating == None: rating = self.rating()
+        return ['lowrated','neutralrated','highrated'][cmp(rating,0)+1]
+
+    security.declareProtected(Permissions.View, 'styledNumericRating')
+    def styledNumericRating(self,rating=''):
+        """
+        A HTML fragment displaying this page's or the specified rating, styled.
+        """
+        if rating == '' or rating == None: rating = self.rating()
+        return '<span class="%s">(%s)</span>' % (self.ratingStyle(rating),rating)
+
+InitializeClass(PluginRating) 
+registerPlugin(PluginRating)

Added: zope-zwiki/branches/upstream/current/plugins/rating/rating_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/rating/rating_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/rating/rating_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,35 @@
+from Products.ZWiki.testsupport import *
+ZopeTestCase.installProduct('ZCatalog')
+ZopeTestCase.installProduct('ZWiki')
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Tests))
+    return suite
+
+class Tests(ZwikiTestCase):
+    def afterSetUp(self):
+        ZwikiTestCase.afterSetUp(self)
+        self.p.REQUEST.REMOTE_ADDR = '1'
+        self.p.resetVotes()
+
+    def test_rating(self):
+        p = self.p
+        self.assert_(p.rating() == 1)
+        p.vote(2)
+        self.assert_(p.rating() == 2)
+        self.p.REQUEST.cookies['zwiki_username'] = 'someoneelse'
+        p.vote(0)
+        self.assert_(p.rating() == 1)
+
+    def test_vote(self): # and voteCount
+        p = self.p
+        self.assert_(p.voteCount() == 0)
+        p.vote(1)
+        self.assert_(p.voteCount() == 1)
+        p.vote(1)
+        self.assert_(p.voteCount() == 1)
+        self.p.REQUEST.cookies['zwiki_username'] = 'someoneelse'
+        p.vote(1)
+        self.assert_(p.voteCount() == 2)
+

Added: zope-zwiki/branches/upstream/current/plugins/rating/ratingform.pt
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/rating/ratingform.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/rating/ratingform.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,85 @@
+<html i18n:domain="zwiki">
+  <body>
+    <div metal:define-macro="ratingform" align="right">  
+      <!-- page rating form -->
+      <div tal:condition="python:user.has_permission('Zwiki: Rate pages',here)" >
+        <a name="ratingform"></a>
+        <style type="text/css">
+          input.rating {border:none;}
+        </style>
+        <form method="POST" id="ratingform" 
+              tal:define="
+                rating here/rating;
+                votecount here/voteCount;
+                myvote python:here.myVote(request); 
+                myvotestyle python:lambda n:myvote==n and 'border:thin dotted red' or '';
+                votedescriptions python:{
+                  '0':'poor',
+                  '1':'average',
+                  '2':'above average',
+                  '3':'good',
+                  '4':'great',
+                  '5':'superb',
+                  };
+                mouseovertitle python:(myvote == None) 
+                  and (lambda n:'click to vote %s (%s) for this page (%d votes)'
+                    % (n,votedescriptions[n],votecount))
+                  or (lambda n:'click to change your %s vote to %s (%s) (%d votes)'
+                    % (myvote,n,votedescriptions[n],votecount));
+                "
+              tal:attributes="
+                action string:${here/pageUrl}/vote;
+                "
+              >
+          <input tal:condition="python:0 #leaves whitespace between; use css/table ?"
+                 tal:repeat="vote python:['-1','0','1','2','3']"
+                 type="image" name="vote" class="rating"
+                 tal:attributes="
+                   value repeat/vote;
+                   name  repeat/vote;
+                   alt   repeat/vote;
+                   src   python:(rating>=vote) and 'misc_/ZWiki/star_icon' 
+                                                or 'misc_/ZWiki/blank_star_icon';
+                   "/>
+           <input 
+               type="image" name="vote0" value="0" alt="0"  class="rating"
+               width="14" height="13" 
+               tal:attributes="src python:'/p_/sp';
+                               style python:myvotestyle('0');
+                               title python:mouseovertitle('0');"
+           /><input 
+               type="image" name="vote1" value="1" alt="1"  class="rating"
+               tal:attributes="src python:(rating >= 1) and 'misc_/ZWiki/star_icon' 
+                                                          or 'misc_/ZWiki/blank_star_icon';
+                               style python:myvotestyle('1');
+                               title python:mouseovertitle('1');"
+           /><input 
+               type="image" name="vote2" value="2" alt="2"  class="rating"
+               tal:attributes="src python:(rating >= 2) and 'misc_/ZWiki/star_icon' 
+                                                         or 'misc_/ZWiki/blank_star_icon';
+                               style python:myvotestyle('2');
+                               title python:mouseovertitle('2');"
+           /><input 
+               type="image" name="vote3" value="3" alt="3" class="rating"
+               tal:attributes="src python:(rating >= 3) and 'misc_/ZWiki/star_icon' 
+                                                         or 'misc_/ZWiki/blank_star_icon';
+                               style python:myvotestyle('3');
+                               title python:mouseovertitle('3');"
+           /><input 
+               type="image" name="vote4" value="4" alt="4" class="rating"
+               tal:attributes="src python:(rating >= 4) and 'misc_/ZWiki/star_icon' 
+                                                         or 'misc_/ZWiki/blank_star_icon';
+                               style python:myvotestyle('4');
+                               title python:mouseovertitle('4');"
+           /><input 
+               type="image" name="vote5" value="5" alt="5" class="rating"
+               tal:attributes="src python:(rating >= 5) and 'misc_/ZWiki/star_icon' 
+                                                         or 'misc_/ZWiki/blank_star_icon';
+                               style python:myvotestyle('5');
+                               title python:mouseovertitle('5');"
+           />
+        </form>
+      </div>
+    </div>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/plugins/tracker/FilterIssues.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/tracker/FilterIssues.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/tracker/FilterIssues.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,364 @@
+<dtml-call "RESPONSE.setHeader('Content-Type','text/html; charset=utf-8')">
+<dtml-let
+ scrollto="'' #'#tracker'"
+ issueCount=issueCount 
+ sort_order="REQUEST.get('sort_order','')"
+ sort_on="REQUEST.get('sort_on','issueNumber')"
+ num="_.int(REQUEST.get('num',99999))"
+ searchexpr="REQUEST.get('textortitle','')"
+ category="REQUEST.get('category',[])"
+ status="REQUEST.get('status',['open','pending'])"
+ severity="REQUEST.get('severity',[])"
+ single_category="((_.len(category)==1) and category[0]) or ''"
+ single_status="((_.len(status)==1) and status[0]) or ''"
+ >
+<dtml-translate domain=zwiki>More advanced</dtml-translate> 
+
+<a href="&dtml-trackerUrl;"><dtml-translate domain=zwiki>issue tracker</dtml-translate></a> 
+<dtml-translate domain=zwiki>search options</dtml-translate>.
+
+<table border="0" cellpadding="0" cellspacing="0">
+<tr valign="top">
+<td>
+<!-- start of totals matrix -->
+<dtml-let 
+>
+<table border="0" cellspacing="0" cellpadding="2">
+<tr>
+<td align="right">&nbsp;</td>
+<dtml-in issue_severities prefix=sev>
+<td align="right"><dtml-var sev_item></td>
+</dtml-in>
+<td align="right">&nbsp;&nbsp;&nbsp;total</td>
+</tr>
+<dtml-in issue_categories prefix=cat>
+<tr>
+<td align="right"><dtml-var cat_sequence_item></td>
+<dtml-in issue_severities prefix=sev>
+<td align="right">
+<dtml-let bold="cat_sequence_item in category and sev_item in severity">
+<dtml-if bold><b></dtml-if>
+<a href="&dtml-URL;?category:list=&dtml.url_quote-cat_sequence_item;&severity:list=&dtml.url_quote-sev_item;&sort_on=status_index"
+><dtml-var "_.len(pages(isIssue=1,category=cat_sequence_item,severity=sev_item,status=status or '')) or '&nbsp;'"
+></a>
+<dtml-if bold></b></dtml-if>
+</dtml-let>
+</td>
+</dtml-in>
+<td align="right">
+<dtml-let bold="category and (cat_sequence_item in category) and not severity">
+<dtml-if bold><b></dtml-if>
+<a href="&dtml-URL;?category:list=&dtml.url_quote-cat_sequence_item;&sort_on=severity_index"
+><dtml-var "_.len(pages(isIssue=1,category=cat_sequence_item,severity=severity or ''))"
+></a>
+<dtml-if bold></b></dtml-if>
+</dtml-let>
+</td>
+</tr>
+</dtml-in>
+<tr>
+<td align="right">&nbsp;</td>
+<dtml-in issue_severities prefix=sev>
+<td align="right">
+<dtml-let bold="severity and (sev_item in severity) and not category">
+<dtml-if bold><b></dtml-if>
+<a href="&dtml-URL;?severity:list=&dtml.url_quote-sev_item;&sort_on=status_index"
+><dtml-var "_.len(pages(isIssue=1,severity=sev_item,status=status or ''))"
+></a>
+<dtml-if bold></b></dtml-if>
+</dtml-let>
+</td>
+</dtml-in>
+<td align="right">
+<dtml-let bold="(QUERY_STRING and
+           _.len(category)==0 or 
+           _.len(category)==_.len(issue_categories)) and
+          (_.len(status)==0 or 
+           _.len(status)==_.len(issue_statuses))">
+<dtml-if bold><b></dtml-if>
+<a href="&dtml-URL;?titlesearch=&sort_on=severity_index"
+><dtml-var "_.len(pages(isIssue=1,severity=severity or ''))"
+></a>
+<dtml-if bold></b></dtml-if>
+</dtml-let>
+</td>
+</tr>
+</table>
+</dtml-let>
+<!-- end of totals matrix -->
+</td>
+<td width="20">
+&nbsp;&nbsp;&nbsp;&nbsp;
+</td>
+<td>
+<!-- start of filter form -->
+<form action="&dtml-URL;#issues" method="GET">
+<table border="0" cellspacing="0" cellpadding="3">
+<tr>
+<td align=left valign=top colspan=3>
+<dtml-translate domain=zwiki>Name contains any of:</dtml-translate><br />
+<input type="text" name="titlesearch" value="<dtml-var titlesearch missing>" size="40" maxlength="60" accesskey="s" class="formfield">
+</td>
+</tr>
+<tr>
+<td align=left valign=top colspan=3>
+<dtml-translate domain=zwiki>Page text contains any of:</dtml-translate><br />
+<input type="text" name="textsearch" value="<dtml-var textsearch missing>" size="40" maxlength="60" class="formfield">
+</td>
+</tr>
+<tr>
+<td align=left valign=top>
+<dtml-translate domain=zwiki>Categories:</dtml-translate><br />
+<select name="category:list" multiple class="formfield">
+<dtml-in issue_categories prefix=x>
+<option
+<dtml-if "x_sequence_item in category">SELECTED</dtml-if>
+>&dtml-x_sequence_item;</option>
+</dtml-in>
+</select> 
+</td>
+<td align=left valign=top>
+<dtml-translate domain=zwiki>Severities:</dtml-translate><br />
+<select name="severity:list" multiple class="formfield">
+<dtml-in issue_severities prefix=x>
+<option
+<dtml-if "x_sequence_item in severity">SELECTED</dtml-if>
+>&dtml-x_sequence_item;</option>
+</dtml-in>
+</select> 
+</td>
+<td align=left valign=top>
+<dtml-translate domain=zwiki>Statuses:</dtml-translate><br />
+<select name="status:list" multiple class="formfield">
+<dtml-in issue_statuses prefix=x>
+<option
+<dtml-if "x_sequence_item in status">SELECTED</dtml-if>
+>&dtml-x_sequence_item;</option>
+</dtml-in>
+</select> 
+</td>
+</tr>
+<tr>
+<td align="left"><input type="submit" value="<dtml-translate domain=zwiki>Filter issues</dtml-translate>" style="font-weight:bold;"> 
+</td>
+<td align="center" colspan=2>&nbsp;</td>
+</tr>
+</table>
+</form>
+<!-- end of filter form -->
+</td>
+</tr>
+</table>
+
+ <!-- issue search results ------------------------- -->
+ <a name="issues" />
+ <dtml-comment>dtml madness</dtml-comment>
+ <dtml-comment>
+   Three cases:
+   - if we have a search term, search for it in title, text and category
+     (a dumb way, concatenate three searches)
+   - or, if we have a query string, search and sort according to those 
+     parameters
+   #- otherwise, show a default search (open issues by severity)
+ </dtml-comment>
+ <dtml-comment>
+   Catalog() won't sort on title for some reason; dtml-in will but seems
+   unreliable. Need to use dtml-in sort when combining multiple catalog
+   results. Try both at once I guess.
+   XXX try again ?
+ </dtml-comment>
+ <dtml-let 
+  sortonstart="_.string.find(QUERY_STRING,'sort_on')"
+  sortonend="_.string.find(QUERY_STRING,'&',sortonstart)"
+  sortonend="(sortonend != -1) and (sortonend+1) or _.len(QUERY_STRING)"
+  query="(sortonstart == -1) and QUERY_STRING or (QUERY_STRING[:sortonstart]+QUERY_STRING[sortonend:])"
+  query="query and ('&'+query) or ''"
+  order="REQUEST.get('sort_order','') and '&sort_order=' or '&sort_order=reverse' #not used"
+  issues="
+  (searchexpr and
+   (pages(isIssue=1, sort_on=sort_on, sort_limit=num, Title=searchexpr) +
+    pages(isIssue=1, sort_on=sort_on, sort_limit=num, category=searchexpr) +
+    pages(isIssue=1, sort_on=sort_on, sort_limit=num, text=searchexpr))[:num])
+  or 
+  (QUERY_STRING and
+   pages(isIssue=   1,
+         sort_on=   sort_on,
+         sort_order=REQUEST.get('sort_order','ascending'),
+         sort_limit=num,
+         text=      REQUEST.get('textsearch',''),
+         Title=     REQUEST.get('titlesearch',''),
+         category=  REQUEST.get('category',''),
+         severity=  REQUEST.get('severity',''),
+         status=    REQUEST.get('status',''))[:num])
+  or []
+  "
+  >
+   <table border=0 width="100%">
+     <tr>
+       <td align=left valign=top>
+         <dtml-let bold="sort_on=='issueNumber'">
+         <dtml-var "bold and '<b>' or ''">
+         <a href="&dtml-URL;?sort_on=issueNumber&dtml-query;&dtml-scrollto;"><dtml-translate domain=zwiki>#</dtml-translate></a>
+         <dtml-var "bold and '</b>' or ''">
+         </dtml-let>
+       </td>
+       <td align=left valign=top width="1%">
+         <dtml-let bold="sort_on=='category_index'">
+         <dtml-var "bold and '<b>' or ''">
+         <a href="&dtml-URL;?sort_on=category_index&dtml-query;&dtml-scrollto;"><dtml-translate domain=zwiki>category</dtml-translate></a>
+         <dtml-var "bold and '</b>' or ''">
+         </dtml-let>
+       </td>
+       <td align=left valign=top width="1%">
+         <dtml-let bold="sort_on=='severity_index'">
+         <dtml-var "bold and '<b>' or ''">
+         <a href="&dtml-URL;?sort_on=severity_index&dtml-query;&dtml-scrollto;"><dtml-translate domain=zwiki>severity</dtml-translate></a>
+         <dtml-var "bold and '</b>' or ''">
+         </dtml-let>
+       </td>
+       <td align=left valign=top width="1%">
+         <dtml-let bold="sort_on=='status_index'">
+         <dtml-var "bold and '<b>' or ''">
+         <a href="&dtml-URL;?sort_on=status_index&dtml-query;&dtml-scrollto;"><dtml-translate domain=zwiki>status</dtml-translate></a>
+         <dtml-var "bold and '</b>' or ''">
+         </dtml-let>
+       </td>
+       <td align=left valign=top width="1%">
+         <dtml-let bold="sort_on=='creation_time'">
+         <dtml-var "bold and '<b>' or ''">
+         <a href="&dtml-URL;?sort_on=creation_time&dtml-query;&dtml-scrollto;"><dtml-translate domain=zwiki>age</dtml-translate></a>
+         <dtml-var "bold and '</b>' or ''">
+         </dtml-let>
+       </td>
+       <td align=left valign=top width="1%">
+         <dtml-let bold="sort_on=='lastEditTime'">
+         <dtml-var "bold and '<b>' or ''">
+         <a href="&dtml-URL;?sort_on=lastEditTime&dtml-query;&sort_order=reverse&dtml-scrollto;"><dtml-translate domain=zwiki>modified</dtml-translate></a>
+         <dtml-var "bold and '</b>' or ''">
+         </dtml-let>
+       </td>
+     </tr>
+     <dtml-in issues>
+       <dtml-try>
+         <dtml-let
+          linktitle="'' #getObject().linkTitle()"
+          bold="0#(status in ('open','pending') and 
+          #severity not in ('wishlist',) and 
+          #page.ageInDays() > 60)"
+          >
+           <tr bgcolor="&dtml-issueColour;">
+             <td align=left valign=top>
+               <dtml-comment>
+               <dtml-var "wikilink('['+Title+']')">
+               </dtml-comment>
+               <dtml-var "bold and '<b>' or ''"
+               ><a href="&dtml-wiki_url;/&dtml-id;" 
+                   title="<dtml-var "'' #page.linkTitle()">">&dtml-Title;</a>
+               <dtml-var "bold and '</b>' or ''">
+             </td>
+             <td align=left valign=top nowrap><dtml-var category></td>
+             <td align=left valign=top nowrap><dtml-var severity></td>
+             <td align=left valign=top nowrap>
+               <dtml-var "bold and '<b>' or ''">
+               <dtml-var status>
+               <dtml-var "bold and '</b>' or ''">
+             </td>
+             <td align=left valign=top nowrap>
+               <dtml-var "bold and '<b>' or ''">
+               <dtml-let
+                creation_time="_.getattr(_['sequence-item'],'creation_time','')"
+                creation="_.DateTime(_.getattr(_['sequence-item'],'creation_time','') or 1007105000)"
+                current="_.DateTime(ZopeTime().strftime('%Y/%m/%d %H:%M:%S'))"
+                elapsed="current-creation"
+                hourfactor="0.041666666666666664"
+                minutefactor="0.00069444444444444447"
+                secondsfactor="1.1574074074074073e-05"
+                days="_.int(_.math.floor(elapsed))"
+                weeks="days / 7"
+                months="days / 30"
+                years="days / 365"
+                hours="_.int(_.math.floor((elapsed-days)/hourfactor))"
+                minutes="_.int(_.math.floor((elapsed-days-hourfactor*hours)/minutefactor))"
+                seconds="_.int(_.round((elapsed-days-hourfactor*hours-minutefactor*minutes)/secondsfactor))"
+                >
+                 <dtml-unless creation_time>></dtml-unless>
+                 <dtml-if years>
+                   <dtml-var years> year<dtml-var "years > 1 and 's' or ''">
+                 <dtml-elif months>
+                   <dtml-var months> month<dtml-var "months > 1 and 's' or ''">
+                 <dtml-elif weeks>
+                   <dtml-var weeks> week<dtml-var "weeks > 1 and 's' or ''">
+                 <dtml-elif days>
+                   <dtml-var days> day<dtml-var "days > 1 and 's' or ''">
+                 <dtml-elif hours>
+                   <dtml-var hours> hour<dtml-var "hours > 1 and 's' or ''">
+                 <dtml-elif minutes>
+                   <dtml-var minutes> minute<dtml-var "minutes > 1 and 's' or ''">
+                 <dtml-else>
+                   <dtml-var seconds> second<dtml-var "seconds > 1 and 's' or ''">
+                 </dtml-if>
+               </dtml-let>
+               <dtml-var "bold and '</b>' or ''">
+             </td>
+             <td align=left valign=top nowrap>
+               <dtml-comment>
+                 could call lastEditInterval but would have to wake up objects
+               </dtml-comment>
+               <dtml-let
+                elapsed="ZopeTime() - lastEditTime"
+                hourfactor="0.041666666666666664"
+                minutefactor="0.00069444444444444447"
+                secondsfactor="1.1574074074074073e-05"
+                days="_.int(_.math.floor(elapsed))"
+                weeks="days / 7"
+                months="days / 30"
+                years="days / 365"
+                hours="_.int(_.math.floor((elapsed-days)/hourfactor))"
+                minutes="_.int(_.math.floor((elapsed-days-hourfactor*hours)/minutefactor))"
+                seconds="_.int(_.round((elapsed-days-hourfactor*hours-minutefactor*minutes)/secondsfactor))"
+                >
+                 <dtml-if years>
+                   <dtml-var years> year<dtml-var "years > 1 and 's' or ''">
+                 <dtml-elif months>
+                   <dtml-var months> month<dtml-var "months > 1 and 's' or ''">
+                 <dtml-elif weeks>
+                   <dtml-var weeks> week<dtml-var "weeks > 1 and 's' or ''">
+                 <dtml-elif days>
+                   <dtml-var days> day<dtml-var "days > 1 and 's' or ''">
+                 <dtml-elif hours>
+                   <dtml-var hours> hour<dtml-var "hours > 1 and 's' or ''">
+                 <dtml-elif minutes>
+                   <dtml-var minutes> minute<dtml-var "minutes > 1 and 's' or ''">
+                 <dtml-else>
+                   <dtml-var seconds> second<dtml-var "seconds > 1 and 's' or ''">
+                 </dtml-if>
+               </dtml-let>
+             </td>
+           </tr>
+         </dtml-let>
+       <dtml-except>
+         <tr>
+           <td colspan=6>
+             &dtml-Title; gave an error, bad catalog entry ?
+           </td>
+         </tr>
+       </dtml-try>
+       <dtml-if sequence-end>
+         <tr>
+           <td colspan=6>
+             <b><dtml-var sequence-number></b>
+             <dtml-comment>
+               issue<dtml-var "_['sequence-number'] != 1 and 's' or ''"> listed
+             </dtml-comment>
+           </td>
+         </tr>
+       </dtml-if>
+     <dtml-else>
+       <tr>
+         <td colspan=6>&nbsp;</td>
+       </tr>
+     </dtml-in>
+   </table>
+ </dtml-let>
+
+</dtml-let>

Added: zope-zwiki/branches/upstream/current/plugins/tracker/IssueBrowser.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/tracker/IssueBrowser.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/tracker/IssueBrowser.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,134 @@
+<!-- category box and font sizes adjusted for number of open issues --> 
+<a name="categories"></a>
+<dtml-let 
+    cols="issue_categories
+          #or, a list of issue category prefixes.. categories with the same prefix
+          #will be grouped in columns"
+    items=issue_categories
+    barearg="'bare' in QUERY_STRING and '&bare=%s'%REQUEST.get('bare') or ''"
+    href="lambda x:'%s?category=%s&sort_on=status_index%s'%(_['URL'],_.this.urlquote(x),_['barearg'])"
+    num="_.len(issue_categories)"
+    itemsbeginningwith="lambda x:[i for i in _['items'] if i.startswith(x)]"
+    colvalues="[itemsbeginningwith(i) for i in cols]"
+    numcols="_.len(cols)"
+    longest="max([_.len(col) for col in colvalues])"
+    >
+<table width="100%" border=0 cellpadding="0" cellspacing="0"
+  <tr>
+    <td colspan="&dtml-numcols;" align="center">
+      <em>
+issue categories sized and coloured according to open issues
+(also
+<dtml-comment>
+<dtml-if barearg>
+<a href="&dtml-URL;">with skin</a>,
+<dtml-else>
+<a href="<dtml-var "URL+'?bare=1'">">bare</a>,
+</dtml-if>
+</dtml-comment>
+<a href="&dtml-trackerUrl;">issue tracker</a>,
+<a href="&dtml-filterUrl;">filter issues</a>
+)
+      </em>
+
+    </td>
+  </tr>
+  <tr valign="top">
+    <dtml-in "_.range(_.len(cols))" prefix=col>
+      <td width="<dtml-var "'%s%%'%(100/_.len(cols))">">
+        <table border="0" width="100%">
+        <dtml-in "_.range(longest)" prefix=row>
+        <dtml-let 
+          row=row_sequence_item
+          col=col_sequence_item
+          >
+          <dtml-if "row < _.len(colvalues[col])">
+          <dtml-let
+            item="colvalues[col][row]"
+            open="pages(isIssue=1,category=item,status=['open','pending'])"
+            all="pages(isIssue=1,category=item)"
+            issues="open or all"
+            highestseverity="min([i.severity_index for i in issues]+[5]) #XXX your highest severity_index"
+            firsthighissue="([i for i in issues if i.severity_index==highestseverity]+[None])[0]"
+            colour="firsthighissue and firsthighissue.issueColour or '#bbeebb'"
+            bold="item == REQUEST.get('category','')"
+            >
+            <tr height="<dtml-var "'%s'%(10+_.len(open)/2)">"
+                style="font-size:<dtml-var "'%spt'%(10+_.len(open)/4)">">
+            <td bgcolor="&dtml-colour;" style="<dtml-var "bold and 'border:2px black solid' or ''">">
+              <dtml-var "bold and '<b>' or ''">
+              <a href="<dtml-var "href(item)">"
+                >&dtml-item;&nbsp;<dtml-var "_.len(open)">
+              </a>
+              <dtml-var "bold and '</b>' or ''">
+            </td>
+            </tr>
+          </dtml-let>
+          <dtml-else>
+            <tr>
+            <td>&nbsp;</td>
+            </tr>
+          </dtml-if>
+        </dtml-let>
+      </dtml-in>
+      </table>
+      </td>
+    </dtml-in>
+  </tr>
+</table>
+</dtml-let>
+<dtml-if "REQUEST.get('category','')">
+<a name="issues"></a>
+<hr class="issuebrowser" style="border:1px black solid" />
+<dtml-let 
+    category="REQUEST.get('category')"
+    barearg="'bare' in QUERY_STRING and '&bare=%s'%REQUEST.get('bare') or ''"
+    issues="pages(isIssue=1,category=category,sort_on='creation_time',sort_order='descending')"
+    openissues="pages(isIssue=1,category=category,status=['open','pending'],sort_on='creation_time',sort_order='descending')"
+    items=openissues
+    href="lambda x:'&dtml-URL;?category=&dtml.url_quote-%s;&sort_on=status_index'%x"
+    num="_.len(items)"
+    cols="_.max(2,_.min(_.int(_.round(_.math.sqrt(num))),6))"
+    rows="num/cols + ((num%cols) and 1)"
+    >
+<table width="100%" border=0>  
+  <dtml-in "_.range(rows)" prefix=row>
+    <tr height="<dtml-var "'%s%%'%(100/(rows+1))">">
+      <dtml-in "_.range(cols)" prefix=col>
+        <dtml-let 
+          row=row_sequence_item
+          col=col_sequence_item
+          itemno="row*cols+col"
+          >
+          <dtml-if "itemno < num">
+          <dtml-with "items[itemno]">
+            <dtml-let bold="id == REQUEST.get('issue','')">
+            <td bgcolor="&dtml-issueColour;"
+                width="<dtml-var "'%s%%'%(100/cols)">"
+                 style="<dtml-var "bold and 'border:2px black solid' or ''">">
+            <dtml-var "bold and '<b>' or ''">
+              <a href="&dtml-URL;?category=&dtml-category;&issue=&dtml-id;&dtml-barearg;#issue"
+                   title="<dtml-var "'' #page.linkTitle()">">&dtml-Title;</a>
+            <dtml-var "bold and '</b>' or ''">
+            </td>
+            </dtml-let>
+          </dtml-with>
+          <dtml-else>
+            <td>&nbsp;</td>
+          </dtml-if>
+        </dtml-let>
+      </dtml-in>
+    </tr>
+  </dtml-in>
+</table>
+</dtml-let>
+</dtml-if>
+<dtml-if "REQUEST.get('issue','')">
+<a name="issue"></a>
+<hr class="issuebrowser" style="border:1px black solid" />
+<dtml-var "include(REQUEST.get('issue'))">
+
+<dtml-with "pageWithId(issue)">
+(<a href="&dtml-id;/editform">edit</a>, <a href="&dtml-id;#bottom">comment</a> this issue)
+</dtml-with>
+</dtml-if>

Added: zope-zwiki/branches/upstream/current/plugins/tracker/IssueTracker.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/tracker/IssueTracker.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/tracker/IssueTracker.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,449 @@
+<dtml-call "RESPONSE.setHeader('Content-Type','text/html; charset=utf-8')">
+<dtml-let
+ scrollto="'' #'#tracker'"
+ issueCount=issueCount 
+ sort_order="REQUEST.get('sort_order','')"
+ sort_on="REQUEST.get('sort_on','lastEditTime')"
+ searchexpr="REQUEST.get('textortitle','')"
+ category="REQUEST.get('category',[])"
+ status="REQUEST.get('status',[])"
+ severity="REQUEST.get('severity',[])"
+ num="_.int(REQUEST.get('num',99999))"
+ recentnum="30"
+ recentlisting="'?sort_on=lastEditTime&sort_order=reverse&num=%s'%recentnum"
+ >
+<!-- issue search form ------------------------- -->
+<a name="tracker"></a>
+ <form action="&dtml-URL;" method="GET">
+   <table border="0" cellspacing="1" cellpadding="0" width="100%">
+     <tr>
+       <td valign="top">
+<!-- CUSTOM TEXT -->
+         <dtml-translate domain=zwiki>Here are the wiki's issue pages.</dtml-translate>
+
+<!-- END OF CUSTOM TEXT -->
+         <dtml-translate domain=zwiki>Enter a search term, click the numbers to the right, </dtml-translate>
+          <a href="&dtml-filterUrl;"><dtml-translate domain=zwiki>filter issues</dtml-translate></a>, 
+          <a href="&dtml-issueBrowserUrl;"><dtml-translate domain=zwiki>browse open issues</dtml-translate></a>.
+         <br />
+         <b>
+           <input type="text" name="textortitle" size="20" maxlength="100" 
+                  value="&dtml-searchexpr;" 
+                  class="formfield" style="font-weight:bold" accesskey="s"
+                  title="search issue pages" 
+            /><input type="submit" value="<dtml-translate domain=zwiki>search issues</dtml-translate>" 
+                     style="font-weight:bold" title="search issue pages" />
+         </b>
+       </td>
+       <td valign="top" class="">
+         <span style="font-size:100%;">
+         <table border="0" cellspacing="2" cellpadding="0" 
+           <dtml-let bold="num==recentnum or not QUERY_STRING">
+             <tr>
+               <td align="right">
+                 <dtml-var "bold and '<b>' or ''">
+                   <a href="&dtml-URL;&dtml-recentlisting;&dtml-scrollto;"
+                   >&dtml-recentnum;</a>
+                 <dtml-var "bold and '</b>' or ''">
+               </td>
+               <td align="left" nowrap>
+                 <dtml-var "bold and '<b>' or ''">
+                 <dtml-translate domain=zwiki>recent</dtml-translate>
+                 <dtml-var "bold and '</b>' or ''">
+               </td>
+             </tr>
+           </dtml-let>
+           <dtml-let bold="QUERY_STRING and not (status or severity or category or searchexpr or (num==recentnum))">
+             <tr>
+               <td align="right">
+                 <dtml-var "bold and '<b>' or ''">
+                   <a href="&dtml-URL;?sort_on=issueNumber&dtml-scrollto;"
+                   >&dtml-issueCount;</a>
+                 <dtml-var "bold and '</b>' or ''">
+               </td>
+               <td align="left" nowrap>
+                 <dtml-var "bold and '<b>' or ''">
+                 <dtml-translate domain=zwiki>all</dtml-translate>
+                 <dtml-var "bold and '</b>' or ''">
+               </td>
+             </tr>
+           </dtml-let>
+         </table>
+         </span>
+       </td>
+       <td valign="top" class="">
+         <span style="font-size:100%;">
+         <table border="0" cellspacing="2" cellpadding="0">
+           <dtml-in issue_statuses prefix=x>
+             <dtml-let bold="x_sequence_item in REQUEST.get('status',[])">
+               <tr>
+                 <td align="right">
+                     <dtml-var "bold and '<b>' or ''">
+                     <a href="&dtml-URL;?status:list=&dtml-x_sequence_item;&sort_on=severity_index&dtml-scrollto;"
+                      ><dtml-var "_.len(pages(isIssue=1,status=x_sequence_item))"
+                      ></a>
+                     <dtml-var "bold and '</b>' or ''">
+                 </td>
+                 <td align="left" nowrap>
+                   <dtml-var "bold and '<b>' or ''">
+                   &dtml-x_sequence_item;
+                   <dtml-var "bold and '</b>' or ''">
+                 </td>
+               </tr>
+             </dtml-let>
+           </dtml-in>
+         </table>
+         </span>
+       </td>
+       <td valign="top" class="">
+         <span style="font-size:100%;">
+         <table border="0" cellspacing="2" cellpadding="0">
+           <dtml-in issue_severities prefix=x>
+             <dtml-let bold="x_sequence_item in REQUEST.get('severity',[])">
+               <tr>
+                 <td align="right">
+                     <dtml-var "bold and '<b>' or ''">
+                     <a href="&dtml-URL;?severity:list=&dtml-x_sequence_item;&sort_on=status_index&dtml-scrollto;"
+                      ><dtml-var "_.len(pages(isIssue=1,severity=x_sequence_item))"
+                      ></a>
+                     <dtml-var "bold and '</b>' or ''">
+                 </td>
+                 <td align="left" nowrap>
+                   <dtml-var "bold and '<b>' or ''">
+                   &dtml-x_sequence_item;
+                   <dtml-var "bold and '</b>' or ''">
+                 </td>
+               </tr>
+             </dtml-let>
+           </dtml-in>
+         </table>
+         </span>
+       </td>
+       <td valign="top" class="">
+         <span style="font-size:100%;">
+         <table border="0" cellspacing="2" cellpadding="0">
+           <dtml-in issue_categories prefix=x>
+             <dtml-let bold="x_sequence_item in REQUEST.get('category',[])">
+               <tr>
+                 <td align="right">
+                   <dtml-var "bold and '<b>' or ''">
+                   <a href="&dtml-URL;?category:list=&dtml.url_quote-sequence-item;&sort_on=status_index&dtml-scrollto;"
+                     ><dtml-var "_.len(pages(isIssue=1,category=_['sequence-item']))"
+                     ></a>
+                   <dtml-var "bold and '</b>' or ''">
+                 </td>
+                 <td align="left" nowrap>
+                   <dtml-var "bold and '<b>' or ''">
+                   &dtml-sequence-item;
+                   <dtml-var "bold and '</b>' or ''">
+                 </td>
+               </tr>
+             </dtml-let>
+           </dtml-in>
+         </table>
+         </span>
+       </td>
+    </tr>
+   </table>
+ </form>
+ <p>
+ <!-- issue search results ------------------------- -->
+ <a name="issues"></a>
+ <dtml-comment>dtml madness</dtml-comment>
+ <dtml-comment>
+   Three cases:
+   - if we have a search term, search for it in title, text and category
+     (a dumb way, concatenate three searches)
+   - or, if we have a query string, search and sort according to those 
+     parameters
+   - otherwise, show a default search (open issues by severity)
+ </dtml-comment>
+ <dtml-comment>
+   Catalog() won't sort on title for some reason; dtml-in will but seems
+   unreliable. Need to use dtml-in sort when combining multiple catalog
+   results. Try both at once I guess.
+   XXX try again ?
+ </dtml-comment>
+ <dtml-let 
+  sortonstart="_.string.find(QUERY_STRING,'sort_on')"
+  sortonend="_.string.find(QUERY_STRING,'&',sortonstart)"
+  sortonend="(sortonend != -1) and (sortonend+1) or _.len(QUERY_STRING)"
+  query="(sortonstart == -1) and QUERY_STRING or (QUERY_STRING[:sortonstart]+QUERY_STRING[sortonend:])"
+  query="query and ('&'+query) or ''"
+  order="REQUEST.get('sort_order','') and '&sort_order=' or '&sort_order=reverse' #not used"
+  issues="
+  (searchexpr and
+   (pages(isIssue=1, sort_on=sort_on, sort_limit=num, Title=searchexpr) +
+    pages(isIssue=1, sort_on=sort_on, sort_limit=num, category=searchexpr) +
+    pages(isIssue=1, sort_on=sort_on, sort_limit=num, text=searchexpr))[:num])
+  or 
+  (not searchexpr and QUERY_STRING and
+   pages(isIssue=   1,
+         sort_on=   sort_on,
+         sort_order=REQUEST.get('sort_order','ascending'),
+         sort_limit=num,
+         text=      REQUEST.get('textsearch',''),
+         Title=     REQUEST.get('titlesearch',''),
+         category=  REQUEST.get('category',''),
+         severity=  REQUEST.get('severity',''),
+         status=    REQUEST.get('status',''))[:num])
+  or
+  (not searchexpr and not QUERY_STRING and
+   pages(isIssue=1, sort_on='lastEditTime', sort_order='reverse', sort_limit=num)[:recentnum])
+  "
+  >
+   <table border=0 width="100%">
+     <tr>
+       <td align=left valign=top>
+         <dtml-let bold="sort_on=='issueNumber'">
+         <dtml-var "bold and '<b>' or ''">
+         <a href="&dtml-URL;?sort_on=issueNumber&dtml-query;&dtml-scrollto;"><dtml-translate domain=zwiki>#</dtml-translate></a>
+         <dtml-var "bold and '</b>' or ''">
+         </dtml-let>
+       </td>
+       <td align=left valign=top width="1%">
+         <dtml-let bold="sort_on=='category_index'">
+         <dtml-var "bold and '<b>' or ''">
+         <a href="&dtml-URL;?sort_on=category_index&dtml-query;&dtml-scrollto;"><dtml-translate domain=zwiki>category</dtml-translate></a>
+         <dtml-var "bold and '</b>' or ''">
+         </dtml-let>
+       </td>
+       <td align=left valign=top width="1%">
+         <dtml-let bold="sort_on=='severity_index'">
+         <dtml-var "bold and '<b>' or ''">
+         <a href="&dtml-URL;?sort_on=severity_index&dtml-query;&dtml-scrollto;"><dtml-translate domain=zwiki>severity</dtml-translate></a>
+         <dtml-var "bold and '</b>' or ''">
+         </dtml-let>
+       </td>
+       <td align=left valign=top width="1%">
+         <dtml-let bold="sort_on=='status_index'">
+         <dtml-var "bold and '<b>' or ''">
+         <a href="&dtml-URL;?sort_on=status_index&dtml-query;&dtml-scrollto;"><dtml-translate domain=zwiki>status</dtml-translate></a>
+         <dtml-var "bold and '</b>' or ''">
+         </dtml-let>
+       </td>
+       <td align=left valign=top width="1%">
+         <dtml-let bold="sort_on=='creation_time'">
+         <dtml-var "bold and '<b>' or ''">
+         <a href="&dtml-URL;?sort_on=creation_time&dtml-query;&dtml-scrollto;"><dtml-translate domain=zwiki>age</dtml-translate></a>
+         <dtml-var "bold and '</b>' or ''">
+         </dtml-let>
+       </td>
+       <td align=left valign=top width="1%">
+         <dtml-let bold="sort_on=='lastEditTime'">
+         <dtml-var "bold and '<b>' or ''">
+         <a href="&dtml-URL;?sort_on=lastEditTime&dtml-query;&sort_order=reverse&dtml-scrollto;"><dtml-translate domain=zwiki>modified</dtml-translate></a>
+         <dtml-var "bold and '</b>' or ''">
+         </dtml-let>
+       </td>
+     </tr>
+     <dtml-in issues>
+       <dtml-try>
+         <dtml-let
+          linktitle="'' #getObject().linkTitle()"
+          bold="0#(status in ('open','pending') and 
+          #severity not in ('wishlist',) and 
+          #page.ageInDays() > 60)"
+          >
+           <tr bgcolor="&dtml-issueColour;">
+             <td align=left valign=top>
+               <dtml-comment>
+               <dtml-var "wikilink('['+Title+']')">
+               </dtml-comment>
+               <dtml-var "bold and '<b>' or ''"
+               ><a href="&dtml-wiki_url;/&dtml-id;" 
+                   title="<dtml-var "'' #page.linkTitle()">">&dtml-Title;</a>
+               <dtml-var "bold and '</b>' or ''">
+             </td>
+             <td align=left valign=top nowrap><dtml-var category></td>
+             <td align=left valign=top nowrap><dtml-var severity></td>
+             <td align=left valign=top nowrap>
+               <dtml-var "bold and '<b>' or ''">
+               <dtml-var status>
+               <dtml-var "bold and '</b>' or ''">
+             </td>
+             <td align=left valign=top nowrap>
+               <dtml-var "bold and '<b>' or ''">
+               <dtml-let
+                creation_time="_.getattr(_['sequence-item'],'creation_time','')"
+                creation="_.DateTime(_.getattr(_['sequence-item'],'creation_time','') or 1007105000)"
+                current="_.DateTime(ZopeTime().strftime('%Y/%m/%d %H:%M:%S'))"
+                elapsed="current-creation"
+                hourfactor="0.041666666666666664"
+                minutefactor="0.00069444444444444447"
+                secondsfactor="1.1574074074074073e-05"
+                days="_.int(_.math.floor(elapsed))"
+                weeks="days / 7"
+                months="days / 30"
+                years="days / 365"
+                hours="_.int(_.math.floor((elapsed-days)/hourfactor))"
+                minutes="_.int(_.math.floor((elapsed-days-hourfactor*hours)/minutefactor))"
+                seconds="_.int(_.round((elapsed-days-hourfactor*hours-minutefactor*minutes)/secondsfactor))"
+                >
+                 <dtml-unless creation_time>></dtml-unless>
+                 <dtml-if years>
+                   <dtml-var years> year<dtml-var "years > 1 and 's' or ''">
+                 <dtml-elif months>
+                   <dtml-var months> month<dtml-var "months > 1 and 's' or ''">
+                 <dtml-elif weeks>
+                   <dtml-var weeks> week<dtml-var "weeks > 1 and 's' or ''">
+                 <dtml-elif days>
+                   <dtml-var days> day<dtml-var "days > 1 and 's' or ''">
+                 <dtml-elif hours>
+                   <dtml-var hours> hour<dtml-var "hours > 1 and 's' or ''">
+                 <dtml-elif minutes>
+                   <dtml-var minutes> minute<dtml-var "minutes > 1 and 's' or ''">
+                 <dtml-else>
+                   <dtml-var seconds> second<dtml-var "seconds > 1 and 's' or ''">
+                 </dtml-if>
+               </dtml-let>
+               <dtml-var "bold and '</b>' or ''">
+             </td>
+             <td align=left valign=top nowrap>
+               <dtml-comment>
+                 could call lastEditInterval but would have to wake up objects
+               </dtml-comment>
+               <dtml-let
+                elapsed="ZopeTime() - lastEditTime"
+                hourfactor="0.041666666666666664"
+                minutefactor="0.00069444444444444447"
+                secondsfactor="1.1574074074074073e-05"
+                days="_.int(_.math.floor(elapsed))"
+                weeks="days / 7"
+                months="days / 30"
+                years="days / 365"
+                hours="_.int(_.math.floor((elapsed-days)/hourfactor))"
+                minutes="_.int(_.math.floor((elapsed-days-hourfactor*hours)/minutefactor))"
+                seconds="_.int(_.round((elapsed-days-hourfactor*hours-minutefactor*minutes)/secondsfactor))"
+                >
+                 <dtml-if years>
+                   <dtml-var years> year<dtml-var "years > 1 and 's' or ''">
+                 <dtml-elif months>
+                   <dtml-var months> month<dtml-var "months > 1 and 's' or ''">
+                 <dtml-elif weeks>
+                   <dtml-var weeks> week<dtml-var "weeks > 1 and 's' or ''">
+                 <dtml-elif days>
+                   <dtml-var days> day<dtml-var "days > 1 and 's' or ''">
+                 <dtml-elif hours>
+                   <dtml-var hours> hour<dtml-var "hours > 1 and 's' or ''">
+                 <dtml-elif minutes>
+                   <dtml-var minutes> minute<dtml-var "minutes > 1 and 's' or ''">
+                 <dtml-else>
+                   <dtml-var seconds> second<dtml-var "seconds > 1 and 's' or ''">
+                 </dtml-if>
+               </dtml-let>
+             </td>
+           </tr>
+         </dtml-let>
+       <dtml-except>
+         <tr>
+           <td colspan=6>
+             &dtml-Title; gave an error, bad catalog entry ?
+           </td>
+         </tr>
+       </dtml-try>
+       <dtml-if sequence-end>
+         <tr>
+           <td colspan=6>
+             <b><dtml-var sequence-number></b>
+             <dtml-comment>
+               issue<dtml-var "_['sequence-number'] != 1 and 's' or ''"> listed
+             </dtml-comment>
+           </td>
+         </tr>
+       </dtml-if>
+     <dtml-else>
+       <tr>
+         <td colspan=6>&nbsp;</td>
+       </tr>
+     </dtml-in>
+   </table>
+ </dtml-let>
+ <p>
+ <!-- add issue form ------------------------- -->
+ <a name="addissue"></a>
+ <form action="&dtml-URL;" method="POST">
+   <b><dtml-translate domain=zwiki>Add a new issue:</dtml-translate></b>
+   <br /><br />
+   <table border="0" cellspacing="1" cellpadding="0" width="60%">
+     <tr valign="middle">
+       <td align="right">
+         <dtml-translate domain=zwiki>Name:</dtml-translate>
+       </td>
+       <td>
+         <b>
+           <input 
+            type="text" name="newtitle" 
+            value="<dtml-var newtitle missing html_quote>" class="formfield"
+            size="40" maxlength="200" style="font-weight:bold;width:100%;" />
+         </b>
+       </td>
+     <tr valign="middle">
+       <td align="right">
+         <dtml-translate domain=zwiki>Category:</dtml-translate>
+       </td>
+       <td nowrap>
+         <select name="newcategory" class="formfield">
+           <dtml-in issue_categories>
+           <option <dtml-var "_['sequence-item'] == 'general' and 'SELECTED' or ''">>
+             &dtml-sequence-item;
+           </option>
+           </dtml-in>
+         </select> 
+         &nbsp;<dtml-translate domain=zwiki>Severity:</dtml-translate><select 
+           name="newseverity" class="formfield">
+           <dtml-in issue_severities>
+           <option <dtml-var "_['sequence-item'] == 'normal' and 'SELECTED' or ''">>
+             &dtml-sequence-item;
+           </option>
+           </dtml-in>
+         </select> 
+         &nbsp;<dtml-translate domain=zwiki>Status:</dtml-translate><select
+           name="newstatus" class="formfield">
+           <dtml-in issue_statuses>
+           <option <dtml-var "_['sequence-item'] == 'open' and 'SELECTED' or ''">>
+             &dtml-sequence-item;
+           </option>
+           </dtml-in>
+         </select>
+       </td>
+     </tr>
+     <tr valign="top">
+       <td align="right">
+         <dtml-translate domain=zwiki>Details:</dtml-translate>
+       </td>
+       <td>
+         <textarea name="newtext" wrap="virtual" rows="5" cols="40" 
+                   class="formfield" style="width:100%"></textarea>
+       </td>
+     </tr>
+     <tr>
+       <td>
+         &nbsp;
+       </td>
+       <td><b><input 
+               name="submit" type="submit" 
+               value="<dtml-translate domain=zwiki>add issue</dtml-translate>" 
+               style="font-weight:bold"></b>
+       </td>
+     </tr>
+   </table>
+   <input type="hidden" name="submitted" value="1" />
+ </form>
+ 
+ <!-- add issue form handler ------------------------- -->
+ <dtml-if "REQUEST.get('submitted',0) and REQUEST.get('newtitle',0)">
+   <dtml-let
+    newtitle="_.getattr(REQUEST,'newtitle','')"
+    newtext="_.getattr(REQUEST,'newtext','')"
+    newcategory="_.getattr(REQUEST,'newcategory','zwiki: general')"
+    newseverity="_.getattr(REQUEST,'newseverity','normal')"
+    newstatus="_.getattr(REQUEST,'newstatus','open')"
+    >
+     <dtml-call "createNextIssue(
+       newtitle,newtext,newcategory,newseverity,newstatus,REQUEST=REQUEST)
+       # reloads the tracker page">
+   </dtml-let>
+ </dtml-if>
+ 
+</dtml-let>

Added: zope-zwiki/branches/upstream/current/plugins/tracker/__init__.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/tracker/__init__.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/tracker/__init__.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1 @@
+import tracker

Added: zope-zwiki/branches/upstream/current/plugins/tracker/filterissues.pt
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/tracker/filterissues.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/tracker/filterissues.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,18 @@
+<html metal:use-macro="here/main_template/macros/master" i18n:domain="zwiki" >
+  <head>
+    <title metal:fill-slot="title_slot" tal:content="
+           string:${container/title} filter issues" />
+    <metal:block metal:fill-slot="head_slot">
+      <metal:block metal:use-macro="here/macros/formsearchtags" />
+    </metal:block>
+  </head>
+  <body>
+    <div metal:fill-slot="main" tal:omit-tag="">
+      <metal:macro metal:use-macro="here/macros/accesskeys" />
+      <h1 i18n:translate="">Filter issues</h1>
+      <div class="formcontent"
+           tal:content="structure python:
+                        here.getSkinTemplate('FilterIssues')(here,request)" />
+    </div>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/plugins/tracker/issuebrowser.pt
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/tracker/issuebrowser.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/tracker/issuebrowser.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,18 @@
+<html metal:use-macro="here/main_template/macros/master" i18n:domain="zwiki" >
+  <head>
+    <title metal:fill-slot="title_slot" tal:content="
+           string:${container/title} issue browser" />
+    <metal:block metal:fill-slot="head_slot">
+      <metal:block metal:use-macro="here/macros/formsearchtags" />
+    </metal:block>
+  </head>
+  <body>
+    <div metal:fill-slot="main" tal:omit-tag="">
+      <metal:macro metal:use-macro="here/macros/accesskeys" />
+      <h1 i18n:translate="">Issue browser</h1>
+      <div class="formcontent"
+           tal:content="structure python:
+                        here.getSkinTemplate('IssueBrowser')(here,request)" />
+    </div>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/plugins/tracker/issuepropertiesform.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/tracker/issuepropertiesform.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/tracker/issuepropertiesform.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,83 @@
+<dtml-call "REQUEST.RESPONSE.setHeader('Content-Type','text/html; charset=utf-8')">
+<!-- issue properties form -->
+<form action="&dtml-pageUrl;/changeIssueProperties" method="post">
+<table border="0" cellspacing="0" cellpadding="5"
+bgcolor="&dtml-issueColour;">
+<tr><td>
+<b><dtml-translate domain="zwiki">Submitted by</dtml-translate>:</b>
+<dtml-var "_.getattr(this(),'creator','') or '(unknown)'">
+<b>at:</b>
+<dtml-var creation_time missing=""><dtml-let
+creation_time="_.getattr(this(),'creation_time','')"
+creation="_.DateTime(_.getattr(this(),'creation_time','') or 1007105000)"
+current="_.DateTime(ZopeTime().strftime('%Y/%m/%d %H:%M:%S'))"
+elapsed="current-creation"
+hourfactor="0.041666666666666664"
+minutefactor="0.00069444444444444447"
+secondsfactor="1.1574074074074073e-05"
+days="_.int(_.math.floor(elapsed))"
+weeks="days / 7"
+months="days / 30"
+years="days / 365"
+hours="_.int(_.math.floor((elapsed-days)/hourfactor))"
+minutes="_.int(_.math.floor((elapsed-days-hourfactor*hours)/minutefactor))"
+seconds="_.int(_.round((elapsed-days-hourfactor*hours-minutefactor*minutes)/secondsfactor))"
+> (<dtml-unless creation_time>unknown, ></dtml-unless><dtml-if years>
+<dtml-var years> year<dtml-var "years > 1 and 's' or ''">
+<dtml-elif months>
+<dtml-var months> month<dtml-var "months > 1 and 's' or ''">
+<dtml-elif weeks>
+<dtml-var weeks> week<dtml-var "weeks > 1 and 's' or ''">
+<dtml-elif days>
+<dtml-var days> day<dtml-var "days > 1 and 's' or ''">
+<dtml-elif hours>
+<dtml-var hours> hour<dtml-var "hours > 1 and 's' or ''">
+<dtml-elif minutes>
+<dtml-var minutes> minute<dtml-var "minutes > 1 and 's' or ''">
+<dtml-else>
+<dtml-var seconds> second<dtml-var "seconds > 1 and 's' or ''">
+</dtml-if> ago)
+</dtml-let>
+<br />
+<b><dtml-translate domain="zwiki">Name</dtml-translate>:</b>
+<b><input type="text" name="name" value="<dtml-var issueName html_quote>" size="50" maxlength="200" class="formfield" style="font-weight:bold;"></b>
+<dtml-let
+  issue_categories="_.getattr(this(),'issue_categories','') or ['general']"
+  issue_severities="_.getattr(this(),'issue_severities','') or ['serious','normal','wishlist']"
+  issue_statuses="_.getattr(this(),'issue_statuses','') or ['open','closed']"
+  >
+<br />
+<b><dtml-translate domain="zwiki">Category</dtml-translate>:</b>
+<select name="category" class="formfield">
+<dtml-in issue_categories prefix=x>
+<option <dtml-if "category==x_sequence_item">selected</dtml-if>>
+&dtml-x_sequence_item;</option>
+</dtml-in>
+</select> 
+<b><dtml-translate domain="zwiki">Severity</dtml-translate>:</b>
+<select name="severity" class="formfield">
+<dtml-in issue_severities prefix=x>
+<option <dtml-if "severity==x_sequence_item">selected</dtml-if>>
+&dtml-x_sequence_item;</option>
+</dtml-in>
+</select> 
+<b><dtml-translate domain="zwiki">Status</dtml-translate>:</b>
+<select name="status" class="formfield">
+<dtml-in issue_statuses prefix=x>
+<option <dtml-if "status==x_sequence_item">selected</dtml-if>>
+&dtml-x_sequence_item;</option>
+</dtml-in>
+</select>
+</dtml-let>
+<br /><b><dtml-translate domain="zwiki">Optional subject</dtml-translate>:</b> <input type="text" name="log" value="" size="55" maxlength="100" class="formfield">&nbsp;
+<input name="submit" type="submit" value="Change">
+<br />
+<b><dtml-translate domain="zwiki">Optional comment</dtml-translate>:</b> <textarea 
+wrap="virtual" name="text" rows="3" cols="50" class="formfield"
+style="vertical-align:top"
+title=""
+i18n:attributes="title">
+</textarea>
+</td></tr></table>
+</form>
+<!-- end of issue properties form -->

Added: zope-zwiki/branches/upstream/current/plugins/tracker/issuetracker.pt
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/tracker/issuetracker.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/tracker/issuetracker.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,18 @@
+<html metal:use-macro="here/main_template/macros/master" i18n:domain="zwiki" >
+  <head>
+    <title metal:fill-slot="title_slot" tal:content="
+           string:${container/title} issue tracker" />
+    <metal:block metal:fill-slot="head_slot">
+      <metal:block metal:use-macro="here/macros/formsearchtags" />
+    </metal:block>
+  </head>
+  <body>
+    <div metal:fill-slot="main" tal:omit-tag="">
+      <metal:macro metal:use-macro="here/macros/accesskeys" />
+      <h1 i18n:translate="">Issue tracker</h1>
+      <div class="formcontent"
+           tal:content="structure python:
+                        here.getSkinTemplate('IssueTracker')(here,request)" />
+    </div>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/plugins/tracker/tracker.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/tracker/tracker.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/tracker/tracker.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,646 @@
+# PluginTracker mixin
+
+from __future__ import nested_scopes
+import os, string, re, os.path
+from string import join, split, strip
+from types import *
+
+import DocumentTemplate
+from AccessControl import getSecurityManager, ClassSecurityInfo
+from Globals import InitializeClass, package_home
+
+from Products.ZWiki.plugins import registerPlugin
+from Products.ZWiki.Defaults import registerPageMetaData
+from Products.ZWiki import Permissions
+from Products.ZWiki.Utils import BLATHER, formattedTraceback, addHook
+from Products.ZWiki.Views import loadDtmlMethod, loadPageTemplate, TEMPLATES
+     
+from Products.ZWiki.I18n import _
+
+TEMPLATES.update({
+    'issuepropertiesform': loadDtmlMethod('issuepropertiesform','plugins/tracker'),
+    # page template wrappers
+    'issuetracker'       : loadPageTemplate('issuetracker','plugins/tracker'),
+    'issuebrowser'       : loadPageTemplate('issuebrowser','plugins/tracker'),
+    'filterissues'       : loadPageTemplate('filterissues','plugins/tracker'),
+    # the DTML implementations
+    'IssueTracker'       : loadDtmlMethod('IssueTracker','plugins/tracker'),
+    'IssueBrowser'       : loadDtmlMethod('IssueBrowser','plugins/tracker'),
+    'FilterIssues'       : loadDtmlMethod('FilterIssues','plugins/tracker'),
+    })
+
+# issue tracker defaults, will be installed as folder properties
+ISSUE_CATEGORIES = [
+    'general',
+    ]
+ISSUE_SEVERITIES = [
+    'critical',
+    'serious',
+    'normal',
+    'minor',
+    'wishlist',
+    ]
+ISSUE_STATUSES = [
+    'open',
+    'pending',
+    'closed',
+    ]
+# this is a list of strings like 'category,status,severity,colour' any of
+# which may be empty (a wildcard). The first entry matching the issue
+# will be used.
+ISSUE_COLOURS = [
+    ',open,critical ,#ff2222',
+    ',open,serious  ,#ff9090',
+    ',open,normal   ,#ffbbbb',
+    ',open,minor    ,#ffdddd',
+    ',open,wishlist ,#e0e0e0',
+    ',open,         ,#ffe0e0',
+    ',pending,      ,#ffcc77',
+    ',closed,       ,#bbeebb',
+    ',,             ,',
+    ]
+
+TRACKER_METADATA = [
+    'category',
+    'category_index',
+    'severity',
+    'severity_index',
+    'status',
+    'status_index',
+    'issueColour',
+    ]
+for a in TRACKER_METADATA: registerPageMetaData(a)
+
+
+class PluginTracker:
+    """
+    This mix-in class adds some methods to ZWikiPage to facilitate
+    wiki-based issue trackers.
+    """
+    security = ClassSecurityInfo()
+    
+    security.declareProtected(Permissions.View, 'hasIssues')
+    def hasIssues(self): # likely.
+        """
+        True if this wiki has any issue pages.
+        """
+        return self.issueCount() > 0
+
+    security.declareProtected(Permissions.View, 'issueCount')
+    def issueCount(self):
+        """
+        The number of issue pages in this wiki.
+        """
+        return len(filter(lambda x:self.isIssue(x),self.pageNames()))
+
+    security.declareProtected(Permissions.View, 'isIssue')
+    def isIssue(self,pagename=None):
+        """
+        True if this page (or another named page) represents a tracker issue.
+        """
+        return (
+            self.issueNumberFrom(pagename or self.pageName()) or
+            hasattr(self.aq_base,'status')
+            ) and 1
+            #hasattr(getattr(self,'aq_base',self),'status') if tests break
+
+    security.declareProtected(Permissions.View, 'issueNumber')
+    def issueNumber(self):
+        """
+        This page's issue number, or None.
+        """
+        numberandname = self.issueNumberAndNameFrom(self.pageName())
+        return numberandname and numberandname[0]
+
+    security.declareProtected(Permissions.View, 'issueName')
+    def issueName(self):
+        """
+        This page's issue name (the non-number part), or None.
+        """
+        numberandname = self.issueNumberAndNameFrom(self.pageName())
+        return numberandname and numberandname[1]
+
+    security.declareProtected(Permissions.View, 'issueNumberFrom')
+    def issueNumberFrom(self, pagename):
+        """
+        Extract the issue number from a page name, or None.
+        """
+        numberandname = self.issueNumberAndNameFrom(pagename)
+        return numberandname and numberandname[0]
+
+    security.declareProtected(Permissions.View, 'issueNameFrom')
+    def issueNameFrom(self, pagename):
+        """
+        Extract the issue name part from a page name, or None.
+        """
+        numberandname = self.issueNumberAndNameFrom(pagename)
+        return numberandname and numberandname[1]
+
+    def shortIssueNamesEnabled(self):
+        """Should issue page names start with just # in this wiki ?"""
+        return 1 #return getattr(self.folder(),'short_issue_names',1) and 1
+
+    security.declareProtected(Permissions.View, 'issueNumberAndNameFrom')
+    def issueNumberAndNameFrom(self, pagename):
+        """
+        Extract issue number and issue name from a page name if possible.
+
+        Returns a tuple of (issuenumber, issuename) strings, or (None,
+        pagename) if no issue number can be found. The issue name is
+        stripped of surrounding whitespace.
+
+        Should be able to parse the format generated by
+        pageNameFromIssueNumberAndName, and other common formats for
+        compatibility For example:
+
+         IssueNoN ISSUENAME
+         IssueNoN
+
+        and when short_issue_names is enabled:
+        
+         #N ISSUENAME
+         #N
+
+        where N is one or more digits and ISSUENAME is any text.
+        """
+        m = (re.match(r'(?s)^IssueNo([0-9]+)(.*)',pagename) or
+             (self.shortIssueNamesEnabled() and
+              re.match(r'(?s)^#([0-9]+)(.*)',pagename)))
+        if m: return (int(m.group(1)), m.group(2).strip())
+        else: return (None,pagename.strip())
+
+    security.declareProtected(Permissions.View, 'pageNameFromIssueNumberAndName')
+    def pageNameFromIssueNumberAndName(self, number, name):
+        """
+        Make a page name from an issue number and issue name.
+
+        This method controls the naming of new issue pages.  There are
+        currently two variants, controlled by the short_issue_names folder
+        property.  It should be parseable by issueNumberAndNameFrom.
+        Expects number:int, name:str.
+        """
+        if self.shortIssueNamesEnabled():
+            return self.shortIssueNameFrom(number,name)
+        else:
+            return self.longIssueNameFrom(number,name)
+
+    security.declareProtected(Permissions.View, 'issuePageWithNumber')
+    def issuePageWithNumber(self, number):
+        """
+        Return the issue page with the specified issue number, or None.
+
+        Tries both the short and long issue page name formats;
+        should match issueNumberAndNameFrom.
+        It's harmless to call this with a non-number.
+        """
+        if type(number) != IntType: return None
+        return (
+            self.pageWithFuzzyName(self.shortIssueNameFrom(number),
+                                   allow_partial=1,
+                                   numeric_match=1) or
+            self.pageWithFuzzyName(self.longIssueNameFrom(number),
+                                   allow_partial=1,
+                                   numeric_match=1))
+
+    def shortIssueNameFrom(self, number, name=''):
+        """
+        Make up an issue page name from the issue number & description.
+
+        (name here means the text part, ie the issue description).
+
+        If number is None, just returns name unchanged.
+        """
+        if number != None:
+            return '#%d %s' % (number,name)
+        else:
+            return name
+
+    def longIssueNameFrom(self, number, name=''):
+        return 'IssueNo%04d %s' % (number,name)
+
+    security.declareProtected(Permissions.Add, 'createIssue')
+    def createIssue(self, pageid='', text='', title=None,
+                    category='', severity='', status='', REQUEST=None,
+                    sendmail=1):
+        """
+        Create a page representing an issue with the specified details.
+
+        Security notes: sets title/category/severity/status properties
+        without requiring Manage properties permission.
+        create() will also check the edits_need_username property and
+        redirect us to /denied if appropriate.
+
+        We try to place the issue under a suitable parent - the
+        IssueTracker page if it exists, or at the top level to avoid
+        having issues scattered everywhere. Better ideas ?
+
+        Returns the new page name or None.
+
+        XXX clean up old args kept for backwards compatibility. Only
+        really old issue tracker dtml pages call this directly.
+        pageid is really pagename.  title is not used.
+        """
+        # XXX hardcoded.. cf trackerUrl
+        if self.pageWithName('IssueTracker'): parents = ['IssueTracker']
+        else: parents = []
+        # might fail due to edits_need_username
+        name = self.create(pageid,text=text,REQUEST=REQUEST,parents=parents,
+                           sendmail=sendmail)
+        if name:
+            issue = self.pageWithName(pageid)
+            issue.manage_addProperty('category','issue_categories','selection')
+            issue.manage_addProperty('severity','issue_severities','selection')
+            issue.manage_addProperty('status','issue_statuses','selection')
+            issue.manage_changeProperties(title=pageid,
+                                          category=category,
+                                          severity=severity,
+                                          status=status
+                                          )
+            #self.index_object() # XXX why ??
+            return name
+        else:
+            return None
+
+    security.declareProtected(Permissions.Add, 'createNextIssue')
+    def createNextIssue(self,name='',text='',category='',severity='',status='',
+                        REQUEST=None,sendmail=1):
+        """
+        Add a new issue page, using the next available number, and redirect.
+
+        createIssue() (really create()) will also check the
+        edits_need_username property and may redirect to an error.
+        Otherwise this will redirect to the tracker url (when called
+        via the web). Returns the new page's name or None.
+        """
+        newnumber = self.nextIssueNumber(REQUEST=REQUEST)
+        pagename=self.pageNameFromIssueNumberAndName(newnumber,name)
+        pagename=self.createIssue(pagename,text,None, 
+                                  category,severity,status,REQUEST,sendmail)
+        if pagename:
+            if REQUEST:
+                REQUEST.RESPONSE.redirect(self.trackerUrl())
+        return pagename
+
+    security.declareProtected(Permissions.View, 'nextIssueNumber')
+    def nextIssueNumber(self, REQUEST=None):
+        """
+        Get the next available issue number.
+
+        Adds one to the current highest issue number, so gaps are allowed.
+        Handles both old and new-style issue page names.
+        
+        Does a catalog search, so REQUEST may be required to authenticate
+        and get the proper results. I think.
+        """
+        issuenumbers = [self.issueNumberFrom(b.Title) for b in \
+                        self.pages(isIssue=1,REQUEST=REQUEST)]
+        issuenumbers.sort()
+        return (([0]+issuenumbers)[-1]) + 1
+
+    security.declareProtected(Permissions.Edit, 'changeIssueProperties')
+    def changeIssueProperties(self, name=None, category=None, severity=None, 
+                              status=None, log=None, text='', REQUEST=None):
+        """
+        Change an issue page's properties and redirect back there.
+
+        Also, add a comment to the page describing what was done.
+        Optionally a comment subject and body can be set.
+
+        name is the issue name excluding the issue number. Changing this
+        will trigger a page rename, which may be slow.
+        
+        Security: allows modification of some properties
+        (title/category/severity/status) with zwiki edit permission rather
+        than zope Manage properties permission.
+
+        Upgrade issue: calling this before upgrading an issue to a
+        0.17-style page id will mess up the id/title.
+        """
+        if not self.checkSufficientId(REQUEST):
+            return self.denied(
+                _("Sorry, this wiki doesn't allow anonymous edits. Please configure a username in options first."))
+
+        comment = ''
+        if name:
+            if name != self.issueName():
+                newpagename = self.pageNameFromIssueNumberAndName(
+                    self.issueNumber(),
+                    name)
+                comment += "Name: '%s' => '%s' \n" % (self.pageName(),
+                                                      newpagename)
+                if not self.checkPermission(Permissions.Rename, self):
+                    raise 'Unauthorized', (_('You are not authorized to rename this ZWiki Page.'))
+                self.rename(newpagename, updatebacklinks=1, sendmail=0,
+                            REQUEST=REQUEST)
+        if category:
+            old = getattr(self,'category','')
+            if category != old:
+                comment += "Category: %s => %s \n" % (old,category)
+                if not self.checkPermission(Permissions.Edit, self):
+                    raise 'Unauthorized', (_('You are not authorized to edit this ZWiki Page.'))
+                self.manage_changeProperties(category=category)
+        if severity:
+            old = getattr(self,'severity','')
+            if severity != old:
+                comment += "Severity: %s => %s \n" % (old,severity)
+                if not self.checkPermission(Permissions.Edit, self):
+                    raise 'Unauthorized', (_('You are not authorized to edit this ZWiki Page.'))
+                self.manage_changeProperties(severity=severity)
+        if status:
+            old = getattr(self,'status','')
+            if status != old:
+                comment += "Status: %s => %s \n" % (old,status)
+                if not self.checkPermission(Permissions.Edit, self):
+                    raise 'Unauthorized', (_('You are not authorized to edit this ZWiki Page.'))
+                self.manage_changeProperties(status=status)
+        if text:
+            comment += '\n' + text
+
+        if comment:
+            if not self.checkPermission(Permissions.Comment, self):
+                raise 'Unauthorized', (_('You are not authorized to comment on this ZWiki Page.'))
+            # there was a change, note it on the page and via mail
+            # fine detail: don't say (property change) if there wasn't
+            subject = ''
+            if log: subject += log
+            #if '=>' in comment: subject += ' (%s)' % _('property change')
+            self.comment(
+                text=comment,
+                subject_heading=subject,
+                REQUEST=REQUEST)
+            # comment takes care of this I believe
+            #self.setLastEditor(REQUEST)
+            #self.reindex_object()
+        if REQUEST:
+            REQUEST.RESPONSE.redirect(self.pageUrl())
+
+    def category_index(self):
+        """helper method to facilitate sorting catalog results"""
+        try:
+            return 1 + list(self.issue_categories).index(self.category)
+        except (AttributeError,ValueError):
+            return 0
+        
+    def severity_index(self):
+        """helper method to facilitate sorting catalog results"""
+        try:
+            return 1 + list(self.issue_severities).index(self.severity)
+        except (AttributeError,ValueError):
+            return 0
+
+    def status_index(self):
+        """helper method to facilitate sorting catalog results"""
+        try:
+            return 1 + list(self.issue_statuses).index(self.status)
+        except (AttributeError,ValueError):
+            return 0
+
+    # UI methods
+
+    security.declareProtected(Permissions.View, 'issuetracker')
+    def issuetracker(self, REQUEST=None):
+        """
+        Render the issuetracker form (template-customizable).
+        """
+        return self.getSkinTemplate('issuetracker')(self,REQUEST)
+
+    security.declareProtected(Permissions.View, 'filterissues')
+    def filterissues(self, REQUEST=None):
+        """
+        Render the filterissues form (template-customizable).
+        """
+        return self.getSkinTemplate('filterissues')(self,REQUEST)
+
+    security.declareProtected(Permissions.View, 'issuebrowser')
+    def issuebrowser(self, REQUEST=None):
+        """
+        Render the issuebrowser form (template-customizable).
+        """
+        return self.getSkinTemplate('issuebrowser')(self,REQUEST)
+
+    security.declareProtected(Permissions.View, 'addIssueFormTo')
+    def addIssueFormTo(self,body):
+        """
+        Add an issue property form above the rendered page text.
+        """
+        REQUEST = getattr(self,'REQUEST',None)
+        return self.stxToHtml(self.issuepropertiesform(REQUEST=REQUEST)) + body
+            
+    security.declareProtected(Permissions.View, 'issueColour')
+    def issueColour(self):
+        """
+        Tell the appropriate issue colour for this page.
+        """
+        # don't acquire these
+        return self.issueColourFor(
+            getattr(getattr(self,'aq_base',self),'category',''),
+            getattr(getattr(self,'aq_base',self),'severity',''),
+            getattr(getattr(self,'aq_base',self),'status',''),
+            )
+
+    security.declareProtected(Permissions.View, 'issueColourFor')
+    def issueColourFor(self, category='', severity='', status=''):
+        """
+        Choose an issue colour based on issue properties.
+
+        Finds the best match in a list of strings like
+        "category,status,severity,colour", any of which may be empty.  The
+        defaults can be overridden with an 'issue_colours' folder lines
+        property.
+
+        If no match is found in the colour list, returns the empty string.
+        """
+        category, status, severity = map(lambda x:x.strip(),
+                                         (category, status, severity))
+        # can't figure out a reasonable way to do this without python 2.1
+        # convert the strings into dictionaries
+        colours = getattr(self.folder(),'issue_colours',ISSUE_COLOURS)
+        colours = filter(lambda x:x.strip(),colours)
+        l = []
+        for i in colours:
+            a, b, c, d = map(lambda x:x.strip(),i.split(','))
+            l.append({
+                'category':a,
+                'status':b,
+                'severity':c,
+                'colour':d,
+                })
+        # find the most specific match
+        l = l and (filter(lambda x:x['category']==category, l) or
+                   filter(lambda x:x['category']=='', l))
+        l = l and (filter(lambda x:x['status']==status, l) or
+                   filter(lambda x:x['status']=='', l))
+        l = l and (filter(lambda x:x['severity']==severity, l) or
+                   filter(lambda x:x['severity']=='', l))
+        if not l:
+            return ''
+        else:
+            return l[0]['colour']
+    
+    security.declareProtected(Permissions.View, 'issuepropertiesform')
+    def issuepropertiesform(self, REQUEST=None):
+        """
+        Render the issue properties form as a (customizable) HTML fragment.
+        """
+        return self.getSkinTemplate('issuepropertiesform')(self,REQUEST)
+
+    security.declareProtected(Permissions.View, 'trackerUrl')
+    def trackerUrl(self):
+        return self.urlForDtmlPageOrMethod('IssueTracker','issuetracker')
+
+    security.declareProtected(Permissions.View, 'filterUrl')
+    def filterUrl(self):
+        return self.urlForDtmlPageOrMethod('FilterIssues','filterissues')
+
+    security.declareProtected(Permissions.View, 'filterUrl')
+    def issueBrowserUrl(self):
+        return self.urlForDtmlPageOrMethod('IssueBrowser','issuebrowser')
+
+    # setup methods
+
+    security.declareProtected('Manage properties', 'setupTracker')
+    def setupTracker(self,REQUEST=None,pages=0):
+        """
+        Configure this wiki for issue tracking.
+
+        This
+        - sets up the necessary extra catalog fields
+        - sets up issue_* folder properties, for customizing
+        - creates a dummy issue, if needed, to activate the issue links/tabs
+        - if pages=1, installs forms as DTML pages, for easy customizing
+        
+        Safe to call more than once; will ignore any already existing
+        items.  
+        """
+        TextIndexes = [
+            ]
+        FieldIndexes = [
+            'category',
+            'category_index',
+            'isIssue',
+            'issueNumber',
+            'severity',
+            'severity_index',
+            'status',
+            'status_index',
+            ]
+        KeywordIndexes = [
+            ]
+        DateIndexes = [
+            ]
+        PathIndexes = [
+            ]
+        # make sure we have a basic zwiki catalog set up
+        self.setupCatalog(reindex=0)
+        catalog = self.catalog()
+        catalogindexes, catalogmetadata = catalog.indexes(), catalog.schema()
+        PluginIndexes = catalog.manage_addProduct['PluginIndexes']
+        # add indexes,
+        for i in TextIndexes:
+            if not i in catalogindexes: PluginIndexes.manage_addTextIndex(i)
+        for i in FieldIndexes:
+            if not i in catalogindexes: PluginIndexes.manage_addFieldIndex(i)
+        for i in KeywordIndexes:
+            if not i in catalogindexes: PluginIndexes.manage_addKeywordIndex(i)
+        for i in DateIndexes:
+            if not i in catalogindexes: PluginIndexes.manage_addDateIndex(i)
+        for i in PathIndexes:
+            if not i in catalogindexes: PluginIndexes.manage_addPathIndex(i)
+        # metadata,
+        # setupCatalog just does this by default now, since
+        # ensureCompleteMetadataIn always tries to fetch all metadata
+        #for m in TRACKER_METADATA:
+        #    if not m in catalogmetadata: catalog.manage_addColumn(m)
+        # properties,
+        self.upgradeFolderIssueProperties()
+        # dtml pages,
+        if pages:
+            dir = package_home(globals())
+            for page in ['IssueTracker','FilterIssues','IssueBrowser']:
+                if not self.pageWithName(page):
+                    self.create(page,
+                                text=open(os.path.join(dir,page+'.dtml'),'r').read(),
+                                sendmail=0)
+            # also, disable subtopics display under IssueTracker
+            self.IssueTracker.setSubtopicsPropertyStatus(0)
+        # index each page, to make all indexes and metadata current
+        # may duplicate some work in setupCatalog
+        n = 0
+        cid = self.catalog().getId()
+        for p in self.pageObjects():
+            n = n + 1
+            try:
+                BLATHER('indexing page #%d %s in %s'%(n,p.id(),cid))
+                p.index_object(log=0)
+            except:
+                BLATHER('failed to index page #%d %s: %s' \
+                        % (n,p.id(),formattedTraceback()))
+        BLATHER('indexing complete, %d pages processed' % n)
+        # and a dummy issue to enable site navigation links
+        if not self.hasIssues():
+            self.createNextIssue(
+                'first issue',
+                'This issue was created to activate the issue tracker links/tabs. You can re-use it.',
+                ISSUE_CATEGORIES[-1],
+                ISSUE_SEVERITIES[-1],
+                ISSUE_STATUSES[-1],
+                REQUEST=REQUEST)
+        if REQUEST: REQUEST.RESPONSE.redirect(self.trackerUrl())
+
+    def upgradeFolderIssueProperties(self):
+        """
+        Upgrade issue tracker related properties on the wiki folder if needed.
+
+        Currently just adds properties if missing.
+        """
+        folder = self.folder()
+        existingprops = map(lambda x:x['id'], folder._properties)
+        for prop, values in [
+            ['issue_categories',ISSUE_CATEGORIES],
+            ['issue_severities',ISSUE_SEVERITIES],
+            ['issue_statuses',ISSUE_STATUSES],
+            ['issue_colours',ISSUE_COLOURS],
+            ]:
+            if not prop in existingprops:
+                folder.manage_addProperty(prop,join(values,'\n'),'lines')
+                    
+    def upgradeIssueProperties(self):
+        """
+        Upgrade tracker related properties on this page (and folder) if needed.
+
+        Returns non-zero if we changed any page properties, to help
+        upgrade() efficiency.
+        """
+        changed = 0
+        if self.isIssue():
+            # check folder first so our selection properties will work
+            self.upgradeFolderIssueProperties()
+            
+            existingprops = map(lambda x:x['id'], self._properties)
+            for prop, values, default in [
+                ['category','issue_categories',None],
+                ['severity','issue_severities','normal'],
+                ['status','issue_statuses',None],
+                ]:
+                if not prop in existingprops:
+                    self.manage_addProperty(prop,values,'selection')
+                    if default: setattr(self,prop,default)
+                    changed = 1
+        return changed
+
+InitializeClass(PluginTracker)
+registerPlugin(PluginTracker)
+
+# register some upgrade hooks
+from Products.ZWiki.Admin import upgrade_hooks, upgradeId_hooks
+
+# install issue properties if missing, eg if this page is being
+# viewed as an issue for the first time
+addHook(upgrade_hooks, PluginTracker.upgradeIssueProperties)
+
+# convert old-style IssueNNNN ... page names to #NNNN ...
+# when checking page id. Leaves non-issue page names unchanged.
+addHook(upgradeId_hooks,
+        lambda self:
+        self.pageNameFromIssueNumberAndName(self.issueNumber(),
+                                            self.issueName()))

Added: zope-zwiki/branches/upstream/current/plugins/tracker/tracker_tests.py
===================================================================
--- zope-zwiki/branches/upstream/current/plugins/tracker/tracker_tests.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/plugins/tracker/tracker_tests.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,97 @@
+from Products.ZWiki.testsupport import *
+ZopeTestCase.installProduct('ZWiki')
+ZopeTestCase.installProduct('ZCatalog')
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(TestsOfTrackerSetup))
+    suite.addTest(unittest.makeSuite(Tests))
+    return suite
+
+class TestsOfTrackerSetup(ZwikiTestCase):
+
+    def test_setupTracker(self):
+        p = self.p
+        self.assertEqual(p.issueCount(),0)
+        p.setupTracker()
+        self.assertEqual(p.issueCount(),1)
+        self.assert_(hasattr(p.folder(),'issue_severities'))
+
+    def test_issueParentageWithSkinBasedTracker(self):
+        f = self.p.folder()
+        self.p.setupTracker()
+        # without a tracker page, issues are parented under the creating page
+        self.assertEqual(f['1FirstIssue'].parents,[])
+        f['1FirstIssue'].createNextIssue('test')
+        self.assertEqual(f['2Test'].parents,[])
+        
+    def test_issueParentageWithPageBasedTracker(self):
+        # with a tracker page, issues are parented under that
+        f = self.p.folder()
+        # make html pages, as making 3 stx pages takes a second or more each!
+        f.allowed_page_types = ['html']
+        self.p.setupTracker(pages=1)
+        self.assertEqual(f['1FirstIssue'].parents,['IssueTracker'])
+        f['1FirstIssue'].createNextIssue('test')
+        self.assertEqual(f['2Test'].parents,['IssueTracker'])
+
+    def test_upgradeIssueProperties(self):
+        self.p.create('IssueNo0001')
+        p = self.p.pageWithName('IssueNo0001')
+        self.assert_(not hasattr(p,'severity'))
+        p.upgradeIssueProperties()
+        self.assert_(hasattr(p,'severity'))
+        self.assertEqual(p.severity,'normal')
+
+
+class Tests(ZwikiTestCase):
+    def afterSetUp(self):
+        ZwikiTestCase.afterSetUp(self)
+        self.p.setupTracker()
+
+    def test_isIssue(self):
+        isIssue = self.p.isIssue
+        self.assert_(not isIssue('blah'))
+        self.assert_(not isIssue('1'))
+        self.assert_(not isIssue('IssueNo'))
+        self.assert_(    isIssue('IssueNo1'))
+        self.assert_(    isIssue('#1'))
+        
+    def test_issueNumberFrom(self):
+        issueNumberFrom = self.p.issueNumberFrom
+        self.assertEqual(issueNumberFrom('IssueNo1'),1)
+        self.assertEqual(issueNumberFrom('IssueNo1 blah'),1)
+        self.assertEqual(issueNumberFrom('#2'),2)
+        self.assertEqual(issueNumberFrom('#2 blah'),2)
+
+    def test_createNextIssue(self):
+        self.p.createNextIssue('b')
+        self.assert_(self.p.pageWithName('#2 b'))
+        self.assertEqual(self.p.issueCount(),2)
+
+    def test_nextIssueNumber(self):
+        self.assertEqual(self.p.nextIssueNumber(),2)
+        self.p.createNextIssue('b')
+        self.assertEqual(self.p.nextIssueNumber(),3)
+
+    def test_issuePageWithNumber(self):
+        self.assert_(self.p.issuePageWithNumber(1))
+        self.assert_(not self.p.issuePageWithNumber(2))
+        self.p.createIssue('#456 test')
+        self.assert_(not self.p.issuePageWithNumber(4))
+        self.assert_(not self.p.issuePageWithNumber(4567))
+        self.assert_(self.p.issuePageWithNumber(456))
+
+    def test_issue_links(self):
+        # test the full two-step linking procedure
+        link = lambda t: self.p.renderMarkedLinksIn(self.p.markLinksIn(t))
+        # #1 links to issue 1
+        self.assertEquals(link('#1')[-6:],  '#1</a>')
+        # [#1] doesn't (should ?)
+        self.assertEquals(link('[#1]')[-6:],  '>?</a>')
+        # an issue name part doesn't matter
+        self.p.createIssue('#987 test')
+        self.assertEquals(link('#987')[-8:],'#987</a>')
+        # all digits are required
+        self.failIf(link('#9')[-6:].endswith('</a>'))
+

Added: zope-zwiki/branches/upstream/current/refresh.txt
===================================================================

Added: zope-zwiki/branches/upstream/current/scripts/README
===================================================================
--- zope-zwiki/branches/upstream/current/scripts/README	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/scripts/README	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,7 @@
+Miscellaneous dtml methods and scripts which you can add to
+your wiki using the ZMI. These are not installed automatically.
+
+pagesByType.dtml - dtml method to list pages by type
+print.dtml - dtml method for flattening and page and subtopics
+toc.py - pythonscript for zwiki.org-style tables of contents
+view_source.dtml - dtml method for viewing source of things

Added: zope-zwiki/branches/upstream/current/scripts/pagesByType.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/scripts/pagesByType.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/scripts/pagesByType.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,33 @@
+# call this dtml method in the context of the wiki folder
+# to see zwiki pages grouped by page type. This should
+# work in a page pretty easily too.
+# 
+# you might need to put the folder id before objectValues
+# in some vhost setups ? please report
+
+<dtml-var standard_html_header>
+<dtml-let 
+ p="objectValues('ZWiki Page')[0]"
+ pagetypes="['stx','rst','moin','html','plaintext']"
+ >
+
+<h2>Wiki pages by type</h2>
+<p>
+<ul>
+<dtml-in pagetypes prefix=a>
+<li> <a href="#&dtml-a_item;">&dtml-a_item;</a>: <dtml-var "_.len(p.pages(page_type=a_item))">
+</dtml-in>
+<li> total: <dtml-var "p.pageCount()">
+</ul>
+
+<dtml-in pagetypes prefix=a>
+<a name="&dtml-a_item;"><h2>&dtml-a_item; pages</h2></a>
+<p>
+<dtml-in "p.pages(page_type=a_item)" prefix=b>
+- <a href="&dtml-id;">&dtml-Title;</a>
+</dtml-in>
+</dtml-in>
+
+
+</dtml-let>
+<dtml-var standard_html_footer>

Added: zope-zwiki/branches/upstream/current/scripts/print.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/scripts/print.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/scripts/print.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,71 @@
+<HTML>
+<HEAD>
+<TITLE><dtml-var "aq_parent.title"><dtml-var pageName></TITLE>
+<dtml-if standard_wiki_stylesheet><link rel="stylesheet" type="text/css" href="standard_wiki_stylesheet" /></dtml-if>
+<SCRIPT LANGUAGE="JavaScript">
+<!-- Begin
+function printdialog(text){
+text=document
+print(text)
+}
+//  End -->
+</script>
+</HEAD>
+<BODY>
+<dtml-if "REQUEST.get('with_children',0)">
+<dtml-call "REQUEST.set('print_w_children','1')">
+<dtml-else>
+<dtml-call "REQUEST.set('print_w_children','')">
+</dtml-if>
+<!-- display header -->
+<dtml-unless "REQUEST.get('no_print_header',0)">
+<p>
+<table width="100%"><tr><td><em>Printer friendly format for &dtml-pageUrl; 
+<dtml-if "REQUEST.get('with_children',0)">
+and all child pages</dtml-if>
+:</em></td>
+<td align="right">
+<FORM><INPUT NAME="print" TYPE="button" VALUE="Print this document" ONCLICK="printdialog()"></FORM>
+Display 
+<dtml-if print_w_children>
+<a href="&dtml-URL1;/print">without</a> 
+<dtml-else>
+<a href="&dtml-URL1;/print?with_children=1">with</a> 
+</dtml-if>
+child pages or 
+<a href="&dtml-URL1;/print?<dtml-if print_w_children>with_children=1&amp;</dtml-if>no_print_header=1">without header</a>
+</td></tr></table>
+</p></dtml-unless>
+<!-- build page info -->
+<dtml-let folder="folder()">
+<dtml-if print_w_children>
+<dtml-call "REQUEST.set('page_offspring',offspringIdsAsList())">
+<dtml-else>
+<dtml-call "REQUEST.set('page_offspring',[])">
+</dtml-if>
+<!-- display page(s) -->
+<dtml-in "[id()] + page_offspring" prefix=x>
+<dtml-let page="folder[x_sequence_item]">
+<p>
+<table width="100%" border="0" cellspacing="0" cellpadding="3"  
+bgcolor="#f0f0f0"
+><tr><td>
+<h1><dtml-var "page.pageName()"></h1>
+</td>
+</tr>
+</table>
+<dtml-try>
+<dtml-var "page(bare=1)">
+<dtml-except>
+<p>
+Could not render
+</p>
+</dtml-try>
+<br />
+</p>
+
+</dtml-let>
+</dtml-in>
+</dtml-let>
+</BODY>
+</HTML>

Added: zope-zwiki/branches/upstream/current/scripts/toc.py
===================================================================
--- zope-zwiki/branches/upstream/current/scripts/toc.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/scripts/toc.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,86 @@
+## Script (Python) "toc"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=columns, headings=('Basics','Intermediate','Advanced'), colours=('#3F5ACE','red','black')
+##title=
+##
+## Generates a multi-column table of contents for a wiki page
+## SKWM inspired by silverorange.
+## columns is a list of lists, usually three
+## example: <dtml-var "toc(None, [], ['section1','section2'])">
+## None means hide that column
+## [] means show the column heading only
+## section names are linked to #1, #2.. you should create those named anchors.
+## headings and colours may be overridden
+
+
+linkindex = 1
+
+print """
+<!-- toc macro start -->
+<table border="0" width="100%%">
+  <tr>
+"""
+columnwidth = 100/len(columns)
+colindex = 0
+
+for column in columns:
+
+    print """
+    <td valign="top" width="%s%%">
+    """ % (columnwidth)
+
+    if column is not None:
+        heading, colour = headings[colindex], colours[colindex]
+
+        print """
+      <table border="0" cell padding="0" cellspacing="0" width="100%%" style="margin-bottom: 4px;">
+        <tr>  
+          <td bgcolor="%s" nowrap class="subtext"><div style="color: #FFFFFF; padding-top: 3px; padding-left: 6px; padding-right: 6px;"><strong>%s</strong></div></td>
+          <td width="100%%">&nbsp;</td>
+        </tr>
+        <tr>
+          <td bgcolor="%s"><img src="/p_/sp" width="2" height="1" hspace="65" alt="" /></td>
+          <td colspan="2" bgcolor="%s"><img src="/p_/sp" width="3" height="3" alt="" /></td>
+        </tr>
+      </table>
+      <div class="pagecontents" style="font-size:small;">
+        <table>
+          <tr>
+            <td valign="top">
+              <ol style="margin-top: 0; margin-bottom: 0;" class="subtext" start="%s">
+        """ % (colour,heading,colour,colour,linkindex)
+
+        for link in column:
+            print """
+                      <li><a href="#%s">%s</a></li>
+            """ % (linkindex,link)
+            linkindex += 1
+
+        print """
+              </ol>
+            </td>
+          </tr>
+        </table>
+      </div>
+    </td>
+        """
+
+    else:
+        print """
+            &nbsp;
+        """
+
+    colindex += 1
+
+print """
+  </tr>
+</table>
+<!-- toc macro end -->
+
+"""
+
+return printed

Added: zope-zwiki/branches/upstream/current/scripts/view_source.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/scripts/view_source.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/scripts/view_source.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,4 @@
+<html><body><pre>
+<dtml-var "document_src(REQUEST,RESPONSE)" html_quote>
+</pre></body></html>
+<dtml-call "RESPONSE.setHeader('content-type','text/html')">

Added: zope-zwiki/branches/upstream/current/skins/zwiki/HelpPage.stx
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/HelpPage.stx	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/HelpPage.stx	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,140 @@
+This is the quick help page for Zwiki version 0.58.0
+<dtml-var "'(This site is currently running '"><dtml-var zwiki_version><dtml-var "').'"> 
+See also the more complete docs at http://zwiki.org , such as the 
+"UsersGuide":http://zwiki.org/UsersGuide .
+
+What is a wiki ?
+
+  This site is an example of a wiki - a kind of collaborative website. 
+  (*wiki wiki* means quick.) It is running Zwiki, a particular kind of wiki software.
+
+  Wikis try to make it as simple as possible to write and share useful content,
+  using intuitive page naming and text formatting conventions.
+  Wikis are usually (but not always) wide open and assume a cooperating community.
+  Anyone can edit, add comments, and make new pages on the spot.
+  It is often possible to upload files and pictures and get email notifications as well.
+
+User interface
+
+  Zwiki's user interface comes in two main flavours: 
+  "standard":http://zwiki.org and "plone":http://plone.demo.zwiki.org .
+  It may be further customized (skinned) by site administrators.
+
+  You can set your user name, time zone and other things by clicking "options".
+  (Some sites require this before you can make changes.)
+
+Navigation
+
+  Each page in a wiki has a unique name, most often a !WikiName - 
+  two or more capitalized words joined together. 
+  Free-form names, which can be any word or phrase, 
+  may also be used. A page name automatically links to that page.
+  ZWiki:RemoteWikiLinks - two wikinames joined by a colon - are links to other sites. 
+  You'll also see standard HTML links and URL links.
+
+  Certain standard links provide special functions such as an overview
+  of the wiki ("contents") or list of recently-changed pages
+  ("changes").  You can use the convenient "access keys":http://zwiki.org/QuickReference#access-keys 
+  to navigate.
+  
+
+  Click "backlinks" or the page title to see the list of pages which link to this one.
+
+Page hierarchy
+
+  Zwiki arranges pages in a hierarchy (outline), which helps to organize
+  things when there are many pages.  You can always see the overall wiki
+  outline by clicking "contents".  Some hierarchy features are hidden
+  unless you have reparent permission. Usually, you can
+
+  - visit the backlinks screen to *reparent* the current page (place it in the hierarchy)
+
+  - or, use the page management form at the bottom of the screen to reparent (create/rename/delete) pages. 
+
+  If enabled by the site admin, you'll also see a list of subtopics on each page.
+  You can use your browser's "n", "p", and "u" access keys to go to next page, to previous page, or up.
+
+Subscription
+
+  If you see a "subscribe" link, you can subscribe to receive comments by mail.
+  You can choose to receive comments just from that page or from the whole wiki.
+
+  1. Click "subscribe"
+
+  2. if needed, enter your email address and click "Change"
+
+  3. click the button to toggle your page or wiki subscription status
+    (green means you are subscribed).
+
+  If configured by the site admin, subscribers may also send comments by mail.
+  Just reply to a comment, or send mail to the wiki's mail-in address.
+  Your mail will go to the page named in brackets in the subject
+  (or to a default page).
+
+Editing
+
+  You have full editing rights to any page, unless restricted by the site
+  admin. Note your comments may be received by many subscribers. To avoid
+  this, please use SandBox for test comments. Tips:
+
+  - Add a comment using the form at the bottom of the page
+
+  - Click "edit" to change the page's text.
+    You may also be able to rename the page, upload a file, or choose other options here.
+  
+  - When you write a page name in wiki text, it automatically forms a link to that page
+    (free-form names must be enclosed in square brackets).
+    If that page does not yet exist, a ? link will appear; click that when you are ready to create it.
+  
+  - There are best practices for wiki editing which you'll get to know over time.
+
+Formatting rules
+
+   When you save a page, Zwiki formats and links your text according to some standard rules.
+   Different rules are applied depending on the *page type*;
+   they are described at ZWiki:TextFormattingRules.
+   Here is a quick primer for ZWiki:StructuredText 
+   (but note many zwikis now use ZWiki:RestructuredText which has some differences).
+
+   1. non-blank lines are run together to form a paragraph; 
+      paragraphs are separated by blank lines<br />
+
+   2. a one-line "paragraph" followed by a more-indented paragraph makes a
+      heading. Tip: you need only indent the first line.<br />
+
+   3. a paragraph beginning with - or a number followed by a space makes a bullet
+      or numbered list item; a more-indented list item starts a sub-list<br />
+
+   4. short text enclosed in 
+      &#42;...&#42; , 
+      &#42;&#42;...&#42;&#42; , 
+      &#95;...&#95; or 
+      &#39;...&#39; is *italic*, **bold**, _underlined_ or 'monospaced' respectively<br />
+
+   5. !WikiNames, ![Free-form name]s enclosed in brackets, ZWiki:RemoteWikiLinks , 
+      !http://bare/urls , and !"Structured Text links":http://zwiki.org/StructuredText are
+      made into hyperlinks
+
+   6. HTML tags may be added if necessary; on sites which permit it,
+      DTML (server-side code) may also be used <br />
+
+   7. short text enclosed in single quotes is quoted, ie
+      displayed in monospace font and protected from some of the above formatting. 
+      For reliable quoting of a body of text, indent it after a paragraph 
+      ending with a double colon ::
+
+       Like this (edit this page to see source).
+       This is the surest way to prevent WikiLinks, <HTML tags> and &dtml-tags;
+        and preserve
+         fixed-width formatting.
+
+   8. don't bother trying to learn all the text formatting rules and 
+      their interactions. Mimic the text around you;
+      when it does something unexpected, tweak it until it looks right; 
+      go to the docs or ask for help when you get really stuck or curious.
+
+Find out more
+
+  More about Zwiki: http://zwiki.org
+
+  More about wiki in general: WikiWikiWeb:FrontPage , WikiWikiWeb:EvolutionOfaWikizen

Added: zope-zwiki/branches/upstream/current/skins/zwiki/README
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/README	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/README	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,9 @@
+Templates, scripts, styleshees, images for Zwiki's skin. This skin works
+in both "standard" and "CMF/Plone" wikis. See also Views.py.
+
+Also some ZMI forms. See Wiki.py.
+
+The wiki-named dtml files like RecentChanges.dtml are snapshots of the
+evolving dynamic wiki pages of the same name at zwiki.org. They are used
+as helpers by the similarly named page templates (eg recentpages.pt), or
+can be installed as editable wiki pages via /setupDtmlPages.

Added: zope-zwiki/branches/upstream/current/skins/zwiki/RecentChanges.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/RecentChanges.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/RecentChanges.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,108 @@
+<dtml-call "RESPONSE.setHeader('Content-Type','text/html; charset=utf-8')">
+<dtml-let 
+ wikiurl=wiki_url
+ summaries="REQUEST.get('summaries',0)"
+ period="_.string.lower(REQUEST.get('period','day'))"
+ days="{
+   'day':1,
+   'week':7,
+   'month':30,
+   'year':365,
+   'ever':999999,
+   'default':3}[period]"
+ newdays="7"
+ now=ZopeTime
+ results="pages(lastEditTime={'query': now-days, 'range':'min'},sort_on='lastEditTime',sort_order='reverse')"
+ number="_.len(results)"
+ >
+<form action="&dtml-URL;" method="GET">
+  <table border="0">
+    <tr valign="top">
+      <dtml-if hasCatalog>
+      <td align="right"><dtml-translate domain=zwiki>Pages changed in the last</dtml-translate></td>
+      <dtml-in "['day','week','month','year','ever']" prefix=x>
+      <td align="center">
+        <input type=submit name=period value="&dtml-x_sequence_item;" 
+               <dtml-if "x_sequence_item==period">style="font-weight:bold"</dtml-if>
+               />
+        <dtml-if "x_sequence_item==period"><br />(&dtml-number;)</dtml-if>
+      </td>
+      </dtml-in>
+      <dtml-else>
+      <td align="right"><dtml-translate domain=zwiki>Recently changed pages, with summaries</dtml-translate>.</td>
+      </dtml-if>
+      <td>
+        <input type=checkbox name=summaries <dtml-if summaries>checked</dtml-if> />
+        <dtml-translate domain=zwiki>Show summaries ?</dtml-translate>
+      </td>
+      <dtml-unless hasCatalog>
+      <td align="center"><input type=submit value="<dtml-translate domain=zwiki>Refresh</dtml-translate>" /></td>
+      </dtml-unless>
+    </tr>
+  </table>
+</form>
+<table border="0" cellspacing="0" cellpadding="1" width="100%">
+  <tr>
+    <th align="left"><dtml-translate domain=zwiki>Page</dtml-translate></th>
+    <th align="left"><dtml-translate domain=zwiki>Edited&nbsp;by</dtml-translate>&nbsp;&nbsp;&nbsp;</th>
+    <th align="left"><dtml-translate domain=zwiki>Time</dtml-translate></th>
+  </tr>
+  <tr><td colspan=3></td></tr>
+  <dtml-comment>
+    < dtml-in results sort=lastEditTime reverse prefix=x>
+    had to use the catalog for sorting due to issue #1145 which breaks
+    this in zope 2.8/2.9. As a result sorting no longer works when there
+    is no catalog.
+  </dtml-comment>
+  <dtml-in results prefix=x>
+  <tr valign="top" <dtml-var "(x_sequence_odd and 'bgcolor=#f0f0f0') or ''">>
+    <td>
+      <a href="&dtml-wikiurl;/&dtml.url_quote-id;" 
+         title=""
+         style="background-color:<dtml-var issueColour>;"
+         ><dtml-var "formatWikiname(Title)"></a>
+      <dtml-if "creation_time and (now - _.DateTime(creation_time)) < newdays">
+      <small><span style="background-color:palegreen"><dtml-translate domain=zwiki>NEW</dtml-translate></span></small>
+      </dtml-if>
+      &nbsp;&nbsp;&nbsp;
+      <dtml-unless summaries>
+      <dtml-if last_log>
+      <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><em><dtml-var last_log></em></b><br/>&nbsp;
+      <dtml-else>
+      <br/><br/>
+      </dtml-if>
+      </dtml-unless>
+    </td>
+    <td align="left" nowrap="">
+      <dtml-if "last_editor and _.string.swapcase(last_editor) != last_editor">
+      <a href="&dtml-wikiurl;/<dtml-var "canonicalIdFrom(last_editor)">">&dtml-last_editor;</a>
+      <dtml-else>
+      <dtml-translate domain=zwiki>anonymous</dtml-translate>
+      </dtml-if>
+      &nbsp;&nbsp;&nbsp;
+    </td>
+    <td nowrap="">
+      <a href="&dtml-wikiurl;/&dtml-id;/diff">
+        <dtml-try><dtml-var "lastEditTime.toZone(zwiki_timezone)" fmt="pCommon">
+        <dtml-except><dtml-var lastEditTime fmt="pCommon">
+        </dtml-try>
+      </a>
+    </td>
+  </tr>
+  <dtml-if summaries>
+  <tr <dtml-var "(x_sequence_odd and 'bgcolor=#f0f0f0') or ''">>
+    <td colspan=2>
+      <small><dtml-var summary></small>
+      <dtml-if last_log>
+      <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><em><dtml-var last_log></em></b>&nbsp;
+      </dtml-if>
+      <br/><br/>
+    </td>
+    <td>&nbsp;</td>
+  </tr>
+  </dtml-if>
+  </dtml-in>
+</table>
+
+<dtml-translate domain=zwiki>Pages marked (NEW) have been created within the last week</dtml-translate>.
+</dtml-let>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/SearchPage.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/SearchPage.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/SearchPage.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,132 @@
+<dtml-call "RESPONSE.setHeader('Content-Type','text/html; charset=utf-8')">
+
+<!-- search form -->
+<p>
+<dtml-translate domain=zwiki>Enter a word or phrase and hit enter to search the entire wiki.</dtml-translate>
+<dtml-translate domain=zwiki>This is the same as using the search field at top right.</dtml-translate>  
+<p>
+<dtml-translate domain=zwiki>Tips: A single word works best for matching page names.</dtml-translate>  
+<dtml-translate domain=zwiki>Case-insensitivity and wildcards may be supported depending on your catalog configuration.</dtml-translate>  
+<dtml-translate domain=zwiki>Leave it blank to list all pages.</dtml-translate>  
+
+<table border="0" width="100%">
+<tr>
+<td>
+<form method="GET" action="&dtml-URL;">
+  search this wiki:<br />
+  <input name="expr" type="text" size="20" value="<dtml-var expr html_quote missing>" accesskey="s"
+  /><input type="submit" name="submit" value="<dtml-translate domain=zwiki>Search</dtml-translate>" />
+</form>
+</td>
+<td>
+<form method="GET" action="http://www.google.com/custom">
+  google search this wiki:<br />
+  <input type="hidden" name="sitesearch"  value="<dtml-var "wikiUrl().split('/')[2]">" />
+  <input type="hidden" name="cof" VALUE="L:&dtml-SERVER_URL;misc_/ZWiki/ZWikiPage_icon.gif"" />
+  <input type="hidden" name="site" value="<dtml-var "wikiUrl().split('/')[2]">" />
+  <input type="text" size="20" name="q" value="<dtml-var expr html_quote missing>" 
+  /><input type="submit" VALUE="Search" />
+</form>
+</td>
+<dtml-if "_.has_key('thoroughexpr')">
+<td>
+<!-- for spam hunting -->
+<form method="GET" action="&dtml-URL;">
+  thorough search (for spam, etc.):<br />
+  <input name="thoroughexpr" type="text" size="20" value="<dtml-var thoroughexpr html_quote missing>"
+  /><input type="submit" name="submit" value="<dtml-translate domain=zwiki>Search</dtml-translate>" />
+</form>
+</td>
+</dtml-if>
+</tr>
+</table>
+
+<!-- results -->
+<dtml-if "_.has_key('expr')">
+<dtml-let 
+ wikiurl=wikiUrl
+ comment="0
+ # Catalog notes
+ #
+ # Ideally we want the user to enter one or more words and find all 
+ # partial matches in page names and text, without fuss.
+ # TextIndex, ZCTextIndex, TextIndexNG2 and no catalog can all produce
+ # different results, depending on configuration. Also the indexes
+ # are temperamental and will break with certain search expressions.
+ #
+ # We'll add wildcards around all words (showing the user what we're doing)
+ # and try to work around known index bugs.
+ #
+ # Warning: the yellow highlights added by excerptAt do not always
+ # correspond to the index's search strategy and can be misleading
+ # (looks like partial matching when it isn't, etc.)
+ #
+ # Good configurations:
+ # - no catalog
+ #   less scalable, accurate
+ # - ZCTextIndex 2.7.3
+ #   allows parentheses, quotes for phrase search, boolean operators
+ #   allows right truncation only
+ #   doesn't like the words and, or, not
+ #   doesn't like a blank expression
+ # - TextIndexNG2 2.2b1
+ #   enable case folding and left truncation in the index
+ #   doesn't like quotes or too many wildcards
+ "
+ cleanexpr="_.string.replace(expr,'*','')"
+ cleanexpr="_.string.replace(cleanexpr,_.chr(34),'')"
+ cleanexpr="_.string.strip(cleanexpr)"
+ wildcardexpr="'*'+_.string.join(_.string.split(cleanexpr),'* *')+'*'"
+ titlesearchexpr=wildcardexpr
+ textsearchexpr=expr
+ titlehits="((cleanexpr and pages(Title=titlesearchexpr)+['dummy']) or pages()+['dummy'])[:-1]" 
+ texthits="((cleanexpr and pages(text=textsearchexpr)+['dummy']) or ['dummy'])[:-1]" 
+ >
+
+<p>
+<b><dtml-translate domain=zwiki>Page names matching</dtml-translate> &dtml-titlesearchexpr; (<dtml-var "_.len(titlehits)">):</b>
+<br /><br />
+<dtml-in titlehits sort=Title>
+  <dtml-try>
+    <a href="&dtml-wikiurl;/&dtml.url_quote-id;"><dtml-var "excerptAt(cleanexpr,text=formatWikiname(Title))"></a><br />
+  <dtml-except>
+    error<br />
+  </dtml-try>
+</dtml-in>
+
+<p>
+<b><dtml-translate domain=zwiki>Text matching</dtml-translate> &dtml-textsearchexpr; (<dtml-var "_.len(texthits)">):</b>
+<br /><br />
+<dtml-in texthits sort=Title>
+  <dl>
+  <dtml-try>
+    <dt><a href="&dtml-wikiurl;/&dtml.url_quote-id;"><dtml-var "formatWikiname(Title)"></a></dt>
+    <dd><small><em><dtml-var "pageWithName(id).excerptAt(cleanexpr,size=500)"></em></small></dd>
+  </dl>
+  <dtml-except>
+    <dt>error</dt>
+  </dtml-try>
+</dtml-in>
+
+</dtml-let>
+</dtml-if>
+
+<dtml-if "_.has_key('thoroughexpr')">
+<dtml-let wikiurl=wikiUrl>
+<p>
+<b><dtml-translate domain=zwiki>Thorough (non-catalog) search for text matching</dtml-translate> &dtml.html_quote-thoroughexpr;:</b>
+<br /><br />
+<dtml-call "REQUEST.set('count',0)">
+<dtml-in "aq_parent.objectValues(spec='ZWiki Page')" sort=Title>
+  <dtml-unless "_.string.find(_.string.lower(_.getitem('sequence-item').raw),_.string.lower(thoroughexpr)) == -1 and _.string.find(_.string.lower(id()),_.string.lower(thoroughexpr)) == -1">
+    <dtml-call "REQUEST.set('count',REQUEST.count + 1)">
+    <a href="&dtml-wikiurl;/&dtml.url_quote-id;">&dtml-Title;</a>
+    (<a href="&dtml-wikiurl;/&dtml.url_quote-id;/diff">diff</a>,
+    <a href="&dtml-wikiurl;/&dtml.url_quote-id;/manage_change_history_page">history</a>,
+    <a href="&dtml-wikiurl;/&dtml.url_quote-id;/src">src</a>)<br>
+  </dtml-unless>
+</dtml-in>
+<p><b>(<dtml-var count>)</b>
+
+</dtml-let>
+</dtml-if>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/UserOptions.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/UserOptions.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/UserOptions.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,122 @@
+<dtml-call "RESPONSE.setHeader('Content-Type','text/html; charset=utf-8')">
+<p>
+  <dtml-translate domain="zwiki">Set your preferences for this wiki:</dtml-translate> 
+</p>
+
+<dtml-with "REQUEST # needed in cmf/plone for some reason I can't fathom">
+<dtml-let 
+ RESPONSE="REQUEST.RESPONSE"
+ cookiepath="'/' #wikiUrl() # issue 928"
+ cookieduration="(ZopeTime() + 365).rfc822() # 1 year"
+ cookielist="[
+   'zwiki_username',
+   'email',
+   'zwiki_height',
+   'zwiki_timezone',
+   'zwiki_displaymode',
+   ]"
+ oldcookies="[
+   'zwiki_bookmarks',
+   'zwiki_showquote',
+   'zwiki_showlogo',
+   'zwiki_showsearch',
+   'zwiki_showpagemgmt',
+   'zwiki_showhierarchy',
+   'zwiki_width',
+   ]"
+ >
+<dtml-if setcookies>
+<dtml-in cookielist prefix=x>
+<dtml-if "_.has_key(x_item)">
+<dtml-call "RESPONSE.setCookie(x_item, REQUEST.get(x_item), 
+                               path=cookiepath, expires=cookieduration)
+            # set any cookies we have data for">
+</dtml-if>
+</dtml-in>
+<dtml-in oldcookies prefix=x>
+<dtml-call "RESPONSE.expireCookie(x_item,path=cookiepath)
+            # and clean up any obsolete ones">
+</dtml-in>
+<dtml-call "RESPONSE.redirect(REQUEST.get('redirectURL',pageUrl()))">
+<dtml-elif clearcookies>
+<dtml-in "cookielist+oldcookies" prefix=x>
+<dtml-call "RESPONSE.expireCookie(x_item,path=cookiepath)
+            # clear all, old and new ">
+</dtml-in>
+<dtml-call "RESPONSE.redirect(REQUEST.get('redirectURL',pageUrl()))
+            # reload so we are using the new ones">
+</dtml-if>
+</dtml-let>
+<form action="&dtml-URL;" METHOD="POST" ENCTYPE="multipart/form-data" style="border:none;">
+
+<p>
+<dtml-translate domain="zwiki">User name:</dtml-translate>
+<input type="text" name="zwiki_username" size="20" maxlength="20"
+       value="<dtml-var zwiki_username missing>" />
+<dtml-translate domain="zwiki">(identifies your edits, saves your votes, may be required)</dtml-translate>
+</p>
+
+<p>
+<dtml-translate domain="zwiki">Email address:</dtml-translate> 
+<input type="text" name="email" size="20" maxlength="40"
+       value="<dtml-var email missing>"> 
+<dtml-translate domain="zwiki">(allows mail subscription)</dtml-translate>
+</p>
+
+<p>
+<dtml-translate domain="zwiki">Your time zone:</dtml-translate>
+<dtml-let 
+  now=ZopeTime
+  timezones="[
+  'GMT-1100', 'GMT-1000', 'GMT-0900', 'GMT-0800', 'GMT-0700', 'GMT-0600',
+  'GMT-0500', 'GMT-0400', 'GMT-0300', 'GMT-0200', 'GMT-0100', 'GMT',
+  'GMT+0100', 'GMT+0200', 'GMT+0300', 'GMT+0400', 'GMT+0500', 'GMT+0600',
+  'GMT+0700', 'GMT+0800', 'GMT+0900', 'GMT+1000', 'GMT+1100', 'GMT+1200',
+  'GMT+1300',
+  ]
+  # half-hour zones; mail zwiki at zwiki.org if you use these
+  #'GMT-1100', 'GMT-1030', 'GMT-1000', 'GMT-0930', 'GMT-0900', 'GMT-0830',
+  #'GMT-0800', 'GMT-0730', 'GMT-0700', 'GMT-0630', 'GMT-0600', 'GMT-0530',
+  #'GMT-0500', 'GMT-0430', 'GMT-0400', 'GMT-0330', 'GMT-0300', 'GMT-0230',
+  #'GMT-0200', 'GMT-0130', 'GMT-0100', 'GMT',      'GMT+0100', 'GMT+0130',
+  #'GMT+0200', 'GMT+0230', 'GMT+0300', 'GMT+0330', 'GMT+0400', 'GMT+0430',
+  #'GMT+0500', 'GMT+0530', 'GMT+0600', 'GMT+0630', 'GMT+0700', 'GMT+0730',
+  #'GMT+0800', 'GMT+0830', 'GMT+0900', 'GMT+0930', 'GMT+1000', 'GMT+1030',
+  #'GMT+1100', 'GMT+1130', 'GMT+1200', 'GMT+1230', 'GMT+1300',
+  "
+  userzone="REQUEST.get('zwiki_timezone',None)"
+  userzone="((userzone in timezones) and userzone) or 'GMT'"
+  >
+  <select name="zwiki_timezone">
+  <dtml-in timezones prefix=x>
+    <option value="&dtml-x_item;"
+    <dtml-if "userzone == x_item">selected</dtml-if>
+    >
+    &dtml-x_item; (current time: <dtml-var "now.toZone(x_item).AMPMMinutes()">)
+    
+  </dtml-in>
+  </select>
+  <dtml-translate domain="zwiki">(localizes most times)</dtml-translate>
+</dtml-let>
+</p>
+
+<p>
+  <dtml-translate domain="zwiki">Edit form height:</dtml-translate>
+  <input type="text" name="zwiki_height" size="2" maxlength="2"
+         value="<dtml-var zwiki_height missing=20>" />
+  <dtml-translate domain="zwiki">(adjusts form size)</dtml-translate>
+</p>
+
+<div align="right"> 
+<b><input type="submit" name="setcookies" 
+value="<dtml-translate domain="zwiki">Save options</dtml-translate>" 
+style="font-weight:bold"></b>
+<input type="submit" name="clearcookies" 
+value="<dtml-translate domain="zwiki">Forget options</dtml-translate>"
+> 
+</div>
+<input type="hidden" name="zwiki_displaymode" 
+value="<dtml-var "REQUEST.get('zwiki_displaymode',getattr(aq_parent,'default_displaymode','minimal'))">">
+
+</form>
+</dtml-with>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/accesskeys.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/accesskeys.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/accesskeys.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,34 @@
+<html>
+  <body>
+    <metal:block metal:define-macro="accesskeys"
+                 tal:define="pageurl here/pageUrl;
+                             thisurl python:here.urlquote(request.get('URL'));
+                             ">
+      <!-- always-available zwiki access keys -->
+      <a tal:attributes="href here/homeUrl" accesskey="f"></a>
+      <a tal:attributes="href here/contentsUrl" accesskey="c"></a>
+      <a tal:attributes="href here/changesUrl" accesskey="r"></a>
+      <a tal:attributes="href here/discussionUrl" accesskey="" tal:condition="here/discussionUrl"></a>
+      <a tal:attributes="href here/trackerUrl" accesskey="t" tal:condition="here/hasIssues"></a>
+      <a tal:attributes="href here/indexUrl" accesskey="i" tal:condition="here/indexUrl"></a>
+      <a tal:attributes="href here/uploadsUrl" accesskey="" tal:condition="python:0 #here/uploadsUrl"></a>
+      <a tal:attributes="href here/preferencesUrl" accesskey="o"></a>
+      <a tal:attributes="href here/helpUrl" accesskey="h" tal:condition="here/helpUrl"></a>
+      <a tal:attributes="href python:'%s/setskin?skin=zwiki&came_from=%s' % (pageurl,thisurl)" accesskey="-" tal:condition="here/inCMF"></a>
+      <a tal:attributes="href python:'%s/setskin?skin=plone&came_from=%s' % (pageurl,thisurl)" accesskey="+" tal:condition="here/inCMF"></a>
+      <a tal:attributes="href here/pageUrl" accesskey="v"></a>
+      <a tal:attributes="href string:${here/pageUrl}/subscribeform" accesskey="m"></a>
+      <a tal:attributes="href string:${here/pageUrl}/backlinks" accesskey="b"></a>
+      <a tal:attributes="href string:${here/pageUrl}/diff" accesskey="d"></a>
+      <a tal:attributes="href string:${here/pageUrl}/manage_change_history_page" accesskey="y"></a>
+      <a tal:attributes="href string:${here/pageUrl}/editform" accesskey="e"></a>
+      <a tal:attributes="href python:here.wikiUrl() + '/externalEdit_/' +
+                         modules['Products.PythonScripts.standard'].url_quote(here.id()) +
+                         '?borrow_lock=1'" accesskey="x"></a>
+      <a tal:attributes="href python:here.nextPageUrl() or here.firstPageUrl()" accesskey="n"></a>
+      <a tal:attributes="href python:here.previousPageUrl() or here.lastPageUrl()" accesskey="p"></a>
+      <a tal:attributes="href here/upUrl" accesskey="u"></a>
+      <a tal:attributes="href string:${here/pageUrl}/showAccessKeys" accesskey="0"></a>
+    </metal:block>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/addwikiform.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/addwikiform.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/addwikiform.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,96 @@
+<dtml-call "RESPONSE.setHeader('Content-Type','text/html; charset=utf-8')">
+<html>  
+  <head>  
+    <title><dtml-translate domain=zwiki>Add ZWiki</dtml-translate></title>
+  </head>  
+  <body bgcolor="#ffffff" link="#000099" vlink="#555555">  
+    <h2><dtml-translate domain=zwiki>Add ZWiki</dtml-translate></h2>
+    <p>
+      <dtml-translate domain=zwiki>
+	This will add a ready-to-use wiki site in a subfolder.  (To
+	put a wiki in the zope root folder, just cut and paste the
+	objects from the subfolder.)
+      </dtml-translate>
+    </p>
+    <form action="manage_addWiki" method="post" enctype="multipart/form-data">
+      <table cellspacing="2">
+	<tr> 
+	  <th align="left" valign="middle"><dtml-translate domain=zwiki>Id:</dtml-translate></th>
+	  <td align="left" valign="middle">
+	    <input type="text" name="new_id" size="30" />
+	  </td>
+	  <td>
+	    <dtml-translate domain=zwiki>
+	      The wiki folder id, which will appear in urls (unless you do virtual hosting).
+	    </dtml-translate>
+	  </td>
+	</tr>
+	<tr> 
+	  <td colspan=3><br /></td>
+	</tr>
+	<tr> 
+	  <th align="left" valign="middle"><dtml-translate domain=zwiki>Title:</dtml-translate></th>
+	  <td align="left" valign="middle">
+	    <input type="text" name="new_title" size="30" />
+	  </td>
+	  <td>
+	    <dtml-translate domain=zwiki>
+	      The wiki's title, which will appear in search engines and bookmarks.
+	    </dtml-translate>
+	  </td>
+	</tr>
+	<tr> 
+	  <td colspan=3><br /></td>
+	</tr>
+	<tr> 
+	  <th align="left" valign="middle"><dtml-translate domain=zwiki>Template:</dtml-translate></th>
+	  <td align="left" valign="middle">	    
+	    <table border="0" cellspacing=3>
+	      <dtml-in listWikis>
+		<dtml-unless "_['sequence-item'][-7:] == '_config'">
+		  <tr valign="middle">
+		    <td nowrap valign="top">
+		      <input type="radio" name="wiki_type" value="<dtml-var "_['sequence-item']">"
+		      <dtml-if "_['sequence-start']">CHECKED</dtml-if>
+		      > <dtml-var "_['sequence-item']"></input>
+		    </td>
+		    <td>
+		      <dtml-try>
+			<dtml-with "PARENTS[-1].Control_Panel.Products.ZWiki">
+			  <dtml-var "_.string.join(_[_['sequence-item']].description)">
+			</dtml-with>
+		      <dtml-except>
+			&nbsp;
+		      </dtml-try>
+		    </td>
+		  </tr>
+		</dtml-unless>
+	      </dtml-in>
+	    </table>
+	  </td>
+	  <td>
+	    <dtml-translate domain=zwiki>
+	      The basic wiki template includes some starter pages, and
+	      some dtml methods to enable fuzzy urls.  Add-on products
+	      may provide other choices here.  You can define your own
+	      wiki templates by adding wiki folders in <a
+	      href="/Control_Panel/Products/ZWiki/manage_main">/Control_Panel/Products/ZWiki</a>.
+	    </dtml-translate>
+	  </td>
+	</tr>
+	<tr> 
+	  <td colspan=3><br /></td>
+	</tr>
+	<tr>
+	  <td></td>
+	  <td>
+	    <input type="submit" value="<dtml-translate domain=zwiki>Add wiki</dtml-translate>" style="font-weight:bold;" />
+	    <input type="hidden" name="enter" value=1 />
+	  </td>
+	  <td>
+	  </td>
+	</tr>
+      </table>
+    </form>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/addwikipageform.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/addwikipageform.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/addwikipageform.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,34 @@
+<dtml-call "RESPONSE.setHeader('Content-Type','text/html; charset=utf-8')">
+<html>
+  <head>
+    <title><dtml-translate domain=zwiki>Add ZWiki Page</dtml-translate></title>
+  </head>
+  <body bgcolor="#FFFFFF" link="#000099" vlink="#555555">
+    <h2><dtml-translate domain=zwiki>Add ZWiki Page</dtml-translate></h2>
+    <p>
+      <dtml-translate domain=zwiki>
+	This will add a single wiki page to the current folder. You
+	may want to "<a href="addwikiform">Add ZWiki</a>" instead, to
+	get a more complete wiki with sample content and fuzzy url
+	handling.
+      </dtml-translate>
+    </p>
+    <form action="manage_addZWikiPage" method="post">
+      <b><dtml-translate domain=zwiki>Page&nbsp;name:</dtml-translate></b>
+      <input type="text" name="name" size="40" />
+      <input type="submit" value=" <dtml-translate domain=zwiki>Add wiki page</dtml-translate>" style="font-weight:bold;" />
+      <input type="hidden" name="redirect" value="page" />
+      <p>
+	<dtml-translate domain=zwiki>
+	  Use capitalization, non-ascii characters, whitespace and
+	  punctuation if you wish.  The traditional WikiNames are also
+	  a good choice. A url-safe page id will be chosen
+	  automatically.
+	  Tip: if you need to rename your page later, 
+	  use Zwiki's rename feature; changing wiki page titles
+	  or ids directly with the ZMI may confuse Zwiki.
+	</dtml-translate>
+      </p>
+    </form>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/backlinks.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/backlinks.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/backlinks.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,146 @@
+<html metal:use-macro="here/main_template/macros/master" i18n:domain="zwiki" >
+  <head>
+    <title metal:fill-slot="title_slot" tal:content="
+           string:${container/title} ${here/pageName} backlinks" />
+    <metal:block metal:fill-slot="head_slot">
+      <metal:block metal:use-macro="here/macros/formsearchtags" />
+    </metal:block>
+  </head>
+  <body>
+    <div metal:fill-slot="main"
+         tal:define="
+                     canreparent python:user.has_permission('Zwiki: Reparent pages',here);
+                     thispage here/pageName;
+                     thisparents here/parents;
+                     backlinks python:here.backlinksFor(thispage);
+                     sorted_backlinks python:sequence.sort(backlinks, 
+                     (('Title', 'nocase', 'asc'),));
+                     ">
+      <metal:macro metal:use-macro="here/macros/accesskeys" />
+      <h1 i18n:translate="">Related pages</h1>
+      <form action="reparent" tal:attributes="action string:${here/pageUrl}/reparent">
+        <table border="0" width="100%">
+          <tr valign="top">
+            <td width="50%">
+              <p>
+                <b i18n:translate="">Parents</b><br />
+                <a href="page_url" title="linkTitle"
+                   tal:attributes="href here/pageUrl; title here/linkTitle;" 
+                   tal:content="thispage"
+                   >thispage</a> 
+                <span tal:condition="not:here/parents" i18n:translate="">is a top-level topic.</span>
+                <span tal:condition="here/parents" i18n:translate="">is a subtopic of:</span>
+              </p>
+              <ol tal:condition="here/parents"
+                  tal:define="
+                              thisparents here/parents;
+                              sortedparents python:thisparents #sequence.sort(thisparents);
+                              ">
+                <li tal:repeat="parent sortedparents"> 
+                  <span tal:omit-tag="">
+                    <input type="checkbox" name="parents" value="parent" checked="checked" class="formfield"
+                           tal:attributes="value parent;"
+                           tal:condition="canreparent" />
+                    <a href="" title=""
+                       tal:attributes="href python:here.wiki_url()+'/'+here.canonicalIdFrom(parent);
+                                       title nothing;"
+                       tal:content="parent"
+                       >parent</a>
+                    <br />
+                  </span>
+                </li>
+              </ol>
+              <p>
+                <br />
+                <b i18n:translate="">Backlinks</b><br />
+                <span i18n:translate="" tal:condition="backlinks">Here are the pages which link to it:</span>
+                <span i18n:translate="" tal:condition="not:backlinks">No other pages link to this one.</span>
+              </p>
+              <ol>
+                <li tal:repeat="bl sorted_backlinks"> 
+                  <span tal:omit-tag="" tal:define="
+                                                    blpage bl/Title;
+                                                    blisparent python:(blpage in thisparents);
+                                                    ">
+                    <input type="checkbox" name="parents" value="blpage" class="formfield"
+                           tal:attributes="checked blisparent; value blpage;"
+                           tal:condition="canreparent" />
+                    <a href="blurl" title=""
+                       tal:define="blid bl/id"
+                       tal:attributes="href python:here.wiki_url()+'/'+blid;
+                                       title bl/linkTitle|nothing;"
+                       tal:content="blpage"
+                       >blpage</a>
+                    <br />
+                  </span>
+                </li>
+              </ol>
+            </td>
+            <td width="50%" tal:condition="not:canreparent">&nbsp;</td>
+            <td width="50%" tal:condition="canreparent">
+              <p>
+                <span i18n:translate="">
+                  You can set this page's parent(s) to place it within the overall page hierarchy. 
+                </span>
+                <span i18n:translate="" tal:condition="backlinks">
+                  Check one or more checkboxes or enter a page name here, and click the button.
+                </span>
+                <span i18n:translate="" tal:condition="not:backlinks">
+                  Enter a page name here and click the button.
+                </span>
+                <span i18n:translate="">
+                  You can type just the first few letters, case and punctuation are ignored.
+                </span>
+                <br />
+                <br />
+                <input type="text" name="parents" class="formfield" size="20" maxlength="100" />
+                <br />
+                <strong><input type="submit" value="Reparent" style="font-weight:bold" i18n:attributes="value" /></strong>
+              </p>
+            </td>
+          </tr>
+        </table>
+      </form>
+      <table border="0" width="100%" tal:define="subtopics here/childrenAsList">
+        <tr valign="top">
+          <td width="50%">
+            <p>
+              <b i18n:translate="">
+                Subtopics
+                </b><br />
+                <span i18n:translate="" tal:condition="not:subtopics">
+                  This page has no subtopics.
+                </span>
+                <span i18n:translate="" tal:condition="subtopics">
+                  Here are it's subtopics.
+                </span>
+                <span i18n:translate="" tal:condition="python:subtopics and len(subtopics)>1 and canreparent">
+                  You can reorder them by clicking the ^ buttons.
+                </span>
+            </p>
+            <ol>
+              <li tal:repeat="cname subtopics"> 
+                <form tal:condition="canreparent" 
+                      tal:attributes="action string:${here/pageUrl}/reorder" 
+                      style="display:inline;" >
+                  <input type="hidden" name="child" tal:attributes="value cname" />
+                  <input type="submit" value="^" style="padding:0px;visibility:hidden;" tal:condition="not:repeat/cname/index" />
+                  <input type="submit" value="^" style="padding:0px;" tal:condition="repeat/cname/index" />
+                </form>
+                <a tal:define="cpage python:here.pageWithName(cname);"
+                   tal:attributes="href cpage/pageUrl;
+                                   title cpage/linkTitle|nothing;"
+                   tal:content="cname"
+                   >cpage</a>
+                <br />
+              </li>
+            </ol>
+          </td>
+          <td width="50%">
+            &nbsp;
+          </td>
+        </tr>
+      </table>
+    </div>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/badtemplate.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/badtemplate.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/badtemplate.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,21 @@
+<html metal:use-macro="here/main_template/macros/master" i18n:domain="zwiki" >
+  <head>
+    <title metal:fill-slot="title_slot" tal:content="
+           string:${container/title} ${here/pageName} bad template" />
+    <metal:block metal:fill-slot="head_slot">
+      <metal:block metal:use-macro="here/macros/formsearchtags" />
+    </metal:block>
+  </head>
+  <body>
+    <div metal:fill-slot="main">
+      <metal:macro metal:use-macro="here/macros/accesskeys" />
+      <h1 i18n:translate="">Bad template</h1>
+      <p i18n:translate="">
+        There was a problem locating one of this wiki's skin templates.
+        There may be a page or other non-page-template/non-dtml-method object
+        with the same ID, obscuring the template. Or the template may be
+        missing on the filesystem (an incomplete Zwiki installation).
+      </p>
+    </div>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/blank_star.png
===================================================================
(Binary files differ)


Property changes on: zope-zwiki/branches/upstream/current/skins/zwiki/blank_star.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: zope-zwiki/branches/upstream/current/skins/zwiki/commentform.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/commentform.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/commentform.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,74 @@
+<html>
+  <body>
+
+    <div metal:define-macro="commentform"
+         tal:condition="python:user.has_permission('Zwiki: Add comments',here)">
+      <!-- comment form -->
+      <br />
+      <br />
+      <div >
+        <form method="post" enctype="multipart/form-data"
+              class="commentform" style="margin-top:0;margin-bottom:0"
+              tal:attributes="action here/pageUrl">
+          <input name="timeStamp" type="hidden" value="editTimestamp"
+                 tal:attributes="value here/editTimestamp" />
+          <input name="page" type="hidden" value="id" 
+                 tal:attributes="value here/id" />
+          <table width="100%" border="0" cellspacing="0" cellpadding="0" bgcolor="">
+            <tr>
+              <td align="left" valign="middle" nowrap="nowrap" colspan="2">
+                <small>
+                  <span i18n:translate="">subject</span>: 
+                  <input type="text" name="subject_heading" value="" 
+                         size="40" maxlength="100" style="font-weight:bold;" 
+                         class="formfield" 
+                         title="a subject helps clarify threads and RecentChanges" 
+                         i18n:attributes="title" 
+                         tal:attributes="value request/subject|nothing" />
+                  <span tal:condition="request/in_reply_to|nothing">
+                    (<span i18n:translate="">replying</span>)
+                  </span>
+                </small>
+              </td>
+            </tr>
+            <tr>
+              <td align="center" valign="bottom" bgcolor="" colspan="2">
+                <textarea wrap="virtual" name="text" rows="3" cols="60" 
+                          style="width:100%;"  class="formfield"
+                          title="to comment (and cc any subscribers) enter text here and click add"
+                          i18n:attributes="title"
+                          ></textarea>
+              </td>
+            </tr>
+            <tr>
+              <td align="left" valign="middle">
+                &nbsp;
+              </td>
+              <td align="right" valign="top" nowrap="nowrap"> 
+                <input type="hidden" name="in_reply_to"
+                       tal:attributes="value request/in_reply_to|nothing" />
+                <input type="hidden" name="use_heading" value="1" />
+                <span tal:condition="python:here.isMailoutEnabled()" >
+                  <small>(
+                  <span tal:define="nbsubscriber 
+                                    python:here.subscriberCount() + here.wikiSubscriberCount()">
+                    <span tal:condition="python:nbsubscriber>1" i18n:translate="">
+                      <span tal:content="python:str(nbsubscriber)" i18n:name="nb" /> subscribers
+                    </span>
+                    <span tal:condition="python:nbsubscriber==1" i18n:translate="">
+                      1 subscriber
+                    </span>
+                  </span>
+                  )</small>
+                </span>
+                <input type="submit" name="comment:method" value="add a comment" 
+                       i18n:attributes="value add-comment"
+                       style="font-weight:bold" /></td>
+            </tr>
+          </table>
+        </form>
+      </div>
+    </div>
+
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/content.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/content.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/content.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,20 @@
+<html>
+  <body>
+
+    <div metal:define-macro="content" class="content">
+      <!-- page content (main text, subtopics links, comments) -->
+      <!--
+      <div metal:use-macro="here/macros/maintext" />
+      <div metal:use-macro="here/macros/subtopics" />
+      <div metal:use-macro="here/macros/comments" />
+      -->
+      <div tal:replace="structure options/body">
+        main text, subtopics links, comments
+      </div>
+      <a name="bottom"></a>
+      <br />
+      <div metal:use-macro="here/macros/commentform" />
+    </div>
+
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/contentspage.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/contentspage.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/contentspage.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,50 @@
+<html metal:use-macro="here/main_template/macros/master" i18n:domain="zwiki"
+      tal:define="title python:container.title and gettext('Wiki contents for')+' '+container.title or gettext('Wiki contents')
+# XXX splicing translated and dynamic text - how to pass title in to fill-slot ?
+# XXX for now, complicated spans
+">
+  <head>
+    <title metal:fill-slot="title_slot">
+
+       <span tal:condition="container/title" tal:omit-tag="">
+         <span i18n:translate="" tal:omit-tag="">Wiki contents for</span> <span tal:replace="container/title" />
+       </span>
+       <span tal:condition="not:container/title" tal:omit-tag="">
+         <span i18n:translate="" tal:omit-tag="">Wiki contents</span>
+       </span>
+
+    </title>
+    <metal:block metal:fill-slot="head_slot">
+      <metal:block metal:use-macro="here/macros/formsearchtags" />
+    </metal:block>
+  </head>
+  <body>
+    <metal:block metal:fill-slot="main">
+      <metal:macro metal:use-macro="here/macros/accesskeys" />
+      <h1>
+
+       <span tal:condition="container/title" tal:omit-tag="">
+         <span i18n:translate="" tal:omit-tag="">Wiki contents for</span> <span tal:replace="container/title" />
+       </span>
+       <span tal:condition="not:container/title" tal:omit-tag="">
+         <span i18n:translate="" tal:omit-tag="">Wiki contents</span>
+       </span>
+
+      </h1>
+      <div class="formcontent">
+        <div class="subtopics">
+          <div style="font-size:large" tal:content="structure options/hierarchy">
+            page hierarchy..
+          </div>
+          <div tal:condition="options/singletons">
+            <h4 i18n:translate="">Singletons:</h4>
+            <ul class="outline">
+              <li tal:repeat="singleton options/singletons">
+                <span tal:replace="structure singleton">singleton..</span>
+              </li>
+            </ul>
+          </div>
+        </div>
+    </metal:block>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/denied.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/denied.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/denied.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,21 @@
+<html metal:use-macro="here/main_template/macros/master" i18n:domain="zwiki" >
+  <head>
+    <title metal:fill-slot="title_slot" tal:content="
+           string:${container/title} ${here/pageName} denied" />
+    <metal:block metal:fill-slot="head_slot">
+      <metal:block metal:use-macro="here/macros/formsearchtags" />
+    </metal:block>
+  </head>
+  <body>
+    <div metal:fill-slot="main">
+      <metal:macro metal:use-macro="here/macros/accesskeys" />
+      <h1 i18n:translate="">Not permitted</h1>
+      <p align="center">
+        Sorry, you need more identification to do that on this wiki.
+        Perhaps you need to set a username in 
+        <a tal:attributes="href here/preferencesUrl;">options</a>
+        or log in ?
+      </p>
+    </div>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/diffform.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/diffform.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/diffform.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,102 @@
+<html metal:use-macro="here/main_template/macros/master" i18n:domain="zwiki" >
+  <head>
+    <title metal:fill-slot="title_slot" tal:content="
+           string:${container/title} ${here/pageName} edit history" />
+    <metal:block metal:fill-slot="head_slot">
+      <metal:block metal:use-macro="here/macros/formsearchtags" />
+    </metal:block>
+  </head>
+  <body>
+    <!-- the diff browser -->
+    <div metal:fill-slot="main" 
+         tal:define="revA       python:int(options['revA']); 
+                     difftext   options/difftext;
+                     pageurl    here/pageUrl;
+                     numrevs    here/revisionCount;
+                     history    here/history;
+                     histinfo   python:history[revA-1];
+                     time       histinfo/time/ISO;
+                     description histinfo/description;
+                     revinfo    python:here.revisionInfoFor(revA-1);
+                     editor     revinfo/last_editor;
+                     ">
+      <metal:macro metal:use-macro="here/macros/accesskeys" />
+      <h1 i18n:translate="">Edit history</h1>
+      <div class="formcontent">
+        <form method="GET" action="" tal:attributes="action here/pageUrl">
+          <input type="hidden" name="currentRevision" tal:attributes="value revA" />
+
+          <table border=0 cellspacing=0 width="100%">
+          <tr valign=middle>
+          <td>
+          <b i18n:translate="">Edit:</b>
+          -<span tal:replace="revA" /> of <span tal:replace="numrevs" />
+          <input tal:condition="python:revA < numrevs" 
+                 name="prevDiff:method" 
+                 value=" &lt;&lt; " 
+                 type="submit" i18n:attributes="value" accesskey="p" />
+          <input tal:condition="not:python:revA < numrevs"
+                 disabled="1" 
+                 value=" &lt;&lt; " 
+                 type="submit" i18n:attributes="value" accesskey="p" />
+
+          <span tal:repeat="hist history" tal:condition="python:0">
+            <tal:block tal:define="num python:numrevs-repeat['hist'].index;">
+              <a tal:content="string:-${num}" 
+                 tal:attributes="href string:${pageurl}/diff?revA=${num};
+                                 style python:revA==num and 'font-weight:bold' or '';
+                                 " />
+            </tal:block>
+          </span>
+
+          <input tal:condition="python:revA > 1" 
+                 name="nextDiff:method" 
+                 value=" &gt;&gt; "  
+                 type="submit" i18n:attributes="value" accesskey="n" />
+          <input tal:condition="not:python:revA > 1" 
+                 disabled="1" 
+                 value=" &gt;&gt; "  
+                 type="submit" i18n:attributes="value" accesskey="n" />
+
+          <input tal:condition="python:user.has_permission('View History',here)" 
+                 value="Manage" name="manage_change_history_page:method" 
+                 type="submit" i18n:attributes="value" />
+
+          <input tal:condition="python:user.has_permission('Zwiki: Edit pages', here)" 
+                 tal:attributes="disabled python:(revA==numrevs) and 1 or nothing;"
+                 value="Revert this and later edits"
+                 type="submit" name="revert:method"
+                 i18n:attributes="value" />
+
+          </td>
+          <td align="right">
+
+          <input type="submit" name="return" value="Return to page" i18n:attributes="value"/>
+
+          </td>
+          </tr>
+          <tr valign=top>
+          <td colspan=2>
+<!--
+            <b i18n:translate="">Editor:</b> <span tal:replace="editor">...</span>
+            (may be wrong)
+            <br />
+-->
+            <b i18n:translate="">Time:</b> <span tal:replace="time">...</span>
+          </td>
+          </tr>
+          <tr valign=top>
+          <td colspan=2>
+            <b i18n:translate="">Note:</b> <span tal:replace="description" />
+          </td>
+          </tr>
+          </table>
+        </form>
+        <hr />
+        <pre tal:content="structure difftext">
+          diff..
+        </pre>
+      </div>
+    </div>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/editform.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/editform.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/editform.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,226 @@
+<html metal:use-macro="here/main_template/macros/master" i18n:domain="zwiki" >
+  <head>
+    <title metal:fill-slot="title_slot" tal:content="
+           string:${container/title} ${here/pageName} edit/create" />
+    <metal:block metal:fill-slot="head_slot">
+      <metal:block metal:use-macro="here/macros/formsearchtags" />
+      <meta http-equiv="pragma" content="no-cache"
+            tal:define="dummy python:
+                        request.RESPONSE.setHeader('pragma','no-cache')" />
+    </metal:block>
+  </head>
+  <body>
+    <div metal:fill-slot="main" 
+         tal:define="
+      action     request/form/action|options/action;
+      creating   python:action == 'Create';
+      editing    python:not creating;
+      actioning  python:(creating and 'Creating') or 'Editing';
+      previewing python:request.form.get('editform',None);
+      page       request/form/page|options/page;
+      newname    request/form/title|page;
+      title      string:${container/title} ${actioning} ${page};
+      text       request/form/text|options/text;
+      type       request/form/type|python:(creating and here.defaultPageType()) or here.pageTypeId();
+      useEpoz    python:
+                 here.epozInstalled() and ((editing and here.supportsEpoz())
+                                           or (creating and type=='html'))
+                 #here.supportsEpoz();
+      timestamp  request/form/timeStamp|here/timeStamp;
+      log        python:request.form.get('log',
+      ((editing and 
+      here.usernameFrom(request) == here.last_editor and
+      here.ZopeTime() - here.lastEditTime() < 1) and here.last_log) or ''
+      );
+      file       python:'' #doesn't work too well request/form/file|nothing ;
+      pagetypes  here/allowedPageTypes;
+      wiki_url   here/wikiUrl;
+      rows       python:request.get('zwiki_height',20);
+      uploaddir  python:getattr(container,'uploads',container);
+      "
+      onload="document.forms[0].text.focus();"
+      >
+      <metal:macro metal:use-macro="here/macros/accesskeys" />
+      <div class="formcontent">
+        <form method="post" enctype="multipart/form-data" action="" 
+              tal:attributes="action string:${here/pageUrl}">
+          <input name="timeStamp" type="hidden" value="" 
+                 tal:attributes="value timestamp" />
+          <input name="page" type="hidden" value="page"
+                 tal:attributes="value page" />
+          <input name="leaveplaceholder" value="" type="hidden"
+                 tal:condition="python:creating #no placeholder when creating" />
+          <div align="center">
+            <table width="100%" border="0" cellspacing="0" cellpadding="3">
+              <!-- page name & type -->
+              <tr>
+                <td valign="middle" align="left">
+                  <span tal:condition="python:
+                                       user.has_permission('Zwiki: Rename pages',here)">
+                    <span i18n:translate="">Page name</span>: 
+                    <input name="title" size="30" maxlength="300" value="" 
+                           title="the name of this wiki page (changing this may be slow!)"                          
+                           tabindex="" class="formfield" style="font-weight:bold;"
+                           i18n:attributes="title"
+                           tal:attributes="value python:newname;" />
+                  </span>
+                </td>
+                <td valign="middle" align="right">
+                  <span tal:condition="python:
+                                       user.has_permission('Zwiki: Change page types',here)">
+                    <span i18n:translate="">markup</span>:
+                    <select name="type" tabindex="" class="formfield"
+                            title="select the formatting and rendering style for this page"
+                            i18n:attributes="title" >
+                      <tal:options tal:repeat="t pagetypes">
+                        <option value="type"
+                                tal:define="extrasuffix python:
+                  (t == 'html'         and here.epozInstalled() and ' (WYSIWYG)')
+               or (t in ('rst','stx','html') and here.dtmlAllowed()   and ' (+ DTML)')
+               or ''
+               # Since wysiwyg html editors like epoz mangle it, we'll assume DTML
+               # is undesirable whenever they are likely to be used.
+               # The following would be better, but I can't figure out the necessary
+               # security declarations.
+               #   (here.lookupPageType(t).supportsDtml() and here.dtmlAllowed()   and ' (+ DTML)')
+               #or (here.lookupPageType(t).supportsEpoz() and here.epozInstalled() and ' (WYSIWYG)')
+               #or '' ;"
+                                tal:attributes="value t; 
+                                                selected python:t==type"
+                                tal:content="python:here.PAGE_TYPES.get(t,t) + extrasuffix">
+                          type
+                        </option>
+                      </tal:options>
+                    </select>
+                  </span>
+                </td>
+              </tr>
+              <!-- edit area -->
+              <tr>
+                <td colspan="2" align="center">
+                  <textarea tal:condition="not:useEpoz"
+                            wrap="virtual" name="text" rows="20" cols="60"
+                            style="width:100%; background-color:#f0f0f0" 
+                            tabindex=""
+                            tal:attributes="rows rows;"
+                            tal:content="text">text...</textarea>
+                  <span tal:condition="useEpoz"
+                        tal:replace="structure python:
+                                     here.Epoz(
+                                     'text',
+                                     data=text,
+                                     style='background:white;border:thin solid black;
+                                     width:100%;height:'+str(rows)+'em;',
+                                     css=here.defaultPageUrl()+'/stylesheet',
+                                     )"></span>
+                </td>
+              </tr>
+              <!-- better-positioned epoz source-mode checkbox -->
+              <tr tal:condition="python:0 #here/supportsEpoz">
+                <td valign="top" align="right" colspan="2"
+                    ><input id="EpozViewMode" type="checkbox" class="formfield"
+                    onclick="SwitchViewMode(this.checked)" 
+                    title="toggle source/WYSIWYG mode" 
+                    i18n:attributes="title"
+                    tabindex=""
+                    /></td>
+              </tr>
+              <!-- optional note -->
+              <tr>
+                <td valign="middle" align="left" colspan="2" 
+                    nowrap="nowrap">
+                  <span i18n:translate="">Optional change note</span>: 
+                  <input name="log" size="50" maxlength="100" value="" 
+                         tabindex="" class="formfield"
+                         title="a note makes RecentChanges more useful" 
+                         i18n:attributes="title"
+                         tal:attributes="value log;" 
+                         />
+                </td>
+              </tr>
+              <!-- file upload -->
+              <tr tal:condition="python:
+                                 user.has_permission('Add Documents, Images, and Files',
+                                 uploaddir)">
+                <td valign="middle" align="left" colspan="2" nowrap="nowrap">
+                  <span i18n:translate="">Upload a file or image</span>: 
+                  <input type="file" name="file" size="30" value="" tabindex=""
+                         title="upload a file and link it on this page ?" 
+                         class="formfield" i18n:attributes="title"
+                         tal:attributes="value file;"
+                         />
+                </td>
+              </tr>
+              <!-- help links, save and cancel buttons -->
+              <tr>
+                <td valign="" align="left" colspan="1">
+                  <span i18n:translate="">For editing help, see</span> 
+                  <a tal:attributes="href string:${here/helpUrl}#editing"
+                     ><span i18n:translate="">HelpPage</span></a> 
+                  <span tal:omit-tag="" 
+                        tal:condition="python:
+                                       here.pageWithId('TextFormattingRules')">
+                    <span i18n:translate="">or</span> 
+                    <a 
+                        tal:attributes="href string:${wiki_url}/TextFormattingRules"
+                        ><span i18n:translate="">TextFormattingRules</span></a> 
+                    </span>.
+                </td>
+                <td valign="top" align="right" colspan="1">
+                  <strong><input 
+                  type="submit" name="edit:method" 
+                  value="Save" title="change this wiki page"
+                  tabindex="" style="font-weight:bold" accesskey="s"
+                  tal:attributes="
+                  value python:creating and ('Create') or default;
+                  title python:creating and ('create this wiki page') or default;"
+                  i18n:attributes="title;value"
+                  /></strong>&nbsp;<input 
+                  type="submit" name="editform:method" 
+                  value="Preview" title="preview this edit"
+                  tabindex="" accesskey="p"
+                  i18n:attributes="title;value"
+                  />&nbsp;<input 
+                  type="submit" value="Cancel" 
+                  title="cancel this edit and return to the page"
+                  tabindex="" 
+                  i18n:attributes="title;value"
+                  />
+                  <span tal:condition="python: False">
+                    <!-- force i18n extraction -->
+                    <span title="Create" i18n:attributes="title"></span>
+                    <span title="create this wiki page" i18n:attributes="title"></span>
+                  </span>
+                </td>
+              </tr>
+
+            </table>
+          </div>
+        </form>
+        <div tal:condition="previewing">
+          <!-- preview -->
+          <table border="0" width="100%" class="dimtext"><tr>
+            <td align="center"><b i18n:translate="label_preview">PREVIEW</b></td>
+            <td align="center"><b i18n:translate="label_preview">PREVIEW</b></td>
+            <td align="center"><b i18n:translate="label_preview">PREVIEW</b></td>
+            <td align="center"><b i18n:translate="label_preview">PREVIEW</b></td>
+            <td align="center"><b i18n:translate="label_preview">PREVIEW</b></td>
+          </tr></table>
+          <table border="4" width="100%" cellpadding="10" class="preview">
+            <tr>
+              <td tal:content="structure python:here.renderText(
+                               text,type,REQUEST=request,RESPONSE=request.RESPONSE)"></td>
+            </tr>
+          </table>
+          <table border="0" width="100%" class="dimtext"><tr>
+            <td align="center"><b i18n:translate="label_preview">PREVIEW</b></td>
+            <td align="center"><b i18n:translate="label_preview">PREVIEW</b></td>
+            <td align="center"><b i18n:translate="label_preview">PREVIEW</b></td>
+            <td align="center"><b i18n:translate="label_preview">PREVIEW</b></td>
+            <td align="center"><b i18n:translate="label_preview">PREVIEW</b></td>
+          </tr></table>
+        </div>
+      </div>
+    </div>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/head.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/head.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/head.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,57 @@
+<html>
+  <!-- old head macro, for backwards compatibility -->
+  <head metal:define-macro="head">
+    <meta http-equiv="Content-Type" content="" 
+          tal:define="charset string:utf-8;
+                      dummy   python:request.RESPONSE.setHeader(
+                      'Content-Type','text/html;; charset='+charset);"
+          tal:attributes="content string:text/html;;charset=${charset}" 
+          />
+    <span metal:define-slot="searchtags" 
+          tal:omit-tag="" 
+          tal:define="indexdelay python:24">
+      <span tal:condition="python:here.lastEditIntervalInHours() >= indexdelay"
+            tal:omit-tag="">
+        <meta metal:define-slot="keywords" name="keywords" content=""
+              tal:attributes="content here/spacedPageName;" />
+        <meta metal:define-slot="description" name="description" content=""
+              tal:attributes="content here/summary;" />
+      </span>
+      <span tal:condition="python:here.lastEditIntervalInHours() < indexdelay"
+            tal:omit-tag="">
+        <meta name="robots" content="noindex" />
+      </span>
+    </span>
+    <span metal:define-slot="extra" tal:omit-tag="" 
+          />
+    <link rel="stylesheet" type="text/css" href="" 
+          tal:attributes="href string:${here/defaultPageUrl}/stylesheet" 
+          />
+    <span metal:define-macro="favicon" tal:condition="container/favicon|nothing" tal:omit-tag="">
+    <link rel="shortcut icon" href="favicon"/>
+    <link rel="icon" href="favicon"/>
+    </span>
+    <title metal:define-slot="title"
+           tal:content="string:${container/title} ${here/pageName}">
+      page title
+    </title>
+  </head>
+
+  <!-- meta search tags for the page view's head -->
+  <metal:block metal:define-macro="pagesearchtags"
+               tal:define="fresh python:here.lastEditIntervalInHours() < 24">
+    <meta tal:condition="fresh" 
+          name="robots" content="noindex" />
+    <meta tal:condition="not:fresh" 
+          name="keywords" tal:attributes="content here/spacedPageName;" />
+    <meta tal:condition="not:fresh" 
+          name="description" tal:attributes="content here/summary;" />
+  </metal:block>
+
+  <!-- meta search tags for form views' head -->
+  <metal:block metal:define-macro="formsearchtags">
+    <meta name="robots" content="noindex,nofollow" />
+  </metal:block>
+
+  <body />
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/helppage.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/helppage.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/helppage.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,22 @@
+<html metal:use-macro="here/main_template/macros/master" i18n:domain="zwiki" >
+  <head>
+    <title metal:fill-slot="title_slot" tal:content="
+           string:${container/title} help" />
+    <metal:block metal:fill-slot="head_slot">
+      <metal:block metal:use-macro="here/macros/formsearchtags" />
+    </metal:block>
+  </head>
+  <body>
+    <div metal:fill-slot="main">
+      <metal:macro metal:use-macro="here/macros/accesskeys" />
+      <h1 i18n:translate="">Help page</h1>
+      <div class="formcontent" 
+           tal:content="structure python:
+			here.wikilink(here.stxToHtml(str(here.getSkinTemplate('HelpPage'))))
+			# for now - HelpPage really expects to be a wiki page
+			">
+        content goes here..
+      </div>
+    </div>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/hierarchylinks.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/hierarchylinks.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/hierarchylinks.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,34 @@
+<html>
+  <head />
+  <body>
+    <!-- hierarchy navigation bar - off by default -->
+    <div metal:define-macro="hierarchylinks" tal:omit-tag="">
+      <div class="navpanel">
+        <table class="shade1" width="100%" border="0" cellspacing="0">
+          <tr valign="top">
+            <td align="left" width="33%">
+              <a tal:condition="here/previousPage" tal:attributes="href here/previousPageUrl"
+                 access_key='P' tal:content="python:'&lt;&lt;'+here.previousPage()">
+                &lt;&lt; PreviousPage
+              </a>
+            </td>
+            <td align="center" width="33%">
+              <a tal:condition="here/primaryParentName" 
+                 tal:attributes="href here/upUrl"
+                 access_key='U' 
+                 tal:content="python:'^^'+(here.primaryParentName() or 'wiki contents')">
+                ^^ParentPage
+              </a>
+            </td>
+            <td align="right" width="33%">
+              <a tal:condition="here/nextPage" tal:attributes="href here/nextPageUrl"
+                 access_key='N' tal:content="python:here.nextPage()+'&gt;&gt;'">
+                &gt;&gt;NextPage
+              </a>
+            </td>
+          </tr>
+        </table>
+      </div>
+    </div>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/links.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/links.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/links.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,109 @@
+<html>
+  <body>
+    <div metal:define-macro="links" class="linkpanel">
+      <table class="shade1" width="100%" border="0" cellspacing="0">
+        <tr>
+          <td align="right">
+            <!-- standard wiki links -->
+            <a href="" tal:attributes="href here/homeUrl" 
+               accesskey="f"
+               title="show front page"
+               i18n:attributes="title">
+            <span i18n:translate="">home</span></a>
+            <a href="" tal:attributes="href here/changesUrl" 
+               accesskey="r"
+               title="show wiki recent changes"
+               i18n:attributes="title">
+            <span i18n:translate="">changes</span></a>
+            <a href="" tal:attributes="href here/discussionUrl" 
+               tal:condition="here/discussionUrl"
+               title="show discussion page"
+               i18n:attributes="title">
+            <span i18n:translate="">discussion</span></a>
+            <a href="" tal:attributes="href here/trackerUrl" 
+               tal:condition="here/hasIssues"
+               title="show issue tracker"
+               i18n:attributes="title">
+            <span i18n:translate="">issues</span></a>
+            <a href="" tal:attributes="href here/contentsUrl" 
+               accesskey="c"
+               title="show wiki contents"
+               i18n:attributes="title">
+            <span i18n:translate="">contents</span></a>
+            <a tal:attributes="href here/indexUrl" accesskey="i" 
+               tal:condition="here/indexUrl"
+               title="show wiki index"
+               i18n:attributes="title">
+            <span i18n:translate="">index</span></a>
+            <a href="" tal:attributes="href here/uploadsUrl" 
+               tal:condition="here/uploadsUrl"
+               title="show upload page"
+               i18n:attributes="title">
+            <span i18n:translate="">uploads</span></a>
+            <a tal:attributes="href here/helpUrl" 
+               accesskey="h" 
+               tal:condition="here/helpUrl"
+               title="show help page"
+               i18n:attributes="title">
+            <span i18n:translate="">help</span></a>
+            <a tal:attributes="href here/preferencesUrl" 
+               accesskey="o"
+               title="show wiki options"
+               i18n:attributes="title">
+            <span i18n:translate="">options</span></a>
+
+            <!-- standard page links -->
+            <a tal:condition="python:0"
+               tal:attributes="href python:here.pageUrl() + '/backlinks';"
+               href="" 
+               title="which pages link to this one ?" 
+               i18n:attributes="title"
+               accesskey="b"
+               ><span i18n:translate="">backlinks</span></a>
+            <a tal:condition="python:here.isMailoutEnabled()"
+               tal:attributes="href python:here.pageUrl() + '/subscribeform'"
+               href="page_url/subscribeform" 
+               accesskey="m"
+               title="configure email subscription to this page or site" 
+               i18n:attributes="title"
+               >
+              <span tal:condition="python:0 
+                                   #here.allSubscriptionsFor(request.get('email',''))
+                                   #show subscription status - too expensive " >(un)</span >
+            <span i18n:translate="">subscribe</span></a>
+            <a tal:condition="python:0 #user.has_permission('Zwiki: Edit pages',here)"
+               tal:attributes="href python:here.pageUrl() + '/diff';"
+               href="" 
+               title="show this page's change history" 
+               i18n:attributes="title"
+               accesskey="d"
+               ><span i18n:translate="">diff</span></a>
+            <a tal:condition="python:user.has_permission('Zwiki: Edit pages',here)"
+               tal:attributes="
+                               href python:here.pageUrl() + '/editform';
+                               title python: here.translateHelper('edit-page') + ' (' + here.linkTitle() + ')'"
+               href="page_url/editform" 
+               title="edit this page (last edited n days ago by so-and-so)"
+               accesskey="e"
+               >
+            <span i18n:translate="">edit</span></a>
+            <a tal:condition="python:
+                              user.has_permission('Zwiki: Edit pages',here) and
+                              hasattr(root.misc_,'ExternalEditor') and
+                              user.has_permission('Use external editor',here)"
+               tal:attributes="href python:
+                               here.wiki_url() + '/externalEdit_/' +
+                               modules['Products.PythonScripts.standard'].url_quote(here.id()) +
+                               '?borrow_lock=1'"
+               href="wiki_url/externalEdit_/id" 
+               title="edit using external editor" 
+               i18n:attributes="title"
+               accesskey="x"
+               ><img src="misc_/ExternalEditor/edit_icon" border="0" 
+               alt="(external edit)" i18n:attributes="alt" /></a>
+          </td>
+        </tr>
+      </table>
+    </div> 
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/maintemplate.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/maintemplate.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/maintemplate.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,29 @@
+<metal:block metal:define-macro="master"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" 
+      i18n:domain="zwiki">
+                         
+  <head>
+    <meta http-equiv="Content-Type"
+          tal:define="charset string:utf-8;
+                      dummy   python:request.RESPONSE.setHeader(
+                      'Content-Type','text/html;; charset='+charset);"
+          tal:attributes="content string:text/html;;charset=${charset}" 
+          />
+    <tal:block tal:condition="container/favicon|nothing">
+      <link rel="shortcut icon" href="favicon"/>
+      <link rel="icon" href="favicon"/>
+    </tal:block>
+    <link rel="stylesheet" type="text/css" href="" 
+          tal:attributes="href string:${here/defaultPageUrl}/stylesheet" 
+          />
+    <title metal:define-slot="title_slot" tal:content="
+           string:${container/title} ${here/pageName}" />
+    <metal:block metal:define-slot="head_slot" />
+  </head>
+  <body>
+    <div metal:use-macro="here/macros/siteheader" />
+    <div metal:use-macro="here/macros/links" />
+    <div metal:define-slot="main" />
+  </body>
+</html>
+</metal:block>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/pageheader.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/pageheader.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/pageheader.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,79 @@
+<html>
+  <body>
+
+    <div metal:define-macro="pageheader" class="pageheader" >
+      <!-- page header -->
+      <form method="GET" 
+            tal:define="
+                        methodname string:searchwiki;
+                        pagename string:SearchPage; 
+                        page python:here.pageWithName(pagename);
+                        pagehasdtml python:page and page.dtmlAllowed() and page.hasDynamicContent();
+                        url python:(pagehasdtml and page.id()) or (here.defaultPageId()+'/'+methodname);
+                        "
+            tal:attributes="action python:here.wikiUrl()+'/'+url;"
+            >
+        <table width="100%" border="0" cellspacing="0">
+          <tr>
+            <!-- logo -->
+            <td id="logo" width="1%" valign="top" class="logo"
+                tal:condition="not:here/usingPloneSkin">
+              <span metal:define-macro="logolink" tal:omit-tag="">
+                <a tal:attributes="href here/wiki_url"
+                   title="go to home page" 
+                   i18n:attributes="title">
+                  <img src="misc_/ZWiki/ZWikiPage_icon" height="48" width="48" 
+                       border="0" alt="home" i18n:attributes="alt"
+                       tal:replace="structure here/site_logo|default" /></a>
+                &nbsp;
+              </span>
+            </td>
+            <!-- page name and context (parent topics) -->
+            <td align="left" width="79%" tal:define="COMPACT_PARENTS python:0">
+              <tal:block tal:condition="not:COMPACT_PARENTS">
+                <ul tal:replace="structure 
+                                 python:here.context(request,enlarge_current=1)">
+                  <li>context<ul><li><h1 style="display:inline">page name</h1></li></ul></li>
+                </ul>
+              </tal:block>
+              <tal:block tal:condition="COMPACT_PARENTS">
+                <tal:block condition="here/ancestorsAsList"
+                           repeat="ancestor here/ancestorsAsList">
+                  <span tal:replace="structure python:here.wikilink('['+ancestor+']')" />
+                  <small>>></small>
+                </tal:block>
+                <br />
+                <br tal:condition="here/usingPloneSkin" />
+                <h1 style="display:inline" tal:content="here/formattedPageName" >page name</h1>
+              </tal:block>
+            </td>
+            <!-- search form & page info -->
+            <td class="searchbox" width="20%" align="right">
+              <tal:block tal:condition="not:here/usingPloneSkin">
+                <input id="searchinput" class="formfield"
+                       name="expr" type="text" size="20" maxlength="100" value="" 
+                       title="search all pages" accesskey="s" i18n:attributes="title" /><br />
+                <span class="lasteditor" 
+                      tal:content="structure python:here.linkTitle(prettyprint=1)">
+                  last edited n days ago by by so-and-so
+                </span>
+              </tal:block>
+              <tal:block tal:condition="here/usingPloneSkin">
+                <span class="lasteditor" 
+                      tal:content="structure python:here.linkTitle(prettyprint=1)">
+                  last edited n days ago by by so-and-so
+                </span>
+                <div metal:use-macro="python:
+                                      (hasattr(here,'document_actions')
+                                      and here.document_actions.macros['document_actions']) 
+                                      or default
+                                      # degrade gracefully. By all means make this more elegant.." />
+              </tal:block>
+            </td>
+          </tr>
+        </table>
+      </form>
+    </div>
+
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/pagemanagementform.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/pagemanagementform.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/pagemanagementform.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,73 @@
+<html>
+  <body>
+
+    <div metal:define-macro="pagemanagementform" 
+         tal:condition="python:
+                        ((user.has_permission('Zwiki: Add pages',container) or
+                        user.has_permission('Zwiki: Rename pages',here) or
+                        user.has_permission('Zwiki: Reparent pages',here) or
+                        user.has_permission('Zwiki: Delete pages',here))
+                        and here.checkSufficientId(request))
+                        ">
+      <!-- page management form -->
+      <br />
+      <form method="post" action="" enctype="multipart/form-data"
+            tal:attributes="action here/pageUrl" 
+            style="margin-top:0;margin-bottom:0">
+        <table border="0" cellspacing="0" cellpadding="1" 
+               class="shade1" align="center"
+               style="font-size:90%; border-top: thin solid #aaaaaa; 
+                      border-bottom: thin solid #aaaaaa;"
+               >
+          <tr>
+            <td align="left" valign="top">
+              <!-- help text -->
+              <span i18n:translate="">new</span> 
+              <span i18n:translate=""
+                    tal:condition="python:user.has_permission('Zwiki: Reparent pages',here) and here.checkSufficientId(request)" 
+                    >parent, </span>
+              <span i18n:translate=""
+                    tal:condition="python:user.has_permission('Zwiki: Rename pages',here) and here.checkSufficientId(request)" 
+                    >name, </span>
+              <span i18n:translate=""
+                    tal:condition="python:user.has_permission('Zwiki: Delete pages',here) and here.checkSufficientId(request)" 
+                    >replacement, </span>
+              <span i18n:translate=""
+                    tal:condition="python:user.has_permission('Zwiki: Add pages',container)"
+                    >page</span
+                    ><span tal:condition="not:here/usingPloneSkin" tal:omit-tag="">:</span>
+              <!-- multi-purpose input field and buttons -->
+              <input name="pagename" type="text" size="25" maxlength="100" value="" 
+                     class="formfield"
+                     title="enter a page name and click buttons to the right (mouse over for help)"
+                     i18n:attributes="title"
+                     /><span style="white-space:nowrap;"
+                     ><input type="submit" name="reparent:method" value="reparent" 
+                     style="font-weight:normal;"
+                     title="make this page a subtopic of the page you have entered"
+                     i18n:attributes="value; title"
+                     tal:condition="python:user.has_permission('Zwiki: Reparent pages',here) and here.checkSufficientId(request)" 
+                     /><input type="submit" name="rename:method" value="rename" 
+                     style="font-weight:normal" 
+                     title="rename this page to the name you have entered, updating all links"
+                     i18n:attributes="value; title"
+                     tal:condition="python:user.has_permission('Zwiki: Rename pages',here) and here.checkSufficientId(request)" 
+                     /><input type="submit" name="delete:method" value="delete!" 
+                     style="font-weight:normal"
+                     title="delete this page, and redirect links to the page you have entered, if any"
+                     i18n:attributes="value; title"
+                     tal:condition="python:user.has_permission('Zwiki: Delete pages',here) and here.checkSufficientId(request)"
+                     /><input type="submit" name="createform:method" value="create" 
+                     style="font-weight:normal"
+                     title="create a page with the name you have entered, as a subtopic of this one"
+                     i18n:attributes="value; title"
+                     tal:condition="python:user.has_permission('Zwiki: Add pages',container)" 
+                     /></span>
+            </td>
+          </tr>
+        </table>
+      </form>
+    </div>
+
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/recentchanges.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/recentchanges.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/recentchanges.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,20 @@
+<html metal:use-macro="here/main_template/macros/master" i18n:domain="zwiki" >
+  <head>
+    <title metal:fill-slot="title_slot" tal:content="
+           string:${container/title} recent changes" />
+    <metal:block metal:fill-slot="head_slot">
+      <metal:block metal:use-macro="here/macros/formsearchtags" />
+    </metal:block>
+  </head>
+  <body>
+    <div metal:fill-slot="main">
+      <metal:macro metal:use-macro="here/macros/accesskeys" />
+      <h1 i18n:translate="">Recent changes</h1>
+      <div class="formcontent" 
+           tal:content="structure python:
+                        here.getSkinTemplate('RecentChanges')(here,request)">
+        content goes here..
+      </div>
+    </div>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/searchwiki.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/searchwiki.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/searchwiki.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,20 @@
+<html metal:use-macro="here/main_template/macros/master" i18n:domain="zwiki" >
+  <head>
+    <title metal:fill-slot="title_slot" tal:content="
+           string:${container/title} search" />
+    <metal:block metal:fill-slot="head_slot">
+      <metal:block metal:use-macro="here/macros/formsearchtags" />
+    </metal:block>
+  </head>
+  <body>
+    <div metal:fill-slot="main">
+      <metal:macro metal:use-macro="here/macros/accesskeys" />
+      <h1 i18n:translate="">Search this wiki</h1>
+      <div class="formcontent" 
+           tal:content="structure python:
+                        here.getSkinTemplate('SearchPage')(here,request)">
+        content goes here..
+      </div>
+    </div>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/siteheader.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/siteheader.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/siteheader.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,11 @@
+<html>
+  <body>
+
+    <!--  optional extra site header -->
+    <div metal:define-macro="siteheader" 
+         tal:condition="here/site_header|nothing" 
+         tal:replace="structure here/site_header" 
+         class="siteheader" />
+
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/star.png
===================================================================
(Binary files differ)


Property changes on: zope-zwiki/branches/upstream/current/skins/zwiki/star.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: zope-zwiki/branches/upstream/current/skins/zwiki/stylesheet.css
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/stylesheet.css	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/stylesheet.css	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,654 @@
+/* Zwiki stylesheet - edit to change the wiki's appearance 
+ *
+ * This may be installed
+ * - as the built-in skin method "/stylesheet" (default)
+ * - as zodb file or dtml method "stylesheet" (anywhere in acquisition context)
+ * - as wiki page "StyleSheet" (http://zwiki.org/HowToMakeAnEditableStyleSheet)
+ */
+
+/***********************************************************************-*-c-*-
+ First, docutils' html4css stylesheet, inlined here for easy reference
+ For easier upgrades, you may want to add your changes as overrides at the end
+ *****************************************************************************/
+
+/*
+:Author: David Goodger
+:Contact: goodger at users.sourceforge.net
+:Date: $Date: 2006-02-02 19:09:16 -0600 (Thu, 02 Feb 2006) $
+:Revision: $Revision: 4332 $
+:Copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the HTML output of Docutils.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+*/
+
+/* used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+  border: 0 }
+
+table.borderless td, table.borderless th {
+  /* Override padding for "table.docutils td" with "! important".
+     The right padding separates the table cells. */
+  padding: 0 0.5em 0 0 ! important }
+
+.first {
+  /* Override more specific margin styles with "! important". */
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+/* Uncomment (and remove this text!) to get bold-faced definition list terms
+dl.docutils dt {
+  font-weight: bold }
+*/
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller }
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin-left: 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1.title {
+  text-align: center }
+
+h2.subtitle {
+  text-align: center }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left {
+  clear: left }
+
+img.align-right {
+  clear: right }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font-family: serif ;
+  font-size: 100% }
+
+pre.literal-block, pre.doctest-block {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid 1px gray;
+  margin-left: 1px }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid 1px black;
+  margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+table.docutils th.field-name, table.docinfo th.docinfo-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+ul.auto-toc {
+  list-style-type: none }
+
+
+/***********************************************************************-*-c-*-
+ Zwiki styles
+ For easier upgrades, you may want to add your changes as overrides at the end
+ *****************************************************************************/
+
+/* colours and general styles */
+
+/* default gray */
+.shade1                  {color:gray;}
+.shade1 a:link           {color:gray;}
+.shade1 a:visited        {color:gray;}
+
+.dimtext                 {font-size: 80%; color: gray;}
+
+.linkpanel td, .linkpanel_minimal td {color: gray;}
+                                      
+.navpanel {
+       color: gray;
+}
+
+.searchbox a:link        {color: gray;}
+.searchbox a:visited     {color: #aaaaaa;}
+
+.lasteditor              {color:gray;}
+
+/* can't get these to combine with dimtext for some reason */
+.highrated               {font-size: 80%; color: green} 
+.neutralrated            {font-size: 80%; color: gray}
+.lowrated                {font-size: 80%; color: red}
+
+.commentsheader          {color:gray; font-weight:bold;}
+.commentform             {color:gray;}
+
+.subscribed              {} /* for subscribeform */
+.notsubscribed           {}
+
+/* background shade of form fields 
+ * input,textarea,select {} would be cleaner but changes buttons too
+ * (except file upload buttons)
+ * can select with input[type=submit] but not in IE 
+ */
+.formfield               {background: #f0f0f0;}
+
+body {
+  margin:0; 
+  padding:0;
+  font-family:sans, sans-serif, verdana, arial, helvetica;
+  color: black;
+  background-color: white /*#eefff0*/ ;
+  /* background: white url('top-border-fade.jpg') repeat-x; */
+}
+h2 {
+  margin-top: 1.5em;
+  font-size: 130%;
+}
+pre, code, tt {
+  padding: 4px;
+/*border-left: solid 1px #cc6600;*/
+/*  background-color: #ffeed0;*/
+  color: red;
+  font-weight:bold;
+}
+.content {
+  margin-top:2em;
+  margin-left:2em; 
+  margin-right:2em;
+ /* width: 80%; */
+  background-color: white;
+} 
+td.content {
+ border: 1px solid #EEEEEE;
+}
+.formcontent {
+ margin:8px;
+} 
+input,select {
+  font-size:inherit;
+}
+.error { 
+ color:red; background-color:#ffdddd; border:thin solid red; 
+}
+
+/* top stuff */
+
+.linkpanel td, .linkpanel_minimal td {
+  font-size: 80%;
+}
+.linkpanel a {
+  text-decoration:none;
+}
+.wikilinks {
+  font-weight: normal;
+  vertical-align: middle;
+}
+.otherlinks {
+  vertical-align: middle;
+}
+.navpanel {
+  font-size: 80%;
+}
+.pageheader ul {
+  margin-top:0px; margin-bottom:0px; margin-left:6px; padding-left:6px;
+}
+.logo_full { /*td*/
+  padding-top: 0.5em;
+  padding-right: 4px;
+}
+.logo_simple { /*td*/
+  padding-top: 1em;
+  padding-right: 4px;
+}
+.logo_minimal {
+  padding-top: 1em;
+  padding-right: 4px;
+}
+.pagenameand { /*td*/
+ padding: 0;
+ vertical-align: middle;
+}
+.pagenameonly { /*td*/
+  font-size: xx-large;
+  font-weight: bold;
+  vertical-align: middle;
+}
+.searchbox {
+  vertical-align: top;
+  font-size: 80%;
+}
+#searchinput { /* generated tag with id=searchinput already has a class (multiple classes bad for IE<5.5 ?) */
+ width:95%; 
+ margin-top: 0px;
+}
+.lasteditor {
+  font-style: italic;
+}
+
+/*
+.preview {
+  border:4px; width:100%; padding:10px; background-color:#ffffaa;
+}
+*/
+
+/* subtopics styling (also page context and wiki contents)
+ *
+ * a screenshot would be better, but here's what these intend to do
+ * (known to work in at least firefox 2):
+ * - gray subtopics heading
+ * - no list bullets
+ * - only slight indentation
+ * - black links
+ * - no link underlining
+ * - top-level subtopics are bold
+ * - links get smaller with depth (down to your browser's minimum if any)
+ *
+ * currently, hierarchical page links as seen in subtopics, page context
+ * above the title and wiki contents use the "outline" and "expandable" classes
+ * and subtopics are additionally in a div with "subtopics" class
+ */
+
+div.subtopics {
+  margin-top:1em;
+}
+.subtopics h4 {
+  color: gray; 
+/*  margin-bottom:0;*/
+}
+.subtopics ul {
+  margin-left:0;
+  padding-left:0;
+  font-weight:bold;
+}
+.subtopics ul ul {
+  font-weight:normal; 
+  font-size:0.9em;
+}
+.outline ul {
+  margin-left:1em;
+  padding-left:0;
+}
+.outline li {
+  list-style:none;
+}
+.outline a {   
+  text-decoration: none; 
+  color: black;
+}
+.expandable {
+}
+
+/* bottom stuff */
+
+.commentform {
+}
+
+/* misc stuff */
+
+#youarehere {
+  color:red;
+  font-size:normal;
+  font-weight:bold;
+}
+
+/* handy for displaying completion status */
+.incomplete {color: red;}
+.zeropercent {color: red;}
+.tenpercent {color: red;}
+.twentypercent {color: red;}
+.thirtypercent {color: red;}
+.fortypercent {color: red;}
+.fiftypercent {color: red;}
+.sixtypercent {color: green;}
+.seventypercent {color: green;}
+.eightypercent {color: green;}
+.ninetypercent {color: green;}
+.onehundredpercent {color: green;}
+.complete {color: green;}
+
+/*
+.link-external {
+  background: transparent url(http://plone.zwiki.org/link_icon.gif) 0px 1px no-repeat;
+  padding: 1px 0px 1px 16px;
+}
+*/
+
+/* overrides for standard docutils styles on restructured text pages */
+
+div.sidebar {
+  margin-left: 1em ;
+  margin-bottom: 1em;
+  padding: 1em ;
+  float: right ;
+  clear: right ;
+  border: none;
+  /*background-color: #ddbbff;*/
+}
+
+dt { font-weight:bold; }
+
+/* these two hide the blank line after comment headings on RST pages
+ * NB commentbody is misleading, it's only the first paragraph for now.
+ */
+.commentheading {
+  margin-bottom:0;
+}
+
+.commentbody {
+  margin-top:0;
+}
+
+
+/***********************************************************************-*-c-*-
+ MathAction styles
+ For easier upgrades, you may want to add your changes as overrides at the end
+ *****************************************************************************/
+
+pre, code {
+  white-space: pre; /* CSS2 */
+  white-space: -moz-pre-wrap; /* Mozilla */
+  white-space: -hp-pre-wrap; /* HP printers */
+  white-space: -o-pre-wrap; /* Opera 7 */
+  white-space: -pre-wrap; /* Opera 4-6 */
+  white-space: pre-wrap; /* CSS 2.1 */
+  white-space: pre-line; /* CSS 3 (and 2.1 as well, actually) */
+  word-wrap: break-word; /* IE */
+}
+
+#axiomlabel {
+    position:relative; 
+    right:0.8em; 
+    top:-0.2em; 
+    font-size:100%; 
+    color: #446644;
+    font-family: monospace;
+}
+#axiomcode {
+    background-color: transparent; 
+    font-family: monospace; 
+    font-size:100%;
+}   
+#axiomtext {
+    margin-left:2em;
+    background-color: lightgrey;
+    font-family: monospace; 
+    font-size:85%;
+    padding: 1ex; padding-top: 0;
+/*    border-width: 0.5ex;  border-style: inset; border-color:lightgrey;*/
+}   
+#axiomcode pre {
+    margin-left:1.5em;
+    background-color: lightgreen; 
+    font-family: monospace; 
+    font-size:85%;
+    padding: 1ex; padding-top: 0;
+/*    border-width: 0.5ex;  border-style: outset; border-color:lightgreen;*/
+}
+#reducelabel { 
+    position:relative; 
+    right:0.8em; 
+    top:-0.2em; 
+    font-size:73%; 
+    color: #446644;
+    font-family: monospace;
+}
+#reducecode {
+    width:98%;
+    margin-left:1em; margin-bottom:1ex; margin-top:1ex;
+    white-space:pre;
+    background-color: lightpink;
+    font-family: monospace;
+    font-size:85%
+/*    border-width: 0.5ex;  border-style: outset; border-color:lightpink;*/
+    padding: 1ex; padding-top: 0;
+}
+#reducecode pre {
+    font-family: monospace;
+    font-size:85%
+}
+
+#maximalabel {
+    position:relative; 
+    right:0.8em; 
+    top:-0.2em; 
+    font-size:100%; 
+    color: #448844;
+    font-family: monospace;
+}
+#maximacode {
+    background-color: transparent; 
+    font-family: monospace; 
+    font-size:85%;
+}   
+
+#maximaoutput {
+    margin-left:2em;
+    background-color: transparent; 
+    font-family: monospace; 
+    font-size:85%;
+}   
+#maximainput {
+    width:98%;
+    margin-left:1em; margin-bottom:1ex; margin-top:1ex;
+    background-color: lightblue;
+    font-family: monospace; 
+    font-size:85%;
+    padding: 1ex; padding-top: 0;
+/*    border-width: 0.5ex;  border-style: inset; border-color:lightgrey;*/
+}
+
+#maximacode pre {
+    margin-left:1.5em;
+    background-color: lightgrey; 
+    font-family: monospace; 
+    font-size:85%;
+    padding: 1ex; padding-top: 0;
+/*    border-width: 0.5ex;  border-style: outset; border-color:lightgrey;*/
+}
+
+img.equation { vertical-align: middle; border: 0px }
+
+
+/***********************************************************************-*-c-*-
+ Customizations for the above
+ *****************************************************************************/
+

Added: zope-zwiki/branches/upstream/current/skins/zwiki/subscribeform.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/subscribeform.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/subscribeform.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,187 @@
+<html metal:use-macro="here/main_template/macros/master" i18n:domain="zwiki" >
+  <head>
+    <title metal:fill-slot="title_slot" tal:content="
+           string:${container/title} ${here/pageName} subscription" />
+    <metal:block metal:fill-slot="head_slot">
+      <metal:block metal:use-macro="here/macros/formsearchtags" />
+    </metal:block>
+  </head>
+  <body>
+    <div metal:fill-slot="main">
+      <metal:macro metal:use-macro="here/macros/accesskeys" />
+      <h1 i18n:translate="">Mail subscription</h1>
+      <div class="formcontent">
+        <span tal:condition="request/emailchanged|nothing">
+          <!-- remember email address with a cookie like UserOptions -->
+          <tal:dummy tal:define="r python:request.RESPONSE.setCookie(
+                                 'email',
+                                 request.email,
+                                 path='/',
+                                 expires=(here.ZopeTime() + 365).rfc822())
+                                 "/>
+        </span>
+        <form method="post" 
+              enctype="multipart/form-data"
+              action="page_url/subscribeform" 
+              tal:attributes="action string:${here/pageUrl}/subscribeform"
+              tal:define="
+                          email here/usernameOrEmailOfSubscriber;
+                          inCMFAndLoggedIn python:here.inCMF() and not container.portal_membership.isAnonymousUser();
+
+                          pagesubscriber python:here.isSubscriber(email);
+                          wikisubscriber python:here.isWikiSubscriber(email);
+                          othersubscriptions python:here.otherPageSubscriptionsFor(email);
+                          split python:modules['string'].split;
+                          mailoutEverything python:getattr(here, 'mailout_policy','') == 'edits';
+                          ">
+          <p>
+            <span tal:condition="not:mailoutEverything" i18n:translate="subscribe_desc_comments" tal:omit-tag="">
+              You can subscribe to this page or to the whole wiki.
+              Subscribers receive a copy of comments via email.
+              Or return to
+            </span>
+            <span tal:condition="mailoutEverything" i18n:translate="subscribe_desc_edits" tal:omit-tag="">
+              You can subscribe to this page or to the whole wiki.
+              Subscribers receive a copy of all edits via email.
+              Or return to
+            </span>
+            <a href="page_url" tal:attributes="href here/pageUrl" 
+               tal:content="here/pageName">Page name</a>.
+          </p>
+          <div tal:condition="inCMFAndLoggedIn">
+            <input name="email" type="hidden" tal:attributes="value email" />
+            <span i18n:translate="" tal:omit-tag="">
+              Email will go to the address you have configured in site preferences.
+            </span>
+          </div>
+          <div tal:condition="not:inCMFAndLoggedIn">
+            <span i18n:translate="" tal:omit-tag="">Your email address</span>:
+            <input name="email" type="text" size="30" value="email" 
+                   tal:attributes="value email" class="formfield" />
+            <input name="emailchanged" type="hidden" value="1" />
+            <input class="context"
+                   type="submit" 
+                   name="../subscribeform:method" 
+                   value="Change" 
+                   i18n:attributes="value"
+                   />
+          </div>
+          <div tal:condition="not:email" i18n:translate="subscribe_no_email">
+            To subscribe, please configure your email address.
+          </div>
+          <table width="100%" cellpadding="2" cellspacing="1" border="0">
+            <tr valign="top" tal:condition="email">
+              <td valign="top" width="50%"
+                  tal:attributes="class python:
+                                  (pagesubscriber and 'subscribed') or 'notsubscribed'">
+                <br />
+                <span tal:condition="pagesubscriber" tal:omit-tag="">
+                  <b i18n:translate="subscribed_page_ok">You are currently subscribed<br />
+                  to this page.</b>
+                </span>
+                <span tal:condition="not:pagesubscriber">
+                  <span i18n:translate="subscribed_page_no" tal:omit-tag="">You are currently not subscribed<br />
+                  to this page.</span>
+                </span>
+                <br />
+                <input tal:condition="pagesubscriber" 
+                       class="standalone"
+                       type="submit" 
+                       name="../unsubscribe:method" 
+                       value=" Unsubscribe from this page " 
+                       i18n:attributes="value"
+                       />
+                <input tal:condition="not:pagesubscriber" 
+                       class="standalone"
+                       type="submit" 
+                       name="../subscribe:method" 
+                       value=" Subscribe to this page " 
+                       i18n:attributes="value"
+                       />
+                <span tal:condition="not:pagesubscriber">
+                  &nbsp;&nbsp;<span i18n:translate="">all edits</span>:
+                  <input type="checkbox" 
+                         name="edits" 
+                         value="1" 
+                         />
+                </span>
+              </td>
+              <td valign="top" width="50%"
+                  tal:attributes="class python:
+                                  (pagesubscriber and 'subscribed') or 'notsubscribed'">
+                <br />
+                <b tal:condition="wikisubscriber" i18n:translate="subscribed_wiki_ok">
+                  You are currently subscribed<br />
+                  to the whole wiki.
+                </b>
+                <span tal:condition="not:wikisubscriber" i18n:translate="subscribed_wiki_no" tal:omit-tag="">
+                  You are currently not subscribed<br /> to the whole wiki.
+                </span>
+                <br />
+                <input tal:condition="wikisubscriber" 
+                       class="standalone"
+                       type="submit" 
+                       name="../wikiUnsubscribe:method" 
+                       value="Unsubscribe from whole wiki" 
+                       i18n:attributes="value"
+                       />
+                <input tal:condition="not:wikisubscriber" 
+                       class="standalone"
+                       type="submit" 
+                       name="../wikiSubscribe:method" 
+                       value="Subscribe to whole wiki" 
+                       i18n:attributes="value"
+                       />
+                <span tal:condition="not:wikisubscriber">
+                  &nbsp;&nbsp;<span i18n:translate="">all edits</span>:
+                  <input type="checkbox" 
+                         name="edits" 
+                         value="1" 
+                         />
+                </span>
+              </td>
+            </tr>
+            <tr tal:condition="python:email and othersubscriptions">
+              <td>
+                <span i18n:translate="other_page_subscribed" tal:omit-tag="">You are subscribed to these other pages</span>:
+                <span tal:repeat="pageid othersubscriptions" tal:omit-tag="">
+                  <br />
+                  <a href="../pageid/subscribeform?email=email"
+                     tal:attributes="href python:
+                                     '%s/%s/subscribeform?email=%s' % (
+                                     here.wiki_url(),pageid,here.urlquote(email))"
+                     tal:content="python:here.pageWithId(pageid).pageName()"
+                     >pagename</a>
+                </span>
+              </td>
+              <td>
+                &nbsp;
+              </td>
+            </tr>
+            <tr>
+              <td valign="top" width="50%" tal:define="subs here/subscriberList">
+                <br />
+                <span i18n:translate="" tal:omit-tag="">Page subscribers</span>:
+                (<span tal:replace="python:len(subs)" />)
+                <br />
+                <span tal:repeat="sub subs" tal:omit-tag="">
+                  <span tal:replace="python:split(sub,'@')[0]"></span><br />
+                </span>
+              </td>
+              <td valign="top" width="50%" tal:define="subs here/wikiSubscriberList">
+                <br />
+                <span i18n:translate="" tal:omit-tag="">Wiki subscribers</span>:
+                (<span tal:replace="python:len(subs)" />)
+                <br />
+                <span tal:repeat="sub subs" tal:omit-tag="">
+                  <span tal:replace="python:split(sub,'@')[0]"></span>
+                  <br />
+                </span>
+              </td>
+            </tr>
+          </table>
+        </form>
+      </div>
+    </div>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/subtopics_board.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/subtopics_board.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/subtopics_board.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,54 @@
+<dtml-let 
+ subtopics=childrenAsList
+ viewcounter="_.has_key('mxm_counter')"
+>
+<dtml-if subtopics>
+<dtml-call "REQUEST.RESPONSE.setHeader('Content-Type','text/html; charset=utf-8')">
+<div class="subtopics_board">
+<a name="subtopics"></a>
+<b class="subtopicspanel">subtopics:</b><br />
+<table cellpadding="6">
+<tr>
+<td><b><dtml-translate domain="zwiki">Topic</dtml-translate></b></td>
+<th><dtml-translate domain="zwiki">Last updated</dtml-translate></th>
+<th><dtml-translate domain="zwiki">Comments</dtml-translate></th>
+<dtml-if viewcounter>
+<th><dtml-translate domain="zwiki">Views</dtml-translate></th>
+</dtml-if>
+<th><dtml-translate domain="zwiki">Created</dtml-translate></th>
+</tr>
+<dtml-in "[pageWithName(c) for c in subtopics]" prefix=x sort=ageInDays>
+<dtml-let 
+  active="lastEditIntervalInDays() < 7"
+  bold="active and 'font-weight:bold;' or ''"
+  star="active and '<img src=/misc_/ZWiki/star_icon align=right />' or ''"
+  creationdate="'%s/%s/%s' % (creationTime().year(),creationTime().month(),creationTime().day())"
+>
+<tr style="background-color:#eeffdd;">
+<td>
+  <b><dtml-var "wikilink('['+pageName()+']')"></b>
+</td>
+<td align="center" style="font-size:90%;&dtml-bold;">
+  <dtml-var star>
+  <dtml-translate domain="zwiki">by</dtml-translate> <dtml-var last_editor><br>
+  <dtml-translate domain="zwiki"><dtml-var lastEditInterval> ago</dtml-translate>
+</td>
+<td align="center" style="font-size:90%;">
+  <dtml-var commentCount>
+</td>
+<dtml-if viewcounter>
+<td align="center" style="font-size:90%;">
+  <dtml-var "mxm_counter.get_count(x_item)">
+</td>
+</dtml-if>
+<td align="center" style="font-size:90%;">
+  <dtml-translate domain="zwiki">by</dtml-translate> <dtml-var creator><br>
+  <dtml-translate domain="zwiki">on</dtml-translate> <dtml-var creationdate>
+</td>
+</tr>
+</dtml-let>
+</dtml-in>
+</table>
+</div>
+</dtml-if>
+</dtml-let>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/subtopics_outline.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/subtopics_outline.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/subtopics_outline.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,13 @@
+<dtml-call "REQUEST.RESPONSE.setHeader('Content-Type','text/html; charset=utf-8')">
+<dtml-let 
+ depth="_.has_key('depth') and _['depth'] or None #how is this supposed to work"
+ subtopics="offspring(exclude_self=1,depth=depth)"
+>
+<dtml-if subtopics>
+<div class="subtopics">
+<a name="subtopics"></a>
+<h4>subtopics:</h4>
+<dtml-var subtopics>
+</div>
+</dtml-if>
+</dtml-let>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/testtemplate.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/testtemplate.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/testtemplate.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,2 @@
+container=<span tal:replace="structure python:`container`" />
+here=<span tal:replace="structure python:`here`" />

Added: zope-zwiki/branches/upstream/current/skins/zwiki/useroptions.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/useroptions.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/useroptions.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,20 @@
+<html metal:use-macro="here/main_template/macros/master" i18n:domain="zwiki" >
+  <head>
+    <title metal:fill-slot="title_slot" tal:content="
+           string:${container/title} user options" />
+    <metal:block metal:fill-slot="head_slot">
+      <metal:block metal:use-macro="here/macros/formsearchtags" />
+    </metal:block>
+  </head>
+  <body>
+    <div metal:fill-slot="main">
+      <metal:macro metal:use-macro="here/macros/accesskeys" />
+      <h1 i18n:translate="">User options</h1>
+      <div class="formcontent" 
+           tal:content="structure python:
+                        here.getSkinTemplate('UserOptions')(here,request)">
+        content goes here..
+      </div>
+    </div>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/wikipage.pt
===================================================================
--- zope-zwiki/branches/upstream/current/skins/zwiki/wikipage.pt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/skins/zwiki/wikipage.pt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,29 @@
+<html metal:use-macro="here/main_template/macros/master" i18n:domain="zwiki" >
+  <!-- the main view for wiki pages. -->
+  <head>
+    <title metal:fill-slot="title_slot" tal:content="
+           string:${container/title} ${here/pageName}" />
+    <metal:block metal:fill-slot="head_slot">
+      <metal:block metal:use-macro="here/macros/pagesearchtags" />
+    </metal:block>
+    <!-- override plone styles via main_template's css_slot:  -->
+    <metal:block metal:fill-slot="css_slot">
+      <link rel="stylesheet" type="text/css" href="" 
+            tal:attributes="href string:${here/defaultPageUrl}/stylesheet" 
+            tal:condition="python:0 # add the full Zwiki stylesheet to plone's ? no" />
+      <style type="text/css">
+        <!-- .documentActions {margin-top:0} /* fix layout in plone 2.0 */-->
+      </style>
+    </metal:block>
+  </head>
+  <body>
+    <div metal:fill-slot="main" tal:omit-tag="">
+      <div metal:use-macro="here/macros/accesskeys" />
+      <div metal:use-macro="here/macros/pageheader" />
+      <div metal:use-macro="here/macros/ratingform" />
+      <br tal:condition="here/usingPloneSkin" />
+      <div metal:use-macro="here/macros/content" />
+      <div metal:use-macro="here/macros/pagemanagementform" />
+    </div>
+  </body>
+</html>

Added: zope-zwiki/branches/upstream/current/skins/zwiki/wikipage_icon.gif
===================================================================
(Binary files differ)


Property changes on: zope-zwiki/branches/upstream/current/skins/zwiki/wikipage_icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: zope-zwiki/branches/upstream/current/skins/zwiki/wikipage_plone_icon.gif
===================================================================
(Binary files differ)


Property changes on: zope-zwiki/branches/upstream/current/skins/zwiki/wikipage_plone_icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: zope-zwiki/branches/upstream/current/testsupport.py
===================================================================
--- zope-zwiki/branches/upstream/current/testsupport.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/testsupport.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,154 @@
+"""
+Common initialization and support classes for zwiki unit tests.
+
+Zwiki core and plugin test modules (_tests.py) import everything from
+here, then they are pretty much ready to go, except for installing
+whichever zope products they need. (We let each test module install
+just it's required products so that individual tests may be run more
+quickly.)
+
+what is the reason for using afterSetUp instead of setUp ? 
+
+XXX various, too many test fixture classes are used in zwiki tests right now:
+- ZwikiTestCase
+- PloneTestCase
+- ZopeTestCase
+- TestCase
+
+"""
+
+import sys, re, unittest
+
+import OFS, DateTime
+from Testing import ZopeTestCase
+from ZPublisher.HTTPRequest import HTTPRequest
+from ZPublisher.HTTPResponse import HTTPResponse
+
+from Products.ZWiki.ZWikiPage import ZWikiPage
+from Products import ZWiki
+
+
+def afterSetUp(self):
+    """
+    Do common setup for our ZopeTestCase-based unit tests.
+
+    This is a function so that it can be called by both our
+    ZopeTestCase and PloneTestCases's afterSetUp method.
+    XXX ?
+
+    WARNING: this sets self.page.request at the beginning of the test.
+    If you replace it with a new one, be sure to set page.request again
+    and not just past REQUEST as an argument to avoid confusing DTML.
+    XXX pardon ?
+    """
+    # grant all zwiki permissions by default
+    from Products.ZWiki import Permissions
+    #from Products.CMFCore import CMFCorePermissions
+    self.setPermissions([
+        Permissions.AddWiki,
+        Permissions.Add,
+        Permissions.Comment,
+        Permissions.Edit,
+        Permissions.ChangeType,
+        Permissions.Delete,
+        Permissions.Rate,
+        Permissions.Rename,
+        Permissions.Reparent,
+        Permissions.Upload,
+        Permissions.FTP,
+        #CMFCorePermissions.AddPortalContent,
+        ])
+    # set up a wiki in a subfolder, with one page of default type (RST)
+    self.folder.manage_addFolder('wiki',title='')
+    self.wiki = self.folder.wiki
+    self.wiki.manage_addProduct['ZWiki'].manage_addZWikiPage('TestPage')
+    self.p = self.page = self.wiki.TestPage
+    # our mock request seems a bit more useful than ZTC's
+    #self.request = self.app.REQUEST
+    self.request = self.page.REQUEST = MockRequest()
+    #self.request.cookies['zwiki_username'] = 'test'
+
+class ZwikiTestCase(ZopeTestCase.ZopeTestCase):
+    afterSetUp = afterSetUp
+
+    
+# mock objects
+
+class MockRequest(HTTPRequest):
+    """
+    a mock HTTPRequest object for use in testing.
+
+    like makerequest without the app dependency
+    """
+    def __init__(self,language=None):
+        resp = HTTPResponse(stdout=sys.stdout)
+        environ={}
+        environ['SERVER_NAME']='foo'
+        environ['SERVER_PORT']='80'
+        environ['REQUEST_METHOD'] = 'GET'
+        environ['SCRIPT_NAME']='/foo/test'
+        environ['SESSION']=None
+        self.SESSION={}
+        HTTPRequest.__init__(self,None,environ,resp)
+        if language: self.setLanguage(language)
+    def setLanguage(self,language):
+        self.environ['HTTP_ACCEPT_LANGUAGE']=language
+        
+class MockUser:
+    def __init__(self,username='testuser'):
+        self.username = username
+        class aclusers: pass
+        self.acl_users = aclusers()
+        self.acl_users._nobody = 'nobody'
+    def getUserName(self):
+        return self.username
+
+class MockZWikiPage(ZWikiPage):
+    """
+    A mock ZWikiPage object for use in testing.
+
+    Notes:
+    - use mockPage() to instantiate these with a real acquisition context
+    - some zopish things don't work and are too much work to mock
+    - much time wasted debugging obscure mockup-related problems
+    """
+    def __init__(self, source_string='', mapping=None, __name__='TestPage'):
+        apply(ZWikiPage.__init__,(self,source_string,mapping,__name__))
+        self.REQUEST = MockRequest()
+    def checkPermission(self, permission, object):
+        return 1
+    def cb_isMoveable(self):
+        return 1
+    ZopeTime = DateTime.DateTime
+
+def mockPage(source_string='', mapping=None, __name__='TestPage', folder=None):
+    """
+    Generate a mock zwiki page with a realistic acquisition context.
+    """
+    page = MockZWikiPage(source_string=source_string,
+                         mapping=mapping,
+                         __name__=__name__)
+    # situate the page in a folder, making it out of thin air if needed
+    if not folder:
+        folder = OFS.Folder.Folder()
+        folder.aq_base = folder.aq_inner = folder
+        folder.aq_parent = None
+    id = folder._setObject(page.getId(), page, set_owner=0)
+    # make sure self.REQUEST works in folder context also
+    folder.REQUEST = page.REQUEST
+    return folder[id]
+
+
+# if PTS is installed, disabled it to let tests run.. I18n_tests.py will
+# test it directly
+try:
+    from Products.PlacelessTranslationService.PlacelessTranslationService \
+         import PlacelessTranslationService
+    PlacelessTranslationService._getContext = \
+        lambda self,context: MockRequest()
+    PlacelessTranslationService.negotiate_language = \
+        lambda self,context,domain: 'en'
+    #from Products.ZWiki import I18n
+    #I18n._ = lambda s:str(s)
+except ImportError:
+    pass

Added: zope-zwiki/branches/upstream/current/tools/README
===================================================================
--- zope-zwiki/branches/upstream/current/tools/README	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/tools/README	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,4 @@
+Command-line utilities, to be used on the filesystem.
+
+zwikiimport.py - import a directory tree into a wiki
+zwikiexport.py - export a wiki to the filesystem (placeholder)

Added: zope-zwiki/branches/upstream/current/tools/zwikiexport.py
===================================================================
--- zope-zwiki/branches/upstream/current/tools/zwikiexport.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/tools/zwikiexport.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,221 @@
+""" 
+zwikiexport.py - export a set of zwiki pages as static files.
+
+(c) 2005 SKWM, GNU GPL.
+
+Usage:
+
+   cd directorytoreceivefiles
+   zopectl run .../ZWiki/tools/zwikiexport.py [opts] /path/to/wikipageorfolder
+
+Options:
+
+  -h, --help     show this help message and exit
+  -n, --dry-run  Don't actually import anything. May be inaccurate.
+  -v, --verbose  Be more verbose.
+
+Notes/stories:
+export a page
+export offspring
+export files & images
+export a whole wiki
+export to var directory
+and/or download as a tarball
+run from web or commandline or both ?
+page type is reflected in file suffix
+allow exporting only newer objects
+allow round trip with zwikiimport
+"""
+
+# placeholder.. in progress
+
+import os, re
+from optparse import OptionParser
+from zExceptions import *
+from OFS.content_types import guess_content_type
+
+try: from transaction import get as get_transaction
+except ImportError: pass
+
+
+options = args = None
+
+def parseArgs():
+    """Parse command-line options."""
+    global options, args
+    parser = OptionParser()
+    parser.add_option('-n', '--dry-run', action='store_true',dest='dryrun',
+                      help="Don't actually import anything (may be inaccurate)")
+    parser.add_option('-v', '--verbose', action='store_true',
+                      help="Be more verbose")
+    parser.add_option('--debug', action='store_true',
+                      help="Print additional debug information")
+    #parser.add_option('--ignore', action='store_true',
+    #                  help="When objects already exist, ignore and continue")
+    parser.add_option('--replace', action='store_true',
+                      help="When objects already exist, replace them")
+    parser.add_option('--delete', action='store_true',
+                      help="Delete existing objects instead of importing")
+    #parser.add_option('-u','--user',
+    #                  help="user:password for authentication")
+    options,args = parser.parse_args()
+    # to facilitate calling authentication-requiring API methods,
+    # set up a dummy request with the provided credentials
+    #if options.user:
+    #    user, password = options.user.split(':')
+    #    options.request = makerequest(app,user,password)
+    #else:
+    #    options.request = None
+    # XXX doesn't work yet
+    options.request = None
+
+def dlog(msg='', newline=True):
+    """Print some text and/or a newline if debug option is true."""
+    if options.debug:
+        if newline:
+            print '* %s' % msg
+        else:
+            print '* %s' % msg,
+
+def vlog(msg='', newline=True):
+    """Print some text and/or a newline if verbose option is true."""
+    if options.verbose: 
+        if newline:
+            print '%s' % msg
+        else:
+            print '%s' % msg,
+            
+#def doPage(parent,name,text,type):
+    """Create, modify or delete the specified wiki page under the parent page.
+
+    Prints a status message and returns a boolean for success/failure.
+    """
+    dlog('doFile(%s,...,%s)' % (name,type))
+    if options.dryrun:
+        vlog(': dry run')
+        return True
+    existing = parent.pageWithName(name)
+    #if existing and options.ignore:
+    #    vlog(': ignored')
+    #    return True
+    if existing and options.delete:
+        existing.delete(REQUEST=options.request)
+        get_transaction().commit()
+        vlog(': deleted')
+        return True
+    elif existing and options.replace:
+        text = fixLinksIn(text)
+        existing.edit(name, text, type, REQUEST=options.request)
+        get_transaction().commit()
+        vlog(': replaced')
+        return True
+    else:
+        try:
+            text = fixLinksIn(text)
+            parent.create(name, text, type, REQUEST=options.request)
+            get_transaction().commit()
+            vlog(': created')
+            return True
+        except BadRequest, e:
+            vlog(': failed\n*** (%s)' % e)
+            return False
+
+#def doFile(context,filename,data):
+    """Create, modify or delete the specified file or image.
+
+    An Image is created if the file suffix indicates it.
+    Prints a status message and returns a boolean for success/failure.
+    """
+    dlog('doFile(%s,...)' % (filename))
+    if options.dryrun:
+        vlog(': dry run')
+        return True
+    folder = context.folder()
+    existing = getattr(folder,filename,None)
+    #if existing and options.ignore:
+    #    vlog(': ignored')
+    #    return True
+    if existing and options.delete:
+        folder._delObject(filename)
+        get_transaction().commit()
+        vlog(': deleted')
+        return True
+    elif existing and options.replace:
+        folder._getOb(filename).manage_upload(data)
+        get_transaction().commit()
+        vlog(': replaced')
+        return True
+    else:
+        try:
+            if guess_content_type(filename)[0][0:5] == 'image':
+                folder._setObject(filename, OFS.Image.Image(filename,filename,''))
+            else:
+                folder._setObject(filename, OFS.Image.File(filename,filename,''))
+            folder._getOb(filename).manage_upload(data)
+            get_transaction().commit()
+            vlog(': created')
+            return True
+        except BadRequest, e:
+            vlog(': failed\n*** (%s)' % e)
+            return False
+
+def exportObj(path,dir):
+    """Export a zope folder/wikipage/file/image as one or more files."""
+    dlog('exportFile(%s,%s)' % (path,dir))
+    vlog(path,newline=False)
+    obj = objectFromPath(path)
+    if obj.meta_type == 'ZWiki Page':
+        # create(/replace/delete) a file representing this page
+        filename = os.path.basename(path)
+        pagename,ext = os.path.splitext(os.path.basename(filepath))
+        if re.match('(?i).htm',ext):
+            text = bodyFromHtml(open(filepath).read())
+            if text != None:
+                vlog(filepath,newline=False)
+                doPage(context,pagename, text, 'html')
+        else:
+            vlog(filepath,newline=False)
+            doFile(context, filename, open(filepath).read())
+#    else:
+#        # create(/replace/delete) a page representing this directory/node
+#        # (unless it's the very first directory).
+#        # if the directory contains a page with the same name or
+#        # index.htm, we will use that for content.
+#        vlog(filepath,newline=False)
+#        dirpagename = pageNameFromPath(filepath)
+#        if dirpagename == '' or doPage(context, dirpagename, '', 'html'):
+#            dirpage = context.pageWithName(dirpagename) or context
+#            dirpagetext = ''
+#            for f in os.listdir(filepath):
+#                pagename,ext = os.path.splitext(os.path.basename(f))
+#                if (re.match('(?i).htm',ext) and
+#                    pagename == dirpagename or
+#                    re.match(r'(?i)index$',pagename)):
+#                    dirpagetext = open(os.path.join(filepath,f)).read()
+#                else:
+#                    importFile(dirpage,os.path.join(filepath,f))
+#            if dirpagetext:
+#                dirpagetext = fixLinksIn(dirpagetext)
+#                context.pageWithName(dirpagename).edit(text=dirpagetext)
+
+def pageNameFromPath(path):
+    """Derive a suitable wiki page name from a filesystem path."""
+    return os.path.splitext(os.path.basename(path))[0]
+
+def objectFromPath(path):
+    """Get the object indicated by a ZODB path, or None if not found."""
+    return app.restrictedTraverse(path, None)
+
+def main():
+    """Main procedure."""
+    parseArgs()
+    exportObj(args[0], '.')
+
+if __name__ == "__main__":
+    main()
+
+#def _test():
+#    import doctest, zwikiimport
+#    return doctest.testmod(zwikiimport)
+#if __name__ == "__main__":
+#    _test()

Added: zope-zwiki/branches/upstream/current/tools/zwikiimport.py
===================================================================
--- zope-zwiki/branches/upstream/current/tools/zwikiimport.py	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/tools/zwikiimport.py	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,285 @@
+""" 
+zwikiimport.py - import files/directories into a zwiki.
+
+(c) 2004-2005 SKWM, GNU GPL.
+
+Usage:
+
+   cd directorycontainingfiles
+   zopectl run .../ZWiki/tools/zwikiimport.py [opts] /path/to/wikipageorfolder
+
+Options:
+
+  -h, --help     show this help message and exit
+  -n, --dry-run  Don't actually import anything. May be inaccurate.
+  -v, --verbose  Be more verbose.
+  --debug        Print additional debug information.
+  --replace      When objects already exist, replace them.
+  --delete       Delete existing objects instead of importing.
+
+Notes/stories/todos:
+-zope root folder or root page is specified as an argument
+-we walk the current directory
+-each text file becomes a wiki page by the same name
+-a subdirectory becomes a page. the contents are imported and parented under it
+-a file named after its directory or index.html? is merged with the directory page
+-images become images, files become files
+-relative links and image paths are adjusted
+-allow ignoring/replacing/deleting old pages (as long wiki is anon-writable)
+todo:
+suffixes influence the page type: .html, .stx, .rst, .txt etc.
+an id collision creates a page with modified name
+a front page may be selected from the imported pages
+text patterns may be removed from the pages
+file(s) may be specified on the command line
+use cmf or plone image/files when appropriate
+images and files have safe ids assigned if needed
+use visitor pattern
+smarter dry run
+get around anon-writable requirement of zwiki web api
+apply html tidy automatically ?
+
+"""
+
+import os, re
+from optparse import OptionParser
+from zExceptions import *
+import OFS.Image
+from OFS.content_types import guess_content_type
+
+try: from transaction import get as get_transaction
+except ImportError: pass
+
+from os import environ
+from sys import stdin, stdout
+from ZPublisher.HTTPRequest import HTTPRequest
+from ZPublisher.HTTPResponse import HTTPResponse
+from ZPublisher.BaseRequest import RequestContainer
+
+options = args = None
+
+def parseArgs():
+    """Parse command-line options."""
+    global options, args
+    parser = OptionParser()
+    parser.add_option('-n', '--dry-run', action='store_true',dest='dryrun',
+                      help="Don't actually import anything (may be inaccurate)")
+    parser.add_option('-v', '--verbose', action='store_true',
+                      help="Be more verbose")
+    parser.add_option('--debug', action='store_true',
+                      help="Print additional debug information")
+    #parser.add_option('--ignore', action='store_true',
+    #                  help="When objects already exist, ignore and continue")
+    parser.add_option('--replace', action='store_true',
+                      help="When objects already exist, replace them")
+    parser.add_option('--delete', action='store_true',
+                      help="Delete existing objects instead of importing")
+    #parser.add_option('-u','--user',
+    #                  help="user:password for authentication")
+    options,args = parser.parse_args()
+    # to facilitate calling authentication-requiring API methods,
+    # set up a dummy request with the provided credentials
+    #if options.user:
+    #    user, password = options.user.split(':')
+    #    options.request = makerequest(app,user,password)
+    #else:
+    #    options.request = None
+    # XXX doesn't work yet
+    options.request = None
+
+# XXX doesn't work yet
+def makerequest(app,user,password):
+    """Like Testing.makerequest but add authentication info."""
+    resp = HTTPResponse(stdout=stdout)
+    environ['SERVER_NAME']='foo'
+    environ['SERVER_PORT']='80'
+    environ['REQUEST_METHOD'] = 'GET'
+    environ['AUTHENTICATED_USER'] = user
+    environ['__ac_name'] = user
+    environ['__ac_password'] = password
+    req = HTTPRequest(stdin, environ, resp)
+    return app.__of__(RequestContainer(REQUEST = req))
+
+def dlog(msg='', newline=True):
+    """Print some text and/or a newline if debug option is true."""
+    if options.debug:
+        if newline:
+            print '* %s' % msg
+        else:
+            print '* %s' % msg,
+
+def vlog(msg='', newline=True):
+    """Print some text and/or a newline if verbose option is true."""
+    if options.verbose: 
+        if newline:
+            print '%s' % msg
+        else:
+            print '%s' % msg,
+            
+def bodyFromHtml(t):
+    """Return contents of html body tag in t, or None."""
+    m = re.search(r'(?is)<body[^>]*>(.*)</body>',t)
+    if m: return m.group(1)
+    else: return None
+
+def fixLinksIn(t):
+    """Fix up relative hyperlinks and image paths for the wiki.
+
+    NB doesn't work after html tidy."""
+    # strip path components from relative links
+    t = re.sub(r'(?i)( (href|src)=")(?!http:)([^"/]+/)+?(?P<last>[^"/]+)"',
+               r'\1\g<last>"',
+               t)
+    # strip .htm suffix
+    t = re.sub(r'(?i)( (href|src)=")(?!http:)(?P<name>[^"]+).html?"',
+               r'\1\g<name>"',
+               t)
+    # fuzzy urls should take care of whitespace/quoting/capitalization diffs
+    return t
+
+def doPage(parent,name,text,type):
+    """Create, modify or delete the specified wiki page under the parent page.
+
+    Prints a status message and returns a boolean for success/failure.
+    """
+    dlog('doFile(%s,...,%s)' % (name,type))
+    if options.dryrun:
+        vlog(': dry run')
+        return True
+    existing = parent.pageWithName(name)
+    #if existing and options.ignore:
+    #    vlog(': ignored')
+    #    return True
+    if existing and options.delete:
+        existing.delete(REQUEST=options.request)
+        get_transaction().commit()
+        vlog(': deleted')
+        return True
+    elif existing and options.replace:
+        text = fixLinksIn(text)
+        existing.edit(name, text, type, REQUEST=options.request)
+        get_transaction().commit()
+        vlog(': replaced')
+        return True
+    else:
+        try:
+            text = fixLinksIn(text)
+            parent.create(name, text, type, REQUEST=options.request)
+            get_transaction().commit()
+            vlog(': created')
+            return True
+        except BadRequest, e:
+            vlog(': failed\n*** (%s)' % e)
+            return False
+
+def doFile(context,filename,data):
+    """Create, modify or delete the specified file or image.
+
+    An Image is created if the file suffix indicates it.
+    Prints a status message and returns a boolean for success/failure.
+    """
+    dlog('doFile(%s,...)' % (filename))
+    if options.dryrun:
+        vlog(': dry run')
+        return True
+    folder = context.folder()
+    existing = getattr(folder,filename,None)
+    #if existing and options.ignore:
+    #    vlog(': ignored')
+    #    return True
+    if existing and options.delete:
+        folder._delObject(filename)
+        get_transaction().commit()
+        vlog(': deleted')
+        return True
+    elif existing and options.replace:
+        folder._getOb(filename).manage_upload(data)
+        get_transaction().commit()
+        vlog(': replaced')
+        return True
+    else:
+        try:
+            if guess_content_type(filename)[0][0:5] == 'image':
+                folder._setObject(filename, OFS.Image.Image(filename,filename,''))
+            else:
+                folder._setObject(filename, OFS.Image.File(filename,filename,''))
+            folder._getOb(filename).manage_upload(data)
+            get_transaction().commit()
+            vlog(': created')
+            return True
+        except BadRequest, e:
+            vlog(': failed\n*** (%s)' % e)
+            return False
+
+def importFile(context,filepath):
+    """Import a file or directory tree as wiki page/file/image objects."""
+    dlog('importFile(%s,%s)' % (`context`,filepath))
+    vlog(filepath,newline=False)
+    if os.path.isfile(filepath):
+        # create(/replace/delete) a wiki page based on file name & content
+        filename = os.path.basename(filepath)
+        pagename,ext = os.path.splitext(os.path.basename(filepath))
+        if re.match('(?i).htm',ext):
+            text = bodyFromHtml(open(filepath).read())
+            if text != None:
+                vlog(filepath,newline=False)
+                doPage(context,pagename, text, 'html')
+        else:
+            vlog(filepath,newline=False)
+            doFile(context, filename, open(filepath).read())
+    else:
+        # create(/replace/delete) a page representing this directory/node
+        # (unless it's the very first directory).
+        # if the directory contains a page with the same name or
+        # index.htm, we will use that for content.
+        vlog(filepath,newline=False)
+        dirpagename = pageNameFromPath(filepath)
+        if dirpagename == '' or doPage(context, dirpagename, '', 'html'):
+            dirpage = context.pageWithName(dirpagename) or context
+            dirpagetext = ''
+            for f in os.listdir(filepath):
+                pagename,ext = os.path.splitext(os.path.basename(f))
+                if (re.match('(?i).htm',ext) and
+                    pagename == dirpagename or
+                    re.match(r'(?i)index$',pagename)):
+                    dirpagetext = open(os.path.join(filepath,f)).read()
+                else:
+                    importFile(dirpage,os.path.join(filepath,f))
+            if dirpagetext:
+                dirpagetext = fixLinksIn(dirpagetext)
+                context.pageWithName(dirpagename).edit(text=dirpagetext)
+
+def pageNameFromPath(path):
+    """Derive a suitable wiki page name from a filesystem path."""
+    return os.path.splitext(os.path.basename(path))[0]
+
+def pageFromPath(path):
+    """Get the wiki page object indicated by a ZODB path.
+
+    If it's a folder, return the first page. Otherwise None."""
+    obj = app.restrictedTraverse(path, None)
+    if not obj:
+        return None
+    if 'Folder' in obj.meta_type:
+        pages = obj.objectValues(spec='ZWiki Page')
+        if pages:
+            obj = pages[0]
+    if obj.meta_type == 'ZWiki Page':
+        return obj
+    else:
+        return None
+
+def main():
+    """Main procedure."""
+    parseArgs()
+    importFile(pageFromPath(args[0]), '.')
+    get_transaction().commit()
+
+if __name__ == "__main__":
+    main()
+
+#def _test():
+#    import doctest, zwikiimport
+#    return doctest.testmod(zwikiimport)
+#if __name__ == "__main__":
+#    _test()

Added: zope-zwiki/branches/upstream/current/version.txt
===================================================================
--- zope-zwiki/branches/upstream/current/version.txt	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/version.txt	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1 @@
+ZWiki-0-58-0

Added: zope-zwiki/branches/upstream/current/wikis/basic/FrontPage.stx
===================================================================
--- zope-zwiki/branches/upstream/current/wikis/basic/FrontPage.stx	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/wikis/basic/FrontPage.stx	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,43 @@
+**Welcome!** 
+
+This is the front page of ZWiki's "basic" wiki template, a small set of
+starter pages for your wiki.  "Edit":FrontPage/editform this page and
+replace it with something appropriate. Consider linking your site at
+ZWiki:ZwikiSites.
+
+You'll find additional Zwiki documentation and help at http://zwiki.org .
+Don't forget to check the release notes and known issues.
+
+Other things you may want to configure:
+
+- **Permissions** <br />
+You normally configure permissions in the wiki folder's Security tab in
+the ZMI. ZWiki:FAQs has a list.
+
+- **Mail out (subscription)** <br /> 
+To mail out comments, use the ZMI to add a 'mail_replyto' string property
+on the folder with a valid email address. Also add a !MailHost object if
+you don't already have one.  Reload this page and the subscribe link
+should appear.
+
+- **Mail in** <br />
+So that users will be able to reply to comments by mail - 
+see ZWiki:WikiMail.
+
+- **External (client-side) editing** <br /> 
+
+Install ZWiki:ExternalEditor on server and client as described on that
+page. EE's pencil icon should appear and clicking it should open pages for
+editing in your preferred editor.
+
+- **A bug tracker** <br />
+A simple issue tracker integrated with the wiki.  See
+ZWiki:HowToInstallAZwikiTracker
+
+- **DTML** <br /> 
+If you want to enable live DTML code in pages, add a true allow_dtml
+boolean property on the folder. This makes your server much more
+vulnerable to abuse, you should be aware of the ZWiki:ZwikiSecurity
+implications.
+
+Enjoy your wiki!

Added: zope-zwiki/branches/upstream/current/wikis/basic/WikiWikiWeb.stx
===================================================================
--- zope-zwiki/branches/upstream/current/wikis/basic/WikiWikiWeb.stx	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/wikis/basic/WikiWikiWeb.stx	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,7 @@
+Ward Cunningham's WikiWikiWeb is the original and still one of the largest
+and most active wikis. It contains a wealth of information about wiki and
+many other things.
+
+WikiWikiWeb:FrontPage
+
+RemoteWikiURL: http://c2.com/cgi/wiki? 

Added: zope-zwiki/branches/upstream/current/wikis/basic/ZWiki.stx
===================================================================
--- zope-zwiki/branches/upstream/current/wikis/basic/ZWiki.stx	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/wikis/basic/ZWiki.stx	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,10 @@
+Zwiki is the software which drives this wiki site.  
+It has been developed by "Joyful Systems":http://joyful.com and
+"contributors":http://zwiki.org/ZwikiContributors around the world, 
+and is available under the GNU GPL. 
+For more information, see http://zwiki.org .
+
+Zwiki is inspired by the original WikiWikiWeb and powered by the
+"Zope":http://zope.org web application server. 
+
+RemoteWikiURL: http://zwiki.org/

Added: zope-zwiki/branches/upstream/current/wikis/basic/index_html.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/wikis/basic/index_html.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/wikis/basic/index_html.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1 @@
+<dtml-call "RESPONSE.redirect(_['URL1'] + '/FrontPage')">
\ No newline at end of file

Added: zope-zwiki/branches/upstream/current/wikis/basic/standard_error_message.dtml
===================================================================
--- zope-zwiki/branches/upstream/current/wikis/basic/standard_error_message.dtml	2007-02-09 12:41:12 UTC (rev 609)
+++ zope-zwiki/branches/upstream/current/wikis/basic/standard_error_message.dtml	2007-02-09 12:59:48 UTC (rev 610)
@@ -0,0 +1,53 @@
+<dtml-if "error_type=='NotFound'">
+<dtml-comment>
+A custom error handler for 404 NotFound errors (only). Redirects to a
+similarly-named existing page if possible, otherwise offers create/search
+buttons.  
+
+Assumes at least one zwiki page exists. It doesn't matter which one we
+work from, except created pages will go under it. picks SandBox if
+available, to reduce mail noise from test pages.
+</dtml-comment>
+<dtml-let 
+ here="objectValues(spec='ZWiki Page')[0]"
+ here="here.defaultPage()
+       #here.pageWithName('SandBox') or here.defaultPage()
+       #created pages will go under this working page
+       #if you want less mail from pages created this way, pick SandBox"
+ path="URL[_.len(SERVER_URL):]"
+ searchexpr="_.string.split(path,'/')[-1]"
+ targetpage="here.pageWithFuzzyName(searchexpr,url_quoted=1,
+                                    allow_partial=1,ignore_case=1) or
+             here.pageWithId(searchexpr,ignore_case=1)"
+ targeturl="(targetpage and targetpage.pageUrl()) or None"
+ >
+<dtml-if targeturl>
+  <dtml-call "RESPONSE.redirect(targeturl,lock=1)">
+
+<dtml-else>
+<html>
+  <head><meta name="robots" content="noindex,nofollow"></head>
+  <body>
+    <p>
+      I could not find any likely page matching "<b><dtml-var
+      "here.urlunquote(searchexpr)" html_quote></b>"
+    </p>
+    <p>
+      Click here to 
+      <form action="<dtml-var "here.pageUrl()">/createform"
+            method="GET" enctype="multipart/form-data">
+        <input type="hidden" name="page" value="&dtml-searchexpr;">
+        <input type="submit" value="create this page">
+      </form>
+      <form action="<dtml-var "here.searchUrl()">
+            method="GET" enctype="multipart/form-data">
+        <input type="hidden" name="expr" value="&dtml-searchexpr;">
+        <input type="submit" value="search for it">
+      </form>
+      or visit the <a href="&dtml-URL1;">front page</a>.
+    </p>
+  </body>
+</html>
+</dtml-if>
+</dtml-let>
+</dtml-if>




More information about the pkg-zope-commits mailing list