UNPKG

yoastseo

Version:

Yoast client-side content analysis

181 lines (170 loc) 6.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _i18n = require("@wordpress/i18n"); var _AssessmentResult = _interopRequireDefault(require("../../values/AssessmentResult")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /** * Analyzes a paper by doing a list of assessments on a tree representation of a text and its metadata. * Aggregates the scores on each individual assessment into an overall score. * * This score can represent anything from the readability to the SEO of the given text and metadata. * * @memberOf module:parsedPaper/assess */ class TreeAssessor { /** * Creates a new assessor. * * @param {Object} options Assessor options. * @param {module:parsedPaper/research.TreeResearcher} options.researcher Supplies the assessments with researches and their * (cached) results. * @param {module:parsedPaper/assess.ScoreAggregator} options.scoreAggregator Aggregates the scores on the individual assessments into one. * @param {module:parsedPaper/assess.Assessment[]} [options.assessments] The list of assessments to apply. */ constructor(options) { /** * Supplies the assessments with researches and their (cached) results. * @type {module:parsedPaper/research.TreeResearcher} */ this.researcher = options.researcher; /** * Aggregates the scores on the individual assessments into one overall score. * @type {module:parsedPaper/assess.ScoreAggregator} */ this.scoreAggregator = options.scoreAggregator; /** * The list of assessments to apply. * @type {module:parsedPaper/assess.Assessment[]} */ this._assessments = options.assessments || []; // Make sure that all of the assessments have the researcher. this._assessments.forEach(assessment => assessment.setResearcher(this.researcher)); } /** * Returns the list of available assessments. * * @returns {module:parsedPaper/assess.Assessment[]} The list of all available assessments. */ getAssessments() { return this._assessments; } /** * Assesses the given text by applying all the assessments to it * and aggregating the resulting scores. * * @param {Paper} paper The paper to assess. This contains metadata about the text. * @param {module:parsedPaper/structure.Node} node The root node of the tree to check. * * @returns {Promise<{results: AssessmentResult[], score: number}>} The assessment results and the overall score. */ async assess(paper, node) { const applicableAssessments = await this.getApplicableAssessments(paper, node); /* Apply every applicable assessment on the document. Wait before they are done before aggregating the results and returning the results and final score. */ const results = await Promise.all(applicableAssessments.map(assessment => this.applyAssessment(assessment, paper, node))); // Filter out errored assessments. const validResults = results.filter(result => result.getScore() !== -1); // Compute overall score. const score = this.scoreAggregator.aggregate(validResults); return { results, score }; } /** * Applies the given assessment to the paper-node combination. * * @param {module:parsedPaper/assess.Assessment} assessment The assessment to apply. * @param {Paper} paper The paper to apply the assessment to. * @param {module:parsedPaper/structure.Node} node The root node of the tree to apply the assessment to. * * @returns {Promise<AssessmentResult>} The result of the assessment. */ async applyAssessment(assessment, paper, node) { return assessment.apply(paper, node).catch(() => { return new _AssessmentResult.default({ text: (0, _i18n.sprintf)(/* translators: %1$s expands to the name of the assessment. */ (0, _i18n.__)("An error occurred in the '%1$s' assessment", "wordpress-seo"), assessment.name), score: -1 }); }); } /** * Adds the assessment to the list of assessments to apply. * * @param {string} name The name to register the assessment under. * @param {module:parsedPaper/assess.Assessment} assessment The assessment to add. * * @returns {void} */ registerAssessment(name, assessment) { assessment.name = name; assessment.setResearcher(this.researcher); this._assessments.push(assessment); } /** * Removes the assessment registered under the given name, if it exists. * * @param {string} name The name of the assessment to remove. * * @returns {module:parsedPaper/assess.Assessment|null} The deleted assessment, or null if no assessment has been deleted. */ removeAssessment(name) { const index = this._assessments.findIndex(assessment => assessment.name === name); if (index > -1) { const deleted = this._assessments.splice(index, 1); return deleted[0]; } return null; } /** * Returns the assessment registered under the given name. * Returns `null` if no assessment is registered under the given name. * * @param {string} name The name of the assessment to get. * * @returns {Assessment|null} The assessment. */ getAssessment(name) { const assessmentToReturn = this._assessments.find(assessment => assessment.name === name); return assessmentToReturn ? assessmentToReturn : null; } /** * Sets the assessments that this assessor needs to apply. * * @param {module:parsedPaper/assess.Assessment[]} assessments The assessments to set. * * @returns {void} */ setAssessments(assessments) { this._assessments = assessments; } /** * Returns the list of applicable assessments. * * @param {Paper} paper The paper to check. * @param {module:parsedPaper/structure.Node} node The tree to check. * * @returns {Promise<Array>} The list of applicable assessments. */ async getApplicableAssessments(paper, node) { // List to store the applicable assessments in (empty for now). const applicableAssessments = []; // Asynchronously add each assessment to the list if they are applicable. const promises = this._assessments.map(assessment => assessment.isApplicable(paper, node).then(applicable => { if (applicable) { applicableAssessments.push(assessment); } })); // Wait before all the applicable assessments have been added before returning them. return Promise.all(promises).then(() => applicableAssessments); } } var _default = exports.default = TreeAssessor; //# sourceMappingURL=TreeAssessor.js.map