[Zope3-checkins] CVS: Zope3/src/zope/app/wiki/browser -
__init__.py:1.1 add.pt:1.1 comment_page.pt:1.1
configure.zcml:1.1 parents_page.pt:1.1 subscriptions.pt:1.1
view_page.pt:1.1 wiki.py:1.1 wiki_add.pt:1.1
wiki_icon.gif:1.1 wiki_search.pt:1.1 wiki_toc.pt:1.1
wikipage.py:1.1 wikipage_icon.gif:1.1
Philipp von Weitershausen
philikon at philikon.de
Fri Feb 27 06:07:03 EST 2004
Update of /cvs-repository/Zope3/src/zope/app/wiki/browser
In directory cvs.zope.org:/tmp/cvs-serv21004/app/wiki/browser
Added Files:
__init__.py add.pt comment_page.pt configure.zcml
parents_page.pt subscriptions.pt view_page.pt wiki.py
wiki_add.pt wiki_icon.gif wiki_search.pt wiki_toc.pt
wikipage.py wikipage_icon.gif
Log Message:
Moved the zwiki product to zope.app.wiki. It currently still needs to be
enabled in products.zcml, since it depends on securitypolicy enabled.
That's to change soon when we move securitypolicy back to zope.app.
=== Added File Zope3/src/zope/app/wiki/browser/__init__.py ===
##############################################################################
#
# Copyright (c) 2003 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.
#
##############################################################################
"""Browser Views for the wiki for Zope 3 Product
$Id: __init__.py,v 1.1 2004/02/27 11:06:59 philikon Exp $
"""
=== Added File Zope3/src/zope/app/wiki/browser/add.pt ===
<html metal:use-macro="views/standard_macros/dialog">
<body>
<div metal:fill-slot="body">
<form action="action.html" method="POST">
<table class="TypeListing" cellpadding="3">
<caption>Add Content</caption>
<tbody tal:repeat="info view/addingInfo">
<tr>
<td class="Selector">
<input type="radio" name="type_name"
tal:attributes="value info/action; id info/action" />
</td>
<td class="TypeName">
<label style="font-weight: bold;"
tal:attributes="for info/action">
<span tal:replace="info/title" >Folder</span>
</label>
<div class="TypeDescription" tal:content="info/description">
Folders are generic containers for content, including other
folders.
</div>
</td>
</tr>
</tbody>
<tbody tal:condition="nothing">
<tr>
<td class="Selector">
<input type="radio" name="type_name" value="" />
</td>
<td class="TypeName">
<img alt="Folder" src="../../ZMI/www/document_icon.gif" />
Document
</td>
</tr>
<tr>
<td class="Selector"><br /></td>
<td class="TypeDescription">
Documents are simple textual content.
</td>
</tr>
</tbody>
<tr>
<td><br/></td>
<td>
<input type="text" name="id"
tal:condition="view/namesAccepted"
tal:attributes="value request/id | nothing"
/>
<input type="submit" value=" Add " />
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
=== Added File Zope3/src/zope/app/wiki/browser/comment_page.pt ===
<html metal:use-macro="views/standard_macros/page">
<head>
<style metal:fill-slot="style_slot">
</style>
</head>
<body>
<div metal:fill-slot="body">
<form action="addComment.html" method="post">
<div class="row">
<div class="label" i18n:translate="">Comment</div>
<div class="field">
<textarea name="comment" cols="60" rows="10"></textarea>
</div>
</div>
<div class="row">
<div class="label" i18n:translate="">
Wiki Source as reference
</div>
<div class="field">
<textarea name="source" cols="60" rows="5"
tal:content="view/source"></textarea>
</div>
</div>
<div class="row">
<div class="controls">
<input type="submit" value="Refresh"
i18n:attributes="value refresh-button" />
<input type="submit" name="submit" value="Submit"
i18n:attributes="value submit-button" />
</div>
</div>
</form>
</div>
</body>
</html>
=== Added File Zope3/src/zope/app/wiki/browser/configure.zcml ===
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser"
i18n_domain="zope"
>
<include package=".skin" />
<browser:menu
id="add_wiki"
title="Menu of objects to be added to wikis."/>
<!-- Custom adding view. -->
<browser:view
for="zope.app.wiki.interfaces.IWiki"
name="+"
class=".wiki.WikiAdding"
permission="zope.app.wiki.AddWikiPage"
allowed_attributes="addingInfo"
menu="zmi_actions"
title="Add"
>
<browser:page name="index.html" template="add.pt" />
<browser:page name="action.html" attribute="action" />
</browser:view>
<browser:addform
label="Add Wiki"
name="AddWiki"
schema="zope.app.wiki.interfaces.IWiki"
content_factory="zope.app.wiki.wiki.Wiki"
permission="zope.ManageContent"
class=".wiki.AddWiki"
template="wiki_add.pt"
menu="add_content" title="Wiki"/>
<browser:page
name="toc.html"
for="zope.app.wiki.interfaces.IWiki"
class=".wiki.TableOfContents"
template="wiki_toc.pt"
permission="zope.app.wiki.ViewWikiPage"
menu="zmi_views" title="TOC"/>
<browser:page
name="search.html"
for="zope.app.wiki.interfaces.IWiki"
class=".wiki.WikiSearch"
template="wiki_search.pt"
permission="zope.app.wiki.ViewWikiPage"
menu="zmi_views" title="Search"/>
<browser:pages
for="zope.app.wiki.interfaces.IWiki"
class=".wikipage.MailSubscriptions"
permission="zope.app.wiki.EditWikiPage">
<browser:page name="subscriptions.html" template="subscriptions.pt"
menu="zmi_views" title="Subscriptions" />
<browser:page name="changeSubscriptions.html" attribute="change" />
</browser:pages>
<browser:defaultView
name="toc.html"
for="zope.app.wiki.interfaces.IWiki"/>
<browser:icon
name="zmi_icon"
for="zope.app.wiki.interfaces.IWiki"
file="wiki_icon.gif"
/>
<!-- WikiPage browser configuration -->
<browser:addform
label="Add Wiki Page"
name="AddWikiPage"
schema="zope.app.wiki.interfaces.IWikiPage"
content_factory="zope.app.wiki.wikipage.WikiPage"
permission="zope.app.wiki.AddWikiPage"
fields="source type"
class=".wikipage.AddWikiPage"
menu="add_wiki"
title="Wiki Page"/>
<browser:editform
schema="zope.app.wiki.interfaces.IWikiPage"
for="zope.app.wiki.interfaces.IWikiPage"
label="Change Wiki Page"
name="edit.html"
permission="zope.app.wiki.EditWikiPage"
fields="source type"
class=".wikipage.EditWikiPage"
menu="zmi_views" title="Edit" />
<browser:pages
for="zope.app.wiki.interfaces.IWikiPage"
class=".wikipage.GenericWikiPageViews"
permission="zope.app.wiki.ViewWikiPage">
<browser:page name="breadcrumbs" attribute="breadcrumbs" />
<browser:page name="author" attribute="author" />
<browser:page name="modified" attribute="modified" />
<browser:page name="jumpto.html" attribute="jumpTo" />
<browser:page name="toc.html" attribute="toc" />
</browser:pages>
<browser:pages
for="zope.app.wiki.interfaces.IWikiPage"
class=".wikipage.ViewWikiPage"
permission="zope.app.wiki.ViewWikiPage">
<browser:page name="view.html" template="view_page.pt"
menu="zmi_views" title="View" />
</browser:pages>
<browser:pages
for="zope.app.wiki.interfaces.IWikiPage"
class=".wikipage.EditWikiParents"
permission="zope.app.wiki.ReparentWikiPage">
<browser:page name="parents.html" template="parents_page.pt"
menu="zmi_views" title="Parents" />
<browser:page name="setParents.html" attribute="setParents" />
</browser:pages>
<browser:pages
for="zope.app.wiki.interfaces.IWikiPage"
class=".wikipage.WikiPageComment"
permission="zope.app.wiki.CommentWikiPage">
<browser:page name="commentForm.html" template="comment_page.pt"
menu="zmi_views" title="Add Comment" />
<browser:page name="addComment.html" attribute="comment" />
</browser:pages>
<browser:pages
for="zope.app.wiki.interfaces.IWikiPage"
class=".wikipage.MailSubscriptions"
permission="zope.app.wiki.EditWikiPage">
<browser:page name="subscriptions.html" template="subscriptions.pt"
menu="zmi_views" title="Subscriptions" />
<browser:page name="changeSubscriptions.html" attribute="change" />
</browser:pages>
<browser:defaultView
name="view.html"
for="zope.app.wiki.interfaces.IWikiPage"/>
<browser:icon
name="zmi_icon"
for="zope.app.wiki.interfaces.IWikiPage"
file="wikipage_icon.gif"
/>
<!-- Make a special WikiPage menu -->
<browser:menu
id="wikipage_actions"
title="Menu for Wiki Page related actions."
/>
<browser:menuItems menu="wikipage_actions"
for="zope.app.wiki.interfaces.IWikiPage">
<browser:menuItem title="View" action="@@view.html"/>
<browser:menuItem title="Comment" action="@@commentForm.html"/>
<browser:menuItem title="Edit" action="@@edit.html"/>
<browser:menuItem title="Parents" action="@@parents.html"/>
<browser:menuItem title="TOC" action="@@toc.html"/>
<browser:menuItem title="Subscriptions" action="@@subscriptions.html"/>
</browser:menuItems>
<browser:menuItems menu="wikipage_actions"
for="zope.app.wiki.interfaces.IWiki">
<browser:menuItem title="Table of Contents" action="@@toc.html"/>
<browser:menuItem title="Search" action="@@search.html"/>
<browser:menuItem title="Subscriptions" action="@@subscriptions.html"/>
</browser:menuItems>
<!-- Register a browser-specific traverser -->
<browser:page
name="_traverse"
for="zope.app.wiki.interfaces.IWikiPage"
class="zope.app.wiki.traversal.WikiPageTraverser"
permission="zope.Public" />
<!-- Register WikiTextIndex as component -->
<browser:menuItem
menu="add_component"
for="zope.app.interfaces.container.IAdding"
action="zope.app.wiki.index.WikiTextIndex"
title="Wiki Text Index"
description="A Wiki-specific full-text index"
/>
</configure>
=== Added File Zope3/src/zope/app/wiki/browser/parents_page.pt ===
<html metal:use-macro="views/standard_macros/page">
<head>
<style metal:fill-slot="style_slot">
</style>
</head>
<body>
<div metal:fill-slot="body">
<form action="setParents.html" method="post">
<table cellspacing="0" cellpadding="2" border="0">
<tr>
<td i18n:translate="">Parents</td>
<td>
<select name="parents:list" multiple="">
<div tal:repeat="parent view/availableWikis" tal:omit-tag="">
<option tal:content="parent" selected=""
tal:condition="python: parent in view.parents()">
Wiki1
</option>
<option tal:content="parent"
tal:condition="python: parent not in view.parents()">
Wiki1
</option>
</div>
</select>
</td>
</tr>
</table>
<input type="submit" name="submit" value="Reparent"
i18n:attributes="value reparent-button" />
</form>
<h3 i18n:translate="">Branch</h3>
<p tal:replace="structure view/branch" />
</div>
</body>
</html>
=== Added File Zope3/src/zope/app/wiki/browser/subscriptions.pt ===
<html metal:use-macro="views/standard_macros/page">
<head>
<style metal:fill-slot="style_slot">
</style>
</head>
<body>
<div metal:fill-slot="body">
<form action="changeSubscriptions.html" method="post">
<div class="row">
<div class="label" i18n:translate="">Current Subscriptions</div>
<div class="field">
<div tal:repeat="email view/subscriptions">
<input type="checkbox" name="remails:list"
value="" tal:attributes="value email">
<div tal:replace="email">zope3 at zope3.org</div>
</div>
<input type="submit" name="REMOVE" value="Remove"
i18n:attributes="value remove-button">
</div>
</div>
<div class="row">
<div class="label" i18n:translate="">
Enter new Users (separate by 'Return')
</div>
<div class="field">
<textarea name="emails" cols="40" rows="10"></textarea>
</div>
</div>
<div class="row">
<div class="controls">
<input type="submit" value="Refresh"
i18n:attributes="value refresh-button" />
<input type="submit" name="ADD" value="Add"
i18n:attributes="value add-button" />
</div>
</div>
</form>
</div>
</body>
</html>
=== Added File Zope3/src/zope/app/wiki/browser/view_page.pt ===
<html metal:use-macro="views/standard_macros/page">
<head>
<style metal:fill-slot="style_slot">
</style>
</head>
<body>
<div metal:fill-slot="body">
<div tal:replace="structure view/render">
This is the rendered Wiki
</div>
</div>
</body>
</html>
=== Added File Zope3/src/zope/app/wiki/browser/wiki.py ===
##############################################################################
#
# Copyright (c) 2003 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.
#
##############################################################################
"""Browser View Components for Wikis
$Id: wiki.py,v 1.1 2004/02/27 11:06:59 philikon Exp $
"""
from datetime import datetime
from zope.proxy import removeAllProxies
from zope.app import zapi
from zope.app.interfaces.dublincore import ICMFDublinCore
from zope.app.services.servicenames import HubIds
from zope.app.traversing import getName, getPath
from zope.app.browser.container.adding import Adding
from zope.app.services.hub import Registration
from zope.app.wiki.interfaces import IWikiPageHierarchy
from zope.app.wiki.index import WikiTextIndex
class WikiAdding(Adding):
"""Custom adding view for NewsSite objects."""
menu_id = "add_wiki"
class AddWiki(object):
"""Add a Wiki"""
def createAndAdd(self, data):
content = super(AddWiki, self).createAndAdd(data)
if self.request.get('textindex'):
# Get the environment
sm = zapi.getServiceManager(content)
pkg = sm['default']
hub = pkg['HubIds-1']
# Create, subscribe and add a Registration object.
if 'WikiReg' not in pkg:
reg = Registration()
pkg['WikiReg'] = reg
reg.subscribe()
# Create, subscribe and add an WikiTextIndex object
if 'WikiTextIndex' not in pkg:
index = WikiTextIndex()
pkg['WikiTextIndex'] = index
index.subscribe(hub, True)
if self.request.get('frontpage'):
page = removeAllProxies(zapi.createObject(None, 'WikiPage'))
page.type = u'reStructured Text (reST)'
page.source = u'This is the FrontPage of the Wiki.'
dc = zapi.getAdapter(page, ICMFDublinCore)
dc.created = datetime.now()
dc.modified = datetime.now()
dc.creators = [u'wiki']
content['FrontPage'] = page
return content
class WikiSearch(object):
"""Search Wiki Pages"""
def __init__(self, context, request):
super(WikiSearch, self).__init__(context, request)
self.hub = zapi.getService(context, HubIds)
def query(self):
queryText = self.request.get('queryText', '')
sm = zapi.getServiceManager(self.context)
results, total = sm['default']['WikiTextIndex'].query(queryText)
result = {
'results': list(self._resultIterator(results)),
'total': total,
}
return result
def _resultIterator(self, results):
for hubid, score in results:
yield self._cookInfo(hubid, score)
def _cookInfo(self, hubid, score):
location = self.hub.getPath(hubid)
scoreLabel = "%.1f%%" % (100.0 * score)
result = {
'location': location,
'score': score,
'scoreLabel': scoreLabel,
}
try:
object = self.hub.getObject(hubid)
except NotFoundError:
pass
else:
result['name'] = getName(object)
return result
class TableOfContents:
"""Table of contents for a Wiki"""
def toc(self):
"""Generate a table of contents."""
children = []
for name, page in self.context.items():
hier = zapi.getAdapter(page, IWikiPageHierarchy)
if hier.getParents() == ():
children.append((page, hier.findChildren()))
return self._branchHTML(children)
def _branchHTML(self, children):
html = '<ul>\n'
for child, subs in children:
html += ' <li><a href="%s">%s</a></li>\n' %(getName(child),
getName(child))
if subs:
html += self._branchHTML(subs)
html += '</ul>\n'
return html
=== Added File Zope3/src/zope/app/wiki/browser/wiki_add.pt ===
<html metal:use-macro="views/standard_macros/page">
<head>
<style metal:fill-slot="style_slot">
</style>
</head>
<body>
<div metal:fill-slot="body">
<p tal:define="status view/update"
tal:condition="status"
tal:content="status" />
<form action="." tal:attributes="action request/URL" method="post">
<div class="row">
<div class="field">
<h1><input type="checkbox" name="textindex:int" value="1"
checked=""/>
Create Wiki Text Index
</h1>
This is strongly recommended. Without the text index you cannot
search your objects properly. Of course, you can always add
an index later as well.
</div>
</div>
<div class="row">
<div class="field">
<h1><input type="checkbox" name="frontpage:int" value="1"
checked=""/>
Create "Front Page" Wiki Page
</h1>
This is not absolutely necessary, but it is nice to have, since
it gets you started right away. Note that you have to have at
least one WikiPage for the 'wiki' skin to be useful.
</div>
</div>
<div class="row">
<div class="controls">
<input type="submit" value="Refresh"
i18n:attributes="value refresh-button" />
<input type="submit" name="UPDATE_SUBMIT" value="Submit"
i18n:attributes="value submit-button" />
</div>
</div>
</form>
</div>
</body>
</html>
=== Added File Zope3/src/zope/app/wiki/browser/wiki_icon.gif ===
<Binary-ish file>
=== Added File Zope3/src/zope/app/wiki/browser/wiki_search.pt ===
<html metal:use-macro="views/standard_macros/page">
<head>
<style metal:fill-slot="style_slot">
</style>
</head>
<body>
<div metal:fill-slot="body">
<h1 i18n:translate="">Wiki Search</h1>
<form action="search.html" method="get">
<input type="text" name="queryText" value=""
tal:attributes="value request/queryText|nothing" />
<input type="submit" value="Query" />
</form>
<div tal:condition="request/queryText|nothing" tal:omit-tag="">
<div tal:define="result view/query" tal:omit-tag="">
<div tal:condition="not:result/total">
No hits. Please try another query.
</div>
<div tal:condition="result/total">
<div tal:repeat="info result/results">
<a href="location"
tal:attributes="href info/name"
tal:content="info/name">FrontPage</a>;
(Score: <span tal:replace="info/scoreLabel" />)
</div>
</div>
</div>
</div>
</div>
</body>
</html>
=== Added File Zope3/src/zope/app/wiki/browser/wiki_toc.pt ===
<html metal:use-macro="views/standard_macros/page">
<head>
<style metal:fill-slot="style_slot">
</style>
</head>
<body>
<div metal:fill-slot="body">
<h1 i18n:translate="">Wiki Table of Contents</h1>
<p tal:replace="structure view/toc">This is a table of contents.</p>
</div>
</body>
</html>
=== Added File Zope3/src/zope/app/wiki/browser/wikipage.py ===
##############################################################################
#
# Copyright (c) 2003 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.
#
##############################################################################
"""Browser View Components for WikiPages
$Id: wikipage.py,v 1.1 2004/02/27 11:06:59 philikon Exp $
"""
import re
from urllib import quote, unquote
from datetime import datetime
from zope.app import zapi
from zope.app.browser.form.submit import Update
from zope.app.browser.form.vocabularywidget import VocabularyFieldEditWidget
from zope.app.browser.form.widget import ListWidget
from zope.app.form.widget import CustomWidgetFactory
from zope.app.interfaces.dublincore import ICMFDublinCore
from zope.app.traversing import getParent, getPath, getName
from zope.app.wiki.interfaces import IWikiPageHierarchy, IMailSubscriptions
urlchars = r'[A-Za-z0-9/:@_%~#=&\.\-\?\+\$,]+'
urlendchar = r'[A-Za-z0-9/]'
url = r'["=]?((about|gopher|http|https|ftp|mailto|file):%s)' %urlchars
bracketedexpr = r'\[([^\n\]]+)\]'
protectedLine = r'(?m)^!(.*)$'
U = 'A-Z\xc0-\xdf'
L = 'a-z\xe0-\xff'
b = '(?<![%s0-9])' % (U+L)
wikiname1 = r'(?L)%s[%s]+[%s]+[%s][%s]*[0-9]*' % (b,U,L,U,U+L)
wikiname2 = r'(?L)%s[%s][%s]+[%s][%s]*[0-9]*' % (b,U,U,L,U+L)
wikilink = r'!?(%s|%s|%s|%s)' % (wikiname1,wikiname2,bracketedexpr,url)
localwikilink = r'!?(%s|%s|%s)' % (wikiname1, wikiname2, bracketedexpr)
interwikilink = r'!?((?P<local>%s):(?P<remote>%s))' % \
(localwikilink, urlchars+urlendchar)
class GenericWikiPageViews:
"""Some generic Wiki page views."""
def breadcrumbs(self):
"""Get the path of this page."""
hier = zapi.getAdapter(self.context, IWikiPageHierarchy)
path = hier.path()
html = []
for page in path:
html.append('<a href="../%s">%s</a>' %(getName(page),
getName(page)))
return ' / '.join(html)
def author(self):
"""Get user who last modified the Wiki Page."""
creators = zapi.getAdapter(self.context, ICMFDublinCore).creators
if not creators:
return 'unknown'
return creators[0]
def modified(self):
"""Get last modification date."""
date = zapi.getAdapter(self.context, ICMFDublinCore).modified
if date is None:
date = zapi.getAdapter(self.context, ICMFDublinCore).created
if date is None:
return ''
formatter = self.request.locale.getDateTimeFormatter('medium')
return formatter.format(date)
def jumpTo(self, jumpto):
"""Try to get quickly to another Wiki page"""
wiki = getParent(self.context)
if jumpto in wiki:
return self.request.response.redirect('../'+jumpto)
else:
return self.request.response.redirect('.')
def toc(self):
"""Simply forwards to the real TOC in the Wiki."""
return self.request.response.redirect('../@@toc.html')
class AddWikiPage(object):
type_widget = CustomWidgetFactory(VocabularyFieldEditWidget, size=1)
def nextURL(self):
return '../'+self.context.contentName
class EditWikiPage(object):
type_widget = CustomWidgetFactory(VocabularyFieldEditWidget, size=1)
def update(self):
status = super(EditWikiPage, self).update()
if Update in self.request:
self.request.response.redirect('./@@view.html')
return status
class ViewWikiPage:
"""A rendered View of the wiki page."""
def renderWikiLinks(self, source):
"""Add Wiki Links to the source"""
html = str(source)
html = re.sub(protectedLine, self._protectLine, html)
html = re.sub(interwikilink, self._interwikilinkReplace, html)
html = re.sub(wikilink, self._wikilinkReplace, html)
return html
def render(self):
"""Render the wiki page source."""
types = zapi.getService(self.context, "SourceTypeRegistry")
source = types.zapi.createObject(self.context.type,
self.context.source)
view = zapi.getView(source, '', self.request)
html = view.render(self.context)
html = self.renderWikiLinks(html)
return html
def _protectLine(self, match):
return re.sub(wikilink, r'!\1', match.group(1))
def _wikilinkReplace(self, match, allowed=0, state=None, text=''):
# tasty spaghetti regexps! better suggestions welcome ?
"""
Replace an occurrence of the wikilink regexp or one of the
special [] constructs with a suitable hyperlink
To be used as a re.sub repl function *and* get a proper value
for literal context, 'allowed', etc, enclose this function
with the value using 'thunk_substituter'.
"""
# In a literal?
if state is not None:
if within_literal(match.start(1), match.end(1)-1, state, text):
return match.group(1)
# matches beginning with ! should be left alone
if re.match('^!', match.group(0)):
return match.group(1)
m = morig = match.group(1)
wiki = getParent(self.context)
# if it's a bracketed expression,
if re.match(bracketedexpr, m):
# strip the enclosing []'s
m = re.sub(bracketedexpr, r'\1', m)
# extract a (non-url) path if there is one
pathmatch = re.match(r'(([^/]*/)+)([^/]+)', m)
if pathmatch:
path, id = pathmatch.group(1), pathmatch.group(3)
else:
path, id = '', m
# or if there was a path assume it's to some non-wiki
# object and skip the usual existence checking for
# simplicity. Could also attempt to navigate the path in
# zodb to learn more about the destination
if path:
return '<a href="%s%s">%s%s</a>' % (path, id, path, id)
# otherwise fall through to normal link processing
# if it's an ordinary url, link to it
if re.match(url,m):
# except, if preceded by " or = it should probably be left alone
if re.match('^["=]', m): # "
return m
else:
return '<a href="../%s">%s</a>' % (m, m)
# it might be a structured text footnote ?
elif re.search(r'(?si)<a name="%s"' % (m),text):
return '<a href="#%s">[%s]</a>' % (m,m)
# a wikiname - if a page (or something) of this name exists, link to
# it
elif m in wiki:
return '<a href="../%s">%s</a>' % (quote(m), m)
# otherwise, provide a "?" creation link
else:
return '%s<a href="../+/AddWikiPage=%s">?</a>' %(
morig, quote(m))
def _interwikilinkReplace(self, match, allowed=0, state=None, text=''):
"""Replace an occurrence of interwikilink with a suitable hyperlink.
To be used as a re.sub repl function *and* get a proper value
for literal context, 'allowed', etc.
"""
# matches beginning with ! should be left alone This is a bit naughty,
# but: since we know this text will likely be scanned with
# _wikilink_replace right after this pass, leave the ! in place for it
# to find. Otherwise the localname will get wiki-linked.
if re.match('^!', match.group(0)):
return match.group(0)
localname = match.group('local')
remotename = match.group('remote') # named groups come in handy here!
# NB localname could be [bracketed]
if re.match(bracketedexpr,localname):
localname = re.sub(bracketedexpr, r'\1', localname)
# look for a RemoteWikiURL definition
if hasattr(getParent(self.context), localname):
localpage = getattr(self.aq_parent,localname)
# local page found - search for "RemoteWikiUrl: url"
m = re.search(remotewikiurl, str(localpage))
if m is not None:
# NB: pages are stored html-quoted XXX eh ? they are ?
# something's not right somewhere.. I have lost my grip on
# this whole quoting issue.
remoteurl = html_unquote(m.group(1))
# we have a valid inter-wiki link
link = '<a href="%s%s">%s:%s</a>' % \
(remoteurl, remotename, localname, remotename)
# protect it from any later wiki-izing passes
return re.sub(wikilink, r'!\1', link)
# otherwise, leave alone
return match.group(0)
class EditWikiParents:
def parents(self):
hier = zapi.getAdapter(self.context, IWikiPageHierarchy)
return hier.parents
def availableWikis(self):
wiki = getParent(self.context)
return wiki.keys()
def setParents(self, parents):
hier = zapi.getAdapter(self.context, IWikiPageHierarchy)
hier.reparent(parents)
return self.request.response.redirect('./@@parents.html')
def _branchHTML(self, children):
html = '<ul>\n'
for child, subs in children:
html += ' <li><a href="../%s">%s</a></li>\n' %(getName(child),
getName(child))
if subs:
html += self._branchHTML(subs)
html += '</ul>\n'
return html
def branch(self):
hier = zapi.getAdapter(self.context, IWikiPageHierarchy)
children = hier.findChildren()
return self._branchHTML(children)
class WikiPageComment:
def comment(self, comment):
types = zapi.getService(self.context, "SourceTypeRegistry")
source = types.zapi.createObject(self.context.type, self.context.source)
comment = source.createComment(
comment,
self.context.getCommentCounter(),
self.request.user.getTitle(),
datetime.now().strftime('%m/%d/%Y %H:%M:%S'))
self.context.comment(comment)
return self.request.response.redirect('.')
def source(self):
return '> ' + self.context.source.replace('\n', '\n> ')
class MailSubscriptions:
def subscriptions(self):
return zapi.getAdapter(self.context, IMailSubscriptions).getSubscriptions()
def change(self):
if 'ADD' in self.request:
emails = self.request['emails'].split('\n')
zapi.getAdapter(self.context,
IMailSubscriptions).addSubscriptions(emails)
elif 'REMOVE' in self.request:
emails = self.request['remails']
print emails
if isinstance(emails, (str, unicode)):
emails = [emails]
zapi.getAdapter(self.context,
IMailSubscriptions).removeSubscriptions(emails)
self.request.response.redirect('.')
=== Added File Zope3/src/zope/app/wiki/browser/wikipage_icon.gif ===
<Binary-ish file>
More information about the Zope3-Checkins
mailing list