yoastseo
Version:
Yoast client-side content analysis
154 lines (146 loc) • 5.5 kB
JavaScript
"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