1.1 --- a/parser.py Sun Apr 22 23:22:05 2012 +0200
1.2 +++ b/parser.py Mon Apr 23 00:41:42 2012 +0200
1.3 @@ -163,14 +163,67 @@
1.4 link_regexp_str = r"[[](?P<linktext>.*?)]"
1.5 image_regexp_str = r"!(?P<imagetext>.*?)!"
1.6 cellsep_regexp_str = r"(?P<celltype>[|]{1,2})"
1.7 -content_regexp = re.compile(
1.8 +
1.9 +content_regexp_str = (
1.10 "(" + link_regexp_str + ")"
1.11 "|"
1.12 "(" + image_regexp_str + ")"
1.13 + )
1.14 +
1.15 +table_content_regexp_str = (
1.16 + content_regexp_str +
1.17 "|"
1.18 "(" + cellsep_regexp_str + ")"
1.19 )
1.20
1.21 +content_regexp = re.compile(content_regexp_str)
1.22 +table_content_regexp = re.compile(table_content_regexp_str)
1.23 +
1.24 +def translate_content_match(match):
1.25 +
1.26 + "Translate the content described by the given 'match', returning a string."
1.27 +
1.28 + if match.group("linktext"):
1.29 + parts = match.group("linktext").split("|")
1.30 +
1.31 + # NOTE: Proper detection of external links required.
1.32 +
1.33 + if len(parts) > 1 and parts[1].startswith("http"):
1.34 + prefix = ""
1.35 + elif parts[0].startswith("#"):
1.36 + prefix = ""
1.37 + elif parts[0].startswith("^"):
1.38 + prefix = "attachment:"
1.39 + else:
1.40 + prefix = "../"
1.41 +
1.42 + if len(parts) == 1:
1.43 + return "[[%s%s]]" % (prefix, parts[0])
1.44 + elif len(parts) == 2:
1.45 + return "[[%s%s|%s]]" % (prefix, parts[1], parts[0])
1.46 + else:
1.47 + return "[[%s%s|%s|title=%s]]" % (prefix, parts[1], parts[0], parts[2])
1.48 +
1.49 + elif match.group("imagetext"):
1.50 + parts = match.group("imagetext").split("|")
1.51 +
1.52 + # NOTE: Proper detection of external links required.
1.53 +
1.54 + if parts[0].startswith("http"):
1.55 + prefix = ""
1.56 + else:
1.57 + prefix = "attachment:"
1.58 +
1.59 + # NOTE: Proper options conversion required.
1.60 +
1.61 + if len(parts) == 1:
1.62 + return "{{%s%s}}" % (prefix, parts[0])
1.63 + else:
1.64 + return "{{%s%s|%s}}" % (prefix, parts[1], parts[0])
1.65 +
1.66 + else:
1.67 + return match.group()
1.68 +
1.69 def get_table_rows(text):
1.70
1.71 "Return a list of (cellsep, columns) tuples for the given table 'text'."
1.72 @@ -181,7 +234,7 @@
1.73 cellsep = None
1.74 columns = [""]
1.75 last = 0
1.76 - for match in content_regexp.finditer(line):
1.77 + for match in table_content_regexp.finditer(line):
1.78 start, end = match.span()
1.79 columns[-1] += line[last:start]
1.80
1.81 @@ -190,7 +243,7 @@
1.82 cellsep = match.group("celltype")
1.83 columns.append("")
1.84 else:
1.85 - columns[-1] += line[start:end]
1.86 + columns[-1] += match.group()
1.87
1.88 last = end
1.89
1.90 @@ -201,6 +254,22 @@
1.91
1.92 return rows
1.93
1.94 +def translate_content(text):
1.95 +
1.96 + "Return a translation of the given 'text'."
1.97 +
1.98 + parts = []
1.99 +
1.100 + last = 0
1.101 + for match in content_regexp.finditer(text):
1.102 + start, end = match.span()
1.103 + parts.append(text[last:start])
1.104 + parts.append(translate_content_match(match))
1.105 + last = end
1.106 +
1.107 + parts.append(text[last:])
1.108 + return "".join(parts)
1.109 +
1.110 # Translation helpers.
1.111
1.112 blocktypes = {
1.113 @@ -245,7 +314,7 @@
1.114
1.115 "Using 'cellsep', translate the cell 'text'."
1.116
1.117 - return cellextra[cellsep] + text + cellextra[cellsep]
1.118 + return cellextra[cellsep] + translate_content(text) + cellextra[cellsep]
1.119
1.120 sectiontypes = {
1.121 "code" : "",
1.122 @@ -279,7 +348,7 @@
1.123
1.124 elif blocktype == "list":
1.125 for listmarker, listitem in get_list_items(blocktext):
1.126 - print >>out, "%s %s" % (translate_marker(listmarker), listitem)
1.127 + print >>out, "%s %s" % (translate_marker(listmarker), translate_content(listitem))
1.128
1.129 # Translate table items.
1.130
1.131 @@ -291,7 +360,7 @@
1.132 # Handle anonymous blocks.
1.133
1.134 else:
1.135 - print >>out, blocktext.rstrip()
1.136 + print >>out, translate_content(blocktext.rstrip())
1.137
1.138 print >>out
1.139
1.140 @@ -309,7 +378,7 @@
1.141 print >>out, "##", options
1.142 else:
1.143 print >>out, "{{{",
1.144 - print >>out, text,
1.145 + print >>out, translate_content(text),
1.146 print >>out, "}}}"
1.147 print >>out
1.148