yoastseo
Version:
Yoast client-side content analysis
159 lines (148 loc) • 4.64 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _lodash = require("lodash");
var _SourceCodeLocation = _interopRequireDefault(require("../SourceCodeLocation"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/**
* Abstract class representing a node in the structured tree.
* @abstract
*
* @memberOf module:parsedPaper/structure
*/
class Node {
/**
* Makes a new Node.
*
* @param {string} type The type of Node (should be unique for each child class of Node).
* @param {?Object} sourceCodeLocation The parse5 formatted location of the element inside of the source code.
*
* @abstract
*/
constructor(type, sourceCodeLocation) {
/**
* Type of node (unique for each child class of Node).
* @type {string}
*/
this.type = type;
if (sourceCodeLocation) {
/**
* Location inside of the source code.
* @type {SourceCodeLocation}
*/
this.sourceCodeLocation = new _SourceCodeLocation.default(sourceCodeLocation);
}
/**
* The parent node of this node.
* @type {module:parsedPaper/structure.Node|null}
*/
this.parent = null;
/**
* Cache for the research results.
* @type {Object}
* @private
*/
this._researchResult = {};
}
/**
* Stores the research result on this node.
*
* @param {string} researchName The name of the research of which to store the results.
* @param {Object} researchResult The results to store.
*
* @returns {void}
*/
setResearchResult(researchName, researchResult) {
this._researchResult[researchName] = researchResult;
}
/**
* Returns the research result for the research with the given name.
*
* @param {string} researchName The name of the research of which to return the stored results.
*
* @returns {Object|null} The stored results, or null if not found.
*/
getResearchResult(researchName) {
return (0, _lodash.get)(this._researchResult, researchName, null);
}
/**
* Checks whether results exist for the research with the given name.
*
* @param {string} researchName The name of the research to check.
*
* @returns {boolean} Whether results exists for the research with the given name.
*/
hasResearchResult(researchName) {
return (0, _lodash.has)(this._researchResult, researchName);
}
/**
* Maps the given function to each Node in this tree.
*
* @param {module:parsedPaper/structure.Node.mapFunction} mapFunction The function that should be mapped to each Node in the tree.
*
* @returns {module:parsedPaper/structure.Node} A new tree, after the given function has been mapped on each Node.
*/
map(mapFunction) {
// Map function over contents of this node.
const node = mapFunction(this);
if (node.children && node.children.length > 0) {
// Map function over node's children (if it has any).
node.children = node.children.map(child => child.map(mapFunction));
}
return node;
}
/**
* Callback function for the Node's map-function.
*
* @callback module:parsedPaper/structure.Node.mapFunction
*
* @param {module:parsedPaper/structure.Node} currentValue The current Node being processed.
*
* @returns {module:parsedPaper/structure.Node} The current Node after being processed by this function.
*/
/**
* Executes the given function on each node in this tree.
*
* @param{function} fun The function to apply to each node in the tree.
*
* @returns {void}
*/
forEach(fun) {
fun(this);
if (this.children && this.children.length > 0) {
this.children.forEach(fun);
}
}
/**
* Custom replacer function for replacing 'parent' with nothing.
* This is done to remove cycles from the tree.
*
* @param {string} key The key.
* @param {Object} value The value.
*
* @returns {Object} The (optionally replaced) value.
*
* @private
*/
static _removeParent(key, value) {
if (key === "parent") {
return;
}
return value;
}
/**
* Transforms this tree to a string representation.
* For use in e.g. logging to the console or to a text file.
*
* @param {number|string} [indentation = 2] The space with which to indent each successive level in the JSON tree.
*
* @returns {string} This tree, transformed to a string.
*/
toString(indentation = 2) {
return JSON.stringify(this, Node._removeParent, indentation);
}
}
var _default = exports.default = Node;
//# sourceMappingURL=Node.js.map