UNPKG

yoastseo-dep

Version:

Yoast clientside page analysis

291 lines (256 loc) 14.5 kB
import { mergeListItems } from "../../../../src/languageProcessing/helpers/sanitize/mergeListItems"; const paragraph1 = "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sit amet semper sem, id faucibus massa.</p>"; const paragraph2 = "<p>Nam sit amet eros faucibus, malesuada purus at, mollis libero. Praesent at ante sit amet elit sollicitudin lobortis.</p>"; const ulWordsLowerCase = "<ul>\n" + "<li>apple</li>\n" + "<li>pear</li>\n" + "<li>mango</li>\n" + "</ul>"; const olWordsLowerCase = "<ol>\n" + "<li>apple</li>\n" + "<li>pear</li>\n" + "<li>mango</li>\n" + "</ol>"; const olWithOLAttributes = "<ol type=\"I\">\n" + "<li>apple</li>\n" + "<li>pear</li>\n" + "<li>mango</li>\n" + "</ol>"; const olWithLIAttributes = "<ol type=\">\n" + "<li value=\"3\">apple</li>\n" + "<li>pear</li>\n" + "<li>mango</li>\n" + "</ol>"; const ulWithoutClosingLITags = "<ul>\n" + "<li>apple\n" + "<li>pear\n" + "<li>mango\n" + "</ul>"; const listWordsLowerCaseProcessed = " apple " + "pear " + "mango "; const ulWordsUpperCase = "<ul>\n" + "<li>Apple</li>\n" + "<li>Pear</li>\n" + "<li>Mango</li>\n" + "</ul>"; const listWordsUpperCaseProcessed = " Apple " + "Pear " + "Mango "; const ulSentences = "<ul>\n" + "<li>This sentence is about an apple.</li>\n" + "<li>This sentence is about a pear.</li>\n" + "<li>This sentence is about a mango.</li>\n" + "</ul>"; const listSentencesProcessed = " This sentence is about an apple. " + "This sentence is about a pear. " + "This sentence is about a mango. "; const ulWithNestedUL = "<ul>\n" + "<ul>" + "<li>jonagold</li>" + "<li>golden delicious</li>" + "</ul>\n" + "<li>pear</li>\n" + "<li>mango</li>\n" + "</ul>"; const ulWithNestedOL = "<ul>\n" + "<ol>" + "<li>jonagold</li>" + "<li>golden delicious</li>" + "</ol>\n" + "<li>pear</li>\n" + "<li>mango</li>\n" + "</ul>"; const olWithNestedOL = "<ol>\n" + "<ol>" + "<li>jonagold</li>" + "<li>golden delicious</li>" + "</ol>\n" + "<li>pear</li>\n" + "<li>mango</li>\n" + "</ol>"; const olWithNestedUL = "<ol>\n" + "<ul>" + "<li>jonagold</li>" + "<li>golden delicious</li>" + "</ul>\n" + "<li>pear</li>\n" + "<li>mango</li>\n" + "</ol>"; const listNestedProcessed = " jonagold " + "golden delicious " + "pear " + "mango "; const ulParagraphs = "<ul>\n" + "<li><p>This is step 1a of an instruction. This is step 1b of an instruction.</p></li>\n" + "<li><p>This is step 2a. This is step 2b.</p></li>\n" + "<li><p>This is step 3a. This is step 3b.</p></li>\n" + "<li><p>This is step 4a. This is step 4b.</p></li>\n" + "</ul>"; const listParagraphsProcessed = " <p>This is step 1a of an instruction. This is step 1b of an instruction.</p> " + "<p>This is step 2a. This is step 2b.</p> " + "<p>This is step 3a. This is step 3b.</p> " + "<p>This is step 4a. This is step 4b.</p> "; const ulParagraphsAndSentences = "<ul>\n" + "<li><p>This is step 1a of an instruction. This is step 1b of an instruction.</p></li>\n" + "<li>This is the short step 2.</li>\n" + "<li>This is the short step 3.</li>\n" + "<li><p>This is step 4a. This is step 4b.</p></li>\n" + "</ul>"; const listParagraphsAndSentencesProcessed = " <p>This is step 1a of an instruction. This is step 1b of an instruction.</p> " + "This is the short step 2. " + "This is the short step 3. " + "<p>This is step 4a. This is step 4b.</p> "; const realWorldULExample1 = "<p>Besides all of these great developments, you really should use the block editor" + " now and stop using the classic editor. Let me give you an overview of simple and clear reasons. With" + " the block editor:</p><ul><li>You will be able to build layouts that you can’t make in TinyMCE." + " Most of the stuff we did for our" + "<a href=\"https://developer.yoast.com/digital-storytelling-in-the-age-of-blocks/\">recent digital story</a>" + " required <em>no coding</em>. Plugins like <a href=\"https://wordpress.org/plugins/grids/\">Grids</a> " + "make it even easier to make very smooth designs.</li><li>You can make FAQs and HowTo’s that’ll look awesome " + "in search results. <span style=\", sans-serif\">Our Yoast SEO Schema blocks are already providing an SEO " + "advantage that is unmatched. For instance, check out our free" + " <a href=\"https://yoast.com/how-to-build-an-faq-page/\">FAQ</a> and" + " <a href=\"https://yoast.com/wordpress/plugins/seo/howto-schema-content-block/\">How-to</a> blocks." + "</span></li><li>Simple things like images next to paragraphs and other things that could be painful " + "in TinyMCE have become so much better in Gutenberg. Want multiple columns? You can have them, like that, " + "without extra coding.</li><li>Speaking of things you couldn’t do without plugins before: you can now embed" + " tables in your content, just by adding a table block. No plugins required.</li><li>Creating custom blocks" + " is relatively simple, and allows people to do 90% of the custom things they would do with plugins in the " + "past, but easier. It becomes even easier when you use a plugin like " + "<a href=\"https://www.advancedcustomfields.com/pro/\">ACF Pro</a> or <a href=\"https://getblocklab.com\">" + "Block Lab</a> to build those custom blocks.</li><li>Custom blocks, or blocks you’ve added with plugins, " + "can be easily found by users just by clicking the + sign in the editor. Shortcodes, in the classic editor, " + "didn’t have such a discovery method.</li><li>Re-usable blocks allow you to easily create content you can " + "re-use across posts or pages, see this" + " <a href=\"https://www.wpbeginner.com/beginners-guide/how-to-create-a-reusable-block-in-wordpress/\">nice " + "tutorial on WP Beginner</a>.</li></ul><p>There are many more nice features; please share yours in the comments!</p>"; const realWorldULExample1Processed = "<p>Besides all of these great developments, you really should use the block editor" + " now and stop using the classic editor. Let me give you an overview of simple and clear reasons. With" + " the block editor:</p> You will be able to build layouts that you can’t make in TinyMCE." + " Most of the stuff we did for our" + "<a href=\"https://developer.yoast.com/digital-storytelling-in-the-age-of-blocks/\">recent digital story</a>" + " required <em>no coding</em>. Plugins like <a href=\"https://wordpress.org/plugins/grids/\">Grids</a> " + "make it even easier to make very smooth designs. You can make FAQs and HowTo’s that’ll look awesome " + "in search results. <span style=\", sans-serif\">Our Yoast SEO Schema blocks are already providing an SEO " + "advantage that is unmatched. For instance, check out our free" + " <a href=\"https://yoast.com/how-to-build-an-faq-page/\">FAQ</a> and" + " <a href=\"https://yoast.com/wordpress/plugins/seo/howto-schema-content-block/\">How-to</a> blocks." + "</span> Simple things like images next to paragraphs and other things that could be painful " + "in TinyMCE have become so much better in Gutenberg. Want multiple columns? You can have them, like that, " + "without extra coding. Speaking of things you couldn’t do without plugins before: you can now embed" + " tables in your content, just by adding a table block. No plugins required. Creating custom blocks" + " is relatively simple, and allows people to do 90% of the custom things they would do with plugins in the " + "past, but easier. It becomes even easier when you use a plugin like " + "<a href=\"https://www.advancedcustomfields.com/pro/\">ACF Pro</a> or <a href=\"https://getblocklab.com\">" + "Block Lab</a> to build those custom blocks. Custom blocks, or blocks you’ve added with plugins, " + "can be easily found by users just by clicking the + sign in the editor. Shortcodes, in the classic editor, " + "didn’t have such a discovery method. Re-usable blocks allow you to easily create content you can " + "re-use across posts or pages, see this" + " <a href=\"https://www.wpbeginner.com/beginners-guide/how-to-create-a-reusable-block-in-wordpress/\">nice " + "tutorial on WP Beginner</a>. <p>There are many more nice features; please share yours in the comments!</p>"; const realWorldULExample2 = "<ul><li>On the <strong>General</strong> tab:<ul><li>Make sure your store address is " + "correct and that you’ve limited selling to your country and location</li><li>Enable or disable tax calculation if" + " needed</li><li>Enable or disable the use of coupon codes if needed</li><li>Pick the correct currency</li></ul>" + "</li><li>On the <strong>Product</strong> tab:<ul><li>Select the page where you want the shop to appear</li>" + "<li>Want users to leave reviews on your product? Activate that option here</li>" + "<li>On Inventory: Disable stock management unless you need it</li></ul></li>" + "<li>On the <strong>Payments</strong> tab:<ul><li>Pick an easy payment option, like cash on delivery or bank" + " transfer</li><li>If needed, you can add more complex payment providers like PayPal</li></ul></li>" + "<li>On the <strong>Accounts</strong> tab:<ul><li>Allow guest checkout</li>" + "<li>Allow account creation if needed</li><li>Select the Privacy policy</li>" + "<li>Review the other options on this page carefully, you may need them</li></ul>" + "</li><li>On the <strong>Emails</strong> tab:<ul><li>Check the different email templates and activate" + " the ones you want to use. For every email, change the text to match what you want to say</li>" + "<li>Scroll down to check the sender options</li><li>Also adapt the email template to fit your brand</li>" + "</ul></li><li>Skip the <strong>Integrations</strong> tab</li><li>On the <strong>Advanced</strong> tab:" + "<ul><li>Map the essential pages for your shop, i.e. the cart, checkout, account page and terms and conditions." + " You can make these pages in WordPress:<ul><li>Add the `[woocommerce_cart]` shortcode to the cart page</li>" + "<li>Add the `[woocommerce_checkout]` shortcode to the checkout page</li><li>Place the " + "`[woocommerce_my_account]` shortcode to the account page</li></ul></li></ul></li></ul>"; const realWorldULExample2Processed = " On the <strong>General</strong> tab: Make sure your store address is " + "correct and that you’ve limited selling to your country and location Enable or disable tax calculation if" + " needed Enable or disable the use of coupon codes if needed Pick the correct currency" + " On the <strong>Product</strong> tab: Select the page where you want the shop to appear" + " Want users to leave reviews on your product? Activate that option here" + " On Inventory: Disable stock management unless you need it" + " On the <strong>Payments</strong> tab: Pick an easy payment option, like cash on delivery or bank" + " transfer If needed, you can add more complex payment providers like PayPal" + " On the <strong>Accounts</strong> tab: Allow guest checkout" + " Allow account creation if needed Select the Privacy policy" + " Review the other options on this page carefully, you may need them" + " On the <strong>Emails</strong> tab: Check the different email templates and activate" + " the ones you want to use. For every email, change the text to match what you want to say" + " Scroll down to check the sender options Also adapt the email template to fit your brand" + " Skip the <strong>Integrations</strong> tab On the <strong>Advanced</strong> tab:" + " Map the essential pages for your shop, i.e. the cart, checkout, account page and terms and conditions." + " You can make these pages in WordPress: Add the `[woocommerce_cart]` shortcode to the cart page" + " Add the `[woocommerce_checkout]` shortcode to the checkout page Place the " + "`[woocommerce_my_account]` shortcode to the account page "; describe( "A test for merging list items in texts for the purpose of making the keyphrase distribution assessment" + "less sensitive to lists", function() { it( "should remove ul/ol tags, li tags and line breaks within a list and add a space before and after each list item -" + "list with lower-case single words", function() { expect( mergeListItems( ulWordsLowerCase ) ).toEqual( listWordsLowerCaseProcessed ); expect( mergeListItems( olWordsLowerCase ) ).toEqual( listWordsLowerCaseProcessed ); expect( mergeListItems( olWithOLAttributes ) ).toEqual( listWordsLowerCaseProcessed ); expect( mergeListItems( olWithLIAttributes ) ).toEqual( listWordsLowerCaseProcessed ); expect( mergeListItems( ulWithoutClosingLITags ) ).toEqual( listWordsLowerCaseProcessed ); } ); it( "should correctly process lists consisting of words starting with upper case letters", function() { expect( mergeListItems( ulWordsUpperCase ) ).toEqual( listWordsUpperCaseProcessed ); } ); it( "should correctly process lists consisting of sentences", function() { expect( mergeListItems( ulSentences ) ).toEqual( listSentencesProcessed ); } ); it( "should correctly process nested lists", function() { expect( mergeListItems( ulWithNestedUL ) ).toEqual( listNestedProcessed ); expect( mergeListItems( ulWithNestedOL ) ).toEqual( listNestedProcessed ); expect( mergeListItems( olWithNestedOL ) ).toEqual( listNestedProcessed ); expect( mergeListItems( olWithNestedUL ) ).toEqual( listNestedProcessed ); } ); it( "should process a list embedded in a text", function() { expect( mergeListItems( paragraph1 + ulWordsLowerCase + paragraph2 ) ).toEqual( paragraph1 + listWordsLowerCaseProcessed + paragraph2 ); } ); it( "should correctly process lists consisting of paragraphs", function() { expect( mergeListItems( ulParagraphs ) ).toEqual( listParagraphsProcessed ); } ); it( "should correctly process mixed lists consisting of paragraphs and sentences", function() { expect( mergeListItems( ulParagraphsAndSentences ) ).toEqual( listParagraphsAndSentencesProcessed ); } ); it( "should correctly process a real world example list including various html tags", function() { expect( mergeListItems( realWorldULExample1 ) ).toEqual( realWorldULExample1Processed ); expect( mergeListItems( realWorldULExample2 ) ).toEqual( realWorldULExample2Processed ); } ); } ); export { paragraph1, paragraph2, listWordsLowerCaseProcessed, listWordsUpperCaseProcessed, listNestedProcessed, listSentencesProcessed, listParagraphsProcessed, listParagraphsAndSentencesProcessed, realWorldULExample1, realWorldULExample2, realWorldULExample1Processed, realWorldULExample2Processed, };