diff --git a/Rakefile b/Rakefile
index a7eb1c57c9b..e0ebd32e8aa 100644
--- a/Rakefile
+++ b/Rakefile
@@ -14,6 +14,7 @@ require 'colorator'
# Load ruby files with helper methods from the 'rakelib/' directory
require_relative 'rakelib/link-checker.rb'
require_relative 'rakelib/converter.rb'
+require_relative 'rakelib/double-slash-check.rb'
desc "Same as 'rake', 'rake preview'"
task default: %w[preview]
diff --git a/_data/whats-new.yml b/_data/whats-new.yml
index 30984281297..11b4ef0f3d2 100644
--- a/_data/whats-new.yml
+++ b/_data/whats-new.yml
@@ -2302,7 +2302,7 @@ entries:
versions: 2.x
type: Updated
date: Mar 24 2017
-- description: '[Tutorial: Order processing](https://devdocs.magento.com/guides/v2.1//rest/tutorials/orders/order-intro.html)'
+- description: '[Tutorial: Order processing](https://devdocs.magento.com/guides/v2.1/rest/tutorials/orders/order-intro.html)'
versions: 2.1.x
type: New
date: Mar 23 2017
diff --git a/_plugins/html-check-hook.rb b/_plugins/html-check-hook.rb
index a39dae67d01..cdc63262a36 100644
--- a/_plugins/html-check-hook.rb
+++ b/_plugins/html-check-hook.rb
@@ -6,6 +6,7 @@
#
require 'html-proofer'
require 'yaml'
+require_relative '../rakelib/double-slash-check.rb'
Jekyll::Hooks.register :site, :post_write do |site|
# Do nothing unless serving mode is enabled
diff --git a/guides/v2.0/extension-dev-guide/code-generation.md b/guides/v2.0/extension-dev-guide/code-generation.md
index 6ae463a38c4..a39a2219621 100644
--- a/guides/v2.0/extension-dev-guide/code-generation.md
+++ b/guides/v2.0/extension-dev-guide/code-generation.md
@@ -8,7 +8,7 @@ menu_order: 8
## Overview of code generation {#codegen-over}
-The Magento application generates code to create non-existent classes. As an example, look at the [\\Magento\\Customer\\Model\\Resource\\AddressRepository]({{ site.mage2000url }}/app/code/Magento/Customer/Model/ResourceModel/AddressRepository.php){: target="_blank"} constructor. A snippet follows:
+The Magento application generates code to create non-existent classes. As an example, look at the [\\Magento\\Customer\\Model\\Resource\\AddressRepository]({{ site.mage2000url }}app/code/Magento/Customer/Model/ResourceModel/AddressRepository.php){: target="_blank"} constructor. A snippet follows:
...
public function __construct(
diff --git a/guides/v2.0/frontend-dev-guide/responsive-web-design/rwd_css.md b/guides/v2.0/frontend-dev-guide/responsive-web-design/rwd_css.md
index f4f38b05104..afe5f5befae 100644
--- a/guides/v2.0/frontend-dev-guide/responsive-web-design/rwd_css.md
+++ b/guides/v2.0/frontend-dev-guide/responsive-web-design/rwd_css.md
@@ -14,7 +14,7 @@ Stylesheets are the main tool in responsive web design (RWD) implementation. Thi
## Media queries in Magento default themes {#lib_rwd}
-The Blank and Luma theme styles are based on the Magento UI library. The library uses CSS3 media queries, an {% glossarytooltip 55774db9-bf9d-40f3-83db-b10cc5ae3b68 %}extension{% endglossarytooltip %} of the @media
rule, to adapt the {% glossarytooltip 73ab5daa-5857-4039-97df-11269b626134 %}layout{% endglossarytooltip %} to the screen width.
+The Blank and Luma theme styles are based on the Magento UI library. The library uses CSS3 media queries, an {% glossarytooltip 55774db9-bf9d-40f3-83db-b10cc5ae3b68 %}extension{% endglossarytooltip %} of the @media
rule, to adapt the {% glossarytooltip 73ab5daa-5857-4039-97df-11269b626134 %}layout{% endglossarytooltip %} to the screen width.
According to the approach implemented in the library, the .media-width()
{% glossarytooltip 1a305bdb-9be8-44aa-adad-98758821d6a7 %}mixin{% endglossarytooltip %} can be used in any .less
file in your theme, as many times as you need, but it is invoked only once, in lib/web/css/source/lib/_responsive.less
. The resulting styles.css
has only one call of each media query with all the rules there, instead of multiple calls for the same query.
diff --git a/guides/v2.0/frontend-dev-guide/responsive-web-design/rwd_js.md b/guides/v2.0/frontend-dev-guide/responsive-web-design/rwd_js.md
index 0d66358ae64..db0a4ff20fb 100644
--- a/guides/v2.0/frontend-dev-guide/responsive-web-design/rwd_js.md
+++ b/guides/v2.0/frontend-dev-guide/responsive-web-design/rwd_js.md
@@ -18,7 +18,7 @@ The Blank and Luma themes use the following scripts to responsively relocate pag
diff --git a/guides/v2.0/frontend-dev-guide/themes/theme-create.md b/guides/v2.0/frontend-dev-guide/themes/theme-create.md
index d8140d7d4f6..82ac1c4f0ab 100644
--- a/guides/v2.0/frontend-dev-guide/themes/theme-create.md
+++ b/guides/v2.0/frontend-dev-guide/themes/theme-create.md
@@ -259,4 +259,4 @@ For information on how to apply the theme for the storefront, see the [Apply and
## See also
- * [Uninstall a theme]({{ site.gdeurl }}/install-gde/install/cli/install-cli-theme-uninstall.html)
+ * [Uninstall a theme]({{ site.gdeurl }}install-gde/install/cli/install-cli-theme-uninstall.html)
diff --git a/guides/v2.1/config-guide/config/config-php.md b/guides/v2.1/config-guide/config/config-php.md
index db0094b814c..ce6e09f74c6 100644
--- a/guides/v2.1/config-guide/config/config-php.md
+++ b/guides/v2.1/config-guide/config/config-php.md
@@ -41,7 +41,7 @@ Unlike other [module configuration files]({{ page.baseurl }}/config-guide/config
On the top level of this array are *configuration segments*. A segment has arbitrary content (a scalar value or a nested array) distinguished by an arbitrary key—where both the key and its value are defined by the Magento framework.
-[Magento\Framework\App\DeploymentConfig]({{ site.mage2000url }}/lib/internal/Magento/Framework/App/DeploymentConfig.php) merely provides access to these sections but does not allow you to extend them.
+[Magento\Framework\App\DeploymentConfig]({{ site.mage2000url }}lib/internal/Magento/Framework/App/DeploymentConfig.php) merely provides access to these sections but does not allow you to extend them.
On the next hierarchy level, items in each segment are ordered according to the {% glossarytooltip c1e4242b-1f1a-44c3-9d72-1d5b1435e142 %}module{% endglossarytooltip %} sequence definition, which is obtained by merging all modules' configuration files, with the {% glossarytooltip 53da11f1-d0b8-4a7e-b078-1e099462b409 %}exception{% endglossarytooltip %} of disabled modules.
diff --git a/guides/v2.1/extension-dev-guide/code-generation.md b/guides/v2.1/extension-dev-guide/code-generation.md
index 7a3f5d9ea2d..df9687cebce 100644
--- a/guides/v2.1/extension-dev-guide/code-generation.md
+++ b/guides/v2.1/extension-dev-guide/code-generation.md
@@ -54,7 +54,7 @@ When code changes as discussed in the preceding section, the Object Manager comp
The code compiler compiler creates `var/di/global.ser`, which is a PHP serialized map of all constructor definitions mixed with object linking configuration defined in di.xml. `di.xml` is the dependency injection configuration. There is a global `app/etc/di.xml` and there can one defined for every {% glossarytooltip c1e4242b-1f1a-44c3-9d72-1d5b1435e142 %}module{% endglossarytooltip %}.
-[Magento/Customer/Model/Resource/AddressRepository]: {{ site.mage2000url }}/app/code/Magento/Customer/Model/ResourceModel/AddressRepository.php
+[Magento/Customer/Model/Resource/AddressRepository]: {{ site.mage2000url }}app/code/Magento/Customer/Model/ResourceModel/AddressRepository.php
{:target="_blank"}
[production mode]: {{ page.baseurl }}/config-guide/bootstrap/magento-modes.html#production-mode
[Instantiating objects with factories]: {{ page.baseurl }}/extension-dev-guide/factories.html
diff --git a/guides/v2.1/frontend-dev-guide/css-topics/css_debug.md b/guides/v2.1/frontend-dev-guide/css-topics/css_debug.md
index f5178fde750..d651e88d68d 100644
--- a/guides/v2.1/frontend-dev-guide/css-topics/css_debug.md
+++ b/guides/v2.1/frontend-dev-guide/css-topics/css_debug.md
@@ -64,8 +64,8 @@ The following table describes the grunt commands you can use performing differen
Grunt task | Action
---------- | -------
grunt clean | Removes the theme related static files in the `pub/static` and `var` directories.
-grunt exec | Republishes symlinks to the source files to the `pub/static/frontend///` directory.
-grunt less | Compiles `.css` files using the symlinks published in the `pub/static/frontend///` directory.
+grunt exec | Republishes symlinks to the source files to the `pub/static/frontend/` directory.
+grunt less | Compiles `.css` files using the symlinks published in the `pub/static/frontend/` directory.
grunt watch | Tracks the changes in the source files, recompiles `.css` files, and reloads the page in the browser.
{:style="table-layout:auto"}
diff --git a/guides/v2.1/frontend-dev-guide/css-topics/theme-ui-lib.md b/guides/v2.1/frontend-dev-guide/css-topics/theme-ui-lib.md
index 406177b0050..f86ebce0292 100644
--- a/guides/v2.1/frontend-dev-guide/css-topics/theme-ui-lib.md
+++ b/guides/v2.1/frontend-dev-guide/css-topics/theme-ui-lib.md
@@ -145,15 +145,15 @@ The documentation is available in a convenient {% glossarytooltip a2aff425-07dd-
-[`lib/web/css/docs/source/README.md`]: {{ site.mage2100url }}/lib/web/css/docs/source/README.md
+[`lib/web/css/docs/source/README.md`]: {{ site.mage2100url }}lib/web/css/docs/source/README.md
-[`lib/web/css/docs`]: {{ site.mage2100url }}/lib/web/css/docs
+[`lib/web/css/docs`]: {{ site.mage2100url }}lib/web/css/docs
-[`lib/web/css/source/lib/variables/_breadcrumbs.less`]: {{ site.mage2100url }}/lib/web/css/source/lib/variables/_breadcrumbs.less
+[`lib/web/css/source/lib/variables/_breadcrumbs.less`]: {{ site.mage2100url }}lib/web/css/source/lib/variables/_breadcrumbs.less
-[`lib/web/css/source/lib/variables`]: {{ site.mage2100url }}/lib/web/css/source/lib/variables
+[`lib/web/css/source/lib/variables`]: {{ site.mage2100url }}lib/web/css/source/lib/variables
-[`lib/web/css`]: {{ site.mage2100url }}/lib/web/css
+[`lib/web/css`]: {{ site.mage2100url }}lib/web/css
[embedded documentation]: #docs
[inherits]: {{ page.baseurl }}/frontend-dev-guide/themes/theme-inherit.html
diff --git a/guides/v2.1/frontend-dev-guide/responsive-web-design/rwd_css.md b/guides/v2.1/frontend-dev-guide/responsive-web-design/rwd_css.md
index ea9c30ea10f..515855fcbd5 100644
--- a/guides/v2.1/frontend-dev-guide/responsive-web-design/rwd_css.md
+++ b/guides/v2.1/frontend-dev-guide/responsive-web-design/rwd_css.md
@@ -34,7 +34,7 @@ You can change these breakpoints and add new ones in your custom theme. For inst
## Media queries in Magento default themes {#lib_rwd}
-The Blank and Luma theme styles are based on the [Magento UI library]({{ page.baseurl }}/frontend-dev-guide//css-topics/theme-ui-lib.html). The library uses [CSS3 media queries](http://en.wikipedia.org/wiki/Media_queries), an extension of the `@media` rule, to adapt the layout to the screen width.
+The Blank and Luma theme styles are based on the [Magento UI library]. The library uses [CSS3 media queries](http://en.wikipedia.org/wiki/Media_queries), an extension of the `@media` rule, to adapt the layout to the screen width.
The approach implemented in the Magento UI library, uses `@media-common` style group separation and `.media-width()` mixins which can be used in any `.less` file in a theme, as many times as needed, but it is invoked only once, in `lib/web/css/source/lib/_responsive.less`. The resulting `styles-m.css` and `styles-l.css` both have only one call of each media query with all the rules there, instead of multiple calls for the same query.
diff --git a/guides/v2.1/frontend-dev-guide/themes/theme-create.md b/guides/v2.1/frontend-dev-guide/themes/theme-create.md
index 8e9afce570a..7cdb7e07b85 100644
--- a/guides/v2.1/frontend-dev-guide/themes/theme-create.md
+++ b/guides/v2.1/frontend-dev-guide/themes/theme-create.md
@@ -262,4 +262,4 @@ For information on how to apply the theme for the storefront, see the [Apply and
## See also
- * [Uninstall a theme]({{ site.gdeurl }}/install-gde/install/cli/install-cli-theme-uninstall.html)
+ * [Uninstall a theme]({{ site.gdeurl }}install-gde/install/cli/install-cli-theme-uninstall.html)
diff --git a/guides/v2.1/javascript-dev-guide/javascript/js_debug.md b/guides/v2.1/javascript-dev-guide/javascript/js_debug.md
index 72cb1905ef5..2918630b6f4 100644
--- a/guides/v2.1/javascript-dev-guide/javascript/js_debug.md
+++ b/guides/v2.1/javascript-dev-guide/javascript/js_debug.md
@@ -64,6 +64,6 @@ There is no `mage/menu.js` in the current theme or parent theme JS files, so the
[Using the Inspect Element define the id]: {{site.baseurl}}/common/images/fdg_js_debug1.png
[Search the page source for the store.menu string]: {{site.baseurl}}/common/images/fdg_js_debug2.png
[assets fallback rules]: {{page.baseurl}}/frontend-dev-guide/themes/theme-inherit.html#theme-inherit-static
-[`lib/web/mage/menu.js`]: {{site.mage2100url}}/lib/web/mage/menu.js
+[`lib/web/mage/menu.js`]: {{site.mage2100url}}lib/web/mage/menu.js
[JavaScript initialization]: {{site.baseurl}}/videos/fundamentals/add-a-javascript-module/
[assets fallback]: {{page.baseurl}}/frontend-dev-guide/themes/theme-inherit.html#theme-inherit-static
\ No newline at end of file
diff --git a/guides/v2.1/payments-integrations/vault/payment-token.md b/guides/v2.1/payments-integrations/vault/payment-token.md
index 7ec00db3bd9..9a54b4919e7 100644
--- a/guides/v2.1/payments-integrations/vault/payment-token.md
+++ b/guides/v2.1/payments-integrations/vault/payment-token.md
@@ -12,7 +12,7 @@ Magento does not store any private credit card details. It only stores the data
This information is stored in Payment Token.
-The basic interface for Payment Token is [PaymentTokenInterface]({{ site.mage2100url }}/app/code/Magento/Vault/Api/Data/PaymentTokenInterface.php).
+The basic interface for Payment Token is [PaymentTokenInterface]({{ site.mage2100url }}app/code/Magento/Vault/Api/Data/PaymentTokenInterface.php).
To retrieve and store token details, you need to implement a [response handler]({{ page.baseurl }}/payments-integrations/payment-gateway/response-handler.html). In the response handler a Payment Token {% glossarytooltip a9027f5d-efab-4662-96aa-c2999b5ab259 %}entity{% endglossarytooltip %} is created and stored in the payment {% glossarytooltip 55774db9-bf9d-40f3-83db-b10cc5ae3b68 %}extension{% endglossarytooltip %} attributes.
diff --git a/guides/v2.1/ui_comp_guide/concepts/ui_comp_linking_concept.md b/guides/v2.1/ui_comp_guide/concepts/ui_comp_linking_concept.md
index 78333f65cc6..61eb4187d9d 100644
--- a/guides/v2.1/ui_comp_guide/concepts/ui_comp_linking_concept.md
+++ b/guides/v2.1/ui_comp_guide/concepts/ui_comp_linking_concept.md
@@ -50,7 +50,7 @@ Example of setting `exports` in a component's configuration `.xml` file:
```
-For an example of `exports` usage in Magento code see [`product_form.xml`, line 81]({{ site.mage2100url }}/app/code/Magento/CatalogInventory/view/adminhtml/ui_component/product_form.xml#L81)
+For an example of `exports` usage in Magento code see [`product_form.xml`, line 81]({{ site.mage2100url }}app/code/Magento/CatalogInventory/view/adminhtml/ui_component/product_form.xml#L81)
### `imports`
@@ -83,7 +83,7 @@ Example of using `imports` in a component's configuration `.xml` file:
```
-For an example of `imports` usage in Magento code see [`product_form.xml`, line 103]({{ site.mage2100url }}/app/code/Magento/CatalogInventory/view/adminhtml/ui_component/product_form.xml#L103)
+For an example of `imports` usage in Magento code see [`product_form.xml`, line 103]({{ site.mage2100url }}app/code/Magento/CatalogInventory/view/adminhtml/ui_component/product_form.xml#L103)
### `links`
diff --git a/guides/v2.1/ui_comp_guide/concepts/ui_comp_modifier_concept.md b/guides/v2.1/ui_comp_guide/concepts/ui_comp_modifier_concept.md
index 08cfa7c0873..7fa50b3cd06 100644
--- a/guides/v2.1/ui_comp_guide/concepts/ui_comp_modifier_concept.md
+++ b/guides/v2.1/ui_comp_guide/concepts/ui_comp_modifier_concept.md
@@ -5,7 +5,7 @@ title: About PHP modifiers in UI components
## What's in this topic
-This topic describes how to use {% glossarytooltip bf703ab1-ca4b-48f9-b2b7-16a81fd46e02 %}PHP{% endglossarytooltip %} modifiers that are the server-side part of [UI components configuration]({{ page.baseurl }}/ui_comp_guide/concepts//ui_comp_config_flow_concept.html). Using modifiers is optional and might be necessary when [static declaration in XML configuration files]({{ page.baseurl }}/ui_comp_guide/concepts/ui_comp_xmldeclaration_concept.html) is not suitable for the tasks. For example, in cases when additional data should be loaded from database. Or the other specific example is the [default product creation form]({{ page.baseurl }}/howdoi/customize_product.html), for which the modifier is a place where validations are added to display only certain fields for certain {% glossarytooltip 6e836354-0067-48ac-84ce-a4ab7c0c492e %}product types{% endglossarytooltip %}.
+This topic describes how to use {% glossarytooltip bf703ab1-ca4b-48f9-b2b7-16a81fd46e02 %}PHP{% endglossarytooltip %} modifiers that are the server-side part of [UI components configuration]({{ page.baseurl }}/ui_comp_guide/concepts/ui_comp_config_flow_concept.html). Using modifiers is optional and might be necessary when [static declaration in XML configuration files]({{ page.baseurl }}/ui_comp_guide/concepts/ui_comp_xmldeclaration_concept.html) is not suitable for the tasks. For example, in cases when additional data should be loaded from database. Or the other specific example is the [default product creation form]({{ page.baseurl }}/howdoi/customize_product.html), for which the modifier is a place where validations are added to display only certain fields for certain {% glossarytooltip 6e836354-0067-48ac-84ce-a4ab7c0c492e %}product types{% endglossarytooltip %}.
## General implementation overview
diff --git a/guides/v2.2/cloud/release-notes/CloudReleaseNotes2.2.md b/guides/v2.2/cloud/release-notes/CloudReleaseNotes2.2.md
index 7ca6248500f..0619abb6304 100644
--- a/guides/v2.2/cloud/release-notes/CloudReleaseNotes2.2.md
+++ b/guides/v2.2/cloud/release-notes/CloudReleaseNotes2.2.md
@@ -94,7 +94,7 @@ When upgrading to {{site.data.var.ece}} 2.2, consider the following changes in d
* The command for generating `config.php` changed in 2.2 from `php bin/magento magento-cloud:scd-dump` to `php vendor/bin/m2-ece-scd-dump`.
-* `.magento.app.yaml` has new build and deploy hooks. As part of your upgrade, you should update the `.magento.app.yaml` file with new build and deploy hooks and a set of environment variables. All actions completed by build and deploy are completed by these hooks. For instructions, see [Update .magento.app.yaml]({{ site.baseurl }}/guides/v2.2/cloud/project//project-upgrade.html#update-the-magentoappyaml-file). For additional technical information, we have removed pre-deployment tasks, refined build and deploy tasks, and modified build and deploy variables.
+* `.magento.app.yaml` has new build and deploy hooks. As part of your upgrade, you should update the `.magento.app.yaml` file with new build and deploy hooks and a set of environment variables. All actions completed by build and deploy are completed by these hooks. For instructions, see [Update .magento.app.yaml]({{ site.baseurl }}/guides/v2.2/cloud/project/project-upgrade.html#update-the-magentoappyaml-file). For additional technical information, we have removed pre-deployment tasks, refined build and deploy tasks, and modified build and deploy variables.
* The deploy variable `GENERATED_CODE_SYMLINK` has been removed. The generated folders `var/generation` and `var/di` have been moved to a `generated/` read-only directory. The folder `var/generation` is now `generated/code` and `var/di` is now `generated/metapackage`.
diff --git a/guides/v2.2/extension-dev-guide/code-generation.md b/guides/v2.2/extension-dev-guide/code-generation.md
index d2492e75576..c923e07ce6f 100644
--- a/guides/v2.2/extension-dev-guide/code-generation.md
+++ b/guides/v2.2/extension-dev-guide/code-generation.md
@@ -53,7 +53,7 @@ When code changes as discussed in the preceding section, the Object Manager comp
The code compiler creates `generated/metadata/global.php`, which is a PHP serialized map of all constructor definitions mixed with object linking configuration defined in di.xml. `di.xml` is the dependency injection configuration. There is a global `app/etc/di.xml` and there can one defined for every {% glossarytooltip c1e4242b-1f1a-44c3-9d72-1d5b1435e142 %}module{% endglossarytooltip %}.
-[Magento/Customer/Model/Resource/AddressRepository]: {{ site.mage2000url }}/app/code/Magento/Customer/Model/ResourceModel/AddressRepository.php
+[Magento/Customer/Model/Resource/AddressRepository]: {{ site.mage2000url }}app/code/Magento/Customer/Model/ResourceModel/AddressRepository.php
{:target="_blank"}
[production mode]: {{ page.baseurl }}/config-guide/bootstrap/magento-modes.html#production-mode
[Instantiating objects with factories]: {{ page.baseurl }}/extension-dev-guide/factories.html
diff --git a/guides/v2.2/extension-dev-guide/searching-with-repositories.md b/guides/v2.2/extension-dev-guide/searching-with-repositories.md
index c3d8fc61d53..11cfc0d8587 100644
--- a/guides/v2.2/extension-dev-guide/searching-with-repositories.md
+++ b/guides/v2.2/extension-dev-guide/searching-with-repositories.md
@@ -20,7 +20,7 @@ This means that every method call should not rely on previous calls nor should i
Any field contained in the repository class must also be stateless.
If your repository needs to provide functionality that requires state, such as for caching, use the registry pattern.
-A good example that uses this pattern is the [`CustomerRepository`]({{ site.mage2100url }}/app/code/Magento/Customer/Model/ResourceModel/CustomerRepository.php){:target="_blank"} class.
+A good example that uses this pattern is the [`CustomerRepository`]({{ site.mage2100url }}app/code/Magento/Customer/Model/ResourceModel/CustomerRepository.php){:target="_blank"} class.
### Search Criteria {#m2devgde-search-criteria}
diff --git a/guides/v2.2/frontend-dev-guide/css-topics/css_debug.md b/guides/v2.2/frontend-dev-guide/css-topics/css_debug.md
index 4eaa00eac0e..88b35e06c8e 100644
--- a/guides/v2.2/frontend-dev-guide/css-topics/css_debug.md
+++ b/guides/v2.2/frontend-dev-guide/css-topics/css_debug.md
@@ -63,8 +63,8 @@ The following table describes the grunt commands you can use to perform differen
Grunt task | Action
---------- | -------
grunt clean | Removes the theme related static files in the `pub/static` and `var` directories.
-grunt exec | Republishes symlinks to the source files to the `pub/static/frontend///` directory.
-grunt less | Compiles `.css` files using the symlinks published in the `pub/static/frontend///` directory.
+grunt exec | Republishes symlinks to the source files to the `pub/static/frontend/` directory.
+grunt less | Compiles `.css` files using the symlinks published in the `pub/static/frontend/` directory.
grunt watch | Tracks the changes in the source files, recompiles `.css` files, and reloads the page in the browser.
{:style="table-layout:auto"}
diff --git a/guides/v2.2/frontend-dev-guide/themes/theme-create.md b/guides/v2.2/frontend-dev-guide/themes/theme-create.md
index 9f690235f13..147010f31c5 100644
--- a/guides/v2.2/frontend-dev-guide/themes/theme-create.md
+++ b/guides/v2.2/frontend-dev-guide/themes/theme-create.md
@@ -262,4 +262,4 @@ For information on how to apply the theme for the storefront, see the [Apply and
## See also
- * [Uninstall a theme]({{ site.gdeurl }}/install-gde/install/cli/install-cli-theme-uninstall.html)
+ * [Uninstall a theme]({{ site.gdeurl }}install-gde/install/cli/install-cli-theme-uninstall.html)
diff --git a/guides/v2.2/payments-integrations/vault/payment-token.md b/guides/v2.2/payments-integrations/vault/payment-token.md
index c4aea8dc8e6..211a2a6713d 100644
--- a/guides/v2.2/payments-integrations/vault/payment-token.md
+++ b/guides/v2.2/payments-integrations/vault/payment-token.md
@@ -9,7 +9,7 @@ Magento does not store any private credit card details. It only stores the data
This information is stored in Payment Token.
-The basic interface for Payment Token is [PaymentTokenInterface]({{ site.mage2100url }}/app/code/Magento/Vault/Api/Data/PaymentTokenInterface.php).
+The basic interface for Payment Token is [PaymentTokenInterface]({{ site.mage2100url }}app/code/Magento/Vault/Api/Data/PaymentTokenInterface.php).
To retrieve and store token details, you need to implement a [response handler]({{ page.baseurl }}/payments-integrations/payment-gateway/response-handler.html). In the response handler a Payment Token {% glossarytooltip a9027f5d-efab-4662-96aa-c2999b5ab259 %}entity{% endglossarytooltip %} is created and stored in the payment {% glossarytooltip 55774db9-bf9d-40f3-83db-b10cc5ae3b68 %}extension{% endglossarytooltip %} attributes.
diff --git a/guides/v2.2/release-notes/ReleaseNotes2.2.6CE.md b/guides/v2.2/release-notes/ReleaseNotes2.2.6CE.md
index b20c60de36f..57a329b9410 100644
--- a/guides/v2.2/release-notes/ReleaseNotes2.2.6CE.md
+++ b/guides/v2.2/release-notes/ReleaseNotes2.2.6CE.md
@@ -1136,7 +1136,7 @@ Our community contributors have made many helpful, minor corrections to spelling
* `app/code/Magento/Sales/view/adminhtml/templates/order/totals.phtml`. *Fix submitted by [Pratik Oza](https://github.com/mage2pratik) in pull request [16891](https://github.com/magento/magento2/pull/16891)*.
-* Improved product gallery block helper code (`app/code//Catalog/Block/Adminhtml/Product/Helper/Form/Gallery.php`). *Fix submitted by [Valerij Ivashchenko](https://github.com/likemusic) in pull request [16889](https://github.com/magento/magento2/pull/16889)*.
+* Improved product gallery block helper code (`app/code/Catalog/Block/Adminhtml/Product/Helper/Form/Gallery.php`). *Fix submitted by [Valerij Ivashchenko](https://github.com/likemusic) in pull request [16889](https://github.com/magento/magento2/pull/16889)*.
* Removed duplicated string from `app/code/Magento/ProductVideo/i18n/en_US.csv`. *Fix submitted by [Valerij Ivashchenko](https://github.com/likemusic) in pull request [16882](https://github.com/magento/magento2/pull/16882)*.
diff --git a/guides/v2.2/release-notes/ReleaseNotes2.2.6EE.md b/guides/v2.2/release-notes/ReleaseNotes2.2.6EE.md
index 07e83025c57..9329d77c363 100644
--- a/guides/v2.2/release-notes/ReleaseNotes2.2.6EE.md
+++ b/guides/v2.2/release-notes/ReleaseNotes2.2.6EE.md
@@ -1168,7 +1168,7 @@ Our community contributors have made many helpful, minor corrections to spelling
* `app/code/Magento/Sales/view/adminhtml/templates/order/totals.phtml`. *Fix submitted by [Pratik Oza](https://github.com/mage2pratik) in pull request [16891](https://github.com/magento/magento2/pull/16891)*.
-* Improved product gallery block helper code (`app/code//Catalog/Block/Adminhtml/Product/Helper/Form/Gallery.php`). *Fix submitted by [Valerij Ivashchenko](https://github.com/likemusic) in pull request [16889](https://github.com/magento/magento2/pull/16889)*.
+* Improved product gallery block helper code (`app/code/Catalog/Block/Adminhtml/Product/Helper/Form/Gallery.php`). *Fix submitted by [Valerij Ivashchenko](https://github.com/likemusic) in pull request [16889](https://github.com/magento/magento2/pull/16889)*.
* Removed duplicated string from `app/code/Magento/ProductVideo/i18n/en_US.csv`. *Fix submitted by [Valerij Ivashchenko](https://github.com/likemusic) in pull request [16882](https://github.com/magento/magento2/pull/16882)*.
diff --git a/guides/v2.2/ui_comp_guide/concepts/ui_comp_linking_concept.md b/guides/v2.2/ui_comp_guide/concepts/ui_comp_linking_concept.md
index 8b76a737d47..a3f1b7395b3 100644
--- a/guides/v2.2/ui_comp_guide/concepts/ui_comp_linking_concept.md
+++ b/guides/v2.2/ui_comp_guide/concepts/ui_comp_linking_concept.md
@@ -48,7 +48,7 @@ Example of setting `exports` in a component's configuration `.xml` file:
```
-For an example of `exports` usage in Magento code see [`product_form.xml`, line 81]({{ site.mage2100url }}/app/code/Magento/CatalogInventory/view/adminhtml/ui_component/product_form.xml#L81)
+For an example of `exports` usage in Magento code see [`product_form.xml`, line 81]({{ site.mage2100url }}app/code/Magento/CatalogInventory/view/adminhtml/ui_component/product_form.xml#L81)
## `imports` property
The `imports` property is used for tracking changes of an external entity property. `imports`'s value is an object, composed of the following:
@@ -80,7 +80,7 @@ Example of using `imports` in a component's configuration `.xml` file:
```
-For an example of `imports` usage in Magento code see [`product_form.xml`, line 103]({{ site.mage2100url }}/app/code/Magento/CatalogInventory/view/adminhtml/ui_component/product_form.xml#L103)
+For an example of `imports` usage in Magento code see [`product_form.xml`, line 103]({{ site.mage2100url }}app/code/Magento/CatalogInventory/view/adminhtml/ui_component/product_form.xml#L103)
## `links` property
diff --git a/guides/v2.3/extension-dev-guide/searching-with-repositories.md b/guides/v2.3/extension-dev-guide/searching-with-repositories.md
index 0bc325fcdeb..6f56ea0ac33 100644
--- a/guides/v2.3/extension-dev-guide/searching-with-repositories.md
+++ b/guides/v2.3/extension-dev-guide/searching-with-repositories.md
@@ -17,7 +17,7 @@ This means that every method call should not rely on previous calls nor should i
Any field contained in the repository class must also be stateless.
If your repository needs to provide functionality that requires state, such as for caching, use the registry pattern.
-A good example that uses this pattern is the [`CustomerRepository`]({{ site.mage2100url }}/app/code/Magento/Customer/Model/ResourceModel/CustomerRepository.php) class.
+A good example that uses this pattern is the [`CustomerRepository`]({{ site.mage2100url }}app/code/Magento/Customer/Model/ResourceModel/CustomerRepository.php) class.
### Search Criteria {#m2devgde-search-criteria}
diff --git a/guides/v2.3/frontend-dev-guide/themes/theme-create.md b/guides/v2.3/frontend-dev-guide/themes/theme-create.md
index a24b672180d..0fbf221f69e 100644
--- a/guides/v2.3/frontend-dev-guide/themes/theme-create.md
+++ b/guides/v2.3/frontend-dev-guide/themes/theme-create.md
@@ -264,4 +264,4 @@ For information on how to apply the theme for the storefront, see the [Apply and
## See also
- * [Uninstall a theme]({{ site.gdeurl }}/install-gde/install/cli/install-cli-theme-uninstall.html)
+ * [Uninstall a theme]({{ site.gdeurl }}install-gde/install/cli/install-cli-theme-uninstall.html)
diff --git a/mftf/2.3/getting-started.md b/mftf/2.3/getting-started.md
index f9febdb7871..3d63195f95e 100644
--- a/mftf/2.3/getting-started.md
+++ b/mftf/2.3/getting-started.md
@@ -300,7 +300,7 @@ allure serve dev/tests/_output/allure-results/
[install Allure]: https://github.com/allure-framework/allure2#download
[java]: http://www.oracle.com/technetwork/java/javase/downloads/index.html
[mftf tests]: introduction.html#mftf-tests
-[php]: {{ site.gdeurl23 }}/install-gde/system-requirements-tech.html#php
+[php]: {{ site.gdeurl23 }}install-gde/system-requirements-tech.html#php
[PhpStorm]: https://www.jetbrains.com/phpstorm/
[selenium server]: https://www.seleniumhq.org/download/
[Set up a standalone MFTF]: #set-up-a-standalone-mftf
diff --git a/rakelib/converter.rb b/rakelib/converter.rb
index 818d1936979..8cc771a7fa0 100644
--- a/rakelib/converter.rb
+++ b/rakelib/converter.rb
@@ -52,14 +52,15 @@ def self.open_in_browser(path)
# Locate the output directory, and convert the latest markdown file to HTML.
def self.to_html
- last_md = FileList["#{LinkChecker::DIR}/*.md"].last
+ latest_md =
+ FileList["#{LinkChecker::DIR}/*.md"].max_by { |file| File.mtime file }
- print "Reading the #{last_md} ... ".magenta
+ print "Reading the #{latest_md} ... ".magenta
# Change a file extension to .html
- html_file = last_md.ext('html')
+ html_file = latest_md.ext('html')
File.open(html_file, 'w') do |file|
print 'converting to HTML ... '.magenta
- file.write kramdown(content(last_md))
+ file.write kramdown(content(latest_md))
file.write CSS
end
diff --git a/rakelib/double-slash-check.rb b/rakelib/double-slash-check.rb
new file mode 100644
index 00000000000..beccb0580b7
--- /dev/null
+++ b/rakelib/double-slash-check.rb
@@ -0,0 +1,20 @@
+# Custom check for html-proofer to find double forward slashes in URLs.
+module LinkChecker
+ class DoubleSlashCheck < ::HTMLProofer::Check
+ def slash?
+ return false if @link.href.nil?
+ @link.href.match %r{\w//}
+ end
+
+ def run
+ @html.css('a').each do |node|
+ @link = create_element(node)
+ line = node.line
+
+ if slash?
+ return add_issue("Remove double forward slashes from URLs", line: line)
+ end
+ end
+ end
+ end
+end