axyseo 2.1.22 → 2.1.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/build/cjs/const/analysis.js +3 -40
  2. package/build/cjs/const/analysis.js.map +1 -1
  3. package/build/cjs/index.js +8 -0
  4. package/build/cjs/index.js.map +1 -1
  5. package/build/cjs/languageProcessing/AbstractResearcher.js +1 -3
  6. package/build/cjs/languageProcessing/AbstractResearcher.js.map +1 -1
  7. package/build/cjs/languageProcessing/languages/ja/helpers/countCharacters.js +1 -5
  8. package/build/cjs/languageProcessing/languages/ja/helpers/countCharacters.js.map +1 -1
  9. package/build/cjs/languageProcessing/researches/checkRelatedKeywords.js +1 -0
  10. package/build/cjs/languageProcessing/researches/checkRelatedKeywords.js.map +1 -1
  11. package/build/cjs/languageProcessing/researches/getKeywordDensity.js.map +1 -1
  12. package/build/cjs/scoring/assessments/assessment.js +6 -5
  13. package/build/cjs/scoring/assessments/assessment.js.map +1 -1
  14. package/build/cjs/scoring/assessments/index.js +6 -12
  15. package/build/cjs/scoring/assessments/index.js.map +1 -1
  16. package/build/cjs/scoring/assessments/readability/ParagraphTooLongAssessment.js +17 -18
  17. package/build/cjs/scoring/assessments/readability/ParagraphTooLongAssessment.js.map +1 -1
  18. package/build/cjs/scoring/assessments/readability/RelatedKeywordsAssessment.js +25 -11
  19. package/build/cjs/scoring/assessments/readability/RelatedKeywordsAssessment.js.map +1 -1
  20. package/build/cjs/scoring/assessments/readability/SentenceBeginningsAssessment.js +1 -3
  21. package/build/cjs/scoring/assessments/readability/SentenceBeginningsAssessment.js.map +1 -1
  22. package/build/cjs/scoring/assessments/readability/SentenceLengthInTextAssessment.js +11 -13
  23. package/build/cjs/scoring/assessments/readability/SentenceLengthInTextAssessment.js.map +1 -1
  24. package/build/cjs/scoring/assessments/readability/TransitionWordsAssessment.js +1 -1
  25. package/build/cjs/scoring/assessments/readability/TransitionWordsAssessment.js.map +1 -1
  26. package/build/cjs/scoring/assessments/seo/FAQsAssessment.js +52 -7
  27. package/build/cjs/scoring/assessments/seo/FAQsAssessment.js.map +1 -1
  28. package/build/cjs/scoring/assessments/seo/ImageCountAssessment.js +2 -2
  29. package/build/cjs/scoring/assessments/seo/ImageCountAssessment.js.map +1 -1
  30. package/build/cjs/scoring/assessments/seo/InternalLinksAssessment.js +5 -5
  31. package/build/cjs/scoring/assessments/seo/InternalLinksAssessment.js.map +1 -1
  32. package/build/cjs/scoring/assessments/seo/IntroductionKeywordAssessment.js +5 -4
  33. package/build/cjs/scoring/assessments/seo/IntroductionKeywordAssessment.js.map +1 -1
  34. package/build/cjs/scoring/assessments/seo/KeyphraseAssessment.js +4 -4
  35. package/build/cjs/scoring/assessments/seo/KeyphraseAssessment.js.map +1 -1
  36. package/build/cjs/scoring/assessments/seo/KeyphraseLengthAssessment.js +6 -5
  37. package/build/cjs/scoring/assessments/seo/KeyphraseLengthAssessment.js.map +1 -1
  38. package/build/cjs/scoring/assessments/seo/KeywordDensityAssessment.js +5 -3
  39. package/build/cjs/scoring/assessments/seo/KeywordDensityAssessment.js.map +1 -1
  40. package/build/cjs/scoring/assessments/seo/KeywordFAQsAssessment.js +3 -3
  41. package/build/cjs/scoring/assessments/seo/KeywordFAQsAssessment.js.map +1 -1
  42. package/build/cjs/scoring/assessments/seo/MetaDescriptionKeywordAssessment.js +6 -6
  43. package/build/cjs/scoring/assessments/seo/MetaDescriptionKeywordAssessment.js.map +1 -1
  44. package/build/cjs/scoring/assessments/seo/MetaDescriptionLengthAssessment.js +6 -3
  45. package/build/cjs/scoring/assessments/seo/MetaDescriptionLengthAssessment.js.map +1 -1
  46. package/build/cjs/scoring/assessments/seo/MetaTitleKeywordAssessment.js +2 -2
  47. package/build/cjs/scoring/assessments/seo/MetaTitleKeywordAssessment.js.map +1 -1
  48. package/build/cjs/scoring/assessments/seo/NumberInMetaTitleAssessment.js +2 -2
  49. package/build/cjs/scoring/assessments/seo/NumberInMetaTitleAssessment.js.map +1 -1
  50. package/build/cjs/scoring/assessments/seo/OutboundLinksAssessment.js +6 -5
  51. package/build/cjs/scoring/assessments/seo/OutboundLinksAssessment.js.map +1 -1
  52. package/build/cjs/scoring/assessments/seo/PageTitleWidthAssessment.js +5 -3
  53. package/build/cjs/scoring/assessments/seo/PageTitleWidthAssessment.js.map +1 -1
  54. package/build/cjs/scoring/assessments/seo/SchemaAssessment.js +2 -16
  55. package/build/cjs/scoring/assessments/seo/SchemaAssessment.js.map +1 -1
  56. package/build/cjs/scoring/assessments/seo/SingleH1Assessment.js +3 -3
  57. package/build/cjs/scoring/assessments/seo/SingleH1Assessment.js.map +1 -1
  58. package/build/cjs/scoring/assessments/seo/SingleTitleAssessment.js +5 -3
  59. package/build/cjs/scoring/assessments/seo/SingleTitleAssessment.js.map +1 -1
  60. package/build/cjs/scoring/assessments/seo/SubHeadingsKeywordAssessment.js +5 -3
  61. package/build/cjs/scoring/assessments/seo/SubHeadingsKeywordAssessment.js.map +1 -1
  62. package/build/cjs/scoring/assessments/seo/TextImagesAssessment.js +4 -5
  63. package/build/cjs/scoring/assessments/seo/TextImagesAssessment.js.map +1 -1
  64. package/build/cjs/scoring/assessments/seo/TextLengthAssessment.js +17 -52
  65. package/build/cjs/scoring/assessments/seo/TextLengthAssessment.js.map +1 -1
  66. package/build/cjs/scoring/assessments/seo/UrlKeywordAssessment.js +3 -3
  67. package/build/cjs/scoring/assessments/seo/UrlKeywordAssessment.js.map +1 -1
  68. package/build/cjs/scoring/assessments/seo/UrlLengthAssessment.js +4 -2
  69. package/build/cjs/scoring/assessments/seo/UrlLengthAssessment.js.map +1 -1
  70. package/build/cjs/scoring/assessors/assessor.js +1 -0
  71. package/build/cjs/scoring/assessors/assessor.js.map +1 -1
  72. package/build/cjs/scoring/assessors/avadaAssessor.js +16 -2
  73. package/build/cjs/scoring/assessors/avadaAssessor.js.map +1 -1
  74. package/build/cjs/scoring/assessors/contentAssessor.js +2 -2
  75. package/build/cjs/scoring/assessors/contentAssessor.js.map +1 -1
  76. package/build/cjs/scoring/assessors/index.js +14 -0
  77. package/build/cjs/scoring/assessors/index.js.map +1 -1
  78. package/build/cjs/scoring/assessors/seoAssessor.js +4 -6
  79. package/build/cjs/scoring/assessors/seoAssessor.js.map +1 -1
  80. package/build/cjs/values/Paper.js +2 -10
  81. package/build/cjs/values/Paper.js.map +1 -1
  82. package/build/esm/const/analysis.js +2 -39
  83. package/build/esm/const/analysis.js.map +1 -1
  84. package/build/esm/index.js +3 -1
  85. package/build/esm/index.js.map +1 -1
  86. package/build/esm/languageProcessing/AbstractResearcher.js +1 -3
  87. package/build/esm/languageProcessing/AbstractResearcher.js.map +1 -1
  88. package/build/esm/languageProcessing/languages/ja/helpers/countCharacters.js +1 -5
  89. package/build/esm/languageProcessing/languages/ja/helpers/countCharacters.js.map +1 -1
  90. package/build/esm/languageProcessing/researches/checkRelatedKeywords.js +1 -0
  91. package/build/esm/languageProcessing/researches/checkRelatedKeywords.js.map +1 -1
  92. package/build/esm/languageProcessing/researches/getKeywordDensity.js.map +1 -1
  93. package/build/esm/scoring/assessments/assessment.js +7 -6
  94. package/build/esm/scoring/assessments/assessment.js.map +1 -1
  95. package/build/esm/scoring/assessments/index.js +6 -12
  96. package/build/esm/scoring/assessments/index.js.map +1 -1
  97. package/build/esm/scoring/assessments/readability/ParagraphTooLongAssessment.js +18 -19
  98. package/build/esm/scoring/assessments/readability/ParagraphTooLongAssessment.js.map +1 -1
  99. package/build/esm/scoring/assessments/readability/RelatedKeywordsAssessment.js +26 -12
  100. package/build/esm/scoring/assessments/readability/RelatedKeywordsAssessment.js.map +1 -1
  101. package/build/esm/scoring/assessments/readability/SentenceBeginningsAssessment.js +2 -4
  102. package/build/esm/scoring/assessments/readability/SentenceBeginningsAssessment.js.map +1 -1
  103. package/build/esm/scoring/assessments/readability/SentenceLengthInTextAssessment.js +12 -14
  104. package/build/esm/scoring/assessments/readability/SentenceLengthInTextAssessment.js.map +1 -1
  105. package/build/esm/scoring/assessments/readability/TransitionWordsAssessment.js +2 -2
  106. package/build/esm/scoring/assessments/readability/TransitionWordsAssessment.js.map +1 -1
  107. package/build/esm/scoring/assessments/seo/FAQsAssessment.js +53 -8
  108. package/build/esm/scoring/assessments/seo/FAQsAssessment.js.map +1 -1
  109. package/build/esm/scoring/assessments/seo/ImageCountAssessment.js +3 -3
  110. package/build/esm/scoring/assessments/seo/ImageCountAssessment.js.map +1 -1
  111. package/build/esm/scoring/assessments/seo/InternalLinksAssessment.js +6 -6
  112. package/build/esm/scoring/assessments/seo/InternalLinksAssessment.js.map +1 -1
  113. package/build/esm/scoring/assessments/seo/IntroductionKeywordAssessment.js +6 -5
  114. package/build/esm/scoring/assessments/seo/IntroductionKeywordAssessment.js.map +1 -1
  115. package/build/esm/scoring/assessments/seo/KeyphraseAssessment.js +5 -5
  116. package/build/esm/scoring/assessments/seo/KeyphraseAssessment.js.map +1 -1
  117. package/build/esm/scoring/assessments/seo/KeyphraseLengthAssessment.js +7 -6
  118. package/build/esm/scoring/assessments/seo/KeyphraseLengthAssessment.js.map +1 -1
  119. package/build/esm/scoring/assessments/seo/KeywordDensityAssessment.js +6 -4
  120. package/build/esm/scoring/assessments/seo/KeywordDensityAssessment.js.map +1 -1
  121. package/build/esm/scoring/assessments/seo/KeywordFAQsAssessment.js +4 -4
  122. package/build/esm/scoring/assessments/seo/KeywordFAQsAssessment.js.map +1 -1
  123. package/build/esm/scoring/assessments/seo/MetaDescriptionKeywordAssessment.js +8 -8
  124. package/build/esm/scoring/assessments/seo/MetaDescriptionKeywordAssessment.js.map +1 -1
  125. package/build/esm/scoring/assessments/seo/MetaDescriptionLengthAssessment.js +7 -4
  126. package/build/esm/scoring/assessments/seo/MetaDescriptionLengthAssessment.js.map +1 -1
  127. package/build/esm/scoring/assessments/seo/MetaTitleKeywordAssessment.js +3 -3
  128. package/build/esm/scoring/assessments/seo/MetaTitleKeywordAssessment.js.map +1 -1
  129. package/build/esm/scoring/assessments/seo/NumberInMetaTitleAssessment.js +3 -3
  130. package/build/esm/scoring/assessments/seo/NumberInMetaTitleAssessment.js.map +1 -1
  131. package/build/esm/scoring/assessments/seo/OutboundLinksAssessment.js +7 -6
  132. package/build/esm/scoring/assessments/seo/OutboundLinksAssessment.js.map +1 -1
  133. package/build/esm/scoring/assessments/seo/PageTitleWidthAssessment.js +6 -4
  134. package/build/esm/scoring/assessments/seo/PageTitleWidthAssessment.js.map +1 -1
  135. package/build/esm/scoring/assessments/seo/SchemaAssessment.js +3 -17
  136. package/build/esm/scoring/assessments/seo/SchemaAssessment.js.map +1 -1
  137. package/build/esm/scoring/assessments/seo/SingleH1Assessment.js +4 -4
  138. package/build/esm/scoring/assessments/seo/SingleH1Assessment.js.map +1 -1
  139. package/build/esm/scoring/assessments/seo/SingleTitleAssessment.js +6 -4
  140. package/build/esm/scoring/assessments/seo/SingleTitleAssessment.js.map +1 -1
  141. package/build/esm/scoring/assessments/seo/SubHeadingsKeywordAssessment.js +6 -4
  142. package/build/esm/scoring/assessments/seo/SubHeadingsKeywordAssessment.js.map +1 -1
  143. package/build/esm/scoring/assessments/seo/TextImagesAssessment.js +5 -6
  144. package/build/esm/scoring/assessments/seo/TextImagesAssessment.js.map +1 -1
  145. package/build/esm/scoring/assessments/seo/TextLengthAssessment.js +18 -54
  146. package/build/esm/scoring/assessments/seo/TextLengthAssessment.js.map +1 -1
  147. package/build/esm/scoring/assessments/seo/UrlKeywordAssessment.js +4 -4
  148. package/build/esm/scoring/assessments/seo/UrlKeywordAssessment.js.map +1 -1
  149. package/build/esm/scoring/assessments/seo/UrlLengthAssessment.js +5 -3
  150. package/build/esm/scoring/assessments/seo/UrlLengthAssessment.js.map +1 -1
  151. package/build/esm/scoring/assessors/assessor.js +1 -0
  152. package/build/esm/scoring/assessors/assessor.js.map +1 -1
  153. package/build/esm/scoring/assessors/avadaAssessor.js +17 -3
  154. package/build/esm/scoring/assessors/avadaAssessor.js.map +1 -1
  155. package/build/esm/scoring/assessors/contentAssessor.js +2 -2
  156. package/build/esm/scoring/assessors/contentAssessor.js.map +1 -1
  157. package/build/esm/scoring/assessors/index.js +2 -0
  158. package/build/esm/scoring/assessors/index.js.map +1 -1
  159. package/build/esm/scoring/assessors/seoAssessor.js +4 -6
  160. package/build/esm/scoring/assessors/seoAssessor.js.map +1 -1
  161. package/build/esm/values/Paper.js +2 -10
  162. package/build/esm/values/Paper.js.map +1 -1
  163. package/package.json +2 -4
  164. package/build/cjs/languageProcessing/researches/charactersInUrl.js +0 -26
  165. package/build/cjs/languageProcessing/researches/charactersInUrl.js.map +0 -1
  166. package/build/cjs/scoring/assessments/seo/FAQsStructureDataAssessment.js +0 -83
  167. package/build/cjs/scoring/assessments/seo/FAQsStructureDataAssessment.js.map +0 -1
  168. package/build/cjs/scoring/assessments/seo/InvalidCharactersInUrl.js +0 -93
  169. package/build/cjs/scoring/assessments/seo/InvalidCharactersInUrl.js.map +0 -1
  170. package/build/cjs/scoring/assessments/seo/RelatedKeywordsDensityAssessment.js +0 -103
  171. package/build/cjs/scoring/assessments/seo/RelatedKeywordsDensityAssessment.js.map +0 -1
  172. package/build/esm/languageProcessing/researches/charactersInUrl.js +0 -21
  173. package/build/esm/languageProcessing/researches/charactersInUrl.js.map +0 -1
  174. package/build/esm/scoring/assessments/seo/FAQsStructureDataAssessment.js +0 -76
  175. package/build/esm/scoring/assessments/seo/FAQsStructureDataAssessment.js.map +0 -1
  176. package/build/esm/scoring/assessments/seo/InvalidCharactersInUrl.js +0 -87
  177. package/build/esm/scoring/assessments/seo/InvalidCharactersInUrl.js.map +0 -1
  178. package/build/esm/scoring/assessments/seo/RelatedKeywordsDensityAssessment.js +0 -96
  179. package/build/esm/scoring/assessments/seo/RelatedKeywordsDensityAssessment.js.map +0 -1
