yoastseo-dep
Version:
Yoast clientside page analysis
127 lines (113 loc) • 3.99 kB
JavaScript
import { __, sprintf } from "@wordpress/i18n";
import { merge } from "lodash-es";
import Assessment from "../assessment";
import { createAnchorOpeningTag } from "../../../helpers/shortlinker";
import AssessmentResult from "../../../values/AssessmentResult";
/**
* Assessment to check whether the keyphrase or synonyms are encountered in the first paragraph of the article.
*/
class IntroductionKeywordAssessment extends Assessment {
/**
* Sets the identifier and the config.
*
* @param {Object} [config] The configuration to use.
* @param {number} [config.scores.good] The score to return if there is a match within one sentence in the first paragraph.
* @param {number} [config.scores.okay] The score to return if all words are matched in the first paragraph.
* @param {number} [config.scores.bad] The score to return if not all words are matched in the first paragraph.
* @param {string} [config.url] The URL to the relevant article on Yoast.com.
*
* @returns {void}
*/
constructor( config = {} ) {
super();
const defaultConfig = {
scores: {
good: 9,
okay: 6,
bad: 3,
},
urlTitle: createAnchorOpeningTag( "https://yoa.st/33e" ),
urlCallToAction: createAnchorOpeningTag( "https://yoa.st/33f" ),
};
this.identifier = "introductionKeyword";
this._config = merge( defaultConfig, config );
}
/**
* Assesses the presence of keyphrase or synonyms in the first paragraph.
*
* @param {Paper} paper The paper to use for the assessment.
* @param {Researcher} researcher The researcher used for calling research.
*
* @returns {AssessmentResult} The result of this assessment.
*/
getResult( paper, researcher ) {
const assessmentResult = new AssessmentResult();
this._firstParagraphMatches = researcher.getResearch( "findKeywordInFirstParagraph" );
const calculatedResult = this.calculateResult();
assessmentResult.setScore( calculatedResult.score );
assessmentResult.setText( calculatedResult.resultText );
return assessmentResult;
}
/**
* Checks if the paper has both keyword and text.
*
* @param {Paper} paper The paper to be analyzed.
*
* @returns {boolean} Whether the assessment is applicable or not.
*/
isApplicable( paper ) {
return paper.hasKeyword() && paper.hasText();
}
/**
* Returns a result based on the number of occurrences of keyphrase in the first paragraph.
*
* @returns {Object} result object with a score and translation text.
*/
calculateResult() {
if ( this._firstParagraphMatches.foundInOneSentence ) {
return {
score: this._config.scores.good,
resultText: sprintf(
/* translators: %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag. */
__(
"%1$sKeyphrase in introduction%2$s: Well done!",
"wordpress-seo"
),
this._config.urlTitle,
"</a>"
),
};
}
if ( this._firstParagraphMatches.foundInParagraph ) {
return {
score: this._config.scores.okay,
resultText: sprintf(
/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag. */
__(
// eslint-disable-next-line max-len
"%1$sKeyphrase in introduction%3$s: Your keyphrase or its synonyms appear in the first paragraph of the copy, but not within one sentence. %2$sFix that%3$s!",
"wordpress-seo"
),
this._config.urlTitle,
this._config.urlCallToAction,
"</a>"
),
};
}
return {
score: this._config.scores.bad,
resultText: sprintf(
/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag. */
__(
// eslint-disable-next-line max-len
"%1$sKeyphrase in introduction%3$s: Your keyphrase or its synonyms do not appear in the first paragraph. %2$sMake sure the topic is clear immediately%3$s.",
"wordpress-seo"
),
this._config.urlTitle,
this._config.urlCallToAction,
"</a>"
),
};
}
}
export default IntroductionKeywordAssessment;