From b26aca06fd724f41f012a64c404ff690c462baf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar?= Date: Sun, 7 Nov 2021 18:01:31 +0100 Subject: [PATCH] Fix referenced image links (#176) --- mdpo/md2po/__init__.py | 55 +++++++++------- mdpo/po2md/__init__.py | 62 +++++++++++-------- .../extract-examples/markuptext/images.md | 13 ++-- .../markuptext/images.md.expect.po | 23 +++++-- test/test_po2md/translate-examples/images.md | 15 +++-- .../translate-examples/images.md.expect.md | 14 +++-- test/test_po2md/translate-examples/images.po | 25 +++++--- 7 files changed, 130 insertions(+), 77 deletions(-) diff --git a/mdpo/md2po/__init__.py b/mdpo/md2po/__init__.py index b8031584..994dd710 100644 --- a/mdpo/md2po/__init__.py +++ b/mdpo/md2po/__init__.py @@ -705,6 +705,9 @@ def enter_span(self, span, details): # save the index char of the opening backtick self._codespan_start_index = len(self._current_msgid) - 1 elif span is md4c.SpanType.IMG: + if self._link_references is None: + self._link_references = parse_link_references(self.content) + self._current_imgspan['src'] = details['src'][0][1] self._current_imgspan['title'] = '' if not details['title'] \ else details['title'][0][1] @@ -784,30 +787,36 @@ def leave_span(self, span, details): ) self._codespan_backticks = None elif span is md4c.SpanType.IMG: - # TODO: refactor with getattr? Currently getting next error - # getattr(self, target_varname) += '![{}]({}'.format( - # SyntaxError: cannot assign to function call - - if not self._inside_aspan: - self._current_msgid += '![{}]({}'.format( - self._current_imgspan['text'], - self._current_imgspan['src'], - ) - title = self._current_imgspan['title'] - if title: - self._current_msgid += f' "{title}"' - self._current_msgid += ')' - self._current_imgspan = {} + referenced_target, imgspan_title = (None, None) + imgspan_src = details['src'][0][1] + if details['title']: + imgspan_title = details['title'][0][1] + for target, href, title in self._link_references: + if href == imgspan_src and title == imgspan_title: + referenced_target = target + break else: - self._current_aspan_text += '![{}]({}'.format( - self._current_imgspan['text'], - self._current_imgspan['src'], - ) - title = self._current_imgspan['title'] - if title: - self._current_aspan_text += f' "{title}"' - self._current_aspan_text += ')' - self._current_imgspan = {} + for target, href, _ in self._link_references: + if href == imgspan_src: + referenced_target = target + break + + alt_text = self._current_imgspan['text'] + img_markup = f'![{alt_text}]' + if referenced_target: + img_markup += f'[{referenced_target}]' + else: + img_markup += f'({imgspan_src}' + if imgspan_title: + img_markup += f' "{imgspan_title}"' + img_markup += ')' + + self._current_imgspan = {} + + if self._inside_aspan: + self._current_aspan_text += img_markup + else: + self._current_msgid += img_markup elif span is md4c.SpanType.U: self._inside_uspan = False diff --git a/mdpo/po2md/__init__.py b/mdpo/po2md/__init__.py index 16ee9d14..04883aeb 100644 --- a/mdpo/po2md/__init__.py +++ b/mdpo/po2md/__init__.py @@ -722,6 +722,9 @@ def enter_span(self, span, details): self._codespan_start_index = len(self._current_msgid)-1 self._codespan_inside_current_msgid = True elif span is md4c.SpanType.IMG: + if self._link_references is None: + self._link_references = parse_link_references(self.content) + self._current_imgspan['title'] = '' if not details['title'] \ else details['title'][0][1] self._current_imgspan['src'] = details['src'][0][1] @@ -794,30 +797,37 @@ def leave_span(self, span, details): ) self._codespan_backticks = None elif span is md4c.SpanType.IMG: - # TODO: refactor with getattr? Currently getting next error - # getattr(self, target_varname) += '![{}]({}'.format( - # SyntaxError: cannot assign to function call - - if not self._inside_aspan: - self._current_msgid += '![{}]({}'.format( - self._current_imgspan['text'], - self._current_imgspan['src'], - ) - if self._current_imgspan['title']: - title = self._current_imgspan['title'] - self._current_msgid += f' "{title}"' - self._current_msgid += ')' + referenced_target, imgspan_title = (None, None) + imgspan_src = details['src'][0][1] + if details['title']: + imgspan_title = details['title'][0][1] + for target, href, title in self._link_references: + if href == imgspan_src and title == imgspan_title: + referenced_target = target + break else: - self._current_aspan_text += '![{}]({}'.format( - self._current_imgspan['text'], - self._current_imgspan['src'], - ) - if self._current_imgspan['title']: - title = self._current_imgspan['title'] - self._current_aspan_text += f' "{title}"' - self._current_aspan_text += ')' + for target, href, _ in self._link_references: + if href == imgspan_src: + referenced_target = target + break + + alt_text = self._current_imgspan['text'] + img_markup = f'![{alt_text}]' + if referenced_target: + img_markup += f'[{referenced_target}]' + else: + img_markup += f'({imgspan_src}' + if imgspan_title: + img_markup += f' "{imgspan_title}"' + img_markup += ')' + self._current_imgspan = {} + if self._inside_aspan: + self._current_aspan_text += img_markup + else: + self._current_msgid += img_markup + def text(self, block, text): # raise 'text' event if raise_skip_event( @@ -891,7 +901,7 @@ def _append_link_references(self): # 'link_reference' event pre_events = self.events.get('link_reference') - _references_added = [] # don't repeat references + added_references = [] # don't repeat references for target, href, title in self._link_references: if pre_events: skip = False @@ -901,18 +911,18 @@ def _append_link_references(self): if skip: continue - href_part = '{}{}'.format( + href_title = '{}{}'.format( f' {href}' if href else '', f' "{title}"' if title else '', ) - if href_part in _references_added: + if href_title in added_references: continue - msgid = '{}{}'.format(f'[{target}]:', href_part) + msgid = '{}{}'.format(f'[{target}]:', href_title) self._outputlines.append( self._translate_msgid(msgid, None, None), ) - _references_added.append(href_part) + added_references.append(href_title) self._outputlines.append('') def translate( diff --git a/test/test_md2po/extract-examples/markuptext/images.md b/test/test_md2po/extract-examples/markuptext/images.md index a4f7f4ad..a9a7cbd2 100644 --- a/test/test_md2po/extract-examples/markuptext/images.md +++ b/test/test_md2po/extract-examples/markuptext/images.md @@ -4,14 +4,17 @@ ![Hail Tux!](/assets/images/tux.png "Use linux, don't be crazy") -![Alt text][id] - -[id]: url/to/image "Optional title attribute" +![Alt text][1] My ![foo bar](/path/to/train.jpg "title") [![Image inside inline link](https://image.ext)](https://link.ext) -[![Image inside referenced link](https://image.ext)][1] +[![Image inside referenced link](https://image.ext)][2] + +[![Referenced link image inside referenced link][3]][4] -[1]: https://link-1.ext +[1]: url/to/image "Optional title attribute" +[2]: https://link-2.ext +[3]: https://image-3.ext +[4]: https://link-4.ext 'Referenced link image with title' diff --git a/test/test_md2po/extract-examples/markuptext/images.md.expect.po b/test/test_md2po/extract-examples/markuptext/images.md.expect.po index bf0ecd57..7325426d 100644 --- a/test/test_md2po/extract-examples/markuptext/images.md.expect.po +++ b/test/test_md2po/extract-examples/markuptext/images.md.expect.po @@ -11,7 +11,7 @@ msgstr "" msgid "![Hail Tux!](/assets/images/tux.png \"Use linux, don't be crazy\")" msgstr "" -msgid "![Alt text](url/to/image \"Optional title attribute\")" +msgid "![Alt text][1]" msgstr "" msgid "My ![foo bar](/path/to/train.jpg \"title\")" @@ -20,13 +20,24 @@ msgstr "" msgid "[![Image inside inline link](https://image.ext)](https://link.ext)" msgstr "" -msgid "[![Image inside referenced link](https://image.ext)][1]" +msgid "[![Image inside referenced link](https://image.ext)][2]" msgstr "" +msgid "[![Referenced link image inside referenced link][3]][4]" +msgstr "" + +#, fuzzy +msgid "[1]: url/to/image \"Optional title attribute\"" +msgstr "[1]: url/to/image \"Optional title attribute\"" + +#, fuzzy +msgid "[2]: https://link-2.ext" +msgstr "[2]: https://link-2.ext" + #, fuzzy -msgid "[id]: url/to/image \"Optional title attribute\"" -msgstr "[id]: url/to/image \"Optional title attribute\"" +msgid "[3]: https://image-3.ext" +msgstr "[3]: https://image-3.ext" #, fuzzy -msgid "[1]: https://link-1.ext" -msgstr "[1]: https://link-1.ext" +msgid "[4]: https://link-4.ext \"Referenced link image with title\"" +msgstr "[4]: https://link-4.ext \"Referenced link image with title\"" diff --git a/test/test_po2md/translate-examples/images.md b/test/test_po2md/translate-examples/images.md index 6a0b3c92..14e3f237 100644 --- a/test/test_po2md/translate-examples/images.md +++ b/test/test_po2md/translate-examples/images.md @@ -4,14 +4,19 @@ ![Hail Tux!](/assets/images/tux.png "Use linux, don't be crazy") -![Alt text][id] - -[id]: url/to/image "Optional title attribute" +![Alt text][1] My ![foo bar](/path/to/train.jpg "title") [![Image inside inline link](https://image.ext)](https://link.ext) -[![Image inside referenced link](https://image.ext)][1] +[![Image inside referenced link](https://image.ext)][2] + +[![Image inside referenced link](https://image.ext)][2] + +[![Referenced link image inside referenced link][3]][4] -[1]: https://link-1.ext +[1]: url/to/image "Optional title attribute" +[2]: https://link-2.ext +[3]: https://image-3.ext +[4]: https://link-4.ext 'Referenced link image with title' diff --git a/test/test_po2md/translate-examples/images.md.expect.md b/test/test_po2md/translate-examples/images.md.expect.md index b4ae89da..25bfc7b1 100644 --- a/test/test_po2md/translate-examples/images.md.expect.md +++ b/test/test_po2md/translate-examples/images.md.expect.md @@ -4,13 +4,19 @@ ![Hail Tux!](/assets/images/tux.png "Usa linux, no seas loco") -![Texto alternativo](url/to/imagen "Atributo título opcional") +![Texto alternativo][1] Mi ![foo bar](/path/to/tren.jpg "título") [![Imagen dentro de link en línea](https://image.ext)](https://enlace.ext) -[![Imagen dentro de link referenciado](https://imagen.ext)][1] +[![Imagen dentro de link referenciado](https://imagen.ext)][2] -[id]: url/a/imagen "Título de atributo opcional" -[1]: https://enlace-1.ext +[![Imagen dentro de link referenciado](https://imagen.ext)][2] + +[![Imagen con link referenciado dentro de link referenciado][3]][4] + +[1]: url/a/imagen "Título de atributo opcional" +[2]: https://enlace-2.ext +[3]: https://imagen-3.ext +[4]: https://enlace-4.ext "Link de imagen referenciado con título" diff --git a/test/test_po2md/translate-examples/images.po b/test/test_po2md/translate-examples/images.po index 26e752f2..59237f7b 100644 --- a/test/test_po2md/translate-examples/images.po +++ b/test/test_po2md/translate-examples/images.po @@ -11,8 +11,8 @@ msgstr "![](/assets/favicon.ico)" msgid "![Hail Tux!](/assets/images/tux.png \"Use linux, don't be crazy\")" msgstr "![Hail Tux!](/assets/images/tux.png \"Usa linux, no seas loco\")" -msgid "![Alt text](url/to/image \"Optional title attribute\")" -msgstr "![Texto alternativo](url/to/imagen \"Atributo título opcional\")" +msgid "![Alt text][1]" +msgstr "![Texto alternativo][1]" msgid "My ![foo bar](/path/to/train.jpg \"title\")" msgstr "Mi ![foo bar](/path/to/tren.jpg \"título\")" @@ -20,11 +20,20 @@ msgstr "Mi ![foo bar](/path/to/tren.jpg \"título\")" msgid "[![Image inside inline link](https://image.ext)](https://link.ext)" msgstr "[![Imagen dentro de link en línea](https://image.ext)](https://enlace.ext)" -msgid "[![Image inside referenced link](https://image.ext)][1]" -msgstr "[![Imagen dentro de link referenciado](https://imagen.ext)][1]" +msgid "[![Image inside referenced link](https://image.ext)][2]" +msgstr "[![Imagen dentro de link referenciado](https://imagen.ext)][2]" -msgid "[id]: url/to/image \"Optional title attribute\"" -msgstr "[id]: url/a/imagen \"Título de atributo opcional\"" +msgid "[![Referenced link image inside referenced link][3]][4]" +msgstr "[![Imagen con link referenciado dentro de link referenciado][3]][4]" -msgid "[1]: https://link-1.ext" -msgstr "[1]: https://enlace-1.ext" +msgid "[1]: url/to/image \"Optional title attribute\"" +msgstr "[1]: url/a/imagen \"Título de atributo opcional\"" + +msgid "[2]: https://link-2.ext" +msgstr "[2]: https://enlace-2.ext" + +msgid "[3]: https://image-3.ext" +msgstr "[3]: https://imagen-3.ext" + +msgid "[4]: https://link-4.ext \"Referenced link image with title\"" +msgstr "[4]: https://enlace-4.ext \"Link de imagen referenciado con título\""