Current File : /home/pacjaorg/wpt.pacja.org/wp-content/plugins/js_composer/modules/seo/assets/js/checks.js |
/* global vc, i18nLocale */
if (!window.vc) {
window.vc = {};
}
(function ($) {
'use strict';
var storagePrefix = 'results';
var maxTitleLength = 600;
var utils = vc.seo_utils;
var checkData = {
focusKeyphrase: {
title: i18nLocale.focusKeywordTitle,
checkMethod: 'checkFocusKeyphrase',
conditions: [],
},
descriptionLength: {
title: i18nLocale.seoDescription,
checkMethod: 'checkDescriptionLength',
conditions: [],
},
titleWidth: {
title: i18nLocale.seoTitle,
checkMethod: 'checkTitleWidth',
conditions: [],
},
postTextLength: {
title: i18nLocale.textLength,
checkMethod: 'checkPostTextLength',
conditions: [],
},
images: {
title: i18nLocale.images,
checkMethod: 'checkImages',
conditions: ['content']
},
inboundLinks: {
title: i18nLocale.internalLinks,
checkMethod: 'checkInboundLinks',
conditions: ['content']
},
outboundLinks: {
title: i18nLocale.outboundLinks,
checkMethod: 'checkOutboundLinks',
conditions: ['content']
},
consecutiveSentences: {
title: i18nLocale.consecutiveSentences,
checkMethod: 'checkForConsecutiveSentences',
conditions: ['text', 'content']
},
subheadingDistribution: {
title: i18nLocale.subheadingDistribution,
checkMethod: 'checkSubheadingDistribution',
conditions: ['text', 'content']
},
paragraphLength: {
title: i18nLocale.paragraphLength,
checkMethod: 'checkParagraphLength',
conditions: ['text', 'content']
},
passiveVoicePercentage: {
title: i18nLocale.passiveVoice,
checkMethod: 'checkPassiveVoicePercentage',
conditions: ['text', 'content']
},
checkSentenceLength: {
title: i18nLocale.sentenceLength,
checkMethod: 'checkSentenceLength',
conditions: ['text', 'content']
},
keyphraseInTitle: {
title: i18nLocale.keyphraseInTitleText,
checkMethod: 'checkKeyphraseInTitle',
conditions: ['title', 'keyphrase']
},
keyphraseInDescription: {
title: i18nLocale.keyphraseInDescriptionText,
checkMethod: 'checkKeyphraseInDescription',
conditions: ['description', 'keyphrase']
},
keyphraseInSlug: {
title: i18nLocale.keyphraseInSlug,
checkMethod: 'checkKeyphraseInSlug',
conditions: ['slug', 'keyphrase']
},
keyphraseInImages: {
title: i18nLocale.imageKeyphrase,
checkMethod: 'checkKeyphraseInImages',
conditions: ['content', 'keyphrase', 'images']
},
keyphraseDensity: {
title: i18nLocale.keyphraseDensity,
checkMethod: 'checkKeyphraseDensity',
conditions: ['content', 'keyphrase', 'text']
},
keyphraseInIntroduction: {
title: i18nLocale.keyphraseInIntroductionText,
checkMethod: 'checkKeyphraseInIntroduction',
conditions: ['content', 'keyphrase', 'text']
},
previouslyUsedKeyphrase: {
title: i18nLocale.previouslyUsedKeyphrase,
checkMethod: 'checkPreviouslyUsedKeyphrase',
conditions: ['keyphrase']
}
};
vc.seo_checks = {
$wpbContentWrapper: null,
analyzeContent: function ($contentWrapper) {
this.$wpbContentWrapper = $contentWrapper;
var $content = this.$wpbContentWrapper.find('>div:not(#vc_no-content-helper)');
var $text = $content.find('p');
var $images = $content.find('img');
var formData = vc.seo_storage.get('formData');
var conditions = {
content: $content.length,
text: $text.length,
images: $images.length,
keyphrase: formData.keyphrase,
title: formData.title,
description: formData.description,
slug: formData.slug
};
var areConditionsAllowed = function (key) {
return checkData[key].conditions.every(function (condition) {
return conditions[condition];
});
};
for (var key in checkData) {
if (checkData[key]) {
if (areConditionsAllowed(key)) {
var method = checkData[key].checkMethod;
this[method](checkData[key].title);
} else {
vc.seo_storage.resetResult(checkData[key].title);
}
}
}
},
checkTitleWidth: function (title) {
var state = 'problems';
var description = i18nLocale.seoTitleWidthTooLong;
var titleWidth = utils.measureTextWidth(vc.seo_storage.get('formData').title);
if (!titleWidth) {
description = i18nLocale.seoTitleEmpty;
} else if (titleWidth < maxTitleLength) {
state = 'success';
description = i18nLocale.goodJob;
}
vc.seo_storage.updateResult(state, title, description, storagePrefix);
},
checkFocusKeyphrase: function (title) {
var state = 'problems';
var description = i18nLocale.noFocusKeyword;
if (vc.seo_storage.get('formData').keyphrase) {
state = 'success';
description = i18nLocale.goodJob;
}
vc.seo_storage.updateResult(state, title, description, storagePrefix);
},
checkDescriptionLength: function (title) {
var state = 'problems';
var description = '';
if (!vc.seo_storage.get('formData').description.length) {
description = i18nLocale.seoDescriptionEmpty;
} else if (vc.seo_storage.get('formData').description.length < 120) {
state = 'warnings';
description = i18nLocale.seoDescriptionTooShort;
} else if (vc.seo_storage.get('formData').description.length > 120 && vc.seo_storage.get('formData').description.length <= 156) {
state = 'success';
description = i18nLocale.wellDone;
} else if (vc.seo_storage.get('formData').description.length > 156) {
state = 'warnings';
description = i18nLocale.seoDescriptionTooLong;
}
vc.seo_storage.updateResult(state, title, description, storagePrefix);
},
checkKeyphraseInTitle: function (title) {
var state = 'problems';
var description = i18nLocale.keyphraseInTitleEmpty.replace('%1$s', vc.seo_storage.get('formData').keyphrase);
var seoTitle = vc.seo_storage.get('formData').title.toLowerCase();
var seoKeyphrase = vc.seo_storage.get('formData').keyphrase.trim().toLowerCase();
var result = utils.findKeyphrase(vc.seo_storage.get('formData').title, vc.seo_storage.get('formData').keyphrase);
var startsWithKeyphrase = 0 === seoTitle.indexOf(seoKeyphrase);
if (result.found) {
if(startsWithKeyphrase) {
state = 'success';
description = i18nLocale.goodJob;
} else {
state = 'warnings';
description = i18nLocale.keyphraseInTitleWarn;
}
}
vc.seo_storage.updateResult(state, title, description, storagePrefix);
},
checkKeyphraseInDescription: function (title) {
var state = 'problems';
var description = i18nLocale.keyphraseInDescriptionEmpty;
var result = utils.findKeyphrase(vc.seo_storage.get('formData').description, vc.seo_storage.get('formData').keyphrase);
if (result.found) {
state = 'success';
description = i18nLocale.keyphraseInDescriptionSuccess;
}
vc.seo_storage.updateResult(state, title, description, storagePrefix);
},
checkKeyphraseInSlug: function (title) {
var state = 'warnings';
var description = i18nLocale.keyphraseInSlugProblem;
var result = utils.findKeyphraseInSlug(vc.seo_storage.get('formData').slug, vc.seo_storage.get('formData').keyphrase);
if (result.found) {
state = 'success';
description = i18nLocale.greatWork;
}
vc.seo_storage.updateResult(state, title, description, storagePrefix);
},
checkKeyphraseInImages: function (title) {
var state = 'success';
var description = '';
var imagesData = utils.findKeyphraseInAltTag(this.images, vc.seo_storage.get('formData').keyphrase);
var percentage = imagesData.percentage;
var imagesWithKeyphrase = imagesData.imagesWithKeyphrase;
// Check if there are more than 4 images
if (this.images.length > 4) {
// Check if the percentage falls within the specified range (30% to 70%)
if (percentage >= 30 && percentage <= 70) {
description = i18nLocale.goodJob;
} else if (percentage > 70) {
state = 'warnings';
description = i18nLocale.imageKeyphraseTooMuch.replace('%1$s', this.images.length).replace('%2$s', imagesWithKeyphrase);
} else {
state = 'warnings';
description = i18nLocale.imageKeyphraseNotEnough.replace('%1$s', this.images.length).replace('%2$s', imagesWithKeyphrase);
}
} else {
// Check if at least one image contains the keyphrase
if (imagesWithKeyphrase > 0) {
description = i18nLocale.goodJob;
} else {
state = 'warnings';
description = i18nLocale.imageKeyphraseMissing;
}
}
vc.seo_storage.updateResult(state, title, description, storagePrefix);
},
checkKeyphraseDensity: function (title) {
var state = 'success';
var description = '';
var keyphraseInText = utils.findKeyphraseDensity(this.textContent, vc.seo_storage.get('formData').keyphrase);
var keyphraseOccurrences = keyphraseInText.keyphraseOccurrences;
var advisedMinOccurrences = keyphraseInText.advisedMinOccurrences;
var advisedMaxOccurrences = keyphraseInText.advisedMaxOccurrences;
if (keyphraseOccurrences.length < advisedMinOccurrences) {
state = 'problems';
description = i18nLocale.keyphraseDensityNotEnough.replace('%1$s', keyphraseOccurrences.length).replace('%2$s', advisedMinOccurrences);
} else if (keyphraseOccurrences.length >= advisedMinOccurrences && keyphraseOccurrences.length <= advisedMaxOccurrences) {
description = i18nLocale.keyphraseDensitySuccess.replace('%1$s', keyphraseOccurrences.length);
} else {
state = 'problems';
description = i18nLocale.keyphraseDensityTooMuch.replace('%1$s', keyphraseOccurrences.length).replace('%2$s', advisedMaxOccurrences);
}
vc.seo_storage.updateResult(state, title, description, storagePrefix);
},
checkInboundLinks: function (title) {
var inboundLinks = [];
var goodJob = i18nLocale.goodJob;
var noInboundLinksDescription = i18nLocale.noInternalLinks;
var $links = this.$wpbContentWrapper.find(">div:not(#vc_no-content-helper) a:not([class*='vc_control'])");
var inboundLinksState = 'success';
var inboundLinksDescription = goodJob;
$.each($links, function (i, link) {
if (window.location.host === link.host) {
inboundLinks.push(link);
}
});
if (!inboundLinks.length) {
inboundLinksState = 'problems';
inboundLinksDescription = noInboundLinksDescription;
}
vc.seo_storage.updateResult(inboundLinksState, title, inboundLinksDescription, storagePrefix);
},
checkOutboundLinks: function (title) {
var outboundLinks = [];
var goodJob = i18nLocale.goodJob;
var noOutboundLinksDescription = i18nLocale.noOutboundLinks;
var $links = this.$wpbContentWrapper.find(">div:not(#vc_no-content-helper) a:not([class*='vc_control'])");
var outboundLinksState = 'success';
var outboundLinksDescription = goodJob;
$.each($links, function (i, link) {
if (window.location.host !== link.host) {
outboundLinks.push(link);
}
});
if (!outboundLinks.length) {
outboundLinksState = 'problems';
outboundLinksDescription = noOutboundLinksDescription;
}
vc.seo_storage.updateResult(outboundLinksState, title, outboundLinksDescription, storagePrefix);
},
checkImages: function (title) {
var state = 'problems';
var description = i18nLocale.noImages;
var images = this.$wpbContentWrapper.find('>div:not(#vc_no-content-helper) img');
this.images = images;
if (images.length) {
state = 'success';
description = i18nLocale.goodJob;
}
vc.seo_storage.updateResult(state, title, description, storagePrefix);
},
checkPostTextLength: function (title) {
var state = 'problems';
var description = i18nLocale.textLengthLess;
var postContent = this.$wpbContentWrapper.html();
var textContent = utils.getTextContent(postContent);
this.textContent = textContent;
var textLength = textContent.split(/\s+/).length;
var isContentEmpty = (1 === textLength) && '' === utils.getTextContent(postContent).split(/\s+/)[0];
if (isContentEmpty) {
textLength = 0;
}
if (textLength < 200) {
description = description.replace('%1$s', textLength).replace('%2$s', 'far below');
} else if (textLength >= 200 && textLength < 250) {
description = description.replace('%1$s', textLength).replace('%2$s', 'below');
} else if (textLength >= 250 && textLength < 300) {
description = description.replace('%1$s', textLength).replace('%2$s', 'slightly below');
state = 'warnings';
} else if (textLength >= 300) {
description = window.sprintf(i18nLocale.textLengthSuccess, textLength);
state = 'success';
}
vc.seo_storage.updateResult(state, title, description, storagePrefix);
},
checkKeyphraseInIntroduction: function (title) {
var state = 'problems';
var description = i18nLocale.keyphraseInIntroductionEmpty;
var firstParagraph = utils.getParagraphs(this.$wpbContentWrapper).first().text();
var result = utils.findKeyphrase(firstParagraph, vc.seo_storage.get('formData').keyphrase);
if (result.found) {
state = 'success';
description = i18nLocale.wellDone;
}
vc.seo_storage.updateResult(state, title, description, storagePrefix);
},
checkPassiveVoicePercentage: function (title) {
var paragraphs = utils.getParagraphs(this.$wpbContentWrapper);
var percentage = utils.getPassiveVoicePercentage(paragraphs);
var state = 'problems';
var description = window.sprintf(i18nLocale.passiveVoiceError, percentage + '%');
if (percentage < 10) {
state = 'success';
description = i18nLocale.passiveVoiceSuccess;
}
vc.seo_storage.updateResult(state, title, description, storagePrefix);
},
checkForConsecutiveSentences: function (title) {
var hasConsecutiveSentences = utils.hasConsecutiveSentences(this.textContent);
var state = hasConsecutiveSentences.state ? 'problems' : 'success';
var description = i18nLocale.consecutiveSentencesSuccess;
if (hasConsecutiveSentences.state) {
description = i18nLocale.consecutiveSentencesFail.replace('%1$s', hasConsecutiveSentences.consecutiveCount);
}
vc.seo_storage.updateResult(state, title, description, storagePrefix);
},
checkParagraphLength: function (title) {
var state = 'success';
var description = i18nLocale.paragraphLengthSuccess;
var paragraphs = utils.getParagraphs(this.$wpbContentWrapper);
var longParagraphsCount = 0;
paragraphs.each(function (index, element) {
var paragraphText = $(element).text();
// Check the word count for each paragraph
var wordCount = utils.getWordsCount(paragraphText);
if (wordCount > 150) {
longParagraphsCount++;
}
});
if (longParagraphsCount > 0) {
description = window.sprintf(i18nLocale.paragraphLengthError, longParagraphsCount);
state = 'problems';
}
vc.seo_storage.updateResult(state, title, description, storagePrefix);
},
checkSentenceLength: function (title) {
var state = 'success';
var description = i18nLocale.great;
var paragraphs = utils.getParagraphs(this.$wpbContentWrapper);
var totalSentences = 0;
var longSentencesCount = 0;
paragraphs.each(function (index, paragraph) {
var sentences = utils.getSentences($(paragraph).text());
totalSentences += sentences.length;
// Check the word count for each sentence
sentences.forEach(function (sentence) {
var wordCount = utils.getWordsCount(sentence);
if (wordCount > 20) {
longSentencesCount++;
}
});
});
var longSentencePercentage = (longSentencesCount / totalSentences) * 100;
if (1 !== totalSentences && longSentencePercentage > 25) {
description = window.sprintf(i18nLocale.sentenceLengthError, longSentencePercentage.toFixed());
state = 'problems';
}
vc.seo_storage.updateResult(state, title, description, storagePrefix);
},
checkSubheadingDistribution: function (title) {
var contentHtmlString = this.$wpbContentWrapper.html();
var textSections = utils.getTextSectionCount(contentHtmlString);
var state = 'success';
var description = i18nLocale.goodJob;
var isNoHeadings = textSections.filter(function (section) {
return !section.subheadingCount && section.wordCount > 300;
});
var isNotEnoughHeadings = textSections.filter(function (section) {
return 1 === section.subheadingCount && section.wordCount > 300;
});
if (isNoHeadings.length) {
state = 'problems';
description = i18nLocale.subheadingDistributionFail;
} else if (isNotEnoughHeadings.length) {
state = 'warnings';
description = i18nLocale.subheadingDistributionWarn.replace('%s', isNotEnoughHeadings.length);
}
vc.seo_storage.updateResult(state, title, description, storagePrefix);
},
checkPreviouslyUsedKeyphrase: function (title) {
var state = 'success';
var description = i18nLocale.previouslyUsedKeyphraseSuccess;
if (vc.seo_storage.get('formData').isUsedKeyphrase) {
state = 'warnings';
description = i18nLocale.previouslyUsedKeyphraseWarn;
}
vc.seo_storage.updateResult(state, title, description, storagePrefix);
},
};
})(window.jQuery);