@ngx-i18nsupport/ngx-i18nsupport-lib
Version:
A Typescript library to work with Angular generated i18n files (xliff, xmb)
78 lines • 3.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const Tokenizr = require("tokenizr");
const util_1 = require("util");
/**
* Created by martin on 14.05.2017.
* A tokenizer for normalized messages.
*/
// Tokens
exports.TEXT = 'TEXT';
exports.START_TAG = 'START_TAG';
exports.END_TAG = 'END_TAG';
exports.EMPTY_TAG = 'EMPTY_TAG';
exports.PLACEHOLDER = 'PLACEHOLDER';
exports.ICU_MESSAGE_REF = 'ICU_MESSAGE_REF';
exports.ICU_MESSAGE = 'ICU_MESSAGE';
class ParsedMesageTokenizer {
getLexer() {
const lexer = new Tokenizr();
let plaintext = '';
lexer.before((ctx, match, rule) => {
if (rule.name !== exports.TEXT && plaintext !== '') {
ctx.accept(exports.TEXT, { text: plaintext });
plaintext = '';
}
});
lexer.finish((ctx) => {
if (plaintext !== '') {
ctx.accept(exports.TEXT, { text: plaintext });
}
});
// empty tag, there are only a few allowed (see tag-mappings): ['BR', 'HR', 'IMG', 'AREA', 'LINK', 'WBR']
// format is <name id="nr">, nr ist optional, z.B. <img> oder <img id="2">
lexer.rule(/<(br|hr|img|area|link|wbr)( id="([0-9])*")?\>/, (ctx, match) => {
const idcount = util_1.isNullOrUndefined(match[3]) ? 0 : parseInt(match[3], 10);
ctx.accept(exports.EMPTY_TAG, { name: match[1], idcounter: idcount });
}, exports.EMPTY_TAG);
// start tag, Format <name id="nr">, nr ist optional, z.B. <mytag> oder <mytag id="2">
lexer.rule(/<([a-zA-Z][a-zA-Z-0-9]*)( id="([0-9]*)")?>/, (ctx, match) => {
const idcount = util_1.isNullOrUndefined(match[3]) ? 0 : parseInt(match[3], 10);
ctx.accept(exports.START_TAG, { name: match[1], idcounter: idcount });
}, exports.START_TAG);
// end tag
lexer.rule(/<\/([a-zA-Z][a-zA-Z-0-9]*)>/, (ctx, match) => {
ctx.accept(exports.END_TAG, { name: match[1] });
}, exports.END_TAG);
// placeholder
lexer.rule(/{{([0-9]+)}}/, (ctx, match) => {
ctx.accept(exports.PLACEHOLDER, { idcounter: parseInt(match[1], 10) });
}, exports.PLACEHOLDER);
// icu message ref
lexer.rule(/<ICU-Message-Ref_([0-9]+)\/>/, (ctx, match) => {
ctx.accept(exports.ICU_MESSAGE_REF, { idcounter: parseInt(match[1], 10) });
}, exports.ICU_MESSAGE_REF);
// icu message
lexer.rule(/<ICU-Message\/>/, (ctx, match) => {
ctx.accept(exports.ICU_MESSAGE, { message: match[0] });
}, exports.ICU_MESSAGE);
// text
lexer.rule(/./, (ctx, match) => {
plaintext += match[0];
ctx.ignore();
}, exports.TEXT);
lexer.rule(/[\t\r\n]+/, (ctx, match) => {
plaintext += match[0];
ctx.ignore();
}, exports.TEXT);
return lexer;
}
tokenize(normalizedMessage) {
const lexer = this.getLexer();
lexer.reset();
lexer.input(normalizedMessage);
return lexer.tokens();
}
}
exports.ParsedMesageTokenizer = ParsedMesageTokenizer;
//# sourceMappingURL=parsed-message-tokenizer.js.map