fix(compiler): do not remove whitespace wrapping i18n expansions (#31962)
Similar to interpolation, we do not want to completely remove whitespace nodes that are siblings of an expansion. For example, the following template ```html <div> <strong>items left<strong> {count, plural, =1 {item} other {items}} </div> ``` was being collapsed to ```html <div><strong>items left<strong>{count, plural, =1 {item} other {items}}</div> ``` which results in the text looking like ``` items left4 ``` instead it should be collapsed to ```html <div><strong>items left<strong> {count, plural, =1 {item} other {items}}</div> ``` which results in the text looking like ``` items left 4 ``` --- **Analysis of the code and manual testing has shown that this does not cause the generated ids to change, so there is no breaking change here.** PR Close #31962
This commit is contained in:

committed by
Kara Erickson

parent
fd6ed1713d
commit
0ddf0c4895
@ -9,14 +9,15 @@
|
||||
import * as html from '../../src/ml_parser/ast';
|
||||
import {HtmlParser} from '../../src/ml_parser/html_parser';
|
||||
import {PRESERVE_WS_ATTR_NAME, removeWhitespaces} from '../../src/ml_parser/html_whitespaces';
|
||||
import {TokenizeOptions} from '../../src/ml_parser/lexer';
|
||||
|
||||
import {humanizeDom} from './ast_spec_utils';
|
||||
|
||||
{
|
||||
describe('removeWhitespaces', () => {
|
||||
|
||||
function parseAndRemoveWS(template: string): any[] {
|
||||
return humanizeDom(removeWhitespaces(new HtmlParser().parse(template, 'TestComp')));
|
||||
function parseAndRemoveWS(template: string, options?: TokenizeOptions): any[] {
|
||||
return humanizeDom(removeWhitespaces(new HtmlParser().parse(template, 'TestComp', options)));
|
||||
}
|
||||
|
||||
it('should remove blank text nodes', () => {
|
||||
@ -97,6 +98,17 @@ import {humanizeDom} from './ast_spec_utils';
|
||||
]);
|
||||
});
|
||||
|
||||
it('should preserve whitespaces around ICU expansions', () => {
|
||||
expect(parseAndRemoveWS(`<span> {a, b, =4 {c}} </span>`, {tokenizeExpansionForms: true}))
|
||||
.toEqual([
|
||||
[html.Element, 'span', 0],
|
||||
[html.Text, ' ', 1],
|
||||
[html.Expansion, 'a', 'b', 1],
|
||||
[html.ExpansionCase, '=4', 2],
|
||||
[html.Text, ' ', 1],
|
||||
]);
|
||||
});
|
||||
|
||||
it('should preserve whitespaces inside <pre> elements', () => {
|
||||
expect(parseAndRemoveWS(`<pre><strong>foo</strong>\n<strong>bar</strong></pre>`)).toEqual([
|
||||
[html.Element, 'pre', 0],
|
||||
|
Reference in New Issue
Block a user