@@ -70,27 +70,28 @@ class ParagraphTooLongAssessment extends _assessment.default {
70
70
  *
71
71
  * @param paragraphsLength
72
72
  * @param config
73
- * @param hasDescription
74
- * @returns {{score: number, status: (string)}}
73
+ * @returns {{score: number, status: string}}
75
74
  */
76
75
  calculateResult({
77
76
  paragraphsLength,
78
- config,
79
- hasDescription
77
+ config
80
78
  }) {
81
79
  let status = 'bad';
82
- if (paragraphsLength.length === 0 || !hasDescription) {
83
- status = 'bad';
80
+ if (paragraphsLength.length === 0) {
81
+ status = 'good';
84
82
  } else {
85
- const {
86
- recommendedLength,
87
- maximumRecommendedLength
88
- } = config.parameters;
89
- const length = paragraphsLength[0].countLength;
90
- const isGood = length <= recommendedLength || (0, _inRange.inRangeEndInclusive)(length, recommendedLength, maximumRecommendedLength);
91
- status = isGood ? 'good' : 'bad';
83
+ const longestParagraphLength = paragraphsLength[0].countLength;
84
+ if (longestParagraphLength <= config.parameters.recommendedLength) {
85
+ status = 'good';
86
+ }
87
+ if ((0, _inRange.inRangeEndInclusive)(longestParagraphLength, config.parameters.recommendedLength, config.parameters.maximumRecommendedLength)) {
88
+ status = 'good';
89
+ }
90
+ if (longestParagraphLength > config.parameters.maximumRecommendedLength) {
91
+ status = 'bad';
92
+ }
92
93
  }
93
- const score = this.getScore(_analysis.MAIN_CONTENT_POINTS, status);
94
+ const score = this.getScore(this._config.priority, status);
94
95
  return {
95
96
  score,
96
97
  status
@@ -124,11 +125,9 @@ class ParagraphTooLongAssessment extends _assessment.default {
124
125
  let paragraphsLength = researcher.getResearch('getParagraphLength');
125
126
  paragraphsLength = this.sortParagraphs(paragraphsLength);
126
127
  const config = this.getConfig(researcher);
127
- const hasDescription = paper.hasDescription();
128
128
  const paragraphLengthResult = this.calculateResult({
129
129
  paragraphsLength,
130
- config,
131
- hasDescription
130
+ config
132
131
  });
133
132
  const assessmentResult = new _AssessmentResult.default({
134
133
  config: this._config
@@ -146,7 +145,7 @@ class ParagraphTooLongAssessment extends _assessment.default {
146
145
  * @returns {boolean} Returns true if the assessment is applicable to the paper.
147
146
  */
148
147
  isApplicable(paper) {
149
- return true;
148
+ return this.hasEnoughContentForAssessment(paper);
150
149
  }
151
150
  }
152
151
  exports.default = ParagraphTooLongAssessment;
@@ -1 +1 @@
1
- {"version":3,"file":"ParagraphTooLongAssessment.js","names":["_lodash","require","_inRange","_AssessmentResult","_interopRequireDefault","_assessment","_analysis","e","__esModule","default","ParagraphTooLongAssessment","Assessment","constructor","config","defaultConfig","id","TEXT_PARAGRAPH_TOO_LONG_ID","priority","docUrl","fixPosition","ctaType","parameters","recommendedLength","maximumRecommendedLength","title","content","bad","improve","good","identifier","_config","merge","getConfig","researcher","currentConfig","languageSpecificConfig","_isProduct","productPageParams","defaultPageParams","calculateResult","paragraphsLength","hasDescription","status","length","countLength","isGood","inRange","score","getScore","MAIN_CONTENT_POINTS","sortParagraphs","paragraphs","sort","a","b","getResult","paper","getResearch","paragraphLengthResult","assessmentResult","AssessmentResult","setScore","setStatus","isApplicable","exports"],"sources":["../../../../../src/scoring/assessments/readability/ParagraphTooLongAssessment.js"],"sourcesContent":["import {merge} from 'lodash';\nimport {inRangeEndInclusive as inRange} from '../../helpers/assessments/inRange';\nimport AssessmentResult from '../../../values/AssessmentResult';\nimport Assessment from '../assessment';\nimport {MAIN_CONTENT_POINTS, TEXT_PARAGRAPH_TOO_LONG_ID} from '@axyseo/const/analysis';\n\n/**\n * Represents the assessment that will look if the text has too long paragraphs.\n */\nexport default class ParagraphTooLongAssessment extends Assessment {\n /**\n * Sets the identifier and the config.\n *\n * @param {object} config The configuration to use.\n *\n * @returns {void}\n */\n constructor(config = {}) {\n super();\n\n const defaultConfig = {\n id: TEXT_PARAGRAPH_TOO_LONG_ID,\n priority: 'high',\n docUrl:\n 'https://docs.avada.io/seo-suite-help-center/seo-audit/on-page-seo/checklist#paragraph-length',\n fixPosition: 'longParagraph',\n ctaType: 'fix',\n parameters: {\n recommendedLength: 150,\n maximumRecommendedLength: 150\n },\n title: 'Paragraph length',\n content: {\n bad: 'Paragraph too long. Keep paragraph length less than 150 words for readability.',\n improve: '',\n good: 'Paragraph is optimized, with less than 150 words.'\n }\n };\n\n this.identifier = TEXT_PARAGRAPH_TOO_LONG_ID;\n this._config = merge(defaultConfig, config);\n }\n\n /**\n * Check if there is language-specific config, and if so, overwrite the current config with it.\n *\n * @param {Researcher} researcher The researcher to use.\n *\n * @returns {Object} The config that should be used.\n */\n getConfig(researcher) {\n const currentConfig = this._config;\n const languageSpecificConfig = researcher.getConfig('paragraphLength');\n\n /*\n * If a language has a specific paragraph length config, check further if the assessment is run in product pages.\n * If it's run in product pages, override the default config parameters with the language specific config for product pages,\n * otherwise override it with the language specific config for default pages analysis.\n */\n if (languageSpecificConfig) {\n currentConfig.parameters = this._isProduct\n ? languageSpecificConfig.productPageParams\n : languageSpecificConfig.defaultPageParams;\n }\n\n return currentConfig;\n }\n\n /**\n *\n * @param paragraphsLength\n * @param config\n * @param hasDescription\n * @returns {{score: number, status: (string)}}\n */\n calculateResult({paragraphsLength, config, hasDescription}) {\n let status = 'bad';\n if (paragraphsLength.length === 0 || !hasDescription) {\n status = 'bad';\n } else {\n const { recommendedLength, maximumRecommendedLength } = config.parameters;\n const length = paragraphsLength[0].countLength;\n\n const isGood =\n length <= recommendedLength ||\n inRange(length, recommendedLength, maximumRecommendedLength);\n\n status = isGood ? 'good' : 'bad';\n }\n const score = this.getScore(MAIN_CONTENT_POINTS, status);\n\n return {\n score,\n status\n };\n }\n\n /**\n * Sort the paragraphs based on word count.\n *\n * @param {Array} paragraphs The array with paragraphs.\n *\n * @returns {Array} The array sorted on word counts.\n */\n sortParagraphs(paragraphs) {\n return paragraphs.sort(function(a, b) {\n return b.countLength - a.countLength;\n });\n }\n\n /**\n * Runs the getParagraphLength module, based on this returns an assessment result with score and text.\n *\n * @param {Paper} paper The paper to use for the assessment.\n * @param {Researcher} researcher The researcher used for calling research.\n * @returns {object} The assessment result.\n */\n getResult({paper, researcher}) {\n let paragraphsLength = researcher.getResearch('getParagraphLength');\n\n paragraphsLength = this.sortParagraphs(paragraphsLength);\n const config = this.getConfig(researcher);\n const hasDescription = paper.hasDescription();\n const paragraphLengthResult = this.calculateResult({\n paragraphsLength,\n config,\n hasDescription\n });\n const assessmentResult = new AssessmentResult({config: this._config});\n\n assessmentResult.setScore(paragraphLengthResult.score);\n assessmentResult.setStatus(paragraphLengthResult.status);\n\n return assessmentResult;\n }\n\n /**\n * Checks if the paragraphTooLong assessment is applicable to the paper.\n *\n * @param {Paper} paper The paper to check.\n *\n * @returns {boolean} Returns true if the assessment is applicable to the paper.\n */\n isApplicable(paper) {\n return true;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ParagraphTooLongAssessment.js","names":["_lodash","require","_inRange","_AssessmentResult","_interopRequireDefault","_assessment","_analysis","e","__esModule","default","ParagraphTooLongAssessment","Assessment","constructor","config","defaultConfig","id","TEXT_PARAGRAPH_TOO_LONG_ID","priority","docUrl","fixPosition","ctaType","parameters","recommendedLength","maximumRecommendedLength","title","content","bad","improve","good","identifier","_config","merge","getConfig","researcher","currentConfig","languageSpecificConfig","_isProduct","productPageParams","defaultPageParams","calculateResult","paragraphsLength","status","length","longestParagraphLength","countLength","inRange","score","getScore","sortParagraphs","paragraphs","sort","a","b","getResult","paper","getResearch","paragraphLengthResult","assessmentResult","AssessmentResult","setScore","setStatus","isApplicable","hasEnoughContentForAssessment","exports"],"sources":["../../../../../src/scoring/assessments/readability/ParagraphTooLongAssessment.js"],"sourcesContent":["import {merge} from 'lodash';\nimport {inRangeEndInclusive as inRange} from '../../helpers/assessments/inRange';\nimport AssessmentResult from '../../../values/AssessmentResult';\nimport Assessment from '../assessment';\nimport {TEXT_PARAGRAPH_TOO_LONG_ID} from '@axyseo/const/analysis';\n\n/**\n * Represents the assessment that will look if the text has too long paragraphs.\n */\nexport default class ParagraphTooLongAssessment extends Assessment {\n /**\n * Sets the identifier and the config.\n *\n * @param {object} config The configuration to use.\n *\n * @returns {void}\n */\n constructor(config = {}) {\n super();\n\n const defaultConfig = {\n id: TEXT_PARAGRAPH_TOO_LONG_ID,\n priority: 'high',\n docUrl:\n 'https://docs.avada.io/seo-suite-help-center/seo-audit/on-page-seo/checklist#paragraph-length',\n fixPosition: 'longParagraph',\n ctaType: 'fix',\n parameters: {\n recommendedLength: 150,\n maximumRecommendedLength: 150\n },\n title: 'Paragraph length',\n content: {\n bad: 'Paragraph too long. Keep paragraph length less than 150 words for readability.',\n improve: '',\n good: 'Paragraph is optimized, with less than 150 words.'\n }\n };\n\n this.identifier = TEXT_PARAGRAPH_TOO_LONG_ID;\n this._config = merge(defaultConfig, config);\n }\n\n /**\n * Check if there is language-specific config, and if so, overwrite the current config with it.\n *\n * @param {Researcher} researcher The researcher to use.\n *\n * @returns {Object} The config that should be used.\n */\n getConfig(researcher) {\n const currentConfig = this._config;\n const languageSpecificConfig = researcher.getConfig('paragraphLength');\n\n /*\n * If a language has a specific paragraph length config, check further if the assessment is run in product pages.\n * If it's run in product pages, override the default config parameters with the language specific config for product pages,\n * otherwise override it with the language specific config for default pages analysis.\n */\n if (languageSpecificConfig) {\n currentConfig.parameters = this._isProduct\n ? languageSpecificConfig.productPageParams\n : languageSpecificConfig.defaultPageParams;\n }\n\n return currentConfig;\n }\n\n /**\n *\n * @param paragraphsLength\n * @param config\n * @returns {{score: number, status: string}}\n */\n calculateResult({paragraphsLength, config}) {\n let status = 'bad';\n if (paragraphsLength.length === 0) {\n status = 'good';\n } else {\n const longestParagraphLength = paragraphsLength[0].countLength;\n\n if (longestParagraphLength <= config.parameters.recommendedLength) {\n status = 'good';\n }\n\n if (\n inRange(\n longestParagraphLength,\n config.parameters.recommendedLength,\n config.parameters.maximumRecommendedLength\n )\n ) {\n status = 'good';\n }\n\n if (longestParagraphLength > config.parameters.maximumRecommendedLength) {\n status = 'bad';\n }\n }\n\n const score = this.getScore(this._config.priority, status);\n\n return {\n score,\n status\n };\n }\n\n /**\n * Sort the paragraphs based on word count.\n *\n * @param {Array} paragraphs The array with paragraphs.\n *\n * @returns {Array} The array sorted on word counts.\n */\n sortParagraphs(paragraphs) {\n return paragraphs.sort(function(a, b) {\n return b.countLength - a.countLength;\n });\n }\n\n /**\n * Runs the getParagraphLength module, based on this returns an assessment result with score and text.\n *\n * @param {Paper} paper The paper to use for the assessment.\n * @param {Researcher} researcher The researcher used for calling research.\n * @returns {object} The assessment result.\n */\n getResult({paper, researcher}) {\n let paragraphsLength = researcher.getResearch('getParagraphLength');\n\n paragraphsLength = this.sortParagraphs(paragraphsLength);\n const config = this.getConfig(researcher);\n\n const paragraphLengthResult = this.calculateResult({\n paragraphsLength,\n config\n });\n const assessmentResult = new AssessmentResult({config: this._config});\n\n assessmentResult.setScore(paragraphLengthResult.score);\n assessmentResult.setStatus(paragraphLengthResult.status);\n\n return assessmentResult;\n }\n\n /**\n * Checks if the paragraphTooLong assessment is applicable to the paper.\n *\n * @param {Paper} paper The paper to check.\n *\n * @returns {boolean} Returns true if the assessment is applicable to the paper.\n */\n isApplicable(paper) {\n return this.hasEnoughContentForAssessment(paper);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -30,9 +30,9 @@ class RelatedKeywordsAssessment extends _assessment.default {
30
30
  priority: 'high',
31
31
  title: 'Related keywords',
32
32
  content: {
33
- good: 'Related keywords set',
34
- bad: 'Related keywords field is empty. Add a few relevant phrases.',
35
- improve: ''
33
+ good: 'Related keyword density is optimized',
34
+ bad: 'Consider using at least a related keyword in your page to establish topical relevance.',
35
+ improve: 'Too high related keyword density. Keep related keyword density from 0.5% - 1%.'
36
36
  }
37
37
  };
38
38
  this.identifier = _analysis.RELATED_KEYWORDS_ID;
@@ -41,16 +41,28 @@ class RelatedKeywordsAssessment extends _assessment.default {
41
41
 
42
42
  /**
43
43
  *
44
+ * @param data
44
45
  * @param relatedKeywords
45
46
  * @returns {{score: number, status: string, words}}
46
47
  */
47
- calculateResult(relatedKeywords) {
48
- const isHasRelatedKeywords = relatedKeywords && relatedKeywords?.length > 0;
49
- const status = isHasRelatedKeywords ? 'good' : 'bad';
50
- const score = this.getScore(_analysis.KEYWORD_POINTS, status);
48
+ calculateResult(data, relatedKeywords) {
49
+ const {
50
+ totalWordUsed,
51
+ words,
52
+ isWordUsedExceeding
53
+ } = relatedKeywords;
54
+ let status = 'good';
55
+ if (!data?.related_keywords?.length || totalWordUsed <= 0) {
56
+ status = 'bad';
57
+ }
58
+ if (isWordUsedExceeding) {
59
+ status = 'improve';
60
+ }
61
+ const score = this.getScore(this._config.priority, status);
51
62
  return {
52
63
  score,
53
- status
64
+ status,
65
+ words
54
66
  };
55
67
  }
56
68
 
@@ -64,13 +76,15 @@ class RelatedKeywordsAssessment extends _assessment.default {
64
76
  paper,
65
77
  researcher
66
78
  }) {
67
- const relatedKeywords = paper.getRelatedKeywords();
68
- const result = this.calculateResult(relatedKeywords);
79
+ const relatedKeywords = researcher.getResearch('checkRelatedKeywords');
80
+ const data = paper.getData();
81
+ const result = this.calculateResult(data, relatedKeywords);
69
82
  const assessmentResult = new _AssessmentResult.default({
70
83
  config: this._config
71
84
  });
72
85
  assessmentResult.setScore(result.score);
73
86
  assessmentResult.setStatus(result.status);
87
+ assessmentResult.setData(result.words);
74
88
  return assessmentResult;
75
89
  }
76
90
 
@@ -84,7 +98,7 @@ class RelatedKeywordsAssessment extends _assessment.default {
84
98
  * @returns {boolean} Returns true if the language is available, the paper is not empty and the text is longer than the minimum required length.
85
99
  */
86
100
  isApplicable(paper, researcher) {
87
- return true;
101
+ return paper.hasRelatedKeywords();
88
102
  }
89
103
  }
90
104
  exports.default = RelatedKeywordsAssessment;
@@ -1 +1 @@
1
- {"version":3,"file":"RelatedKeywordsAssessment.js","names":["_lodash","require","_AssessmentResult","_interopRequireDefault","_assessment","_analysis","e","__esModule","default","RelatedKeywordsAssessment","Assessment","constructor","config","defaultConfig","id","RELATED_KEYWORDS_ID","fixPosition","ctaType","docUrl","priority","title","content","good","bad","improve","identifier","_config","merge","calculateResult","relatedKeywords","isHasRelatedKeywords","length","status","score","getScore","KEYWORD_POINTS","getResult","paper","researcher","getRelatedKeywords","result","assessmentResult","AssessmentResult","setScore","setStatus","isApplicable","exports"],"sources":["../../../../../src/scoring/assessments/readability/RelatedKeywordsAssessment.js"],"sourcesContent":["import {merge} from 'lodash';\nimport AssessmentResult from '../../../values/AssessmentResult';\nimport Assessment from '../assessment';\nimport {KEYWORD_POINTS, RELATED_KEYWORDS_ID} from '@axyseo/const/analysis';\n\n/**\n * Represents the assessment that checks whether there are enough transition words in the text.\n */\nexport default class RelatedKeywordsAssessment extends Assessment {\n /**\n * Sets the identifier and the config.\n *\n * @param {object} config The configuration to use.\n *\n * @returns {void}\n */\n constructor(config = {}) {\n super();\n\n const defaultConfig = {\n id: RELATED_KEYWORDS_ID,\n fixPosition: 'description',\n ctaType: 'fix',\n docUrl:\n 'https://docs.avada.io/seo-suite-help-center/seo-audit/on-page-seo/checklist#related-keywords',\n priority: 'high',\n title: 'Related keywords',\n content: {\n good: 'Related keywords set',\n bad:\n 'Related keywords field is empty. Add a few relevant phrases.',\n improve: ''\n }\n };\n\n this.identifier = RELATED_KEYWORDS_ID;\n this._config = merge(defaultConfig, config);\n }\n\n /**\n *\n * @param relatedKeywords\n * @returns {{score: number, status: string, words}}\n */\n calculateResult(relatedKeywords) {\n const isHasRelatedKeywords = relatedKeywords && relatedKeywords?.length > 0;\n const status = isHasRelatedKeywords ? 'good' : 'bad';\n const score = this.getScore(KEYWORD_POINTS, status);\n\n return {\n score,\n status\n };\n }\n\n /**\n *\n * @param paper\n * @param researcher\n * @returns {AssessmentResult}\n */\n getResult({paper, researcher}) {\n const relatedKeywords = paper.getRelatedKeywords()\n const result = this.calculateResult( relatedKeywords);\n const assessmentResult = new AssessmentResult({config: this._config});\n\n assessmentResult.setScore(result.score);\n assessmentResult.setStatus(result.status);\n\n return assessmentResult;\n }\n\n /**\n * Checks if the transition words assessment is applicable to the paper. Language-specific length requirements and methods of counting text length\n * may apply (e.g. for Japanese, the text should be counted in characters instead of words, which also makes the minimum required length higher).\n *\n * @param {Paper} paper The paper to check.\n * @param {Researcher} researcher The researcher object.\n *\n * @returns {boolean} Returns true if the language is available, the paper is not empty and the text is longer than the minimum required length.\n */\n isApplicable(paper, researcher) {\n return true;\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,WAAA,GAAAD,sBAAA,CAAAF,OAAA;AACA,IAAAI,SAAA,GAAAJ,OAAA;AAA2E,SAAAE,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE3E;AACA;AACA;AACe,MAAMG,yBAAyB,SAASC,mBAAU,CAAC;EAChE;AACF;AACA;AACA;AACA;AACA;AACA;EACEC,WAAWA,CAACC,MAAM,GAAG,CAAC,CAAC,EAAE;IACvB,KAAK,CAAC,CAAC;IAEP,MAAMC,aAAa,GAAG;MACpBC,EAAE,EAAEC,6BAAmB;MACvBC,WAAW,EAAE,aAAa;MAC1BC,OAAO,EAAE,KAAK;MACdC,MAAM,EACJ,8FAA8F;MAChGC,QAAQ,EAAE,MAAM;MAChBC,KAAK,EAAE,kBAAkB;MACzBC,OAAO,EAAE;QACPC,IAAI,EAAE,sBAAsB;QAC5BC,GAAG,EACD,8DAA8D;QAChEC,OAAO,EAAE;MACX;IACF,CAAC;IAED,IAAI,CAACC,UAAU,GAAGV,6BAAmB;IACrC,IAAI,CAACW,OAAO,GAAG,IAAAC,aAAK,EAACd,aAAa,EAAED,MAAM,CAAC;EAC7C;;EAEA;AACF;AACA;AACA;AACA;EACEgB,eAAeA,CAACC,eAAe,EAAE;IAC/B,MAAMC,oBAAoB,GAAGD,eAAe,IAAIA,eAAe,EAAEE,MAAM,GAAG,CAAC;IAC3E,MAAMC,MAAM,GAAGF,oBAAoB,GAAG,MAAM,GAAG,KAAK;IACpD,MAAMG,KAAK,GAAG,IAAI,CAACC,QAAQ,CAACC,wBAAc,EAAEH,MAAM,CAAC;IAEnD,OAAO;MACLC,KAAK;MACLD;IACF,CAAC;EACH;;EAEA;AACF;AACA;AACA;AACA;AACA;EACEI,SAASA,CAAC;IAACC,KAAK;IAAEC;EAAU,CAAC,EAAE;IAC7B,MAAMT,eAAe,GAAGQ,KAAK,CAACE,kBAAkB,CAAC,CAAC;IAClD,MAAMC,MAAM,GAAG,IAAI,CAACZ,eAAe,CAAEC,eAAe,CAAC;IACrD,MAAMY,gBAAgB,GAAG,IAAIC,yBAAgB,CAAC;MAAC9B,MAAM,EAAE,IAAI,CAACc;IAAO,CAAC,CAAC;IAErEe,gBAAgB,CAACE,QAAQ,CAACH,MAAM,CAACP,KAAK,CAAC;IACvCQ,gBAAgB,CAACG,SAAS,CAACJ,MAAM,CAACR,MAAM,CAAC;IAEzC,OAAOS,gBAAgB;EACzB;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEI,YAAYA,CAACR,KAAK,EAAEC,UAAU,EAAE;IAC9B,OAAO,IAAI;EACb;AACF;AAACQ,OAAA,CAAAtC,OAAA,GAAAC,yBAAA","ignoreList":[]}
1
+ {"version":3,"file":"RelatedKeywordsAssessment.js","names":["_lodash","require","_AssessmentResult","_interopRequireDefault","_assessment","_analysis","e","__esModule","default","RelatedKeywordsAssessment","Assessment","constructor","config","defaultConfig","id","RELATED_KEYWORDS_ID","fixPosition","ctaType","docUrl","priority","title","content","good","bad","improve","identifier","_config","merge","calculateResult","data","relatedKeywords","totalWordUsed","words","isWordUsedExceeding","status","related_keywords","length","score","getScore","getResult","paper","researcher","getResearch","getData","result","assessmentResult","AssessmentResult","setScore","setStatus","setData","isApplicable","hasRelatedKeywords","exports"],"sources":["../../../../../src/scoring/assessments/readability/RelatedKeywordsAssessment.js"],"sourcesContent":["import {merge} from 'lodash';\nimport AssessmentResult from '../../../values/AssessmentResult';\nimport Assessment from '../assessment';\nimport {RELATED_KEYWORDS_ID} from '@axyseo/const/analysis';\n\n/**\n * Represents the assessment that checks whether there are enough transition words in the text.\n */\nexport default class RelatedKeywordsAssessment extends Assessment {\n /**\n * Sets the identifier and the config.\n *\n * @param {object} config The configuration to use.\n *\n * @returns {void}\n */\n constructor(config = {}) {\n super();\n\n const defaultConfig = {\n id: RELATED_KEYWORDS_ID,\n fixPosition: 'description',\n ctaType: 'fix',\n docUrl:\n 'https://docs.avada.io/seo-suite-help-center/seo-audit/on-page-seo/checklist#related-keywords',\n priority: 'high',\n title: 'Related keywords',\n content: {\n good: 'Related keyword density is optimized',\n bad:\n 'Consider using at least a related keyword in your page to establish topical relevance.',\n improve: 'Too high related keyword density. Keep related keyword density from 0.5% - 1%.'\n }\n };\n\n this.identifier = RELATED_KEYWORDS_ID;\n this._config = merge(defaultConfig, config);\n }\n\n /**\n *\n * @param data\n * @param relatedKeywords\n * @returns {{score: number, status: string, words}}\n */\n calculateResult(data, relatedKeywords) {\n const {totalWordUsed, words, isWordUsedExceeding} = relatedKeywords;\n let status = 'good';\n if (!data?.related_keywords?.length || totalWordUsed <= 0) {\n status = 'bad';\n }\n\n if (isWordUsedExceeding) {\n status = 'improve';\n }\n\n const score = this.getScore(this._config.priority, status);\n\n return {\n score,\n status,\n words\n };\n }\n\n /**\n *\n * @param paper\n * @param researcher\n * @returns {AssessmentResult}\n */\n getResult({paper, researcher}) {\n const relatedKeywords = researcher.getResearch('checkRelatedKeywords');\n const data = paper.getData();\n\n const result = this.calculateResult(data, relatedKeywords);\n const assessmentResult = new AssessmentResult({config: this._config});\n\n assessmentResult.setScore(result.score);\n assessmentResult.setStatus(result.status);\n assessmentResult.setData(result.words);\n\n return assessmentResult;\n }\n\n /**\n * Checks if the transition words assessment is applicable to the paper. Language-specific length requirements and methods of counting text length\n * may apply (e.g. for Japanese, the text should be counted in characters instead of words, which also makes the minimum required length higher).\n *\n * @param {Paper} paper The paper to check.\n * @param {Researcher} researcher The researcher object.\n *\n * @returns {boolean} Returns true if the language is available, the paper is not empty and the text is longer than the minimum required length.\n */\n isApplicable(paper, researcher) {\n return paper.hasRelatedKeywords();\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,WAAA,GAAAD,sBAAA,CAAAF,OAAA;AACA,IAAAI,SAAA,GAAAJ,OAAA;AAA2D,SAAAE,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE3D;AACA;AACA;AACe,MAAMG,yBAAyB,SAASC,mBAAU,CAAC;EAChE;AACF;AACA;AACA;AACA;AACA;AACA;EACEC,WAAWA,CAACC,MAAM,GAAG,CAAC,CAAC,EAAE;IACvB,KAAK,CAAC,CAAC;IAEP,MAAMC,aAAa,GAAG;MACpBC,EAAE,EAAEC,6BAAmB;MACvBC,WAAW,EAAE,aAAa;MAC1BC,OAAO,EAAE,KAAK;MACdC,MAAM,EACJ,8FAA8F;MAChGC,QAAQ,EAAE,MAAM;MAChBC,KAAK,EAAE,kBAAkB;MACzBC,OAAO,EAAE;QACPC,IAAI,EAAE,sCAAsC;QAC5CC,GAAG,EACD,wFAAwF;QAC1FC,OAAO,EAAE;MACX;IACF,CAAC;IAED,IAAI,CAACC,UAAU,GAAGV,6BAAmB;IACrC,IAAI,CAACW,OAAO,GAAG,IAAAC,aAAK,EAACd,aAAa,EAAED,MAAM,CAAC;EAC7C;;EAEA;AACF;AACA;AACA;AACA;AACA;EACEgB,eAAeA,CAACC,IAAI,EAAEC,eAAe,EAAE;IACrC,MAAM;MAACC,aAAa;MAAEC,KAAK;MAAEC;IAAmB,CAAC,GAAGH,eAAe;IACnE,IAAII,MAAM,GAAG,MAAM;IACnB,IAAI,CAACL,IAAI,EAAEM,gBAAgB,EAAEC,MAAM,IAAIL,aAAa,IAAI,CAAC,EAAE;MACzDG,MAAM,GAAG,KAAK;IAChB;IAEA,IAAID,mBAAmB,EAAE;MACvBC,MAAM,GAAG,SAAS;IACpB;IAEA,MAAMG,KAAK,GAAG,IAAI,CAACC,QAAQ,CAAC,IAAI,CAACZ,OAAO,CAACP,QAAQ,EAAEe,MAAM,CAAC;IAE1D,OAAO;MACLG,KAAK;MACLH,MAAM;MACNF;IACF,CAAC;EACH;;EAEA;AACF;AACA;AACA;AACA;AACA;EACEO,SAASA,CAAC;IAACC,KAAK;IAAEC;EAAU,CAAC,EAAE;IAC7B,MAAMX,eAAe,GAAGW,UAAU,CAACC,WAAW,CAAC,sBAAsB,CAAC;IACtE,MAAMb,IAAI,GAAGW,KAAK,CAACG,OAAO,CAAC,CAAC;IAE5B,MAAMC,MAAM,GAAG,IAAI,CAAChB,eAAe,CAACC,IAAI,EAAEC,eAAe,CAAC;IAC1D,MAAMe,gBAAgB,GAAG,IAAIC,yBAAgB,CAAC;MAAClC,MAAM,EAAE,IAAI,CAACc;IAAO,CAAC,CAAC;IAErEmB,gBAAgB,CAACE,QAAQ,CAACH,MAAM,CAACP,KAAK,CAAC;IACvCQ,gBAAgB,CAACG,SAAS,CAACJ,MAAM,CAACV,MAAM,CAAC;IACzCW,gBAAgB,CAACI,OAAO,CAACL,MAAM,CAACZ,KAAK,CAAC;IAEtC,OAAOa,gBAAgB;EACzB;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEK,YAAYA,CAACV,KAAK,EAAEC,UAAU,EAAE;IAC9B,OAAOD,KAAK,CAACW,kBAAkB,CAAC,CAAC;EACnC;AACF;AAACC,OAAA,CAAA5C,OAAA,GAAAC,yBAAA","ignoreList":[]}
@@ -7,7 +7,6 @@ exports.default = void 0;
7
7
  var _lodash = require("lodash");
8
8
  var _AssessmentResult = _interopRequireDefault(require("../../../values/AssessmentResult"));
9
9
  var _assessment = _interopRequireDefault(require("../assessment"));
10
- var _polarisIcons = require("@shopify/polaris-icons");
11
10
  var _analysis = require("../../../const/analysis");
12
11
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
12
  const maximumConsecutiveDuplicates = 2;
@@ -31,7 +30,6 @@ class SentenceBeginningsAssessment extends _assessment.default {
31
30
  ctaType: 'fix',
32
31
  docUrl: 'https://docs.avada.io/seo-suite-help-center/seo-audit/on-page-seo/checklist#sentence-beginnings',
33
32
  fixPosition: 'description',
34
- icon: _polarisIcons.TextBlockIcon,
35
33
  title: 'Sentence beginnings',
36
34
  content: {
37
35
  improve: '',
@@ -80,7 +78,7 @@ class SentenceBeginningsAssessment extends _assessment.default {
80
78
  } else {
81
79
  status = 'good';
82
80
  }
83
- const score = this.getScore(_analysis.MAIN_CONTENT_POINTS, status);
81
+ const score = this.getScore(this._config.priority, status);
84
82
  return {
85
83
  score,
86
84
  status
@@ -1 +1 @@
1
- {"version":3,"file":"SentenceBeginningsAssessment.js","names":["_lodash","require","_AssessmentResult","_interopRequireDefault","_assessment","_polarisIcons","_analysis","e","__esModule","default","maximumConsecutiveDuplicates","SentenceBeginningsAssessment","Assessment","constructor","config","defaultConfig","id","SENTENCE_BEGINNINGS_ID","priority","ctaType","docUrl","fixPosition","icon","TextBlockIcon","title","content","improve","bad","good","identifier","_config","merge","groupSentenceBeginnings","sentenceBeginnings","tooOften","partition","word","count","length","total","sortedCounts","sortBy","lowestCount","calculateSentenceBeginningsResult","groupedSentenceBeginnings","status","score","getScore","MAIN_CONTENT_POINTS","getResult","paper","researcher","getResearch","sentenceBeginningsErrors","filter","sentenceBeginning","calculatedResult","assessmentResult","AssessmentResult","setData","setScore","setStatus","isApplicable","hasEnoughContentForAssessment","hasResearch","exports"],"sources":["../../../../../src/scoring/assessments/readability/SentenceBeginningsAssessment.js"],"sourcesContent":["import {merge, partition, sortBy} from 'lodash';\nimport AssessmentResult from '../../../values/AssessmentResult';\nimport Assessment from '../assessment';\nimport {TextBlockIcon} from '@shopify/polaris-icons';\nimport {MAIN_CONTENT_POINTS, SENTENCE_BEGINNINGS_ID} from '@axyseo/const/analysis';\n\nconst maximumConsecutiveDuplicates = 2;\n\n/**\n * Represents the assessment that checks whether there are three or more consecutive sentences beginning with the same word.\n */\nexport default class SentenceBeginningsAssessment extends Assessment {\n /**\n * Sets the identifier and the config.\n *\n * @param {object} config The configuration to use.\n *\n * @returns {void}\n */\n constructor(config = {}) {\n super();\n\n const defaultConfig = {\n id: SENTENCE_BEGINNINGS_ID,\n priority: 'medium',\n ctaType: 'fix',\n docUrl:\n 'https://docs.avada.io/seo-suite-help-center/seo-audit/on-page-seo/checklist#sentence-beginnings',\n fixPosition: 'description',\n icon: TextBlockIcon,\n title: 'Sentence beginnings',\n content: {\n improve: '',\n bad:\n 'Found sentences with repetitive beginnings. Change the wording for more engaging content.',\n good: 'No sentences with repetitive beginnings found.'\n }\n };\n\n this.identifier = SENTENCE_BEGINNINGS_ID;\n this._config = merge(defaultConfig, config);\n }\n\n /**\n * Counts and groups the number too often used sentence beginnings and determines the lowest count within that group.\n *\n * @param {array} sentenceBeginnings The array containing the objects containing the beginning words and counts.\n *\n * @returns {object} The object containing the total number of too often used beginnings and the lowest count within those.\n */\n groupSentenceBeginnings(sentenceBeginnings) {\n const tooOften = partition(sentenceBeginnings, function(word) {\n return word.count > maximumConsecutiveDuplicates;\n });\n\n if (tooOften[0].length === 0) {\n return {total: 0};\n }\n\n const sortedCounts = sortBy(tooOften[0], function(word) {\n return word.count;\n });\n\n return {total: tooOften[0].length, lowestCount: sortedCounts[0].count};\n }\n\n /**\n *\n * @param groupedSentenceBeginnings\n * @returns {{score: number, status: string}}\n */\n calculateSentenceBeginningsResult(groupedSentenceBeginnings) {\n let status = '';\n if (groupedSentenceBeginnings.total > 0) {\n status = 'bad';\n } else {\n status = 'good';\n }\n\n const score = this.getScore(MAIN_CONTENT_POINTS, status);\n\n return {\n score,\n status\n };\n }\n\n /**\n *\n * @param paper\n * @param researcher\n * @returns {AssessmentResult}\n */\n getResult({paper, researcher}) {\n const sentenceBeginnings = researcher.getResearch('getSentenceBeginnings');\n const sentenceBeginningsErrors = sentenceBeginnings.filter(\n sentenceBeginning => sentenceBeginning.count > maximumConsecutiveDuplicates\n );\n\n const groupedSentenceBeginnings = this.groupSentenceBeginnings(sentenceBeginnings);\n const calculatedResult = this.calculateSentenceBeginningsResult(groupedSentenceBeginnings);\n const assessmentResult = new AssessmentResult({config: this._config});\n\n assessmentResult.setData(sentenceBeginningsErrors);\n assessmentResult.setScore(calculatedResult.score);\n assessmentResult.setStatus(calculatedResult.status);\n\n return assessmentResult;\n }\n\n /**\n * Checks if the sentence beginnings assessment is applicable to the paper.\n *\n * @param {Object} paper The paper to check.\n * @param {Researcher} researcher The researcher object.\n *\n * @returns {boolean} Returns true if the language is available and the paper is not empty.\n */\n isApplicable(paper, researcher) {\n return (\n this.hasEnoughContentForAssessment(paper) && researcher.hasResearch('getSentenceBeginnings')\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"SentenceBeginningsAssessment.js","names":["_lodash","require","_AssessmentResult","_interopRequireDefault","_assessment","_analysis","e","__esModule","default","maximumConsecutiveDuplicates","SentenceBeginningsAssessment","Assessment","constructor","config","defaultConfig","id","SENTENCE_BEGINNINGS_ID","priority","ctaType","docUrl","fixPosition","title","content","improve","bad","good","identifier","_config","merge","groupSentenceBeginnings","sentenceBeginnings","tooOften","partition","word","count","length","total","sortedCounts","sortBy","lowestCount","calculateSentenceBeginningsResult","groupedSentenceBeginnings","status","score","getScore","getResult","paper","researcher","getResearch","sentenceBeginningsErrors","filter","sentenceBeginning","calculatedResult","assessmentResult","AssessmentResult","setData","setScore","setStatus","isApplicable","hasEnoughContentForAssessment","hasResearch","exports"],"sources":["../../../../../src/scoring/assessments/readability/SentenceBeginningsAssessment.js"],"sourcesContent":["import {merge, partition, sortBy} from 'lodash';\nimport AssessmentResult from '../../../values/AssessmentResult';\nimport Assessment from '../assessment';\n\nimport {SENTENCE_BEGINNINGS_ID} from '@axyseo/const/analysis';\n\nconst maximumConsecutiveDuplicates = 2;\n\n/**\n * Represents the assessment that checks whether there are three or more consecutive sentences beginning with the same word.\n */\nexport default class SentenceBeginningsAssessment extends Assessment {\n /**\n * Sets the identifier and the config.\n *\n * @param {object} config The configuration to use.\n *\n * @returns {void}\n */\n constructor(config = {}) {\n super();\n\n const defaultConfig = {\n id: SENTENCE_BEGINNINGS_ID,\n priority: 'medium',\n ctaType: 'fix',\n docUrl:\n 'https://docs.avada.io/seo-suite-help-center/seo-audit/on-page-seo/checklist#sentence-beginnings',\n fixPosition: 'description',\n title: 'Sentence beginnings',\n content: {\n improve: '',\n bad:\n 'Found sentences with repetitive beginnings. Change the wording for more engaging content.',\n good: 'No sentences with repetitive beginnings found.'\n }\n };\n\n this.identifier = SENTENCE_BEGINNINGS_ID;\n this._config = merge(defaultConfig, config);\n }\n\n /**\n * Counts and groups the number too often used sentence beginnings and determines the lowest count within that group.\n *\n * @param {array} sentenceBeginnings The array containing the objects containing the beginning words and counts.\n *\n * @returns {object} The object containing the total number of too often used beginnings and the lowest count within those.\n */\n groupSentenceBeginnings(sentenceBeginnings) {\n const tooOften = partition(sentenceBeginnings, function(word) {\n return word.count > maximumConsecutiveDuplicates;\n });\n\n if (tooOften[0].length === 0) {\n return {total: 0};\n }\n\n const sortedCounts = sortBy(tooOften[0], function(word) {\n return word.count;\n });\n\n return {total: tooOften[0].length, lowestCount: sortedCounts[0].count};\n }\n\n /**\n *\n * @param groupedSentenceBeginnings\n * @returns {{score: number, status: string}}\n */\n calculateSentenceBeginningsResult(groupedSentenceBeginnings) {\n let status = '';\n if (groupedSentenceBeginnings.total > 0) {\n status = 'bad';\n } else {\n status = 'good';\n }\n\n const score = this.getScore(this._config.priority, status);\n\n return {\n score,\n status\n };\n }\n\n /**\n *\n * @param paper\n * @param researcher\n * @returns {AssessmentResult}\n */\n getResult({paper, researcher}) {\n const sentenceBeginnings = researcher.getResearch('getSentenceBeginnings');\n const sentenceBeginningsErrors = sentenceBeginnings.filter(\n sentenceBeginning => sentenceBeginning.count > maximumConsecutiveDuplicates\n );\n\n const groupedSentenceBeginnings = this.groupSentenceBeginnings(sentenceBeginnings);\n const calculatedResult = this.calculateSentenceBeginningsResult(groupedSentenceBeginnings);\n const assessmentResult = new AssessmentResult({config: this._config});\n\n assessmentResult.setData(sentenceBeginningsErrors);\n assessmentResult.setScore(calculatedResult.score);\n assessmentResult.setStatus(calculatedResult.status);\n\n return assessmentResult;\n }\n\n /**\n * Checks if the sentence beginnings assessment is applicable to the paper.\n *\n * @param {Object} paper The paper to check.\n * @param {Researcher} researcher The researcher object.\n *\n * @returns {boolean} Returns true if the language is available and the paper is not empty.\n */\n isApplicable(paper, researcher) {\n return (\n this.hasEnoughContentForAssessment(paper) && researcher.hasResearch('getSentenceBeginnings')\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -9,7 +9,6 @@ var _assessment = _interopRequireDefault(require("../assessment"));
9
9
  var _checkForTooLongSentences = _interopRequireDefault(require("../../helpers/assessments/checkForTooLongSentences"));
10
10
  var _formatNumber = _interopRequireDefault(require("../../../helpers/formatNumber"));
11
11
  var _AssessmentResult = _interopRequireDefault(require("../../../values/AssessmentResult"));
12
- var _polarisIcons = require("@shopify/polaris-icons");
13
12
  var _analysis = require("../../../const/analysis");
14
13
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
14
  /**
@@ -32,7 +31,7 @@ class SentenceLengthInTextAssessment extends _assessment.default {
32
31
  docUrl: 'https://docs.avada.io/seo-suite-help-center/seo-audit/on-page-seo/checklist#sentence-length',
33
32
  ctaType: 'fix',
34
33
  fixPosition: 'sentenceLength',
35
- icon: _polarisIcons.TextBlockIcon,
34
+ icon: '',
36
35
  recommendedLength: 20,
37
36
  slightlyTooMany: 25,
38
37
  farTooMany: 30,
@@ -60,13 +59,11 @@ class SentenceLengthInTextAssessment extends _assessment.default {
60
59
  researcher
61
60
  }) {
62
61
  const sentences = researcher.getResearch('countSentencesFromText');
63
- const hasDescription = paper.hasDescription();
64
62
  if (researcher.getConfig('sentenceLength')) {
65
63
  this._config = this.getLanguageSpecificConfig(researcher);
66
64
  }
67
- console.log('sentences', sentences);
68
65
  const percentage = this.calculatePercentage(sentences);
69
- const result = this.calculateResult(percentage, hasDescription);
66
+ const result = this.calculateResult(percentage);
70
67
  const assessmentResult = new _AssessmentResult.default({
71
68
  config: this._config
72
69
  });
@@ -83,7 +80,7 @@ class SentenceLengthInTextAssessment extends _assessment.default {
83
80
  * @returns {boolean} True when there is text.
84
81
  */
85
82
  isApplicable(paper) {
86
- return true;
83
+ return this.hasEnoughContentForAssessment(paper);
87
84
  }
88
85
 
89
86
  /**
@@ -112,7 +109,6 @@ class SentenceLengthInTextAssessment extends _assessment.default {
112
109
  let percentage = 0;
113
110
  if (sentences.length !== 0) {
114
111
  const tooLongTotal = this.countTooLongSentences(sentences);
115
- console.log('tooLongTotal', tooLongTotal);
116
112
  percentage = (0, _formatNumber.default)(tooLongTotal / sentences.length * 100);
117
113
  }
118
114
  return percentage;
@@ -121,19 +117,21 @@ class SentenceLengthInTextAssessment extends _assessment.default {
121
117
  /**
122
118
  *
123
119
  * @param percentage
124
- * @param hasDescription
125
120
  * @returns {{score: number, status: string}}
126
121
  */
127
- calculateResult(percentage, hasDescription) {
128
- let status = 'bad';
129
- if (percentage <= 0 && hasDescription && percentage <= this._config.recommendedLength) {
122
+ calculateResult(percentage) {
123
+ let status = '';
124
+ if (percentage <= this._config.recommendedLength) {
130
125
  status = 'good';
131
126
  }
132
- const score = this.getScore(_analysis.MAIN_CONTENT_POINTS, status);
127
+ if (percentage > this._config.recommendedLength) {
128
+ status = 'bad';
129
+ }
130
+ const score = this.getScore(this._config.priority, status);
133
131
  this._config.content = {
134
132
  improve: '',
135
133
  bad: `Sentence too long. Keep sentence length less than ${this._config.recommendedLength} words to improve readability and flow.`,
136
- good: `Sentences optimized`
134
+ good: `Sentence length is optimized for readability, less than ${this._config.recommendedLength} words.`
137
135
  };
138
136
  return {
139
137
  score,
@@ -1 +1 @@
1
- {"version":3,"file":"SentenceLengthInTextAssessment.js","names":["_lodash","require","_assessment","_interopRequireDefault","_checkForTooLongSentences","_formatNumber","_AssessmentResult","_polarisIcons","_analysis","e","__esModule","default","SentenceLengthInTextAssessment","Assessment","constructor","config","isCornerstone","isProduct","defaultConfig","id","TEXT_SENTENCE_LENGTH_ID","priority","docUrl","ctaType","fixPosition","icon","TextBlockIcon","recommendedLength","slightlyTooMany","farTooMany","title","content","improve","bad","good","_config","merge","identifier","getResult","paper","researcher","sentences","getResearch","hasDescription","getConfig","getLanguageSpecificConfig","console","log","percentage","calculatePercentage","result","calculateResult","assessmentResult","AssessmentResult","setScore","score","setStatus","status","isApplicable","currentConfig","languageSpecificConfig","hasOwnProperty","length","tooLongTotal","countTooLongSentences","formatNumber","getScore","MAIN_CONTENT_POINTS","getTooLongSentences","_default","exports"],"sources":["../../../../../src/scoring/assessments/readability/SentenceLengthInTextAssessment.js"],"sourcesContent":["import {merge} from 'lodash';\nimport Assessment from '../assessment';\nimport getTooLongSentences from '../../helpers/assessments/checkForTooLongSentences';\nimport formatNumber from '../../../helpers/formatNumber';\nimport AssessmentResult from '../../../values/AssessmentResult';\nimport {TextBlockIcon} from '@shopify/polaris-icons';\nimport {MAIN_CONTENT_POINTS, TEXT_SENTENCE_LENGTH_ID} from '@axyseo/const/analysis';\n\n/**\n * Represents the assessment that will calculate the length of sentences in the text.\n */\nclass SentenceLengthInTextAssessment extends Assessment {\n /**\n\t * Sets the identifier and the config.\n\t *\n\t * @param {object} config\t\t\tThe scoring configuration that should be used.\n\t * @param {boolean} isCornerstone\tWhether cornerstone configuration should be used.\n\t * @param {boolean} isProduct\t\tWhether product configuration should be used.\n\n\t * @returns {void}\n\t */\n constructor(config = {}, isCornerstone = false, isProduct = false) {\n super();\n\n const defaultConfig = {\n id: TEXT_SENTENCE_LENGTH_ID,\n priority: 'high',\n docUrl:\n 'https://docs.avada.io/seo-suite-help-center/seo-audit/on-page-seo/checklist#sentence-length',\n ctaType: 'fix',\n fixPosition: 'sentenceLength',\n icon: TextBlockIcon,\n recommendedLength: 20,\n slightlyTooMany: 25,\n farTooMany: 30,\n title: 'Text Sentence Length',\n content: {\n improve: '',\n bad:\n 'Sentence too long. Keep sentence length less than 20 words to improve readability and flow.',\n good: 'Sentence length is optimized for readability, less than 20 words.'\n }\n };\n\n this._config = merge(defaultConfig, config);\n this.identifier = TEXT_SENTENCE_LENGTH_ID;\n }\n\n /**\n * Scores the percentage of sentences including more than the recommended number of words.\n *\n * @param {Paper} paper The paper to use for the assessment.\n * @param {Researcher} researcher The researcher used for calling research.\n *\n * @returns {AssessmentResult} The Assessment result.\n */\n getResult({paper, researcher}) {\n const sentences = researcher.getResearch('countSentencesFromText');\n const hasDescription = paper.hasDescription();\n if (researcher.getConfig('sentenceLength')) {\n this._config = this.getLanguageSpecificConfig(researcher);\n }\n console.log('sentences', sentences);\n const percentage = this.calculatePercentage(sentences);\n const result = this.calculateResult(percentage, hasDescription);\n\n const assessmentResult = new AssessmentResult({config: this._config});\n\n assessmentResult.setScore(result.score);\n assessmentResult.setStatus(result.status);\n\n return assessmentResult;\n }\n\n /**\n * Checks whether the paper has text.\n *\n * @param {Paper} paper The paper to use for the assessment.\n *\n * @returns {boolean} True when there is text.\n */\n isApplicable(paper) {\n return true;\n }\n\n /**\n * Check if there is language-specific config, and if so, overwrite the current config with it.\n *\n * @param {Researcher} researcher The researcher to use.\n *\n * @returns {Object} The config that should be used.\n */\n getLanguageSpecificConfig(researcher) {\n const currentConfig = this._config;\n const languageSpecificConfig = researcher.getConfig('sentenceLength');\n\n if (languageSpecificConfig.hasOwnProperty('recommendedLength')) {\n currentConfig.recommendedLength = languageSpecificConfig.recommendedLength;\n }\n\n return currentConfig;\n }\n\n /**\n * Calculates the percentage of sentences that are too long.\n *\n * @param {Array} sentences The sentences to calculate the percentage for.\n * @returns {number} The calculates percentage of too long sentences.\n */\n calculatePercentage(sentences) {\n let percentage = 0;\n\n if (sentences.length !== 0) {\n const tooLongTotal = this.countTooLongSentences(sentences);\n console.log('tooLongTotal', tooLongTotal);\n percentage = formatNumber((tooLongTotal / sentences.length) * 100);\n }\n\n return percentage;\n }\n\n /**\n *\n * @param percentage\n * @param hasDescription\n * @returns {{score: number, status: string}}\n */\n calculateResult(percentage, hasDescription) {\n let status = 'bad';\n if (percentage <= 0 && hasDescription && percentage <= this._config.recommendedLength) {\n status = 'good';\n }\n const score = this.getScore(MAIN_CONTENT_POINTS, status);\n\n this._config.content = {\n improve: '',\n bad: `Sentence too long. Keep sentence length less than ${this._config.recommendedLength} words to improve readability and flow.`,\n good: `Sentences optimized`\n };\n\n return {\n score,\n status\n };\n }\n\n /**\n * Gets the sentences that are qualified as being too long.\n *\n * @param {array} sentences The sentences to filter through.\n * @returns {array} Array with all the sentences considered to be too long.\n */\n getTooLongSentences(sentences) {\n return getTooLongSentences(sentences, this._config.recommendedLength);\n }\n\n /**\n * Get the total amount of sentences that are qualified as being too long.\n *\n * @param {Array} sentences The sentences to filter through.\n * @returns {Number} The amount of sentences that are considered too long.\n */\n countTooLongSentences(sentences) {\n return this.getTooLongSentences(sentences).length;\n }\n}\n\nexport default SentenceLengthInTextAssessment;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"SentenceLengthInTextAssessment.js","names":["_lodash","require","_assessment","_interopRequireDefault","_checkForTooLongSentences","_formatNumber","_AssessmentResult","_analysis","e","__esModule","default","SentenceLengthInTextAssessment","Assessment","constructor","config","isCornerstone","isProduct","defaultConfig","id","TEXT_SENTENCE_LENGTH_ID","priority","docUrl","ctaType","fixPosition","icon","recommendedLength","slightlyTooMany","farTooMany","title","content","improve","bad","good","_config","merge","identifier","getResult","paper","researcher","sentences","getResearch","getConfig","getLanguageSpecificConfig","percentage","calculatePercentage","result","calculateResult","assessmentResult","AssessmentResult","setScore","score","setStatus","status","isApplicable","hasEnoughContentForAssessment","currentConfig","languageSpecificConfig","hasOwnProperty","length","tooLongTotal","countTooLongSentences","formatNumber","getScore","getTooLongSentences","_default","exports"],"sources":["../../../../../src/scoring/assessments/readability/SentenceLengthInTextAssessment.js"],"sourcesContent":["import {merge} from 'lodash';\nimport Assessment from '../assessment';\nimport getTooLongSentences from '../../helpers/assessments/checkForTooLongSentences';\nimport formatNumber from '../../../helpers/formatNumber';\nimport AssessmentResult from '../../../values/AssessmentResult';\nimport {TEXT_SENTENCE_LENGTH_ID} from '@axyseo/const/analysis';\n\n/**\n * Represents the assessment that will calculate the length of sentences in the text.\n */\nclass SentenceLengthInTextAssessment extends Assessment {\n /**\n\t * Sets the identifier and the config.\n\t *\n\t * @param {object} config\t\t\tThe scoring configuration that should be used.\n\t * @param {boolean} isCornerstone\tWhether cornerstone configuration should be used.\n\t * @param {boolean} isProduct\t\tWhether product configuration should be used.\n\n\t * @returns {void}\n\t */\n constructor(config = {}, isCornerstone = false, isProduct = false) {\n super();\n\n const defaultConfig = {\n id: TEXT_SENTENCE_LENGTH_ID,\n priority: 'high',\n docUrl:\n 'https://docs.avada.io/seo-suite-help-center/seo-audit/on-page-seo/checklist#sentence-length',\n ctaType: 'fix',\n fixPosition: 'sentenceLength',\n icon: '',\n recommendedLength: 20,\n slightlyTooMany: 25,\n farTooMany: 30,\n title: 'Text Sentence Length',\n content: {\n improve: '',\n bad:\n 'Sentence too long. Keep sentence length less than 20 words to improve readability and flow.',\n good: 'Sentence length is optimized for readability, less than 20 words.'\n }\n };\n\n this._config = merge(defaultConfig, config);\n this.identifier = TEXT_SENTENCE_LENGTH_ID;\n }\n\n /**\n * Scores the percentage of sentences including more than the recommended number of words.\n *\n * @param {Paper} paper The paper to use for the assessment.\n * @param {Researcher} researcher The researcher used for calling research.\n *\n * @returns {AssessmentResult} The Assessment result.\n */\n getResult({paper, researcher}) {\n const sentences = researcher.getResearch('countSentencesFromText');\n if (researcher.getConfig('sentenceLength')) {\n this._config = this.getLanguageSpecificConfig(researcher);\n }\n\n const percentage = this.calculatePercentage(sentences);\n const result = this.calculateResult(percentage);\n\n const assessmentResult = new AssessmentResult({config: this._config});\n\n assessmentResult.setScore(result.score);\n assessmentResult.setStatus(result.status);\n\n return assessmentResult;\n }\n\n /**\n * Checks whether the paper has text.\n *\n * @param {Paper} paper The paper to use for the assessment.\n *\n * @returns {boolean} True when there is text.\n */\n isApplicable(paper) {\n return this.hasEnoughContentForAssessment(paper);\n }\n\n /**\n * Check if there is language-specific config, and if so, overwrite the current config with it.\n *\n * @param {Researcher} researcher The researcher to use.\n *\n * @returns {Object} The config that should be used.\n */\n getLanguageSpecificConfig(researcher) {\n const currentConfig = this._config;\n const languageSpecificConfig = researcher.getConfig('sentenceLength');\n\n if (languageSpecificConfig.hasOwnProperty('recommendedLength')) {\n currentConfig.recommendedLength = languageSpecificConfig.recommendedLength;\n }\n\n return currentConfig;\n }\n\n /**\n * Calculates the percentage of sentences that are too long.\n *\n * @param {Array} sentences The sentences to calculate the percentage for.\n * @returns {number} The calculates percentage of too long sentences.\n */\n calculatePercentage(sentences) {\n let percentage = 0;\n\n if (sentences.length !== 0) {\n const tooLongTotal = this.countTooLongSentences(sentences);\n\n percentage = formatNumber((tooLongTotal / sentences.length) * 100);\n }\n\n return percentage;\n }\n\n /**\n *\n * @param percentage\n * @returns {{score: number, status: string}}\n */\n calculateResult(percentage) {\n let status = '';\n if (percentage <= this._config.recommendedLength) {\n status = 'good';\n }\n\n if (percentage > this._config.recommendedLength) {\n status = 'bad';\n }\n\n const score = this.getScore(this._config.priority, status);\n\n this._config.content = {\n improve: '',\n bad: `Sentence too long. Keep sentence length less than ${this._config.recommendedLength} words to improve readability and flow.`,\n good: `Sentence length is optimized for readability, less than ${this._config.recommendedLength} words.`\n };\n\n return {\n score,\n status\n };\n }\n\n /**\n * Gets the sentences that are qualified as being too long.\n *\n * @param {array} sentences The sentences to filter through.\n * @returns {array} Array with all the sentences considered to be too long.\n */\n getTooLongSentences(sentences) {\n return getTooLongSentences(sentences, this._config.recommendedLength);\n }\n\n /**\n * Get the total amount of sentences that are qualified as being too long.\n *\n * @param {Array} sentences The sentences to filter through.\n * @returns {Number} The amount of sentences that are considered too long.\n */\n countTooLongSentences(sentences) {\n return this.getTooLongSentences(sentences).length;\n }\n}\n\nexport default SentenceLengthInTextAssessment;\n"],"mappings":"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","ignoreList":[]}
@@ -93,7 +93,7 @@ class TransitionWordsAssessment extends _assessment.default {
93
93
  if (score < 6 || percentage === 0) {
94
94
  status = 'bad';
95
95
  }
96
- const customScore = this.getScore(_analysis.MAIN_CONTENT_POINTS, status);
96
+ const customScore = this.getScore(this._config.priority, status);
97
97
  return {
98
98
  score: customScore,
99
99
  status
@@ -1 +1 @@
1
- {"version":3,"file":"TransitionWordsAssessment.js","names":["_lodash","require","_formatNumber","_interopRequireDefault","_inRange","_AssessmentResult","_assessment","_htmlParser","_getWords","_helpers","_analysis","e","__esModule","default","TransitionWordsAssessment","Assessment","constructor","config","defaultConfig","id","TEXT_TRANSITION_WORDS_ID","fixPosition","ctaType","docUrl","priority","applicableIfTextLongerThan","title","content","good","bad","improve","identifier","_config","merge","calculateTransitionWordPercentage","sentences","transitionWordSentences","totalSentences","formatNumber","calculateScoreFromPercentage","percentage","inRange","calculateTransitionWordResult","score","status","customScore","getScore","MAIN_CONTENT_POINTS","getResult","paper","researcher","getResearch","transitionWordResult","assessmentResult","AssessmentResult","setScore","setStatus","isApplicable","customCountLength","getHelper","customApplicabilityConfig","getConfig","transitionWords","text","getText","removeHtmlBlocks","filterShortcodesFromHTML","_attributes","shortcodes","textLength","getWords","length","hasResearch","exports"],"sources":["../../../../../src/scoring/assessments/readability/TransitionWordsAssessment.js"],"sourcesContent":["import {merge} from 'lodash';\nimport formatNumber from '../../../helpers/formatNumber';\nimport {inRangeStartInclusive as inRange} from '../../helpers/assessments/inRange';\nimport AssessmentResult from '../../../values/AssessmentResult';\nimport Assessment from '../assessment';\nimport removeHtmlBlocks from '@axyseo/languageProcessing/helpers/html/htmlParser';\nimport getWords from '@axyseo/languageProcessing/helpers/word/getWords';\nimport {filterShortcodesFromHTML} from '@axyseo/languageProcessing/helpers';\nimport {MAIN_CONTENT_POINTS, TEXT_TRANSITION_WORDS_ID} from '@axyseo/const/analysis';\n\n/**\n * Represents the assessment that checks whether there are enough transition words in the text.\n */\nexport default class TransitionWordsAssessment extends Assessment {\n /**\n * Sets the identifier and the config.\n *\n * @param {object} config The configuration to use.\n *\n * @returns {void}\n */\n constructor(config = {}) {\n super();\n\n const defaultConfig = {\n id: TEXT_TRANSITION_WORDS_ID,\n fixPosition: 'longestParagraph',\n ctaType: 'fix',\n docUrl:\n 'https://docs.avada.io/seo-suite-help-center/seo-audit/on-page-seo/checklist#use-of-transition-words',\n priority: 'low',\n applicableIfTextLongerThan: 200,\n title: 'Use of transition words',\n content: {\n good: 'Transition words are used effectively.',\n bad:\n 'Lack of transition words. Improve readability and flow by adding words like \"however,\" \"also,\" etc.',\n improve: ''\n }\n };\n\n this.identifier = TEXT_TRANSITION_WORDS_ID;\n this._config = merge(defaultConfig, config);\n }\n\n /**\n * Calculates the actual percentage of transition words in the sentences.\n *\n * @param {object} sentences The object containing the total number of sentences and the number of sentences containing\n * a transition word.\n *\n * @returns {number} The percentage of sentences containing a transition word.\n */\n calculateTransitionWordPercentage(sentences) {\n if (sentences.transitionWordSentences === 0 || sentences.totalSentences === 0) {\n return 0;\n }\n\n return formatNumber((sentences.transitionWordSentences / sentences.totalSentences) * 100);\n }\n\n /**\n * Calculates the score for the assessment based on the percentage of sentences containing transition words.\n *\n * @param {number} percentage The percentage of sentences containing transition words.\n *\n * @returns {number} The score.\n */\n calculateScoreFromPercentage(percentage) {\n if (percentage < 10) {\n // Red indicator.\n return 3;\n }\n\n if (inRange(percentage, 10, 20)) {\n // Orange indicator.\n return 6;\n }\n\n // Green indicator.\n return 9;\n }\n\n /**\n *\n * @param transitionWordSentences\n * @returns {{score: number, status: string}}\n */\n calculateTransitionWordResult(transitionWordSentences) {\n const percentage = this.calculateTransitionWordPercentage(transitionWordSentences);\n const score = this.calculateScoreFromPercentage(percentage);\n\n let status = 'good';\n if (score < 6 || percentage === 0) {\n status = 'bad';\n }\n\n const customScore = this.getScore(MAIN_CONTENT_POINTS, status);\n\n return {\n score: customScore,\n status\n };\n }\n\n /**\n *\n * @param paper\n * @param researcher\n * @returns {AssessmentResult}\n */\n getResult({paper, researcher}) {\n const transitionWordSentences = researcher.getResearch('findTransitionWords');\n const transitionWordResult = this.calculateTransitionWordResult(transitionWordSentences);\n const assessmentResult = new AssessmentResult({config: this._config});\n\n assessmentResult.setScore(transitionWordResult.score);\n assessmentResult.setStatus(transitionWordResult.status);\n\n return assessmentResult;\n }\n\n /**\n * Checks if the transition words assessment is applicable to the paper. Language-specific length requirements and methods of counting text length\n * may apply (e.g. for Japanese, the text should be counted in characters instead of words, which also makes the minimum required length higher).\n *\n * @param {Paper} paper The paper to check.\n * @param {Researcher} researcher The researcher object.\n *\n * @returns {boolean} Returns true if the language is available, the paper is not empty and the text is longer than the minimum required length.\n */\n isApplicable(paper, researcher) {\n const customCountLength = researcher.getHelper('customCountLength');\n const customApplicabilityConfig = researcher.getConfig('assessmentApplicability')\n .transitionWords;\n if (customApplicabilityConfig) {\n this._config.applicableIfTextLongerThan = customApplicabilityConfig;\n }\n let text = paper.getText();\n text = removeHtmlBlocks(text);\n text = filterShortcodesFromHTML(text, paper._attributes && paper._attributes.shortcodes);\n const textLength = customCountLength ? customCountLength(text) : getWords(text).length;\n\n // Do not use hasEnoughContent in this assessment as it is mostly redundant with `textLength >= this._config.applicableIfTextLongerThan`\n return (\n textLength >= this._config.applicableIfTextLongerThan &&\n researcher.hasResearch('findTransitionWords')\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"TransitionWordsAssessment.js","names":["_lodash","require","_formatNumber","_interopRequireDefault","_inRange","_AssessmentResult","_assessment","_htmlParser","_getWords","_helpers","_analysis","e","__esModule","default","TransitionWordsAssessment","Assessment","constructor","config","defaultConfig","id","TEXT_TRANSITION_WORDS_ID","fixPosition","ctaType","docUrl","priority","applicableIfTextLongerThan","title","content","good","bad","improve","identifier","_config","merge","calculateTransitionWordPercentage","sentences","transitionWordSentences","totalSentences","formatNumber","calculateScoreFromPercentage","percentage","inRange","calculateTransitionWordResult","score","status","customScore","getScore","getResult","paper","researcher","getResearch","transitionWordResult","assessmentResult","AssessmentResult","setScore","setStatus","isApplicable","customCountLength","getHelper","customApplicabilityConfig","getConfig","transitionWords","text","getText","removeHtmlBlocks","filterShortcodesFromHTML","_attributes","shortcodes","textLength","getWords","length","hasResearch","exports"],"sources":["../../../../../src/scoring/assessments/readability/TransitionWordsAssessment.js"],"sourcesContent":["import {merge} from 'lodash';\nimport formatNumber from '../../../helpers/formatNumber';\nimport {inRangeStartInclusive as inRange} from '../../helpers/assessments/inRange';\nimport AssessmentResult from '../../../values/AssessmentResult';\nimport Assessment from '../assessment';\nimport removeHtmlBlocks from '@axyseo/languageProcessing/helpers/html/htmlParser';\nimport getWords from '@axyseo/languageProcessing/helpers/word/getWords';\nimport {filterShortcodesFromHTML} from '@axyseo/languageProcessing/helpers';\nimport {TEXT_TRANSITION_WORDS_ID} from '@axyseo/const/analysis';\n\n/**\n * Represents the assessment that checks whether there are enough transition words in the text.\n */\nexport default class TransitionWordsAssessment extends Assessment {\n /**\n * Sets the identifier and the config.\n *\n * @param {object} config The configuration to use.\n *\n * @returns {void}\n */\n constructor(config = {}) {\n super();\n\n const defaultConfig = {\n id: TEXT_TRANSITION_WORDS_ID,\n fixPosition: 'longestParagraph',\n ctaType: 'fix',\n docUrl:\n 'https://docs.avada.io/seo-suite-help-center/seo-audit/on-page-seo/checklist#use-of-transition-words',\n priority: 'low',\n applicableIfTextLongerThan: 200,\n title: 'Use of transition words',\n content: {\n good: 'Transition words are used effectively.',\n bad:\n 'Lack of transition words. Improve readability and flow by adding words like \"however,\" \"also,\" etc.',\n improve: ''\n }\n };\n\n this.identifier = TEXT_TRANSITION_WORDS_ID;\n this._config = merge(defaultConfig, config);\n }\n\n /**\n * Calculates the actual percentage of transition words in the sentences.\n *\n * @param {object} sentences The object containing the total number of sentences and the number of sentences containing\n * a transition word.\n *\n * @returns {number} The percentage of sentences containing a transition word.\n */\n calculateTransitionWordPercentage(sentences) {\n if (sentences.transitionWordSentences === 0 || sentences.totalSentences === 0) {\n return 0;\n }\n\n return formatNumber((sentences.transitionWordSentences / sentences.totalSentences) * 100);\n }\n\n /**\n * Calculates the score for the assessment based on the percentage of sentences containing transition words.\n *\n * @param {number} percentage The percentage of sentences containing transition words.\n *\n * @returns {number} The score.\n */\n calculateScoreFromPercentage(percentage) {\n if (percentage < 10) {\n // Red indicator.\n return 3;\n }\n\n if (inRange(percentage, 10, 20)) {\n // Orange indicator.\n return 6;\n }\n\n // Green indicator.\n return 9;\n }\n\n /**\n *\n * @param transitionWordSentences\n * @returns {{score: number, status: string}}\n */\n calculateTransitionWordResult(transitionWordSentences) {\n const percentage = this.calculateTransitionWordPercentage(transitionWordSentences);\n const score = this.calculateScoreFromPercentage(percentage);\n\n let status = 'good';\n if (score < 6 || percentage === 0) {\n status = 'bad';\n }\n\n const customScore = this.getScore(this._config.priority, status);\n\n return {\n score: customScore,\n status\n };\n }\n\n /**\n *\n * @param paper\n * @param researcher\n * @returns {AssessmentResult}\n */\n getResult({paper, researcher}) {\n const transitionWordSentences = researcher.getResearch('findTransitionWords');\n const transitionWordResult = this.calculateTransitionWordResult(transitionWordSentences);\n const assessmentResult = new AssessmentResult({config: this._config});\n\n assessmentResult.setScore(transitionWordResult.score);\n assessmentResult.setStatus(transitionWordResult.status);\n\n return assessmentResult;\n }\n\n /**\n * Checks if the transition words assessment is applicable to the paper. Language-specific length requirements and methods of counting text length\n * may apply (e.g. for Japanese, the text should be counted in characters instead of words, which also makes the minimum required length higher).\n *\n * @param {Paper} paper The paper to check.\n * @param {Researcher} researcher The researcher object.\n *\n * @returns {boolean} Returns true if the language is available, the paper is not empty and the text is longer than the minimum required length.\n */\n isApplicable(paper, researcher) {\n const customCountLength = researcher.getHelper('customCountLength');\n const customApplicabilityConfig = researcher.getConfig('assessmentApplicability')\n .transitionWords;\n if (customApplicabilityConfig) {\n this._config.applicableIfTextLongerThan = customApplicabilityConfig;\n }\n let text = paper.getText();\n text = removeHtmlBlocks(text);\n text = filterShortcodesFromHTML(text, paper._attributes && paper._attributes.shortcodes);\n const textLength = customCountLength ? customCountLength(text) : getWords(text).length;\n\n // Do not use hasEnoughContent in this assessment as it is mostly redundant with `textLength >= this._config.applicableIfTextLongerThan`\n return (\n textLength >= this._config.applicableIfTextLongerThan &&\n researcher.hasResearch('findTransitionWords')\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -28,12 +28,14 @@ class FAQsAssessment extends _assessment.default {
28
28
  docUrl: 'https://blog.google/products/search/generative-ai-search/',
29
29
  priority: 'high',
30
30
  fixPosition: 'faqs',
31
+ factor: 2,
31
32
  title: 'FAQs Optimization',
32
33
  content: {
33
34
  good: 'FAQs are well-structured and optimized for Google SGE.',
34
- improve: '',
35
+ improve: 'FAQs could be improved to better match Google SGE requirements.',
35
36
  bad: 'FAQs need significant improvement to meet Google SGE standards.',
36
37
  details: {
38
+ hasSchema: 'Missing FAQ schema markup',
37
39
  hasProperStructure: 'Empty questions or answers',
38
40
  hasMinimumFAQs: 'Less than 3 FAQs'
39
41
  }
@@ -71,7 +73,7 @@ class FAQsAssessment extends _assessment.default {
71
73
  * @returns {{score: number, status: string, data: {hasSchema: ((function(): *)|boolean), hasProperStructure: boolean, hasMinimumFAQs: boolean}}|{score: number, status: string, data: {hasFAQs: boolean}}}
72
74
  */
73
75
  calculateResult(paper) {
74
- const faqs = paper.getFAQs()?.questions || [];
76
+ const faqs = paper.getFAQs();
75
77
  let status = 'bad';
76
78
  let score = 0;
77
79
  if (!faqs || faqs.length === 0) {
@@ -83,16 +85,58 @@ class FAQsAssessment extends _assessment.default {
83
85
  }
84
86
  };
85
87
  }
86
- const isEnableFaqs = paper.getFAQs()?.status;
88
+
89
+ // Check FAQ structure and content
90
+ const hasSchema = paper.hasFAQsSchema();
91
+ const hasProperStructure = this.checkFAQStructure(faqs);
87
92
  const hasMinimumFAQs = this.checkMinimumFAQs(faqs);
88
- status = hasMinimumFAQs && isEnableFaqs ? 'good' : 'bad';
89
- score = this.getScore(_analysis.FAQS_POINTS, status);
93
+
94
+ // Calculate score based on criteria
95
+ const criteriaMet = [hasSchema, hasProperStructure, hasMinimumFAQs].filter(Boolean).length;
96
+ if (criteriaMet === 3) {
97
+ status = 'good';
98
+ } else if (criteriaMet === 2) {
99
+ status = 'improve';
100
+ } else {
101
+ status = 'bad';
102
+ }
103
+ score = this.getScore(this._config.priority, status, this._config.factor);
90
104
  return {
91
105
  score,
92
- status
106
+ status,
107
+ data: {
108
+ hasSchema,
109
+ hasProperStructure,
110
+ hasMinimumFAQs
111
+ }
93
112
  };
94
113
  }
95
114
 
115
+ /**
116
+ * Checks if FAQs have proper structure
117
+ * @param {Array} faqs
118
+ * @returns {boolean}
119
+ */
120
+ checkFAQStructure(faqs) {
121
+ return faqs.every(faq => {
122
+ return faq.question && faq.answer && typeof faq.question === 'string' && typeof faq.answer === 'string' && faq.question.length > 0 && faq.answer.length > 0;
123
+ });
124
+ }
125
+
126
+ /**
127
+ * Checks if FAQs are relevant to the main content
128
+ * @param {Array} faqs
129
+ * @param {Array} keywords
130
+ * @returns {boolean}
131
+ */
132
+ checkRelevance(faqs, keywords) {
133
+ if (!keywords || keywords.length === 0) return true;
134
+ return faqs.some(faq => {
135
+ const question = faq.question.toLowerCase();
136
+ return keywords.some(keyword => question.includes(keyword.toLowerCase()));
137
+ });
138
+ }
139
+
96
140
  /**
97
141
  * Checks if there are at least 3 FAQs
98
142
  * @param {Array} faqs
@@ -110,7 +154,8 @@ class FAQsAssessment extends _assessment.default {
110
154
  * @returns {boolean} True when there is text.
111
155
  */
112
156
  isApplicable(paper) {
113
- return true;
157
+ const data = paper.getData();
158
+ return 'faqs' in data;
114
159
  }
115
160
  }
116
161
  exports.default = FAQsAssessment;