diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2008-11-29 13:39:55 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2008-11-29 13:39:55 +0200 |
commit | 88befee77fdaacc2e0dc92beffd1c6a68f86a8b7 (patch) | |
tree | c0cc395d493b44f1a3bfae313e04176b55a8ecfc | |
parent | f7a8c1c22c8e362e94768d3e93d74a85f82a3b1a (diff) | |
download | wikitrans-88befee77fdaacc2e0dc92beffd1c6a68f86a8b7.tar.gz wikitrans-88befee77fdaacc2e0dc92beffd1c6a68f86a8b7.tar.bz2 |
Handle links inside link texts
-rw-r--r-- | wikimarkup.py | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/wikimarkup.py b/wikimarkup.py index 46aa839..429a02a 100644 --- a/wikimarkup.py +++ b/wikimarkup.py @@ -23,14 +23,14 @@ __all__ = [ "BaseWikiMarkup", "WikiMarkup" ] eltbeg = re.compile("=+|(^----$)|^[\\*#:]+") eltre = re.compile("(\\[\\[)|(\\{\\{)|\\[|(\\'\\'\\'?)") delims = { "[[" : re.compile("\\||(\\]\\])"), "{{" : re.compile("\\||(\\}\\})") } term = { "[[" : "]]" , "{{" : "}}" } -ends = { "[[" : re.compile("\\]\\]"), - "{{" : re.compile("\\}\\}") } +ends = { "[[" : re.compile("(\\[\\[)|(\\]\\])"), + "{{" : re.compile("(\\{\\{)|(\\}\\})") } itend = re.compile("\\'\\'($|[^\\'])") boend = re.compile("\\'\\'\\'($|[^\\'])") class BaseWikiMarkup: """ A base class for handling Wiki markups. @@ -112,12 +112,27 @@ It handles: return -1 elif d.start(0) == pos or line[d.start(0)-1] != "'": return d.start(0) else: pos = d.start(0) + 1 + def linkend(self, paren, line, pos): + r = ends[paren] + count = 1 + while count > 0: + m = r.search(line, pos); + if not m: + return len(line), len(line) + else: + pos = m.end(0) + if m.group(0) == paren: + count += 1 + else: + count -= 1 + return m.start(0), m.end(0) + la = None def putback(self, line): self.la = line def nextkn(self, curlev=0, type = -1): while 1: @@ -169,14 +184,13 @@ It handles: yield(self.BAR,) else: if curlev > 0: self.putback(line) break yield(self.getkn(line)) - - + def getkn(self, line): pos = 0 while 1: if pos == len(line): break; m = eltre.search(line, pos) @@ -186,16 +200,15 @@ It handles: else: yield(self.TEXT, line[pos:m.start(0)]) pos = m.end(0) if m.group(0) == "[[" or m.group(0) == "{{": d = delims[m.group(0)].search(line, pos) if d.group(0) == "|": - e = ends[m.group(0)].search(line, d.end(0)) target = (self.TEXT, line[pos:d.start(0)]) - text = (self.SEQ, self.getkn(line[d.end(0):e.start(0)])) - pos = e.end(0) + (start,pos) = self.linkend(m.group(0), line, m.end(0)) + text = (self.SEQ, self.getkn(line[d.end(0):start])) elif d.group(0) == term[m.group(0)]: target = (self.TEXT, line[pos:d.start(0)]) text = (self.NIL,) pos = d.end(0) if m.group(0) == "[[": yield(self.LINK, target, text) |