attranslate
Version:
Text Translator for Websites and Apps
111 lines (110 loc) • 3.77 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.areEqual = exports.leftMinusRight = exports.joinResultsPreserveOrder = exports.selectLeftDistinct = void 0;
const core_util_1 = require("./core-util");
function selectLeftDistinct(left, right, strategy) {
const leftDistinct = new Map();
left.forEach((leftValue, key) => {
const rightValue = right.get(key);
const distinct = compareLeftRight({ leftValue, rightValue, strategy });
if (distinct) {
leftDistinct.set(key, leftValue);
}
});
return leftDistinct;
}
exports.selectLeftDistinct = selectLeftDistinct;
function compareLeftRight(args) {
switch (args.strategy) {
case "COMPARE_KEYS":
return args.rightValue === undefined;
case "COMPARE_KEYS_AND_NULL_VALUES":
return (args.rightValue === undefined ||
(args.rightValue === null && args.leftValue !== null));
case "COMPARE_VALUES":
return (args.rightValue !== undefined && args.leftValue !== args.rightValue);
}
}
function joinResultsPreserveOrder(args) {
// To prevent file-scrambling, we have to preserve the order of the old target.
const targetOrder = [];
args.oldTarget.forEach((value, key) => {
targetOrder.push(key);
});
// Newly added translations are more flexible in its position.
// Therefore, we try to mimic the order of src.
injectNewKeysIntoTargetOrder({
targetOrder,
newlyAdded: args.changeSet.added,
oldTarget: args.oldTarget,
src: args.src,
});
// Create an in-order map out of the determined targetOrder
const joinResult = new Map();
targetOrder.forEach((key) => {
const freshResult = args.translateResults.get(key);
const oldResult = args.oldTarget.get(key);
if (freshResult !== undefined) {
joinResult.set(key, freshResult);
}
else if (oldResult !== undefined) {
joinResult.set(key, oldResult);
}
});
// Add any remaining newly added translations whose target order was not determined.
args.changeSet.added.forEach((value, key) => {
if (!joinResult.has(key)) {
joinResult.set(key, value);
}
});
return joinResult;
}
exports.joinResultsPreserveOrder = joinResultsPreserveOrder;
function injectNewKeysIntoTargetOrder(args) {
let injectPosition = 0;
args.src.forEach((srcValue, srcKey) => {
if (args.oldTarget.get(srcKey) !== undefined) {
injectPosition =
1 +
(0, core_util_1.getElementPosition)({
array: args.targetOrder,
element: srcKey,
});
}
if (args.newlyAdded.get(srcKey) !== undefined) {
(0, core_util_1.insertAt)(args.targetOrder, injectPosition, srcKey);
injectPosition++;
}
});
}
function leftMinusRight(left, right) {
const leftRemaining = new Map();
left.forEach((value, key) => {
if (!right.has(key)) {
leftRemaining.set(key, value);
}
});
return leftRemaining;
}
exports.leftMinusRight = leftMinusRight;
function areEqual(set1, set2) {
if (set1.size !== set2.size) {
return false;
}
for (const key1 of set1.keys()) {
const value1 = set1.get(key1);
const value2 = set2.get(key1);
if (value1 !== value2) {
return false;
}
}
for (const key2 of set2.keys()) {
const value1 = set1.get(key2);
const value2 = set2.get(key2);
if (value1 !== value2) {
return false;
}
}
return true;
}
exports.areEqual = areEqual;