Author: ianb
Date: 2004-04-26 22:18:23 -0600 (Mon, 26 Apr 2004)
New Revision: 102
Added:
Wiki/Context/images/
Wiki/Context/images/ed_wikilink.gif
Wiki/Context/quickfind.py
Modified:
Wiki/Context/Main.py
Wiki/Context/SitePage.py
Wiki/Context/__init__.py
Wiki/INSTALL.txt
Wiki/lib/wiki.py
Wiki/lib/wikipage.py
Log:
* Pages can have their own MIME types, text/html being the notable
new entry. (Images and other attachments coming soon)
* New incremental page search to find pages, including javascript
to insert that page link into the textarea.
* WYSIWYG editor (htmlarea).
Modified: Wiki/Context/Main.py
===================================================================
--- Wiki/Context/Main.py 2004-04-25 17:37:28 UTC (rev 101)
+++ Wiki/Context/Main.py 2004-04-27 04:18:23 UTC (rev 102)
@@ -2,6 +2,8 @@
from lib import wikipage
from lib import htmldiff
from WebKit.HTTPExceptions import *
+import tidy
+import re
def test(val, a, b=''):
if val:
@@ -11,6 +13,11 @@
class Main(SitePage):
+ def __init__(self):
+ SitePage.__init__(self)
+ self._inputTypeCleaners = {}
+ self._inputTypeCleaners['htmlarea'] = self.cleanHTMLArea
+
def awake(self, transaction):
SitePage.awake(self, transaction)
req = self.request()
@@ -38,13 +45,18 @@
def actions(self):
return ['edit', 'preview', 'save', 'cancel', 'history',
- 'externalEdit', 'webdav', 'backlinks', 'diff']
+ 'externalEdit', 'webdav', 'backlinks', 'diff',
+ 'changeMimeType', 'simple']
def edit(self):
if self.user() is None:
raise HTTPAuthorizationRequired
+ self.titlePrefix = 'Edit: '
+ mimeType = self.request().field('mimeType', self.page.mimeType)
+ if mimeType != self.page.mimeType and self.page.exists():
+ assert 0, "Content conversion has not yet been implemented"
+ assert mimeType in self.wiki.availableMimeTypes, "Not a legal MIME Type: %r" % mimeType
self.setView('writeEdit')
- self.titlePrefix = 'Edit: '
self.writeHTML()
def preview(self):
@@ -57,11 +69,15 @@
if self.user() is None:
raise HTTPAuthorizationRequired
req = self.request()
- self.page.text = req.field('text')
+ inputType = req.field('inputType')
+ text = req.field('text')
+ text = self._inputTypeCleaners.get(inputType, lambda x:x)(text)
+ self.page.text = text
self.page.title = req.field('title')
self.page.lastChangeLog = req.field('changeLog')
self.page.lastChangeUser = self.user().username()
self.page.keywords = req.field('keywords').split(',')
+ self.page.mimeType = req.field('mimeType')
self.page.save()
self.message('Changes saved')
self.sendRedirectAndEnd(self.link(unversioned=True))
@@ -158,6 +174,14 @@
self.page.text = '\n'.join(lines)
self.page.save()
+ def changeMimeType(self):
+ self.setView('writeChangeMimeType')
+ self.writeHTML()
+
+ def simple(self):
+ self.suppressFooter = True
+ self.writeHTML()
+
########################################
## Views
########################################
@@ -281,36 +305,177 @@
req = self.request()
text = req.field('text', self.page.text)
title = req.field('title', self.page.title)
+ if not self.page.exists() and not req.hasField('title'):
+ title = title.capitalize()
log = req.field('changeLog', '')
keywords = req.field('keywords', ', '.join(self.page.keywords))
- self.write('''<form action="%s" method="POST">
- <input type="text" name="title" value="%s" size=30><br>
- <textarea name="text" rows=10 cols=50 style="width: 100%%">%s</textarea>
+ mimeType = req.field('mimeType', self.page.mimeType)
+ editField = self.editFieldFor(self.page, mimeType)
+ quickFindLink = self.servletLink('quickfind', args={'callParent': 'alert'})
+
+ self.write('''<form action="%(action)s" method="POST">
+ <input type="text" name="title" value="%(title)s" size=30 style="font-size: large">
+ <input type="hidden" name="mimeType" value="%(mimeType)s">
+ MIME type:
+ <tt>%(mimeType)s</tt>
+ <a href="%(mimeChangeLink)s">[change]</a>
+ %(mimeHelpLink)s
<br>
+
+ %(editField)s
+ <br>
+
Describe your changes:<br>
- <input type="text" name="changeLog" size=30 style="width: 100%%" value="%s"><br>
+ <input type="text" name="changeLog" size=30 style="width: 100%%" value="%(log)s"><br>
+
<table cellspacing=0 cellpadding=0 border=0>
<tr><td align=right>Related terms:</td>
- <td><input type="text" name="keywords" size=20 value="%s">
+ <td><input type="text" name="keywords" size=20 value="%(keywords)s">
<i style="font-size: small">(comma separated)
- <a href="%s"><img src="%s" width=15 height=15 border=0 alt="help" title="help on Related Terms"></a>
+ %(relatedHelpLink)s
</i></td></tr>
</table>
+
<input type="submit" name="_action_save" value="Save">
<input type="submit" name="_action_preview" value="Preview">
<input type="submit" name="_action_cancel" value="Cancel">
+ %(popupLink)s
</form>'''
- % (self.page.name,
- self.htmlEncode(title),
- self.htmlEncode(text),
- self.htmlEncode(log),
- self.htmlEncode(keywords),
- self.wiki.page('relatedterms').link,
- 'question_icon.gif'))
+ % {'action': self.page.name,
+ 'title': self.htmlEncode(title),
+ 'editField': editField,
+ 'log': self.htmlEncode(log),
+ 'keywords': self.htmlEncode(keywords),
+ 'mimeType': mimeType,
+ 'mimeChangeLink': self.pageLink(self.page.name, action='changeMimeType'),
+ 'mimeHelpLink': self.helpLink('mimetypes', 'Help on MIME types'),
+ 'relatedHelpLink': self.helpLink('relatedterms', 'Help on related terms'),
+ 'popupLink': self.popupLink(quickFindLink, 'find page'),
+ })
+
+
+ def editFieldFor(self, page, mimeType):
+ if mimeType == 'text/html':
+ return self.editFieldHTML(page)
+ elif mimeType == 'text/x-restructured-text':
+ return self.editFieldRest(page)
+ elif mimeType.startswith('text/'):
+ return self.editFieldText(page)
+ else:
+ assert 0, "Unknown MIME type: %r" % mimeType
+
+ def editFieldText(self, page):
+ text = self.request().field('text', page.text)
+ return ('<textarea name="text" rows=20 cols=50 '
+ 'style="width: 100%%">%s</textarea>\n'
+ '<input type="hidden" name="inputType" value="textarea">'
+ % self.htmlEncode(text))
+
+ def editFieldRest(self, page):
+ text = self.request().field('text', page.text)
+ # Code for selection from:
+ # http://www.alexking.org/blog/2003/06/02/inserting-at-the-cursor-using-javascript/
+ return '''
+ <textarea name="text" id="text" rows=20 cols=50
+ style="width: 100%%" onChange="setCursorPos()"
+ onClick="setCursorPos()">%(text)s</textarea>
+ <input type="hidden" name="inputType" value="restTextarea"><br>
+ <span style="font-size: small">%(insertLink)s | %(markupHelpLink)s</span><br>
+ <script type="text/javascript">
+ function insertAtCursor(field, text) {
+ // IE:
+ if (document.selection) {
+ field.focus();
+ var sel = document.selection.createRange();
+ sel.text = text;
+ }
+ // Mozilla:
+ else if (field.selectionStart
+ || field.selectionStart == "0") {
+ var startPos = field.selectionStart;
+ var endPos = field.selectionEnd;
+ field.value = field.value.substring(0, startPos)
+ + text
+ + field.value.substring(endPos, field.value.length);
+ } else {
+ field.value += text;
+ }
+ }
+ function restlink(name, mimeType, title) {
+ var textarea = document.getElementById("text");
+ var link;
+ if (title.indexOf(" ") == -1) {
+ link = title + "_";
+ } else {
+ link = "`" + title + "`_";
+ }
+ insertAtCursor(textarea, link);
+ }
+ </script>
+ ''' % {'markupHelpLink': self.helpLink('quickresthelp', 'help on markup', useImage=False),
+ 'text': self.htmlEncode(text),
+ 'insertLink': self.popupLink('quickfind?callParent=restlink', 'Insert wiki link'),
+ }
+
+
+ def editFieldHTML(self, page):
+ text = self.request().field('text', page.text)
+ return '''
+ <script type="text/javascript" src="htmlarea.js"></script>
+ <script type="text/javascript" src="lang/en.js"></script>
+ <script type="text/javascript" src="dialog.js"></script>
+ <style type="text/css">
+ @import url(htmlarea.css);
+ </style>
+ <script type="text/javascript">
+ var editor = null;
+ function initEditor() {
+ editor = new HTMLArea("text");
+ var cfg = editor.config;
+ cfg.registerButton({
+ id: "wikilink",
+ tooltip: "link to a wiki page",
+ image: "ed_wikilink.gif",
+ textMode: false,
+ action: function(editor) {
+ window.open("quickfind?callParent=wikilink",
+ "width=400,height=500,location=yes,menubar=no,resizable=yes,scrollbars=yes,status=no,toolbar=no");
+ },
+ context: ""
+ });
+ cfg.toolbar = [
+ ["fontname", "fontsize", "formatblock", "space",
+ "bold", "italic", "separator",
+ "copy", "cut", "paste", "space",
+ "undo", "redo"],
+ ["justifyleft", "justifycenter", "justifyright", "separator",
+ "insertorderedlist", "insertunorderedlist", "outdent", "indent", "separator",
+ "forecolor", "hilitecolor", "textindicator", "separator",
+ "inserthorizontalrule", "createlink", "wikilink", "insertimage", "inserttable", "htmlmode", "separator",
+ "popupeditor", "separator",
+ "showhelp", "about"]
+ ];
+ //cfg.toolbar.push(["linebreak", "wikilink"]);
+ //cfg.imgURL = "htmlarea/images/";
+ //cfg.popupURL = "htmlarea/popups/";
+ editor.generate();
+ }
+ function wikilink(name, mimeType, title) {
+ editor.insertHTML(\'<a href="\' + name + \'.html">\'
+ + title + "</a>");
+ }
+ </script>
+ <textarea name="text" id="text" rows=30 cols=50 style="width: 100%%">%s</textarea>
+ <input type="hidden" name="inputType" value="htmlarea">
+ <script type="text/javascript">
+ initEditor();
+ </script>
+ ''' % self.htmlEncode(text)
def writePreview(self):
text = self.request().field('text')
- self.write(self.page.preview(text))
+ mimeType = self.request().field('mimeType')
+ self.write(self.page.preview(text, mimeType))
self.write('<hr noshade>\n')
self.writeEdit()
@@ -390,3 +555,35 @@
''' % (start, end, end, start))
self.write(diff)
+ def writeChangeMimeType(self):
+ self.write('''<p>
+ Current MIME type:
+ <tt>%s</tt>
+ %s
+ </p>
+ ''' % (self.page.mimeType,
+ self.helpLink('mimetypes', 'Help on MIME types')))
+ self.write('<p>Edit with a different MIME type:</p>\n')
+ for mimeType in self.wiki.availableMimeTypes:
+ self.write('<a href="%s?_action_=edit&mimeType=%s"><tt>%s</tt></a><br>'
+ % (self.page.link, mimeType, mimeType))
+
+ _linkRE = re.compile('href\s*=\s*"(.*?)"', re.I+re.S)
+ def cleanHTMLArea(self, text):
+ text = tidy.parseString(
+ text,
+ break_before_br=True,
+ show_body_only=True)
+ print "Checking out %r" % str(text)
+ text = self._linkRE.sub(self._urlSubber, str(text))
+ return text
+
+ def _urlSubber(self, match):
+ url = match.group(1)
+ baseLink = self.servletLink('', absolute=True)
+ print "Looking for %r in %r" % (baseLink, url)
+ if url.startswith(baseLink):
+ url = url[len(baseLink):]
+ return 'href="%s"' % url
+
+
Modified: Wiki/Context/SitePage.py
===================================================================
--- Wiki/Context/SitePage.py 2004-04-25 17:37:28 UTC (rev 101)
+++ Wiki/Context/SitePage.py 2004-04-27 04:18:23 UTC (rev 102)
@@ -27,6 +27,8 @@
self.wiki.config.baseHref = self.request().adapterName() + '/'
#self.wiki.config.rssFilename = os.path.join(thisDir, 'rss.xml')
self.suppressFooter = False
+ self.response().setHeader(
+ 'content-type', 'text/html; charset=utf-8')
########################################
## Utility methods
@@ -71,6 +73,8 @@
tabs = self.tabs()
+ self.write('\n<!-- %s FOOTER %s -->\n'
+ % ('='*30, '='*30))
self.write('<br>\n')
if tabs:
# tabs hang above the <div>, so we need a bit more padding
@@ -151,7 +155,31 @@
def formatDate(self, date, nonbreaking=False):
return formatDate(date, nonbreaking=nonbreaking)
+ def popupLink(self, link, text):
+ return '<a href="%s" onClick="window.open(\'%s\',\'width=400,height=500,location=yes,menubar=no,resizable=yes,scrollbars=yes,status=no,toolbar=no\'); return false">%s</a>' % (link, link, text)
+ def helpLink(self, dest, text, useImage=True):
+ if useImage:
+ text = '<img src="%s" alt="help" title="%s" width=15 height=15 border=0>' % ('question_icon.gif', text)
+ link = self.wiki.page(dest).link
+ return self.popupLink(link, text)
+
+
+ def pageLink(self, name, action=None, args=None):
+ args = args or {}
+ if action:
+ args['_action_'] = action
+ argsRendered = ['%s=%s' % (self.urlEncode(n), self.urlEncode(v))
+ for (n, v) in args.items()]
+ url = self.request().adapterName() + '/' + name
+ if argsRendered:
+ if '?' in url:
+ url = url + '&'
+ else:
+ url = url + '?'
+ url = url + '&'.join(argsRendered)
+ return url
+
############################################################
## Global setup
############################################################
Modified: Wiki/Context/__init__.py
===================================================================
--- Wiki/Context/__init__.py 2004-04-25 17:37:28 UTC (rev 101)
+++ Wiki/Context/__init__.py 2004-04-27 04:18:23 UTC (rev 102)
@@ -2,35 +2,39 @@
class ExtensionIgnoringParser:
- """
- Given a url like rss.xml, this *specifically* looks for
- rss_xml.py, and if so it overrides the path so it uses that
- file instead of looking for rss.xml; this is important, since
- rss.xml.py doesn't work (for reasonably good reason -- that's
- not a valid Python module filename).
- """
+ """
+ Given a url like rss.xml, this *specifically* looks for
+ rss_xml.py, and if so it overrides the path so it uses that
+ file instead of looking for rss.xml; this is important, since
+ rss.xml.py doesn't work (for reasonably good reason -- that's
+ not a valid Python module filename).
+ """
- def __init__(self, master):
- """
- master is the _FileParser instance we are overriding.
- """
- self.master = master
+ def __init__(self, master):
+ """
+ master is the _FileParser instance we are overriding.
+ """
+ self.master = master
- def parse(self, trans, requestPath):
- if '/' in requestPath[1:] or '.' not in requestPath:
- return self.master.parse(trans, requestPath)
- alternate = requestPath.replace('.', '_')
- alternatePath = os.path.join(
- self.master._path, alternate[1:] + '.py')
- if os.path.exists(alternatePath):
- return self.master.parse(trans, alternate)
- else:
- return self.master.parse(trans, requestPath)
+ def parse(self, trans, requestPath):
+ if '/' in requestPath[1:] or '.' not in requestPath:
+ return self.master.parse(trans, requestPath)
+ alternate = requestPath.replace('.', '_')
+ alternatePath = os.path.join(
+ self.master._path, alternate[1:] + '.py')
+ if os.path.exists(alternatePath):
+ return self.master.parse(trans, alternate)
+ else:
+ return self.master.parse(trans, requestPath)
# Using this magic name puts in our hook:
SubParser = ExtensionIgnoringParser
+# This way htmlarea can appear to be in the current directory (which
+# it likes), but is physically located in a separate directory.
+urlJoins = ['htmlarea/']
+
def contextInitialize(appServer, path):
- # You could put initialization code here to be executed when
- # the context is loaded into WebKit.
- pass
+ pass
+
+
Added: Wiki/Context/images/ed_wikilink.gif
===================================================================
(Binary files differ)
Property changes on: Wiki/Context/images/ed_wikilink.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: Wiki/Context/quickfind.py
===================================================================
--- Wiki/Context/quickfind.py 2004-04-25 17:37:28 UTC (rev 101)
+++ Wiki/Context/quickfind.py 2004-04-27 04:18:23 UTC (rev 102)
@@ -0,0 +1,146 @@
+from SitePage import *
+
+repopulate = '''
+var lastValue = "";
+
+function repopulate() {
+ var search = document.getElementById("search").value.toLowerCase().split(/\s+/);
+ var resultNames = new Array();
+ var resultTitlesCapped = new Array();
+ var resultTitles = new Array();
+ var resultMimeTypes = new Array();
+ var item, i, title, pos;
+ for (i = 0; i < allNames.length; i++) {
+ item = allNames[i];
+ if (searchMatches(search, item)) {
+ resultNames[resultNames.length] = item;
+ title = capitalizeSearch(search, allTitles[i])
+ resultTitlesCapped[resultTitlesCapped.length] = title;
+ resultTitles[resultTitles.length] = allTitles[i];
+ resultMimeTypes[resultMimeTypes.length] = allMimeTypes[i];
+ }
+ }
+ var select = document.getElementById("pages");
+ for (i = select.length; i >= resultNames.length; i--) {
+ select.options[i] = null;
+ }
+ for (i = 0; i < resultNames.length; i++) {
+ select.options[i] = new Option(resultTitlesCapped[i],
+ resultNames[i] + "**" + resultMimeTypes[i]
+ + "**" + resultTitles[i]);
+ }
+ if (! resultNames.length) {
+ select.options[0] = new Option("No results", "");
+ }
+}
+
+function searchMatches(search, term) {
+ term = term.toLowerCase();
+ var i;
+ for (i = 0; i < search.length; i++) {
+ if (term.indexOf(search[i]) == -1) {
+ return false;
+ }
+ }
+ return true;
+}
+
+function capitalizeSearch(search, term) {
+ var i;
+ for (i = 0; i < search.length; i++) {
+ pos = term.toLowerCase().indexOf(search[i]);
+ if (pos != -1) {
+ term = term.substring(0, pos)
+ + term.substring(pos, pos+search[i].length).toUpperCase()
+ + term.substring(pos+search[i].length, term.length);
+ }
+ }
+ return term;
+}
+
+function research() {
+ var search = document.getElementById("search").value;
+ if (search != lastValue) {
+ lastValue = search;
+ repopulate();
+ }
+}
+
+function getSelected() {
+ var select = document.getElementById("pages");
+ var items = select.options[select.selectedIndex].value.split("**");
+ return items;
+}
+
+function callParent(func_name) {
+ var items = getSelected();
+ //window.alert("Calling " + func_name + " of " + window.opener
+ //+ " which is " + window.opener[func_name]);
+ window.opener[func_name](items[0], items[1], items[2]);
+}
+
+function callParentBare(func_name) {
+ var search = document.getElementById("search").value;
+ var name = search.toLowerCase();
+ name = name.replace(/[^a-z]/g, "");
+ window.opener[func_name](name, "text/html", search);
+}
+'''
+
+class quickfind(SitePage):
+
+ def awake(self, trans):
+ SitePage.awake(self, trans)
+ self.suppressFooter = True
+ self.callParent = self.request().field('callParent', '')
+
+ def title(self):
+ return 'Quick Page Find'
+
+ def writeArray(self, name, array):
+ self.write('var %s = new Array(\n' % name)
+ self.write(',\n '.join(
+ [repr(str(v)) for v in array]))
+ self.write(');\n')
+
+ def writeContent(self):
+ onSelect = None
+ if self.callParent:
+ onSelect = 'callParent(%s); window.close();' \
+ % repr(self.callParent)
+ if onSelect:
+ selectAttr = ' onChange="%s"' % onSelect
+ else:
+ selectAttr = ''
+
+ onCreate = "callParentBare(%s); window.close();" \
+ % repr(self.callParent)
+
+ self.write('''
+ <p>All pages on system:</p>
+ Search:<br>
+ <input type="text" id="search" size=20 onKeyUp="research()">
+ <input type="button" value="clear"
+ onClick="document.getElementById('search').value=''; research()">
+ <input type="button" value="create"
+ title="create a new wiki page by the given name"
+ onClick="%s">
+ <br>
+ <select id="pages" size=20 style="width: 60%%"%s>
+ </select><br>
+ <input type="button" value="cancel (close)"
+ onClick="window.close()">
+ ''' % (onCreate, selectAttr))
+
+ self.write('<script type="text/javascript">\n')
+ allPages = self.wiki.allPages()
+ self.writeArray('allNames', [p.name for p in allPages])
+ self.writeArray('allTitles', [p.title for p in allPages])
+ self.writeArray('allMimeTypes', [p.mimeType for p in allPages])
+ self.write(repopulate)
+ self.write('''
+ lastValue = null;
+ research();
+ document.getElementById("search").focus();
+ ''')
+ self.write('\n</script>')
Modified: Wiki/INSTALL.txt
===================================================================
--- Wiki/INSTALL.txt 2004-04-25 17:37:28 UTC (rev 101)
+++ Wiki/INSTALL.txt 2004-04-27 04:18:23 UTC (rev 102)
@@ -35,6 +35,22 @@
[localhost]
alias = canonical.domain.name
+Also, you'll need to install htmlarea, from:
+http://prdownloads.sourceforge.net/itools-htmlarea/HTMLArea-3.0-beta.zip?download
+
+Or check here for the latest version:
+http://prdownloads.sourceforge.net/itools-htmlarea/
+
+Or maybe check out CVS:
+http://sourceforge.net/cvs/?group_id=69750
+
+Once you've downloaded and unzipped, move it into
+``w4py.org/Wiki/Context/htmlarea``. Also, rename the file
+``index.html`` to ``htmlarea_index.html`` (``index.html`` will serve
+as an unfortunate catch-all if you don't do this).
+
+Also install utidy from: http://utidylib.sourceforge.net/
+
Then you should be all set!
-- Ian Bicking 26 Apr 2004
Modified: Wiki/lib/wiki.py
===================================================================
--- Wiki/lib/wiki.py 2004-04-25 17:37:28 UTC (rev 101)
+++ Wiki/lib/wiki.py 2004-04-27 04:18:23 UTC (rev 102)
@@ -275,7 +275,13 @@
def shortRepr(self):
if not self.canonical:
-
return 'Wiki:%s' % self.config.domain
else:
- return 'Wiki:%s aliases %s' % (self.config.domain, self.config.canonicalDomain)
+ return 'Wiki:%s aliases %s' % (self.config.domain,
+ self.config.canonicalDomain)
+
+ availableMimeTypes = [
+ 'text/x-restructured-text',
+ 'text/html',
+ 'text/plain',
+ ]
Modified: Wiki/lib/wikipage.py
===================================================================
--- Wiki/lib/wikipage.py 2004-04-25 17:37:28 UTC (rev 101)
+++ Wiki/lib/wikipage.py 2004-04-27 04:18:23 UTC (rev 102)
@@ -106,7 +106,7 @@
def rerender(self):
filename = self.basePath + ".html"
f = open(filename, 'w')
- html = self._convertText(self.text)
+ html = self._convertText(self.text, self.mimeType)
f.write(html)
f.close()
if self._checkErrors(html):
@@ -126,11 +126,11 @@
return True
return self.wiki.config.readOnly
- def preview(self, text):
+ def preview(self, text, mimeType):
"""Returns an HTML preview of the text"""
- return self._subWikiLinks(self._convertText(text))
+ return self._subWikiLinks(self._convertText(text, mimeType))
- _wikiLinkRE = re.compile(r'(<a [^>]* href=")!(.*?)("[^>]*>)(.*?)(</a>)',
+ _wikiLinkRE = re.compile(r'(<a [^>]* href=")([a-z]+(?:\.[a-z]+)?)("[^>]*>)(.*?)(</a>)',
re.I+re.S)
@@ -193,7 +193,13 @@
text = text.strip() + '\n'
self._text = text
- def _convertText(self, text):
+ def _convertText(self, text, mimeType):
+ if mimeType == 'text/x-restructured-text':
+ return self._convertRest(text, mimeType)
+ else:
+ return text
+
+ def _convertRest(self, text, mimeType):
try:
return self._cleanHTML(core.publish_string(
source=text,
@@ -345,7 +351,7 @@
f.write(self._text)
f.close()
f = open(self.basePath + ".html", 'w')
- html = self._convertText(self._text)
+ html = self._convertText(self._text, self.mimeType)
f.write(html)
f.close()
self.hasParseErrors = self._checkErrors(html)
@@ -406,12 +412,8 @@
refname = node['refname']
node.resolved = 1
node['class'] = 'wiki'
- # I put a ! here to distinguish Wiki links from other
- # links -- Wiki links have to be fixed up at view time,
- # to distinguish between dangling and resolved Wiki
- # links.
refuri = canonicalName(refname)
- node['refuri'] = '!' + refuri
+ node['refuri'] = refuri
del node['refname']
class WikiLink(Transform):
|