UNPKG

yoastseo

Version:

Yoast client-side content analysis

154 lines (146 loc) 5.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _lodash = require("lodash"); var _assessor = _interopRequireDefault(require("./assessor.js")); var _ParagraphTooLongAssessment = _interopRequireDefault(require("../assessments/readability/ParagraphTooLongAssessment.js")); var _SentenceLengthInTextAssessment = _interopRequireDefault(require("../assessments/readability/SentenceLengthInTextAssessment.js")); var _SubheadingDistributionTooLongAssessment = _interopRequireDefault(require("../assessments/readability/SubheadingDistributionTooLongAssessment.js")); var _TransitionWordsAssessment = _interopRequireDefault(require("../assessments/readability/TransitionWordsAssessment.js")); var _PassiveVoiceAssessment = _interopRequireDefault(require("../assessments/readability/PassiveVoiceAssessment.js")); var _SentenceBeginningsAssessment = _interopRequireDefault(require("../assessments/readability/SentenceBeginningsAssessment.js")); var _TextPresenceAssessment = _interopRequireDefault(require("../assessments/readability/TextPresenceAssessment.js")); var _scoreToRating = _interopRequireDefault(require("../interpreters/scoreToRating.js")); var _scoreAggregators = require("../scoreAggregators"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /** * The ContentAssessor class is used for the readability analysis. */ class ContentAssessor extends _assessor.default { /** * Creates a new ContentAssessor instance. * @param {Researcher} researcher The researcher to use. * @param {Object} [options] The assessor options. */ constructor(researcher, options) { super(researcher, options); this.type = "contentAssessor"; this._assessments = [new _SubheadingDistributionTooLongAssessment.default(), new _ParagraphTooLongAssessment.default(), new _SentenceLengthInTextAssessment.default(), new _TransitionWordsAssessment.default(), new _PassiveVoiceAssessment.default(), new _TextPresenceAssessment.default(), new _SentenceBeginningsAssessment.default()]; this._scoreAggregator = new _scoreAggregators.ReadabilityScoreAggregator(); } /** * Calculates the weighted rating for languages that have all assessments based on a given rating. * * @param {string} rating The rating to be weighted. * @returns {number} The weighted rating. */ calculatePenaltyPointsFullSupport(rating) { switch (rating) { case "bad": return 3; case "ok": return 2; default: case "good": return 0; } } /** * Calculates the weighted rating for languages that don't have all assessments based on a given rating. * * @param {string} rating The rating to be weighted. * @returns {number} The weighted rating. */ calculatePenaltyPointsPartialSupport(rating) { switch (rating) { case "bad": return 4; case "ok": return 2; default: case "good": return 0; } } /** * Determines whether a language is fully supported. If a language supports 7 content assessments, * it is fully supported * * @returns {boolean} True if fully supported. */ _allAssessmentsSupported() { const numberOfAssessments = this._assessments.length; const applicableAssessments = this.getApplicableAssessments(); return applicableAssessments.length === numberOfAssessments; } /** * Calculates the penalty points based on the assessment results. * * @returns {number} The total penalty points for the results. */ calculatePenaltyPoints() { const results = this.getValidResults(); const penaltyPoints = (0, _lodash.map)(results, function (result) { const rating = (0, _scoreToRating.default)(result.getScore()); if (this._allAssessmentsSupported()) { return this.calculatePenaltyPointsFullSupport(rating); } return this.calculatePenaltyPointsPartialSupport(rating); }.bind(this)); return (0, _lodash.sum)(penaltyPoints); } /** * Rates the penalty points * * @param {number} totalPenaltyPoints The amount of penalty points. * @returns {number} The score based on the amount of penalty points. * * @private */ _ratePenaltyPoints(totalPenaltyPoints) { if (this.getValidResults().length === 1) { // If we have only 1 result, we only have a "no content" result return 30; } if (this._allAssessmentsSupported()) { // Determine the total score based on the total penalty points. if (totalPenaltyPoints > 6) { // A red indicator. return 30; } if (totalPenaltyPoints > 4) { // An orange indicator. return 60; } } else { if (totalPenaltyPoints > 4) { // A red indicator. return 30; } if (totalPenaltyPoints > 2) { // An orange indicator. return 60; } } // A green indicator. return 90; } /** * Calculates the overall score based on the assessment results. * * @returns {number} The overall score. */ calculateOverallScore() { const results = this.getValidResults(); // If you have no content, you have a red indicator. if (results.length === 0) { return 30; } const totalPenaltyPoints = this.calculatePenaltyPoints(); return this._ratePenaltyPoints(totalPenaltyPoints); } } exports.default = ContentAssessor; //# sourceMappingURL=contentAssessor.js.map