Revert "feat(i18n): add support for custom placeholder names"
This reverts commit 2abb414cfb.
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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(\\s)+name=("(\\w)+")\\>\\<\\/ph\\>`);
|
||||
let _PLACEHOLDER_EXPANDED_REGEXP = RegExpWrapper.create(`\\<ph(\\s)+name=("(\\d)+")\\>\\<\\/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<string, string> {
|
||||
let expMap = new Map<string, string>();
|
||||
let usedNames = new Map<string, number>();
|
||||
|
||||
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<string, string>,
|
||||
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 ""; }
|
||||
}
|
||||
}
|
||||
@@ -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<string, number>();
|
||||
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 += `<ph name="${customPhName}"/>`;
|
||||
res += `<ph name="${i}"/>`;
|
||||
}
|
||||
}
|
||||
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<string, number>, 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("");
|
||||
|
||||
Reference in New Issue
Block a user