diff --git a/.github/workflows/checkdocs.yml b/.github/workflows/checkdocs.yml
new file mode 100644
index 00000000000..6dd0812d970
--- /dev/null
+++ b/.github/workflows/checkdocs.yml
@@ -0,0 +1,35 @@
+name: Check Docs
+
+on:
+ push:
+ branches:
+ - develop
+ paths:
+ - 'markdown/**'
+ pull_request:
+ branches:
+ - develop
+ paths:
+ - 'markdown/**'
+
+jobs:
+ test:
+
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ node-version: [14.x]
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v2
+ - name: Setup Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Install Remark
+ run: npm install remark-cli remark-frontmatter remark-lint-emphasis-marker remark-lint-list-item-indent remark-preset-lint-consistent remark-preset-lint-recommended
+ - name: Check Docs
+ run: npm run checkdocs
+
diff --git a/markdown/dev/reference/api/config/options/pct/snap/en.md b/markdown/dev/reference/api/config/options/pct/snap/en.md
index 851ab8342da..5a4d05e1ef7 100644
--- a/markdown/dev/reference/api/config/options/pct/snap/en.md
+++ b/markdown/dev/reference/api/config/options/pct/snap/en.md
@@ -16,7 +16,7 @@ Your snapped percentage option should be a plain object with these properties:
- `min` : The minimum percentage that's allowed
- `max` : The maximum percentage that's allowed
- `snap`: Holds the snap configuration (see [Snap configuration](#))
-- `toAbs`: a method returning the **millimeter value** of the option ([see `toAbs()`](toabs))
+- `toAbs`: a method returning the **millimeter value** of the option ([see `toAbs()`][toabs])
- `hide` (optional) : A method to [control the optional display of the option][hide]
## Snap configuration
@@ -235,8 +235,6 @@ to clarify the difference.
-[fromabs]: /reference/api/config/options/pct/fromabs
-
[toabs]: /reference/api/config/options/pct/toabs
[pct]: /reference/api/config/options/pct
diff --git a/markdown/dev/reference/api/path/intersects/en.md b/markdown/dev/reference/api/path/intersects/en.md
index ccd40c43819..8eed5092151 100644
--- a/markdown/dev/reference/api/path/intersects/en.md
+++ b/markdown/dev/reference/api/path/intersects/en.md
@@ -2,7 +2,9 @@
title: intersects()
---
+ ```
array|false path.intersects(Path path)
+ ```
Returns the Point object(s) where the path intersects with a path you pass it.
@@ -21,37 +23,37 @@ If you do know, use one of the intersection methods in [Utils](/reference/api/ut
Example of the Path.intersects() method
-```js
-let { Point, points, Path, paths, Snippet, snippets } = part.shorthand();
+ ```js
+ let { Point, points, Path, paths, Snippet, snippets } = part.shorthand();
-points.A = new Point(45, 60);
-points.B = new Point(10, 30);
-points.BCp2 = new Point(40, 20);
-points.C = new Point(90, 30);
-points.CCp1 = new Point(50, -30);
-points.D = new Point(50, 130);
-points.DCp1 = new Point(150, 30);
+ points.A = new Point(45, 60);
+ points.B = new Point(10, 30);
+ points.BCp2 = new Point(40, 20);
+ points.C = new Point(90, 30);
+ points.CCp1 = new Point(50, -30);
+ points.D = new Point(50, 130);
+ points.DCp1 = new Point(150, 30);
-points._A = new Point(55, 40);
-points._B = new Point(0, 55);
-points._BCp2 = new Point(40, -20);
-points._C = new Point(90, 40);
-points._CCp1 = new Point(50, -30);
-points._D = new Point(40, 120);
-points._DCp1 = new Point(180, 40);
+ points._A = new Point(55, 40);
+ points._B = new Point(0, 55);
+ points._BCp2 = new Point(40, -20);
+ points._C = new Point(90, 40);
+ points._CCp1 = new Point(50, -30);
+ points._D = new Point(40, 120);
+ points._DCp1 = new Point(180, 40);
-paths.demo1 = new Path()
- .move(points.A)
- .line(points.B)
- .curve(points.BCp2, points.CCp1, points.C)
- .curve(points.DCp1, points.DCp1, points.D);
-paths.demo2 = new Path()
- .move(points._A)
- .line(points._B)
- .curve(points._BCp2, points._CCp1, points._C)
- .curve(points._DCp1, points._DCp1, points._D);
+ paths.demo1 = new Path()
+ .move(points.A)
+ .line(points.B)
+ .curve(points.BCp2, points.CCp1, points.C)
+ .curve(points.DCp1, points.DCp1, points.D);
+ paths.demo2 = new Path()
+ .move(points._A)
+ .line(points._B)
+ .curve(points._BCp2, points._CCp1, points._C)
+ .curve(points._DCp1, points._DCp1, points._D);
-for (let p of paths.demo1.intersects(paths.demo2)) {
- snippets[part.getId()] = new Snippet("notch", p);
-}
-```
+ for (let p of paths.demo1.intersects(paths.demo2)) {
+ snippets[part.getId()] = new Snippet("notch", p);
+ }
+ ```
diff --git a/markdown/dev/tutorials/getting-started-windows/en.md b/markdown/dev/tutorials/getting-started-windows/en.md
index 4b25d09cc5f..73c3bcdf2fa 100644
--- a/markdown/dev/tutorials/getting-started-windows/en.md
+++ b/markdown/dev/tutorials/getting-started-windows/en.md
@@ -65,9 +65,11 @@ git config --global user.name ""
FreeSewing uses .editorconfig files to enforce a consistent style for the project. VSCode relies on extensions to provide this functionality and due to a design shortcoming it does not respect certain editorconfig options which will break certain files in the freesewing project ([see vscode/65663 for details](https://github.com/microsoft/vscode/issues/65663)). If you use this editor please ensure that your settings.json file is configured to not trim trailing whitespace from markdown files. The following snippet can be added to your settings.json file to add an exemption for this file type:
+ ```json
"[markdown]": {
"files.trimTrailingWhitespace": false
},
+ ```
diff --git a/markdown/org/docs/faq/what-is-freesewing/fr.md b/markdown/org/docs/faq/what-is-freesewing/fr.md
index 540b73d4316..8fee570f828 100644
--- a/markdown/org/docs/faq/what-is-freesewing/fr.md
+++ b/markdown/org/docs/faq/what-is-freesewing/fr.md
@@ -4,7 +4,7 @@ title: Qu'est-ce que FreeSewing ?
[FreeSewing est un projet logiciel open source](https://github.com/freesewing/) dans le but de devenir le WikiPedia des patrons de couture.
-Nous fournissons une [bibliothèque de base](https://www.npmjs.com/package/@freesewing/core) pour la conception de patrons paramétriques une [bibliothèque de conceptions ](/designs/) en constante croissance implémentée dans le code, ainsi qu'un tas d'outils adjacents pour construire des interfaces modernes sur notre plateforme.
+Nous fournissons une [bibliothèque de base](https://www.npmjs.com/package/@freesewing/core) pour la conception de patrons paramétriques une [bibliothèque de conceptions](/designs/) en constante croissance implémentée dans le code, ainsi qu'un tas d'outils adjacents pour construire des interfaces modernes sur notre plateforme.
Nous ne sommes pas intéressés par la mode, les tendances ou la publication du tout nouveau modèle de la saison. Nous voulons plutôt donner des moyens de faire aux créateurs et réalisateurs en distillant les connaissances de la communauté couturière à travers des patrons paramétrables et de la documentation, tout en rendant ces informations disponibles gratuitement.
diff --git a/markdown/org/docs/guide/account/de.md b/markdown/org/docs/guide/account/de.md
index b58be287b36..f8c4cc36987 100644
--- a/markdown/org/docs/guide/account/de.md
+++ b/markdown/org/docs/guide/account/de.md
@@ -5,8 +5,8 @@ order: 300
Zum Erstellen von maßgeschneiderten Schnittmustern benötigen wir Maße. Jedes Mal danach zu fragen wäre ziemlich umständlich, weshalb wir sie für dich speichern.
-Wir brauchen einen Ort, an dem wir sie speichern können, und dieser *Ort* ist dein Account. Deine Accountdaten werden im Backend gespeichert, unter Einhaltung [unserer Datenschutzerklärung][2], und natürlich werden dabei [deine Rechte][2] respektiert.
-
-[2]: /docs/various/rights/
+Wir brauchen einen Ort, an dem wir sie speichern können, und dieser *Ort* ist dein Account. Deine Accountdaten werden im Backend gespeichert, unter Einhaltung [unserer Datenschutzerklärung][1], und natürlich werden dabei [deine Rechte][2] respektiert.
+
+[1]: /docs/various/privacy/
[2]: /docs/various/rights/
diff --git a/markdown/org/docs/guide/account/en.md b/markdown/org/docs/guide/account/en.md
index 151509c1a27..b99c9a12c34 100644
--- a/markdown/org/docs/guide/account/en.md
+++ b/markdown/org/docs/guide/account/en.md
@@ -7,7 +7,7 @@ To generate made-to-measure sewing patterns, we need measurements.
Asking for them every time would be rather tedious, so we store them for you.
We need a place to store them, and that *place* is your account.
-Your account data is stored on our backend, subject to [our privacy notice][2],
+Your account data is stored on our backend, subject to [our privacy notice][1],
and with respect for [your rights][2].
[1]: /docs/various/privacy/
diff --git a/markdown/org/docs/guide/account/es.md b/markdown/org/docs/guide/account/es.md
index adef6034eae..a40c412b57a 100644
--- a/markdown/org/docs/guide/account/es.md
+++ b/markdown/org/docs/guide/account/es.md
@@ -5,8 +5,8 @@ order: 300
Para generar patrones de costura hechos a medida, necesitamos mediciones. Preguntarlos cada vez sería más tedioso, así que los almacenamos para usted.
-Necesitamos un lugar para almacenarlos, y ese *lugar* es tu cuenta. Your account data is stored on our backend, subject to [our privacy notice][2], and with respect for [your rights][2].
-
-[2]: /docs/various/rights/
+Necesitamos un lugar para almacenarlos, y ese *lugar* es tu cuenta. Your account data is stored on our backend, subject to [our privacy notice][1], and with respect for [your rights][2].
+
+[1]: /docs/various/privacy/
[2]: /docs/various/rights/
diff --git a/markdown/org/docs/guide/account/fr.md b/markdown/org/docs/guide/account/fr.md
index 3d704c0a97c..2d368709b7c 100644
--- a/markdown/org/docs/guide/account/fr.md
+++ b/markdown/org/docs/guide/account/fr.md
@@ -5,8 +5,8 @@ order: 300
Pour créer des patrons sur mesure, nous avons besoin de vos mesures. Demander à chaque fois serait plutôt fastidieux, alors nous les stockons pour vous.
-Nous avons besoin d'un endroit pour les stocker, et cet *endroit* est votre compte. Les données de votre compte sont stockées dans nos serveurs, dans le respect de [notre politique de confidentialité][2], et dans le respect de [vos droits][2].
-
-[2]: /docs/various/rights/
+Nous avons besoin d'un endroit pour les stocker, et cet *endroit* est votre compte. Les données de votre compte sont stockées dans nos serveurs, dans le respect de [notre politique de confidentialité][1], et dans le respect de [vos droits][2].
+
+[1]: /docs/various/privacy/
[2]: /docs/various/rights/
diff --git a/markdown/org/docs/guide/account/nl.md b/markdown/org/docs/guide/account/nl.md
index c770c499e0d..42c48a45376 100644
--- a/markdown/org/docs/guide/account/nl.md
+++ b/markdown/org/docs/guide/account/nl.md
@@ -5,8 +5,8 @@ order: 300
Om naaipatronen op maat te genereren, hebben we metingen nodig. Elke keer om ze vragen zou nogal saai zijn, dus we slaan ze voor je op.
-We hebben een plaats nodig om ze op te slaan, en die *plaats* is uw account. Uw accountgegevens worden opgeslagen in onze backend, onder [onze privacyverklaring][2], en met respect voor [uw rechten][2].
-
-[2]: /docs/various/rights/
+We hebben een plaats nodig om ze op te slaan, en die *plaats* is uw account. Uw accountgegevens worden opgeslagen in onze backend, onder [onze privacyverklaring][1], en met respect voor [uw rechten][2].
+
+[1]: /docs/various/privacy/
[2]: /docs/various/rights/
diff --git a/markdown/org/docs/patterns/breanna/options/fr.md b/markdown/org/docs/patterns/breanna/options/fr.md
index d8abaafc94b..736eeeb8444 100644
--- a/markdown/org/docs/patterns/breanna/options/fr.md
+++ b/markdown/org/docs/patterns/breanna/options/fr.md
@@ -80,7 +80,7 @@ Comme pour l'option décalage, les dernières options pour déterminer la forme

-Nous avons maintenant tous les points de départ et d'arrivée pour dessiner les 5 courbes qui constitueront nos têtes de manche. Il nous manque les points de contrôle (voir [nos informations sur les courbes de Bézier ](https://freesewing.dev/concepts/beziercurves) pour en savoir plus sur la façon dont les courbes sont construites). Celles-ci sont déterminées par ce que l'on appelle *répartition*.
+Nous avons maintenant tous les points de départ et d'arrivée pour dessiner les 5 courbes qui constitueront nos têtes de manche. Il nous manque les points de contrôle (voir [nos informations sur les courbes de Bézier](https://freesewing.dev/concepts/beziercurves) pour en savoir plus sur la façon dont les courbes sont construites). Celles-ci sont déterminées par ce que l'on appelle *répartition*.
Pour chacun des points d'ancrage (ceux marqués en orange, pas les points 1 et 2), une option permet de contrôler la répartition vers le haut, et vers le bas :
diff --git a/markdown/org/docs/patterns/brian/options/fr.md b/markdown/org/docs/patterns/brian/options/fr.md
index 889b94fd313..f531da701a5 100644
--- a/markdown/org/docs/patterns/brian/options/fr.md
+++ b/markdown/org/docs/patterns/brian/options/fr.md
@@ -80,7 +80,7 @@ Comme pour l'option décalage, les dernières options pour déterminer la forme

-Nous avons maintenant tous les points de départ et d'arrivée pour dessiner les 5 courbes qui constitueront nos têtes de manche. Il nous manque les points de contrôle (voir [nos informations sur les courbes de Bézier ](https://freesewing.dev/concepts/beziercurves) pour en savoir plus sur la façon dont les courbes sont construites). Celles-ci sont déterminées par ce que l'on appelle *répartition*.
+Nous avons maintenant tous les points de départ et d'arrivée pour dessiner les 5 courbes qui constitueront nos têtes de manche. Il nous manque les points de contrôle (voir [nos informations sur les courbes de Bézier](https://freesewing.dev/concepts/beziercurves) pour en savoir plus sur la façon dont les courbes sont construites). Celles-ci sont déterminées par ce que l'on appelle *répartition*.
Pour chacun des points d'ancrage (ceux marqués en orange, pas les points 1 et 2), une option permet de contrôler la répartition vers le haut, et vers le bas :
diff --git a/markdown/org/ui/homepage/extra/de.md b/markdown/org/ui/homepage/extra/de.md
index 84f2db6d7ce..96573a3e088 100644
--- a/markdown/org/ui/homepage/extra/de.md
+++ b/markdown/org/ui/homepage/extra/de.md
@@ -7,5 +7,3 @@
[Schau dir zum Loslegen unseren Leitfaden an][1]
[1]: /docs/guide/
-
-[1]: /docs/guide/
diff --git a/markdown/org/ui/homepage/extra/es.md b/markdown/org/ui/homepage/extra/es.md
index 962e61ce96b..12a1cc69989 100644
--- a/markdown/org/ui/homepage/extra/es.md
+++ b/markdown/org/ui/homepage/extra/es.md
@@ -7,5 +7,3 @@
[Revisa nuestra guía de inicio][1]
[1]: /docs/guide/
-
-[1]: /docs/guide/
diff --git a/markdown/org/ui/homepage/extra/fr.md b/markdown/org/ui/homepage/extra/fr.md
index 3d903df369a..3d2bf18ea1f 100644
--- a/markdown/org/ui/homepage/extra/fr.md
+++ b/markdown/org/ui/homepage/extra/fr.md
@@ -7,5 +7,3 @@
[Consultez notre guide de démarrage][1]
[1]: /docs/guide/
-
-[1]: /docs/guide/
diff --git a/markdown/org/ui/homepage/extra/nl.md b/markdown/org/ui/homepage/extra/nl.md
index c422958cc4a..0ab5dab8f1b 100644
--- a/markdown/org/ui/homepage/extra/nl.md
+++ b/markdown/org/ui/homepage/extra/nl.md
@@ -7,5 +7,3 @@
[Bekijk onze startgids][1]
[1]: /docs/guide/
-
-[1]: /docs/guide/
diff --git a/package.json b/package.json
index 8bf706c1835..a4bbbabcc16 100644
--- a/package.json
+++ b/package.json
@@ -30,8 +30,8 @@
"contributors:generate": "all-contributors generate",
"famadd": "all-contributors add",
"famgen": "all-contributors generate",
- "checkdocs": "remark ./markdown/ --quiet --frail",
- "fixdocs": "remark ./markdown/ --quiet --frail --output"
+ "checkdocs": "remark markdown --use remark-preset-lint-consistent --use remark-preset-lint-recommended --quiet --frail",
+ "fixdocs": "remark markdown --use remark-preset-lint-consistent --use remark-preset-lint-recommended --output"
},
"repository": {
"type": "git",