From ac22cb54c2989e484469543d9c5995488bc8b8c9 Mon Sep 17 00:00:00 2001 From: Lukas P Date: Wed, 6 Jan 2016 16:55:45 +0100 Subject: [PATCH] Collision avoidance for attachments in same namespace --- doku.py | 2 +- moin2doku.py | 16 +++++++++++----- moinformat.py | 4 +++- text_dokuwiki.py | 19 +++++++++++++------ 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/doku.py b/doku.py index ad94aa9..a70abe5 100644 --- a/doku.py +++ b/doku.py @@ -29,5 +29,5 @@ class DokuWiki: cmd = ['./doku.php', method ] + args res = subprocess.Popen(cmd, stdin = None, stdout = subprocess.PIPE, stderr = sys.stderr, close_fds = True).communicate() self.callcache[key] = unicode(res[0].decode('utf-8')) - print "%s->%s" % (cmd, self.callcache[key]) + #print "%s->%s" % (cmd, self.callcache[key]) return self.callcache[key] diff --git a/moin2doku.py b/moin2doku.py index 8d64bb3..7e59bc5 100755 --- a/moin2doku.py +++ b/moin2doku.py @@ -20,6 +20,7 @@ from os import listdir, mkdir from os.path import isdir, basename from doku import DokuWiki from moinformat import moin2doku +import random USEC = 1000000 @@ -63,7 +64,7 @@ def writefile(filename, content, overwrite=False): # page = MoinMoin Page oject # ns = DokuWiki namespace where attachments to copy -def copy_attachments(page, ns): +def copy_attachments(page, ns,randomID): srcdir = page.getPagePath('attachments', check_create = 0) if not isdir(srcdir): return @@ -75,7 +76,7 @@ def copy_attachments(page, ns): attachments = listdir(srcdir) for attachment in attachments: src = os.path.join(srcdir, attachment) - dst = os.path.join(output_dir, 'media', dw.mediaFN(dw.cleanID("%s/%s" % (ns, attachment)))) + dst = os.path.join(output_dir, 'media', dw.mediaFN(dw.cleanID("%s/%s" % (ns, str(randomID)+attachment)))) copyfile(src, dst) copystat(src, dst) @@ -157,8 +158,10 @@ def convert_editlog(page, output = None, overwrite = False): def convertfile(page, output = None, overwrite = False): pagedir = page.getPagePath() pagename = wikiname(pagedir) + if not output: - output = pagename + output = pagename.split("/") + if page.isUnderlayPage(): print "underlay: %s" % page.request.cfg.data_underlay_dir @@ -174,6 +177,9 @@ def convertfile(page, output = None, overwrite = False): else: revs = [current_rev] + # Generate random ID Number for collision avoidance when attachments in Namespace have the same name + randomID = random.randint(101,999) + for rev in revs: page = Page(request, pagename, rev = rev) pagefile, realrev, exists = page.get_rev(rev = rev); @@ -200,7 +206,7 @@ def convertfile(page, output = None, overwrite = False): else: out_file = os.path.join(output_dir, 'attic', dw.wikiFN(output, str(mtime))) - content = moin2doku(pagename, page.get_raw_body()) + content = moin2doku(pagename, page.get_raw_body(),randomID) if len(content) == 0: # raise Exception, "No content" print "NO CONTENT: exists: %s,%s" % (exists, os.path.exists(pagefile)) @@ -209,7 +215,7 @@ def convertfile(page, output = None, overwrite = False): copystat(pagefile, out_file) ID = dw.cleanID(output) - copy_attachments(page, dw.getNS(ID)) + copy_attachments(page, dw.getNS(ID),randomID) # convert edit-log, it's always present even if current page is not convert_editlog(page, output = output, overwrite = overwrite) diff --git a/moinformat.py b/moinformat.py index 846984f..785d7de 100755 --- a/moinformat.py +++ b/moinformat.py @@ -18,9 +18,11 @@ from text_dokuwiki import Formatter import sys import StringIO -def moin2doku(pagename, text): +def moin2doku(pagename, text, randomID=None): parser = Parser(text, request) + formatter.setRandomID(randomID) + # this needed for macros request.formatter = formatter diff --git a/text_dokuwiki.py b/text_dokuwiki.py index cb444f8..99fd531 100644 --- a/text_dokuwiki.py +++ b/text_dokuwiki.py @@ -31,10 +31,13 @@ class Formatter(FormatterBase): self.in_pre = 0 self.in_table = 0 self._text = None # XXX does not work with links in headings!!!!! - + self.randomID= None self.list_depth = 0 self.list_type = ' ' + def setRandomID(self,ID): + self.randomID = str(ID) + def _escape(self, text, extra_mapping={"'": "'", '"': """}): return saxutils.escape(text, extra_mapping) @@ -78,13 +81,16 @@ class Formatter(FormatterBase): return ('[[%s|' % (self._escape(url)), ']]')[not on] def attachment_link(self, on, url=None, querystr=None, **kw): - return '{{ %s | %s }}' % (url, querystr) + if on: + return '{{ %s | }}' % (self.randomID+url) + else: + return ' }}' def attachment_image(self, url, **kw): - return '{{%s|}}' % (url,) + return '{{%s|}}' % (self.randomID+url,) def attachment_drawing(self, url, text, **kw): - return '{{%s|%s}}' % (url, text) + return '{{%s|%s}}' % (self.randomID+url, text) def text(self, text, **kw): self._did_para = 0 @@ -291,7 +297,7 @@ class Formatter(FormatterBase): def showAttachedFiles(args): args = args.split(',') - return self.attachment_link(1,url=args[0].strip(),querystr=args[1].strip()) + return '{{ %s | %s }}' % (self.randomID+args[0].strip(), args[1].strip()) # function which will just do what parent class would def inherit(args): @@ -303,7 +309,8 @@ class Formatter(FormatterBase): 'MailTo' : email, 'GetText' : args, 'ShowSmileys' : inherit, - 'ShowAttachedFiles' : showAttachedFiles + 'ShowAttachedFiles' : showAttachedFiles, + 'Include' : inherit }[name] except KeyError: lookup = '/* UndefinedMacro: %s(%s) */' % (name, args)