Add support for using tagged templates as strings.

Review Request #11024 — Created May 16, 2020 and submitted

Information

babel-plugin-django-gettext
master

Reviewers

This introduces compatibility with other tagged template plugins, like
babel-plugin-dedent, which is useful for constructing strings that
are further processed through some other means.

When a tagged template is encountered as a string, it will be preserved
(well, rebuilt) and left for Babel to later process. The rebuilt tagged
template will have its contents replaced with a normalized version of
the string that would normally go into the gettext function. That means
that if the tagged template were to reference other variables or
expressions (using ${...} syntax), those would be replaced in the
rebuilt one with the gettext interpolated %(...)s markers.

In order to make any of this work, we had to change how we prevented
further processing of nodes. We had previously walled off any resulting
nodes (which may be a gettext-like call or an interpolate call) from
further processing, so that we wouldn't end up with an infinite loop of
processing these functions, and we skipped children. Now, to allow Babel
to reach down into the strings, we now mark any resulting interpolate
or gettext-like function as having been transformed, and we simply
don't re-transform those nodes, but don't skip processing of children
either.

Unit tests and documentation were updated for the new support.

Unit tests passed.

Manually tested with some code in Review Board.

Viewed the docs and checked the generated output.

Summary ID
Add support for using tagged templates as strings.
This introduces compatibility with other tagged template plugins, like `babel-plugin-dedent`, which is useful for constructing strings that are further processed through some other means. When a tagged template is encountered as a string, it will be preserved (well, rebuilt) and left for Babel to later process. The rebuilt tagged template will have its contents replaced with a normalized version of the string that would normally go into the gettext function. That means that if the tagged template were to reference other variables or expressions (using `${...}` syntax), those would be replaced in the rebuilt one with the gettext interpolated `%(...)s` markers. In order to make any of this work, we had to change how we prevented further processing of nodes. We had previously walled off any resulting nodes (which may be a `gettext`-like call or an `interpolate` call) from further processing, so that we wouldn't end up with an infinite loop of processing these functions, and we skipped children. Now, to allow Babel to reach down into the strings, we now mark any resulting `interpolate` or `gettext`-like function as having been transformed, and we simply don't re-transform those nodes, but don't skip processing of children either. Unit tests and documentation were updated for the new support.
34b22ccf94356d1856d79079a47b9069908d9e26
david
  1. Ship It!
  2. 
      
chipx86
Review request changed
Status:
Completed