webpack-angular-translate
Version:
Webpack plugin that extracts the translation-ids with the default texts.
105 lines • 4.82 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __spreadArrays = (this && this.__spreadArrays) || function () {
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var path = __importStar(require("path"));
var cheerio = __importStar(require("cheerio"));
var loaderUtils = __importStar(require("loader-utils"));
var translate_directive_translation_extractor_1 = __importDefault(require("./translate-directive-translation-extractor"));
var translate_html_parser_1 = __importStar(require("./translate-html-parser"));
/**
* Loader that must be used together with the plugin. The loader parses the html content and extracts all
* translate elements, elements with a translate attribute or translate filter.
*
* The loader communicates with the plugin by the registerTranslation functions provided by the plugin (loader.registerTranslation).
* The plugin is responsible for merging the translations and emitting them.
*
* The plugin is required because the loader doesn't know when all files have been processed. The plugin removes
* all suppress-dynamic-translation-error attributes for non dev builds.
*
* The following cases are supported:
* @example
* <span translate>TRANSLATE-ID</span>
* <translate>TRANSLATE-ID</translate>
*
* <span translate translate-default="Default Text">TRANSLATE-ID</span>
* <translate translate-default="Default Text">TRANSLATE-ID</translate>
*
* <span translate translate-attr-title="TRANSLATE-ID">Content</span>
* <translate translate-attr-title="TRANSLATE-ID">Content</translate>
*
* <span translate translate-attr-title="TRANSLATE-ID" translate-default-attr-title="Default Text">Content</span>
*
* <h1 title="{{ 'My title' | translate }}"></h1>
* <h2>{{ 'My long translation' | translate | limitTo:20 }}</h2>
*
* <span>{{ "4" | translate }} {{ "x" | translate }}</span>
*
* @param source the content of the file (expected to be html or xml)
* @param sourceMaps the source maps
*/
function loader(source, sourceMaps) {
"use strict";
var loader = this;
if (!loader.registerTranslation) {
return this.callback(new Error("The WebpackAngularTranslate plugin is missing. Add the plugin to your webpack configurations 'plugins' section."), source, sourceMaps);
}
if (this.cacheable) {
this.cacheable();
}
loader.pruneTranslations(path.relative(loader.context, loader.resourcePath));
var options = loaderUtils.getOptions(loader) || {};
var translationExtractors = __spreadArrays((options.translationExtractors || []), [
translate_directive_translation_extractor_1.default,
]);
// Don't parse the HTML if none of the extractors detect any possible translations.
if (translationExtractors.every(function (extractor) {
return extractor.mayContainTranslations != null &&
!extractor.mayContainTranslations(source);
})) {
return this.callback(null, source, sourceMaps);
}
new translate_html_parser_1.default(loader, translationExtractors).parse(source);
var result = source;
if (!this.debug) {
result = removeSuppressTranslationErrorAttributes(source);
}
this.callback(null, result, sourceMaps);
}
function removeSuppressTranslationErrorAttributes(source) {
var $ = cheerio.load(source);
var elementsWithSuppressAttribute = $("[" + translate_html_parser_1.SUPPRESS_ATTRIBUTE_NAME + "]");
if (elementsWithSuppressAttribute.length === 0) {
return source;
}
elementsWithSuppressAttribute.removeAttr(translate_html_parser_1.SUPPRESS_ATTRIBUTE_NAME);
return $.html();
}
module.exports = loader;
//# sourceMappingURL=html-loader.js.map