UNPKG

@ngx-i18nsupport/ngx-i18nsupport-lib

Version:

A Typescript library to work with Angular generated i18n files (xliff, xmb)

281 lines 20.2 kB
/** * @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 var TEXT = 'TEXT'; /** @type {?} */ export var CURLY_BRACE_OPEN = 'CURLY_BRACE_OPEN'; /** @type {?} */ export var CURLY_BRACE_CLOSE = 'CURLY_BRACE_CLOSE'; /** @type {?} */ export var COMMA = 'COMMA'; /** @type {?} */ export var PLURAL = 'PLURAL'; /** @type {?} */ export var SELECT = 'SELECT'; /** * @record */ export function ICUToken() { } if (false) { /** @type {?} */ ICUToken.prototype.type; /** @type {?} */ ICUToken.prototype.value; } // states: default normal in_message /** @type {?} */ var STATE_DEFAULT = 'default'; /** @type {?} */ var STATE_NORMAL = 'normal'; /** @type {?} */ var STATE_IN_MESSAGE = 'in_message'; var ICUMessageTokenizer = /** @class */ (function () { function ICUMessageTokenizer() { } /** * @private * @return {?} */ ICUMessageTokenizer.prototype.getLexer = /** * @private * @return {?} */ function () { var _this = this; /** @type {?} */ var lexer = new Tokenizr(); /** @type {?} */ var plaintext = ''; /** @type {?} */ var openedCurlyBracesInTextCounter = 0; lexer.before((/** * @param {?} ctx * @param {?} match * @param {?} rule * @return {?} */ function (ctx, match, rule) { if (rule.name !== TEXT) { if (_this.containsNonWhiteSpace(plaintext)) { ctx.accept(TEXT, plaintext); plaintext = ''; } else { ctx.ignore(); } } })); lexer.finish((/** * @param {?} ctx * @return {?} */ function (ctx) { if (_this.containsNonWhiteSpace(plaintext)) { ctx.accept(TEXT, plaintext); } })); // curly brace lexer.rule(STATE_DEFAULT, /{/, (/** * @param {?} ctx * @param {?} match * @return {?} */ function (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 {?} */ function (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 {?} */ function (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 {?} */ function (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 {?} */ function (ctx, match) { /** @type {?} */ var 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 {?} */ function (ctx, match) { ctx.accept(COMMA, match[0]); }), COMMA); // keywords plural and select lexer.rule(STATE_NORMAL, /plural/, (/** * @param {?} ctx * @param {?} match * @return {?} */ function (ctx, match) { ctx.accept(PLURAL, match[0]); }), PLURAL); lexer.rule(STATE_NORMAL, /select/, (/** * @param {?} ctx * @param {?} match * @return {?} */ function (ctx, match) { ctx.accept(SELECT, match[0]); }), SELECT); // text lexer.rule(/./, (/** * @param {?} ctx * @param {?} match * @return {?} */ function (ctx, match) { plaintext += match[0]; ctx.ignore(); }), TEXT); lexer.rule(/[\s]+/, (/** * @param {?} ctx * @param {?} match * @return {?} */ function (ctx, match) { plaintext += match[0]; ctx.ignore(); }), TEXT); return lexer; }; /** * @private * @param {?} text * @return {?} */ ICUMessageTokenizer.prototype.containsNonWhiteSpace = /** * @private * @param {?} text * @return {?} */ function (text) { for (var i = 0; i < text.length; i++) { if (!/\s/.test(text.charAt(i))) { return true; } } return false; }; /** * @param {?} normalizedMessage * @return {?} */ ICUMessageTokenizer.prototype.tokenize = /** * @param {?} normalizedMessage * @return {?} */ function (normalizedMessage) { /** @type {?} */ var lexer = this.getLexer(); lexer.input(normalizedMessage); return lexer.tokens(); }; /** * @param {?} normalizedMessage * @return {?} */ ICUMessageTokenizer.prototype.input = /** * @param {?} normalizedMessage * @return {?} */ function (normalizedMessage) { this.lexer = this.getLexer(); this.lexer.input(normalizedMessage); }; /** * @return {?} */ ICUMessageTokenizer.prototype.next = /** * @return {?} */ function () { return this.lexer.token(); }; /** * @return {?} */ ICUMessageTokenizer.prototype.peek = /** * @return {?} */ function () { return this.lexer.peek(); }; return ICUMessageTokenizer; }()); export { ICUMessageTokenizer }; if (false) { /** * @type {?} * @private */ ICUMessageTokenizer.prototype.lexer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWN1LW1lc3NhZ2UtdG9rZW5pemVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5neC1pMThuc3VwcG9ydC9uZ3gtaTE4bnN1cHBvcnQtbGliLyIsInNvdXJjZXMiOlsiaW1wbC9pY3UtbWVzc2FnZS10b2tlbml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sS0FBSyxRQUFRLE1BQU0sVUFBVSxDQUFDOzs7Ozs7O0FBUXJDLE1BQU0sS0FBTyxJQUFJLEdBQUcsTUFBTTs7QUFDMUIsTUFBTSxLQUFPLGdCQUFnQixHQUFHLGtCQUFrQjs7QUFDbEQsTUFBTSxLQUFPLGlCQUFpQixHQUFHLG1CQUFtQjs7QUFDcEQsTUFBTSxLQUFPLEtBQUssR0FBRyxPQUFPOztBQUM1QixNQUFNLEtBQU8sTUFBTSxHQUFHLFFBQVE7O0FBQzlCLE1BQU0sS0FBTyxNQUFNLEdBQUcsUUFBUTs7OztBQUU5Qiw4QkFHQzs7O0lBRkcsd0JBQWE7O0lBQ2IseUJBQVc7Ozs7SUFJVCxhQUFhLEdBQUcsU0FBUzs7SUFDekIsWUFBWSxHQUFHLFFBQVE7O0lBQ3ZCLGdCQUFnQixHQUFHLFlBQVk7QUFFckM7SUFBQTtJQXNIQSxDQUFDOzs7OztJQW5IVyxzQ0FBUTs7OztJQUFoQjtRQUFBLGlCQXNGQzs7WUFyRlMsS0FBSyxHQUFHLElBQUksUUFBUSxFQUFFOztZQUN4QixTQUFTLEdBQUcsRUFBRTs7WUFDZCw4QkFBOEIsR0FBRyxDQUFDO1FBQ3RDLEtBQUssQ0FBQyxNQUFNOzs7Ozs7UUFBQyxVQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSTtZQUMxQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO2dCQUNwQixJQUFJLEtBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsRUFBRTtvQkFDdkMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7b0JBQzVCLFNBQVMsR0FBRyxFQUFFLENBQUM7aUJBQ2xCO3FC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QUMsQUF0SEQsSUFzSEM7Ozs7Ozs7SUFySEcsb0NBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVG9rZW5penIgZnJvbSAndG9rZW5penInO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZWQgYnkgbWFydGluIG9uIDA0LjA2LjIwMTcuXHJcbiAqIEEgdG9rZW5pemVyIGZvciBJQ1UgbWVzc2FnZXMuXHJcbiAqL1xyXG5cclxuLy8gVG9rZW5zXHJcbmV4cG9ydCBjb25zdCBURVhUID0gJ1RFWFQnO1xyXG5leHBvcnQgY29uc3QgQ1VSTFlfQlJBQ0VfT1BFTiA9ICdDVVJMWV9CUkFDRV9PUEVOJztcclxuZXhwb3J0IGNvbnN0IENVUkxZX0JSQUNFX0NMT1NFID0gJ0NVUkxZX0JSQUNFX0NMT1NFJztcclxuZXhwb3J0IGNvbnN0IENPTU1BID0gJ0NPTU1BJztcclxuZXhwb3J0IGNvbnN0IFBMVVJBTCA9ICdQTFVSQUwnO1xyXG5leHBvcnQgY29uc3QgU0VMRUNUID0gJ1NFTEVDVCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDVVRva2VuIHtcclxuICAgIHR5cGU6IHN0cmluZztcclxuICAgIHZhbHVlOiBhbnk7XHJcbn1cclxuXHJcbi8vIHN0YXRlczogZGVmYXVsdCBub3JtYWwgaW5fbWVzc2FnZVxyXG5jb25zdCBTVEFURV9ERUZBVUxUID0gJ2RlZmF1bHQnO1xyXG5jb25zdCBTVEFURV9OT1JNQUwgPSAnbm9ybWFsJztcclxuY29uc3QgU1RBVEVfSU5fTUVTU0FHRSA9ICdpbl9tZXNzYWdlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBJQ1VNZXNzYWdlVG9rZW5pemVyIHtcclxuICAgIHByaXZhdGUgbGV4ZXI6IFRva2VuaXpyO1xyXG5cclxuICAgIHByaXZhdGUgZ2V0TGV4ZXIoKTogVG9rZW5penIge1xyXG4gICAgICAgIGNvbnN0IGxleGVyID0gbmV3IFRva2VuaXpyKCk7XHJcbiAgICAgICAgbGV0IHBsYWludGV4dCA9ICcnO1xyXG4gICAgICAgIGxldCBvcGVuZWRDdXJseUJyYWNlc0luVGV4dENvdW50ZXIgPSAwO1xyXG4gICAgICAgIGxleGVyLmJlZm9yZSgoY3R4LCBtYXRjaCwgcnVsZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocnVsZS5uYW1lICE9PSBURVhUKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250YWluc05vbldoaXRlU3BhY2UocGxhaW50ZXh0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGN0eC5hY2NlcHQoVEVYVCwgcGxhaW50ZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICBwbGFpbnRleHQgPSAnJztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3R4Lmlnbm9yZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbGV4ZXIuZmluaXNoKChjdHgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udGFpbnNOb25XaGl0ZVNwYWNlKHBsYWludGV4dCkpIHtcclxuICAgICAgICAgICAgICAgIGN0eC5hY2NlcHQoVEVYVCwgcGxhaW50ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICB9KTtcclxuICAgICAgICAvLyBjdXJseSBicmFjZVxyXG4gICAgICAgIGxleGVyLnJ1bGUoU1RBVEVfREVGQVVMVCwgL3svLCAoY3R4LCBtYXRjaCkgPT4ge1xyXG4gICAgICAgICAgICBjdHguYWNjZXB0KENVUkxZX0JSQUNFX09QRU4sIG1hdGNoWzBdKTtcclxuICAgICAgICAgICAgY3R4LnB1c2goU1RBVEVfTk9STUFMKTtcclxuICAgICAgICB9LCBDVVJMWV9CUkFDRV9PUEVOKTtcclxuICAgICAgICBsZXhlci5ydWxlKFNUQVRFX05PUk1BTCwgL3svLCAoY3R4LCBtYXRjaCkgPT4ge1xyXG4gICAgICAgICAgICBjdHguYWNjZXB0KENVUkxZX0JSQUNFX09QRU4sIG1hdGNoWzBdKTtcclxuICAgICAgICAgICAgY3R4LnB1c2goU1RBVEVfSU5fTUVTU0FHRSk7XHJcbiAgICAgICAgfSwgQ1VSTFlfQlJBQ0VfT1BFTik7XHJcbiAgICAgICAgbGV4ZXIucnVsZShTVEFURV9OT1JNQUwsIC99LywgKGN0eCwgbWF0Y2gpID0+IHtcclxuICAgICAgICAgICAgY3R4LnBvcCgpO1xyXG4gICAgICAgICAgICBjdHguYWNjZXB0KENVUkxZX0JSQUNFX0NMT1NFLCBtYXRjaFswXSk7XHJcbiAgICAgICAgfSwgQ1VSTFlfQlJBQ0VfQ0xPU0UpO1xyXG4gICAgICAgIC8vIG1hc2tlZCAnIHsgYW5kIH1cclxuICAgICAgICBsZXhlci5ydWxlKFNUQVRFX0lOX01FU1NBR0UsIC8nW3t9XT8nLywgKGN0eCwgbWF0Y2gpID0+IHtcclxuICAgICAgICAgICAgaWYgKG1hdGNoWzBdID09PSAnXFwnXFwnJykge1xyXG4gICAgICAgICAgICAgICAgcGxhaW50ZXh0ICs9ICdcXCcnO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoWzBdID09PSAnXFwne1xcJycpIHtcclxuICAgICAgICAgICAgICAgIHBsYWludGV4dCArPSAneyc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hbMF0gPT09ICdcXCd9XFwnJykge1xyXG4gICAgICAgICAgICAgICAgcGxhaW50ZXh0ICs9ICd9JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdHguaWdub3JlKCk7XHJcbiAgICAgICAgfSwgVEVYVCk7XHJcbiAgICAgICAgbGV4ZXIucnVsZShTVEFURV9JTl9NRVNTQUdFLCAvLi8sIChjdHgsIG1hdGNoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSBtYXRjaFswXTtcclxuICAgICAgICAgICAgaWYgKGNoYXIgPT09ICd7Jykge1xyXG4gICAgICAgICAgICAgICAgb3BlbmVkQ3VybHlCcmFjZXNJblRleHRDb3VudGVyKys7XHJcbiAgICAgICAgICAgICAgICBwbGFpbnRleHQgKz0gbWF0Y2hbMF07XHJcbiAgICAgICAgICAgICAgICBjdHguaWdub3JlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ30nKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAob3BlbmVkQ3VybHlCcmFjZXNJblRleHRDb3VudGVyID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wZW5lZEN1cmx5QnJhY2VzSW5UZXh0Q291bnRlci0tO1xyXG4gICAgICAgICAgICAgICAgICAgIHBsYWludGV4dCArPSBtYXRjaFswXTtcclxuICAgICAgICAgICAgICAgICAgICBjdHguaWdub3JlKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGN0eC5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBjdHguYWNjZXB0KFRFWFQsIHBsYWludGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGxhaW50ZXh0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgY3R4LmFjY2VwdChDVVJMWV9CUkFDRV9DTE9TRSwgbWF0Y2hbMF0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcGxhaW50ZXh0ICs9IG1hdGNoWzBdO1xyXG4gICAgICAgICAgICAgICAgY3R4Lmlnbm9yZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgVEVYVCk7XHJcbiAgICAgICAgLy8gY29tbWFcclxuICAgICAgICBsZXhlci5ydWxlKFNUQVRFX05PUk1BTCwgLywvLCAoY3R4LCBtYXRjaCkgPT4ge1xyXG4gICAgICAgICAgICBjdHguYWNjZXB0KENPTU1BLCBtYXRjaFswXSk7XHJcbiAgICAgICAgfSwgQ09NTUEpO1xyXG4gICAgICAgIC8vIGtleXdvcmRzIHBsdXJhbCBhbmQgc2VsZWN0XHJcbiAgICAgICAgbGV4ZXIucnVsZShTVEFURV9OT1JNQUwsIC9wbHVyYWwvLCAoY3R4LCBtYXRjaCkgPT4ge1xyXG4gICAgICAgICAgICBjdHguYWNjZXB0KFBMVVJBTCwgbWF0Y2hbMF0pO1xyXG4gICAgICAgIH0sIFBMVVJBTCk7XHJcbiAgICAgICAgbGV4ZXIucnVsZShTVEFURV9OT1JNQUwsIC9zZWxlY3QvLCAoY3R4LCBtYXRjaCkgPT4ge1xyXG4gICAgICAgICAgICBjdHguYWNjZXB0KFNFTEVDVCwgbWF0Y2hbMF0pO1xyXG4gICAgICAgIH0sIFNFTEVDVCk7XHJcbiAgICAgICAgLy8gdGV4dFxyXG4gICAgICAgIGxleGVyLnJ1bGUoLy4vLCAoY3R4LCBtYXRjaCkgPT4ge1xyXG4gICAgICAgICAgICBwbGFpbnRleHQgKz0gbWF0Y2hbMF07XHJcbiAgICAgICAgICAgIGN0eC5pZ25vcmUoKTtcclxuICAgICAgICB9LCBURVhUKTtcclxuICAgICAgICBsZXhlci5ydWxlKC9bXFxzXSsvLCAoY3R4LCBtYXRjaCkgPT4ge1xyXG4gICAgICAgICAgICBwbGFpbnRleHQgKz0gbWF0Y2hbMF07XHJcbiAgICAgICAgICAgIGN0eC5pZ25vcmUoKTtcclxuICAgICAgICB9LCBURVhUKTtcclxuICAgICAgICByZXR1cm4gbGV4ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb250YWluc05vbldoaXRlU3BhY2UodGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICghL1xccy8udGVzdCh0ZXh0LmNoYXJBdChpKSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB0b2tlbml6ZShub3JtYWxpemVkTWVzc2FnZTogc3RyaW5nKTogSUNVVG9rZW5bXSB7XHJcbiAgICAgICAgY29uc3QgbGV4ZXI6IFRva2VuaXpyID0gdGhpcy5nZXRMZXhlcigpO1xyXG4gICAgICAgIGxleGVyLmlucHV0KG5vcm1hbGl6ZWRNZXNzYWdlKTtcclxuICAgICAgICByZXR1cm4gbGV4ZXIudG9rZW5zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5wdXQobm9ybWFsaXplZE1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMubGV4ZXIgPSB0aGlzLmdldExleGVyKCk7XHJcbiAgICAgICAgdGhpcy5sZXhlci5pbnB1dChub3JtYWxpemVkTWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmV4dCgpOiBJQ1VUb2tlbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGV4ZXIudG9rZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBwZWVrKCk6IElDVVRva2VuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sZXhlci5wZWVrKCk7XHJcbiAgICB9XHJcbn1cclxuIl19