angular-l10n
Version:
Angular library to translate texts, dates and numbers
49 lines • 5.97 kB
JavaScript
/**
* Breadth First Search (BFS) algorithm for traversing & searching tree data structure of DOM
* explores the neighbor nodes first, before moving to the next level neighbors.
* Time complexity: between O(1) and O(|V|^2).
*/
export function getTargetNode(rootNode) {
return walk(rootNode);
}
const MAX_DEPTH = 10;
function walk(rootNode) {
const queue = [];
let iNode;
let depth = 0;
let nodeToDepthIncrease = 1;
queue.push(rootNode);
while (queue.length > 0 && depth <= MAX_DEPTH) {
iNode = queue.splice(0, 1)[0];
if (isTargetNode(iNode))
return iNode;
if (depth < MAX_DEPTH && iNode.childNodes) {
for (const child of Array.from(iNode.childNodes)) {
if (isValidNode(child)) {
queue.push(child);
}
}
}
if (--nodeToDepthIncrease === 0) {
depth++;
nodeToDepthIncrease = queue.length;
}
}
return rootNode;
}
function isTargetNode(node) {
return typeof node !== 'undefined' && node.nodeType === 3 && node.nodeValue != null && node.nodeValue.trim() !== '';
}
/**
* A valid node is not marked for translation.
*/
function isValidNode(node) {
if (typeof node !== 'undefined' && node.nodeType === 1 && node.attributes) {
for (const attr of Array.from(node.attributes)) {
if (attr && /^l10n|translate/.test(attr.name))
return false;
}
}
return true;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmZzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1sMTBuL3NyYy9saWIvbW9kZWxzL2Jmcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxRQUFxQjtJQUMvQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO0FBRXJCLFNBQVMsSUFBSSxDQUFDLFFBQXFCO0lBQy9CLE1BQU0sS0FBSyxHQUFrQixFQUFFLENBQUM7SUFFaEMsSUFBSSxLQUFrQixDQUFDO0lBQ3ZCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLElBQUksbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0lBRTVCLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckIsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksU0FBUyxFQUFFO1FBQzNDLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN0QyxJQUFJLEtBQUssR0FBRyxTQUFTLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRTtZQUN2QyxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUM5QyxJQUFJLFdBQVcsQ0FBQyxLQUFvQixDQUFDLEVBQUU7b0JBQ25DLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBb0IsQ0FBQyxDQUFDO2lCQUNwQzthQUNKO1NBQ0o7UUFDRCxJQUFJLEVBQUUsbUJBQW1CLEtBQUssQ0FBQyxFQUFFO1lBQzdCLEtBQUssRUFBRSxDQUFDO1lBQ1IsbUJBQW1CLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztTQUN0QztLQUNKO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDcEIsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLElBQWlCO0lBQ25DLE9BQU8sT0FBTyxJQUFJLEtBQUssV0FBVyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3hILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsV0FBVyxDQUFDLElBQWlCO0lBQ2xDLElBQUksT0FBTyxJQUFJLEtBQUssV0FBVyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7UUFDdkUsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUM1QyxJQUFJLElBQUksSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztTQUMvRDtLQUNKO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBCcmVhZHRoIEZpcnN0IFNlYXJjaCAoQkZTKSBhbGdvcml0aG0gZm9yIHRyYXZlcnNpbmcgJiBzZWFyY2hpbmcgdHJlZSBkYXRhIHN0cnVjdHVyZSBvZiBET01cclxuICogZXhwbG9yZXMgdGhlIG5laWdoYm9yIG5vZGVzIGZpcnN0LCBiZWZvcmUgbW92aW5nIHRvIHRoZSBuZXh0IGxldmVsIG5laWdoYm9ycy5cclxuICogVGltZSBjb21wbGV4aXR5OiBiZXR3ZWVuIE8oMSkgYW5kIE8ofFZ8XjIpLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcmdldE5vZGUocm9vdE5vZGU6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xyXG4gICAgcmV0dXJuIHdhbGsocm9vdE5vZGUpO1xyXG59XHJcblxyXG5jb25zdCBNQVhfREVQVEggPSAxMDtcclxuXHJcbmZ1bmN0aW9uIHdhbGsocm9vdE5vZGU6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xyXG4gICAgY29uc3QgcXVldWU6IEhUTUxFbGVtZW50W10gPSBbXTtcclxuXHJcbiAgICBsZXQgaU5vZGU6IEhUTUxFbGVtZW50O1xyXG4gICAgbGV0IGRlcHRoID0gMDtcclxuICAgIGxldCBub2RlVG9EZXB0aEluY3JlYXNlID0gMTtcclxuXHJcbiAgICBxdWV1ZS5wdXNoKHJvb3ROb2RlKTtcclxuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwICYmIGRlcHRoIDw9IE1BWF9ERVBUSCkge1xyXG4gICAgICAgIGlOb2RlID0gcXVldWUuc3BsaWNlKDAsIDEpWzBdO1xyXG4gICAgICAgIGlmIChpc1RhcmdldE5vZGUoaU5vZGUpKSByZXR1cm4gaU5vZGU7XHJcbiAgICAgICAgaWYgKGRlcHRoIDwgTUFYX0RFUFRIICYmIGlOb2RlLmNoaWxkTm9kZXMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBBcnJheS5mcm9tKGlOb2RlLmNoaWxkTm9kZXMpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZE5vZGUoY2hpbGQgYXMgSFRNTEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcXVldWUucHVzaChjaGlsZCBhcyBIVE1MRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKC0tbm9kZVRvRGVwdGhJbmNyZWFzZSA9PT0gMCkge1xyXG4gICAgICAgICAgICBkZXB0aCsrO1xyXG4gICAgICAgICAgICBub2RlVG9EZXB0aEluY3JlYXNlID0gcXVldWUubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByb290Tm9kZTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNUYXJnZXROb2RlKG5vZGU6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdHlwZW9mIG5vZGUgIT09ICd1bmRlZmluZWQnICYmIG5vZGUubm9kZVR5cGUgPT09IDMgJiYgbm9kZS5ub2RlVmFsdWUgIT0gbnVsbCAmJiBub2RlLm5vZGVWYWx1ZS50cmltKCkgIT09ICcnO1xyXG59XHJcblxyXG4vKipcclxuICogQSB2YWxpZCBub2RlIGlzIG5vdCBtYXJrZWQgZm9yIHRyYW5zbGF0aW9uLlxyXG4gKi9cclxuZnVuY3Rpb24gaXNWYWxpZE5vZGUobm9kZTogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgIGlmICh0eXBlb2Ygbm9kZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGF0dHIgb2YgQXJyYXkuZnJvbShub2RlLmF0dHJpYnV0ZXMpKSB7XHJcbiAgICAgICAgICAgIGlmIChhdHRyICYmIC9ebDEwbnx0cmFuc2xhdGUvLnRlc3QoYXR0ci5uYW1lKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbiJdfQ==