new package for wiki framework
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2716 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
1754b64733
commit
f93122d379
6 changed files with 257 additions and 0 deletions
35
wiki/README.txt
Normal file
35
wiki/README.txt
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
==============================
|
||||||
|
Yet Another WikiWiki Framework
|
||||||
|
==============================
|
||||||
|
|
||||||
|
($Id$)
|
||||||
|
|
||||||
|
|
||||||
|
Links and Link Management
|
||||||
|
=========================
|
||||||
|
|
||||||
|
>>> from cybertools.wiki.base import link
|
||||||
|
|
||||||
|
>>> manager = link.LinkManager()
|
||||||
|
|
||||||
|
>>> input = ('This is text with a [[wikilink Wiki Link]] and a '
|
||||||
|
... '`RestructuredText Link <rstxlink>`__')
|
||||||
|
|
||||||
|
>>> page = object()
|
||||||
|
>>> format = link.DoubleBracketLinkFormat(page)
|
||||||
|
>>> format.manager = manager
|
||||||
|
|
||||||
|
>>> format.unmarshall(input)
|
||||||
|
'This is text with a [[##0000001##]] and a `RestructuredText Link <rstxlink>`__'
|
||||||
|
|
||||||
|
>>> link = manager.links['0000001']
|
||||||
|
|
||||||
|
>>> link.original
|
||||||
|
'[[wikilink Wiki Link]]'
|
||||||
|
|
||||||
|
>>> link.target
|
||||||
|
'wikilink'
|
||||||
|
|
||||||
|
>>> link.label
|
||||||
|
'Wiki Link'
|
||||||
|
|
3
wiki/__init__.py
Normal file
3
wiki/__init__.py
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
"""
|
||||||
|
$Id$
|
||||||
|
"""
|
3
wiki/base/__init__.py
Normal file
3
wiki/base/__init__.py
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
"""
|
||||||
|
$Id$
|
||||||
|
"""
|
105
wiki/base/link.py
Normal file
105
wiki/base/link.py
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Helmut Merz helmutm@cy55.de
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
|
||||||
|
"""
|
||||||
|
Basic (sample) implementations for links and link management
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
"""
|
||||||
|
|
||||||
|
import re
|
||||||
|
from zope.interface import implements
|
||||||
|
|
||||||
|
from cybertools.wiki.interfaces import ILink, ILinkFormat, ILinkManager
|
||||||
|
|
||||||
|
|
||||||
|
class Link(object):
|
||||||
|
|
||||||
|
implements(ILink)
|
||||||
|
|
||||||
|
identifier = None
|
||||||
|
manager = None
|
||||||
|
formatName = None
|
||||||
|
|
||||||
|
def __init__(self, source, target):
|
||||||
|
self.source = source
|
||||||
|
self.target = target
|
||||||
|
|
||||||
|
|
||||||
|
class BaseLinkFormat(object):
|
||||||
|
|
||||||
|
implements(ILinkFormat)
|
||||||
|
|
||||||
|
manager = None
|
||||||
|
|
||||||
|
name = 'base'
|
||||||
|
internalFormat = '##%s##'
|
||||||
|
internalRegexp = re.compile(r'##(.+)##(.+)##')
|
||||||
|
|
||||||
|
def __init__(self, context):
|
||||||
|
self.context = context
|
||||||
|
|
||||||
|
def unmarshall(self, text):
|
||||||
|
return self.externalRegexp.sub(self.processLink, text)
|
||||||
|
|
||||||
|
def marshall(self, text):
|
||||||
|
return text
|
||||||
|
|
||||||
|
def display(self, text):
|
||||||
|
return text
|
||||||
|
|
||||||
|
def processLink(self, match):
|
||||||
|
ref, label = match.group(1).split(' ', 1)
|
||||||
|
link = Link(self.context, ref)
|
||||||
|
link.original = match.group(0)
|
||||||
|
link.label = label
|
||||||
|
self.manager.register(link)
|
||||||
|
return self.externalFormat % (self.internalFormat % link.identifier)
|
||||||
|
|
||||||
|
|
||||||
|
class DoubleBracketLinkFormat(BaseLinkFormat):
|
||||||
|
|
||||||
|
name = 'doublebracket'
|
||||||
|
externalFormat = '[[%s]]'
|
||||||
|
externalRegexp = re.compile(r'\[\[(.+)\]\]')
|
||||||
|
|
||||||
|
|
||||||
|
class LinkManager(object):
|
||||||
|
|
||||||
|
implements(ILinkManager)
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.links = {}
|
||||||
|
|
||||||
|
def register(self, link):
|
||||||
|
if link.identifier is None:
|
||||||
|
self.generateIdentifier(link)
|
||||||
|
if link.identifier not in self.links:
|
||||||
|
self.links[link.identifier] = link
|
||||||
|
link.manager = self
|
||||||
|
|
||||||
|
def unregister(self, link):
|
||||||
|
if link.identifier in self.links:
|
||||||
|
del self.links[link.identifier]
|
||||||
|
link.manager = None
|
||||||
|
|
||||||
|
def generateIdentifier(self, link):
|
||||||
|
identifier = '%07i' % (max(self.links.keys() or [0]) + 1)
|
||||||
|
link.identifier = identifier
|
||||||
|
return identifier
|
||||||
|
|
83
wiki/interfaces.py
Normal file
83
wiki/interfaces.py
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Helmut Merz helmutm@cy55.de
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
|
||||||
|
"""
|
||||||
|
Interfaces for Wiki functionality.
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
"""
|
||||||
|
|
||||||
|
from zope.interface import Interface, Attribute
|
||||||
|
|
||||||
|
|
||||||
|
# links
|
||||||
|
|
||||||
|
class ILinkManager(Interface):
|
||||||
|
"""Manages (and possibly contains) links of all kinds.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def register(link):
|
||||||
|
"""Register (store) a link.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def unregister(link):
|
||||||
|
"""Remove a link.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class ILink(Interface):
|
||||||
|
"""A hyperlink between two local or foreign objects.
|
||||||
|
"""
|
||||||
|
|
||||||
|
identifier = Attribute('Identifier of the link, unique within its link manager.')
|
||||||
|
manager = Attribute('The manager that this link is managed by.')
|
||||||
|
formatName = Attribute('Name of the link format that identified the link.')
|
||||||
|
|
||||||
|
source = Attribute('Link source.')
|
||||||
|
target = Attribute('Link target.')
|
||||||
|
|
||||||
|
|
||||||
|
class ILinkFormat(Interface):
|
||||||
|
"""Identifies links in texts and transforms text correspondingly.
|
||||||
|
"""
|
||||||
|
|
||||||
|
manager = Attribute('The link manager this link format is associated with.')
|
||||||
|
|
||||||
|
def unmarshall(text):
|
||||||
|
"""Analyse the text given extracting all links and registering them
|
||||||
|
with the link manager; return text with all links transformed to
|
||||||
|
an internal link naming format.
|
||||||
|
|
||||||
|
This is typically used for preprocessing the text after editing.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def marshall(text):
|
||||||
|
"""Scan text for all links (i.e. substrings corresponding to the
|
||||||
|
internal link naming format) and replace them with their external
|
||||||
|
format.
|
||||||
|
|
||||||
|
This is typically used for preparing a text for editing.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def display(text):
|
||||||
|
"""Scan text for all links (i.e. substrings corresponding to the
|
||||||
|
internal link naming format) and replace them with their display
|
||||||
|
format.
|
||||||
|
|
||||||
|
The result will then be used for rendering by the text format.
|
||||||
|
"""
|
28
wiki/tests.py
Executable file
28
wiki/tests.py
Executable file
|
@ -0,0 +1,28 @@
|
||||||
|
#! /usr/bin/python
|
||||||
|
|
||||||
|
"""
|
||||||
|
Tests for the 'cybertools.wiki' package.
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
"""
|
||||||
|
|
||||||
|
import unittest, doctest
|
||||||
|
from zope.testing.doctestunit import DocFileSuite
|
||||||
|
|
||||||
|
|
||||||
|
class Test(unittest.TestCase):
|
||||||
|
"Basic tests for the wiki package."
|
||||||
|
|
||||||
|
def testBasicStuff(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def test_suite():
|
||||||
|
flags = doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS
|
||||||
|
return unittest.TestSuite((
|
||||||
|
unittest.makeSuite(Test),
|
||||||
|
DocFileSuite('README.txt', optionflags=flags),
|
||||||
|
))
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main(defaultTest='test_suite')
|
Loading…
Add table
Reference in a new issue