;ò )äHEc@s¼dZdklZdkZdkZdkZdklZlZlZl Z l Z l Z l Z dk lZlZdkTdklZdklZdkZdklZlZd klZd klZd klZyd klZWn e j od k!lZnXd k"l#Z#dk$l%Z%dk&Z'dk(l)Z)dk*l+Z+l,Z,l-Z-dk.Z.dk/l0Z0l1Z1l2Z2dk3l4Z4l5Z5l6Z6dk7l8Z8dfd„ƒYZ9ee9ƒdS(s Editing methods. (s nested_scopesN(ssplitsjoinsfindslowersrfindsatoisstrip(squotesunquote(s*(sMessage(sdeepcopy(sgetSecurityManagersClassSecurityInfo(s rfc1123_date(sDateTime(sInitializeClass(sguess_content_type(s DTMLDocument(sBadRequestException(s PAGETYPES(sDISABLE_JAVASCRIPTsLARGE_FILE_SIZEsLEAVE_PLACEHOLDER(sjavascriptexprshtmlheaderexprshtmlfooterexpr(sget_transactionsBLATHERsparseHeadersBody(s_sPageEditingSupportc Bs…tZeƒZeidƒd„Zeieidƒe de de dde e e d„ Z ei dƒd„Z eiei d ƒddde e e de e e d „ Zeiei d ƒdd e dd „Zei dƒe e e de e dddede d„ Ze d„Ze dd„Zd„Ze ddd„Ze dd„Ze dd„Zeieidƒe de d„Zd„Ze d„Zeieidƒedde d„Zd„Zd„Ze d„Z e d„Z!dd „Z"de d!„Z#d"„Z$e d#„Z%e&i'Z(eiei)d$ƒd%„Z'eiei)d&ƒe e d'„Z*de d(„Z+d)„Z,d*„Z-e d+„Z.d,„Z/e d-„Z0eiei)d.ƒd/„Z1eiei)d0ƒd1„Z2eiei3d2ƒd3„Z4eiei5d4ƒd5„Z6eiei5d6ƒe d7„Z7d8„Z8d9„Z9eieid:ƒd;„Z:eieid<ƒd=„Z;RS(>NsViewcCstƒi||ƒSdS(N(sgetSecurityManagerscheckPermissions permissionsobject(sselfs permissionsobject((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pyscheckPermission%sscreatesic  Csª|i|ƒ o-|o|ii|iƒdƒntSnt|p| ƒ} |i | ƒ} |i d| ƒ}| |_|iƒi| |ƒ} t|iƒ| ƒ}|i|ƒ|i|ƒ|i|ƒ|i|ƒ|i|ƒ|tjo|iƒg|_n ||_|iƒi|iƒ|iƒ|i|p |i!ƒƒ|i"||ƒ|i#|ƒ|i$| |ƒ|i&ƒo|i'|ƒn|o||iƒjo:t(ƒi)dƒt(ƒi*ƒ|i+|dd||ƒn |i,ƒ|o>|i.|i/ƒd|ddd |d |i0|i1ƒƒƒn|o_yE|i2d tƒp|d d t3|i ƒƒ}|ii|ƒWq¢t5j oq¢Xn| SdS(sš 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 s/denieds__name__srename during creationiisREQUESTs subjectSuffixsssubjects message_ids redirectURLsURL2s/N(6sselfscheckSufficientIdsREQUESTsRESPONSEsredirectspageUrlsNonesunquotespagespagenamesnamescanonicalIdFromsids __class__spstitlesfolders _setObjectsnewidsgetattrs checkForSpamstexts setCreators setLastEditors setLastLogslogs _setOwnershipsparentsspageNames wikiOutlinesadds setPageTypestypesdefaultPageTypessetTextshandleFileUploadshandleSubtopicsPropertys subtopicssautoSubscriptionEnabledssubscribeThisUsersget_transactionsnotescommits handleRenames index_objectssendmailssendMailToSubscriberssreadsmessageIdFromTimes creationTimesgetsquotesusKeyError(sselfspagestextstypestitlesREQUESTslogssendmailsparentss subtopicsspagenamesidsnewidsnamespsu((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pyscreate)sX            1 s isDavLockedcCst|dƒo |iƒSdS(Ns wl_isLocked(shasattrsselfs wl_isLocked(sself((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pys isDavLocked‡sscommentc  Csú|i|ƒ o|itdƒƒSn|iƒo|iƒSn|iƒ} | o0|i |ƒ}t i d|ƒo d}q‡n|i |ƒ}|i |ƒ}|ot|ƒ} n|iƒ} | iƒ}| o|i| ƒ}ntƒ} || d<|| d<|| d<|| d<| o| | däsN( sselfsensureRecycleBinsfoldersfsmanage_cutObjectssgetIdscbs __class__smanage_afterAddssaves recycle_binsmanage_pasteObjects(sselfsREQUESTscbssavesf((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pysrecycleÙs   srenamec Csv|iƒ|iƒf\} } tidd|ƒ}||i|ƒf\}}| p|| jo || jodSnt d| | ||fƒ|i o|iƒ|_ n|| jo/|i |ƒ|o|i| ||ƒqìnt|iƒiƒƒ} t|iƒiƒƒ}|| jo<|i|ƒ|o | | jo|i| ||ƒqen||_ |iƒ|iƒi| ƒ|iƒi|ƒ|iƒi| |ƒ|| jo|o>y$|i| tdƒ|ddƒWqtj oqXn|o || jo-|i!d| |fd |d dd d ƒnt d ƒ|o|i"i#|i$ƒƒndS(sð 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 s[\r\n]sNsrenaming %s (%s) to %s (%s)...sJThis page was renamed to %s. You can delete this one if no longer needed. ssendmailis%This page was renamed from %s to %s. sREQUESTs subjectSuffixssubjects (renamed)srename complete(%sselfspageNamesgetIdsoldnamesoldidsressubspagenamescanonicalIdFromsnewnamesnewidsBLATHERstitlesmoveMyChildrenTosupdatebacklinkssreplaceLinksThroughoutWikisREQUESTsdeepcopys wikiOutlines parentmapssavedparentmapschildmaps savedchildmapschangeIdPreservingCreators index_objects setParentmaps setChildmapsreplacesleaveplaceholderscreates_sBadRequestExceptionssendmailssendMailToEditSubscriberssRESPONSEsredirectspageUrl( sselfspagenamesleaveplaceholdersupdatebacklinksssendmailsREQUESTsnewnames savedchildmapsnewidsoldnamessavedparentmapsoldid((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pysrenameésN"           cCsb|i|i|if\}}}|iƒi|iƒ|ƒ|||f\|_|_|_dS(N(sselfs creation_timescreators creator_ipsfoldersmanage_renameObjectsgetIdsnewid(sselfsnewids creation_times creator_ipscreator((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pyschangeIdPreservingCreatorFs!cCs~|iƒ}|ogtd|iƒƒxQ|D]E}t|iƒ|ƒ}|i |i ƒƒ|i |ƒ|i ƒq-WndS(Nsreparenting children of(sselfschildrenIdsAsListschildrensBLATHERsgetIdsidsgetattrsfolderschilds removeParentspageNames addParents newparents index_object(sselfs newparentsidschildschildren((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pysmoveMyChildrenToMs  cCsptd||fƒxU|i|ƒD]D}y|iƒi|||ƒWq$td||i fƒq$Xq$WdS(Nsreplacing all %s links with %ss,replaceLinks failed to update %s links in %s( sBLATHERsoldlinksnewlinksselfs backlinksForsps getObjects replaceLinkssREQUESTsid(sselfsoldlinksnewlinksREQUESTsp((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pysreplaceLinksThroughoutWiki^s cCs|i|ƒod|}n#dti|ƒ|i|ƒf}|i|ƒo|pd|}|i dti |||i ƒƒd|ƒdS(Ns\b%s\bs(\[%s\]|\b%s\b)s[%s]stextsREQUEST( sselfs isWikiNamesoldlinksoldpatsresescapescanonicalIdFromsnewlinksnewpatseditssubsreadsREQUEST(sselfsoldlinksnewlinksREQUESTsnewpatsoldpat((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pys replaceLinksts "!!cCs=|o-t|dƒot|idƒo |iiot|dƒo |i}n |iƒ}|it i |ƒ odt dƒ‚n|it i |ƒp|it i |ƒ odt dƒ‚n|i|id|iddƒd |ƒ\}}}|o1|i||||ƒ|i|ƒ|iƒq9ndS( Nsfilesfilenamesuploadss Unauthorizeds,You are not authorized to upload files here.s8You are not authorized to add a link on this ZWiki Page.stitlessREQUEST(sREQUESTshasattrsfilesfilenamesselfsuploadss uploaddirsfolderscheckPermissions PermissionssUploads_sEditsComments_createFileOrImagesgetsfile_ids content_typessizes _addFileLinks setLastLogslogs index_object(sselfsREQUESTslogs uploaddirsfile_ids content_typessize((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pyshandleFileUploads 7  -  cCs¾d„}t|ƒ}tiid||ƒ\}}| otttfSn|i ƒ}||dƒo |i i o |i }n|||ƒo||i ddfj oÛt|iƒddd!djo]|iƒo(|i|tii||dƒƒ}q„|i|tii||dƒƒ}qˆ|iƒo(|i|tii||dƒƒ}qˆ|i|tii||dƒƒ}n|i|ƒ}|i|ƒ||i|iƒfSd S( s· 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). cCst|i|ƒS(N(shasattrsfoldersaq_basesid(sfoldersid((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pys¸sssuploadssFilesImageiisimageN(s folderHassstrstitlesOFSsImagescookIdsfilesidsNonesselfsfoldersuploadssisPrincipiaFolderishs meta_typesguess_content_typesfilenamesinCMFs _setObjectsFiles_getObsobs manage_uploads content_typesgetSize(sselfsfilestitlesREQUESTsobs folderHassfoldersid((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pys_createFileOrImage¯s(    +! (( (( cCsîtid||iƒƒodSnt|dƒo d}nd}|dd!djo%t|d ƒo|i o |t jo#|i ƒi ||||ƒ}n |i ƒi||||ƒ}|i|iƒ||ƒ|i|ƒdS( sœ 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. s(src|href)="%s"Nsuploadssuploads/siisimages dontinline(sressearchsfile_idsselfstextshasattrsfolders content_typesREQUESTs dontinlinessizesLARGE_FILE_SIZEspageTypes inlineImageslinktxtslinkFilessetTextsreads setLastEditor(sselfsfile_ids content_typessizesREQUESTslinktxtsfolder((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pys _addFileLinkâs <# cCs|iƒdS(N(sselfs_deleteOwnershipAfterAdd(sselfsREQUEST((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pys _setOwnershipùssreadcCstidd|iƒƒSdS(Ns ?s(sressubsselfs _old_read(sself((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pysreads stextcCs/|tj o|iddƒn|iƒSdS(s¥ Return this page's source text, with text/plain content type. (a permission-free version of document_src) # XXX security ? s Content-Types text/plainN(sRESPONSEsNones setHeadersselfsread(sselfsREQUESTsRESPONSE((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pystext s cCs0|i|ƒ|_|iddƒ|iƒdS(sq Change this page's text. Does cleanups and triggers pre-rendering and DTML re-parsing. s clear_cacheiN(sselfs cleanupTextstextsraws preRenderscookDtmlIfNeeded(sselfstextsREQUEST((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pyssetTextsc s%t|dtƒ}|i|ddƒ‰t|ddƒ‰|iƒ‰‡‡‡‡d†}xct|i ƒdgƒD]I}t |ƒ}|ot i|ˆƒo|tdƒtd ƒƒqsqsWd }|i|ƒ ot|i ƒ|ƒoŒytt|i ƒ|ƒƒ}Wntj o t}nX|tj o@tt id ˆƒƒ|jo|td ƒtd ƒƒquqynd}t|i ƒ|ƒoŒytt|i ƒ|ƒƒ}Wntj o t}nX|tj o@tt id ˆƒƒ|jo|tdƒtdƒƒqq!ndS(s Check for signs of spam in some text, and raise an error if found. Also looks at the current user's info in REQUEST. sREQUESTs ip_addressis REMOTE_ADDRscs1tdˆˆˆ|ˆfƒtd|ƒ‚dS(Ns(blocked edit from %s (%s) on %s (%s) %s sThere was a problem: %s(sBLATHERsipsusernamespagesreasonsts_sverbose_reason(sreasonsverbose_reason(susernamesipstspage(s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pysraiseSpamError3ss banned_linkssbanned_links matchsZyour edit contained a banned link pattern. Please contact the site administrator for help.smax_anonymous_linkss https?://sexceeded max_anonymous_linkss¤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.smax_identified_linkssexceeded max_identified_linkss©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.N(sgetattrsselfsNonesREQUESTs usernameFromsusernamesipspageNamespagesraiseSpamErrorsfolderspatsstripsressearchsts_spropsrequestHasUsernameshasattrsintsmaxs ValueErrorslensfindall( sselfstsusernamesraiseSpamErrorspatsipsmaxsREQUESTspropspage((stsusernamesipspages7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pys checkForSpam)s@   '      cCsRtidd|ƒ}totitd|ƒ}nd„}||ƒ}|SdS(sJ Do some cleanup of incoming text, also block spam links. s s s<disabled \1>cCsLy.titd|ƒ}titd|ƒ}Wntj onX|SdS(Ns(sressubshtmlheaderexprstshtmlfooterexprs RuntimeError(st((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pys onlyBodyFromxs N(sressubstsDISABLE_JAVASCRIPTsjavascriptexprs onlyBodyFrom(sselfsts onlyBodyFrom((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pys cleanupTextXs cCsZ|o"|i|_|i|ƒ|_nd|_d|_ttiƒƒiƒ|_ dS(sP Record last editor info based on the current REQUEST and time. sN( sREQUESTs REMOTE_ADDRsselfslast_editor_ips usernameFroms last_editorsDateTimestimesISOslast_edit_time(sselfsREQUEST((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pys setLastEditor…s   cCs1t|dƒot|dƒo t|dƒSdS(sC True if this page already has creator attributes. screators creation_times creator_ipN(shasattrsself(sself((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pyshasCreatorInfo“scCsZttiƒƒiƒ|_|o"|i|_|i|ƒ|_ nd|_d|_ dS(s? record my creator, creator_ip & creation_time sN( sDateTimestimesISOsselfs creation_timesREQUESTs REMOTE_ADDRs creator_ips usernameFromscreator(sselfsREQUEST((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pys setCreatorœs  scheckEditConflictcCs„|i|ƒ}|tj oU||iƒjoBt|dƒ p1t|dƒ p ||ijp|i|i jodSndSdS(sç 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. s last_editorslast_editor_ipiiN( sselfs usernameFromsREQUESTsusernames timeStampsNoneshasattrs last_editors REMOTE_ADDRslast_editor_ip(sselfs timeStampsREQUESTsusername((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pyscheckEditConflict©s es timeStampcCst|iƒSdS(N(sstrsselfs_p_mtime(sself((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pys timeStampÔss manage_FTPgetcCs1d|iƒ}d|iƒ||iƒfSdS(s. Get source for FTP download. s%ss&Wiki-Safetybelt: %s Type: %s Log: %sN(sselfs pageTypeIdstypess timeStampsread(sselfstypes((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pys manage_FTPgetØssPUTc Cs–|i||ƒ|i||ddƒ|iddƒ}|i|ƒt|ƒ\}}t i |id|iddƒƒƒpd}t i |id|iddƒƒƒpt }|t j ot i|ƒd }nt i |id dƒƒpt }|o|i||ƒo|id ƒ|Sny2|id |d|d |d|d|dd ƒWn$dj o|idƒ|SnX|idƒ|SdS(s6 Handle HTTP/FTP/WebDav PUT requests. srefreshisBODYssLogslogsTypestypeisWiki-Safetybelti§stexts timeStampsREQUESTscheck_conflicts Unauthorizedi‘iÌN(sselfs dav__initsREQUESTsRESPONSEsdav__simpleifhandlersgetsbodys_validateProxysparseHeadersBodysheaderssstringsstripslogsNonestypessplits timestampscheckEditConflicts setStatussedit(sselfsREQUESTsRESPONSEsbodyslogs timestampsheadersstype((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pysPUTès, .. "    s manage_editcCs[||_|i||ƒ|i|ƒ|iƒ|o d}|i||d|ƒSndS(s6Do standard manage_edit kind of stuff, using our edit.sContent changed.smanage_tabs_messageN( stitlesselfssetTextsdatasREQUESTs setLastEditorsreindex_objectsmessages manage_main(sselfsdatastitlesREQUESTsmessage((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pys manage_edits   cCs3td„t|dgƒƒptd„tƒSdS(sÅ 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. cCs t|ƒS(N(sstripsx(sx((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pys!ssallowed_page_typescCs|iS(N(sxs_id(sx((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pys"sN(sfiltersgetattrsselfsmaps PAGETYPES(sself((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pysallowedPageTypesscCs|iƒdSdS(sThis wiki's default page type.iN(sselfsallowedPageTypes(sself((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pysdefaultPageType$sssplitcCs|iƒi|ƒSdS(s 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. N(sselfspageTypessplit(sself((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pyssplit)s smergecCs|iƒi|ƒSdS(s± 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. N(sselfspageTypesmerge(sself((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pysmerge6s(<s__name__s __module__sClassSecurityInfossecuritysdeclareObjectProtectedscheckPermissionsdeclareProtecteds PermissionssAddsNonescreates declarePublics isDavLockedsCommentscommentsappendsLEAVE_PLACEHOLDERseditshandleSubtopicsPropertyshandleEditPageTypes setLastLogshandleEditTextshandleDeleteMes handleRenamesDeletesdeletesensureRecycleBinsrecyclesRenamesrenameschangeIdPreservingCreatorsmoveMyChildrenTosreplaceLinksThroughoutWikis replaceLinksshandleFileUploads_createFileOrImages _addFileLinks _setOwnerships DTMLDocumentsreads _old_readsViewstextssetTexts checkForSpams cleanupTexts setLastEditorshasCreatorInfos setCreatorscheckEditConflicts timeStampsFTPs manage_FTPgetsEditsPUTs manage_editsallowedPageTypessdefaultPageTypessplitsmerge(((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pysPageEditingSupport"sx   ']  'Z -Q    ]    .3     / -   *   %  (:s__doc__s __future__s nested_scopessresstringstimessplitsjoinsfindslowersrfindsatoisstripsurllibsquotesunquotestypess email.MessagesMessagescopysdeepcopysZODBs AccessControlsgetSecurityManagersClassSecurityInfos App.Commons rfc1123_datesDateTimesGlobalssInitializeClassszope.app.content_typessguess_content_types ImportErrorsOFS.content_typessOFS.DTMLDocuments DTMLDocumentsOFS.ObjectManagersBadRequestExceptions OFS.ImagesOFSs pagetypess PAGETYPESsDefaultssDISABLE_JAVASCRIPTsLARGE_FILE_SIZEsLEAVE_PLACEHOLDERs PermissionssRegexpssjavascriptexprshtmlheaderexprshtmlfooterexprsUtilssget_transactionsBLATHERsparseHeadersBodysI18ns_sPageEditingSupport(&sunquotes PAGETYPESsBadRequestExceptions rfc1123_datesstripsdeepcopysfindsLEAVE_PLACEHOLDERsparseHeadersBodysreshtmlheaderexprssplits Permissionssstrings nested_scopessDISABLE_JAVASCRIPTsquotesClassSecurityInfos DTMLDocumentsInitializeClasssPageEditingSupportsOFSsget_transactionsZODBsDateTimes_sBLATHERslowersjoinsgetSecurityManagersguess_content_typesrfindsLARGE_FILE_SIZEsatoisjavascriptexprstimeshtmlfooterexprsMessage((s7/mnt/gmirror/ports/www/zope-zwiki/work/ZWiki/Editing.pys?s> 1            ÿÿÿÿ!