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)""></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'<disabled \1>',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 " "
+
+ # 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: %s <span class="accesskey">p</span>revious: %s' \
+ % (next,prev) # Info style!
+ t += ' <span class="accesskey">u</span>p: %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: %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="margin: 0;">">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(),
+ ' ') # 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 →
+# 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 {
+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=(
+ (('&'), '&'),
+ (('<'), '<' ),
+ (('>'), '>' ),
+ (('<'), '\213' ),
+ (('>'), '\233' ),
+ (('"'), '"'))): #"
+ 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<<span class="hit">br</span>>\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<<span class="hit" style="background-color:yellow;font-weight:bold;">br</span> /')
+ self.assertEquals(self.page.excerptAt('<br />',size=4,highlight=0),
+ '<br />')
+ self.assertEquals(self.page.excerptAt('nomatch'), 'This is a test of the<br />\n excerptAt method,')
+ self.assertEquals(self.page.excerptAt(''), 'This is a test of the<br />\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 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 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 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 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 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 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 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 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 by"
+msgstr "Editada 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 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 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 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 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 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 by"
+msgstr "Ãdité 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 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 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 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 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 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\" 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 by"
+msgstr "Modificata 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 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 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 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 by"
+msgstr "Gewijzigd 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 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 by"
+msgstr "Edytowana przez "
+
+#: 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 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 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 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 "« previous edit"
+#~ msgstr "<< edição anterior"
+
+#, fuzzy
+#~ msgid "next edit »"
+#~ 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 by"
+msgstr "Editado 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 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 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 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 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 "ÐÑмеÑеннÑе ÑÑÑаниÑÑ (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 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 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 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 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 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 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 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 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 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 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 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 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 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>@<span class="nospam2">'
+ + m.groups()[1][0:-1] + '&#' + str(ord(m.groups()[1][-1]))
+ + ';.' + 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&rename=%s%s' % (
+ wikiutil.quoteWikinameURL(pagename),
+ urllib.quote_plus(fname.encode(config.charset)),
+ drawing and ('&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&rename=%s&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 {'&': '&',
+ # '<': '<',
+ # '>': '>'}[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 = ' '
+
+ 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 '"'
+ @rtype: string
+ @return: escaped version of string
+ """
+ if not isinstance(s, (str, unicode)):
+ s = str(s)
+
+ # Must first replace &
+ s = s.replace("&", "&")
+
+ # Then other...
+ s = s.replace("<", "<")
+ s = s.replace(">", ">")
+ if quote:
+ s = s.replace('"', """)
+ 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><dtml-var "1+1">\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'(<|<)!--NOSTX--(>|>)', 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 $
+* 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('$', newcode, 2)
+ # prevent stx from mangling asterisks
+ #newcode = re.compile('\*', re.MULTILINE).sub('*', 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('\', 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"> </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
+ *...* ,
+ **...** ,
+ _..._ or
+ '...' 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 $, 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="<< previous edit" i18n:attributes="value" accesskey="p" />
+<input tal:condition="python:not (revA < 19)" disabled="1" type="submit" name="prevDiff:method"
+ value="<< previous edit" i18n:attributes="value" accesskey="p" />
+<input tal:condition="python:revA > 1" type="submit" name="nextDiff:method"
+ value="next edit >>" i18n:attributes="value" accesskey="n" />
+<input tal:condition="python:not(revA > 1)" disabled="1" type="submit" name="nextDiff:method"
+ value="next edit >>" 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>
+
+ </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:'<<'+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()+'>>'">
+ >>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">
+
+ </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 $
+* 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: { '&':'&',
+ '<':'<',
+ '>':'>',
+ '$':'$',
+ '*':'*',
+ '#':'#',
+ '\\':'\',
+ '[':'![',
+ '\'':''',
+ '_':'_'
+ }[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('$', newcode, 2)
+ # prevent stx from mangling asterisks
+ #newcode = re.compile('\*', re.MULTILINE).sub('*', 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('\', 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"> </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: { '&':'&',
+ '<':'<',
+ '>':'>',
+ '$':'$',
+ '*':'*',
+ '#':'#',
+ '\\':'\',
+ '[':'![',
+ '\'':''',
+ '"':'"',
+ '_':'_'
+ }[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: { '&':'&',
+ '<':'<',
+ '>':'>',
+ '$':'$',
+ '*':'*',
+ '\\':'\',
+ '_':'_' }[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
+ *...* ,
+ **...** ,
+ _..._ or
+ '...' 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 $, 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"> </td>
+<dtml-in issue_severities prefix=sev>
+<td align="right"><dtml-var sev_item></td>
+</dtml-in>
+<td align="right"> 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 ' '"
+></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"> </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">
+
+</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> </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> </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; <dtml-var "_.len(open)">
+ </a>
+ <dtml-var "bold and '</b>' or ''">
+ </td>
+ </tr>
+ </dtml-let>
+ <dtml-else>
+ <tr>
+ <td> </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> </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> </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>
+ <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>
+ <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>
+
+ </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">
+<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&</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%%"> </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 """
+
+ """
+
+ 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
+ *...* ,
+ **...** ,
+ _..._ or
+ '...' 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 by</dtml-translate> </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>
+
+ <dtml-unless summaries>
+ <dtml-if last_log>
+ <br/> <b><em><dtml-var last_log></em></b><br/>
+ <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>
+
+ </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/> <b><em><dtml-var last_log></em></b>
+ </dtml-if>
+ <br/><br/>
+ </td>
+ <td> </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>
+
+ </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 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"> </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%">
+
+ </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">
+
+ </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=" << "
+ type="submit" i18n:attributes="value" accesskey="p" />
+ <input tal:condition="not:python:revA < numrevs"
+ disabled="1"
+ value=" << "
+ 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=" >> "
+ type="submit" i18n:attributes="value" accesskey="n" />
+ <input tal:condition="not:python:revA > 1"
+ disabled="1"
+ value=" >> "
+ 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> <input
+ type="submit" name="editform:method"
+ value="Preview" title="preview this edit"
+ tabindex="" accesskey="p"
+ i18n:attributes="title;value"
+ /> <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:'<<'+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()+'>>'">
+ >>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>
+
+ </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">
+ <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">
+ <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>
+
+ </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