ngx-translate-extract/src/extractor.ts
2016-12-03 15:09:39 +01:00

74 lines
1.8 KiB
TypeScript

import { ParserInterface } from './parsers/parser.interface';
import { HtmlParser } from './parsers/html.parser';
import { TypescriptParser } from './parsers/typescript.parser';
import { SerializerInterface } from './serializers/serializer.interface';
import { PotSerializer } from './serializers/pot.serializer';
import { uniq as arrayUnique } from 'lodash';
import { sync as readDir } from 'glob';
import { readFileSync as readFile, writeFileSync as writeFile } from 'fs';
export interface TypeParserMap {
[ext: string]: ParserInterface
}
export class Extractor {
public messages: string[] = [];
public parsers: TypeParserMap = {
html: new HtmlParser(),
ts: new TypescriptParser()
};
public constructor(public serializer: SerializerInterface) { }
/**
* Extracts messages from paths
*/
public extract(paths: string[]): string[] {
let messages = [];
paths.forEach(path => {
const filePaths = readDir(path);
filePaths.forEach(filePath => {
const result = this._extractMessages(filePath);
messages = [...messages, ...result];
});
});
return this.messages = arrayUnique(messages);
}
/**
* Serialize and return output
*/
public serialize(): string {
return this.serializer.serialize(this.messages);
}
/**
* Serialize and save to destination
*/
public save(destination: string): string {
const data = this.serialize();
writeFile(destination, data);
return data;
}
/**
* Extract messages from file using specialized parser
*/
protected _extractMessages(filePath: string): string[] {
const ext: string = filePath.split('.').pop();
if (!this.parsers.hasOwnProperty(ext)) {
return [];
}
const contents: string = readFile(filePath).toString();
const parser: ParserInterface = this.parsers[ext];
return parser.process(contents);
}
}