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 | |||
@@ -26,8 +26,8 @@ eltre = re.compile("(\\[\\[)|(\\{\\{)|\\[|(\\'\\'\\'?)") | |||
26 | delims = { "[[" : re.compile("\\||(\\]\\])"), | 26 | delims = { "[[" : re.compile("\\||(\\]\\])"), |
27 | "{{" : re.compile("\\||(\\}\\})") } | 27 | "{{" : re.compile("\\||(\\}\\})") } |
28 | term = { "[[" : "]]" , "{{" : "}}" } | 28 | term = { "[[" : "]]" , "{{" : "}}" } |
29 | ends = { "[[" : re.compile("\\]\\]"), | 29 | ends = { "[[" : re.compile("(\\[\\[)|(\\]\\])"), |
30 | "{{" : re.compile("\\}\\}") } | 30 | "{{" : re.compile("(\\{\\{)|(\\}\\})") } |
31 | itend = re.compile("\\'\\'($|[^\\'])") | 31 | itend = re.compile("\\'\\'($|[^\\'])") |
32 | boend = re.compile("\\'\\'\\'($|[^\\'])") | 32 | boend = re.compile("\\'\\'\\'($|[^\\'])") |
33 | 33 | ||
@@ -115,6 +115,21 @@ It handles: | |||
115 | else: | 115 | else: |
116 | pos = d.start(0) + 1 | 116 | pos = d.start(0) + 1 |
117 | 117 | ||
118 | def linkend(self, paren, line, pos): | ||
119 | r = ends[paren] | ||
120 | count = 1 | ||
121 | while count > 0: | ||
122 | m = r.search(line, pos); | ||
123 | if not m: | ||
124 | return len(line), len(line) | ||
125 | else: | ||
126 | pos = m.end(0) | ||
127 | if m.group(0) == paren: | ||
128 | count += 1 | ||
129 | else: | ||
130 | count -= 1 | ||
131 | return m.start(0), m.end(0) | ||
132 | |||
118 | la = None | 133 | la = None |
119 | def putback(self, line): | 134 | def putback(self, line): |
120 | self.la = line | 135 | self.la = line |
@@ -172,8 +187,7 @@ It handles: | |||
172 | self.putback(line) | 187 | self.putback(line) |
173 | break | 188 | break |
174 | yield(self.getkn(line)) | 189 | yield(self.getkn(line)) |
175 | 190 | ||
176 | |||
177 | def getkn(self, line): | 191 | def getkn(self, line): |
178 | pos = 0 | 192 | pos = 0 |
179 | while 1: | 193 | while 1: |
@@ -189,10 +203,9 @@ It handles: | |||
189 | if m.group(0) == "[[" or m.group(0) == "{{": | 203 | if m.group(0) == "[[" or m.group(0) == "{{": |
190 | d = delims[m.group(0)].search(line, pos) | 204 | d = delims[m.group(0)].search(line, pos) |
191 | if d.group(0) == "|": | 205 | if d.group(0) == "|": |
192 | e = ends[m.group(0)].search(line, d.end(0)) | ||
193 | target = (self.TEXT, line[pos:d.start(0)]) | 206 | target = (self.TEXT, line[pos:d.start(0)]) |
194 | text = (self.SEQ, self.getkn(line[d.end(0):e.start(0)])) | 207 | (start,pos) = self.linkend(m.group(0), line, m.end(0)) |
195 | pos = e.end(0) | 208 | text = (self.SEQ, self.getkn(line[d.end(0):start])) |
196 | elif d.group(0) == term[m.group(0)]: | 209 | elif d.group(0) == term[m.group(0)]: |
197 | target = (self.TEXT, line[pos:d.start(0)]) | 210 | target = (self.TEXT, line[pos:d.start(0)]) |
198 | text = (self.NIL,) | 211 | text = (self.NIL,) |