Skip to content

Commit

Permalink
format: Improve diff formatting
Browse files Browse the repository at this point in the history
Aplly formatting logic to changed parts as well.

Fixes #7246
  • Loading branch information
nijel committed Feb 24, 2022
1 parent 7f82aff commit 41641ae
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 17 deletions.
31 changes: 15 additions & 16 deletions weblate/trans/templatetags/translations.py
Expand Up @@ -63,6 +63,9 @@
SPACE_TEMPLATE = '<span class="{}"><span class="sr-only">{}</span></span>'
SPACE_SPACE = SPACE_TEMPLATE.format("space-space", " ")
SPACE_NL = HIGHLIGTH_SPACE.format(SPACE_TEMPLATE.format("space-nl", ""), "<br />")
SPACE_START = '<span class="hlspace"><span class="space-space"><span class="sr-only">'
SPACE_MIDDLE = '</span></span><span class="space-space"><span class="sr-only">'
SPACE_END = "</span></span></span>"

GLOSSARY_TEMPLATE = """<span class="glossary-term" title="{}">"""

Expand Down Expand Up @@ -123,19 +126,14 @@ def parse_diff(self):
offset = 0
for op, data in diff:
if op == dmp.DIFF_DELETE:
self.tags[offset].append(
"<del>{}</del>".format(SPACE_SPACE if data == " " else escape(data))
formatter = Formatter(
0, data, self.unit, self.terms, None, self.search_match, self.match
)
formatter.parse()
self.tags[offset].append(f"<del>{formatter.format()}</del>")
elif op == dmp.DIFF_INSERT:
self.tags[offset].append("<ins>")
if data == " ":
# This matches SPACE_SPACE
self.tags[offset].append(
'<span class="space-space"><span class="sr-only">'
)
offset += len(data)
if data == " ":
self.tags[offset].insert(0, "</span></span>")
self.tags[offset].insert(0, "</ins>")
elif op == dmp.DIFF_EQUAL:
offset += len(data)
Expand Down Expand Up @@ -208,14 +206,10 @@ def parse_search(self):
def parse_whitespace(self):
"""Highlight whitespaces."""
for match in MULTISPACE_RE.finditer(self.value):
self.tags[match.start()].append(
'<span class="hlspace"><span class="space-space"><span class="sr-only">'
)
self.tags[match.start()].append(SPACE_START)
for i in range(match.start() + 1, match.end()):
self.tags[i].insert(
0, '</span></span><span class="space-space"><span class="sr-only">'
)
self.tags[match.end()].insert(0, "</span></span></span>")
self.tags[i].insert(0, SPACE_MIDDLE)
self.tags[match.end()].insert(0, SPACE_END)

for match in WHITESPACE_RE.finditer(self.value):
whitespace = match.group(0)
Expand All @@ -239,6 +233,11 @@ def format(self):
was_cr = False
newlines = {"\r", "\n"}
for pos, char in enumerate(value):
# Special case for single whitespace char in diff
if char == " " and "<ins>" in tags[pos] and "</ins>" in tags[pos + 1]:
tags[pos].append(SPACE_START)
tags[pos + 1].insert(0, SPACE_END)

output.append("".join(tags[pos]))
if char in newlines:
is_cr = char == "\r"
Expand Down
58 changes: 57 additions & 1 deletion weblate/trans/tests/test_templatetags.py
Expand Up @@ -224,12 +224,68 @@ def test_diff(self):
"""
Hello
<del>
<span class="space-space"><span class="sr-only"> </span></span>
<span class="hlspace">
<span class="space-space"><span class="sr-only"> </span></span>
</span>
</del>
world
""",
)

def test_diff_whitespace(self):
self.assertHTMLEqual(
format_translation(
"Helloworld",
self.component.source_language,
diff="Hello world",
)["items"][0]["content"],
"""Hello
<del>
<span class="hlspace">
<span class="space-space"><span class="sr-only"> </span></span>
</span>
</del>
world
""",
)
self.assertHTMLEqual(
format_translation(
"Hello world",
self.component.source_language,
diff="Helloworld",
)["items"][0]["content"],
"""Hello
<ins>
<span class="hlspace">
<span class="space-space"><span class="sr-only"> </span></span>
</span>
</ins>
world
""",
)

def test_diff_newline(self):
self.assertHTMLEqual(
format_translation(
"Hello world",
self.component.source_language,
diff="Hello\nworld",
)["items"][0]["content"],
"""Hello
<del>
<span class="hlspace">
<span class="space-nl"><span class="sr-only"></span></span>
</span><br />
</del>
<ins>
<span class="hlspace">
<span class="space-space"><span class="sr-only"> </span></span>
</span>
</ins>
world
""",
)

def test_glossary(self):
self.assertHTMLEqual(
format_translation(
Expand Down

0 comments on commit 41641ae

Please sign in to comment.