diff --git a/modules/angular2/src/compiler/expression_parser/parser.ts b/modules/angular2/src/compiler/expression_parser/parser.ts index 2f3edca4d2..afce2b4bcb 100644 --- a/modules/angular2/src/compiler/expression_parser/parser.ts +++ b/modules/angular2/src/compiler/expression_parser/parser.ts @@ -49,7 +49,6 @@ import { var _implicitReceiver = new ImplicitReceiver(); // TODO(tbosch): Cannot make this const/final right now because of the transpiler... var INTERPOLATION_REGEXP = /\{\{([\s\S]*?)\}\}/g; -var COMMENT_REGEX = /\/\//g; class ParseException extends BaseException { constructor(message: string, input: string, errLocation: string, ctxLocation?: any) { @@ -68,7 +67,7 @@ export class Parser { parseAction(input: string, location: any): ASTWithSource { this._checkNoInterpolation(input, location); - var tokens = this._lexer.tokenize(this._stripComments(input)); + var tokens = this._lexer.tokenize(input); var ast = new _ParseAST(input, location, tokens, true).parseChain(); return new ASTWithSource(ast, input, location); } @@ -97,7 +96,7 @@ export class Parser { } this._checkNoInterpolation(input, location); - var tokens = this._lexer.tokenize(this._stripComments(input)); + var tokens = this._lexer.tokenize(input); return new _ParseAST(input, location, tokens, false).parseChain(); } @@ -123,7 +122,7 @@ export class Parser { let expressions = []; for (let i = 0; i < split.expressions.length; ++i) { - var tokens = this._lexer.tokenize(this._stripComments(split.expressions[i])); + var tokens = this._lexer.tokenize(split.expressions[i]); var ast = new _ParseAST(input, location, tokens, false).parseChain(); expressions.push(ast); } @@ -159,10 +158,6 @@ export class Parser { return new ASTWithSource(new LiteralPrimitive(input), input, location); } - private _stripComments(input: string): string { - return StringWrapper.split(input, COMMENT_REGEX)[0].trim(); - } - private _checkNoInterpolation(input: string, location: any): void { var parts = StringWrapper.split(input, INTERPOLATION_REGEXP); if (parts.length > 1) { diff --git a/modules/angular2/src/i18n/i18n_html_parser.ts b/modules/angular2/src/i18n/i18n_html_parser.ts index a009192df8..2f118b3590 100644 --- a/modules/angular2/src/i18n/i18n_html_parser.ts +++ b/modules/angular2/src/i18n/i18n_html_parser.ts @@ -22,16 +22,14 @@ import { partition, Part, stringifyNodes, - meaning, - getPhNameFromBinding, - dedupePhName + meaning } from './shared'; const _I18N_ATTR = "i18n"; const _PLACEHOLDER_ELEMENT = "ph"; const _NAME_ATTR = "name"; const _I18N_ATTR_PREFIX = "i18n-"; -let _PLACEHOLDER_EXPANDED_REGEXP = RegExpWrapper.create(`\\\\<\\/ph\\>`); +let _PLACEHOLDER_EXPANDED_REGEXP = RegExpWrapper.create(`\\\\<\\/ph\\>`); /** * Creates an i18n-ed version of the parsed template. @@ -315,31 +313,19 @@ export class I18nHtmlParser implements HtmlParser { private _replacePlaceholdersWithExpressions(message: string, exps: string[], sourceSpan: ParseSourceSpan): string { - let expMap = this._buildExprMap(exps); return RegExpWrapper.replaceAll(_PLACEHOLDER_EXPANDED_REGEXP, message, (match) => { let nameWithQuotes = match[2]; let name = nameWithQuotes.substring(1, nameWithQuotes.length - 1); - return this._convertIntoExpression(name, expMap, sourceSpan); + let index = NumberWrapper.parseInt(name, 10); + return this._convertIntoExpression(index, exps, sourceSpan); }); } - private _buildExprMap(exps: string[]): Map { - let expMap = new Map(); - let usedNames = new Map(); - - for (var i = 0; i < exps.length; i++) { - let phName = getPhNameFromBinding(exps[i], i); - expMap.set(dedupePhName(usedNames, phName), exps[i]); - } - return expMap; - } - - private _convertIntoExpression(name: string, expMap: Map, - sourceSpan: ParseSourceSpan) { - if (expMap.has(name)) { - return `{{${expMap.get(name)}}}`; + private _convertIntoExpression(index: number, exps: string[], sourceSpan: ParseSourceSpan) { + if (index >= 0 && index < exps.length) { + return `{{${exps[index]}}}`; } else { - throw new I18nError(sourceSpan, `Invalid interpolation name '${name}'`); + throw new I18nError(sourceSpan, `Invalid interpolation index '${index}'`); } } } @@ -361,4 +347,4 @@ class _CreateNodeMapping implements HtmlAstVisitor { } visitComment(ast: HtmlCommentAst, context: any): any { return ""; } -} +} \ No newline at end of file diff --git a/modules/angular2/src/i18n/shared.ts b/modules/angular2/src/i18n/shared.ts index d1ebd8a7a2..24ffa1a3c0 100644 --- a/modules/angular2/src/i18n/shared.ts +++ b/modules/angular2/src/i18n/shared.ts @@ -8,13 +8,12 @@ import { HtmlCommentAst, htmlVisitAll } from 'angular2/src/compiler/html_ast'; -import {isPresent, isBlank, StringWrapper} from 'angular2/src/facade/lang'; +import {isPresent, isBlank} from 'angular2/src/facade/lang'; import {Message} from './message'; import {Parser} from 'angular2/src/compiler/expression_parser/parser'; export const I18N_ATTR = "i18n"; export const I18N_ATTR_PREFIX = "i18n-"; -var CUSTOM_PH_EXP = /\/\/[\s\S]*i18n[\s\S]*\([\s\S]*ph[\s\S]*=[\s\S]*"([\s\S]*?)"[\s\S]*\)/g; /** * An i18n error. @@ -114,15 +113,12 @@ export function removeInterpolation(value: string, source: ParseSourceSpan, parser: Parser): string { try { let parsed = parser.splitInterpolation(value, source.toString()); - let usedNames = new Map(); if (isPresent(parsed)) { let res = ""; for (let i = 0; i < parsed.strings.length; ++i) { res += parsed.strings[i]; if (i != parsed.strings.length - 1) { - let customPhName = getPhNameFromBinding(parsed.expressions[i], i); - customPhName = dedupePhName(usedNames, customPhName); - res += ``; + res += ``; } } return res; @@ -134,22 +130,6 @@ export function removeInterpolation(value: string, source: ParseSourceSpan, } } -export function getPhNameFromBinding(input: string, index: number): string { - let customPhMatch = StringWrapper.split(input, CUSTOM_PH_EXP); - return customPhMatch.length > 1 ? customPhMatch[1] : `${index}`; -} - -export function dedupePhName(usedNames: Map, name: string): string { - let duplicateNameCount = usedNames.get(name); - if (isPresent(duplicateNameCount)) { - usedNames.set(name, duplicateNameCount + 1); - return `${name}_${duplicateNameCount}`; - } else { - usedNames.set(name, 1); - return name; - } -} - export function stringifyNodes(nodes: HtmlAst[], parser: Parser): string { let visitor = new _StringifyVisitor(parser); return htmlVisitAll(visitor, nodes).join(""); diff --git a/modules/angular2/test/compiler/expression_parser/parser_spec.ts b/modules/angular2/test/compiler/expression_parser/parser_spec.ts index 248773c881..833420a5ca 100644 --- a/modules/angular2/test/compiler/expression_parser/parser_spec.ts +++ b/modules/angular2/test/compiler/expression_parser/parser_spec.ts @@ -103,8 +103,6 @@ export function main() { it('should parse grouped expressions', () => { checkAction("(1 + 2) * 3", "1 + 2 * 3"); }); - it('should ignore comments in expressions', () => { checkAction('a //comment', 'a'); }); - it('should parse an empty string', () => { checkAction(''); }); describe("literals", () => { @@ -271,8 +269,6 @@ export function main() { }); it('should parse conditional expression', () => { checkBinding('a < b ? a : b'); }); - - it('should ignore comments in bindings', () => { checkBinding('a //comment', 'a'); }); }); describe('parseTemplateBindings', () => { @@ -428,9 +424,6 @@ export function main() { it('should parse expression with newline characters', () => { checkInterpolation(`{{ 'foo' +\n 'bar' +\r 'baz' }}`, `{{ "foo" + "bar" + "baz" }}`); }); - - it('should ignore comments in interpolation expressions', - () => { checkInterpolation('{{a //comment}}', '{{ a }}'); }); }); describe("parseSimpleBinding", () => { diff --git a/modules/angular2/test/i18n/i18n_html_parser_spec.ts b/modules/angular2/test/i18n/i18n_html_parser_spec.ts index 68c505fc57..9921b80a25 100644 --- a/modules/angular2/test/i18n/i18n_html_parser_spec.ts +++ b/modules/angular2/test/i18n/i18n_html_parser_spec.ts @@ -76,36 +76,6 @@ export function main() { .toEqual([[HtmlElementAst, 'div', 0], [HtmlAttrAst, 'value', '{{b}} or {{a}}']]); }); - it('should handle interpolation with custom placeholder names', () => { - let translations: {[key: string]: string} = {}; - translations[id(new Message(' and ', null, null))] = - ' or '; - - expect( - humanizeDom(parse( - `
`, - translations))) - .toEqual([ - [HtmlElementAst, 'div', 0], - [HtmlAttrAst, 'value', '{{b //i18n(ph="SECOND")}} or {{a //i18n(ph="FIRST")}}'] - ]); - }); - - it('should handle interpolation with duplicate placeholder names', () => { - let translations: {[key: string]: string} = {}; - translations[id(new Message(' and ', null, null))] = - ' or '; - - expect( - humanizeDom(parse( - `
`, - translations))) - .toEqual([ - [HtmlElementAst, 'div', 0], - [HtmlAttrAst, 'value', '{{b //i18n(ph="FIRST")}} or {{a //i18n(ph="FIRST")}}'] - ]); - }); - it("should handle nested html", () => { let translations: {[key: string]: string} = {}; translations[id(new Message('ab', null, null))] = @@ -228,7 +198,7 @@ export function main() { expect( humanizeErrors(parse("
", translations).errors)) - .toEqual(["Invalid interpolation name '99'"]); + .toEqual(["Invalid interpolation index '99'"]); }); }); @@ -237,4 +207,4 @@ export function main() { function humanizeErrors(errors: ParseError[]): string[] { return errors.map(error => error.msg); -} +} \ No newline at end of file diff --git a/modules/angular2/test/i18n/message_extractor_spec.ts b/modules/angular2/test/i18n/message_extractor_spec.ts index f7f8541ad5..da1e38d9eb 100644 --- a/modules/angular2/test/i18n/message_extractor_spec.ts +++ b/modules/angular2/test/i18n/message_extractor_spec.ts @@ -93,47 +93,6 @@ export function main() { .toEqual([new Message('Hi and ', null, null)]); }); - it('should replace interpolation with named placeholders if provided (text nodes)', () => { - let res = extractor.extract(` -
Hi {{one //i18n(ph="FIRST")}} and {{two //i18n(ph="SECOND")}}
`, - 'someurl'); - expect(res.messages) - .toEqual([ - new Message('Hi and ', null, - null) - ]); - }); - - it('should replace interpolation with named placeholders if provided (attributes)', () => { - let res = extractor.extract(` -
`, - 'someurl'); - expect(res.messages) - .toEqual([new Message('Hi and ', null, null)]); - }); - - it('should match named placeholders with extra spacing', () => { - let res = extractor.extract(` -
`, - 'someurl'); - expect(res.messages) - .toEqual([new Message('Hi and ', null, null)]); - }); - - it('should suffix duplicate placeholder names with numbers', () => { - let res = extractor.extract(` -
`, - 'someurl'); - expect(res.messages) - .toEqual([ - new Message('Hi and and ', - null, null) - ]); - }); - it("should handle html content", () => { let res = extractor.extract( '
zero
one
two
', "someurl");