diff --git a/src/steps/render.js b/src/steps/render.js index 9e747187..7c844f8e 100644 --- a/src/steps/render.js +++ b/src/steps/render.js @@ -67,12 +67,21 @@ export default async function render(state, req, res) { } let jsonLd; + let htmlLang; + for (const [name, value] of Object.entries(meta.page)) { if (name.toLowerCase() === 'json-ld') { jsonLd = value; // eslint-disable-next-line no-continue continue; } + if (name.toLowerCase() === 'html-lang') { + if (/^[a-z]{2}([-_]{1}[A-Z]{2})?$/.test(value)) { + htmlLang = value; + } + // eslint-disable-next-line no-continue + continue; + } const attr = name.includes(':') && !name.startsWith('twitter:') ? 'property' : 'name'; if (Array.isArray(value)) { for (const v of value) { @@ -111,7 +120,7 @@ export default async function render(state, req, res) { type: 'root', children: [ { type: 'doctype' }, - h('html', [ + h('html', htmlLang ? { lang: htmlLang } : null, [ $head, h('body', [ h('header', []), // todo: are those still required ? diff --git a/test/fixtures/content/page-metadata-htmllang-invalid.html b/test/fixtures/content/page-metadata-htmllang-invalid.html new file mode 100644 index 00000000..352407aa --- /dev/null +++ b/test/fixtures/content/page-metadata-htmllang-invalid.html @@ -0,0 +1,27 @@ + + + Home | Helix Project Boilerplate + + + + + + + + + + + + + + +
+
+
+

HTML lang test

+

This is great.

+
+
+ + + \ No newline at end of file diff --git a/test/fixtures/content/page-metadata-htmllang-invalid.md b/test/fixtures/content/page-metadata-htmllang-invalid.md new file mode 100644 index 00000000..9c63440c --- /dev/null +++ b/test/fixtures/content/page-metadata-htmllang-invalid.md @@ -0,0 +1,11 @@ +# HTML lang test + +This is great. + ++-------------------------------------------------------------------------------------------+ +| Metadata | ++================+==========================================================================+ +| title | Home \| Helix Project Boilerplate | ++----------------+--------------------------------------------------------------------------| +| html-lang | something | ++----------------+--------------------------------------------------------------------------+ diff --git a/test/fixtures/content/page-metadata-htmllang-short.html b/test/fixtures/content/page-metadata-htmllang-short.html new file mode 100644 index 00000000..edcc5b92 --- /dev/null +++ b/test/fixtures/content/page-metadata-htmllang-short.html @@ -0,0 +1,27 @@ + + + Home | Helix Project Boilerplate + + + + + + + + + + + + + + +
+
+
+

HTML lang test

+

This is great.

+
+
+ + + \ No newline at end of file diff --git a/test/fixtures/content/page-metadata-htmllang-short.md b/test/fixtures/content/page-metadata-htmllang-short.md new file mode 100644 index 00000000..fb90998c --- /dev/null +++ b/test/fixtures/content/page-metadata-htmllang-short.md @@ -0,0 +1,11 @@ +# HTML lang test + +This is great. + ++-------------------------------------------------------------------------------------------+ +| Metadata | ++================+==========================================================================+ +| title | Home \| Helix Project Boilerplate | ++----------------+--------------------------------------------------------------------------| +| html-lang | de | ++----------------+--------------------------------------------------------------------------+ diff --git a/test/fixtures/content/page-metadata-htmllang.html b/test/fixtures/content/page-metadata-htmllang.html new file mode 100644 index 00000000..ed3841fe --- /dev/null +++ b/test/fixtures/content/page-metadata-htmllang.html @@ -0,0 +1,27 @@ + + + Home | Helix Project Boilerplate + + + + + + + + + + + + + + +
+
+
+

HTML lang test

+

This is great.

+
+
+ + + \ No newline at end of file diff --git a/test/fixtures/content/page-metadata-htmllang.md b/test/fixtures/content/page-metadata-htmllang.md new file mode 100644 index 00000000..7bb31b3f --- /dev/null +++ b/test/fixtures/content/page-metadata-htmllang.md @@ -0,0 +1,11 @@ +# HTML lang test + +This is great. + ++-------------------------------------------------------------------------------------------+ +| Metadata | ++================+==========================================================================+ +| title | Home \| Helix Project Boilerplate | ++----------------+--------------------------------------------------------------------------| +| html-lang | en-US | ++----------------+--------------------------------------------------------------------------+ diff --git a/test/rendering.test.js b/test/rendering.test.js index d3c925b4..c2136020 100644 --- a/test/rendering.test.js +++ b/test/rendering.test.js @@ -520,6 +520,21 @@ describe('Rendering', () => { config = DEFAULT_CONFIG_EMPTY; await testRender('page-metadata-jsonld-xss', 'head'); }); + + it('injects html lang', async () => { + config = DEFAULT_CONFIG_EMPTY; + await testRender('page-metadata-htmllang', ':scope'); + }); + + it('accepts short html lang', async () => { + config = DEFAULT_CONFIG_EMPTY; + await testRender('page-metadata-htmllang-short', ':scope'); + }); + + it('rejects invalid html lang', async () => { + config = DEFAULT_CONFIG_EMPTY; + await testRender('page-metadata-htmllang-invalid', ':scope'); + }); }); describe('Miscellaneous', () => {