From bd1d9d189c8617be35895146bcf7295581f905d4 Mon Sep 17 00:00:00 2001 From: Daniel Weck Date: Sun, 1 Dec 2024 22:15:04 +0000 Subject: [PATCH] fix: metadata accessibility feature printPageNumbers/pageBreakMarkers (missing page breaks in publication content documents) VERSUS pageNavigation (missing navigation document page list) --- packages/ace-core/src/checker/checker-epub.js | 43 +++++++++++------- packages/ace-core/src/checker/checker.js | 45 ++++++++++++++++++- packages/ace-core/src/l10n/locales/da.json | 4 +- packages/ace-core/src/l10n/locales/de.json | 4 +- packages/ace-core/src/l10n/locales/en.json | 10 ++++- packages/ace-core/src/l10n/locales/es.json | 4 +- packages/ace-core/src/l10n/locales/fr.json | 4 +- packages/ace-core/src/l10n/locales/ja.json | 4 +- packages/ace-core/src/l10n/locales/pt_BR.json | 4 +- packages/ace-core/src/l10n/locales/zh_TW.json | 4 +- tests/__tests__/epub-rules.test.js | 25 +++++++++-- .../EPUB/content_001.xhtml | 9 ++++ .../EPUB/nav.xhtml | 12 +++++ .../EPUB/package.opf | 24 ++++++++++ .../META-INF/container.xml | 6 +++ .../mimetype | 1 + .../EPUB/package.opf | 2 +- tests/data/issue-85/EPUB/package.opf | 2 +- website/content/rules/epub.md | 7 +-- 19 files changed, 172 insertions(+), 42 deletions(-) create mode 100644 tests/data/epubrules-metadata-pageNavigation-nopagelist/EPUB/content_001.xhtml create mode 100644 tests/data/epubrules-metadata-pageNavigation-nopagelist/EPUB/nav.xhtml create mode 100644 tests/data/epubrules-metadata-pageNavigation-nopagelist/EPUB/package.opf create mode 100644 tests/data/epubrules-metadata-pageNavigation-nopagelist/META-INF/container.xml create mode 100644 tests/data/epubrules-metadata-pageNavigation-nopagelist/mimetype diff --git a/packages/ace-core/src/checker/checker-epub.js b/packages/ace-core/src/checker/checker-epub.js index 4604a060..ac27477f 100644 --- a/packages/ace-core/src/checker/checker-epub.js +++ b/packages/ace-core/src/checker/checker-epub.js @@ -67,6 +67,8 @@ function newMetadataAssertion(name, impact = 'serious') { // "Value '{{value}}' is invalid for '{{name}}' metadata" function checkMetadata(assertions, epub) { + let has_accessibilityFeature_printPageNumbersPageBreakMarkers = false; + // Check metadata values for (const name in a11yMetadata.A11Y_META) { const meta = a11yMetadata.A11Y_META[name]; @@ -198,12 +200,18 @@ function checkMetadata(assertions, epub) { })) }); } - + // Check consistency of the printPageNumbers feature - if (name === 'schema:accessibilityFeature' - && (splitValues.includes('printPageNumbers') || splitValues.includes('pageBreakMarkers')) - && !epub.navDoc.hasPageList) { - + const has_accessibilityFeature_pageNavigation = + name === 'schema:accessibilityFeature' + && splitValues.includes('pageNavigation'); + + has_accessibilityFeature_printPageNumbersPageBreakMarkers = has_accessibilityFeature_printPageNumbersPageBreakMarkers || + name === 'schema:accessibilityFeature' && (splitValues.includes('printPageNumbers') || splitValues.includes('pageBreakMarkers')); + + if (has_accessibilityFeature_pageNavigation && !epub.navDoc.hasPageList + // || !has_accessibilityFeature_pageNavigation && epub.navDoc.hasPageList + ) { assertions.withAssertions(newViolation({ impact: 'moderate', title: `metadata-accessibilityFeature-printPageNumbers-nopagelist`, @@ -212,12 +220,13 @@ function checkMetadata(assertions, epub) { kbPath: 'docs/metadata/schema.org/index.html', kbTitle: localize("checkepub.metadataprintpagenumbers.kbtitle"), ruleDesc: localize("checkepub.metadataprintpagenumbers.ruledesc", {}) - })) + })); } }); } } } + return has_accessibilityFeature_printPageNumbersPageBreakMarkers; } function checkMediaOverlays(epub) { @@ -327,7 +336,7 @@ function checkReadingOrder(epub) { .withTestSubject(resPath, ""); // console.log("EPUB", JSON.stringify(epub, null, 4)); - + const docs = []; for (const doc of epub.contentDocs) { if (doc.notInReadingOrder) { // NavDoc artificially appended @@ -532,7 +541,7 @@ function check(epub, report) { const assertionsMO = checkMediaOverlays(epub); // Check a11y metadata - checkMetadata(assertion, epub); + const has_accessibilityFeature_printPageNumbersPageBreakMarkers = checkMetadata(assertion, epub); // Check presence of a title checkTitle(assertion, epub); @@ -552,8 +561,8 @@ function check(epub, report) { } } - const builtAssertions = assertion.build(); - report.addAssertions(builtAssertions); + // const builtAssertions = assertion.build(); + // report.addAssertions(builtAssertions); // Report the Nav Doc report.addEPUBNav(epub.navDoc); @@ -565,12 +574,16 @@ function check(epub, report) { hasSVGContentDocuments: epub.hasSVGContentDocuments, }); - winston.info(`- ${epub.packageDoc.src}: ${ - (builtAssertions.assertions && builtAssertions.assertions.length > 0) - ? builtAssertions.assertions.length - : 'No'} issues found`); + // winston.info(`- ${epub.packageDoc.src}: ${ + // (builtAssertions.assertions && builtAssertions.assertions.length > 0) + // ? builtAssertions.assertions.length + // : 'No'} issues found`); - return Promise.resolve(); + return Promise.resolve({ + assertion, + has_accessibilityFeature_printPageNumbersPageBreakMarkers, + }); } module.exports.check = check; +module.exports.newViolation = newViolation; diff --git a/packages/ace-core/src/checker/checker.js b/packages/ace-core/src/checker/checker.js index fe5ab111..0efa5b21 100644 --- a/packages/ace-core/src/checker/checker.js +++ b/packages/ace-core/src/checker/checker.js @@ -1,5 +1,6 @@ 'use strict'; +const { localize } = require('../l10n/localize').localizer; const htmlChecker = require('./checker-chromium.js'); const epubChecker = require('./checker-epub.js'); const winston = require('winston'); @@ -43,6 +44,46 @@ function consolidate(results, report) { module.exports.check = function check(epub, report, lang, axeRunner) { return epubChecker.check(epub, report) - .then(() => htmlChecker.check(epub, lang, axeRunner)) - .then(results => consolidate(results, report)); + .then(async (obj) => { + return htmlChecker.check(epub, lang, axeRunner).then((results) => { + return new Promise((res) => { + res({ + assertion: obj.assertion, + has_accessibilityFeature_printPageNumbersPageBreakMarkers: obj.has_accessibilityFeature_printPageNumbersPageBreakMarkers, + res: results, + }); + }); + }); + }) + .then((results) => { + // console.log(JSON.stringify(results, null, 4)); + // throw new Error("DEBUGG"); + + const hasPageBreaks = !!results.res.find((item) => { + return !!item.properties.hasPageBreaks; + }); + if (results.has_accessibilityFeature_printPageNumbersPageBreakMarkers && !hasPageBreaks + // || !results.has_accessibilityFeature_printPageNumbersPageBreakMarkers && hasPageBreaks + ) { + results.assertion.withAssertions(epubChecker.newViolation({ + impact: 'moderate', + title: `metadata-accessibilityFeature-printPageNumbers-nopagebreaks`, + testDesc: localize("checkepub.metadatapagebreaks.testdesc", {}), + resDesc: localize("checkepub.metadatapagebreaks.resdesc", {}), + kbPath: 'docs/metadata/schema.org/index.html', + kbTitle: localize("checkepub.metadatapagebreaks.kbtitle"), + ruleDesc: localize("checkepub.metadatapagebreaks.ruledesc", {}) + })); + } + + const builtAssertions = results.assertion.build(); + report.addAssertions(builtAssertions); + + winston.info(`- ${epub.packageDoc.src}: ${ + (builtAssertions.assertions && builtAssertions.assertions.length > 0) + ? builtAssertions.assertions.length + : 'No'} issues found`); + + return consolidate(results.res, report); + }); }; diff --git a/packages/ace-core/src/l10n/locales/da.json b/packages/ace-core/src/l10n/locales/da.json index 83e6e928..024c14b2 100644 --- a/packages/ace-core/src/l10n/locales/da.json +++ b/packages/ace-core/src/l10n/locales/da.json @@ -27,8 +27,8 @@ "metadataprintpagenumbers": { "kbtitle": "Metadata for tilgængelighed fra Schema.org", "resdesc": "Tilføj en liste over sider til navigations-dokumentet", - "ruledesc": "Når tilgængeligheds-egenskaben 'printPageNumbers'/'pageBreakMarkers' bruges, bør navigations-dokumentet indeholde en liste over sider", - "testdesc": "Tilgængeligheds-egenskaben 'printPageNumbers'/'pageBreakMarkers' bruges, men ingen liste over sider er angivet" + "ruledesc": "Når tilgængeligheds-egenskaben 'pageNavigation' bruges, bør navigations-dokumentet indeholde en liste over sider", + "testdesc": "Tilgængeligheds-egenskaben 'pageNavigation' bruges, men ingen liste over sider er angivet" }, "metadataviolation": { "kbtitle": "Metadata for tilgængelighed fra Schema.org", diff --git a/packages/ace-core/src/l10n/locales/de.json b/packages/ace-core/src/l10n/locales/de.json index 34db393a..87e938aa 100644 --- a/packages/ace-core/src/l10n/locales/de.json +++ b/packages/ace-core/src/l10n/locales/de.json @@ -27,8 +27,8 @@ "metadataprintpagenumbers": { "kbtitle": "Schema.org Barrierefreiheitsmetadaten", "resdesc": "Eine Seitenübersicht zum Navigationsdokument hinzufügen", - "ruledesc": "Wenn die Barrierefreiheitsfunktion 'printPageNumbers'/'pageBreakMarkers' angegeben ist, sollte das Navigationsdokument eine Seitenübersicht enthalten", - "testdesc": "Barrierefreiheitsfunktion 'printPageNumbers'/'pageBreakMarkers' ist angegeben aber die Seitenübersicht fehlt" + "ruledesc": "Wenn die Barrierefreiheitsfunktion 'pageNavigation' angegeben ist, sollte das Navigationsdokument eine Seitenübersicht enthalten", + "testdesc": "Barrierefreiheitsfunktion 'pageNavigation' ist angegeben aber die Seitenübersicht fehlt" }, "metadataviolation": { "kbtitle": "Schema.org Barrierefreiheitsmetadaten", diff --git a/packages/ace-core/src/l10n/locales/en.json b/packages/ace-core/src/l10n/locales/en.json index 29f0dcc8..233c5657 100644 --- a/packages/ace-core/src/l10n/locales/en.json +++ b/packages/ace-core/src/l10n/locales/en.json @@ -24,11 +24,17 @@ "ruledesc": "'{{name}}' metadata must be set to one of the expected values", "testdesc": "Value '{{value}}' is invalid for '{{name}}' metadata" }, + "metadatapagebreaks": { + "kbtitle": "Schema.org Accessibility Metadata", + "resdesc": "Add page breaks to publication documents", + "ruledesc": "When the accessibility feature 'printPageNumbers'/'pageBreakMarkers' is declared, documents should include page breaks", + "testdesc": "Accessibility feature 'printPageNumbers'/'pageBreakMarkers' is declared but there are no page breaks" + }, "metadataprintpagenumbers": { "kbtitle": "Schema.org Accessibility Metadata", "resdesc": "Add a page list to the Navigation Document", - "ruledesc": "When the accessibility feature 'printPageNumbers'/'pageBreakMarkers' is declared, the Navigation Document should include a page list", - "testdesc": "Accessibility feature 'printPageNumbers'/'pageBreakMarkers' is declared but page list is missing" + "ruledesc": "When the accessibility feature 'pageNavigation' is declared, the Navigation Document should include a page list", + "testdesc": "Accessibility feature 'pageNavigation' is declared but page list is missing" }, "metadataviolation": { "kbtitle": "Schema.org Accessibility Metadata", diff --git a/packages/ace-core/src/l10n/locales/es.json b/packages/ace-core/src/l10n/locales/es.json index cde48172..cc620de9 100644 --- a/packages/ace-core/src/l10n/locales/es.json +++ b/packages/ace-core/src/l10n/locales/es.json @@ -27,8 +27,8 @@ "metadataprintpagenumbers": { "kbtitle": "Metadatos de Accesibilidad Schema.org", "resdesc": "Añadir una lista de páginas al documento de navegación", - "ruledesc": "Cuando se haya declarado la función de accesibilidad 'printPageNumbers'/'pageBreakMarkers', el documento de navegación debería incluir una lista de páginas", - "testdesc": "La función de accesibilidad 'printPageNumbers'/'pageBreakMarkers' se ha declarado, pero la lista de páginas está ausente" + "ruledesc": "Cuando se haya declarado la función de accesibilidad 'pageNavigation', el documento de navegación debería incluir una lista de páginas", + "testdesc": "La función de accesibilidad 'pageNavigation' se ha declarado, pero la lista de páginas está ausente" }, "metadataviolation": { "kbtitle": "Metadatos de Accesibilidad Schema.org", diff --git a/packages/ace-core/src/l10n/locales/fr.json b/packages/ace-core/src/l10n/locales/fr.json index 6605dccd..48d779a5 100644 --- a/packages/ace-core/src/l10n/locales/fr.json +++ b/packages/ace-core/src/l10n/locales/fr.json @@ -27,8 +27,8 @@ "metadataprintpagenumbers": { "kbtitle": "Schema.org Accessibility Metadata", "resdesc": "Ajouter une liste de pages au document de navigation", - "ruledesc": "Quand la propriété d’accessibilité 'printPageNumbers'/'pageBreakMarkers' est déclarée, le document de navigation doit avoir une liste de pages", - "testdesc": "La propriété d’accessibilité 'printPageNumbers'/'pageBreakMarkers' est déclarée mais aucune liste de pages n’a été trouvée" + "ruledesc": "Quand la propriété d’accessibilité 'pageNavigation' est déclarée, le document de navigation doit avoir une liste de pages", + "testdesc": "La propriété d’accessibilité 'pageNavigation' est déclarée mais aucune liste de pages n’a été trouvée" }, "metadataviolation": { "kbtitle": "Métadonnées d'accessibilité Schema.org", diff --git a/packages/ace-core/src/l10n/locales/ja.json b/packages/ace-core/src/l10n/locales/ja.json index 274e00d5..dbc33879 100644 --- a/packages/ace-core/src/l10n/locales/ja.json +++ b/packages/ace-core/src/l10n/locales/ja.json @@ -27,8 +27,8 @@ "metadataprintpagenumbers": { "kbtitle": "Schema.orgアクセシビリティメタデータ", "resdesc": "ナビゲーションドキュメントにページリストを追加する", - "ruledesc": "アクセシビリティ機能「printPageNumbers」/「pageBreakMarkers」が宣言されている場合、ナビゲーションドキュメントにページリストを含める必要があります", - "testdesc": "アクセシビリティ機能「printPageNumbers」/「pageBreakMarkers」は宣言されていますが、ページリストがありません" + "ruledesc": "アクセシビリティ機能「pageNavigation」が宣言されている場合、ナビゲーションドキュメントにページリストを含める必要があります", + "testdesc": "アクセシビリティ機能「pageNavigation」は宣言されていますが、ページリストがありません" }, "metadataviolation": { "kbtitle": "Schema.orgアクセシビリティメタデータ", diff --git a/packages/ace-core/src/l10n/locales/pt_BR.json b/packages/ace-core/src/l10n/locales/pt_BR.json index a30c6cdb..c88b9d31 100644 --- a/packages/ace-core/src/l10n/locales/pt_BR.json +++ b/packages/ace-core/src/l10n/locales/pt_BR.json @@ -27,8 +27,8 @@ "metadataprintpagenumbers": { "kbtitle": "Metadados de Acessibilidade Schema.org", "resdesc": "Adicione uma lista de páginas ao Documento de Navegação", - "ruledesc": "Quando o recurso de acessibilidade 'printPageNumbers'/'pageBreakMarkers' é declarado, o Documento de Navegação deve incluir uma lista de páginas", - "testdesc": "O recurso de acessibilidade 'printPageNumbers'/'pageBreakMarkers' foi declarado mas a lista de páginas está ausente" + "ruledesc": "Quando o recurso de acessibilidade 'pageNavigation' é declarado, o Documento de Navegação deve incluir uma lista de páginas", + "testdesc": "O recurso de acessibilidade 'pageNavigation' foi declarado mas a lista de páginas está ausente" }, "metadataviolation": { "kbtitle": "Metadados de Acessibilidade Schema.org", diff --git a/packages/ace-core/src/l10n/locales/zh_TW.json b/packages/ace-core/src/l10n/locales/zh_TW.json index a740c161..2370e492 100644 --- a/packages/ace-core/src/l10n/locales/zh_TW.json +++ b/packages/ace-core/src/l10n/locales/zh_TW.json @@ -27,8 +27,8 @@ "metadataprintpagenumbers": { "kbtitle": "Schema.org可及性詮釋資料", "resdesc": "在導覽文件中加入頁面列表", - "ruledesc": "當宣告可及性功能「printPageNumbers」/「pageBreakMarkers」時,導覽文件中應該包含一份頁面列表", - "testdesc": "可及性功能中宣告了「printPageNumbers」/「pageBreakMarkers」,但未包含頁面列表" + "ruledesc": "當宣告可及性功能「pageNavigation」時,導覽文件中應該包含一份頁面列表", + "testdesc": "可及性功能中宣告了「pageNavigation」,但未包含頁面列表" }, "metadataviolation": { "kbtitle": "Schema.org可及性詮釋資料", diff --git a/tests/__tests__/epub-rules.test.js b/tests/__tests__/epub-rules.test.js index d0d5af5a..6e1c6413 100644 --- a/tests/__tests__/epub-rules.test.js +++ b/tests/__tests__/epub-rules.test.js @@ -420,8 +420,10 @@ describe('accessibility metadata', () => { }), ])); }); - test('`printPageNumbers` is declared as a feature but the Nav Doc has no page list', async () => { - const report = await ace('../data/epubrules-metadata-printPageNumbers-nopagelist'); + + test('`pageNavigation` is declared as a feature but the Nav Doc has no page list', async () => { + const report = await ace('../data/epubrules-metadata-pageNavigation-nopagelist'); + // console.log(JSON.stringify(report, null, 4)); expect(report['earl:result']['earl:outcome']).toEqual('fail'); const assertions = findAssertionsForDoc(report, 'EPUB/package.opf'); expect(assertions).toEqual(expect.arrayContaining([ @@ -432,14 +434,29 @@ describe('accessibility metadata', () => { }), ])); }); - test('`pageBreakMarkers` is declared as a feature but the Nav Doc has no page list', async () => { + + test('`printPageNumbers` is declared as a feature but the publication content has no page breaks', async () => { + const report = await ace('../data/epubrules-metadata-printPageNumbers-nopagelist'); + // console.log(JSON.stringify(report, null, 4)); + expect(report['earl:result']['earl:outcome']).toEqual('fail'); + const assertions = findAssertionsForDoc(report, 'EPUB/package.opf'); + expect(assertions).toEqual(expect.arrayContaining([ + expect.objectContaining({ + 'earl:test': expect.objectContaining({ + 'dct:title': 'metadata-accessibilityFeature-printPageNumbers-nopagebreaks', + }), + }), + ])); + }); + test('`pageBreakMarkers` is declared as a feature but the publication content has no page breaks', async () => { const report = await ace('../data/epubrules-metadata-pageBreakMarkers-nopagelist'); + // console.log(JSON.stringify(report, null, 4)); expect(report['earl:result']['earl:outcome']).toEqual('fail'); const assertions = findAssertionsForDoc(report, 'EPUB/package.opf'); expect(assertions).toEqual(expect.arrayContaining([ expect.objectContaining({ 'earl:test': expect.objectContaining({ - 'dct:title': 'metadata-accessibilityFeature-printPageNumbers-nopagelist', + 'dct:title': 'metadata-accessibilityFeature-printPageNumbers-nopagebreaks', }), }), ])); diff --git a/tests/data/epubrules-metadata-pageNavigation-nopagelist/EPUB/content_001.xhtml b/tests/data/epubrules-metadata-pageNavigation-nopagelist/EPUB/content_001.xhtml new file mode 100644 index 00000000..c55a9e8b --- /dev/null +++ b/tests/data/epubrules-metadata-pageNavigation-nopagelist/EPUB/content_001.xhtml @@ -0,0 +1,9 @@ + + +Minimal EPUB + + +

Loomings

+

Call me Ishmael.

+ + diff --git a/tests/data/epubrules-metadata-pageNavigation-nopagelist/EPUB/nav.xhtml b/tests/data/epubrules-metadata-pageNavigation-nopagelist/EPUB/nav.xhtml new file mode 100644 index 00000000..506aabb3 --- /dev/null +++ b/tests/data/epubrules-metadata-pageNavigation-nopagelist/EPUB/nav.xhtml @@ -0,0 +1,12 @@ + + +Minimal Nav + + + + + diff --git a/tests/data/epubrules-metadata-pageNavigation-nopagelist/EPUB/package.opf b/tests/data/epubrules-metadata-pageNavigation-nopagelist/EPUB/package.opf new file mode 100644 index 00000000..da9b611b --- /dev/null +++ b/tests/data/epubrules-metadata-pageNavigation-nopagelist/EPUB/package.opf @@ -0,0 +1,24 @@ + + + + Minimal EPUB 3.0 + en + NOID + 2017-01-01T00:00:01Z + structuralNavigation + pageNavigation + everything OK! + noFlashingHazard + noSoundHazard + noMotionSimulationHazard + textual + textual + + + + + + + + + diff --git a/tests/data/epubrules-metadata-pageNavigation-nopagelist/META-INF/container.xml b/tests/data/epubrules-metadata-pageNavigation-nopagelist/META-INF/container.xml new file mode 100644 index 00000000..2cf00654 --- /dev/null +++ b/tests/data/epubrules-metadata-pageNavigation-nopagelist/META-INF/container.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/tests/data/epubrules-metadata-pageNavigation-nopagelist/mimetype b/tests/data/epubrules-metadata-pageNavigation-nopagelist/mimetype new file mode 100644 index 00000000..57ef03f2 --- /dev/null +++ b/tests/data/epubrules-metadata-pageNavigation-nopagelist/mimetype @@ -0,0 +1 @@ +application/epub+zip \ No newline at end of file diff --git a/tests/data/epubrules-pagelist-toc-order-pass/EPUB/package.opf b/tests/data/epubrules-pagelist-toc-order-pass/EPUB/package.opf index 724cfc8c..f41a41c9 100644 --- a/tests/data/epubrules-pagelist-toc-order-pass/EPUB/package.opf +++ b/tests/data/epubrules-pagelist-toc-order-pass/EPUB/package.opf @@ -4,7 +4,7 @@ Minimal EPUB 3.0 en NOID - + urn:isbn:9781234567891 pagination diff --git a/tests/data/issue-85/EPUB/package.opf b/tests/data/issue-85/EPUB/package.opf index 35587d6a..68f83d55 100644 --- a/tests/data/issue-85/EPUB/package.opf +++ b/tests/data/issue-85/EPUB/package.opf @@ -4,7 +4,7 @@ Minimal EPUB 3.0 en NOID - + urn:isbn:9781234567891 pagination diff --git a/website/content/rules/epub.md b/website/content/rules/epub.md index 811bb29f..6cb111e0 100644 --- a/website/content/rules/epub.md +++ b/website/content/rules/epub.md @@ -7,9 +7,10 @@ In addition to the [HTML rules]({{}}), Ace implements EPUB-specif * Missing metadata (impact = "serious"): `metadata-accessmode`, `metadata-accessibilityfeature`, `metadata-accessibilityhazard` * Missing metadata (impact = "moderate"): `metadata-accessibilitysummary`, `metadata-accessModesufficient` -* Incorrect metadata values (impact = "moderate"): `metadata-accessibilityfeature-invalid`, `metadata-accessibilityhazard-invalid` (mixed positive and negative terms (e.g. `noFlashingHazard` and `flashing`), `unknown` mixed with `none` or other vocabulary values, or usage of terms not defined by the specification) -* Incorrect metadata values (impact = "minor"): `metadata-accessmode-invalid`, `metadata-accessmodesufficient-invalid` (usage of terms not defined by the specification) -* Missing authored page list when metadata `printPageNumbers`/`pageBreakMarkers` is present (impact = "moderate"): `metadata-accessibilityFeature-printPageNumbers-nopagelist` +* Incorrect metadata values (impact = "moderate"): `metadata-accessibilityfeature-invalid`, `metadata-accessibilityhazard-invalid` (mixed positive and negative terms (e.g. `noFlashingHazard` and `flashing`), `unknown` mixed with `none` or other vocabulary values, or usage of terms not defined by the specification) +* Incorrect metadata values (impact = "minor"): `metadata-accessmode-invalid`, `metadata-accessmodesufficient-invalid` (usage of terms not defined by the specification) +* Missing authored page list when metadata `pageNavigation` is present (impact = "moderate"): `metadata-accessibilityFeature-printPageNumbers-nopagelist` +* Missing page breaks when metadata `printPageNumbers`/`pageBreakMarkers` is present (impact = "moderate"): `metadata-accessibilityFeature-printPageNumbers-nopagebreaks` * Mismatched page breaks in SMIL and in HTML documents (impact = "serious"): `epub-pagelist-mediaoverlays` * Authored page list references elements in HTML documents that are not page breaks (impact = "minor") or do not exist (impact = "serious"): `epub-pagelist-broken` * Authored page list does not reference all elements that are page breaks in HTML documents (impact = serious): `epub-pagelist-missing-pagebreak`