@ngx-i18nsupport/ngx-i18nsupport-lib
Version:
A Typescript library to work with Angular generated i18n files (xliff, xmb)
253 lines • 19.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as Tokenizr from 'tokenizr';
// Tokens
/**
* Created by martin on 04.06.2017.
* A tokenizer for ICU messages.
* @type {?}
*/
export const TEXT = 'TEXT';
/** @type {?} */
export const CURLY_BRACE_OPEN = 'CURLY_BRACE_OPEN';
/** @type {?} */
export const CURLY_BRACE_CLOSE = 'CURLY_BRACE_CLOSE';
/** @type {?} */
export const COMMA = 'COMMA';
/** @type {?} */
export const PLURAL = 'PLURAL';
/** @type {?} */
export const SELECT = 'SELECT';
/**
* @record
*/
export function ICUToken() { }
if (false) {
/** @type {?} */
ICUToken.prototype.type;
/** @type {?} */
ICUToken.prototype.value;
}
// states: default normal in_message
/** @type {?} */
const STATE_DEFAULT = 'default';
/** @type {?} */
const STATE_NORMAL = 'normal';
/** @type {?} */
const STATE_IN_MESSAGE = 'in_message';
export class ICUMessageTokenizer {
/**
* @private
* @return {?}
*/
getLexer() {
/** @type {?} */
const lexer = new Tokenizr();
/** @type {?} */
let plaintext = '';
/** @type {?} */
let openedCurlyBracesInTextCounter = 0;
lexer.before((/**
* @param {?} ctx
* @param {?} match
* @param {?} rule
* @return {?}
*/
(ctx, match, rule) => {
if (rule.name !== TEXT) {
if (this.containsNonWhiteSpace(plaintext)) {
ctx.accept(TEXT, plaintext);
plaintext = '';
}
else {
ctx.ignore();
}
}
}));
lexer.finish((/**
* @param {?} ctx
* @return {?}
*/
(ctx) => {
if (this.containsNonWhiteSpace(plaintext)) {
ctx.accept(TEXT, plaintext);
}
}));
// curly brace
lexer.rule(STATE_DEFAULT, /{/, (/**
* @param {?} ctx
* @param {?} match
* @return {?}
*/
(ctx, match) => {
ctx.accept(CURLY_BRACE_OPEN, match[0]);
ctx.push(STATE_NORMAL);
}), CURLY_BRACE_OPEN);
lexer.rule(STATE_NORMAL, /{/, (/**
* @param {?} ctx
* @param {?} match
* @return {?}
*/
(ctx, match) => {
ctx.accept(CURLY_BRACE_OPEN, match[0]);
ctx.push(STATE_IN_MESSAGE);
}), CURLY_BRACE_OPEN);
lexer.rule(STATE_NORMAL, /}/, (/**
* @param {?} ctx
* @param {?} match
* @return {?}
*/
(ctx, match) => {
ctx.pop();
ctx.accept(CURLY_BRACE_CLOSE, match[0]);
}), CURLY_BRACE_CLOSE);
// masked ' { and }
lexer.rule(STATE_IN_MESSAGE, /'[{}]?'/, (/**
* @param {?} ctx
* @param {?} match
* @return {?}
*/
(ctx, match) => {
if (match[0] === '\'\'') {
plaintext += '\'';
}
else if (match[0] === '\'{\'') {
plaintext += '{';
}
else if (match[0] === '\'}\'') {
plaintext += '}';
}
ctx.ignore();
}), TEXT);
lexer.rule(STATE_IN_MESSAGE, /./, (/**
* @param {?} ctx
* @param {?} match
* @return {?}
*/
(ctx, match) => {
/** @type {?} */
const char = match[0];
if (char === '{') {
openedCurlyBracesInTextCounter++;
plaintext += match[0];
ctx.ignore();
}
else if (char === '}') {
if (openedCurlyBracesInTextCounter > 0) {
openedCurlyBracesInTextCounter--;
plaintext += match[0];
ctx.ignore();
}
else {
ctx.pop();
ctx.accept(TEXT, plaintext);
plaintext = '';
ctx.accept(CURLY_BRACE_CLOSE, match[0]);
}
}
else {
plaintext += match[0];
ctx.ignore();
}
}), TEXT);
// comma
lexer.rule(STATE_NORMAL, /,/, (/**
* @param {?} ctx
* @param {?} match
* @return {?}
*/
(ctx, match) => {
ctx.accept(COMMA, match[0]);
}), COMMA);
// keywords plural and select
lexer.rule(STATE_NORMAL, /plural/, (/**
* @param {?} ctx
* @param {?} match
* @return {?}
*/
(ctx, match) => {
ctx.accept(PLURAL, match[0]);
}), PLURAL);
lexer.rule(STATE_NORMAL, /select/, (/**
* @param {?} ctx
* @param {?} match
* @return {?}
*/
(ctx, match) => {
ctx.accept(SELECT, match[0]);
}), SELECT);
// text
lexer.rule(/./, (/**
* @param {?} ctx
* @param {?} match
* @return {?}
*/
(ctx, match) => {
plaintext += match[0];
ctx.ignore();
}), TEXT);
lexer.rule(/[\s]+/, (/**
* @param {?} ctx
* @param {?} match
* @return {?}
*/
(ctx, match) => {
plaintext += match[0];
ctx.ignore();
}), TEXT);
return lexer;
}
/**
* @private
* @param {?} text
* @return {?}
*/
containsNonWhiteSpace(text) {
for (let i = 0; i < text.length; i++) {
if (!/\s/.test(text.charAt(i))) {
return true;
}
}
return false;
}
/**
* @param {?} normalizedMessage
* @return {?}
*/
tokenize(normalizedMessage) {
/** @type {?} */
const lexer = this.getLexer();
lexer.input(normalizedMessage);
return lexer.tokens();
}
/**
* @param {?} normalizedMessage
* @return {?}
*/
input(normalizedMessage) {
this.lexer = this.getLexer();
this.lexer.input(normalizedMessage);
}
/**
* @return {?}
*/
next() {
return this.lexer.token();
}
/**
* @return {?}
*/
peek() {
return this.lexer.peek();
}
}
if (false) {
/**
* @type {?}
* @private
*/
ICUMessageTokenizer.prototype.lexer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWN1LW1lc3NhZ2UtdG9rZW5pemVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5neC1pMThuc3VwcG9ydC9uZ3gtaTE4bnN1cHBvcnQtbGliLyIsInNvdXJjZXMiOlsiaW1wbC9pY3UtbWVzc2FnZS10b2tlbml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sS0FBSyxRQUFRLE1BQU0sVUFBVSxDQUFDOzs7Ozs7O0FBUXJDLE1BQU0sT0FBTyxJQUFJLEdBQUcsTUFBTTs7QUFDMUIsTUFBTSxPQUFPLGdCQUFnQixHQUFHLGtCQUFrQjs7QUFDbEQsTUFBTSxPQUFPLGlCQUFpQixHQUFHLG1CQUFtQjs7QUFDcEQsTUFBTSxPQUFPLEtBQUssR0FBRyxPQUFPOztBQUM1QixNQUFNLE9BQU8sTUFBTSxHQUFHLFFBQVE7O0FBQzlCLE1BQU0sT0FBTyxNQUFNLEdBQUcsUUFBUTs7OztBQUU5Qiw4QkFHQzs7O0lBRkcsd0JBQWE7O0lBQ2IseUJBQVc7Ozs7TUFJVCxhQUFhLEdBQUcsU0FBUzs7TUFDekIsWUFBWSxHQUFHLFFBQVE7O01BQ3ZCLGdCQUFnQixHQUFHLFlBQVk7QUFFckMsTUFBTSxPQUFPLG1CQUFtQjs7Ozs7SUFHcEIsUUFBUTs7Y0FDTixLQUFLLEdBQUcsSUFBSSxRQUFRLEVBQUU7O1lBQ3hCLFNBQVMsR0FBRyxFQUFFOztZQUNkLDhCQUE4QixHQUFHLENBQUM7UUFDdEMsS0FBSyxDQUFDLE1BQU07Ozs7OztRQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUM5QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO2dCQUNwQixJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsRUFBRTtvQkFDdkMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7b0JBQzVCLFNBQVMsR0FBRyxFQUFFLENBQUM7aUJBQ2xCO3FCQUFNO29CQUNILEdB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S0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7Q0FDSjs7Ozs7O0lBckhHLG9DQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRva2VuaXpyIGZyb20gJ3Rva2VuaXpyJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVkIGJ5IG1hcnRpbiBvbiAwNC4wNi4yMDE3LlxyXG4gKiBBIHRva2VuaXplciBmb3IgSUNVIG1lc3NhZ2VzLlxyXG4gKi9cclxuXHJcbi8vIFRva2Vuc1xyXG5leHBvcnQgY29uc3QgVEVYVCA9ICdURVhUJztcclxuZXhwb3J0IGNvbnN0IENVUkxZX0JSQUNFX09QRU4gPSAnQ1VSTFlfQlJBQ0VfT1BFTic7XHJcbmV4cG9ydCBjb25zdCBDVVJMWV9CUkFDRV9DTE9TRSA9ICdDVVJMWV9CUkFDRV9DTE9TRSc7XHJcbmV4cG9ydCBjb25zdCBDT01NQSA9ICdDT01NQSc7XHJcbmV4cG9ydCBjb25zdCBQTFVSQUwgPSAnUExVUkFMJztcclxuZXhwb3J0IGNvbnN0IFNFTEVDVCA9ICdTRUxFQ1QnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ1VUb2tlbiB7XHJcbiAgICB0eXBlOiBzdHJpbmc7XHJcbiAgICB2YWx1ZTogYW55O1xyXG59XHJcblxyXG4vLyBzdGF0ZXM6IGRlZmF1bHQgbm9ybWFsIGluX21lc3NhZ2VcclxuY29uc3QgU1RBVEVfREVGQVVMVCA9ICdkZWZhdWx0JztcclxuY29uc3QgU1RBVEVfTk9STUFMID0gJ25vcm1hbCc7XHJcbmNvbnN0IFNUQVRFX0lOX01FU1NBR0UgPSAnaW5fbWVzc2FnZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgSUNVTWVzc2FnZVRva2VuaXplciB7XHJcbiAgICBwcml2YXRlIGxleGVyOiBUb2tlbml6cjtcclxuXHJcbiAgICBwcml2YXRlIGdldExleGVyKCk6IFRva2VuaXpyIHtcclxuICAgICAgICBjb25zdCBsZXhlciA9IG5ldyBUb2tlbml6cigpO1xyXG4gICAgICAgIGxldCBwbGFpbnRleHQgPSAnJztcclxuICAgICAgICBsZXQgb3BlbmVkQ3VybHlCcmFjZXNJblRleHRDb3VudGVyID0gMDtcclxuICAgICAgICBsZXhlci5iZWZvcmUoKGN0eCwgbWF0Y2gsIHJ1bGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJ1bGUubmFtZSAhPT0gVEVYVCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGFpbnNOb25XaGl0ZVNwYWNlKHBsYWludGV4dCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjdHguYWNjZXB0KFRFWFQsIHBsYWludGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGxhaW50ZXh0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGN0eC5pZ25vcmUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxleGVyLmZpbmlzaCgoY3R4KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRhaW5zTm9uV2hpdGVTcGFjZShwbGFpbnRleHQpKSB7XHJcbiAgICAgICAgICAgICAgICBjdHguYWNjZXB0KFRFWFQsIHBsYWludGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gY3VybHkgYnJhY2VcclxuICAgICAgICBsZXhlci5ydWxlKFNUQVRFX0RFRkFVTFQsIC97LywgKGN0eCwgbWF0Y2gpID0+IHtcclxuICAgICAgICAgICAgY3R4LmFjY2VwdChDVVJMWV9CUkFDRV9PUEVOLCBtYXRjaFswXSk7XHJcbiAgICAgICAgICAgIGN0eC5wdXNoKFNUQVRFX05PUk1BTCk7XHJcbiAgICAgICAgfSwgQ1VSTFlfQlJBQ0VfT1BFTik7XHJcbiAgICAgICAgbGV4ZXIucnVsZShTVEFURV9OT1JNQUwsIC97LywgKGN0eCwgbWF0Y2gpID0+IHtcclxuICAgICAgICAgICAgY3R4LmFjY2VwdChDVVJMWV9CUkFDRV9PUEVOLCBtYXRjaFswXSk7XHJcbiAgICAgICAgICAgIGN0eC5wdXNoKFNUQVRFX0lOX01FU1NBR0UpO1xyXG4gICAgICAgIH0sIENVUkxZX0JSQUNFX09QRU4pO1xyXG4gICAgICAgIGxleGVyLnJ1bGUoU1RBVEVfTk9STUFMLCAvfS8sIChjdHgsIG1hdGNoKSA9PiB7XHJcbiAgICAgICAgICAgIGN0eC5wb3AoKTtcclxuICAgICAgICAgICAgY3R4LmFjY2VwdChDVVJMWV9CUkFDRV9DTE9TRSwgbWF0Y2hbMF0pO1xyXG4gICAgICAgIH0sIENVUkxZX0JSQUNFX0NMT1NFKTtcclxuICAgICAgICAvLyBtYXNrZWQgJyB7IGFuZCB9XHJcbiAgICAgICAgbGV4ZXIucnVsZShTVEFURV9JTl9NRVNTQUdFLCAvJ1t7fV0/Jy8sIChjdHgsIG1hdGNoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChtYXRjaFswXSA9PT0gJ1xcJ1xcJycpIHtcclxuICAgICAgICAgICAgICAgIHBsYWludGV4dCArPSAnXFwnJztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaFswXSA9PT0gJ1xcJ3tcXCcnKSB7XHJcbiAgICAgICAgICAgICAgICBwbGFpbnRleHQgKz0gJ3snO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoWzBdID09PSAnXFwnfVxcJycpIHtcclxuICAgICAgICAgICAgICAgIHBsYWludGV4dCArPSAnfSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3R4Lmlnbm9yZSgpO1xyXG4gICAgICAgIH0sIFRFWFQpO1xyXG4gICAgICAgIGxleGVyLnJ1bGUoU1RBVEVfSU5fTUVTU0FHRSwgLy4vLCAoY3R4LCBtYXRjaCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjaGFyID0gbWF0Y2hbMF07XHJcbiAgICAgICAgICAgIGlmIChjaGFyID09PSAneycpIHtcclxuICAgICAgICAgICAgICAgIG9wZW5lZEN1cmx5QnJhY2VzSW5UZXh0Q291bnRlcisrO1xyXG4gICAgICAgICAgICAgICAgcGxhaW50ZXh0ICs9IG1hdGNoWzBdO1xyXG4gICAgICAgICAgICAgICAgY3R4Lmlnbm9yZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICd9Jykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wZW5lZEN1cmx5QnJhY2VzSW5UZXh0Q291bnRlciA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBvcGVuZWRDdXJseUJyYWNlc0luVGV4dENvdW50ZXItLTtcclxuICAgICAgICAgICAgICAgICAgICBwbGFpbnRleHQgKz0gbWF0Y2hbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgY3R4Lmlnbm9yZSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjdHgucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3R4LmFjY2VwdChURVhULCBwbGFpbnRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBsYWludGV4dCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIGN0eC5hY2NlcHQoQ1VSTFlfQlJBQ0VfQ0xPU0UsIG1hdGNoWzBdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHBsYWludGV4dCArPSBtYXRjaFswXTtcclxuICAgICAgICAgICAgICAgIGN0eC5pZ25vcmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIFRFWFQpO1xyXG4gICAgICAgIC8vIGNvbW1hXHJcbiAgICAgICAgbGV4ZXIucnVsZShTVEFURV9OT1JNQUwsIC8sLywgKGN0eCwgbWF0Y2gpID0+IHtcclxuICAgICAgICAgICAgY3R4LmFjY2VwdChDT01NQSwgbWF0Y2hbMF0pO1xyXG4gICAgICAgIH0sIENPTU1BKTtcclxuICAgICAgICAvLyBrZXl3b3JkcyBwbHVyYWwgYW5kIHNlbGVjdFxyXG4gICAgICAgIGxleGVyLnJ1bGUoU1RBVEVfTk9STUFMLCAvcGx1cmFsLywgKGN0eCwgbWF0Y2gpID0+IHtcclxuICAgICAgICAgICAgY3R4LmFjY2VwdChQTFVSQUwsIG1hdGNoWzBdKTtcclxuICAgICAgICB9LCBQTFVSQUwpO1xyXG4gICAgICAgIGxleGVyLnJ1bGUoU1RBVEVfTk9STUFMLCAvc2VsZWN0LywgKGN0eCwgbWF0Y2gpID0+IHtcclxuICAgICAgICAgICAgY3R4LmFjY2VwdChTRUxFQ1QsIG1hdGNoWzBdKTtcclxuICAgICAgICB9LCBTRUxFQ1QpO1xyXG4gICAgICAgIC8vIHRleHRcclxuICAgICAgICBsZXhlci5ydWxlKC8uLywgKGN0eCwgbWF0Y2gpID0+IHtcclxuICAgICAgICAgICAgcGxhaW50ZXh0ICs9IG1hdGNoWzBdO1xyXG4gICAgICAgICAgICBjdHguaWdub3JlKCk7XHJcbiAgICAgICAgfSwgVEVYVCk7XHJcbiAgICAgICAgbGV4ZXIucnVsZSgvW1xcc10rLywgKGN0eCwgbWF0Y2gpID0+IHtcclxuICAgICAgICAgICAgcGxhaW50ZXh0ICs9IG1hdGNoWzBdO1xyXG4gICAgICAgICAgICBjdHguaWdub3JlKCk7XHJcbiAgICAgICAgfSwgVEVYVCk7XHJcbiAgICAgICAgcmV0dXJuIGxleGVyO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY29udGFpbnNOb25XaGl0ZVNwYWNlKHRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoIS9cXHMvLnRlc3QodGV4dC5jaGFyQXQoaSkpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdG9rZW5pemUobm9ybWFsaXplZE1lc3NhZ2U6IHN0cmluZyk6IElDVVRva2VuW10ge1xyXG4gICAgICAgIGNvbnN0IGxleGVyOiBUb2tlbml6ciA9IHRoaXMuZ2V0TGV4ZXIoKTtcclxuICAgICAgICBsZXhlci5pbnB1dChub3JtYWxpemVkTWVzc2FnZSk7XHJcbiAgICAgICAgcmV0dXJuIGxleGVyLnRva2VucygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlucHV0KG5vcm1hbGl6ZWRNZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmxleGVyID0gdGhpcy5nZXRMZXhlcigpO1xyXG4gICAgICAgIHRoaXMubGV4ZXIuaW5wdXQobm9ybWFsaXplZE1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIG5leHQoKTogSUNVVG9rZW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxleGVyLnRva2VuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcGVlaygpOiBJQ1VUb2tlbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGV4ZXIucGVlaygpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==